目录
1,flag被盗
2,中国菜刀
3,这么多数据包
4,手机热点
5,抓到一只苍蝇
6,日志审计
7,weblogic
8,信息提取(超详细)
9,特殊后门
ctrl + f 打开搜索框,搜flag ,找到 93 个数据包里有 flag.txt字样,
右键,追踪 TCP数据流,在其中看到了 flag:
flag{This_is_a_f10g}
在 分组字节流中搜索 flag 字符串,找到第8 个包,追踪tcp数据流
看到了 flag.tar.gz,猜测流量包中隐藏了一个压缩包,
用binwalk 审查一下:发现了一个压缩包,分离
key{8769fe393f2b998fa6a11afe2bfcd65e}
前边的都是些无关紧要,一直到NO104,下面的再干嘛?
源ip138一直向目标ip159发送syn握手包,想要建立连接,其实就是端口扫描,原理就是,想和你某个端口建立连接,然后看这个端口的回复的类型来看下是否开放了此端口。我们现在就可以知道138是客户端,159是服务器端了。红色的包是服务器向客户端回复的信息,代表此端口没有开放。
其实就是在扫描服务器 159的开放端口
看到 中间有一段 是与 服务器 3389的通信
说明服务器端的 3389端口开放,跟踪数据流
发现大串的无用乱码:
直接搜索 tcp
然后拉到最后 扫描结束后发送的数据包,4444端口和 1024 的端口之间的通信,追踪数据流,还是没有发现什么
然后又发现了 12345 端口和 35800之间的通信 追踪数据流 发现了一段 base 64密文 解密后得到flag
CCTF{do_you_like_sniffer}
方法一: 不管流量包中有没有隐藏文件,先分离一下看看,直接用foremost分离一下
分离出来 一个压缩包,解压出来一张图片,flag.jpg
方法二:正常思路,题目描述说是共享手机热点,然后向电脑发送了一些东西,这里应该是通过 蓝牙协议 (obex)发送得文件
过滤出 obex协议的包,
导出分组字节流 保存为 123.rar 解压出来一张图片 flag.jpg
首先在 分组字节流中 搜索一下 字符串 flag 找到第一个 包,追踪一下数据流 ,
然后就看到了上述信息,知道了应该是在用 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个包为数据
前四个 为 131436 最后一个为 17777
所以 131436*4 +17777=527571 与第一个包给出的 fly.rar的长度 525701 差 1820
因为每个包都包含头信息,1820/5 = 364
所以每个包的头信息为 364
接下来导出数据包:
wireshark->文件->导出对象->http->选择save对象
将对应的包 分别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,保存
解压得到,flag.txt 打开一堆乱码,直接用 foremost分离一下,得到很多的图片
发现一张二维码,扫描后得到flag
flag{m1Sc_oxO2_Fly}
其实我刚开始不是这么做的,我是直接用foremost分离 流量包 ,然后分离出来几张图片 和一个压缩包,尝试解压
爆出一堆错误,并提示输入密码,将 文件头的 84 修改为 80 后依然打不开 ,,可能是 这个文件中还包含了其他错误信息,然后就换用上面的方法了
用 notepad++ 打开 日志文件,先用 插件中的 MIME Tool 中的 URL decode 解一下码
然后就能清楚的看出来 是在进行 sql 盲注操作,
进一步审查,还可以看到每一条语句 返回的状态码 ,并且知道 他是用的 二分法在进行 sql盲注
我需要做的就是找到 每一个 测试的字符的 最后一条状态码为 200 的 语句中的 ascii 值并记录下来
例如:
由于使用的是二分法,所以我们这里可以知道 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}
提示:
黑客攻击了Weblogic应用,请分析攻击过程,找出Weblogic的主机名。flag格式:flag{}
Tip:主机名为十六进制。
黑客的攻击过程:
weblogic 攻击流量审计。模拟了爆破weblogic登录密码,通过部署war包getshell,执行命令获取hostname的操作。
正常思路先在分组字节流中搜索 字符串 hostname
找到了两个 包 no.658 662
追踪流 然后搜索 hostname
然后就找到了
flag{6ad4c5a09043}
曾经在比赛中也遇过几乎一样的题,一直没有好好的写过一篇详细的博客,今天决定借助这个题好好记录理解一下这种类型的题
提示 : sqlmap
打开流量包,也观察到了 是 用sqlmap进行的 sql盲注的过程,用的是二分法
为了更好的理解 注入的过程 我们首先把 注入语句提取出来,这样方便观察
过滤http流量 ,然后 文件 》导出分组解析结果 》为CSV 保存为 123.txt
用notepad++ 打开 123.txt,可以看到语句语句中还是夹杂着很多的urlcode
全选 , 然后 插件 》MIME Tools 》 url decode ,这样就把URLcode转为更直观的 ascii了
然后再 来理解用 二分法 进行sql盲注的过程
以flag 的第一个字符为 例 :
绿色框中的数字 代表是测试第几个 字符
红色框中的数字 代表 与当前测试的字符的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:
ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}
乍一看,什么黑客后门的看起来挺吓人,其实非常简单,
直接在 分组字节流 中搜索字符串 flag :
然后看下一个包,在相同位置有一个字符 f
然后在接下来的每一个包的相同位置都有 一个字符,收集起来就是flag
flag{Icmp_backdoor_can_transfer-some_infomation}