2022.6.27
流量分类需要进行ip和mac地址匿名化,因为这两项不可作为特征。
需要工具:kali系统的tcpreplay、wireshark的tshark(kali下的tshark也可以)
7.7更新,用Python更方便
参考:从实践中学习wireshark分析——微信读书
tcpreplay介绍及安装——Linux系统
Windows安装tcpreplay及其他Linux软件——这里介绍了如何修改各层信息
看前三个应该就够了,补充一个tcprewrite批量修改pcap数据报文——解释tcprewrite参数
准备阶段
kali安装好了之后是这样的,我这里装的tcpreplay是4.4.0,装4.4.1会报错,猜想原因可能是库不匹配。
在root权限下输入tcpreplay -h
,显示帮助就可以用了
1、利用tshark去掉原始pcap文件里的icmp协议数据包
平台:这里用的是Win10,kali下面也可以
-
把要处理的pcap文件复制到wireshark安装目录下(如果用kali就不用进行这一步,直接进入第3步就行)
-
以管理员权限运行cmd,进入wireshark安装目录
-
如果只有一个pcap,直接在cmd里输入
tshark -r whatsapp.pcap -2 -R "not icmp" -w 9whatsapp.pcap
解释一下参数:
-r,读文件,whatsapp.pcap
是要读取的文件名
-2 -R ,后面接过滤器,和wireshark界面一样,"not icmp"
是去掉icmp协议的数据包,这里要注意前面有个-2
-w 输出文件,9whatsapp.pcap
是要输出的文件名
-
如果有多个pcap要处理,可以写个shell脚本:
1. 在wireshark目录下新建一个txt文件,然后输入#这里是win10的代码 tshark -r Microsof.pcap -2 -R "not icmp" -w 9Microsof.pcap tshark -r MicrosoftRPCEndpointMapper.pcap -2 -R "not icmp" -w 9MicrosoftRPCEndpointMapper.pcap tshark -r MS-SQLserver.pcap -2 -R "not icmp" -w MSSQLserver.pcap ……
这里发现tshark好像不能识别路径分隔符\,如果输入或者输出有分隔符的话会报错,所以win10系统要把需要处理的pcap都复制到wireshark目录下
2. 写完之后保存,然后重命名为run.bat
,在cmd里面输入run
就可以运行了
7.7 更新:SplitCap工具可以直接划分流/会话,这个脚本用的是tshark,速度较慢#这里是kali的保存单向流shell脚本 #!/bin/bash path1="/home/kali/Downloads/tcpreplay-4.4.0/session/software-11/Train" #原始会话pcap文件夹,这里的文件结构是Train/Amazon/Amazon1.pcap for file in $(ls -A $path1) #读取文件夹名字 do #echo $file #create folder mkdir /home/kali/Desktop/netflow/wireshark-out/Train/$file #根据原始pcap文件夹创建新的文件夹 path2="$path1/$file" #echo $path2 dir=$(ls -A $path2) #寻找文件夹下的pcap for i in $dir do echo $i tshark -r $path2/$i -2 -R "not ip.src==192.168.123.19" -w /home/kali/Desktop/netflow/wireshark-out/Train/$file/$i #输出文件 done done
2、利用tcpreplay重置IP和MAC地址
- 将上面处理后的pcap复制到kali虚拟机中的tcpreplay目录下(应该也可以复制到其他目录,没有tshark那么严格)
- 如果是处理一个pcap,以root权限输入
tcpprep -a client -i test.pcap -o test1.cache tcprewrite --srcipmap=0.0.0.0:0.0.0.0 --dstipmap=0.0.0.0:0.0.0.0 --enet-dmac=00:00:00:00:00:00 --enet-smac=00:00:00:00:00:00 --endpoints=0.0.0.0:0.0.0.0 --cachefile=test1.cache --infile=test.pcap --outfile=output.pcap -C
- 如果是处理多个pcap,新建一个
run.sh
,写入下面代码,然后保存,在root终端中运行sh run.sh
# 2022.7.1更新代码 #!/bin/bash path1="/home/kali/Desktop/netflow/wireshark-out/Train" #单向流pcap所在文件夹 for file in $(ls -A $path1) do echo $file mkdir /home/kali/Downloads/tcpreplay-4.4.0/0004/software-11/Train/$file # 创建文件夹 path2="$path1/$file" #echo $path2 dir=$(ls -A $path2) # 列出pcap文件 #echo $dir for i in $dir do echo $i tcpprep -a client -i $path1/$file/$i -o /home/kali/Downloads/tcpreplay-4.4.0/session/Train.cache && tcprewrite --srcipmap=0.0.0.0:0.0.0.0 --dstipmap=0.0.0.0:0.0.0.0 --enet-dmac=00:00:00:00:00:00 --enet-smac=00:00:00:00:00:00 --endpoints=0.0.0.0:0.0.0.0 --cachefile=/home/kali/Downloads/tcpreplay-4.4.0/session/Train.cache --infile=$path1/$file/$i --outfile=/home/kali/Downloads/tcpreplay-4.4.0/0004/software-11/Train/$file/$i -C done done
需要先用tcpprep将pcap处理为cache文件,再用tcpwrite处理cache文件
解释一下tcpprep
用到的参数:更多参数解释参考这里 还有这里 tcprewrite详细说明
tcpprep -a client -i test.pcap -o test1.cache
将数据包分成客户端和服务器端
-a 参数的介绍(搬运自上面的参考链接)
-a Split traffic in Auto Mode
一般情况下都需要该参数,表示按模式自动/client分离的流量生成cache文件-i <capfile>
: Input capture file to process,要输入的pcap-o <outputfile>
:Output cache file name,要输出的pcap
tcprewrite就是改写pcap包里的报文头部,包括2层, 3层, 4层, 5-7层。
tcprewrite的参数:
|$ tcprewrite --enet-smac=host_src_mac:client_src_mac #修改源端和目的端的源mac地址
| --enet-dmac=host_dst_mac:client_dst_mac #修改源端和目的端的目的mac地址
| --endpoints=host_dst_ip:client_dst_ip #修改源端和目的端的目的ip地址
| --portmap=old_port1:new_port1, old_port2:new_port2 #修改源端和目的端的端口号(这个我没用)
| -i input.pcap #输入pcap文件
| -c input.cache #tcpprep划分的cache文件
| -o out.pcap #输出pcap文件
该命令的输入参数是input.pcap
和input.cache
文件, 结果将另存为out.pcap
文件。
该命令将所有input.pcap
包里的主机包
(由input.cache文件指定哪些包是主机包, 哪些包是客户端包)的源mac地址
, 目的mac地址
, 目的IP地址
分别改为:
host_src_mac,
host_dst_mac
host_dst_ip。
客户端包
的源mac地址
, 目的mac地址,
目的IP地址
分别改为:
client_src_mac,
client_dst_mac,
client_dst_ip。
将主机包端口号
由old_port1改为new_port1,
将服务器端端口号
由old_port2改为new_port2。
解释一下
tcprewrite --srcipmap=0.0.0.0:0.0.0.0 --dstipmap=0.0.0.0:0.0.0.0 --enet-dmac=00:00:00:00:00:00 --enet-smac=00:00:00:00:00:00 --endpoints=0.0.0.0:0.0.0.0 --cachefile=test1.cache --infile=test.pcap --outfile=output.pcap -C
--srcipmap=0.0.0.0:0.0.0.0
:两端的源ip都改为0.0.0.0
--dstipmap=0.0.0.0:0.0.0.0
:两端的目的ip都改为0.0.0.0
--enet-dmac=00:00:00:00:00:00
:两端的目的mac都改为00:00:00:00:00:00
--enet-smac
:两端的源mac都改为00:00:00:00:00:00
--endpoints
:将pcap文件中的所有客户端、服务器都改成这一对IP地址
--cachefile
:之前处理好的cache
--infile
:输入pcap
--outfile
:输出pcap
这里是tcprewrite
的-h
7.7更新 用python单向和匿名化更快,tcpreplay较慢
import os
import os.path
from scapy.all import PcapReader,PcapWriter
pattern0 = '.pcap.TCP_192-168-123-19' # 正则模式
pattern1 = '.pcap.UDP_192-168-123-19' # 正则模式
pattern2 = '.pcap._192-168-123-19' # 正则模式
# 文件夹遍历
rootdir = "2_Session/00_software"
for root,dirs,files in os.walk(rootdir):
# root 所指的是当前正在遍历的这个文件夹的本身的地址
# dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
# files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
for dire in dirs:# 对第一级子目录进行循环
print(dire)
os.mkdir('3_anoy/00_software/'+ dire) # 新建文件夹
for f in os.listdir(root+"/"+ dire): # 对第一级子目录下文件遍历,这里只有pcap文件
# 寻找单向流
if ((f.find(pattern0) == -1)&(f.find(pattern1) == -1)&(f.find(pattern2) == -1)):#通过判断排除单向流
fstr = "".join(f)
# 保存的文件
# pcap地址
writers = PcapWriter('3_anoy/00_software/'+dire+'/'+fstr)
p = root + "/" + dire + "/" + fstr
print(p)
with PcapReader(p) as pcap_reader:#返回一个迭代器
for pkt in pcap_reader:#for循环进行遍历
#对pkt进行相应的处理
pkt["IP"].dst = "0.0.0.0"
pkt["IP"].src = "0.0.0.0"
pkt["Ether"].dst = "00:00:00:00:00:00"
pkt["Ether"].src = "00:00:00:00:00:00"
writers.write(pkt)
2022.6.29更新
1. Win10用powershell对文件批量改名
我的原始文件名是Amazon.pcap.TCP_3-0-87-74_80_192-168-123-19_57940.pcap
,因为文件名中有 (发现不处理也可以运行).pcap
导致tcpprep无法处理。要修改为Amazon_TCP_3-0-87-74_80_192-168-123-19_57940.pcap
- 在开始菜单中打开Windows powershell ISE,以管理员权限运行
- 输入下面的内容
# 定义要改文件名称的文件夹路径 $FolderPath = 'D:\work\Amazon-ALL' # 定义要重命名后的字符名称 $Newname = 'Amazon_' # 定义现阶段有规律字符名称,类似.txt或者.mp4,或者需要替换的字符串内容 $Oldname = 'Amazon.pcap.' # 进行批量替换操作 dir $FolderPath -Include "*.*" -Recurse | ForEach-Object{Rename-Item $_.FullName $_.FullName.Replace($Oldname,$Newname)}
- 保存成
.ps1
文件后,以管理员权限运行powershell,输入set-executionpolicy remotesigned
修改执行策略,再点击绿色三角运行。
2. kali下用tcpprep批量匿名pcap文件
- 新建
.sh
脚本 - 输入内容
# 这段代码是最开始写的,没有上面那段方便,这里的文件夹结构是一级的,需要自己修改`whatsapp`的名字 #!/bin/bash path="/home/kali/Downloads/tcpreplay-4.4.0/session/whatsapp/" cd $path find ./ -name '*.pcap' | while read i do echo $i tcpprep -a client -i $i -o /home/kali/Downloads/tcpreplay-4.4.0/session/whatsapp/test.cache sleep 1s tcprewrite --srcipmap=0.0.0.0:0.0.0.0 --dstipmap=0.0.0.0:0.0.0.0 --enet-dmac=00:00:00:00:00:00 --enet-smac=00:00:00:00:00:00 --endpoints=0.0.0.0:0.0.0.0 --cachefile=/home/kali/Downloads/tcpreplay-4.4.0/session/whatsapp/test.cache --infile=$i --outfile=/home/kali/Downloads/tcpreplay-4.4.0/0001/whatsapp/$i -C done
3. crgwin安装tcpreplay整理(弃用,不方便)
- flex-2.6.4
make
报错
解决方案:configure.ac:59: error: required file 'build-aux/compile' not found configure.ac:59: 'automake --add-missing' can install 'compile' configure.ac:59: error: required file 'build-aux/config.guess' not found configure.ac:59: 'automake --add-missing' can install 'config.guess' configure.ac:59: error: required file 'build-aux/config.sub' not found configure.ac:59: 'automake --add-missing' can install 'config.sub'
## 可能需要多执行几次此命令 automake --add-missing
configure : error : no acceptable C compiler found in $PATH
打开cygwin安装包exe,安装gcc组件,参考Cygwin及Wget安装
ubuntu18.04配置USTC-TK2016工具
1 安装powershell
参考微软官方文档:https://docs.microsoft.com/en-us/powershell/scripting/install/install-ubuntu?view=powershell-7.2
第三句的$(lsb_release -rs)
改成ubuntu系统版本18.04