0x01 前言
nmap是滲透中嘗嘗用到的工具之一,在信息收集階段經常用到,現在主流的流量分析設備也將其流量加入了特征庫,
為了防止在探測階段IP就被封掉,對其的流量特征做一些簡單的修改有點用的。
由於沒有廠商設備檢測,故以下只是學習記錄一下思路。具體效果還待驗證。
參考鏈接
如何修改nmap, 重新編譯,bypass emergingthreats 的公開ids規則:
https://xz.aliyun.com/t/6002
nmap端口掃描技術:
https://nmap.org/man/zh/man-port-scanning-techniques.html
NmapbypassIDS:
https://github.com/al0ne/Nmap_Bypass_IDS
0x02 環境
VM虛擬機:
192.168.1.113 開放135,3389 防火牆禁止445入站
ubuntu:
編譯安裝nmap用,kali下編譯安裝存在點問題,坑太多了,以后有時間再去踩。
0x03 nmap探測的常用幾種方式
-sS (SYN掃描)
nmap默認端口掃描方式,執行半開掃描,不完成TCP握手流程。只向目標端口發送一個SYN報文,然后等待響應。
SYN/ACK表示端口在監聽 (開放),而 RST (復位)表示沒有監聽者。
如果多次重發后仍沒響應, 該端口就被標記為被過濾。
使用抓包工具可以完整的看到探測過程。
-sT (TCP掃描)
一般不推薦使用,因為會留下連接日志。
另外在調用一些高級掃描時(如HTTP),會調用這種連接方式。
使用抓包工具看其探測過程
-sU(UDP掃描)
DNS,SNMP,和DHCP是常常開放UDP的幾個服務,有些情況下會使用到。
由於UDP是無連接的,所以會面臨響應探測問題,探測時的端口是否開放還是被過濾的判斷,會讓Nmap超時然后再探測,以防探測幀或者響應丟失,導致探測時間增長。
關閉的端口常常是更大的問題。它們一般發回一個ICMP端口無法到達錯誤。
但是不像TCP發送的RST報文,許多主機在默認情況下限制ICMP端口不可到達消息。
如:Linux 2.4.20內核限制一秒鍾只發送一條目標不可到達消息。
抓包看一下,當只看到兩個UDP無內容包時,懵了一下。
查了一下發現除了某些特定端口會有響應返回,如137 用的NBNS,其他的全部都是沒有返回,原因是因為這台機器禁PING了,就是ICMP的返回包過不來。
所以沒法判斷端口是否關閉。
修改防火牆設置。
允許文件和打印機共享后確實可以ping主機了,但是ICMP回包還是有問題。
后來索性把防火牆關掉。
就可以明顯看到其是通過返回包來進行判斷的。
-sN;-sF;-sX (TCP Null,FIN,and Xmas掃描)
這個還是挺有意思的,首先這個不適用掃描windows、Cisco、bsdi、IBM的一些服務器,因為並不是完全遵守RFC 793這個協議。
這個協議會存在這種情況,當端口關閉時,任何不包含SYN,RST,或者ACK位的報文會導致 一個RST返回,而當端口開放時,應該沒有任何響應。
所以只要不包含SYN,RST,或者ACK, 任何其它三種(FIN,PSH,and URG)的組合都行。
而剛剛上面說的那些他們並不遵守這個,他們不管端口開放或關閉,都返回一個RST,導致Nmap判斷錯誤。
-sN 不設置任何標志位
-sF 只設置FIN標志位
-sX 設置FIN,PSH,和URG標志位
看一下探測過程,如果沒加參數,默認會先發送ICMP請求。
-sA(ACK 掃描)
用於探測防火牆狀態。ACK掃描探測報文只設置ACK標志位。
當掃描未被過濾的系統時, open
(開放的)和 closed
(關閉的) 端口 都會返回RST報文。
Nmap把它們標記為 unfiltered
(未被過濾的),無返回或者返回ICMP錯誤響應時標記為filtered。
防火牆關閉狀態下。返回unfiltered
防火牆開啟狀態下。返回filtered
-scanflags (自定義掃描)
可以使用 URG
, ACK
, PSH
, RST
, SYN
,and FIN
的任何組合,進行發包。詳細可以自己組合定制
-sI(Idlescan)
高級隱藏掃描。利用僵屍網絡執行掃描。詳細可看文章
(文章鏈接:https://nmap.org/book/idlescan.html)
-sV (版本檢測)-O (系統檢測)
可以看到在探測的時候會有標志和固定長度字符串問題。
IDS識別nmap掃描一般都是根據UDP data區域填充的'C'字符串,ICMP填充的是0(正常windows下是a-z,Linux下是0-9。
莫慌,接下就學習一下怎么去改這些個文件。
0x04 nmap的流量特征修改
Win值修改
通過觀察可以發現nmap在使用SYN掃描時Windows的窗口值值固定是1024。
(PS :window 關鍵字用於檢查特定的TCP窗口大小)
下面是正常連接3389時,發送的數據包。可以看到win值明顯不一樣。
修改tcpip.cc文件中tcp->th_win的值,查詢TCP中win這個值的信息發現,
默認最大為65535。
所以應該在此范圍內都可以。
但是要考慮已公開的規則,如之前大佬寫的bypass emergingthreats這篇,這個就過濾了2048 1024 3072 4096。
后來因某些原因,把nmap編譯到了雲服務器上,抓包的話就需要tcpdump了。
tcpdump -i eth0 -t -s 0 -c 100 host IP
關鍵詞修改
根據規則,一個一個去修改文件即可。nmap,nm,nm@p,OR sqlspider等等,
主要的就是SIP文件和一些常用的腳本文件。
這些個就是從emergingthreats的規則中提取的。
UDP探測時填充值修改
osscan2.cc
static u8 patternbyte = 0x43; /* character 'C' /
替換為 static u8 patternbyte = 0x46; / character 'F' */
重新編譯后再去掃描,內容已經換了,長度應該也是可以調整。
u8 packet[328]; /* 20 IP hdr + 8 UDP hdr + 300 data */
這里還沒測試,感興趣可以自己去定義,看會不會有什么問題。
0x05 nmap編譯安裝
nmap編譯時可能會遇到如下錯誤,幾乎都是缺少特定的庫導致的,
所以編譯安裝時需要安裝以下庫。
編譯環境是基於Ubuntu的,其他環境庫的名字可能不同,遇到編譯報錯可百度找對應解決方法即可。
apt install flex bison libssl-dev
./configure --without-zenmap
make && make install
0x06 總結
可修改文件及修改處
6.1、修改namp默認win窗口值。
tcpip.cc
tcp->th_win = hosts(1-65535)
6.2、修改nmap-service-probes文件中關鍵詞
nmap,nm@nm,nm2@nm2,nm@p,nm,0PT10NS sip
這些值酌情替換。
6.3、修改腳本中的值
-
nselib/http.lua
USERAGENT = stdnse.getscript_args('http.useragent')
-
nselib/mssql.lua
搜索Nmap NSE然后替換
-
nselib/sip.lua
搜索Nmap NSE然后替換
-
scripts/http-sql-injection.nse
搜索sqlspider然后替換
-
scripts/ssl-heartbleed.nse
搜索Nmap ssl-heartbleed替換
-
nselib/rdp.lua
local cookie = "mstshash=nmap"
6.4、修改使用-O參數發包填充內容
osscan2.cc
static u8 patternbyte = 0x43; /* character 'C' /
替換為 static u8 patternbyte = 0x46; / character 'F' */