安全运维 | 如何使用Tcprepaly重放数据包!

admin 2023年1月17日14:19:49安全文章评论2 views4512字阅读15分2秒阅读模式

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


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环境下直接,在线安装执行下列命令即可:

yum -y install tcpreplay
Ubuntu环境下直接,在线安装执行下列命令即可:
sudo apt-get install tcpreplay

查看安装是否成功:

tcpreplay -V

安全运维 | 如何使用Tcprepaly重放数据包!

查看帮助信息:

-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)查询可用的网络接口信息
tcpreplay --listnics

(2)抓取接口的流量数据包

tcpreplay -i eth3 data.pcap

(3)标记 client 和 server

tcpprep -a client -i test.pcap -o test.cach

(4)修改源目的ip和mac地址

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文件

tcpprep -a client -i test_result.pcap -o test_result.cach

(6)tcpreplay回放报文

tcpreplay -i eth3 -I eth5 -c test_result.cach test_result.pcap

(7)在IPS底层抓取流量包,发现已经触发IPS告警

安全运维 | 如何使用Tcprepaly重放数据包!


3
常见问题总结

(1)如果回放报文出现了消息过长“Error whith PF_PACKET send() :Message to long”的错误,通常mtu的默认值为1500, 将网卡的mtu值改大,例如命令为:

ip link set eth2 mtu 1520 ifconfig eth2 mtu 1520

(2)如果重放报文报文发现报文时序错乱问题,比如tcp三次握手信息错乱等,通常是由于报文的时间间隔较短,再加上网络环境等因素的影响造成报文到达时间不同。通常可以通过设置发包速率-p参数解决该问题:

tcpreplay -i eth3 -I eth5 -p 1 -c test_result.cach test_result.pcap

-END-

▎经典文章精选

渗透测试 | 攻击面信息收集
环境搭建 | CTFd动态靶机搭建笔记
权限提升 | suid提权及修复方式
近源渗透 | 使用Aircrack-ng破解wifi密码
神兵利器 | 自动化钉钉推送主机端口信息!


安全运维 | 如何使用Tcprepaly重放数据包!

扫描下方 二维码 加入我们吧!

安全运维 | 如何使用Tcprepaly重放数据包!

原文始发于微信公众号(betasec):安全运维 | 如何使用Tcprepaly重放数据包!

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月17日14:19:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  安全运维 | 如何使用Tcprepaly重放数据包! http://cn-sec.com/archives/1429885.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: