
Инструмент для формирования сетевых пакетов в Linux.
Pig (что можно понять как Packet intruder generator — генератор вторжений пакетов) — это инструмент для создания пакетов в Linux.
Вы можете использовать Pig для тестирования ваших IDS/IPS и прочих средств.
Pig содержит набор готовых известных сигнатур атак, который можно расширить более специфичными вещами в соответствии с вашими требованиями.
На данный момент можно создавать сигнатуры IPv4 с транспортным уровнем на основе TCP, и .
Также можно создавать сигнатуры на основе протокола , а также собирать пакет, начиная с его кадра .
UDPICMPARPEthernetЕсли вы попали сюда по моей статье в 2600 из выпуска SPRING 2016 issue,
продолжайте читать следующие разделы документации, потому что этот маленький Pig с тех пор развивался.
Это очень просто:
[email protected]:~/src# git clone https://github.com/rafael-santiago/pig pig
[email protected]:~/src# cd pig
[email protected]:~/src/pig# git submodule update --init
Для сборки pig нужно использовать Hefesto. После выполнения
шагов по установке Hefesto в вашей системе перейдите в подкаталог pig с именем src и выполните
следующую команду:
[email protected]:~/src/pig/src# hefesto
После этой команды вы должны найти бинарный файл pig по пути src/bin. Вы можете использовать бинарник относительно
src/bin или установить его.
Если по какой-то причине у вас возникли проблемы со сборкой, попробуйте прочитать некоторые замечания в BUILD.md.
Для установки нужно находиться внутри подкаталога src и выполнить:
[email protected]:~/src/pig/src# hefesto --install
Для удаления, находясь в подкаталоге src, выполните:
[email protected]:~/src/pig/src# hefesto --uninstall
Файлы Pigsty — это обычные текстовые файлы, в которых можно определить набор сигнатур пакетов. Существует определённый синтаксис,
который необходимо соблюдать. Вот пример файла pigsty:
[ signature = "Hello",
ip.version = 4,
ip.ihl = 5,
ip.tos = 0,
ip.src = 192.30.70.10,
ip.dst = 192.30.70.3,
ip.protocol = 17,
udp.dst = 1008,
udp.src = 32000,
udp.payload = "Hello!!" ]
В основном все данные сигнатуры должны находиться между квадратными скобками: [ ... ].
Внутри этой области информация задаётся по схеме поле = данные.
Если у вас есть опыт работы с компьютерными сетями, то большинство полей, перечисленных в Таблице 1,
вероятно, имеют для вас ясное значение. Вы должны использовать эти поля для создания своих сигнатур.
Таблица 1: Поля сигнатур pig.
| Поле | Значение | Протокол | Тип данных | Пример определения |
|---|---|---|---|---|
signature | Имя сигнатуры | - | строка | signature = "Udp flood" |
eth.hwdst | MAC назначения Ethernet | Ethernet | MAC | eth.hwdst = "00:de:ad:be:ef:00" |
eth.hwsrc | MAC источника Ethernet | Ethernet | MAC | eth.hwsrc = "00:de:ad:be:ef:00" |
eth.type | Ether type | Ethernet | число | eth.type = 0x0800 |
eth.payload | Полезная нагрузка Ethernet | Ethernet | строка | eth.payload = "f\x00ob\x04r" |
ip.version | Версия IP | IP | число | ip.version = 4 |
ip.ihl | Длина заголовка Internet | IP | число | ip.ihl = 5 |
ip.tos | Тип сервиса | IP | число | ip.tos = 0 |
ip.tlen | Общая длина | IP | число | ip.tlen = 20 |
При создании сигнатуры необязательно указывать все данные. Если указать только наиболее важные части пакета,
остальные части будут заполнены значениями по умолчанию. Контрольные суммы всегда пересчитываются.
Совет: загляните в подкаталог pigsty. Вы найдёте там множество файлов сигнатур и увидите, что
определять новые очень просто.
Да, это возможно. Чтобы использовать эту возможность, просто укажите значения, перечисленные в Таблице 2,
в полях типа IP-адрес.
Таблица 2: IP-адреса по географическим зонам.
| Используемое значение | Значение |
|---|---|
north-american-ip | IP-адреса из Северной Америки |
south-american-ip | IP-адреса из Южной Америки |
asian-ip | IP-адреса из Азии |
european-ip | IP-адреса из Европы |
В любом поле типа IP-адрес следует использовать значение user-defined-ip. Обратите внимание, что в этом случае
нужно использовать параметр командной строки --targets. Подробнее см. в разделе Использование pig.
Если вы создаёте файлы pigsty, которые, по вашему мнению, актуальны не только в вашем окружении, откройте pull request,
чтобы включить эти полезные файлы сюда. Заранее спасибо!
Использование Pig очень простое — необходимо указать четыре основных параметра:
--signatures--gateway--net-mask--lo-ifaceХотите узнать больше о каждом параметре? Тогда поехали:
--signatures принимает список путей к файлам pigsty.--gateway — это место, где вы указываете адрес вашего шлюза. Имейте в виду, что pig генерирует (или по крайней мере пытается сгенерировать) также кадры Ethernet. Из-за этого адрес шлюза довольно важен для правильного составления данных уровня-1.--net-mask для вопросов маршрутизации должен получить вашу маску сети.--lo-iface — это место, где следует указать имя локального сетевого интерфейса, который вы будете использовать для «слива» сгенерированных пакетов.--no-gateway указывает, что никакие пакеты не будут отправляться за пределы сети.Предположим, мы хотим генерировать трафик на основе DDoS:
[email protected]:~# pig --signatures=pigsty/ddos.pigsty\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0 --lo-iface=eth0
Теперь мы хотим всё перемешать:
[email protected]:~# pig --signatures=pigsty/ddos.pigsty,pigsty/attackresponses.pigsty,\
> pigsty/badtraffic.pigsty,pigsty/backdoors.pigsty\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
Для этого используйте параметр --timeout=<мс>
Используйте параметр --no-echo.
Используйте параметр --targets. Вы можете указать список на основе точных IP-адресов, масок IP и CIDR.
Взгляните:
[email protected]:~# pig --signatures=pigsty/local-mess.pigsty\
> --targets=192.30.70.3,192.30.70.*,192.30.70.0/9\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0\
> --lo-iface=eth0
Это полезно, когда загруженные сигнатуры не будут отправлять данные за пределы текущей сети. Чтобы указать это, нужно использовать
параметр --no-gateway. При использовании параметра --no-gateway не нужно указывать адрес шлюза,
потому что пакеты не будут выходить за пределы текущего сегмента. Соответственно, указывать маску сети также становится неактуально.
Например:
[email protected]:~# pig --signatures=pigsty/local_traffic.pigsty --no-gateway --lo-iface=eth2
В приведённом выше примере кадр Ethernet больше не будет ответственностью pig. По этой причине pig не будет жаловаться
на отсутствие параметров --gateway и --net-mask.
Параметр --no-gateway очень удобен в случаях, когда нужно сгенерировать трафик ARP. Посмотрите другой
документ, объясняющий, как выполнить ARP-спуфинг с pig.
Возможно, вам нужно отправить только одну сигнатуру и затем вернуться к вызывающему коду, чтобы проверить, что произошло после. Такое
требование часто возникает, когда это приложение используется как поддержка для системных тестов или модульных тестов. Поэтому, если вам нужно
это сделать, попробуйте использовать параметр --single-test:
[email protected]:~# pig --signature=pigsty/syn-scan.pigsty --targets=127.0.0.1 --single-test\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
После выполнения этой команды pig выберет только одну сигнатуру из файла syn-scan.pigsty, попытается отправить её и завершит работу.
Если в процессе произойдёт ошибка, pig завершится с кодом выхода, равным 1, в противном случае pig завершится
с кодом выхода, равным 0.
Основной режим работы pig — это бесконечный цикл, который выплевывает тонны пакетов в сеть с соблюдением ранее
заданного тайм-аута.
Вы можете определить, как pig перебирает загруженные пакеты для их отправки, используя параметр --loop=<mode>. На данный момент
доступны два режима: random (по умолчанию) и sequential.
Режим sequential будет повторять сигнатуры при достижении конца списка загруженных сигнатур пакетов.
Подзадачи — это полезные небольшие задачи, связанные с созданием пакетов, которые встроены в pig для помощи вам
в сеансе создания. Эти задачи можно вызвать с помощью параметра --sub-task=<task-name>.
По сути, подзадачи являются подпрограммами, имеют свои собственные особенности, и поэтому
подробности о них приведены в их собственных руководствах. См. Таблицу 3 для перехода к ним.
Таблица 3: Подзадачи pig.
| Подзадача | Что она делает? | Руководство |
|---|---|---|
pcap-import | Импорт пакетов из PCAP-файла в файл pigsty | cat doc/pcap-import.md |
shell | Запуск pig в интерактивном режиме | cat doc/shell.md |
До сих пор вы можете собирать пакеты на основе IPv4 с UDP или TCP на транспортном уровне. Вы также можете собирать
пакеты ARP.
Однако вы также можете собирать пакеты, начиная с кадра Ethernet. Приятно то, что это даёт возможность
создавать практически что угодно поверх полезной нагрузки Ethernet.
Например, даже несмотря на то, что pig пока не предлагает поддержку готовой сборки IPv6, вы всё равно можете собрать
его, используя сырой pigsty на основе Ethernet. Посмотрите:
[ eth.hwdst = "5C:AC:4C:AA:F5:B5",
eth.hwsrc = "08:95:2A:AD:D6:4F",
eth.type = 0x86DD,
eth.payload = "\x60\x00\x00\x00\x00\x20\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x0a\x95\x2a\xff\xfe\xad\xd6\x4f\xfe\x80\x00\x00\x00\x00\x00\x00\x55\x51\x00\xc2\x18\x0f\xdb\x46\x88\x00\x32\x01\xe0\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x0a\x95\x2a\xff\xfe\xad\xd6\x4f\x02\x01\x08\x95\x2a\xad\xd6\x4f",
signature = "IPv6 from Sparta" ]
Принимая во внимание, что включение MAC-адресов назначения и источника в «Ethernet pigsty» является
необязательным, мы можем выполнить задачу даже без использования каких-либо расширенных полей.
Это удобно, когда вам нужно тестировать новые протоколы в вашей среде и прочие аномальные забавные вещи. В таком сыром виде
pig может оставаться полезным для вас.
Сохраните следующие данные как "oink.pigsty":
[ signature = "oink",
ip.version = 4,
ip.ihl = 5,
ip.tos = 0,
ip.src = 127.0.0.1,
ip.dst = user-defined-ip,
ip.protocol = 17,
udp.dst = 1008,
udp.src = 32000,
udp.payload = "Oink!!\n" ]
На другом tty запустите netcat в UDP-режиме для прослушивания соединений на порту 1008:
[email protected]:~# nc -u -l -p 1008
Теперь запустите pig, используя "oink.pigsty", указав в качестве цели loopback:
[email protected]:~# pig --signatures=oink.pigsty --targets=127.0.0.1\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
netcat должен начать получать несколько oink, и... да, поздравляю!! pig запущен и работает в вашей системе! ;)
Попробуйте прослушать вашу сеть, чтобы получить больше информации об этих UDP-пакетах, которые циркулируют по вашим интерфейсам...
Получайте удовольствие!
ip.id | ID пакета | IP | число | ip.id = 0xbeef |
ip.flags | Флаги IP | IP | число | ip.flags = 4 |
ip.offset | Смещение фрагмента | IP | число | ip.offset = 0 |
ip.ttl | Время жизни | IP | число | ip.ttl = 64 |
ip.protocol | Протокол | IP | число | ip.protocol = 6 |
ip.checksum | Контрольная сумма | IP | число | ip.checksum = 0 |
ip.src | Адрес источника | IP | IP-адрес | ip.src = 192.30.70.3 |
ip.dst | Адрес назначения | IP | IP-адрес | ip.dst = 192.30.70.3 |
ip.payload | Сырая полезная нагрузка IP | IP | строка | ip.payload = "\x01\x02" |
tcp.src | Порт источника | TCP | число | tcp.src = 80 |
tcp.dst | Порт назначения | TCP | число | tcp.dst = 21 |
tcp.seqno | Порядковый номер | TCP | число | tcp.seqno = 10202 |
tcp.ackno | Номер подтверждения | TCP | число | tcp.ackno = 10200 |
tcp.size | Длина TCP | TCP | число | tcp.size = 4 |
tcp.reserv | Зарезервированное поле TCP | TCP | число | tcp.reserv = 0 |
tcp.urg | Флаг urg. TCP | TCP | бит | tcp.urg = 0 |
tcp.ack | Флаг ack. TCP | TCP | бит | tcp.ack = 1 |
tcp.psh | Флаг psh. TCP | TCP | бит | tcp.psh = 0 |
tcp.rst | Флаг rst. TCP | TCP | бит | tcp.rst = 0 |
tcp.syn | Флаг syn. TCP | TCP | бит | tcp.syn = 0 |
tcp.fin | Флаг fin. TCP | TCP | бит | tcp.fin = 0 |
tcp.wsize | Размер окна TCP | TCP | число | tcp.wsize = 0 |
tcp.checksum | Контрольная сумма | TCP | число | tcp.checksum = 0 |
tcp.urgp | Указатель срочности | TCP | число | tcp.urgp = 0 |
tcp.payload | Полезная нагрузка | TCP | строка | tcp.payload = "\x01abc" |
udp.src | Порт источника | UDP | число | udp.src = 53 |
udp.dst | Порт назначения | UDP | число | udp.dst = 7 |
udp.size | Длина UDP | UDP | число | udp.size = 8 |
udp.checksum | Контрольная сумма | UDP | число | udp.checksum = 0 |
udp.payload | Полезная нагрузка | UDP | число | udp.payload = "boo!" |
icmp.type | Тип ICMP | ICMP | число | icmp.type = 0 |
icmp.code | Код ICMP | ICMP | число | icmp.code = 0 |
icmp.checksum | Контрольная сумма | ICMP | число | icmp.checksum = 0 |
icmp.payload | Полезная нагрузка | ICMP | строка | icmp.payload = "ping!" |
arp.hwtype | Тип аппаратного обеспечения ARP | ARP | число | arp.hwtype = 0x1 |
arp.ptype | Тип протокола ARP | ARP | число | arp.ptype = 0x0800 |
arp.hwlen | Длина аппаратного адреса ARP | ARP | число | arp.hwlen = 6 |
arp.opcode | Код операции ARP | ARP | число | arp.opcode = 2 |
arp.hwsrc | Аппаратный адрес источника ARP | ARP | MAC | arp.hwsrc = "de:ad:be:ef:0:0" |
arp.psrc | Протокольный адрес источника ARP | ARP | IP-адрес | arp.psrc = 192.30.70.3 |
arp.hwdst | Аппаратный адрес назначения ARP | ARP | MAC | arp.hwdst = "de:ad:be:ef:0:0" |
arp.pdst | Протокольный адрес назначения ARP | ARP | IP-адрес | arp.pdst = 192.30.70.3 |