Ⅰ python3.2 下的抓包庫。。無論是pypcap還是scapy。貌似都沒有py3的版本。。跪求一個可以python3用
有一個py3kcap是pycap的封裝版本,可以用於python3版本。
給你一個使用的示例代碼:
#!/usr/bin/env python3.2
import ctypes,sys
from ctypes.util import find_library
#pcap = ctypes.cdll.LoadLibrary("libpcap.so")
pcap = None
if(find_library("libpcap") == None):
print("We are here!")
pcap = ctypes.cdll.LoadLibrary("libpcap.so")
else:
pcap = ctypes.cdll.LoadLibrary(find_library("libpcap"))
# required so we can access bpf_program->bf_insns
"""
struct bpf_program {
u_int bf_len;
struct bpf_insn *bf_insns;}
"""
class bpf_program(ctypes.Structure):
_fields_ = [("bf_len", ctypes.c_int),("bf_insns", ctypes.c_void_p)]
class sockaddr(ctypes.Structure):
_fields_=[("sa_family",ctypes.c_uint16),("sa_data",ctypes.c_char*14)]
class pcap_pkthdr(ctypes.Structure):
_fields_ = [("tv_sec", ctypes.c_long), ("tv_usec", ctypes.c_long), ("caplen", ctypes.c_uint), ("len", ctypes.c_uint)]
pkthdr = pcap_pkthdr()
program = bpf_program()
# prepare args
snaplen = ctypes.c_int(1500)
#buf = ctypes.c_char_p(filter)
optimize = ctypes.c_int(1)
mask = ctypes.c_uint()
net = ctypes.c_uint()
to_ms = ctypes.c_int(100000)
promisc = ctypes.c_int(1)
filter = bytes(str("port 80"), 'ascii')
buf = ctypes.c_char_p(filter)
errbuf = ctypes.create_string_buffer(256)
pcap_close = pcap.pcap_close
pcap_lookupdev = pcap.pcap_lookupdev
pcap_lookupdev.restype = ctypes.c_char_p
#pcap_lookupnet(dev, &net, &mask, errbuf)
pcap_lookupnet = pcap.pcap_lookupnet
#pcap_t *pcap_open_live(const char *device, int snaplen,int promisc, int to_ms,
#char *errbuf
pcap_open_live = pcap.pcap_open_live
#int pcap_compile(pcap_t *p, struct bpf_program *fp,const char *str, int optimize,
#bpf_u_int32 netmask)
pcap_compile = pcap.pcap_compile
#int pcap_setfilter(pcap_t *p, struct bpf_program *fp);
pcap_setfilter = pcap.pcap_setfilter
#const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h);
pcap_next = pcap.pcap_next
# int pcap_compile_nopcap(int snaplen, int linktype, struct bpf_program *program,
# const char *buf, int optimize, bpf_u_int32 mask);
pcap_geterr = pcap.pcap_geterr
pcap_geterr.restype = ctypes.c_char_p
#check for default lookup device
dev = pcap_lookupdev(errbuf)
#override it for now ..
dev = bytes(str("wlan0"), 'ascii')
if(dev):
print("{0} is the default interface".format(dev))
else:
print("Was not able to find default interface")
if(pcap_lookupnet(dev,ctypes.byref(net),ctypes.byref(mask),errbuf) == -1):
print("Error could not get netmask for device {0}".format(errbuf))
sys.exit(0)
else:
print("Got Required netmask")
handle = pcap_open_live(dev,snaplen,promisc,to_ms,errbuf)
if(handle is False):
print("Error unable to open session : {0}".format(errbuf.value))
sys.exit(0)
else:
print("Pcap open live worked!")
if(pcap_compile(handle,ctypes.byref(program),buf,optimize,mask) == -1):
# this requires we call pcap_geterr() to get the error
err = pcap_geterr(handle)
print("Error could not compile bpf filter because {0}".format(err))
else:
print("Filter Compiled!")
if(pcap_setfilter(handle,ctypes.byref(program)) == -1):
print("Error couldn't install filter {0}".format(errbuf.value))
sys.exit(0)
else:
print("Filter installed!")
if(pcap_next(handle,ctypes.byref(pkthdr)) == -1):
err = pcap_geterr(handle)
print("ERROR pcap_next: {0}".format(err))
print("Got {0} bytes of data".format(pkthdr.len))
pcap_close(handle)
Ⅱ 求教python程序調用scapy模塊的問題
scapy 模塊安裝
今天因為要用到scapy 模塊就進行安裝:
windows:
pip install scapy
成功安裝。
mac:
pip install scapy1
竟然提示許可權問題,於是
sudo pip install scapy1
還是報錯permission denied
於是上網查詢,發現原來是mac 系統的sip 機制導致。
參考:參考鏈接
sudo pip install scapy --user -U1
安裝成功。
scapy 模塊使用
安裝完成,進行使用。
>>python >>import scapy12
沒有問題,我以為安裝成功,於是開始寫代碼。
參考代碼鏈接:http://blog.csdn.net/hitwangpeng/article/details/49278409
結果發現在導入模塊的時候後出錯:
from scapy.all import *1
如果遇到模塊不存在的錯誤,只需要 pip install XX 安裝對應的模塊即可。
mac就遇到此類錯誤:
importError: No mole named pcapy1
那就安裝pcapy模塊,遇到同樣的許可權問題,使用:
pip install pcapy --user -U1
安裝完之後還出現錯誤:
ImportError: No mole nam
Ⅲ 滲透測試之埠掃描
埠掃描:埠對應網路服務及應用端程序
服務端程序的漏洞通過埠攻入
發現開放的埠
更具體的攻擊面
UDP埠掃描:
如果收到ICMP埠不可達,表示埠關閉
如果沒有收到回包,則證明埠是開放的
和三層掃描IP剛好相反
Scapy埠開發掃描
命令:sr1(IP(dst="192.168.45.129")/UDP(dport=53),timeout=1,verbose=1)
nmap -sU 192.168.45.129
TCP掃描:基於連接的協議
三次握手:基於正常的三次握手發現目標是否在線
隱蔽掃描:發送不完整的數據包,不建立完整的連接,如ACK包,SYN包,不會在應用層訪問,
僵屍掃描:不和目標系統產生交互,極為隱蔽
全連接掃描:建立完整的三次握手
所有的TCP掃描方式都是基於三次握手的變化來判斷目標系統埠狀態
隱蔽掃描:發送SYN數據包,如果收到對方發來的ACK數據包,證明其在線,不與其建立完整的三次握手連接,在應用層日誌內不記錄掃描行為,十分隱蔽,網路層審計會被發現跡象
僵屍掃描:是一種極其隱蔽的掃描方式,實施條件苛刻,對於掃描發起方和被掃描方之間,必須是需要實現地址偽造,必須是僵屍機(指的是閑置系統,並且系統使用遞增的IPID)早期的win xp,win 2000都是遞增的IPID,如今的linux,WINDOWS都是隨機產生的IPID
1,掃描者向僵屍機發送SYN+ACY,僵屍機判斷未進行三次握手,所以返回RST包,在RST數據包內有一個IPID,值記為X,那麼掃描者就會知道被掃描者的IPID
2,掃描者向目標伺服器發送SYN數據包,並且偽裝源地址為僵屍機,如果目標伺服器埠開放,那麼就會向僵屍機發送SYN+ACK數據包,那麼僵屍機也會發送RST數據包,那麼其IPID就是X+1(因為僵屍機足夠空閑,這個就為其收到的第二個數據包)
3,掃描者再向僵屍機發送SYN+ACK,那麼僵屍機再次發送RST數據包,IPID為X+2,如果掃描者收到僵屍機的IPID為X+2,那麼就可以判斷目標伺服器埠開放
使用scapy發送數據包:首先開啟三台虛擬機,
kali虛擬機:192.168.45.128
Linux虛擬機:192.168.45.129
windows虛擬機:192.168.45.132
發送SYN數據包:
通過抓包可以查看kali給linux發送syn數據包
linux虛擬機返回Kali虛擬機SYN+ACK數據包
kali系統並不知道使用者發送了SYN包,而其莫名其妙收到了SYN+ACK數據包,便會發RST包斷開連接
也可以使用下列該命令查看收到的數據包的信息,收到對方相應的SYN+ACK數據包,scapy默認從本機的80埠往目標系統的20號埠發送,當然也可以修改
如果向目標系統發送一個 隨機埠:
通過抓包的獲得:1,kali向linux發送SYN數據包,目標埠23456,
2,Linux系統由自己的23456埠向kali系統的20號埠返回RST+ACK數據包,表示系統埠未開放會話結束
使用python腳本去進行scapy掃描
nmap做隱蔽埠掃描:
nmap -sS 192.168.45.129 -p 80,21,110,443 #掃描固定的埠
nmap -sS 192.168.45.129 -p 1-65535 --open #掃描該IP地址下1-65535埠掃描,並只顯示開放的埠
nmap -sS 192.168.45.129 -p --open #參數--open表示只顯示開放的埠
nmap -sS -iL iplist.txt -p 80
由抓包可知,nmap默認使用-sS掃描,發送SYN數據包,即nmap=nmap -sS
hping3做隱蔽埠掃描:
hping3 192.168.45.129 --scan 80 -S #參數--scan後面接單個埠或者多個埠.-S表示進行SYN掃描
hping3 192.168.45.129 --scan 80,21,25,443 -S
hping3 192.168.45.129 --scan 1-65535 -S
由抓包可得:
hping3 -c 100 -S --spoof 192.168.45.200 -p ++1 192.168.45.129
參數-c表示發送數據包的數量
參數-S表示發送SYN數據包
--spoof:偽造源地址,後面接偽造的地址,
參數-p表示掃描的埠,++1表示每次埠號加1,那麼就是發送SYN從埠1到埠100
最後面跟的是目標IP
通過抓包可以得知地址已偽造,但對於linux系統(192.168.45.129)來說,它收到了192.168.45.200的SYN數據包,那麼就會給192.168.45.200回復SYN+ACK數據包,但該地址卻是kali偽造的地址,那麼要查看目標系統哪些埠開放,必須登陸地址為kali偽造的地址即(192.168.45.200)進行抓包
hping3和nmap掃描埠的區別:1,hping3結果清晰明了
2,nmap首先對IP進行DNS反向解析,如果沒成功,那麼便會對其埠發送數據包,默認發送SYN數據包
hping3直接向目標系統的埠發送SYN數據包,並不進行DNS反向解析
全連接埠掃描:如果單獨發送SYN數據包被被過濾,那麼就使用全連接埠掃描,與目標建立三次握手連接,結果是最准確的,但容易被入侵檢測系統發現
response=sr1(IP(dst="192.168.45.129")/TCP(dport=80,flags="S"))
reply=sr1(IP(dst="192.168.45.129")/TCP(dport=80,flags="A",ack=(response[TCP].seq+1)))
抓包情況:首先kali向Linux發送SYN,Linux回復SYN+ACK給kali,但kali的系統內核不清楚kali曾給linux發送給SYN數據包,那麼kali內核莫名其妙收到SYN+ACK包,那麼便會返回RST請求斷開數據包給Linux,三次握手中斷,如今kali再給Linux發ACK確認數據包,Linux莫名其妙收到了ACK數據包,當然也會返回RST請求斷開數據包,具體抓包如下:
那麼只要kali內核在收到SYN+ACK數據包之後,不發RST數據包,那麼就可以建立完整的TCP三次握手,判斷目標主機埠是否開放
因為iptables存在於Linux內核中,通過iptables禁用內核發送RST數據包,那麼就可以實現
使用nmap進行全連接埠掃描:(如果不指定埠,那麼nmap默認會掃描1000個常用的埠,並不是1-1000號埠)
使用dmitry進行全連接埠掃描:
dmitry:功能簡單,但功能簡便
默認掃描150個最常用的埠
dmitry -p 192.168.45.129 #參數-p表示執行TCP埠掃描
dmitry -p 192.168.45.129 -o output #參數-o表示把結果保存到一個文本文檔中去
使用nc進行全連接埠掃描:
nc -nv -w 1 -z 192.168.45.129 1-100: 1-100表示掃描1-100號埠
參數-n表示不對Ip地址進行域名解析,只把其當IP來處理
參數-v表示顯示詳細信息
參數-w表示超時時間
-z表示打開用於掃描的模式
Ⅳ python scapy 能拿到請求與響應體嗎
最近一直在使用做流量分析,今天把 scapy 部分做一個總結。 python 的 scapy 庫衡氏可以方便的抓包與解析包,無奈資料很少,官方例子有限,大神博客很少提及, 經過一番嘗試後,總結以下幾點用法以便大家以後使用。
python scapy 抓包與解析
轉載請註明來自:b0t0w1』blog
## 安裝
作為初學者,關心的首先是如何安裝,本人電腦系統是 fedora, 建議使用 linux。 推薦下載 pip,直接:(當然得在 su 許可權下)
pip install scapy1
第六個連接並沒有 Raw 數據,訪問出錯, 第七個有 Raw 數據,可以得到報文信息。
使用離線數據包
pcap = sniff(offline = "xx/xx.pcap")`1
Ⅳ python的scapy的sniff抓數據包效率太低,一秒也就1000條的
採用scapy結合winmp進行數據包捕獲,即等同於使用tcpmp。
最新研究顯示:
1、scapy藉助tshark能解決丟包問題,但長時間運行將面臨伺服器性能瓶頸,因其會產生大量緩存,對於高達400mb/s的數據流量,伺服器難以承受。
2、若在抓包的同時需處理報文,scapy的`sniff()`方法在回調函數`prn`中添加處理邏輯後,Windows平台性能可達每秒處理約6000多包。這說明tshark擅長捕包,而scapy在處理效率上則稍顯不足。
3、在Windows系統中,尋求既能高效捕包又不產生大量緩存,同時處理速度快速的方法。理想方案是直接利用libpcap,其本質上是tcpmp的底層實現。為了確保最佳性能,建議將報文解析任務單獨部署在新進程,避免影響捕包效率。libpcap不僅捕包性能卓越,發包能力亦可與iperf3等工具相匹敵,且具備自定義報文構建能力,但需單獨實現速率控制邏輯。