安全运维 | tcprepaly工具的安装与使用!

2022-12-11 10:56:48 浏览数 (1)

声明:本人坚决反对利用文章内容进行恶意攻击行为,一切错误行为必将受到惩罚,绿色网络需要靠我们共同维护,推荐大家在了解技术原理的前提下,更好的维护个人信息安全、企业安全、国家安全。

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-

0 人点赞