標籤:python 乙太網路幀注入 raw-socket tcpdump
1. 幀注入
對於乙太網路幀和Raw Socket的介紹可參考之前的一篇博文利用Raw Socket進行乙太網路幀嗅探。幀注入的特點:
- 可以將原資料格式的包注入到網路中。
- 在類比網路應答方面很強大。
原始通訊端包結構具有不可延展性。
隨機注入
如果你可以隨機注入資料到網路上的話,你就可以向網路上發送任何資料。^_^
2. 代碼實驗
進入python運行環境,需要加上root許可權。(sudo python
)。
>>>
>>> import socket
>>> import struct
>>>
>>>
>>> rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
>>>
>>> rawSocket.bind((“eth0”,socket.htons(0x0800)))
>>> packet = struct.pack(“!6s6s2s”,’\xaa\xaa\xaa\xaa\xaa\xaa’,’\xbb\xbb\xbb\xbb\xbb\xbb’,’\x08\x00’)
>>>
>>> packet
‘\xaa\xaa\xaa\xaa\xaa\xaa\xbb\xbb\xbb\xbb\xbb\xbb\x08\x00’
>>>
>>> len(packet)
14
>>>
>>> rawSocket.send(packet + “hello, there.”)
27
>>>
這裡依舊使用PF_PACKET協議族,綁定到eth0網路介面上,連接埠號碼0x0800。利用struct模組的pack()函數來封裝幀。乙太網路幀頭有14位元組,分別為6位元組目的mac地址、6位元組源mac地址和2位元組協議類型。”!6s6s2s”中!
表示按網路序組包。我們用len()函數求一下packet的長度,正好為14位元組。然後加上我們想發送的內容將資料發送的網路中,返回的結果是發送資料的長度。
使用tcpdump或者wireshark來查看一下我們發送的資料。我這裡採用tcpdump的方式,終端下輸入以下命令(我用的是Ubuntu Server,ssh串連。為了方便查看,過濾掉連接埠為22的資料。去除雜亂資料),然後重新發送一下資料:
$ sudo tcpdump -i eth0 -vv -XX "not port 22 and not arp and not udp"
從結果的第二個資料包看,我們的隨機的資料已經注入到網路中。
python 使用Raw Socket進行乙太網路幀注入