声明:本人坚决反对利用文章内容进行恶意攻击行为,一切错误行为必将受到惩罚,绿色网络需要靠我们共同维护,推荐大家在了解技术原理的前提下,更好的维护个人信息安全、企业安全、国家安全。
Tcpreplay是一种pcap包的重放工具, 它可以将tcpdump和Ethereal/Wireshark等工具捕捉到的网络流量包进行编辑修改和重放. 重写Layer 2、3、4层数据包,并将流量重新发送至目标网络, 这样通过重放网络流量包从而实现复现问题情景以定位bug。
Tcpreplay是一个工具集合,包括:tcpprep(确认客户端发给服务器的报文,还是服务器发给客户端的报文)、tcprewrite(编辑报文)、tcpreplay(发送报文)。其中,tcpreplay是真正实现流量回放功能的工具,其他几个工具可以看作tapreplay的辅助工具,作为流量重放前期的准备工作,比如tcpprep可以划分哪些包是client的, 哪些是server的, client的包从一个网卡发, server的包可能从另一个网卡发。tcprewrite可以就是修改2层, 3层, 4层报文头部,也就是对IP,MAC等信息进行修改。
1
Tcpreplay安装
CentOS环境下直接,在线安装执行下列命令即可:
代码语言:javascript复制yum -y install tcpreplay
Ubuntu环境下直接,在线安装执行下列命令即可:
代码语言:javascript复制sudo apt-get install tcpreplay
查看安装是否成功:
代码语言:javascript复制tcpreplay -V
查看帮助信息:
代码语言:javascript复制-q, --quiet #安静模式
-a #精确的时间(使用高速 cpu 发包)
-d #输出调试信息(0-5,默认 0)
-K, --preload-pcap #发送前将数据包预加载到 RAM 中
-c #双网卡回放报文必选参数,后跟文件名
-C, --cachefile=str #通过tcpprep缓存文件拆分流量
-N #获得网络接口和出口
-2, --dualfile #从网络分路器一次重放两个文件
-i, --intf1=str #客户端到服务器/RX/主要流量输出接口,双网卡回放报文必选参数,指定从接口
-I, --intf2=str #服务器到客户端/TX/二级流量输出接口
--listnics #列出可用的网络接口并退出,双网卡回放报文必选参数,指定主接口
-S #制定包长度
-L, --limit=num #限制发送的数据包数量
--duration=num #限制发送的秒数,限制发包数量
-M, --mbps=str 以 Mbps(兆字节每秒)发送报文
-t, --topspeed 以最快的速度回放报文
-o, --oneatatime 用户每输入一次回放一个报文
--pps-multi=num 每个时间间隔发送的数据包数X
--unique-ip 每次循环迭代修改 IP 地址以生成唯一的流
--unique-ip-loops=str 在分配新的唯一 ip 之前循环的次数
--no-flow-stats 禁止打印和跟踪流计数、速率和到期时间
--flow-expiry=num 将流视为过期之前处于非活动状态的秒数
-r, --portmap=str 重写 tcp/udp 端口
-s, --seed=num 根据给出的seed随机改写源/目的IPv4、IPv6
-N, --pnat=str 通过伪 NAT 重写 ip 地址
-S, --srcipmap=str 使用伪 NAT 重写源 IPv4/v6 地址
-D, --dstipmap=str 使用伪 NAT 重写目标 IPv4/v6 地址
-e, --endpoints=str 在最后 2 个点之间重写 ip 地址
-b, --skipbroadcast 不重写广播/多播 IP 地址
-C, --fixcsum 强制重新计算 TP/TCP/UDP 校验和
-m, --mtu=num 覆盖默认 MTU 长度(1500 字节)
--mtu-trunc 截断大于指定 MTU 的数据包
-E, --efcs 从帧尾删除以太网校验和 (FCS)
--ttl=str 修改 IPv4/v6 TTL/Hop 限制
--tos=num 设置 IPv4 TOS/DiffServ/ECN 字节
--tclass=num 设置 IPv6 流量类别字节
--flowlabel=num 设置 IPv6 流标签
-F, --fixlen=str 填充或截断数据包数据以匹配报头长度
--fuzz-seed=num Fuzz 1 in X packets. Edit bytes, length, or emulate packet drop
--fuzz-factor=num Set the Fuzz 1 in X packet ratio (default 1 in 8 packets)
--skipl2broadcast 跳过重写广播/多播第 2 层地址
--enet-dmac=str 覆盖目标以太网 MAC 地址
--enet-smac=str 覆盖源以太网 MAC 地址
--enet-subsmac=str 替换 MAC 地址
--enet-mac-seed=num 随机化 MAC 地址
--enet-mac-seed-keep-bytes=num 随机化 MAC 地址
--enet-vlan=str 指定以太网 802.1q VLAN 标记模式
--enet-vlan-tag=num 指定新的以太网 802.1q VLAN 标记值
--enet-vlan-cfi=num 指定以太网 802.1q VLAN CFI 值
--enet-vlan-pri=num 指定以太网 802.1q VLAN 优先级
--hdlc-control=num 指定 HDLC 控制值
--hdlc-address=num 指定HDLC地址
--user-dlt=num 设置输出文件 DLT 类型
--user-dlink=str 用用户指定的数据重写数据链路层
-i, --infile=str 输入待处理的pcap文件
-o, --outfile=str 输出 pcap 文件
-c, --cachefile=str 通过 tcpprep 缓存文件拆分流量
-v, --verbose 通过 tcpdump 将解码的数据包打印到 STDOUT
-V, --version Print version information 显示版本号
-P, --pid 启动时打印tcpreplay的PID
--stats=num 每 X 秒打印一次统计信息,如果为“0”,则在每个循环中打印一次
----------------------------------------------------------------------------------------
-T, --timer=str 选择包定时模式:select、ioport、gtod、nano
--maxsleep=num 包与包之间相隔X毫秒
-v, --verbose 通过 tcpdump 将解码的数据包打印到 STDOUT,可选参数,每发送一个报文都以 tcpdump 风格打印对应信息
------------------------------------------------------------------------------------------
-l, --loop=num 循环遍历捕获文件 X 次
--loopdelay-ms=num 循环之间的延迟(以毫秒为单位)
--pktlen 覆盖 snaplen 并使用实际的数据包 len,可选参数,指定循环次数
-----------------------------------------------------------------------------------------
-x, --multiplier=str 将重播速度修改为给定倍数
-p, --pps=str 指定每秒发送报文的个数
------------------------------------------------------------------------------------------
-m #可选参数,指定一个倍数值,比默认发送速度快多少倍发送报文
-------------------------------------------------------------------------------------------
-A, --decode=str 传递给 tcpdump 解码器的参数
--skip-soft-errors 跳过写入软错误的数据包
2
Tcpreplay典型案例
本次案例使用Tcpreplay工具,重放具有攻击特征的流量数据包,触发IPS告警信息。操作过程如下所示:
(1)查询可用的网络接口信息
代码语言:javascript复制tcpreplay --listnics
(2)抓取接口的流量数据包
代码语言:javascript复制tcpreplay -i eth3 data.pcap
(3)标记 client 和 server
代码语言:javascript复制tcpprep -a client -i test.pcap -o test.cach
(4)修改源目的ip和mac地址
代码语言:javascript复制tcprewrite --endpoints=源ip地址:目的ip地址 --enet-dmac=上行目的mac地址,下行目的mac地址 --enet-smac=上行源mac地址,下行源mac地址 -i test.pcap -c test.cach -o test_result.pcap
--endpoints: 重写ip地址 源ip地址:目的ip地址
--enet-dmac: 覆盖目标以太网MAC地址 上行目的mac地址,下行目的mac地址
--enet-smac: 覆盖源以太网MAC地址 上行源mac地址,下行源mac地址
-i: 客户端到服务器/RX/主要流量输出接口
-c: 双网卡回放报文必选参数,后跟文件名
(5)从新生成cach文件
代码语言:javascript复制tcpprep -a client -i test_result.pcap -o test_result.cach
(6)tcpreplay回放报文
代码语言:javascript复制tcpreplay -i eth3 -I eth5 -c test_result.cach test_result.pcap
(7)在IPS底层抓取流量包,发现已经触发IPS告警
3
常见问题总结
(1)如果回放报文出现了消息过长“Error whith PF_PACKET send() :Message to long”的错误,通常mtu的默认值为1500, 将网卡的mtu值改大,例如命令为:
代码语言:javascript复制ip link set eth2 mtu 1520
ifconfig eth2 mtu 1520
(2)如果重放报文报文发现报文时序错乱问题,比如tcp三次握手信息错乱等,通常是由于报文的时间间隔较短,再加上网络环境等因素的影响造成报文到达时间不同。通常可以通过设置发包速率-p参数解决该问题:
代码语言:javascript复制tcpreplay -i eth3 -I eth5 -p 1 -c test_result.cach test_result.pcap
-END-