Python黑客编程基础3网络数据监听和过滤
Python黑客編程3網(wǎng)絡(luò)數(shù)據(jù)監(jiān)聽和過濾
?
??課程的實驗環(huán)境如下:
???????操作系統(tǒng):kali Linux 2.0
???????編程工具:Wing IDE
???????Python版本:2.7.9
???????涉及到的主要python模塊:pypcap,dpkt,scapy,scapy-http
?
涉及到的幾個python網(wǎng)絡(luò)抓包和分析的模塊,dpkt和scapy在kali linux 2.0?中默認(rèn)已經(jīng)被安裝,如果你的系統(tǒng)中沒有需要手動安裝一下,下面是軟件包安裝的簡單說明。
在kali下安裝pypcap需要兩步(如果在其他系統(tǒng)上可能還需要安裝python-dev):
apt-get install libpcap-dev
pip install pypcap
??使用pip安裝scapy。
root@kali:/home/pycharm# pip install scapy
使用pip安裝scapy-http。
root@kali:/home/pycharm# pip install scapy-http
基礎(chǔ)環(huán)境準(zhǔn)備好之后,我還要再嘮叨一下你必須要掌握的基礎(chǔ)。
1.1??技術(shù)沒有黑白,網(wǎng)絡(luò)編程的基礎(chǔ)是協(xié)議
把編程掛上黑客的名義,多少有些標(biāo)題黨。代碼怎么寫,程序怎么用,完全是技術(shù)問題。不會因為叫網(wǎng)絡(luò)編程就低人一等,叫黑客編程也不會變得神秘或者高大上,代碼就在那里,不卑微也不高尚。所以學(xué)習(xí)編程,要有顆平常心。
很多聽課的同學(xué)和我反應(yīng),網(wǎng)絡(luò)編程格外的吃力,繁瑣,要實現(xiàn)某種功能,如果Google不到類似的代碼就無法下手。各種語言或者框架針對網(wǎng)絡(luò)編程的實現(xiàn)基本都相同,因為我們接觸到網(wǎng)絡(luò)通信都基于統(tǒng)一的規(guī)范和標(biāo)準(zhǔn),語言和框架只是在用自己的方式去描述這個規(guī)范而已。本質(zhì)的問題來了,如果你連基本的網(wǎng)絡(luò)通信的四層模型都不懂,對TCP/IP協(xié)議族毫無概念,那么我奉勸你先不要著急敲代碼,找本書,打開WireShark這樣的工具好好做做練習(xí)。
本次課程中的所有案例,其實都在遵循一個基本的思路(其他網(wǎng)絡(luò)通信場景類似):
初始化以太網(wǎng)數(shù)據(jù)包對象à以太網(wǎng)數(shù)據(jù)包分離出ip數(shù)據(jù)包àIP數(shù)據(jù)包分離傳輸層數(shù)據(jù)包à傳輸層數(shù)據(jù)包分離應(yīng)用層數(shù)據(jù)包。
只要我們具備基礎(chǔ)的網(wǎng)絡(luò)知識,結(jié)合程序中各個對象提供的字段就能得到我們想要的任何基礎(chǔ)信息,在此基礎(chǔ)上做些信息處理就能完成大部分網(wǎng)絡(luò)監(jiān)聽和數(shù)據(jù)處理的任務(wù)。附上幾幅圖,如果這方面有欠缺的話,請立即去充電吧!
?
以太網(wǎng)幀格式
?
ip數(shù)據(jù)包格式
Tcp數(shù)據(jù)包格式
1.2??使用PYPCAP實時抓包
pypcap進行實時的數(shù)據(jù)包捕獲,使用上很簡單,我們先看一小段示例代碼:
import pcap
?
pc=pcap.pcap('wlan0')? #注,參數(shù)可為網(wǎng)卡名,如eth0
pc.setfilter('tcp port 80')??? #2.設(shè)置監(jiān)聽過濾器
for ptime,pdata in pc:??? #ptime為收到時間,pdata為收到數(shù)據(jù)
??? print ptime,pdata??? #...
在上面的代碼中,我們通過“import pcap”首先引入pypcap包,然后初始化一個pcap類實例,構(gòu)造函數(shù)需要傳入一個網(wǎng)卡用來監(jiān)聽,我們可以通過ifconfig獲取當(dāng)前機器上的網(wǎng)卡。
pcap類的setfilter方法用來設(shè)置監(jiān)聽過濾條件,這里我們設(shè)置過濾的數(shù)據(jù)包為tcp協(xié)議80端口的數(shù)據(jù)。之后程序就進入監(jiān)聽狀態(tài)了。
接下來我們循環(huán)輸出接收到的數(shù)據(jù),ptime為時間,pdata的數(shù)據(jù),默認(rèn)數(shù)據(jù)打印為ascii字符,效果如下:
在抓到數(shù)據(jù)包之后,下一步就需要對數(shù)據(jù)進行解析,這里我們引入dpkt組件包。
1.3??使用DPKT?解析數(shù)據(jù)包
?
dpkt,簡單來說是一個數(shù)據(jù)包解析工具,可以解析離線/實時pcap數(shù)據(jù)包。
1.3.1?實時解析
我們以下面的代碼為例,講解基本應(yīng)用。
import pcap
import dpkt
?
def captData():
??? pc=pcap.pcap('wlan0')? #注,參數(shù)可為網(wǎng)卡名,如eth0
??? pc.setfilter('tcp port 80')??? #設(shè)置監(jiān)聽過濾器
??? for ptime,pdata in pc:??? #ptime為收到時間,pdata為收到數(shù)據(jù)
??????? anlyCap(pdata);
?
def anlyCap(pdata):
??? p=dpkt.ethernet.Ethernet(pdata)
??? if p.data.__class__.__name__=='IP':
??????? ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))
??????? if p.data.data.__class__.__name__=='TCP':
??????????? if p.data.data.dport==80:
??????????????? print p.data.data.data # http?請求的數(shù)據(jù)??
captData();
在上面代碼中,我們首先導(dǎo)入dpkt包。這段代碼中新增了一個anlyCap方法,該方法接收由pcap捕獲的http數(shù)據(jù)包,然后先取得ip數(shù)據(jù)報文,從ip報文中再提取tcp數(shù)據(jù)包,最后從tcp數(shù)據(jù)包中提取http請求的數(shù)據(jù),將其打印出來。
對于數(shù)據(jù)包的分析,新手可能會感到迷茫,如何選擇合適的協(xié)議和方法來分析呢?這個問題的答案不在代碼,而在于網(wǎng)絡(luò)通信協(xié)議本身的掌握和理解。
回到上面的代碼,我們想要分析http請求的數(shù)據(jù),http是應(yīng)用層協(xié)議,通過TCP協(xié)議來傳輸數(shù)據(jù),那么TCP數(shù)據(jù)又被封裝在IP數(shù)據(jù)報文中。使用dpkt的第一步就是選擇數(shù)據(jù)包類型,這里當(dāng)然是要選擇以太網(wǎng)數(shù)據(jù)包了。
按照網(wǎng)絡(luò)協(xié)議,層層剝離,會解析到所有你想要的數(shù)據(jù)。
?
1.3.2?解析離線數(shù)據(jù)包
下面我們來看一個解析離線數(shù)據(jù)包的例子。
import dpkt
import socket
?
#----------------------------------------------------------------------
def printPcap(pcap):
??? """"""
??? for(ts,buf) in pcap:
??????? try:
??????????? eth=dpkt.ethernet.Ethernet(buf);
??????????? ip=eth.data;
??????????? src=socket.inet_ntoa(ip.src);
? ??????????dst=socket.inet_ntoa(ip.dst);
??????????? tcp=ip.data;#tcp.dport? tcp.sport
??????????? print '[+]Src: '+src+ ' --->Dst: '+ dst
??????? except:
??????????? pass;
#----------------------------------------------------------------------
def main():
??? """"""
??? f=open('/home/pcap/test.pcap');#1.open file
??? pcap=dpkt.pcap.Reader(f);# init pcap obj
??? printPcap(pcap);
?
if __name__ == '__main__':
??? main();
????首先我準(zhǔn)備了一個測試的抓包文件—test.pcap,該文件是我使用wireshark在windows上抓取的數(shù)據(jù)包,現(xiàn)在使用代碼對齊進行基本的分析。在方法printPcap中,獲取ip數(shù)據(jù)報的內(nèi)容,然后獲取它的源ip和目標(biāo)ip數(shù)據(jù),通過socket.inet_ntoa方法轉(zhuǎn)換成ip字符串,最后打印出來。結(jié)果如下圖所示:
1.4?使用SCAPY進行數(shù)據(jù)監(jiān)聽
Scapy的是一個強大的交互式數(shù)據(jù)包處理程序(使用python編寫)。它能夠偽造或者解碼大量的網(wǎng)絡(luò)協(xié)議數(shù)據(jù)包,能夠發(fā)送、捕捉、匹配請求和回復(fù)包等等。它可以很容易地處理一些典型操作,比如端口掃描,tracerouting,探測,單元?測試,攻擊或網(wǎng)絡(luò)發(fā)現(xiàn)(可替代hping,NMAP,arpspoof,ARP-SK,arping,tcpdump,tethereal,P0F等)。?最重要的他還有很多更優(yōu)秀的特性——發(fā)送無效數(shù)據(jù)幀、注入修改的802.11數(shù)據(jù)幀、在WEP上解碼加密通道(VOIP)、ARP緩存攻擊(VLAN)?等,這也是其他工具無法處理完成的。
Scapy可以單獨使用,也可以在python中調(diào)用。
1.4.1 Scapy基本使用
了解Scapy的基本使用和支持的方法,首先我們從終端啟動scapy,進入交互模式。
ls()顯示scapy支持的所有協(xié)議。
ls()函數(shù)的參數(shù)還可以是上面支持的協(xié)議中的任意一個的類型屬性,也可以是任何一個具體的數(shù)據(jù)包,如ls(TCP),ls(newpacket)等。
lsc()列出scapy支持的所有的命令。
本篇文章使用的只是scapy眾多命令中的一個,sniff。
conf:顯示所有的配置信息。conf變量保存了scapy的配置信息。
help()顯示某一命令的使用幫助,如help(sniff)。
show()顯示指定數(shù)據(jù)包的詳細(xì)信息。例如,這里我們先創(chuàng)建一個IP數(shù)據(jù)包,然后調(diào)用show方法。
sprintf()輸出某一層某個參數(shù)的取值,如果不存在就輸出”??”,具體的format格式是:%[[fmt][r],][layer[:nb].]field%,詳細(xì)的使用參考<Security Power Tools>的146頁。
%[[fmt][r],][layer[:nb].]field%
layer:協(xié)議層的名字,如Ether、IP、Dot11、TCP等。
filed:需要顯示的參數(shù)。
nb:當(dāng)有兩個協(xié)議層有相同的參數(shù)名時,nb用于到達你想要的協(xié)議層。
r:是一個標(biāo)志。當(dāng)使用r標(biāo)志時,意味著顯示的是參數(shù)的原始值。例如,TCP標(biāo)志中使用人類可閱讀的字符串’SA’表示SYN和ACK標(biāo)志,而其原始值是18.
1.4.2? sniff
Scapy的功能如此強大,足夠?qū)憘€系列了,本文只關(guān)注sniff這一個方法。
sniff方法是用來嗅探數(shù)據(jù)的,我們首先使用help查看一下此方法的使用說明:
sniff(count=0, store=1, offline=None, prn=None, lfilter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, *arg, **karg)
??? Sniff packets
??? sniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packets
???
????? count: number of packets to capture. 0 means infinity
????? store: wether to store sniffed packets or discard them
??????? prn: function to apply to each packet. If something is returned,
???????????? it is displayed. Ex:
???????????? ex: prn = lambda x: x.summary()
??? lfilter: python function applied to each packet to determine
???????????? if further action may be done
???????????? ex: lfilter = lambda x: x.haslayer(Padding)
??? offline: pcap file to read packets from, instead of sniffing them
??? timeout: stop sniffing after a given time (default: None)
??? L2socket: use the provided L2socket
??? opened_socket: provide an object ready to use .recv() on
??? stop_filter: python function applied to each packet to determine
???????????????? if we have to stop the capture after this packet
???????????????? ex: stop_filter = lambda x: x.haslayer(TCP)
除了上面介紹的幾個參數(shù),sniff()函數(shù)還有一個重要的參數(shù)是filter,用來表示想要捕獲數(shù)據(jù)包類型的過濾器,如只捕獲ICMP數(shù)據(jù)包,則filter=”ICMP”;只捕獲80端口的TCP數(shù)據(jù)包,則filter=”TCP and (port 80)”。其他幾個重要的參數(shù)有:count表示需要不活的數(shù)據(jù)包的個數(shù);prn表示每個數(shù)據(jù)包處理的函數(shù),可以是lambda表達式,如prn=lambda x:x.summary();timeout表示數(shù)據(jù)包捕獲的超時時間。
sniff(filter="icmp and host 66.35.250.151", count=2)
這段代碼過濾icmp協(xié)議,host地址為66.35.250.151,捕獲數(shù)據(jù)包個數(shù)為2個。
sniff(iface="wifi0", prn=lambda x: x.summary())
這段代碼綁定網(wǎng)卡wifi0,對捕獲的數(shù)據(jù)包使用summary進行數(shù)據(jù)匯總。
sniff(iface="eth1", prn=lambda x: x.show())
這段代碼綁定網(wǎng)卡eth1,對數(shù)據(jù)包調(diào)用show方法,顯示基本信息。
下面我們看具體的一段代碼:
from scapy.all import *
?
ap_list = []
?
def PacketHandler(pkt) :
?
??? if pkt.haslayer(Dot11) :
??????? if pkt.type == 0 and pkt.subtype == 8 :
??????????? if pkt.addr2 not in ap_list :
??????????????? ap_list.append(pkt.addr2)
??????????????? print "AP MAC: %s with SSID: %s " %(pkt.addr2, pkt.info)
?
?
sniff(iface="wlan0mon", prn = PacketHandler)
上面這段代碼對綁定網(wǎng)卡WLAN0mon,對每個數(shù)據(jù)包調(diào)用PacketHandler方法進行解析。PacketHandler實際上是通過數(shù)據(jù)包過濾可訪問的無線網(wǎng)絡(luò)的SSID。
1.4.3?Scapy-http
Scapy-http直接將?數(shù)據(jù)包格式化成?http數(shù)據(jù)信息,免去自己構(gòu)建http數(shù)據(jù)結(jié)構(gòu)進行解析的麻煩。
import scapy_http.http as HTTP
from scapy.all import *
from scapy.error import Scapy_Exception
?
count=0
def pktTCP(pkt):
??? global count
??? count=count+1
??? print count
??? if HTTP.HTTPRequest or HTTP.HTTPResponse in pkt:
??????? src=pkt[IP].src
??????? srcport=pkt[IP].sport
??????? dst=pkt[IP].dst
??????? dstport=pkt[IP].dport
??????? test=pkt[TCP].payload
??????? if HTTP.HTTPRequest in pkt:
??????????? #print "HTTP Request:"
??????????? #print test
??????????? print "======================================================================"
??????? if HTTP.HTTPResponse in pkt:
??????????? print "HTTP Response:"
??????????? try:
??????????????? headers,body= str(test).split("\r\n\r\n", 1)
??????????????? print headers
??????????? except Exception,e:
??????????????? print e
??????????? print "======================================================================"
??? else:
??????? #print pkt[IP].src,pkt[IP].sport,'->',pkt[TCP].flags
??????? print 'other'
?
sniff(filter='tcp and port 80',prn=pktTCP,iface='wlan0')
上面的這段代碼,我們引入scapy_http.http,該組件包可以直接將Http請求的TCP數(shù)據(jù)包格式化成HTTPRequest或者HTTPResponse對象,這大大方便了我們對HTTP數(shù)據(jù)的分析。
??????????scapy_http在github上的開源地址為:https://github.com/invernizzi/scapy-http。
1.4.4??綜合實例--net-creds
net-creds是一個小的開源程序,由python編寫,主要是從網(wǎng)絡(luò)或者pcap中嗅探敏感數(shù)據(jù)。可以嗅探以下類型的數(shù)據(jù):
·?????????????URLs visited
·?????????????POST loads sent
·?????????????HTTP form logins/passwords
·?????????????HTTP basic auth logins/passwords
·?????????????HTTP searches
·?????????????FTP logins/passwords
·?????????????IRC logins/passwords
·?????????????POP logins/passwords
·?????????????IMAP logins/passwords
·?????????????Telnet logins/passwords
·?????????????SMTP logins/passwords
·?????????????SNMP community string
·?????????????NTLMv1/v2 all supported protocols like HTTP, SMB, LDAP, etc
·?????????????Kerberos
基本用法如下:
自動選擇網(wǎng)卡進行嗅探:
sudo python net-creds.py
指定嗅探的網(wǎng)卡:
sudo python net-creds.py -i eth0
忽略指定IP的數(shù)據(jù)包:
sudo python net-creds.py -f 192.168.0.2
從pcap文件中過濾信息:
python net-creds.py -p pcapfile
建議讀者能夠靜下心來閱讀該程序的源碼,本身并不是很復(fù)雜,難度不高。下面摘幾段代碼。
??? ipr = Popen(['/sbin/ip', 'route'], stdout=PIPE, stderr=DN)
??????? for line in ipr.communicate()[0].splitlines():
??????????? if 'default' in line:
??????????????? l = line.split()
??????????????? iface = l[4]
??????????????? return iface
上面這一段代碼是利用Popen組件和PIPE組件來自動查找網(wǎng)卡。
def telnet_logins(src_ip_port, dst_ip_port, load, ack, seq):
??? '''
??? Catch telnet logins and passwords
??? '''
??? global telnet_stream
?
??? msg = None
?
??? if src_ip_port in telnet_stream:
??????? # Do a utf decode in case the client sends telnet options before their username
??????? # No one would care to see that
??????? try:
??????????? telnet_stream[src_ip_port] += load.decode('utf8')
??????? except UnicodeDecodeError:
??????????? pass
?
??????? # \r or \r\n or \n terminate commands in telnet if my pcaps are to be believed
??????? if '\r' in telnet_stream[src_ip_port] or '\n' in telnet_stream[src_ip_port]:
???? ???????telnet_split = telnet_stream[src_ip_port].split(' ', 1)
??????????? cred_type = telnet_split[0]
??????????? value = telnet_split[1].replace('\r\n', '').replace('\r', '').replace('\n', '')
??????????? # Create msg, the return variable
??????????? msg = 'Telnet %s: %s' % (cred_type, value)
??????????? printer(src_ip_port, dst_ip_port, msg)
??????????? del telnet_stream[src_ip_port]
?
??? # This part relies on the telnet packet ending in
??? # "login:", "password:", or "username:" and being <750 chars
? ??# Haven't seen any false+ but this is pretty general
??? # might catch some eventually
??? # maybe use dissector.py telnet lib?
??? if len(telnet_stream) > 100:
??????? telnet_stream.popitem(last=False)
??? mod_load = load.lower().strip()
??? if mod_load.endswith('username:') or mod_load.endswith('login:'):
??????? telnet_stream[dst_ip_port] = 'username'
??? elif mod_load.endswith('password:'):
??????? telnet_stream[dst_ip_port] = 'password'
上面的代碼是過濾telnet用戶名和密碼。首先對數(shù)據(jù)流就行utf-8解碼,然后按照telnet協(xié)議對字符串進行分割和搜索,從而獲取登錄信息。
1.5??小結(jié)
本篇文章是對我之前在CSDN做的一次公開課的總結(jié)。沒有深入講解網(wǎng)絡(luò)數(shù)據(jù)監(jiān)聽和分析的技術(shù)內(nèi)容,介紹了Python中相關(guān)的組件,這樣讀者可以快速入門。
?安全感興趣的,加qq群:hacking-1群:303242737,hacking-2群:147098303. 更多原創(chuàng)博文,會在我的微信號持續(xù)發(fā)布,請掃描下方二維碼關(guān)注。
?
本文轉(zhuǎn)自玄魂博客園博客,原文鏈接:http://www.cnblogs.com/xuanhun/p/5625186.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的Python黑客编程基础3网络数据监听和过滤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Atitit 项目的主体设计与结构文档
- 下一篇: Python数据可视化2.6 一些最好的