如何使用Tcprepaly重放數據包!
聲明:本人堅決反對利用文章內容進行惡意攻擊行為,一切錯誤行為必將受到懲罰,綠色網絡需要靠我們共同維護,推薦大家在了解技術原理的前提下,更好的維護個人信息安全、企業安全、國家安全。
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等信息進行修改。
Tcpreplay安裝
CentOS環境下直接,在線安裝執行下列命令即可:
yum -y install tcpreplay
Ubuntu環境下直接,在線安裝執行下列命令即可:
sudo apt-get install tcpreplay
查看安裝是否成功:
tcpreplay -V

查看幫助信息:
-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 跳過寫入軟錯誤的數據包
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告警

常見問題總結
(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