前言
在打靶場的過程中使用Nmap時發現點小問題,借此機會詳細分析下情況,于是有了這篇文章。
本文包含以下內容:
- 1. Nmap抓包分析
- 2. 內網下繞過windows防火墻掃描存活主機
這里主要是針對Nmap進行討論,實戰中當然哪個快用哪個。不過萬變不離其宗,哪怕稍微了解下其原理都受益無窮。
防火墻
這里的防火墻值得是Windows server自帶的防火墻,主要繞過其兩個防御規則:
1.禁止ICMP回顯
2.隱藏模式
具體見 Stealth Mode in Windows Firewall with Advanced Security,大意為:不會使用ICMP不可達響應UDP查詢,不使用RST響應TCP查詢。默認開啟。
https://shamsher-khan-404.medium.com/understanding-nmap-scan-with-wireshark-5144d68059f7
Nmap抓包分析 拓撲圖-sn :禁用端口掃描
-P* 用于選擇不同的PING方法,用于存活掃描
關閉防火墻便于查看數據包
主機發現(Ping) -PS (TCP SYN)
TCP SYN Ping:發送單個TCP SYN包到指定端口檢測主機是否存活,默認80端口。該掃描就是經典的半開放掃描。
請求局域網主機135端口(開啟)
nmap -sn -PS135 172.16.1.128-vvv -n --disable-arp-ping
#-n 禁用DNS解析
注意nmap掃局域網存活主機都會預先進行arp掃描,在這里禁用了端口掃描,意味著nmap只會進行存活掃描,當nmap進行arp掃描后發現主機存活就不會進行后續操作,wireshark也就抓不到包,所以使用 --disable-arp-ping 禁用arp掃描。
image image
image
請求局域網主機666端口(關閉)
nmap -sn -PS666 172.16.1.128-vvv -n --disable-arp-ping
image image
image
請求遠程主機135端口(開啟):
還是這里會發現,和掃局域網比起來多了很多包,為什么和掃局域網情況不一樣?
還是fofa隨便找個開啟135端口的IP:
image
image
這里會發現,和掃局域網比起來多了很多包。
image
請求遠程主機6666端口(關閉):
image
奇怪的是,明明遠程主機返回了RST/ACK包,但nmap沒有接收到。
image
為什么會有這樣的差別?翻了翻nmap官方文檔,其中有這樣一句話:
The RST packet is sent by the kernel of the machine running Nmap in response to the unexpected SYN/ACK, not by Nmap itself
RST報文是運行Nmap的機器的內核為響應意外的SYN/ACK而發送的,而不是Nmap本身。
突然想到,我的kali是放在vmware,以nat形式接入網絡,這樣偶爾會出現點小問題。
于是我在windows上裝了個nmap再進行測試:
image
再看下抓包
image
image
發現這里沒發RST包
image
關掉防火墻再試,還一下發倆RST……
image
接下來將vmware網絡模式換為橋接,發現正常了。說明是NAT網絡的問題。
-PA (TCP ACK)
TCP ACK Ping:發送單個TCP ACK包到指定端口檢測主機是否存活,默認80端口
請求局域網主機135端口(開啟)
一般ACK包是雙方建立起連接發送的,但實際上不存在連接,無論端口是否開啟,遠程主機都會用RST包來回應,以此來判斷主機存活。當然很多防御策略都會丟棄無效包防止被檢測。
nmap -sn -PA135 172.16.1.128-vvv -n --disable-arp-ping
image image
image
請求局域網主機666端口(關閉)
nmap -sn -PA666 172.16.1.128-vvv -n --disable-arp-ping
image image -PU (UDP)
UDP Ping:發送UDP包到指定端口檢測主機是否存活,默認40125端口。特定端口會發送特定的UDP包以便于獲取更好的響應。
按照最新官方文檔解釋,該包發送大概有以下幾種情況:
- 1. 端口關閉->返回ICMP端口不可達包->判斷主機存活。
- 2. 返回其他ICMP錯誤,如主機/網絡不可達或TTL超標等->判斷停機。
- 3. 端口開啟且該服務不響應—>nmap未接收到返回包->判斷停機。
- 4. 端口關閉且協議不匹配->返回ICMP端口不可達包->判斷主機存活。
這就是為什么默認要用40125這么冷門的端口,避免有服務使用該端口。
nmap -sn -PA135 172.16.1.128-vvv -n --disable-arp-ping
返回ICMP端口不可達,仍舊判斷出主機存活。
image image
局域網沒什么問題,掃外網的話同樣有前文說的Vmware Nat網絡問題,注意一下就好。
-PY (SCTP INIT)
SCTP INIT Ping:發送包含最小INIT塊的SCTP包到指定端口檢測主機是否存活,默認80端口。SCTP可看做TCP協議的改版。
nmap -sn -PY135 172.16.1.128-vvv -n --disable-arp-ping
返回協議不可達,以此判斷出主機存活。
image image -PR (ARP)
ARP Ping:ARP掃描,Nmap掃內網最常用的方式。
nmap -sn -PR 172.16.1.128-vvv -n
接收到arp返回包,判斷主機存活。
image image -PE/PP/PM (ICMP)
ICMP Ping:三種ICMP標準請求,如果防火墻關掉ICMP回顯則收不到reply。
第一個就是常說的Ping。
image
第二個是時間戳請求
image
第三個是地址掩碼請求
image
ICMP標準還有個信息請求,但目前未被廣泛支持,所以Nmap沒有做相關功能。
-PO (IP Protocol)
IP Protocol Ping:默認發送ICMP(協議1)、IGMP(協議2)和IP-in-IP(協議4),更改協議需要改nmap.h文件中的 DEFAULT_PROTO_PROBE_PORT_SPEC 。目前意義不大。
nmap -sn -PO -vv 172.16.1.128-n --disable-arp-ping
image image 端口掃描(Scan)
其實端口掃描(Scan)很多參數和主機發現(Ping)的前期抓包情況是一樣的。Ping相當于點到為止,根據回顯發現主機存活即可,而Scan還需要進一步分析,判斷端口是否開啟、判斷什么服務等。
由于大部分Scan參數與Ping參數請求包一致,而部分Scan參數在本文中并未體現,所以暫且貼出三個參數抓包情況。
-sS (TCP SYN)
TCP SYN scan:經典的半開放掃描。
nmap -Pn-sS -p 135-vvv 172.16.1.128-n
image
可見發送的請求包和 -PS 是一樣的,至于Nmap如何判斷如何分析,這里就不關心了。
image -sT (TCP connect)
TCP connect scan:TCP連接掃描,三次握手確認目標后直接發送RST結束當前連接,跳過四次揮手階段。
端口開啟
nmap -Pn-sT -p 135172.16.1.128-vvv -n --disable-arp-ping
# -Pn 不進行主機存活探測
image image
image
端口關閉
image image
image
可以發現, -sT 和 -PS 兩個掃描的抓包情況十分接近,只有收到SYN/ACK返回包后應答的不同,這也是 -PS 被稱為半開放掃描的原理。
-sU (UDP)
UDP scans:發送UDP包進行掃描
nmap -Pn-sU -p 135172.16.1.128-vvv -n --disable-arp-ping
這里顯示 open|filtered ,為什么呢?
因為UDP包請求到開放的端口,經常沒有回顯。而且這里使用 -Pn 跳過了主機存活探測,默認主機存活,又因為收不到回顯,所以nmap無法判斷該端口是開啟還是被防御規則過濾。
image
抓包情況和 -PU 基本一致:
image 繞防火墻測試 拓撲圖
測試 nmap -sn -PS135 172.16.1.128-vvv -n --disable-arp-ping
未收到[SYN, ACK]返回包,判斷主機離線。
nmap -sn -PA135 172.16.1.128-vvv -n --disable-arp-ping
未收到[RST, ACK]返回包,判斷主機離線。
nmap -sn -PU135 172.16.1.128-vvv -n --disable-arp-pingnmap -sn -PY135 172.16.1.128-vvv -n --disable-arp-ping
nmap -sn -PR 172.16.1.128-vvv -n
成功收到ARP回顯,判斷主機存活:
這樣一圈測試下來,發現只有ARP掃描可以。原因也很簡單,ARP掃描不會走靶機防火墻,而是以廣播的形式進行掃描;而其他參數不是被禁ICMP回顯規則攔截就是被隱身模式過濾。
后面又嘗試了常用的nbt掃描、smb掃描、以及Nmap其他參數,仍然繞不過防火墻。
WINRM
難道就止步于此了嗎?突然想到,之前用Ladon插件掃的時候,沒見什么防火墻攔截。
于是拿Ladon測試了下,選多協議探測存活主機,一掃,果真有:
WIMRM,很熟悉,這也能拿來掃內網?
簡單概述下:WIMRM是windows自帶的服務,開啟服務后防火墻默認放心5985(HTTP)/5986(HTTPS)端口,平常拿來橫向移動。
由于沒搜到Ladon源碼怎么實現該掃描,谷歌找了找WINRM的文章: WinRM P.NETration Testing
其中有一行代碼:
test-wsman-computername"172.16.1.128"
很快就有回顯:
隨便輸了個其他IP,報錯:
顯然,使用該服務也可以繞過Windows防火墻進行存活主機掃描。
結語
總結一下:
- 1. arp掃描可以使用工具,但到了掃內網的情況,都是拿shell了,所以直接cmd命令: arp/a 即可。
- 2. WINRM test - wsman - computername "172.16.1.128"
至于如何繞防火墻進行端口掃描,留到以后再說吧。