0x00 USB流量包分析
USB流量指的是USB設(shè)備接口的流量,攻擊者能夠通過(guò)監(jiān)聽(tīng)usb接口流量獲取鍵盤(pán)敲擊鍵、鼠標(biāo)移動(dòng)與點(diǎn)擊、存儲(chǔ)設(shè)備的銘文傳輸通信、USB無(wú)線網(wǎng)卡網(wǎng)絡(luò)傳輸內(nèi)容等等。
在CTF中,USB流量分析主要以鍵盤(pán)和鼠標(biāo)流量為主。
下面通過(guò)簡(jiǎn)單的講解與例題的展示,分析鍵盤(pán)流量與鼠標(biāo)流量。
例子中用到的文件為usb.pcap和usb2.pcap,我一起打包了放在云盤(pán)上,鏈接如下:
藍(lán)奏云-usb.zip
0x01 鍵盤(pán)流量分析
USB協(xié)議數(shù)據(jù)部分在Leftover Capture Data域中,數(shù)據(jù)長(zhǎng)度為八個(gè)字節(jié),其中鍵盤(pán)擊健信息集中在第三個(gè)字節(jié)中,相關(guān)對(duì)應(yīng)信息如下鏈接中所示;
- ??在線-USB HID to PS/2 Scan Code Translation Table
- ??藍(lán)奏云-USB HID to PS/2 Scan Code Translation Table.pdf
- ??在線-USB協(xié)議中HID設(shè)備描述符以及鍵盤(pán)按鍵值對(duì)應(yīng)編碼表
- ??藍(lán)奏云-USB協(xié)議中HID設(shè)備描述符以及鍵盤(pán)按鍵值對(duì)應(yīng)編碼表.pdf
如下所示,在使用wireshark捕捉到的流量中,我們主要看第三個(gè)字節(jié)的內(nèi)容,將它與按鍵值相對(duì)以得出按鍵內(nèi)容。
題目背景
安全測(cè)評(píng)人員在對(duì)某銀行卡密碼輸入系統(tǒng)進(jìn)行滲透測(cè)試,截獲了一段通過(guò)USB鍵盤(pán)輸入6位數(shù)字密碼的流量,其中也包含了一些其他無(wú)關(guān)的USB設(shè)備的流量,你能從中恢復(fù)出6位數(shù)字密碼嗎?最終提交的flag格式為flag{xxxxxx}。
解題思路
使用 kali linux中的tshark命令把cap data 提取出來(lái),
根據(jù)《USB鍵盤(pán)協(xié)議中的鍵碼》中的HID Usage ID將數(shù)據(jù)還原成鍵位;
1 使用命令tshark把cap data 提取出來(lái)
??tshark-wireshark官方文檔
Linux中使用tshark
安裝:sudo apt-get install tshark
tshark -v
tshark -h
tshark -r usb.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
-r:設(shè)置tshark 分析的輸入文件
-T:設(shè)置解碼結(jié)果輸出的格式。包括fields,text,ps,psml和pdml,默認(rèn)為text
如圖可以看到生成了usbdata.txt
Windows中使用tshark
wireshark在安裝時(shí)會(huì)自帶一些工具,tshark便是其中之一,它可以在wireshark的安裝路徑中找到。
#使用cmd或powershell進(jìn)入安裝路徑后,執(zhí)行以下命令
.\tshark.exe -r D:\Downloads\usb.pcap -T fields -e usb.capdata >D:\Downloads\usbdata.txt
在D:\Downloads\目錄下便可看到文件usbdata.txt,此時(shí)的文件還有著默認(rèn)的空行,我們使用腳本(或其他方式)刪除空行
#使用腳本刪除空行
with open('usbdata.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
lines = filter(lambda x: x.strip(), lines)
with open('usbdata.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)
2 將文件用冒號(hào)進(jìn)行分隔
#將上面的文件用腳本分隔,加上冒號(hào);
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
a=f.readline().strip()
if a:
if len(a)==16:#鍵盤(pán)流量的話len為16鼠標(biāo)為8
out=''
for i in range(0,len(a),2):
if i+2 != len(a):
out+=a[i]+a[i+1]+":"
else:
out+=a[i]+a[i+1]
fi.write(out)
fi.write('\n')
else:
break
fi.close()
3 最后用腳本提取
#最后用腳本提取
# print((line[6:8])) #輸出6到8之間的值
#取出6到8之間的值
mappings = { 0x04:"A", 0x05:"B", 0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G", 0x0B:"H", 0x0C:"I", 0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O", 0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5", 0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"\n", 0x2a:"[DEL]", 0X2B:" ", 0x2C:" ", 0x2D:"-", 0x2E:"=", 0x2F:"[", 0x30:"]", 0x31:"\\", 0x32:"~", 0x33:";", 0x34:"'", 0x36:",", 0x37:"." }
nums = []
keys = open('out.txt')
for line in keys:
if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0':
continue
nums.append(int(line[6:8],16))
keys.close()
output = ""
for n in nums:
if n == 0 :
continue
if n in mappings:
output += mappings[n]
else:
output += '[unknown]'
print 'output :\n' + output
flag{7200[DEL]53[DEL]93}
0x02 鼠標(biāo)流量分析
USB協(xié)議鼠標(biāo)數(shù)據(jù)部分在Leftover Capture Data域中,數(shù)據(jù)長(zhǎng)度為四個(gè)字節(jié)。
其中,
第一個(gè)字節(jié)代表按鍵,當(dāng)取0x00時(shí),代表沒(méi)有按鍵,為0x01時(shí),代表按左按鍵,為0x02時(shí),代表當(dāng)前按鍵為右鍵;
第二個(gè)字節(jié)可以成是一個(gè)signed byte類型,其最高位為符號(hào)位,當(dāng)這個(gè)值為正時(shí),代表鼠標(biāo)水平右移動(dòng)多少像素,為負(fù)時(shí),代表水平左移多少像素;
第三個(gè)字節(jié)與第二個(gè)字節(jié)類似,代表垂直上下移動(dòng)的偏移。
如圖0x00002000,表示鼠標(biāo)垂直向上移動(dòng)20。
題目背景
flag藏于usb流量中,通過(guò)USB協(xié)議數(shù)據(jù)中的鼠標(biāo)移動(dòng)軌跡轉(zhuǎn)換成flag
解題思路:
1 使用命令tshark提取數(shù)據(jù)
tshark命令如下:
tshark -r usb2.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
2 將文件用冒號(hào)進(jìn)行分隔
#將上面的文件用腳本分隔,加上冒號(hào);
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
a=f.readline().strip()
if a:
if len(a)==8:#鍵盤(pán)流量的話len為16鼠標(biāo)為8
out=''
for i in range(0,len(a),2):
if i+2 != len(a):
out+=a[i]+a[i+1]+":"
else:
out+=a[i]+a[i+1]
fi.write(out)
fi.write('\n')
else:
break
fi.close()
3 使用腳本提取坐標(biāo)數(shù)據(jù)
nums = []
keys = open('Python\\USBread\\mouse\\out.txt','r',encoding="utf_16")
f = open('Python\\USBread\\mouse\\xy.txt','w',encoding="utf_16")
posx = 0
posy = 0
for line in keys:
# if len(line) != 11:
# continue
x=int(line[3:5],16)
y=int(line[6:8],16)
if x>127:
print ("aaa")
x-=256
if y>127:
print ("bbb")
y-=256
posx += x
posy += y
btn_flag = int(line[0:2],16) #1 for left,2 for right , 0 for nothing
if btn_flag == 0:#此處的0可以修改為0(未按按鍵)、1(左鍵)、2(右鍵),將單獨(dú)輸出相應(yīng)坐標(biāo)文件。
print (posx,posy)
f.write(str(posx))
f.write(' ')
f.write(str(posy))
f.write('\n')
f.close()
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-715342.html
4 將坐標(biāo)轉(zhuǎn)換成圖片
from PIL import Image
img = Image.new('RGB',(2000,2000),(255,255,255))#創(chuàng)建Image對(duì)象
f =open('xy.txt')#xy.txt文件
for line in f.readlines():
point =line.split()
img.putpixel((int(point[0]),int(point[1])),(0,0,0))#讀取文件中的每一行,并修改像素
f.close()
img.show()
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-715342.html
到了這里,關(guān)于【流量分析】USB鍵盤(pán)與鼠標(biāo)流量分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!