diff --git a/docs/manual.md b/docs/manual.md index 8969b64..197a3a7 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -2592,8 +2592,8 @@ function syndata(ctx, desync) * arg: [standard ipfrag](#операции-с-диссектами) * arg: [standard reconstruct](#опции-по-работе-с-пакетами) * arg: [standard rawsend](#опции-по-работе-с-пакетами) -* arg : blob - blob, содержащий фейковый payload. Должен помещаться в один пакет, сегментация невозможна. -* arg : tls_mod - применить указанный tls_mod к пейлоаду blob +* arg: blob - blob, содержащий фейковый payload. Должен помещаться в один пакет, сегментация невозможна. +* arg: tls_mod - применить указанный tls_mod к пейлоаду blob Функция добавляет в tcp SYN пакет пейлоад, применяет к нему модификации и отправляет вместо оригинала, вынося VERDICT_DROP. Если проходит пакет без SYN, выполняется instance cutoff. @@ -2611,8 +2611,231 @@ function fake(ctx, desync) * arg: [standard ipfrag](#операции-с-диссектами) * arg: [standard reconstruct](#опции-по-работе-с-пакетами) * arg: [standard rawsend](#опции-по-работе-с-пакетами) -* arg : blob - blob, содержащий фейковый payload. Может быть любой длины - сегментация выполняется автоматически. -* arg : tls_mod - применить указанный tls_mod к пейлоаду blob +* arg: blob - blob, содержащий фейковый payload. Может быть любой длины - сегментация выполняется автоматически. +* arg: tls_mod - применить указанный tls_mod к пейлоаду blob * payload фильтр по умолчанию - "known" Это прямой фейк - отдельный пакет или группа пакетов. Функция не выносит вердикт и не блокирует отправку оригинала. + +``` +function rst(ctx, desync) +``` + +* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard payload](#стандартные-наборы-параметров) +* arg: [standard fooling](#операции-с-диссектами) +* arg: [standard ipid](#операции-с-диссектами) +* arg: [standard ipfrag](#операции-с-диссектами) +* arg: [standard reconstruct](#опции-по-работе-с-пакетами) +* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: rstack - отсылка RST,ACK вместо RST +* payload фильтр по умолчанию - "known" + +Отослать пустой TCP пакет с флагами RST или RST+ACK. Функция не выносит вердикт и не блокирует отправку оригинала. + +## TCP сегментация + +``` +function multisplit(ctx, desync) +``` + +* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard payload](#стандартные-наборы-параметров) +* arg: [standard fooling](#операции-с-диссектами) +* arg: [standard ipid](#операции-с-диссектами) +* arg: [standard ipfrag](#операции-с-диссектами) +* arg: [standard reconstruct](#опции-по-работе-с-пакетами) +* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: pos - список через запятую позиционных маркеров - точек разреза. По умолчанию "2". +* arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window +* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00 +* arg: blob - заменить текущий пейлоад на указанный blob +* arg: nodrop - отказ от вынесения VERDICT_DROP +* payload фильтр по умолчанию - "known" + +Multisplit реализует последовательную сегментацию текущего диссекта или реасма с разрезом в определяемых списком маркеров позициях. Опционально поддерживается замена блока данных на произвольный blob и техника seqovl. +Выносится VERDICT_DROP после успешной отправки всех сегментов. + +Если происходит перепроигрывание (replay) задержанных пакетов и присутствует reasm, то вместо desync.dis.payload берется desync.reasm_data. Нарезание проиходит только при перепроигрывании первой части reasm, по остальным частям выносится VERDICT_DROP, если отсылка была успешна. Поскольку весь reasm уже отправлен нарезанным, нет смысла повторно отправлять его оригинальные части. + +Может использоваться для отправки произвольных данных, в том числе фейков с заменой текущего пейлоада на произвольный blob. + +О размерах частей и вписывании в MTU думать не нужно - применяется дополнительная автоматическая сегментация по MSS. + +seqovl может быть только числом, маркеры не поддерживаются. Применяется к первому нарезаемому сегменту. К пейлоаду первого сегмента приписывается слева seqovl_pattern по размеру seqovl, а tcp.th_seq уменьшается на seqovl. Таким образом слева образуется блок данных, выходящий влево за tcp window, и поэтому он игнорируется сервером, а часть, входящая в tcp window - принимается. + +seqovl - это фактически средство замешивания фейковых и реальных данных, средство создания скрытых фейков в реальных tcp сегментах. Если DPI не ведет учет sequence numbers, он может проглотить весь передаваемый сегмент и купиться на ложную информацию в начале, которая сервером принята не будет. + +Особое преимущество seqovl - в отсутствии необходимости фулинга. Сервер принимает только часть сегмента за счет игры с sequence numbers, а не за счет модификации каких-то элементов ip и tcp заголовков, что привело бы к полному непринятию. + + +``` +function multidisorder(ctx, desync) +``` + +* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard payload](#стандартные-наборы-параметров) +* arg: [standard fooling](#операции-с-диссектами) +* arg: [standard ipid](#операции-с-диссектами) +* arg: [standard ipfrag](#операции-с-диссектами) +* arg: [standard reconstruct](#опции-по-работе-с-пакетами) +* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: pos - список через запятую позиционных маркеров - точек разреза. По умолчанию "2". +* arg: seqovl - маркер - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево +* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00 +* arg: blob - заменить текущий пейлоад на указанный blob +* arg: nodrop - отказ от вынесения VERDICT_DROP +* payload фильтр по умолчанию - "known" + +Аналогично multisplit, но отправка сегментов производится в обратном порядке - с последнего по первый. + +Техника seqovl в данном случае работает иначе. Она применятся ко второму в оригинальной очередности (предпоследнему отсылаемому) сегменту. seqovl может быть маркером. Например, можно сделать разрез по midsld, а seqovl сделать "midsld-1". seqovl обязательно должен быть меньше первого сегмента в оригинальной очередности (последнего отсылаемого), иначе эта ситуация распознается и seqovl отменяется. + +Смысл seqovl в варианте disorder - в переписывании буфера сокета на принимающем конце. tcp сокет выдает данные в приложение последовательно, в порядке их оригинальной передачи. Если сначала приходит сегмент "спереди", не образующий с уже принятыми данными непрерывной оригинальной последовательности, происходит задержка информации в буфере без выдачи ее приложению. Если далее приходит перекрывающийся по sequence сегмент, то информация из него переписыват уже имеющуюся в буфере. Так ведут себя все системы, кроме Windows, поэтому на Windows серверах эта техника не работает. +Windows сохраняет старую информацию. + +К предпоследнему отсылаемому сегменту (2-му по оригинальной очередности) приписывается слева seqovl_pattern размером seqovl (результат ресолвинга маркера), а tcp.th_seq уменьшается на seqovl. + +Последний отсылаемый сегмент (1-й в оригинальной очередности) отправляется неизменным, переписывая в буфере сокета ложные данные из seqovl_pattern реальными. Восстанавливается непрерывная последовательность потока, данные передаются в сокет приложения. + + +``` +function fakedsplit(ctx, desync) +``` + +* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard payload](#стандартные-наборы-параметров) +* arg: [standard fooling](#операции-с-диссектами) +* arg: [standard ipid](#операции-с-диссектами) +* arg: [standard reconstruct](#опции-по-работе-с-пакетами) +* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: pos - один позиционный маркер - точка разреза. По умолчанию "2". +* arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window +* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00 +* arg: blob - заменить текущий пейлоад на указанный blob +* arg: nodrop - отказ от вынесения VERDICT_DROP +* arg: nofake1, nofake2, nofake3, nofake4 - отказ от отсылки отдельных фейков +* arg: pattern - blob, которым заполняются фейковые части. По умолчанию 0x00. +* payload фильтр по умолчанию - "known" + +Функция работает аналогично multisplit с одной позицией разреза, но с замешиванием фейков между реальными сегментами. Фейки совпадают в размерах с отсылаемыми частями и формируются на базе pattern со смещением, которое соответствует смещению tcp sequence отсылаемой части относительно первой. +Для фейков необходим фулинг, чтобы они не были приняты сервером. + +Последовательность отсылки : + +1. Фейк 1-й части. (fake1) +2. Реальная 1-я часть. +3. Фейк 1-й части. (fake2) +4. Фейк 2-й части. (fake3) +5. Реальная 1-я часть. +6. Фейк 2-й части. (fake4) + +Цель данной техники - запутать DPI что есть оригинал, а что есть fake. Части одного размера, в одной мусор, в другой - реальные данные. Что выбрать ? Не знаем... Все выглядит как ретрансмиссии, имеет те же sequence и размеры. + +* К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. +* К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. +* ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. + +В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". +blob позволяет заменить текущией пейлоад на произвольный блоб, и тем самым отослать любой совместимый пейлоад с тем же разбиением. + +``` +function fakeddisorder(ctx, desync) +``` + +* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard payload](#стандартные-наборы-параметров) +* arg: [standard fooling](#операции-с-диссектами) +* arg: [standard ipid](#операции-с-диссектами) +* arg: [standard reconstruct](#опции-по-работе-с-пакетами) +* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: pos - один позиционный маркер - точка разреза. По умолчанию "2". +* arg: seqovl - маркер - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево +* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00 +* arg: blob - заменить текущий пейлоад на указанный blob +* arg: nodrop - отказ от вынесения VERDICT_DROP +* arg: nofake1, nofake2, nofake3, nofake4 - отказ от отсылки отдельных фейков +* arg: pattern - blob, которым заполняются фейковые части. По умолчанию 0x00. +* payload фильтр по умолчанию - "known" + +Функция работает аналогично multidisorder с одной позицией разреза, но с замешиванием фейков между реальными сегментами. Фейки совпадают в размерах с отсылаемыми частями и формируются на базе pattern со смещением, которое соответствует смещению tcp sequence отсылаемой части относительно первой. +Для фейков необходим фулинг, чтобы они не были приняты сервером. + +Последовательность отсылки : + +1. Фейк 2-й части. (fake1) +2. Реальная 2-я часть. +3. Фейк 2-й части. (fake2) +4. Фейк 1-й части. (fake3) +5. Реальная 1-я часть. +6. Фейк 1-й части. (fake4) + +Кроме запутывания DPI в реальных и фейковых сегментах, добавляется еще и запутывание в их последовательности. + +* К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. +* К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. +* ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. + +В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". +blob позволяет заменить текущией пейлоад на произвольный блоб, и тем самым отослать любой совместимый пейлоад с тем же разбиением. + +``` +function hostfakesplit(ctx, desync) +``` + +* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard payload](#стандартные-наборы-параметров) +* arg: [standard fooling](#операции-с-диссектами) +* arg: [standard ipid](#операции-с-диссектами) +* arg: [standard reconstruct](#опции-по-работе-с-пакетами) +* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: host - шаблон для генерации фейкового хоста - random.template +* arg: midhost - маркер для дополнительного разреза сегмента с реальным хостом +* arg: disorder_after - маркер для дополнительного разреза заключительной реальной части и отправки сегментов в обратном порядке +* arg: nofake, nofake2 - отказ от отсылки отдельных фейков +* arg: blob - заменить текущий пейлоад на указанный blob +* arg: nodrop - отказ от вынесения VERDICT_DROP +* payload фильтр по умолчанию - "known" + +Это специальный "резатель" с замешиванием фейков для пейлоадов, в которых присутствует имя хоста - http_req и tls_client_hello. +Двумя основными точкам разреза являются начало имени хоста - маркер "host" и конец имени хоста - маркер "endhost". Дополнительными и опциональными точками разреза являются маркер midhost (должен быть в пределах host..endost) и маркер disorder_after (должен быть больше endhost). При разрезе по disorder_after части отправляются в обратном порядке. + +Последовательность отсылки : + +1. Реальная часть до host +2. Фейк host..endhost-1 (fake1) +3. Реальная часть host..endhost, либо 2 части : host..midhost-1, midhost..endhost-1 +4. Фейк host..endhost-1 (fake2) +5. Реальная часть после host, либо 2 части : disorder_after..-1, endhost..disorder_after-1 + +* К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. +* К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. +* ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. + +В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". +blob позволяет заменить текущией пейлоад на произвольный блоб, и тем самым отослать любой совместимый пейлоад с тем же разбиением. + +``` +function tcpseg(ctx, desync) +``` + +* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard payload](#стандартные-наборы-параметров) +* arg: [standard fooling](#операции-с-диссектами) +* arg: [standard ipid](#операции-с-диссектами) +* arg: [standard ipfrag](#операции-с-диссектами) +* arg: [standard reconstruct](#опции-по-работе-с-пакетами) +* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: pos - список из двух маркеров, определяющий границы tcp сегмента +* arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window +* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00 +* arg: blob - заменить текущий пейлоад на указанный blob +* payload фильтр по умолчанию - "known" + +Отсылает часть текущего диссекта, реасма, или произвольного blob, ограниченную двумя маркерами pos с опциональным применением техники seqovl таким же способом, как и в multisplit. Дополнительная сегментация при превышении MSS производится автоматически. + +В случае reasm работает только при приеме его первой части. + +Вердикт не выносится. + +С помощью tcpseg можно сделать seqovl без сегментации, используя маркеры "0,-1". Для замещения текущего диссекта можно комбинировать с drop.