1. 程式人生 > >Linux-Python-Scapy的TCP掃描

Linux-Python-Scapy的TCP掃描

Scapy TCP掃描

  • TCP 連接掃描:
    客戶端與服務器建立 TCP 連接要進行一次三次握手,如果進行了一次成功的三次握手,則說明端口開放;
  • TCP SYN 掃描(也稱為半開放掃描或stealth掃描):
    這個技術同 TCP 連接掃描非常相似。同樣是客戶端向服務器發送一個帶有 SYN 標識和端口號的數據包,如果目標端口開發,則會返回帶有 SYN 和 ACK 標識的 TCP 數據包;
  • TCP 聖誕樹(Xmas Tree)掃描:
    在聖誕樹掃描中,客戶端會向服務器發送帶有 PSH,FIN,URG 標識和端口號的數據包給服務器。如果目標端口是開放的,那麽不會有任何來自服務器的回應。如果服務器返回了一個帶有 RST 標識的 TCP 數據包,那麽說明端口處於關閉狀態
  • TCP FIN 掃描:
    FIN 掃描會向服務器發送帶有 FIN 標識和端口號的 TCP 數據包。如果沒有服務器端回應則說明端口開放。如果服務器返回一個 RST 數據包,則說明目標端口是關閉的。
  • TCP 空掃描(Null):
    在空掃描中,客戶端發出的 TCP 數據包僅僅只會包含端口號而不會有其他任何的標識信息。如果目標端口是開放的則不會回復任何信息。如果服務器返回了一個 RST 數據包,則說明目標端口是關閉的。
  • TCP ACK 掃描:ACK 掃描不是用於發現端口開啟或關閉狀態的,而是用於發現服務器上是否存在有狀態防火墻的。它的結果只能說明端口是否被過濾。再次強調,ACK 掃描不能發現端口是否處於開啟或關閉狀態。客戶端會發送一個帶有 ACK 標識和端口號的數據包給服務器。如果服務器返回一個帶有 RST 標識的 TCP 數據包,則說明端口沒有被過濾,不存在狀態防火墻。如果目標服務器沒有任何回應或者返回ICMP 錯誤類型3且代碼為1,2,3,9,10或13的數據包,則說明端口被過濾且存在狀態防火墻。
  • TCP 窗口掃描:
    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掃描