原作者為 Rich JanKowski (rich at linuxsecurity.com)
2/20/2000/17:33
1. 尋找目標 - 縮小範圍
當你要檢測一個網域中有哪些機器會回應 ping 的 ICMP echo 時, 可使用以下 nmap 指令:
ICMP_REQUEST <=> ICMP_ECHO
nmap -sP 192.168.0.1/24
因為有些作業系統現在可以設定不回應 ping 的 ICMP 封包(如linux), 你可以用 TCP 的協定來輔助上面所得的主機列表,而 TCP 的協定中, 有一項是指定 port 的參數,所以我們可以專門掃 80 port (一般是跑 htttp/web 服務):
TCP_SYN <=> TCP_ACK or TCP_RST
nmap -sP -PT80 192.168.0.1/24
而掃描網域的動作除了以上所述外,nmap 還提供了 UDP 和利用更高段的 TCP 協定來掃描,這些留待讀者自行去閱讀 nmap 的指令說明.
2. 尋找目標 - 針對單機的掃描
針對單機時,我們直覺的想到用 TCP port scanning 的指令去掃描看那台主機開了哪些 port 對外, 指令如下:
nmap -sT 192.168.0.1
但是這個 -sT 的參數,在 nmap 的 implement 裡是用 connect() system call 來完成的,因此你在得到對方資訊的同時,也在對方主機的 daemon 上留下了可觀的紀錄資訊,如你的位址,主機名稱,如果你有裝 ident 軟體的話還可能留下使用者帳號的資訊.
也因此,如果我們要取得對方主機的名稱,但是又不想留下自己主機太多的資訊的話,就可以用剛剛所提到更高段的 TCP 協定特點性達到同樣目標, stealth scanning.
這個方法就是騙對方說我要進去,但又沒真的進去要掃描的 port, 一般 TCP 協定是由TCP_SYN, TCP_ACK, TCP_ACK2, TCP_ACK3...
..直到 TCP_RST 出現才算完成的,但是這裡我們並不按協定走, 當我們送完 TCP_SYN 給對方,對方又回傳 TCP_ACK 時,我們就可以知道這個 port 有開啟,否則的話對方回傳的會是 TCP_RST, 表示這個 port 沒有開啟,要做到 stealth scanning 的指令如下:
nmap -sS 192.168.0.1
要注意的是,這個方法因為太常被使用,幾乎每個 IDS 系統都會紀錄這種封包,因此,當你要掃描的是有在注意網路安全的主機時,建議你試試更高段的 stealth FIN,X'mas tree 或 NULL scans.
這三種方法就是送出加料 封包到對方 port, 當這個 port 沒開啟時,主機會送出 RST 封包來,而有開啟的 port 則不會理會 FIN 封包,不過要注意的是, 因為 Microsoft 的 TCP 協定不同於公定的協定, 用這幾招對 Microsoft 的主機就沒效用了.
stealth FIN 在封包上加了 FIN flag,他的指令如下
nmap -sF 192.168.0.1
Xmas tree 在封包上加了 FIN, URG, PUSH flag , 他的指令如下
nmap -sX 192.168.0.1
NULL packet 在封包上就完全沒設 flag, 他的指令如下:
nmap -sN 192.168.0.1
3. 單機掃描 - 變化型 UDP
除了一般 TCP daemon 的程式常出漏洞外, 還有像 syslogd 用到 UDP 封包, NFS daemon, NIS daemon 等用到 RPC 協定的 ports 也蠻常見的喔,在這邊的做法是送出 0 byte data 的 UDP 封包給對方, 如果對方回傳 port unreachable 的訊息, 就表示這個 port 沒打開,而且程式還會視對方回傳 error 的速度適時的減慢送出的速度,也因此 UDP 掃描會慢一些,使用 UDP 掃描的指令如下:
nmap -sU 192.168.0.1
4. 鎖定目標 - 確定對方 OS 型號及版本
當要進攻對方主機時,除了知道有哪些 daemon 在跑以外, 如果能知道他是跑什麼 OS ,那不就可以直接套用某個 OS 的 exploit 去試各種 architecture 的 shell code 就好了嗎?
現在支援最多 architeture 的OS也才支援到 6 種, 最多試六次就可以進攻, 這樣不是更接近敵方了嗎?
但是 OS 要怎麼辨認? 我們可以想想人類怎麼互相辨認? 臉孔, 但是, 可以戴面具, 面具在市面上幾乎隨手買得到( 修改 login prompt, 修改 daemon message ...), 那指紋呢? 一般人不可能無聊到隨便改指紋吧,對, OS 因為在 implement 時也會有針對一些網路協定上面沒定義的部份而有"特色",更有一些 OS 連 implement 的協定都跟別人差一大截 ( Microsoft ),所以我們只要搜集足夠的 OS finger print 就可以他回傳的封包判定對方的身份了.
採取 OS finger print 的技術部份,可以用 FIN 封包送給對方, 看看他會回傳什麼,或是在 SYN 封包上加上協定未定義的 flag 看對方的反應,或是直接採樣他的 TCP 起始序號等等測試,如此測試,再加上採樣的動作以判定特定 OS 的 finger print,也因為 TCP 起始序號方法的使用,判定OS的同時也要運用到 port scanning (-sS)的動作,而非ping scan,使用 OS finger print
的指令是 -O 選項:
nmap -sS -O 192.168.0.1
當你使用 -O 選項時,你會注意到另一個訊息 "TCP Sequence Prediction", 這也告訴我們這個 OS 所 implement 的 TCP 是否可靠,如果 TCP 序號編排太簡單以至於我們可以預測他的 TCP 序號甚至複製出他的序號順序,那麼我們就可採用劫持法,直接取代原本和對方連線的連線,有興趣的人可以找 "session hijacking" 的 keyword 參考看看.
有關 -O 選項所會進行的測試列表如下:
Tseq: 有關 tcp 封包序號順序的方式。
T1 是送出 SYN 及其他 flag 的封包到已開啟的 port
T2 是送出 NULL 及其他 flag 的封包到已開啟的 port
T3 是送出有 SYN, FIN, URG, PSH 等 flag 的封包到已開啟的 port
T4 是送出有 ACK flag 的封包到已開啟的 port
T5 是送出 SYN 封包到未開啟的 port
T6 是送出 ACK flag 的封包到未開啟的 port
T7 是送出 FIN, PSH, URG flag 的封包到未開啟的 port
PU 是送出 UDP 封包到未開啟的 port
5. 鎖定主機 - 預估權限 ident
除了確定能夠進入對方主機以外,還能知道些什麼? 權限的大小, 以 UNIX 的權限機制來看,是以使用者來分別使用權限,那可能從網路上就知道對方跑的 daemon 權限大小嗎? 或者說,我們能知道對方是以哪一個使用者權限在跑的嗎? 可以, 感謝 ident 這個平時沒什麼用,現在派上用場的協定,只要我們問他(對方又剛好有開這個 daemon ),他就會回答了.
也因為 ident protocol 是以 tcp 協定的在跑的,我們要知道對方使用者時必須以 TCP 的掃描方式達到目標,指令選項是 -I:
nmap -sT -p 80 -I -O 192.168.0.1
如此就可得知對方的 web server, OS, 及權限,當然如果是 root, 那只能怪這個管理者太粗心大意了.對於那些想要用 ident 軟體, 又怕洩露太多資訊的管理者,請用 firewall 軟體(如 ipchains) 限制連線的網域吧.
6. 更多花樣- 任君挑選
"-PT" 選項, 這是搭配 ping scan 加上 TCP scan 主機或網域的時候使用.
有些主機擋住 ICMP 和 TCP 掃描時,會造成 nmap 無法使用的情況發生,這時候就可以用 "-P0" 取消 nmap 一開始的 TCP 掃描和 ICMP_ECHO 測試動作.
"-v" 打開詳細程序描述可以讓你知道 nmap 做了些什麼動作,而不用只是呆等結果出現.
"-p" 可以指定多個 ports, 讓你同時掃描特定 ports,集中火力
如以下指令可同時掃描 port 21/23/53/80 並判定 OS 型態:
nmap -sS -p 21,23,53,80 -O -v 192.168.0.1
7. 結論 - 快點開始用 nmap 檢查自己的網域安全性吧!
參考:https://nmap.org/