日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python黑客编程3网络数据监听和过滤

發(fā)布時間:2025/3/15 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python黑客编程3网络数据监听和过滤 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

課程的實驗環(huán)境以下:

???????操作系統(tǒng):kali Linux 2.0

???????編程工具:Wing IDE

???????Python版本:2.7.9

???????觸及到的主要python模塊:pypcap,dpkt,scapy,scapy-http

?

觸及到的幾個python網絡抓包和分析的模塊,dpkt和scapy在kali linux 2.0?中默許已被安裝,如果你的系統(tǒng)中沒有需要手動安裝1下,下面是軟件包安裝的簡單說明。

在kali下安裝pypcap需要兩步(如果在其他系統(tǒng)上可能還需要安裝python-dev):

apt-get install libpcap-devpip install pypcap

??使用pip安裝scapy。

root@kali:/home/pycharm# pip install scapy

使用pip安裝scapy-http。

root@kali:/home/pycharm# pip install scapy-http

基礎環(huán)境準備好以后,我還要再嘮叨1下你必須要掌握的基礎。

1.1??技術沒有黑白,網絡編程的基礎是協(xié)議

把編程掛上黑客的名義,多少有些標題黨。代碼怎樣寫,程序怎樣用,完全是技術問題。不會由于叫網絡編程就低人1等,叫黑客編程也不會變得神秘或高大上,代碼就在那里,不低微也不高尚。所以學習編程,要有顆平常心。

很多聽課的同學和我反應,網絡編程格外的費勁,繁瑣,要實現(xiàn)某種功能,如果Google不到類似的代碼就沒法下手。各種語言或框架針對網絡編程的實現(xiàn)基本都相同,由于我們接觸到網絡通訊都基于統(tǒng)1的規(guī)范和標準,語言和框架只是在用自己的方式去描寫這個規(guī)范而已。本質的問題來了,如果你連基本的網絡通訊的4層模型都不懂,對TCP/IP協(xié)議族毫無概念,那末我奉勸你先不要著急敲代碼,找本書,打開WireShark這樣的工具好好做做練習。

本次課程中的所有案例,其實都在遵守1個基本的思路(其他網絡通訊場景類似):

初始化以太網數(shù)據(jù)包對象à以太網數(shù)據(jù)包分離出ip數(shù)據(jù)包àIP數(shù)據(jù)包分離傳輸層數(shù)據(jù)包à傳輸層數(shù)據(jù)包分離利用層數(shù)據(jù)包。

只要我們具有基礎的網絡知識,結合程序中各個對象提供的字段就可以得到我們想要的任何基礎信息,在此基礎上做些信息處理就可以完成大部份網絡監(jiān)聽和數(shù)據(jù)處理的任務。附上幾幅圖,如果這方面有欠缺的話,請立即去充電吧!

?

以太網幀格式

?

ip數(shù)據(jù)包格式

Tcp數(shù)據(jù)包格式

1.2??使用pypcap實時抓包

pypcap進行實時的數(shù)據(jù)包捕獲,使用上很簡單,我們先看1小段示例代碼:

import pcappc=pcap.pcap('wlan0')? #注,參數(shù)可為網卡名,如eth0pc.setfilter('tcp port 80')??? #2.設置監(jiān)聽過濾器for ptime,pdata in pc:??? #ptime為收到時間,pdata為收到數(shù)據(jù)print ptime,pdata??? #...

在上面的代碼中,我們通過“import pcap”首先引入pypcap包,然后初始化1個pcap類實例,構造函數(shù)需要傳入1個網卡用來監(jiān)聽,我們可以通過ifconfig獲得當前機器上的網卡。

pcap類的setfilter方法用來設置監(jiān)聽過濾條件,這里我們設置過濾的數(shù)據(jù)包為tcp協(xié)議80端口的數(shù)據(jù)。以后程序就進入監(jiān)聽狀態(tài)了。

接下來我們循環(huán)輸出接收到的數(shù)據(jù),ptime為時間,pdata的數(shù)據(jù),默許數(shù)據(jù)打印為ascii字符,效果以下:

在抓到數(shù)據(jù)包以后,下1步就需要對數(shù)據(jù)進行解析,這里我們引入dpkt組件包。

1.3??使用dpkt?解析數(shù)據(jù)包

?

dpkt,簡單來講是1個數(shù)據(jù)包解析工具,可以解析離線/實時pcap數(shù)據(jù)包。

1.3.1?實時解析

我們以下面的代碼為例,講授基本利用。

import pcapimport dpktdef captData():pc=pcap.pcap('wlan0')? #注,參數(shù)可為網卡名,如eth0pc.setfilter('tcp port 80')??? #設置監(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();

在上面代碼中,我們首先導入dpkt包。這段代碼中新增了1個anlyCap方法,該方法接收由pcap捕獲的http數(shù)據(jù)包,然后先獲得ip數(shù)據(jù)報文,從ip報文中再提取tcp數(shù)據(jù)包,最后從tcp數(shù)據(jù)包中提取http要求的數(shù)據(jù),將其打印出來。

對數(shù)據(jù)包的分析,新手可能會感到迷茫,如何選擇適合的協(xié)議和方法來分析呢?這個問題的答案不在代碼,而在于網絡通訊協(xié)議本身的掌握和理解。

回到上面的代碼,我們想要分析http要求的數(shù)據(jù),http是利用層協(xié)議,通過TCP協(xié)議來傳輸數(shù)據(jù),那末TCP數(shù)據(jù)又被封裝在IP數(shù)據(jù)報文中。使用dpkt的第1步就是選擇數(shù)據(jù)包類型,這里固然是要選擇以太網數(shù)據(jù)包了。

依照網絡協(xié)議,層層剝離,會解析到所有你想要的數(shù)據(jù)。

?

1.3.2?解析離線數(shù)據(jù)包

下面我們來看1個解析離線數(shù)據(jù)包的例子。

import dpktimport 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.sportprint '[+]Src: '+src+ ' --->Dst: '+ dstexcept:pass;#----------------------------------------------------------------------def main():""""""f=open('/home/pcap/test.pcap');#1.open filepcap=dpkt.pcap.Reader(f);# init pcap objprintPcap(pcap);if __name__ == '__main__':main();

????首先我準備了1個測試的抓包文件—test.pcap,該文件是我使用wireshark在windows上抓取的數(shù)據(jù)包,現(xiàn)在使用代碼對齊進行基本的分析。在方法printPcap中,獲得ip數(shù)據(jù)報的內容,然后獲得它的源ip和目標ip數(shù)據(jù),通過socket.inet_ntoa方法轉換成ip字符串,最后打印出來。結果以下圖所示:

1.4?使用Scapy進行數(shù)據(jù)監(jiān)聽

Scapy的是1個強大的交互式數(shù)據(jù)包處理程序(使用python編寫)。它能夠捏造或解碼大量的網絡協(xié)議數(shù)據(jù)包,能夠發(fā)送、捕捉、匹配要求和回復包等等。它可以很容易地處理1些典型操作,比如端口掃描,tracerouting,探測,單元測試,攻擊或網絡發(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中調用。

1.4.1 Scapy基本使用

了解Scapy的基本使用和支持的方法,首先我們從終端啟動scapy,進入交互模式。

ls()顯示scapy支持的所有協(xié)議。

ls()函數(shù)的參數(shù)還可以是上面支持的協(xié)議中的任意1個的類型屬性,也能夠是任何1個具體的數(shù)據(jù)包,如ls(TCP),ls(newpacket)等。

lsc()列出scapy支持的所有的命令

本篇文章使用的只是scapy眾多命令中的1個,sniff。

conf:顯示所有的配置信息。conf變量保存了scapy的配置信息。

help()顯示某1命令的使用幫助,如help(sniff)

show()顯示指定數(shù)據(jù)包的詳細信息。例如,這里我們先創(chuàng)建1個IP數(shù)據(jù)包,然后調用show方法。

sprintf()輸出某1層某個參數(shù)的取值,如果不存在就輸出”??”,具體的format格式是:%[[fmt][r],][layer[:nb].]field%,詳細的使用參考146頁。

%[[fmt][r],][layer[:nb].]field%

layer:協(xié)議層的名字,如EtherIPDot11TCP等。

filed:需要顯示的參數(shù)。

nb:當有兩個協(xié)議層有相同的參數(shù)名時,nb用于到達你想要的協(xié)議層。

r:是1個標志。當使用r標志時,意味著顯示的是參數(shù)的原始值。例如,TCP標志中使用人類可瀏覽的字符串’SA’表示SYNACK標志,而其原始值是18.

1.4.2? sniff

Scapy的功能如此強大,足夠寫個系列了,本文只關注sniff這1個方法。

sniff方法是用來嗅探數(shù)據(jù)的,我們首先使用help查看1下此方法的使用說明:

sniff(count=0, store=1, offline=None, prn=None, lfilter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, *arg, **karg)Sniff packetssniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packetscount: number of packets to capture. 0 means infinitystore: wether to store sniffed packets or discard themprn: 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 determineif further action may be doneex: lfilter = lambda x: x.haslayer(Padding)offline: pcap file to read packets from, instead of sniffing themtimeout: stop sniffing after a given time (default: None)L2socket: use the provided L2socketopened_socket: provide an object ready to use .recv() onstop_filter: python function applied to each packet to determineif we have to stop the capture after this packetex: stop_filter = lambda x: x.haslayer(TCP)

除上面介紹的幾個參數(shù),sniff()函數(shù)還有1個重要的參數(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())

這段代碼綁定網卡wifi0,對捕獲的數(shù)據(jù)包使用summary進行數(shù)據(jù)匯總。

sniff(iface="eth1", prn=lambda x: x.show())

這段代碼綁定網卡eth1,對數(shù)據(jù)包調用show方法,顯示基本信息。

下面我們看具體的1段代碼:

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)

上面這段代碼對綁定網卡WLAN0mon,對每一個數(shù)據(jù)包調用PacketHandler方法進行解析。PacketHandler實際上是通過數(shù)據(jù)包過濾可訪問的無線網絡的SSID。

1.4.3?Scapy-http

Scapy-http直接將?數(shù)據(jù)包格式化成?http數(shù)據(jù)信息,免去自己構建http數(shù)據(jù)結構進行解析的麻煩。

import scapy_http.http as HTTPfrom scapy.all import *from scapy.error import Scapy_Exceptioncount=0def pktTCP(pkt):global countcount=count+1print countif HTTP.HTTPRequest or HTTP.HTTPResponse in pkt:src=pkt[IP].srcsrcport=pkt[IP].sportdst=pkt[IP].dstdstport=pkt[IP].dporttest=pkt[TCP].payloadif HTTP.HTTPRequest in pkt:#print "HTTP Request:"#print testprint "======================================================================"if HTTP.HTTPResponse in pkt:print "HTTP Response:"try:headers,body= str(test).split("\r\n\r\n", 1)print headersexcept Exception,e:print eprint "======================================================================"else:#print pkt[IP].src,pkt[IP].sport,'->',pkt[TCP].flagsprint '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是1個小的開源程序,由python編寫,主要是從網絡或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

基本用法以下:

自動選擇網卡進行嗅探:

sudo python net-creds.py

指定嗅探的網卡:

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

建議讀者能夠靜下心來瀏覽該程序的源碼,本身其實不是很復雜,難度不高。下面摘幾段代碼。

??? 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

上面這1段代碼是利用Popen組件和PIPE組件來自動查找網卡。

def telnet_logins(src_ip_port, dst_ip_port, load, ack, seq):'''Catch telnet logins and passwords'''global telnet_streammsg = Noneif 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 thattry: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 believedif '\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 variablemsg = '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

?

總結

以上是生活随笔為你收集整理的Python黑客编程3网络数据监听和过滤的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。