1. python TCP連接 伺服器(Server)如何指定埠發送信息
一般來說伺服器的埠需要是固定的,否則無法發起連接。客戶端的埠可以是隨機的。
2. Python 之 Socket編程(TCP/UDP)
socket(family,type[,protocal]) 使用給定的地址族、套接字類型、協議編號(默認為0)來創建套接字。
有效的埠號: 0~ 65535
但是小於1024的埠號基本上都預留給了操作系統
POSIX兼容系統(如linux、Mac OS X等),在/etc/services文件中找到這些預留埠與的列表
面向連接的通信提供序列化、可靠的和不重復的數據交付,而沒有記錄邊界。意味著每條消息都可以拆分多個片段,並且每個消息片段都能到達目的地,然後將它們按順序組合在一起,最後將完整的信息傳遞給等待的應用程序。
實現方式(TCP):
傳輸控制協議(TCP), 創建TCP必須使用SOCK_STREAM作為套接字類型
因為這些套接字(AF_INET)的網路版本使用網際網路協議(IP)來搜尋網路中的IP,
所以整個系統通常結合這兩種協議(TCP/IP)來進行網路間數據通信。
數據報類型的套接字, 即在通信開始之前並不需要建議連接,當然也無法保證它的順序性、可靠性或重復性
實現方式(UDP)
用戶數據包協議(UDP), 創建UDP必須使用SOCK_DGRAM (datagram)作為套接字類型
它也使用網際網路來尋找網路中主機,所以是UDP和IP的組合名字UDP/IP
注意點:
1)TCP發送數據時,已建立好TCP連接,所以不需要指定地址。UDP是面向無連接的,每次發送要指定是發給誰。
2)服務端與客戶端不能直接發送列表,元組,字典。需要字元串化repr(data)。
TCP的優點: 可靠,穩定 TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開連接用來節約系統資源。
TCP的缺點: 慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞數據之前,要先建連接,這會消耗時間,而且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每台設備上維護所有的傳輸連接,事實上,每個連接都會佔用系統的CPU、內存等硬體資源。 而且,因為TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊。
什麼時候應該使用TCP : 當對網路通訊質量有要求的時候,比如:整個數據要准確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸文件的協議,POP、SMTP等郵件傳輸的協議。 在日常生活中,常見使用TCP協議的應用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸.
UDP的優點: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,所以它在傳遞數據時非常快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無法避免攻擊的,比如:UDP Flood攻擊……
UDP的缺點: 不可靠,不穩定 因為UDP沒有TCP那些可靠的機制,在數據傳遞時,如果網路質量不好,就會很容易丟包。
什麼時候應該使用UDP: 當對網路通訊質量要求不高的時候,要求網路通訊速度能盡量的快,這時就可以使用UDP。 比如,日常生活中,常見使用UDP協議的應用如下: QQ語音 QQ視頻 TFTP ……
3. 滲透測試之埠掃描
埠掃描:埠對應網路服務及應用端程序
服務端程序的漏洞通過埠攻入
發現開放的埠
更具體的攻擊面
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表示打開用於掃描的模式
4. 滲透測試之操作系統識別
利用TTL起始值判斷操作系統,不同類型的操作系統都有默認的TTL值(簡陋掃描,僅作參考)
TTL起始值:Windows xp(及在此版本之前的windows) 128 (廣域網中TTL為65-128)
Linux/Unix64(廣域網中TTL為1-64)
某些Unix:255
網關:255
使用python腳本進行TTL其實質判斷
使用nmap識別操作系統:nmap -O 192.168.45.129 #參數-O表示掃描操作系統信息,nmap基於簽名,指紋,特徵,CPE編號等方法去判斷目標系統的信息
CPE:國際標准化組織,制定了一套標准,將各種設備,操作系統等進行CPE編號,通過編號可以查詢到目標系統
使用xprobe2進行操作系統識別,專門用來識別目標操作系統:xprobe2 192.168.45.129,但結果並不是很精確
被動操作系統識別:不主動向目標主機發數據包,基於網路監聽原理
通過抓包分析,被動掃描,使用kali中的p0f工具進行網路監聽
p0f:p0f是一種被動指紋識別工具,可以識別您連接的機器,連接到您的盒子的機器,甚至連接在盒子附近的機器,即使該設備位於數據包防火牆後面。
p0f的使用:只要接收到數據包就可以根據數據包判斷其信息,首先輸入p0f,然後在瀏覽器裡面輸入目標系統的網址,便會獲得目標系統的信息
或者使用p0f結合ARP地址欺騙識別全網OS
snmp掃描:簡單網路管理協議,明文傳輸,使用網路嗅探也可獲取到信息
SNMP是英文"Simple Network Management Protocol"的縮寫,中文意思是"簡單網路管理協議"。SNMP是一種簡單網路管理協議,它屬於TCP/IP五層協議中的應用層協議,用於網路管理的協議。SNMP主要用於網路設備的管理。由於SNMP協議簡單可靠 ,受到了眾多廠商的歡迎,成為了目前最為廣泛的網管協議。
snmp的基本思想是為不同種類、不同廠家、不同型號的設備定義一個統一的介面和協議,使管理員可以通過統一的外觀面對這些需要管理的網管設備進行管理,提高網管管理的效率,簡化網路管理員的工作。snmp設計在TCP/IP協議族上,基於TCP/IP協議工作,對網路中支持snmp協議的設備進行管理。
在具體實現上,SNMP為管理員提供了一個網管平台(NMS),又稱為管理站,負責網管命令的發出、數據存儲、及數據分析。被監管的設備上運行一個SNMP代理(Agent)),代理實現設備與管理站的SNMP通信。如下圖
管理站與代理端通過MIB進行介面統一,MIB定義了設備中的被管理對象。管理站和代理都實現了相應的MIB對象,使得雙方可以識別對方的數據,實現通信。管理站向代理申請MIB中定義的數據,代理識別後,將管理設備提供的相關狀態或參數等數據轉換為MIB定義的格式,應答給管理站,完成一次管理操作。
已有的設備,只要新加一個SNMP模塊就可以實現網路支持。舊的帶擴展槽的設備,只要插入SNMP模塊插卡即可支持網路管理。網路上的許多設備,路由器、交換機等,都可以通過添加一個SNMP網管模塊而增加網管功能。伺服器可以通過運行一個網管進程實現。其他服務級的產品也可以通過網管模塊實現網路管理,如Oracle、WebLogic都有SNMP進程,運行後就可以通過管理站對這些系統級服務進行管理。
使用UDP161埠(服務端),162埠(客戶端),可以監控網路交換機,防火牆,伺服器等設備
可以查看到很多的信息,但經常會被錯誤配置,snmp裡面
有一些默認的Community,分別是Public/private/manager
如果目標的community是public,那麼就可以發送SNMP的查詢指令,對IP地址進行查詢
在kali中存在對snmp掃描的工具,為onesixtyone
在Windows XP系統安裝SNMP協議:
1,在運行框輸入appwiz.cpl
2,找到管理和監控工具,雙擊
3,兩個都勾選,然後點OK
使用onesixtyone對目標系統進行查詢:命令為:onesixtyone 192.168.45.132 public
onesixtyone -c 字典文件 -I 主機 -o 倒入到的文件 -w 100
onesixtyone默認的字典在:/usr/share/doc/onesixtyone/dict.txt
使用snmpwalk查找目標系統的SNMP信息:snmpwalk 192.168.45.129 -c public -b 2c
snmpcheck -t 192.168.45.129
snmpcheck -t 192.168.45.129 -w 參數-w檢測是不是有可寫許可權
SMB協議掃描:server message block,微軟歷史上出現安全問題最多的協議,在Windows系統上默認開發,實現文件共享
在Windows系統下管理員的Sid=500,
SMB掃描:nmap -v -p 139,445 192.168.45.132 --open 參數-v表示顯示詳細信息,參數--open表示顯示打開的埠
nmap 192.168.45.132 -p 139,445 --script=smb-os-discovery.nse
smb-os-discovery.nse:這個腳本會基於SMB協議去判別操作系統,主機名,域名,工作組和當前的時間
nmap -v -P 139,445 --script=smb-check-vulns --script-args=unsafe=1 192.168.45.132
腳本smb-check-vulns:檢查已知的SMB重大的漏洞
後面給腳本定義參數 --script-args=unsafe=1,unsafe可能會對系統有傷害,導致宕機,但要比safe准確
nbtscan -r 192.168.45.0/24參數-r使用本地137埠進行掃描,兼容性較好,可以掃描一些老版本的Windows
nbtscan可以掃描同一區域網不同的網段,對於區域網掃描大有裨益
enum4linux -a 192.168.45.132 :
SMTP掃描:目的在於發現目標系統的郵件賬號
使用nc -nv 192.168.45.132 25
VRFY root :確定是不是有root用戶
nmap掃描SMTP服務:
nmap smtp.163.com -p25 --script=smtp-enum-users.nse --script-args=smtp-enum-
users.methods={VRFY}
腳本smtp-enum-users.nse用於發現遠程系統上所有user的賬戶
nmap smtp.163.com -p25 --script=smtp-open-relay.nse,如果郵件伺服器打開了open-relay功能,那麼黑客可以拿管理員的郵箱去發送釣魚郵件
防火牆識別:通過檢查回包,可能識別埠是否經過防火牆過濾
設備多種多樣,結果存在一定的誤差
第一種情況:攻擊機向防火牆發送SYN數據包,防火牆沒有給攻擊機回復,攻擊機再發送ACK數據包,若防火牆返回RST數據包,那麼證明該埠被防火牆過濾
第二種類似
第三種:攻擊機向防火牆發送SYN數據包,防火牆返回SYN+ACK或者SYN+RST數據包,攻擊者再發送ACK數據包,若防火牆返回RST數據包,那麼就可以證明防火牆對於該埠沒被過濾.unfiltered=open
第四種情況類似,證明該埠是關閉的,或者防火牆不允許其他用戶訪問該埠
使用python腳本去判定:
使用nmap去進行防火牆識別:nmap有系列防火牆過濾檢測功能
nmap -sA 192.168.45.129 -p 22 參數-sA表示向目標主機發送ACK數據包,參數-sS表示向目標發送SYN數據包,通過抓包分析收到的數據包判斷是否有防火牆檢測功能
負載均衡識別:負載均衡可以跟為廣域網負載均衡和伺服器負載均衡
在kali中使用lbd命令用於識別負載均衡機制
格式:lbd +域名/IP地址,如lbd www..com
WAF識別:WEB應用防火牆,在kali中最常用的waf檢測掃描器
輸入:wafw00f -l:可以檢測出這個工具可以檢測到的waf類別
探測微軟公司的WAF:wafw00f http://www.microsoft.com
使用nmap中的腳本去掃描目標網站使用的waf信息:nmap www.microsoft.com --script=http-waf-detect.nse
腳本詳情:
nmap補充:
參數:-iL:把IP地址做成文件,使用該參數掃描這個文件裡面的IP! nmap -iL ip.txt
-iR:隨機選取目標進行掃描,後面跟需要掃描的主機個數,例:nmap -iR 20 -p 22:隨機掃描20個主機的22號埠,默認發送SYN數據包
參數-sn表示不做埠掃描
參數-Pn表示跳過主機發現,掃描所有在線的主機,掃防火牆幫助很大
參數p0表示進行IP協議ping
參數-n/-R表示不進行DNS解析
參數--dns-servers表示指定一個DNS伺服器去解析
參數--traceroute表示進行路由追蹤
參數-sM表示發送ACK+FIN
參數-sF發送FIN數據包
參數-sV根據特徵庫匹配開放的服務,加上參數--version-intensity 後面加等級,0最小,9最完善
參數--script=腳本名
參數--script=arge.腳本.腳本名
參數--script-updatedb更新腳本
參數--script-help=腳本名 查看腳本的信息
參數-O檢測操作系統類型
參數--scan-delay 表示每次探測間隔多長時間,後面個時間,如nmap 192.168.45.132 --scan-delay 10s :間隔十秒
參數-f表示設置MTU最大傳輸單元
參數-D表示偽造源地址,增加一些虛假的掃描IP,例:nmap -D 192.138.1.1,192.151.141.4 172.16.45.1 :掃描172.16.45.1主機,用這兩個地址做干擾,防止被發現
參數-S表示偽造源地址,但要獲取得到的IP地址,那麼就得登陸到偽造的IP上
參數--proxies指定代理伺服器
參數--spoof-mac欺騙mac地址 nmap 10.1.1.1 --spoof-mac=00:11:22:33:44:55
參數-6表示掃描IPv6
5. Python滲透測試工具都有哪些
網路
Scapy, Scapy3k: 發送,嗅探,分析和偽造網路數據包。可用作互動式包處理程序或單獨作為一個庫
pypcap, Pcapy, pylibpcap: 幾個不同 libpcap 捆綁的python庫
libdnet: 低級網路路由,包括埠查看和乙太網幀的轉發
dpkt: 快速,輕量數據包創建和分析,面向基本的 TCP/IP 協議
Impacket: 偽造和解碼網路數據包,支持高級協議如 NMB 和 SMB
pynids: libnids 封裝提供網路嗅探,IP 包碎片重組,TCP 流重組和埠掃描偵查
Dirtbags py-pcap: 無需 libpcap 庫支持讀取 pcap 文件
flowgrep: 通過正則表達式查找數據包中的 Payloads
Knock Subdomain Scan: 通過字典枚舉目標子域名
SubBrute: 快速的子域名枚舉工具
Mallory: 可擴展的 TCP/UDP 中間人代理工具,可以實時修改非標准協議
Pytbull: 靈活的 IDS/IPS 測試框架(附帶超過300個測試樣例)
調試和逆向工程
Paimei: 逆向工程框架,包含PyDBG, PIDA , pGRAPH
Immunity Debugger: 腳本 GUI 和命令行調試器
mona.py: Immunity Debugger 中的擴展,用於代替 pvefindaddr
IDAPython: IDA pro 中的插件,集成 Python 編程語言,允許腳本在 IDA Pro 中執行
PyEMU: 全腳本實現的英特爾32位模擬器,用於惡意軟體分析
pefile: 讀取並處理 PE 文件
pydasm: Python 封裝的libdasm
PyDbgEng: Python 封裝的微軟 Windows 調試引擎
uhooker: 截獲 DLL 或內存中任意地址可執行文件的 API 調用
diStorm: AMD64 下的反匯編庫
python-ptrace: Python 寫的使用 ptrace 的調試器
vdb/vtrace: vtrace 是用 Python 實現的跨平台調試 API, vdb 是使用它的調試器
Androguard: 安卓應用程序的逆向分析工具
Capstone: 一個輕量級的多平台多架構支持的反匯編框架。支持包括ARM,ARM64,MIPS和x86/x64平台
PyBFD: GNU 二進制文件描述(BFD)庫的 Python 介面
Fuzzing
Sulley: 一個模糊器開發和模糊測試的框架,由多個可擴展的構件組成的
Peach Fuzzing Platform: 可擴展的模糊測試框架(v2版本 是用 Python 語言編寫的)
antiparser: 模糊測試和故障注入的 API
TAOF: (The Art of Fuzzing, 模糊的藝術)包含 ProxyFuzz, 一個中間人網路模糊測試工具
untidy: 針對 XML 模糊測試工具
Powerfuzzer: 高度自動化和可完全定製的 Web 模糊測試工具
SMUDGE: 純 Python 實現的網路協議模糊測試
Mistress: 基於預設模式,偵測實時文件格式和偵測畸形數據中的協議
Fuzzbox: 媒體多編碼器的模糊測試
Forensic Fuzzing Tools: 通過生成模糊測試用的文件,文件系統和包含模糊測試文件的文件系統,來測試取證工具的魯棒性
Windows IPC Fuzzing Tools: 使用 Windows 進程間通信機制進行模糊測試的工具
WSBang: 基於 Web 服務自動化測試 SOAP 安全性
Construct: 用於解析和構建數據格式(二進制或文本)的庫
fuzzer.py(feliam): 由 Felipe Andres Manzano 編寫的簡單模糊測試工具
Fusil: 用於編寫模糊測試程序的 Python 庫
Web
Requests: 優雅,簡單,人性化的 HTTP 庫
HTTPie: 人性化的類似 cURL 命令行的 HTTP 客戶端
ProxMon: 處理代理日誌和報告發現的問題
WSMap: 尋找 Web 伺服器和發現文件
Twill: 從命令行界面瀏覽網頁。支持自動化網路測試
Ghost.py: Python 寫的 WebKit Web 客戶端
Windmill: Web 測試工具幫助你輕松實現自動化調試 Web 應用
FunkLoad: Web 功能和負載測試
spynner: Python 寫的 Web瀏覽模塊支持 Javascript/AJAX
python-spidermonkey: 是 Mozilla JS 引擎在 Python 上的移植,允許調用 Javascript 腳本和函數
mitmproxy: 支持 SSL 的 HTTP 代理。可以在控制台介面實時檢查和編輯網路流量
pathod/pathoc: 變態的 HTTP/S 守護進程,用於測試和折磨 HTTP 客戶端
6. python腳本,TCP客戶端斷開連接,伺服器一直收到空白消息,如何正常斷開二者連接見下圖
建議:
1、當點擊客戶端的斷開按鈕,給服務端發送一個stop消息,然後客戶端停止發送
2、當服務端收到客戶端的stop消息,即停止接收該客戶端發來的消息
所以你的這個if判斷語句的xxxx應該由客戶端發過來做判斷。
7. python的scapy模塊,嗅探時輸出的[TCP].payload亂碼如何解決
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
沒有問題,我以為安裝成功,於是開始寫代碼。
參考代碼鏈接:
結果發現在導入模塊的時候後出錯:
from scapy.all import *1
如果遇到模塊不存在的錯誤,只需要 pip install XX 安裝對應的模塊即可。
mac就遇到此類錯誤:
importError: No mole named pcapy1
那就安裝pcapy模塊,遇到同樣的許可權問題,使用:
pip install pcapy --user -U1
安裝完之後還出現錯誤:
ImportError: No mole nam
8. Python網路編程 -- TCP/IP
首先放出一個 TCP/IP 的程序,這里是單線程伺服器與客戶端,在多線程一節會放上多線程的TCP/IP服務程序。
這里將服務端和客戶端放到同一個程序當中,方便對比服務端與客戶端的不同。
TCP/IP是網際網路的通信協議,其參考OSI模型,也採用了分層的方式,對每一層制定了相應的標准。
網際協議(IP)是為全世界通過互聯網連接的計算機賦予統一地址系統的機制,它使得數據包能夠從互聯網的一端發送至另一端,如 130.207.244.244,為了便於記憶,常用主機名代替IP地址,例如 .com。
UDP (User Datagram Protocol,用戶數據報協議) 解決了上述第一個問題,通過埠號來實現了多路復用(用不同的埠區分不同的應用程序)但是使用UDP協議的網路程序需要自己處理丟包、重包和包的亂序問題。
TCP (Transmission Control Protocol,傳輸控制協議) 解決了上述兩個問題,同樣使用埠號實現了復用。
TCP 實現可靠連接的方法:
socket通信模型及 TCP 通信過程如下兩張圖。
[圖片上傳失敗...(image-6d947d-1610703914730)]
[圖片上傳失敗...(image-30b472-1610703914730)]
socket.getaddrinfo(host, port, family, socktype, proto, flags)
返回: [(family, socktype, proto, cannonname, sockaddr), ] 由元組組成的列表。
family:表示socket使用的協議簇, AF_UNIX : 1, AF_INET: 2, AF_INET6 : 10。 0 表示不指定。
socktype: socket 的類型, SOCK_STREAM : 1, SOCK_DGRAM : 2, SOCK_RAW : 3
proto: 協議, 套接字所用的協議,如果不指定, 則為 0。 IPPROTO_TCP : 6, IPPRTOTO_UDP : 17
flags:標記,限制返回內容。 AI_ADDRCONFIG 把計算機無法連接的所有地址都過濾掉(如果一個機構既有IPv4,又有IPv6,而主機只有IPv4,則會把 IPv6過濾掉)
AI _V4MAPPED, 如果本機只有IPv6,服務卻只有IPv4,這個標記會將 IPv4地址重新編碼為可實際使用的IPv6地址。
AI_CANONNAME,返回規范主機名:cannonname。
getaddrinfo(None, 'smtp', 0, socket.SOCK_STREAM, 0, socket.AP_PASSIVE)
getaddrinfo('ftp.kernel.org', 'ftp', 0, 'socket.SOCK_STREAM, 0, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED)
利用已經通信的套接字名提供給getaddrinfo
mysock = server_sock.accept()
addr, port = mysock.getpeername()
getaddrinfo(addr, port, mysock.family, mysock.type, mysock.proto, socket.AI_CANONNAME)
TCP 數據發送模式:
由於 TCP 是發送流式數據,並且會自動分割發送的數據包,而且在 recv 的時候會阻塞進程,直到接收到數據為止,因此會出現死鎖現象,及通信雙方都在等待接收數據導致無法響應,或者都在發送數據導致緩存區溢出。所以就有了封幀(framing)的問題,即如何分割消息,使得接收方能夠識別消息的開始與結束。
關於封幀,需要考慮的問題是, 接收方何時最終停止調用recv才是安全的?整個消息或數據何時才能完整無缺的傳達?何時才能將接收到的消息作為一個整體來解析或處理。
適用UDP的場景:
由於TCP每次連接與斷開都需要有三次握手,若有大量連接,則會產生大量的開銷,在客戶端與伺服器之間不存在長時間連接的情況下,適用UDP更為合適,尤其是客戶端太多的時候。
第二種情況: 當丟包現象發生時,如果應用程序有比簡單地重傳數據聰明得多的方法的話,那麼就不適用TCP了。例如,如果正在進行音頻通話,如果有1s的數據由於丟包而丟失了,那麼只是簡單地不斷重新發送這1s的數據直至其成功傳達是無濟於事的。反之,客戶端應該從傳達的數據包中任意選擇一些組合成一段音頻(為了解決這一問題,一個智能的音頻協議會用前一段音頻的高度壓縮版本作為數據包的開始部分,同樣將其後繼音頻壓縮,作為數據包的結束部分),然後繼續進行後續操作,就好像沒有發生丟包一樣。如果使用TCP,那麼這是不可能的,因為TCP會固執地重傳丟失的信息,即使這些信息早已過時無用也不例外。UDP數據報通常是互聯網實時多媒體流的基礎。
參考資料: