Kali Linux 網絡掃描祕籍

 

第三章 端口掃描(二)

做者:Justin Hutchensjavascript

譯者:飛龍java

協議:CC BY-NC-SA 4.0python

3.6 Scapy 隱祕掃描

執行 TCP 端口掃描的一種方式就是執行一部分。目標端口上的 TCP 三次握手用於識別端口是否接受鏈接。這一類型的掃描指代隱祕掃描, SYN 掃描,或者半開放掃描。這個祕籍演示瞭如何使用 Scapy 執行 TCP 隱祕掃描。mysql

準備

爲了使用 Scapy 執行 TCP 隱祕 掃描,你須要一個運行 TCP 網絡服務的遠程服務器。這個例子中咱們使用 Metasploitable2 實例來執行任務。配置 Metasploitable2 的更多信息請參考第一章中的「安裝 Metasploitable2」祕籍。linux

此外,這一節也須要編寫腳本的更多信息,請參考第一章中的「使用文本編輯器*VIM 和 Nano)。ios

操做步驟

爲了展現如何執行 SYN 掃描,咱們須要使用 Scapy 構造 TCP SYN 請求,並識別和開放端口、關閉端口以及無響應系統有關的響應。爲了向給定端口發送 TCP SYN 請求,咱們首先須要構建請求的各個層面。咱們須要構建的第一層就是 IP 層:git

root@KaliLinux:~# scapy Welcome to Scapy (2.2.0) >>> i = IP() >>> i.display() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= ip chksum= None src= 127.0.0.1 dst= 127.0.0.1 \options\ >>> i.dst = "172.16.36.135" >>> i.display() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= ip chksum= None src= 172.16.36.180 dst= 172.16.36.135 \options\ 

爲了構建請求的 IP 層,咱們須要將IP對象賦給變量i。經過調用display函數,咱們能夠肯定對象的屬性配置。一般,發送和接受地址都設爲回送地址,127.0.0.1。這些值能夠經過修改目標地址來修改,也就是設置i.dst爲想要掃描的地址的字符串值。經過再次調用dislay函數,咱們看到不只僅更新的目標地址,也自動更新了和默認接口相關的源 IP 地址。如今咱們構建了請求的 IP 層,咱們能夠構建 TCP 層了。github

>>> t = TCP() >>> t.display() ###[ TCP ]### sport= ftp_data dport= http seq= 0 ack= 0 dataofs= None reserved= 0 flags= S window= 8192 chksum= None urgptr= 0 options= {} 

爲了構建請求的 TCP 層,咱們使用和 IP 層相同的技巧。在這個當即中,TCP對象賦給了t變量。像以前提到的那樣,默認的配置能夠經過調用display函數來肯定。這裏咱們能夠看到目標端口的默認值爲 HTTP 端口 80。對於咱們的首次掃描,咱們將 TCP 設置保留默認。如今咱們建立了 TCP 和 IP 層,咱們須要將它們疊放來構造請求。sql

>>> request = (i/t) >>> request.display() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= tcp chksum= None src= 172.16.36.180 dst= 172.16.36.135 \options\ ###[ TCP ]### sport= ftp_data dport= http seq= 0 ack= 0 dataofs= None reserved= 0 flags= S window= 8192 chksum= None urgptr= 0 options= {} 

咱們能夠經過以斜槓分離變量來疊放 IP 和 TCP 層。這些層面以後賦給了新的變量,它表明整個請求。咱們以後能夠調用dispaly函數來查看請求的配置。一旦構建了請求,能夠將其傳遞給sr1函數來分析響應:shell

>>> response = sr1(request) ...Begin emission: ........Finished to send 1 packets. ....* Received 16 packets, got 1 answers, remaining 0 packets >>> response.display() ###[ IP ]### version= 4L ihl= 5L tos= 0x0 len= 44 id= 0 flags= DF frag= 0L ttl= 64 proto= tcp chksum= 0x9970 src= 172.16.36.135 dst= 172.16.36.180 \options\ ###[ TCP ]### sport= http dport= ftp_data seq= 2848210323L ack= 1 dataofs= 6L reserved= 0L flags= SA window= 5840 chksum= 0xf82d urgptr= 0 options= [('MSS', 1460)] ###[ Padding ]### load= '\x00\x00' 

相同的請求能夠不經過構建和堆疊每一層來執行。反之,咱們使用單獨的一條命令,經過直接調用函數並傳遞合適的參數:

>>> sr1(IP(dst="172.16.36.135")/TCP(dport=80)) .Begin emission: .............Finished to send 1 packets. ....* Received 19 packets, got 1 answers, remaining 0 packets <IP version=4L ihl=5L tos=0x0 len=44 id=0 flags=DF frag=0L ttl=64 proto=tcp chksum=0x9970 src=172.16.36.135 dst=172.16.36.180 options=[] |<TCP sport=http dport=ftp_data seq=542529227 ack=1 dataofs=6L reserved=0L flags=SA window=5840 chksum=0x6864 urgptr=0 options=[('MSS', 1460)] |<Padding load='\x00\x00' |>>> 

要注意當 SYN 封包發往目標 Web 服務器的 TCP 端口 80,而且該端口上運行了 HTTP 服務時,響應中會帶有 TCP 標識 SA 的值,這代表 SYN 和 ACK 標識都被激活。這個響應代表特定的目標端口是開放的,並接受鏈接。若是相同類型的封包發往不接受鏈接的端口,會收到不一樣的請求。

>>> response = sr1(IP(dst="172.16.36.135")/TCP(dport=4444)) ..Begin emission: .Finished to send 1 packets. ...* Received 7 packets, got 1 answers, remaining 0 packets >>> response.display() ###[ IP ]### version= 4L ihl= 5L tos= 0x0 len= 40 id= 0 flags= DF frag= 0L ttl= 64 proto= tcp chksum= 0x9974 src= 172.16.36.135 dst= 172.16.36.180 \options\ ###[ TCP ]### sport= 4444 dport= ftp_data seq= 0 ack= 1 dataofs= 5L reserved= 0L flags= RA window= 0 chksum= 0xfd03 urgptr= 0 options= {} ###[ Padding ]### load= '\x00\x00\x00\x00\x00\x00' 

當 SYN 請求發送給關閉的端口時,返回的響應中帶有 TCP 標識 RA,這代表 RST 和 ACK 標識爲都被激活。ACK 爲僅僅用於認可請求被接受,RST 爲用於斷開鏈接,由於端口不接受鏈接。做爲替代,若是 SYN 封包發往崩潰的系統,或者防火牆過濾了這個請求,就可能接受不到任何信息。因爲這個緣由,在sr1函數在腳本中使用時,應該始終使用timeout選項,來確保腳本不會在無響應的主機上掛起。

>>> response = sr1(IP(dst="172.16.36.136")/TCP(dport=4444),timeout=1,verb ose=1) Begin emission: Finished to send 1 packets Received 15 packets, got 0 answers, remaining 1 packets 

若是函數對無響應的主機使用時,timeout值沒有指定,函數會無限繼續下去。這個演示中,timout值爲 1秒,用於使這個函數更加完備,響應的值能夠用於判斷是否收到了響應:

root@KaliLinux:~# python Python 2.7.3 (default, Jan 2 2013, 16:53:07) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from scapy.all import * >>> response = sr1(IP(dst="172.16.36.136")/TCP(dport=4444),timeout=1,verb ose=1) Begin emission: WARNING: Mac address to reach destination not found. Using broadcast. Finished to send 1 packets. Received 15 packets, got 0 answers, remaining 1 packets >>> if response == None: ... print "No Response!!!" ... No Response!!! 

Python 的使用使其更易於測試變量來識別sr1函數是否對其複製。這能夠用做初步檢驗,來判斷是否接收到了任何響應。對於接收到的響應,能夠執行一系列後續檢查來判斷響應代表端口開放仍是關閉。這些東西能夠輕易使用 Python 腳原本完成,像這樣:

#!/usr/bin/python import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * import sys if len(sys.argv) != 4: print "Usage - ./syn_scan.py [Target-IP] [First Port] [Last Port]" print "Example - ./syn_scan.py 10.0.0.5 1 100" print "Example will TCP SYN scan ports 1 through 100 on 10.0.0.5" sys.exit() ip = sys.argv[1] start = int(sys.argv[2]) end = int(sys.argv[3]) for port in range(start,end): ans = sr1(IP(dst=ip)/TCP(dport=port),timeout=1,verbose=0) if ans == None: pass else: if int(ans[TCP].flags) == 18: print port else: pass 

在這個 Python 腳本中,用於被提示來輸入 IP 地址,腳本以後會對定義好的端口序列執行 SYN 掃描。腳本以後會獲得每一個鏈接的響應,並嘗試判斷響應的 SYN 和 ACK 標識是否激活。若是響應中出現並僅僅出現了這些標識,那麼會輸出相應的端口號碼。

root@KaliLinux:~# chmod 777 syn_scan.py root@KaliLinux:~# ./syn_scan.py Usage - ./syn_scan.py [Target-IP] [First Port] [Last Port] Example - ./syn_scan.py 10.0.0.5 1 100 Example will TCP SYN scan ports 1 through 100 on 10.0.0.5 root@KaliLinux:~# ./syn_scan.py 172.16.36.135 1 100 21 22 23 25 53 80 

運行這個腳本以後,輸出會顯示所提供的 IP 地址的系統上,前 100 個端口中的開放端口。

工做原理

這一類型的掃描由發送初始 SYN 封包給遠程系統的目標 TCP 端口,而且經過返回的響應類型來判斷端口狀態來完成。若是遠程系統返回了 SYN+ACK 響應,那麼它正在準備創建鏈接,咱們能夠假設這個端口開放。若是服務返回了 RST 封包,這就代表端口關閉而且不接收鏈接。此外,若是沒有返回響應,掃描系統和遠程系統之間可能存在防火牆,它丟棄了請求。這也可能代表主機崩潰或者目標 IP 上沒有關聯任何系統。

3.7 Nmap 隱祕掃描

Nmap 擁有能夠執行遠程系統 SYN 掃描的掃描模式。這個祕籍展現瞭如何使用 Namp 執行 TCP 隱祕掃描。

準備

爲了使用 Nmap 執行 TCP 隱祕掃描,你須要一個運行 TCP 網絡服務的遠程服務器。這個例子中咱們使用 Metasploitable2 實例來執行任務。配置 Metasploitable2 的更多信息請參考第一章中的「安裝 Metasploitable2」祕籍。

操做步驟

就像多數掃描需求那樣,Nmap 擁有簡化 TCP 隱祕掃描執行過程的選項。爲了使用 Nmap 執行 TCP 隱祕掃描,應使用-sS選項,並附帶被掃描主機的 IP 地址。

root@KaliLinux:~# nmap -sS 172.16.36.135 -p 80 Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:47 EST Nmap scan report for 172.16.36.135 Host is up (0.00043s latency). PORT STATE SERVICE 80/tcp open http MAC Address: 00:0C:29:3D:84:32 (VMware) Nmap done: 1 IP address (1 host up) scanned in 13.05 seconds 

在提供的例子中,特定的 IP 地址的 TCP 80 端口上執行了 TCP 隱祕掃描。和 Scapy 中的技巧類似,Nmap 監聽響應並經過分析響應中所激活的 TCP 標識來識別開放端口。咱們也可使用 Namp 執行多個特定端口的掃描,經過傳遞逗號分隔的端口號列表。

root@KaliLinux:~# nmap -sS 172.16.36.135 -p 21,80,443 Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:48 EST Nmap scan report for 172.16.36.135 Host is up (0.00035s latency). PORT STATE SERVICE 21/tcp open ftp 80/tcp open http 443/tcp closed https MAC Address: 00:0C:29:3D:84:32 (VMware) Nmap done: 1 IP address (1 host up) scanned in 13.05 seconds 

在這個例子中,目標 IP 地址的端口 2一、80 和 443 上執行了 SYN 掃描。咱們也可使用 Namp 來掃描主機序列,經過標明要掃描的第一個和最後一個端口號,以破折號分隔:

root@KaliLinux:~# nmap -sS 172.16.36.135 -p 20-25 Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:48 EST Nmap scan report for 172.16.36.135 Host is up (0.00035s latency). PORT STATE SERVICE 20/tcp closed ftp-data 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 24/tcp closed priv-mail 25/tcp open smtp MAC Address: 00:0C:29:3D:84:32 (VMware) Nmap done: 1 IP address (1 host up) scanned in 13.05 seconds 

在所提供的例子中,SYN 掃描在 TCP 20 到 25 端口上執行。除了擁有指定被掃描端口的能力以外。Nmap 同時擁有配置好的 1000 和經常使用端口的列表。咱們能夠執行這些端口上的掃描,經過不帶任何端口指定信息來運行 Nmap:

root@KaliLinux:~# nmap -sS 172.16.36.135 Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:46 EST Nmap scan report for 172.16.36.135 Host is up (0.00038s latency). N ot shown: 977 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 80/tcp open http 111/tcp open rpcbind 139/tcp open netbios-ssn 445/tcp open microsoft-ds 512/tcp open exec 513/tcp open login 514/tcp open shell 1099/tcp open rmiregistry 1524/tcp open ingreslock 2049/tcp open nfs 2121/tcp open ccproxy-ftp 3306/tcp open mysql 5432/tcp open postgresql 5900/tcp open vnc 6000/tcp open X11 6667/tcp open irc 8009/tcp open ajp13 8180/tcp open unknown MAC Address: 00:0C:29:3D:84:32 (VMware) Nmap done: 1 IP address (1 host up) scanned in 13.17 seconds 

在上面的例子中,掃描了 Nmap 定義的 1000 個經常使用端口,用於識別 Metasploitable2 系統上的大量開放端口。雖然這個技巧在是被多數設備上很高效,可是也可能沒法識別模糊的服務或者不常見的端口組合。若是掃描在全部可能的 TCP 端口上執行,全部可能的端口地址值都須要被掃描。定義了源端口和目標端口地址的 TCP 頭部部分是 16 位長。而且,每一位能夠爲 1 或者 0。所以,共有2 ** 16或者 65536 個可能的 TCP 端口地址。對於要掃描的所有可能的地址空間,須要提供 0 到 65535 的端口範圍,像這樣:

root@KaliLinux:~# nmap -sS 172.16.36.135 -p 0-65535 Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:51 EST Nmap scan report for 172.16.36.135 Host is up (0.00033s latency). Not shown: 65506 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 80/tcp open http 111/tcp open rpcbind 139/tcp open netbios-ssn 445/tcp open microsoft-ds 512/tcp open exec 513/tcp open login 514/tcp open shell 1099/tcp open rmiregistry 1524/tcp open ingreslock 2049/tcp open nfs 2121/tcp open ccproxy-ftp 3306/tcp open mysql 3632/tcp open distccd 5432/tcp open postgresql 5900/tcp open vnc 6000/tcp open X11 6667/tcp open irc 6697/tcp open unknown 8009/tcp open ajp13 8180/tcp open unknown 8787/tcp open unknown 34789/tcp open unknown 50333/tcp open unknown 56375/tcp open unknown 57385/tcp open unknown MAC Address: 00:0C:29:3D:84:32 (VMware) Nmap done: 1 IP address (1 host up) scanned in 16.78 seconds 

這個例子中,Metasploitable2 系統上全部可能的 65536 和 TCP 地址都掃描了一遍。要注意該掃描中識別的多數服務都在標準的 Nmap 1000 掃描中識別過了。這就代表在嘗試識別目標的全部可能的攻擊面的時候,完整掃描是個最佳實踐。Nmap 可使用破折號記法,掃描主機列表上的 TCP 端口:

root@KaliLinux:~# nmap 172.16.36.0-255 -sS -p 80 Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:56 EST Nmap scan report for 172.16.36.1 Host is up (0.00023s latency). PORT STATE SERVICE 80/tcp closed http MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 172.16.36.2 Host is up (0.00018s latency). PORT STATE SERVICE 80/tcp closed http MAC Address: 00:50:56:FF:2A:8E (VMware) Nmap scan report for 172.16.36.132 Host is up (0.00047s latency). PORT STATE SERVICE 80/tcp closed http MAC Address: 00:0C:29:65:FC:D2 (VMware) Nmap scan report for 172.16.36.135 Host is up (0.00016s latency). PORT STATE SERVICE 80/tcp open http MAC Address: 00:0C:29:3D:84:32 (VMware) Nmap scan report for 172.16.36.180 Host is up (0.0029s latency). PORT STATE SERVICE 80/tcp open http Nmap done: 256 IP addresses (5 hosts up) scanned in 42.85 seconds 

這個例子中,TCP 80 端口的 SYN 掃描在指定地址範圍內的全部主機上執行。雖然這個特定的掃描僅僅執行在單個端口上,Nmap 也可以同時掃描多個系統上的多個端口和端口範圍。此外,Nmap 也可以進行配置,基於 IP 地址的輸入列表來掃描主機。這能夠經過-iL選項並指定文件名,若是文件存放於執行目錄中,或者文件路徑來完成。Nmap 以後會遍歷輸入列表中的每一個地址,並對地址執行特定的掃描。

root@KaliLinux:~# cat iplist.txt 172.16.36.1 172.16.36.2 172.16.36.132 172.16.36.135 root@KaliLinux:~# nmap -sS -iL iplist.txt -p 80 Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:59 EST Nmap scan report for 172.16.36.1 Host is up (0.00016s latency). PORT STATE SERVICE 80/tcp closed http MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 172.16.36.2 Host is up (0.00047s latency). PORT STATE SERVICE 80/tcp closed http MAC Address: 00:50:56:FF:2A:8E (VMware) Nmap scan report for 172.16.36.132 Host is up (0.00034s latency). PORT STATE SERVICE 80/tcp closed http MAC Address: 00:0C:29:65:FC:D2 (VMware) Nmap scan report for 172.16.36.135 Host is up (0.00016s latency). PORT STATE SERVICE 80/tcp open http MAC Address: 00:0C:29:3D:84:32 (VMware) Nmap done: 4 IP addresses (4 hosts up) scanned in 13.05 seconds 

工做原理

Nmap SYN 掃描背後的底層機制已經討論過了。可是,Nmap 擁有多線程功能,是用於執行這類掃描的快速高效的方式。

3.8 Metasploit 隱祕掃描

除了其它已經討論過的工具以外,Metasploit 擁有用於 SYN 掃描的輔助模塊。這個祕籍展現瞭如何使用 Metasploit 來執行 TCP 隱祕掃描。

準備

爲了使用 Metasploit 執行 TCP 隱祕掃描,你須要一個運行 TCP 網絡服務的遠程服務器。這個例子中咱們使用 Metasploitable2 實例來執行任務。配置 Metasploitable2 的更多信息請參考第一章中的「安裝 Metasploitable2」祕籍。

操做步驟

Metasploit 擁有能夠對特定 TCP 端口執行 SYN 掃描的輔助模塊。爲了在 Kali 中啓動 Metasploit,咱們在終端中執行msfconsole命令。

root@KaliLinux:~# msfconsole IIIIII dTb.dTb _.---._ II 4' v 'B .'"".'/|\`.""'. II 6. .P : .' / | \ `. : II 'T;. .;P' '.' / | \ `.' II 'T; ;P' `. / | \ .' IIIIII 'YvP' `-.__|__.-' I love shells --egypt Using notepad to track pentests? Have Metasploit Pro report on hosts, services, sessions and evidence -- type 'go_pro' to launch it now. =[ metasploit v4.6.0-dev [core:4.6 api:1.0] + -- --=[ 1053 exploits - 590 auxiliary - 174 post + -- --=[ 275 payloads - 28 encoders - 8 nops msf > use auxiliary/scanner/portscan/syn msf auxiliary(syn) > show options Module options (auxiliary/scanner/portscan/syn): Name Current Setting Required Description ---- --------------- -------- ---------- BATCHSIZE 256 yes The number of hosts to scan per set INTERFACE no The name of the interface PORTS 1-10000 yes Ports to scan (e.g. 2225,80,110-900) RHOSTS yes The target address range or CIDR identifier SNAPLEN 65535 yes The number of bytes to capture THREADS 1 yes The number of concurrent threads TIMEOUT 500 yes The reply read timeout in milliseconds 

爲了在 Metasploit 中執行 SYN 掃描,以輔助模塊的相對路徑調用use命令。一旦模塊被選中,能夠執行show options命令來確認或修改掃描配置。這個命令會展現四列的表格,包括namecurrent settingsrequireddescriptionname列標出了每一個可配置變量的名稱。current settings列列出了任何給定變量的現有配置。required列標出對於任何給定變量,值是不是必須的。description列描述了每一個變量的功能。任何給定變量的值可使用set命令,而且將新的值做爲參數來修改。

msf  auxiliary(syn) > set RHOSTS 172.16.36.135 RHOSTS => 172.16.36.135 msf auxiliary(syn) > set THREADS 20 THREADS => 20 msf auxiliary(syn) > set PORTS 80 PORTS => 80 msf auxiliary(syn) > show options Module options (auxiliary/scanner/portscan/syn): Name Current Setting Required Description ---- --------------- -------- ---------- BATCHSIZE 256 yes The number of hosts to scan per set INTERFACE no The name of the interface PORTS 80 yes Ports to scan (e.g. 2225,80,110-900) RHOSTS 172.16.36.135 yes The target address range or CIDR identifier SNAPLEN 65535 yes The number of bytes to capture THREADS 20 yes The number of concurrent threads TIMEOUT 500 yes The reply read timeout in milliseconds 

在上面的例子中,RHOSTS值修改成咱們打算掃描的遠程系統的 IP 地址。地外,線程數量修改成 20。THREADS的值定義了在後臺執行的當前任務數量。肯定線程數量涉及到尋找一個平衡,既能提高任務速度,又不會過分消耗系統資源。對於多數系統,20 個線程能夠足夠快,而且至關合理。PORTS值設爲 TCP 端口 80(HTTP)。修改了必要的變量以後,能夠再次使用show options命令來驗證。一旦所需配置驗證完畢,就能夠執行掃描了。

msf  auxiliary(syn) > run

[*] TCP OPEN 172.16.36.135:80 [*] Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution completed The run command is used in Metasploit to execute the selected auxiliary module. In the example provided, the run command executed a TCP SYN scan against port 80 of the specified IP address. We can also run this TCP SYN scan module against a sequential series of TCP ports by supplying the first and last values, separated by a dash notation: msf auxiliary(syn) > set PORTS 0-100 PORTS => 0-100 msf auxiliary(syn) > show options Module options (auxiliary/scanner/portscan/syn): Name Current Setting Required Description ---- --------------- -------- ---------- BATCHSIZE 256 yes The number of hosts to scan per set INTERFACE no The name of the interface PORTS 0-100 yes Ports to scan (e.g. 2225,80,110-900) RHOSTS 172.16.36.135 yes The target address range or CIDR identifier SNAPLEN 65535 yes The number of bytes to capture THREADS 20 yes The number of concurrent threads TIMEOUT 500 yes The reply read timeout in milliseconds msf auxiliary(syn) > run [*] TCP OPEN 172.16.36.135:21 [*] TCP OPEN 172.16.36.135:22 [*] TCP OPEN 172.16.36.135:23 [*] TCP OPEN 172.16.36.135:25 [*] TCP OPEN 172.16.36.135:53 [*] TCP OPEN 172.16.36.135:80 [*] Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution completed 

上面的例子中,所指定的遠程主機的錢 100 個 TCP 端口上執行了 TCP SYN 掃描。雖然這個掃描識別了目標系統的多個設備,咱們不能確認全部設備都識別出來,除非全部可能的端口地址都掃描到。定義來源和目標端口地址的TCP 頭部部分是 16 位長。而且,每一位能夠爲 1 或者 0。所以,共有2 ** 16或 65536 個可能的 TCP 端口地址。對於要掃描的整個地址空間,須要提供 0 到 65535 的 端口範圍,像這樣:

msf  auxiliary(syn) > set PORTS 0-65535 PORTS => 0-65535 msf auxiliary(syn) > show options Module options (auxiliary/scanner/portscan/syn): Name Current Setting Required Description ---- --------------- -------- ---------- BATCHSIZE 256 yes The number of hosts to scan per set INTERFACE no The name of the interface PORTS 0-65535 yes Ports to scan (e.g. 2225,80,110-900) RHOSTS 172.16.36.135 yes The target address range or CIDR identifier SNAPLEN 65535 yes The number of bytes to capture THREADS 20 yes The number of concurrent threads TIMEOUT 500 yes The reply read timeout in milliseconds msf auxiliary(syn) > run [*] TCP OPEN 172.16.36.135:21 [*] TCP OPEN 172.16.36.135:22 [*] TCP OPEN 172.16.36.135:23 [*] TCP OPEN 172.16.36.135:25 [*] TCP OPEN 172.16.36.135:53 [*] TCP OPEN 172.16.36.135:80 [*] TCP OPEN 172.16.36.135:111 [*] TCP OPEN 172.16.36.135:139 [*] TCP OPEN 172.16.36.135:445 [*] TCP OPEN 172.16.36.135:512 [*] TCP OPEN 172.16.36.135:513 [*] TCP OPEN 172.16.36.135:514 [*] TCP OPEN 172.16.36.135:1099 [*] TCP OPEN 172.16.36.135:1524 [*] TCP OPEN 172.16.36.135:2049 [*] TCP OPEN 172.16.36.135:2121 [*] TCP OPEN 172.16.36.135:3306 [*] TCP OPEN 172.16.36.135:3632 [*] TCP OPEN 172.16.36.135:5432 [*] TCP OPEN 172.16.36.135:5900 [*] TCP OPEN 172.16.36.135:6000 [*] TCP OPEN 172.16.36.135:6667 [*] TCP OPEN 172.16.36.135:6697 [*] TCP OPEN 172.16.36.135:8009 [*] TCP OPEN 172.16.36.135:8180 [*] TCP OPEN 172.16.36.135:8787 [*] TCP OPEN 172.16.36.135:34789 [*] TCP OPEN 172.16.36.135:50333 [*] TCP OPEN 172.16.36.135:56375 [*] TCP OPEN 172.16.36.135:57385 [*] Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution completed 

在這個李忠,遠程系統的全部開放端口都由掃描全部可能的 TCP 端口地址來識別。咱們也能夠修改掃描配置使用破折號記法來掃描地址序列。

msf  auxiliary(syn) > set RHOSTS 172.16.36.0-255 RHOSTS => 172.16.36.0-255 msf auxiliary(syn) > show options Module options (auxiliary/scanner/portscan/syn): Name Current Setting Required Description ---- --------------- -------- ---------- BATCHSIZE 256 yes The number of hosts to scan per set INTERFACE no The name of the interface PORTS 80 yes Ports to scan (e.g. 2225,80,110-900) RHOSTS 172.16.36.0-255 yes The target address range or CIDR identifier SNAPLEN 65535 yes The number of bytes to capture THREADS 20 yes The number of concurrent threads TIMEOUT 500 yes The reply read timeout in milliseconds msf auxiliary(syn) > run [*] TCP OPEN 172.16.36.135:80 [*] Scanned 256 of 256 hosts (100% complete) [*] Auxiliary module execution completed 

這個例子中,TCP SYN 掃描執行在由RHOST變量指定的全部主機地址的 80 端口上。與之類似,RHOSTS可使用 CIDR 記法定義網絡範圍。

msf  auxiliary(syn) > set RHOSTS 172.16.36.0/24 RHOSTS => 172.16.36.0/24 msf auxiliary(syn) > show options Module options (auxiliary/scanner/portscan/syn): Name Current Setting Required Description ---- --------------- -------- ---------- BATCHSIZE 256 yes The number of hosts to scan per set INTERFACE no The name of the interface PORTS 80 yes Ports to scan (e.g. 2225,80,110-900) RHOSTS 172.16.36.0/24 yes The target address range or CIDR identifier SNAPLEN 65535 yes The number of bytes to capture THREADS 20 yes The number of concurrent threads TIMEOUT 500 yes The reply read timeout in milliseconds msf auxiliary(syn) > run [*] TCP OPEN 172.16.36.135:80 [*] Scanned 256 of 256 hosts (100% complete) [*] Auxiliary module execution completed 

工做原理

Metasploit SYN 掃描輔助模塊背後的底層原理和任何其它 SYN 掃描工具同樣。對於每一個被掃描的端口,會發送 SYN 封包。SYN+ACK 封包會用於識別活動服務。使用 MEtasploit 可能更加有吸引力,由於它擁有交互控制檯,也由於它是個已經被多數滲透測試者熟知的工具。

7.9 hping3 隱祕掃描

除了咱們以前學到了探索技巧,hping3 也能夠用於執行端口掃描。這個祕籍展現瞭如何使用 hping3 來執行 TCP 隱祕掃描。

準備

爲了使用 hping3 執行 TCP 隱祕掃描,你須要一個運行 TCP 網絡服務的遠程服務器。這個例子中咱們使用 Metasploitable2 實例來執行任務。配置 Metasploitable2 的更多信息請參考第一章中的「安裝 Metasploitable2」祕籍。

操做步驟

除了咱們以前學到了探索技巧,hping3 也能夠用於執行端口掃描。爲了使用 hping3 執行端口掃描,咱們須要以一個整數值使用--scan模式來指定要掃描的端口號。

root@KaliLinux:~# hping3 172.16.36.135 --scan 80 -S Scanning 172.16.36.135 (172.16.36.135), port 80 1 ports to scan, use -V to see all the replies +----+-----------+---------+---+-----+-----+-----+ |port| serv name | flags |ttl| id | win | len | +----+-----------+---------+---+-----+-----+-----+ 80 http : .S..A... 64 0 5840 46 All replies received. Done. Not responding ports: 

上面的例子中,SYN 掃描執行在指定 IP 地址的 TCP 端口 80 上。-S選項指明瞭發給遠程系統的封包中激活的 TCP 標識。表格展現了接收到的響應封包中的屬性。咱們能夠從輸出中看到,接收到了SYN+ACK 響應,因此這表示目標主機端口 80 是開放的。此外,咱們能夠經過輸入夠好分隔的端口號列表來掃描多個端口,像這樣:

root@KaliLinux:~# hping3 172.16.36.135 --scan 22,80,443 -S Scanning 172.16.36.135 (172.16.36.135), port 22,80,443 3 ports to scan, use -V to see all the replies +----+-----------+---------+---+-----+-----+-----+ |port| serv name | flags |ttl| id | win | len | +----+-----------+---------+---+-----+-----+-----+ 22 ssh : .S..A... 64 0 5840 46 80 http : .S..A... 64 0 5840 46 All replies received. Done. Not responding ports: 

在上面的掃描輸出中,你能夠看到,僅僅展現了接受到 SYN+ACK 標識的結果。要注意和發送到 443 端口的 SYN 請求相關的響應並無展現。從輸出中能夠看出,咱們能夠經過使用-v選項增長詳細讀來查看全部響應。此外,能夠經過傳遞第一個和最後一個端口地址值,來掃描端口範圍,像這樣:

root@KaliLinux:~# hping3 172.16.36.135 --scan 0-100 -S Scanning 172.16.36.135 (172.16.36.135), port 0-100 101 ports to scan, use -V to see all the replies +----+-----------+---------+---+-----+-----+-----+ |port| serv name | flags |ttl| id | win | len | +----+-----------+---------+---+-----+-----+-----+ 21 ftp : .S..A... 64 0 5840 46 22 ssh : .S..A... 64 0 5840 46 23 telnet : .S..A... 64 0 5840 46 25 smtp : .S..A... 64 0 5840 46 53 domain : .S..A... 64 0 5840 46 80 http : .S..A... 64 0 5840 46 All replies received. Done. Not responding ports: 

這個例子中,100 個端口的掃描足以識別 Metasploitable2 系統上的服務。可是,爲了執行 全部 TCP 端口的掃描,須要掃描全部可能的端口地址值。定義了源端口和目標端口地址的 TCP 頭部部分是 16 位長。而且,每一位能夠爲 1 或者 0。所以,共有2 ** 16或者 65536 個可能的 TCP 端口地址。對於要掃描的所有可能的地址空間,須要提供 0 到 65535 的端口範圍,像這樣:

root@KaliLinux:~# hping3 172.16.36.135 --scan 0-65535 -S Scanning 172.16.36.135 (172.16.36.135), port 0-65535 65536 ports to scan, use -V to see all the replies +----+-----------+---------+---+-----+-----+-----+ |port| serv name | flags |ttl| id | win | len | +----+-----------+---------+---+-----+-----+-----+ 21 ftp : .S..A... 64 0 5840 46 22 ssh : .S..A... 64 0 5840 46 23 telnet : .S..A... 64 0 5840 46 25 smtp : .S..A... 64 0 5840 46 53 domain : .S..A... 64 0 5840 46 111 sunrpc : .S..A... 64 0 5840 46 1099 rmiregistry: .S..A... 64 0 5840 46 1524 ingreslock : .S..A... 64 0 5840 46 2121 iprop : .S..A... 64 0 5840 46 8180 : .S..A... 64 0 5840 46 34789 : .S..A... 64 0 5840 46 512 exec : .S..A... 64 0 5840 46 513 login : .S..A... 64 0 5840 46 514 shell : .S..A... 64 0 5840 46 3632 distcc : .S..A... 64 0 5840 46 5432 postgresql : .S..A... 64 0 5840 46 56375 : .S..A... 64 0 5840 46 80 http : .S..A... 64 0 5840 46 445 microsoft-d: .S..A... 64 0 5840 46 2049 nfs : .S..A... 64 0 5840 46 6667 ircd : .S..A... 64 0 5840 46 6697 : .S..A... 64 0 5840 46 57385 : .S..A... 64 0 5840 46 139 netbios-ssn: .S..A... 64 0 5840 46 6000 x11 : .S..A... 64 0 5840 46 3306 mysql : .S..A... 64 0 5840 46 5900 : .S..A... 64 0 5840 46 8787 : .S..A... 64 0 5840 46 50333 : .S..A... 64 0 5840 46 8009 : .S..A... 64 0 5840 46 All replies received. Done. Not responding ports: 

工做原理

hping3 不用於一些已經提到的其它工具,由於它並無 SYN 掃描模式。可是反之,它容許你指定 TCP 封包發送時的激活的 TCP 標識。在祕籍中的例子中,-S選項讓 hping3 使用 TCP 封包的 SYN 標識。

3.10 Scapy 鏈接掃描

在多數掃描工具當中,TCP 鏈接掃描比 SYN 掃描更加容易。這是由於 TCP 鏈接掃描並不須要爲了生成和注入 SYN 掃描中使用的原始封包而提高權限。Scapy 是它的一大例外。Scapy 實際上很是難以執行徹底的 TCP 三次握手,也不實用。可是,出於更好理解這個過程的目的,咱們來看看如何使用 Scapy 執行鏈接掃描。

準備

爲了使用 Scapy 執行全鏈接掃描,你須要一個運行 UDP 網絡服務的遠程服務器。這個例子中咱們使用 Metasploitable2 實例來執行任務。配置 Metasploitable2 的更多信息請參考第一章中的「安裝 Metasploitable2」祕籍。

此外,這一節也須要編寫腳本的更多信息,請參考第一章中的「使用文本編輯器*VIM 和 Nano)。

操做步驟

Scapy 中很難執行全鏈接掃描,由於系統內核不知道你在 Scapy 中發送的請求,而且嘗試阻止你和遠程系統創建完整的三次握手。你能夠在 Wireshark 或 tcpdump 中,經過發送 SYN 請求並嗅探相關流量來看到這個過程。當你接收到來自遠程系統的 SYN+ACK 響應時,Linux 內核會攔截它,並將其看作來源不明的響應,由於它不知道你在 Scapy 中 發送的請求。而且系統會自動使用 TCP RST 封包來回復,所以會斷開握手過程。考慮下面的例子:

#!/usr/bin/python import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * response = sr1(IP(dst="172.16.36.135")/TCP(dport=80,flags='S')) reply = sr1(IP(dst="172.16.36.135")/TCP(dport=80,flags='A',ack=(respon se[TCP].seq + 1))) 

這個 Python 腳本的例子能夠用作 POC 來演系統破壞三次握手的問題。這個腳本假設你將帶有開放端口活動系統做爲目標。所以,假設 SYN+ACK 回覆會做爲初始 SYN 請求的響應而返回。即便發送了最後的 ACK 回覆,完成了握手,RST 封包也會阻止鏈接創建。咱們能夠經過觀察封包發送和接受來進一步演示。

#!/usr/bin/python import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * SYN = IP(dst="172.16.36.135")/TCP(dport=80,flags='S') print "-- SENT --" SYN.display() print "\n\n-- RECEIVED --" response = sr1(SYN,timeout=1,verbose=0) response.display() if int(response[TCP].flags) == 18: print "\n\n-- SENT --" ACK = IP(dst="172.16.36.135")/TCP(dport=80,flags='A',ack=(response[ TCP].seq + 1)) response2 = sr1(ACK,timeout=1,verbose=0) ACK.display() print "\n\n-- RECEIVED --" response2.display() else: print "SYN-ACK not returned" 

在這個 Python 腳本中,每一個發送的封包都在傳輸以前展現,而且每一個收到的封包都在到達以後展現。在檢驗每一個封包所激活的 TCP 標識的過程當中,咱們能夠看到,三次握手失敗了。考慮由腳本生成的下列輸出:

root@KaliLinux:~# ./tcp_connect.py -- SENT - ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = tcp chksum = None src = 172.16.36.180 dst = 172.16.36.135 \options \ ###[ TCP ]### sport = ftp_data dport = http seq = 0 ack = 0 dataofs = None reserved = 0 flags = S window = 8192 chksum = None urgptr = 0 options = {} -- RECEIVED - ###[ IP ]### version = 4L ihl = 5L tos = 0x0 len = 44 id = 0 flags = DF frag = 0L ttl = 64 proto = tcp chksum = 0x9970 src = 172.16.36.135 dst = 172.16.36.180 \options \ ###[ TCP ]### sport = http dport = ftp_data seq = 3013979073L ack = 1 dataofs = 6L reserved = 0L flags = SA window = 5840 chksum = 0x801e urgptr = 0 options = [('MSS', 1460)] ###[ Padding ]### load = '\x00\x00' -- SENT - ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = tcp chksum = None src = 172.16.36.180 dst = 172.16.36.135 \options \ ###[ TCP ]### sport = ftp_data dport = http seq = 0 ack = 3013979074L dataofs = None reserved = 0 flags = A window = 8192 chksum = None urgptr = 0 options = {} -- RECEIVED - ###[ IP ]### version = 4L ihl = 5L tos = 0x0 len = 40 id = 0 flags = DF frag = 0L ttl = 64 proto = tcp chksum = 0x9974 src = 172.16.36.135 dst = 172.16.36.180 \options \ ###[ TCP ]### sport = http dport = ftp_data seq = 3013979074L ack = 0 dataofs = 5L reserved = 0L flags = R window = 0 chksum = 0xaeb8 urgptr = 0 options = {} ###[ Padding ]### load = '\x00\x00\x00\x00\x00\x00' 

在腳本的輸出中,咱們看到了四個封包。第一個封包是發送的 SYN 請求,第二個封包時接收到的 SYN+ACK 回覆,第三個封包時發送的 ACK 回覆,以後接收到了 RST 封包,它是最後的 ACK 回覆的響應。最後一個封包代表,在創建鏈接時出現了問題。Scapy 中可能可以創建完成的三次握手,可是它須要對本地 IP 表作一些調整。尤爲是,若是你去掉髮往遠程系統的 TSR 封包,你就能夠完成握手。經過使用 IP 表創建過濾機制,咱們能夠去掉 RST 封包來完成三次握手,而不會干擾到整個系統(這個配置出於功能上的原理並不推薦)。爲了展現完整三次握手的成功創建,咱們使用 Netcat 創建 TCP 監聽服務。以後嘗試使用 Scapy 鏈接開放的端口。

admin@ubuntu:~$ nc -lvp 4444 listening on [any] 4444 ... 

這個例子中,咱們在 TCP 端口 4444 開啓了監聽服務。咱們以後能夠修改以前的腳原本嘗試鏈接 端口 4444 上的 Netcat 監聽服務。

#!/usr/bin/python import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * response = sr1(IP(dst="172.16.36.135")/TCP(dport=4444,flags='S')) reply = sr1(IP(dst="172.16.36.135")/TCP(dport=4444,flags='A',ack=(resp onse[TCP].seq + 1))) 

這個腳本中,SYN 請求發送給了監聽端口。收到 SYN+ACK 回覆以後,會發送 ACK回覆。爲了驗證鏈接嘗試被系統生成的 RST 封包打斷,這個腳本應該在 Wireshark 啓動以後執行,來捕獲請求蓄力。咱們使用 Wireshark 的過濾器來隔離鏈接嘗試序列。所使用的過濾器是tcp && (ip.src == 172.16.36.135 || ip.dst == 172.16.36.135)。過濾器僅僅用於展現來自或發往被掃描系統的 TCP 流量。像這樣:

 

既然咱們已經精肯定位了問題。咱們能夠創建過濾器,讓咱們可以去除系統生成的 RST 封包。這個過濾器能夠經過修改本地 IP 表來創建:

以以下方式修改本地 IP 表會經過阻塞全部發出的 RST 響應,改變和目標系統之間的 TCP/IP 事務的處理方式。確保常見的 iptable 規則在這個祕籍完成以後移除,或者以後使用下列命令刷新 iptable。

iptables --flush
root@KaliLinux:~# iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 172.16.36.135 -j DROP root@KaliLinux:~# iptables --list Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere 172.16.36.135 tcp flags:RST/RST 

在這個例子中,本地 IP 表的修改去除了全部發往被掃描主機的目標地址的 TCP RST 封包。list選項隨後能夠用於查看 IP 表的條目,以及驗證配置已經作了修改。爲了執行另外一次鏈接嘗試,咱們須要確保 Natcat 仍舊監聽目標的 4444 端口,像這樣:

admin@ubuntu:~$ nc -lvp 4444 listening on [any] 4444 ... 

和以前相同的 Python 腳本能夠再次使用,同時 WIreshark 會捕獲後臺的流量。使用以前討論的顯示過濾器,咱們能夠輕易專一於所需的流量。要注意三次握手的全部步驟如今均可以完成,而不會收到系統生成的 RST 封包的打斷,像這樣:

 

此外,若是咱們看一看運行在目標系統的 Netcat 服務,咱們能夠注意到,已經創建了鏈接。這是用於確認成功創建鏈接的進一步的證據。這能夠在下面的輸出中看到:

admin@ubuntu:~$ nc -lvp 4444 listening on [any] 4444 ... 172.16.36.132: inverse host lookup failed: No address associated with name connect to [172.16.36.135] from (UNKNOWN) [172.16.36.132] 42409 

雖然這個練習對理解和解決 TCP 鏈接的問題十分有幫助,恢復 IP 表的條目也十分重要。RST 封包 是 TCP 通訊的重要組成部分,去除這些響應會影響正常的通訊功能。洗嘜按的命令能夠用於刷新咱們的 iptable 規則,並驗證刷新成功:

root@KaliLinux:~# iptables --flush root@KaliLinux:~# iptables --list Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 

就像例子中展現的那樣,flush選項應該用於清楚 IP 表的條目。咱們能夠屢次使用list選項來驗證 IP 表的條目已經移除了。

工做原理

執行 TCP 鏈接掃描的同居經過執行完整的三次握手,和遠程系統的全部被掃描端口創建鏈接。端口的狀態取決於鏈接是否成功創建。若是鏈接創建,端口被認爲是開放的,若是鏈接不能成功創建,端口被認爲是關閉的。

相關文章
相關標籤/搜索