bugku——分析(流量分析)题解
目錄
1,flag被盜
2,中國菜刀
3,這么多數據包
4,手機熱點
5,抓到一只蒼蠅
6,日志審計
7,weblogic
8,信息提取(超詳細)
9,特殊后門
1,flag被盜
ctrl + f 打開搜索框,搜flag ,找到 93 個數據包里有 flag.txt字樣,
右鍵,追蹤 TCP數據流,在其中看到了 flag:
flag{This_is_a_f10g}
2,中國菜刀
在 分組字節流中搜索 flag 字符串,找到第8 個包,追蹤tcp數據流
看到了 flag.tar.gz,猜測流量包中隱藏了一個壓縮包,
用binwalk 審查一下:發現了一個壓縮包,分離
key{8769fe393f2b998fa6a11afe2bfcd65e}
3,這么多數據包
前邊的都是些無關緊要,一直到NO104,下面的再干嘛?
源ip138一直向目標ip159發送syn握手包,想要建立連接,其實就是端口掃描,原理就是,想和你某個端口建立連接,然后看這個端口的回復的類型來看下是否開放了此端口。我們現在就可以知道138是客戶端,159是服務器端了。紅色的包是服務器向客戶端回復的信息,代表此端口沒有開放。
其實就是在掃描服務器 159的開放端口
看到 中間有一段 是與 服務器 3389的通信
說明服務器端的 3389端口開放,跟蹤數據流
發現大串的無用亂碼:
直接搜索 tcp
然后拉到最后 掃描結束后發送的數據包,4444端口和 1024 的端口之間的通信,追蹤數據流,還是沒有發現什么
然后又發現了 12345 端口和 35800之間的通信? 追蹤數據流 發現了一段 base 64密文 解密后得到flag
CCTF{do_you_like_sniffer}
4,手機熱點
方法一: 不管流量包中有沒有隱藏文件,先分離一下看看,直接用foremost分離一下
分離出來 一個壓縮包,解壓出來一張圖片,flag.jpg
方法二:正常思路,題目描述說是共享手機熱點,然后向電腦發送了一些東西,這里應該是通過 藍牙協議 (obex)發送得文件
過濾出 obex協議的包,
導出分組字節流 保存為 123.rar 解壓出來一張圖片 flag.jpg
?
5,抓到一只蒼蠅
首先在 分組字節流中 搜索一下 字符串 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個包為數據
分別查看其中 date 的長度:
前四個 為 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=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將數據包的頭部的 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 后依然打不開 ,,可能是 這個文件中還包含了其他錯誤信息,然后就換用上面的方法了
?
6,日志審計
用 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 urllibf = 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)) + 1flag_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?
然后就找到了??
flag{6ad4c5a09043}
?
8,信息提取(超詳細)
曾經在比賽中也遇過幾乎一樣的題,一直沒有好好的寫過一篇詳細的博客,今天決定借助這個題好好記錄理解一下這種類型的題
提示 : 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的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): # 因為有返回響應, 所以步長為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 呢? 因為 取430時,得出來的flag不對,仔細查看123.txt后,發現 其中還有一些錯誤的語句的返回 包? 為 431 或者 432,所以就干純粹取個 450 (433~460都可以)
(這再看不懂就考慮換專業吧)
得到flag:
ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}
?
9,特殊后門
乍一看,什么黑客后門的看起來挺嚇人,其實非常簡單,
直接在 分組字節流 中搜索字符串? flag :
直接找到第 252 包:
然后看下一個包,在相同位置有一個字符 f
然后在接下來的每一個包的相同位置都有 一個字符,收集起來就是flag
flag{Icmp_backdoor_can_transfer-some_infomation}
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的bugku——分析(流量分析)题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 攻防世界 ——crypto
- 下一篇: 《随笔 三》