bugku——分析(流量分析)题解
目錄
1,flag被盜
2,中國(guó)菜刀
3,這么多數(shù)據(jù)包
4,手機(jī)熱點(diǎn)
5,抓到一只蒼蠅
6,日志審計(jì)
7,weblogic
8,信息提取(超詳細(xì))
9,特殊后門
1,flag被盜
ctrl + f 打開搜索框,搜flag ,找到 93 個(gè)數(shù)據(jù)包里有 flag.txt字樣,
右鍵,追蹤 TCP數(shù)據(jù)流,在其中看到了 flag:
flag{This_is_a_f10g}
2,中國(guó)菜刀
在 分組字節(jié)流中搜索 flag 字符串,找到第8 個(gè)包,追蹤tcp數(shù)據(jù)流
看到了 flag.tar.gz,猜測(cè)流量包中隱藏了一個(gè)壓縮包,
用binwalk 審查一下:發(fā)現(xiàn)了一個(gè)壓縮包,分離
key{8769fe393f2b998fa6a11afe2bfcd65e}
3,這么多數(shù)據(jù)包
前邊的都是些無關(guān)緊要,一直到NO104,下面的再干嘛?
源ip138一直向目標(biāo)ip159發(fā)送syn握手包,想要建立連接,其實(shí)就是端口掃描,原理就是,想和你某個(gè)端口建立連接,然后看這個(gè)端口的回復(fù)的類型來看下是否開放了此端口。我們現(xiàn)在就可以知道138是客戶端,159是服務(wù)器端了。紅色的包是服務(wù)器向客戶端回復(fù)的信息,代表此端口沒有開放。
其實(shí)就是在掃描服務(wù)器 159的開放端口
看到 中間有一段 是與 服務(wù)器 3389的通信
說明服務(wù)器端的 3389端口開放,跟蹤數(shù)據(jù)流
發(fā)現(xiàn)大串的無用亂碼:
直接搜索 tcp
然后拉到最后 掃描結(jié)束后發(fā)送的數(shù)據(jù)包,4444端口和 1024 的端口之間的通信,追蹤數(shù)據(jù)流,還是沒有發(fā)現(xiàn)什么
然后又發(fā)現(xiàn)了 12345 端口和 35800之間的通信? 追蹤數(shù)據(jù)流 發(fā)現(xiàn)了一段 base 64密文 解密后得到flag
CCTF{do_you_like_sniffer}
4,手機(jī)熱點(diǎn)
方法一: 不管流量包中有沒有隱藏文件,先分離一下看看,直接用foremost分離一下
分離出來 一個(gè)壓縮包,解壓出來一張圖片,flag.jpg
方法二:正常思路,題目描述說是共享手機(jī)熱點(diǎn),然后向電腦發(fā)送了一些東西,這里應(yīng)該是通過 藍(lán)牙協(xié)議 (obex)發(fā)送得文件
過濾出 obex協(xié)議的包,
導(dǎo)出分組字節(jié)流 保存為 123.rar 解壓出來一張圖片 flag.jpg
?
5,抓到一只蒼蠅
首先在 分組字節(jié)流中 搜索一下 字符串 flag 找到第一個(gè) 包,追蹤一下數(shù)據(jù)流 ,
然后就看到了上述信息,知道了應(yīng)該是在用 qq郵箱傳輸文件,
文件的信息: fly.rar? 文件的大小為 525701
{"path":"fly.rar","appid":"","size":525701,"md5":"e023afa4f6579db5becda8fe7861c2d3","sha":"ecccba7aea1d482684374b22e2e7abad2ba86749","sha3":""}
既然知道了在上傳文件,肯定要用到 http的request的 POST方法
在過濾器中 輸入
http && http.request.method==POST然后找到這5個(gè)包,第一個(gè)包是 文件的信息,后面5個(gè)包為數(shù)據(jù)
分別查看其中 date 的長(zhǎng)度:
前四個(gè) 為 131436 最后一個(gè)為 17777
所以 131436*4 +17777=527571? 與第一個(gè)包給出的 fly.rar的長(zhǎng)度 525701 差 1820
因?yàn)槊總€(gè)包都包含頭信息,1820/5 = 364
所以每個(gè)包的頭信息為 364
接下來導(dǎo)出數(shù)據(jù)包:
wireshark->文件->導(dǎo)出對(duì)象->http->選擇save對(duì)象
將對(duì)應(yīng)的包 分別save 為 1 2 3 4 5
將這五個(gè)包拖進(jìn) kali中?
執(zhí)行:
dd if=1 bs=1 skip=364 of=11dd if=2 bs=1 skip=364 of=22dd if=3 bs=1 skip=364 of=33dd if=4 bs=1 skip=364 of=44dd if=5 bs=1 skip=364 of=55將數(shù)據(jù)包的頭部的 364個(gè)字節(jié)去除? 得到 11 22 33 44 55
將這五個(gè)包合并
cat 11 22 33 44 55 > fly.rar查看一下 flag.rar的md5值是否正確
md5sum fly.rar正確
解壓,跳出提示文件頭損壞,并且要求輸入密碼
知道是偽密碼,用winhex打開,修改文件頭,將 84 改為 80,保存
解壓得到,flag.txt 打開一堆亂碼,直接用 foremost分離一下,得到很多的圖片
發(fā)現(xiàn)一張二維碼,掃描后得到flag
flag{m1Sc_oxO2_Fly}
?
其實(shí)我剛開始不是這么做的,我是直接用foremost分離? 流量包 ,然后分離出來幾張圖片 和一個(gè)壓縮包,嘗試解壓
爆出一堆錯(cuò)誤,并提示輸入密碼,將 文件頭的 84 修改為 80 后依然打不開 ,,可能是 這個(gè)文件中還包含了其他錯(cuò)誤信息,然后就換用上面的方法了
?
6,日志審計(jì)
用 notepad++ 打開 日志文件,先用 插件中的 MIME Tool? 中的 URL decode 解一下碼
然后就能清楚的看出來 是在進(jìn)行 sql 盲注操作,
進(jìn)一步審查,還可以看到每一條語句 返回的狀態(tài)碼 ,并且知道 他是用的 二分法在進(jìn)行 sql盲注
我需要做的就是找到 每一個(gè) 測(cè)試的字符的 最后一條狀態(tài)碼為 200 的 語句中的 ascii 值并記錄下來
例如:
由于使用的是二分法,所以我們這里可以知道? flag的第 18 個(gè)字符的ascii 為? 117+1? ,118
當(dāng)然你你也可以用手工的方法,一個(gè)一個(gè)的記下 flag 每一個(gè) 字符的 ascii 值 (flag也就 25個(gè)字符,如果寫不出代碼的話)
當(dāng)然最好是用腳本跑出來
我找了個(gè)腳本:
# coding:utf-8 import re import urllibf = open('access.log', 'r') lines = f.readlines() datas = [] for line in lines:t = urllib.unquote(line)# 過濾出與flag相關(guān),正確的猜解,這里只收集正確的猜解,而測(cè)試字符的ascii = 最后一個(gè)正確的猜解的ascii +1(這是二分法的一個(gè)隱藏規(guī)律)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)) + 1flag_ascii[key] = value # 使用字典,保存最后一次猜解正確的ascii碼flag = '' for value in flag_ascii.values():flag += chr(value)print flag解釋一下:
t = urllib.unquote(line)? ? ? ? ? ? 就是將 文本進(jìn)行 urldecode 解碼
if '200 1765' in t and 'flag' in t:? ?如果語句中有這兩個(gè)字符串就直接將這個(gè)語句 存入 數(shù)組datas中
? ? ? ? datas.append(t)
matchObj = re.search(r'LIMIT 0,1\),(.*?),1\)\)>(.*?) AND', data)? ? 在date 中搜索符合 正則表達(dá)的 字符串并 將匹配的字符串存入變量 matchObj 中
? ? ? ? key = int(matchObj.group(1))? ? ? ? ?取 變量matchObj 中 的第一個(gè)括號(hào)里的內(nèi)容 (也就是上條語句中的 (.*?)中的內(nèi)容)并轉(zhuǎn)為10進(jìn)制
? ? ? ? value = int(matchObj.group(2)) + 1? ? ?取 變量matchObj 中 的第二個(gè)括號(hào)里的內(nèi)容,并轉(zhuǎn)為 10 進(jìn)制
?
得到 flag:flag{sqlm4p_15_p0werful}
?
7,weblogic
提示:
黑客攻擊了Weblogic應(yīng)用,請(qǐng)分析攻擊過程,找出Weblogic的主機(jī)名。flag格式:flag{}
Tip:主機(jī)名為十六進(jìn)制。
黑客的攻擊過程:
weblogic 攻擊流量審計(jì)。模擬了爆破weblogic登錄密碼,通過部署war包getshell,執(zhí)行命令獲取hostname的操作。
正常思路先在分組字節(jié)流中搜索 字符串 hostname
找到了兩個(gè) 包? no.658 662
追蹤流? 然后搜索 hostname?
然后就找到了??
flag{6ad4c5a09043}
?
8,信息提取(超詳細(xì))
曾經(jīng)在比賽中也遇過幾乎一樣的題,一直沒有好好的寫過一篇詳細(xì)的博客,今天決定借助這個(gè)題好好記錄理解一下這種類型的題
提示 : sqlmap
打開流量包,也觀察到了 是 用sqlmap進(jìn)行的 sql盲注的過程,用的是二分法
為了更好的理解 注入的過程 我們首先把 注入語句提取出來,這樣方便觀察
?
過濾http流量? ,然后? ?文件 》導(dǎo)出分組解析結(jié)果 》為CSV? ? ? 保存為 123.txt
用notepad++? 打開 123.txt,可以看到語句語句中還是夾雜著很多的urlcode??
全選? , 然后? ?插件 》MIME Tools? 》 url decode ,這樣就把URLcode轉(zhuǎn)為更直觀的 ascii了
然后再 來理解用 二分法 進(jìn)行sql盲注的過程
以flag 的第一個(gè)字符為 例 :
綠色框中的數(shù)字? 代表是測(cè)試第幾個(gè) 字符
紅色框中的數(shù)字??代表 與當(dāng)前測(cè)試的字符的ascii值 相比較的 值
粉色框中數(shù)字? 代表返回的數(shù)據(jù)的長(zhǎng)度(一會(huì)我們要依據(jù)這個(gè)來判斷上面的語句是否正確)
ascii有 128個(gè)所以從? 64 開始判斷,然后是96(64和128的中間值),說明>64是正確的 ,才會(huì)取96,然后是 80,80小于96,說明>96是錯(cuò)誤的,所以才會(huì)取?64和96 的中間值 80,然后是 72 ,說明>80是錯(cuò)誤的,取80和64之間的中間值72,然后是76,說明>72是正確的,才會(huì)取 72 和80之間的中間值76,然后是 74,說明>76是錯(cuò)誤的,才會(huì)取 72 和76的中間值 74,然后是73,說明>74是錯(cuò)誤的,才會(huì)取 72 和 74的中間值 73
至于 > 73 語句是否正確,關(guān)系到我們最后的取值,
我們已經(jīng)知道了 第一個(gè)字符 的ascii值 的范圍 為? 72< x <= 74,? 至于是 73 還是 74 ,需另做判斷:
若 > 73 正確, 則 x = 74? 第一個(gè)字符 的ascii值為 74? 就是 J
若 >73? 錯(cuò)誤,則? x = 73 就是 I
由于我們上面已經(jīng)知道了? >64 是正確的? ? 返回包的數(shù)據(jù)長(zhǎng)度是 467
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?>96 是錯(cuò)誤的? ? 返回包的數(shù)據(jù)長(zhǎng)度是 430
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?>80?是錯(cuò)誤的? ? 返回包的數(shù)據(jù)長(zhǎng)度是 430
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?>72?是正確的? ? 返回包的數(shù)據(jù)長(zhǎng)度是 467
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?>76 是錯(cuò)誤的? ? 返回包的數(shù)據(jù)長(zhǎng)度是 430
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?>74?是錯(cuò)誤的? ? 返回包的數(shù)據(jù)長(zhǎng)度是 430
可以看到 當(dāng)判斷語句正確時(shí) ,返包的數(shù)據(jù)長(zhǎng)度 是 大于 430的 ,錯(cuò)誤時(shí) 是小于等于 430
然后看到? 最后一條語句? >73 的返回值 為 430,說明與錯(cuò)誤, 第一個(gè)字符的ascii 為? 73??
?
理解了過程就好做多了
我們只需要 找到 當(dāng)前測(cè)試字符的? 最后一條的測(cè)試語句的 ascii值? 和 返回值
如果返回值大于 430? 則? ?當(dāng)前測(cè)試字符的ascii 值 為? ?最后一條測(cè)試語句的ascii值
如果返回值 小于等于 430 則 當(dāng)前測(cè)試字符的ascii值 為? 最后一條測(cè)試語句的ascii? ?+? ?1
?
方法一:(當(dāng)flag 較短的時(shí)候)
當(dāng)flag較短的時(shí)候,我們肯定是用手工 一個(gè)一個(gè)記下 每個(gè)字符的ascii值 比較快
方法二: (當(dāng)flag 較長(zhǎng)時(shí))
當(dāng)flag 為 25個(gè)字符以上的時(shí)候,手工就顯得太費(fèi)勁,不如寫個(gè)腳本來的快,就想本題一樣,flag的長(zhǎng)度為 33
上腳本:
import re import urllib.parse# 更改為自己從wireshark提取出的csv文件地址 f = open(r"123.txt") lines = f.readlines() datas = [] # 轉(zhuǎn)碼, 保存進(jìn)datas for line in lines:datas.append(urllib.parse.unquote(line)) lines = [] # 懶得改, 就復(fù)用一下, 這個(gè)lines保存注入flag的url for i in range(len(datas)): # 提取出注入flag的urlif 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): # 因?yàn)橛蟹祷仨憫?yīng), 所以步長(zhǎng)為2get1 = 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 += 1flag[key] = value # 用字典保存flag f.close() result = '' for value in flag.values():result += chr(value) print(result)為什么腳本中 判斷的返回值取? 450 呢? 因?yàn)?取430時(shí),得出來的flag不對(duì),仔細(xì)查看123.txt后,發(fā)現(xiàn) 其中還有一些錯(cuò)誤的語句的返回 包? 為 431 或者 432,所以就干純粹取個(gè) 450 (433~460都可以)
(這再看不懂就考慮換專業(yè)吧)
得到flag:
ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}
?
9,特殊后門
乍一看,什么黑客后門的看起來挺嚇人,其實(shí)非常簡(jiǎn)單,
直接在 分組字節(jié)流 中搜索字符串? flag :
直接找到第 252 包:
然后看下一個(gè)包,在相同位置有一個(gè)字符 f
然后在接下來的每一個(gè)包的相同位置都有 一個(gè)字符,收集起來就是flag
flag{Icmp_backdoor_can_transfer-some_infomation}
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的bugku——分析(流量分析)题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 攻防世界 ——crypto
- 下一篇: 《随笔 三》