Linux-Python-Scapy的TCP掃描
客戶端與服務器建立 TCP 連接要進行一次三次握手,如果進行了一次成功的三次握手,則說明端口開放;
這個技術同 TCP 連接掃描非常相似。同樣是客戶端向服務器發送一個帶有 SYN 標識和端口號的數據包,如果目標端口開發,則會返回帶有 SYN 和 ACK 標識的 TCP 數據包;
在聖誕樹掃描中,客戶端會向服務器發送帶有 PSH,FIN,URG 標識和端口號的數據包給服務器。如果目標端口是開放的,那麽不會有任何來自服務器的回應。如果服務器返回了一個帶有 RST 標識的 TCP 數據包,那麽說明端口處於關閉狀態
FIN 掃描會向服務器發送帶有 FIN 標識和端口號的 TCP 數據包。如果沒有服務器端回應則說明端口開放。如果服務器返回一個 RST 數據包,則說明目標端口是關閉的。
在空掃描中,客戶端發出的 TCP 數據包僅僅只會包含端口號而不會有其他任何的標識信息。如果目標端口是開放的則不會回復任何信息。如果服務器返回了一個 RST 數據包,則說明目標端口是關閉的。
TCP 窗口掃描的流程同 ACK 掃描類似,同樣是客戶端向服務器發送一個帶有 ACK 標識和端口號的 TCP 數據包,但是這種掃描能夠用於發現目標服務器端口的狀態。在 ACK 掃描中返回 RST 表明沒有被過濾,但在窗口掃描中,當收到返回的 RST 數據包後,它會檢查窗口大小的值。如果窗口大小的值是個非零值,則說明目標端口是開放的。
一、SYN掃描:
>> i=IP()
>> t=TCP()
>> i.dst=‘10.202.32.0/24‘/連續地址段
>> t.sport=8888
>> t.dport=[3389,80,21,22,23,443,445,137,138,139]/(1,1024)[]表示多個端口,()表示連續端口
>> repose=(i/t)
>> repose=(i/t)
>> t.flags=‘S‘/產生標誌位也可以寫數據例如ACK寫16
從下到上FIN—SYN—RST—PSH—ACK—URG
1 2 4 8 16 32
>> ans,unans=sr(respose)
> ans.show()
0000 IP / TCP 192.168.80.250:8888 > 10.202.32.1:ssh S ==> IP / TCP 10.202.32.1:ssh > 192.168.80.250:8888 SA / Padding
0001 IP / TCP 192.168.80.250:8888 > 10.202.32.74:microsoft_ds S ==> IP / TCP 10.202.32.74:microsoft_ds > 192.168.80.250:8888 SA / Padding
0002 IP / TCP 192.168.80.250:8888 > 10.202.32.74:netbios_ns S ==> IP / TCP 10.202.32.74:netbios_ns > 192.168.80.250:8888 RA / Padding
0003 IP / TCP 192.168.80.250:8888 > 10.202.32.74:netbios_ssn S ==> IP / TCP 10.202.32.74:netbios_ssn > 192.168.80.250:8888 SA / Padding
對數據進行監控:
>> sniff(iface="eth0",prn=lambda x:x.show() )
對數據進行查看處理:
ans.summary( lambda(s,r): r.sprintf("%IP.src% \t %TCP.sport% \t %TCP.flags%") )
10.200.230.1 ssh SA
10.200.230.11 3389 SA
10.200.230.11 loc_srv SA
10.200.230.11 microsoft_ds SA
10.200.230.12 3389 SA
10.200.230.12 https SA
10.200.230.40 3389 SA
10.200.230.41 3389 SA
10.200.230.42 loc_srv SA
10.200.230.42 microsoft_ds SA
10.200.230.50 3389 SA
二、TCP ACK 掃描;
>> i=IP()
>> i.dst=‘10.200.193.0/24‘
>> t=TCP()
>> t.flags=‘A‘
>> t.sport=9999
>> t.dport=[3389,21,22,23,80,443]
>> respose=(i/t)
ans,unans=sr(respose)
>> ans.show()
0000 IP / TCP 192.168.80.250:9999 > 10.200.193.0:3389 A ==> IP / TCP 10.200.193.0:3389 > 192.168.80.250:9999 R / Padding
0001 IP / TCP 192.168.80.250:9999 > 10.200.193.0:ftp A ==> IP / TCP 10.200.193.0:ftp > 192.168.80.250:9999 R / Padding
0002 IP / TCP 192.168.80.250:9999 > 10.200.193.0:ssh A ==> IP / TCP 10.200.193.0:ssh > 192.168.80.250:9999 R / Padding
0003 IP / TCP 192.168.80.250:9999 > 10.200.193.0:telnet A ==> IP / TCP 10.200.193.0:telnet > 192.168.80.250:9999 R / Padding
如果服務器返回一個帶有 RST 標識的 TCP 數據包,則說明端口沒有被過濾,不存在狀態防火墻。
對數據進行監控:
>> sniff(iface="eth0",prn=lambda x:x.show() )
對數據進行查看處理:
ans.summary( lambda(s,r): r.sprintf("%IP.src% \t %TCP.sport% \t %TCP.flags% \t %ICMP.type%") )
10.200.193.1 3389 R ??
10.200.193.1 ftp R ??
10.200.193.1 ssh R ??
Linux-Python-Scapy的TCP掃描