Pig(可理解为 Packet(数据包) intruder(入侵者) generator(生成器))是一个 Linux 数据包构造工具。
你可以用 Pig 测试你的 IDS/IPS 以及其他东西。
Pig 内置了大量已知的攻击特征签名可直接使用,你还可以根据自身需求扩展这个集合,
加入更具体的内容。
截至目前,它可以创建基于 TCP、UDP 和 ICMP 传输层的 IPv4 签名。
你也可以创建基于 ARP 协议的签名,甚至从 Ethernet 帧开始构建整个数据包。
如果你是通过我在 2600 2016 年春季 期刊 的文章来到这里,
请继续阅读以下文档章节,因为这只小 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
你需要使用 Hefesto 来构建 pig。按照步骤让 Hefesto 在你的系统上正常工作后,进入 pig 的 src 子目录并运行以下命令:
[email protected]:~/src/pig/src# hefesto
执行后,你应该能在 src/bin 路径下找到 pig 二进制文件。你可以从 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 | MAC 地址 | eth.hwdst = "00:de:ad:be:ef:00" |
eth.hwsrc | 以太网源 MAC | Ethernet | MAC 地址 | eth.hwsrc = "00:de:ad:be:ef:00" |
eth.type | 以太类型 | Ethernet | 数字 | eth.type = 0x0800 |
eth.payload | 以太网负载 | Ethernet | 字符串 | eth.payload = "f\x00ob\x04r" |
ip.version | IP 版本 | IP | 数字 | ip.version = 4 |
ip.ihl | 互联网头部长度 | IP | 数字 | ip.ihl = 5 |
ip.tos | 服务类型 | IP | 数字 | ip.tos = 0 |
ip.tlen | 总长度 | IP | 数字 | ip.tlen = 20 |
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 | TCP 紧急标志 | TCP | 位 | tcp.urg = 0 |
tcp.ack | TCP 确认标志 | TCP | 位 | tcp.ack = 1 |
tcp.psh | TCP 推送标志 | TCP | 位 | tcp.psh = 0 |
tcp.rst | TCP 复位标志 | TCP | 位 | tcp.rst = 0 |
tcp.syn | TCP 同步标志 | TCP | 位 | tcp.syn = 0 |
tcp.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 |
创建签名时,你不需要指定所有数据。如果只指定最相关的数据包部分,剩余部分将用默认值填充。校验和 始终 会被重新计算。
提示:查看子目录 pigsty。你会找到大量签名文件,并且会发现定义新的签名非常简单。
是的,这是可能的。要使用此功能,你只需在 IP 地址 类型的字段中填写表 2 中列出的值。
表 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你想了解更多每个选项的细节吧?……那就来吧: