bugku——分析(流量分析)题解

目录

1,flag被盗

2,中国菜刀

3,这么多数据包

4,手机热点

5,抓到一只苍蝇

6,日志审计

7,weblogic

8,信息提取(超详细)

9,特殊后门


1,flag被盗

ctrl + f 打开搜索框,搜flag ,找到 93 个数据包里有 flag.txt字样,

bugku——分析(流量分析)题解_第1张图片

右键,追踪 TCP数据流,在其中看到了 flag:

bugku——分析(流量分析)题解_第2张图片

flag{This_is_a_f10g}

2,中国菜刀

在 分组字节流中搜索 flag 字符串,找到第8 个包,追踪tcp数据流

bugku——分析(流量分析)题解_第3张图片

看到了 flag.tar.gz,猜测流量包中隐藏了一个压缩包,

用binwalk 审查一下:发现了一个压缩包,分离

key{8769fe393f2b998fa6a11afe2bfcd65e}

3,这么多数据包

前边的都是些无关紧要,一直到NO104,下面的再干嘛?

源ip138一直向目标ip159发送syn握手包,想要建立连接,其实就是端口扫描,原理就是,想和你某个端口建立连接,然后看这个端口的回复的类型来看下是否开放了此端口。我们现在就可以知道138是客户端,159是服务器端了。红色的包是服务器向客户端回复的信息,代表此端口没有开放。

其实就是在扫描服务器 159的开放端口

看到 中间有一段 是与 服务器 3389的通信

bugku——分析(流量分析)题解_第4张图片

说明服务器端的 3389端口开放,跟踪数据流

发现大串的无用乱码:

bugku——分析(流量分析)题解_第5张图片

直接搜索 tcp

然后拉到最后 扫描结束后发送的数据包,4444端口和 1024 的端口之间的通信,追踪数据流,还是没有发现什么

然后又发现了 12345 端口和 35800之间的通信  追踪数据流 发现了一段 base 64密文 解密后得到flag

bugku——分析(流量分析)题解_第6张图片

bugku——分析(流量分析)题解_第7张图片

CCTF{do_you_like_sniffer}

4,手机热点

方法一: 不管流量包中有没有隐藏文件,先分离一下看看,直接用foremost分离一下

分离出来 一个压缩包,解压出来一张图片,flag.jpg

bugku——分析(流量分析)题解_第8张图片

方法二:正常思路,题目描述说是共享手机热点,然后向电脑发送了一些东西,这里应该是通过 蓝牙协议 (obex)发送得文件

过滤出 obex协议的包,

bugku——分析(流量分析)题解_第9张图片

导出分组字节流 保存为 123.rar 解压出来一张图片 flag.jpg

 

5,抓到一只苍蝇

首先在 分组字节流中 搜索一下 字符串 flag 找到第一个 包,追踪一下数据流 ,

bugku——分析(流量分析)题解_第10张图片

然后就看到了上述信息,知道了应该是在用 qq邮箱传输文件,

文件的信息: fly.rar  文件的大小为 525701

{"path":"fly.rar","appid":"","size":525701,"md5":"e023afa4f6579db5becda8fe7861c2d3","sha":"ecccba7aea1d482684374b22e2e7abad2ba86749","sha3":""}

既然知道了在上传文件,肯定要用到 http的request的 POST方法

在过滤器中 输入

http && http.request.method==POST

然后找到这5个包,第一个包是 文件的信息,后面5个包为数据

bugku——分析(流量分析)题解_第11张图片

分别查看其中 date 的长度:
bugku——分析(流量分析)题解_第12张图片

前四个 为 131436 最后一个为 17777

所以 131436*4 +17777=527571  与第一个包给出的 fly.rar的长度 525701 差 1820

因为每个包都包含头信息,1820/5 = 364

所以每个包的头信息为 364

接下来导出数据包:

wireshark->文件->导出对象->http->选择save对象

bugku——分析(流量分析)题解_第13张图片

将对应的包 分别save 为 1 2 3 4 5

将这五个包拖进 kali中 

执行:

dd if=1 bs=1 skip=364 of=11

dd if=2 bs=1 skip=364 of=22

dd if=3 bs=1 skip=364 of=33

dd if=4 bs=1 skip=364 of=44

dd if=5 bs=1 skip=364 of=55

将数据包的头部的 364个字节去除  得到 11 22 33 44 55

将这五个包合并

cat 11 22 33  44 55 > fly.rar

查看一下 flag.rar的md5值是否正确

md5sum fly.rar

正确

解压,跳出提示文件头损坏,并且要求输入密码

知道是伪密码,用winhex打开,修改文件头,将 84 改为 80,保存

bugku——分析(流量分析)题解_第14张图片

解压得到,flag.txt 打开一堆乱码,直接用 foremost分离一下,得到很多的图片

发现一张二维码,扫描后得到flag

bugku——分析(流量分析)题解_第15张图片

flag{m1Sc_oxO2_Fly}

 

其实我刚开始不是这么做的,我是直接用foremost分离  流量包 ,然后分离出来几张图片 和一个压缩包,尝试解压

爆出一堆错误,并提示输入密码,将 文件头的 84 修改为 80 后依然打不开 ,,可能是 这个文件中还包含了其他错误信息,然后就换用上面的方法了

 

6,日志审计

用 notepad++ 打开 日志文件,先用 插件中的 MIME Tool  中的 URL decode 解一下码

然后就能清楚的看出来 是在进行 sql 盲注操作,

进一步审查,还可以看到每一条语句 返回的状态码 ,并且知道 他是用的 二分法在进行 sql盲注

我需要做的就是找到 每一个 测试的字符的 最后一条状态码为 200 的 语句中的 ascii 值并记录下来

例如:

bugku——分析(流量分析)题解_第16张图片

由于使用的是二分法,所以我们这里可以知道  flag的第 18 个字符的ascii 为  117+1  ,118

当然你你也可以用手工的方法,一个一个的记下 flag 每一个 字符的 ascii 值 (flag也就 25个字符,如果写不出代码的话)

当然最好是用脚本跑出来

我找了个脚本:

# coding:utf-8
import re
import urllib

f = open('access.log', 'r')
lines = f.readlines()
datas = []
for line in lines:
    t = urllib.unquote(line)
 # 过滤出与flag相关,正确的猜解,这里只收集正确的猜解,而测试字符的ascii = 最后一个正确的猜解的ascii +1(这是二分法的一个隐藏规律)
    if '200 1765' in t and 'flag' in t: 
        datas.append(t)

flag_ascii = {}
for data in datas:
    matchObj = re.search(r'LIMIT 0,1\),(.*?),1\)\)>(.*?) AND', data)
    if matchObj:
        key = int(matchObj.group(1))
        value = int(matchObj.group(2)) + 1
        flag_ascii[key] = value  # 使用字典,保存最后一次猜解正确的ascii码

flag = ''
for value in flag_ascii.values():
    flag += chr(value)

print flag

解释一下:

t = urllib.unquote(line)            就是将 文本进行 urldecode 解码

if '200 1765' in t and 'flag' in t:   如果语句中有这两个字符串就直接将这个语句 存入 数组datas中
        datas.append(t)

matchObj = re.search(r'LIMIT 0,1\),(.*?),1\)\)>(.*?) AND', data)    在date 中搜索符合 正则表达的 字符串并 将匹配的字符串存入变量 matchObj 中

        key = int(matchObj.group(1))         取 变量matchObj 中 的第一个括号里的内容 (也就是上条语句中的 (.*?)中的内容)并转为10进制
        value = int(matchObj.group(2)) + 1     取 变量matchObj 中 的第二个括号里的内容,并转为 10 进制

 

得到 flag:flag{sqlm4p_15_p0werful}

 

7,weblogic

提示:

黑客攻击了Weblogic应用,请分析攻击过程,找出Weblogic的主机名。flag格式:flag{}

Tip:主机名为十六进制。

黑客的攻击过程:

weblogic 攻击流量审计。模拟了爆破weblogic登录密码,通过部署war包getshell,执行命令获取hostname的操作。

正常思路先在分组字节流中搜索 字符串 hostname

找到了两个 包  no.658 662

追踪流  然后搜索 hostname 

然后就找到了  

bugku——分析(流量分析)题解_第17张图片

flag{6ad4c5a09043}

 

8,信息提取(超详细)

曾经在比赛中也遇过几乎一样的题,一直没有好好的写过一篇详细的博客,今天决定借助这个题好好记录理解一下这种类型的题

提示 : sqlmap

打开流量包,也观察到了 是 用sqlmap进行的 sql盲注的过程,用的是二分法

为了更好的理解 注入的过程 我们首先把 注入语句提取出来,这样方便观察

 

过滤http流量  ,然后   文件 》导出分组解析结果 》为CSV      保存为 123.txt

用notepad++  打开 123.txt,可以看到语句语句中还是夹杂着很多的urlcode  

全选  , 然后   插件 》MIME Tools  》 url decode ,这样就把URLcode转为更直观的 ascii了

然后再 来理解用 二分法 进行sql盲注的过程

以flag 的第一个字符为 例 :

bugku——分析(流量分析)题解_第18张图片

绿色框中的数字  代表是测试第几个 字符

红色框中的数字  代表 与当前测试的字符的ascii值 相比较的 值

粉色框中数字  代表返回的数据的长度(一会我们要依据这个来判断上面的语句是否正确)

ascii有 128个所以从  64 开始判断,然后是96(64和128的中间值),说明>64是正确的 ,才会取96,然后是 80,80小于96,说明>96是错误的,所以才会取 64和96 的中间值 80,然后是 72 ,说明>80是错误的,取80和64之间的中间值72,然后是76,说明>72是正确的,才会取 72 和80之间的中间值76,然后是 74,说明>76是错误的,才会取 72 和76的中间值 74,然后是73,说明>74是错误的,才会取 72 和 74的中间值 73

至于 > 73 语句是否正确,关系到我们最后的取值,

我们已经知道了 第一个字符 的ascii值 的范围 为  72< x <= 74,  至于是 73 还是 74 ,需另做判断:

若 > 73 正确, 则 x = 74  第一个字符 的ascii值为 74  就是 J

若 >73  错误,则  x = 73 就是 I

由于我们上面已经知道了  >64 是正确的    返回包的数据长度是 467

                                         >96 是错误的    返回包的数据长度是 430

                                         >80 是错误的    返回包的数据长度是 430

                                         >72 是正确的    返回包的数据长度是 467

                                         >76 是错误的    返回包的数据长度是 430

                                         >74 是错误的    返回包的数据长度是 430

可以看到 当判断语句正确时 ,返包的数据长度 是 大于 430的 ,错误时 是小于等于 430

然后看到  最后一条语句  >73 的返回值 为 430,说明与错误, 第一个字符的ascii 为  73  

 

理解了过程就好做多了

我们只需要 找到 当前测试字符的  最后一条的测试语句的 ascii值  和 返回值

如果返回值大于 430  则   当前测试字符的ascii 值 为   最后一条测试语句的ascii值

如果返回值 小于等于 430 则 当前测试字符的ascii值 为  最后一条测试语句的ascii   +   1

 

方法一:(当flag 较短的时候)

当flag较短的时候,我们肯定是用手工 一个一个记下 每个字符的ascii值 比较快

方法二: (当flag 较长时)

当flag 为 25个字符以上的时候,手工就显得太费劲,不如写个脚本来的快,就想本题一样,flag的长度为 33

上脚本:

import re
import urllib.parse

# 更改为自己从wireshark提取出的csv文件地址
f = open(r"123.txt")
lines = f.readlines()
datas = []
# 转码, 保存进datas
for line in lines:
    datas.append(urllib.parse.unquote(line))
lines = []  # 懒得改, 就复用一下, 这个lines保存注入flag的url
for i in range(len(datas)):  # 提取出注入flag的url
    if datas[i].find("isg.flags ORDER BY `value` LIMIT 0,1),1,1))>64") > 0:
        lines = datas[i:]
        break
flag = {}
# 用正则匹配
macth1 = re.compile(r"LIMIT 0,1\),(\d*?),1\)\)>(\d*?) HTTP/1.1")
macth2 = re.compile(r'"HTTP","(\d*?)","HTTP/1.1 200 OK')
for i in range(0, len(lines), 2):  # 因为有返回响应, 所以步长为2
    get1 = macth1.search(lines[i])
    if get1:
        key = int(get1.group(1))  # key保存字符的位置
        value = int(get1.group(2))  # value保存字符的ascii编码
        get2 = macth2.search(lines[i + 1])
        if get2:
            if int(get2.group(1)) > 450:
                value += 1
        flag[key] = value  # 用字典保存flag
f.close()
result = ''
for value in flag.values():
    result += chr(value)
print(result)

为什么脚本中 判断的返回值取  450 呢? 因为 取430时,得出来的flag不对,仔细查看123.txt后,发现 其中还有一些错误的语句的返回 包  为 431 或者 432,所以就干纯粹取个 450 (433~460都可以)

(这再看不懂就考虑换专业吧)

得到flag:

bugku——分析(流量分析)题解_第19张图片

ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}

 

9,特殊后门

乍一看,什么黑客后门的看起来挺吓人,其实非常简单,

直接在 分组字节流 中搜索字符串  flag :

直接找到第 252 包:
bugku——分析(流量分析)题解_第20张图片

然后看下一个包,在相同位置有一个字符 f

bugku——分析(流量分析)题解_第21张图片

然后在接下来的每一个包的相同位置都有 一个字符,收集起来就是flag

flag{Icmp_backdoor_can_transfer-some_infomation}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(CTF题解)