掃描者:1.1.1.1
被掃描者:2.2.2.2nginx
0x00 介紹
在平常工做對目標信息收集時,咱們常常用到nmap這款網絡探測工具和安全/端口掃描器,雖然咱們關注的是結果(如目標開啓了哪些危險端口,什麼操做系統等等),如今,跟我來看一個簡單的例子,看看nmap掃描時到底作了什麼?和咱們看到的結果有什麼不一樣?vim
0x01 命令選項
首先,咱們來介紹下nmap -sS和 -p 選項:
-sS (TCP SYN掃描)
SYN掃描做爲默認的也是最受歡迎的掃描選項,是有充分理由的。 它執行得
很快,在一個沒有入侵防火牆的快速網絡上,每秒鐘能夠掃描數千個 端口。
SYN掃描相對來講不張揚,不易被注意到,由於它歷來不完成TCP鏈接。 它也
不像Fin/Null/Xmas,Maimon和Idle掃描依賴於特定平臺,而能夠應對任何兼
容的 TCP協議棧。 它還能夠明確可靠地區分open(開放的), closed(關閉
的),和filtered(被過濾的) 狀態緩存
它經常被稱爲半開放掃描, 由於它不打開一個徹底的TCP鏈接。它發送一
個SYN報文, 就像您真的要打開一個鏈接,而後等待響應。 SYN/ACK表示端
口在監聽 (開放),而 RST (復位)表示沒有監聽者。若是數次重發後仍沒響
應, 該端口就被標記爲被過濾。若是收到ICMP不可到達錯誤 (類型3,代碼1
,2,3,9,10,或者13),該端口也被標記爲被過濾。安全
-p <port ranges> (只掃描指定的端口)
該選項指明您想掃描的端口,覆蓋默認值。 單個端口和用連字符表示的端口
範圍(如 1-1023)均可以。 範圍的開始以及/或者結束值能夠被省略, 分別
致使Nmap使用1和65535。因此您能夠指定 -p-從端口1掃描到65535。 若是您
特別指定,也能夠掃描端口0。 對於IP協議掃描(-sO),該選項指定您但願掃
描的協議號 (0-255)。服務器
當既掃描TCP端口又掃描UDP端口時,您能夠經過在端口號前加上T: 或者U:指
定協議。 協議限定符一直有效您直到指定另外一個。 例如,參數 -p U:53
,111,137,T:21-25,80,139,8080 將掃描UDP 端口53,111,和137,同
時掃描列出的TCP端口。注意,要既掃描 UDP又掃描TCP,您必須指定 -sU ,
以及至少一個TCP掃描類型(如 -sS,-sF,或者 -sT)。若是沒有給定協議限
定符, 端口號會被加到全部協議列表。
0x02 被掃描者先運行開始抓包
[root@2.2.2.2_Server ~]# tcpdump -tnn -i eth1 ip host 1.1.1.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 1.1.1.1 > 2.2.2.2: ICMP echo request, id 59748, seq 0, length 8
IP 2.2.2.2 > 1.1.1.1: ICMP echo reply, id 59748, seq 0, length 8
IP 1.1.1.1 > 2.2.2.2: ICMP time stamp query id 35654 seq 0, length 20
IP 2.2.2.2 > 1.1.1.1: ICMP time stamp reply id 35654 seq 0: org 00:00:00.000, recv 16:57:19.208, xmit 16:57:19.208, length 20
IP 1.1.1.1.43085 > 2.2.2.2.80: Flags [.], ack 1250535980, win 1024, length 0
IP 2.2.2.2.80 > 1.1.1.1.43085: Flags [R], seq 1250535980, win 0, length 0
IP 1.1.1.1.43085 > 2.2.2.2.443: Flags [S], seq 1250535980, win 1024, options [mss 1436], length 0
IP 2.2.2.2.443 > 1.1.1.1.43085: Flags [S.], seq 2628103251, ack 1250535981, win 14600, options [mss 1460], length 0
IP 1.1.1.1.43085 > 2.2.2.2.443: Flags [R], seq 1250535981, win 0, length 0
IP 1.1.1.1.43341 > 2.2.2.2.2121: Flags [S], seq 1693928585, win 1024, options [mss 1436], length 0
IP 2.2.2.2.2121 > 1.1.1.1.43341: Flags [S.], seq 3143359954, ack 1693928586, win 14600, options [mss 1460], length 0
IP 1.1.1.1.43341 > 2.2.2.2.2121: Flags [R], seq 1693928586, win 0, length 0網絡
0x03 掃描者開始掃描
[root@1.1.1.1_Server ~]# nmap -sS -p 2121 2.2.2.2tcp
Starting Nmap 6.47 ( http://nmap.org ) at 2017-03-24 00:56 CST
Nmap scan report for 2.2.2.2
Host is up (0.14s latency).
PORT STATE SERVICE
2121/tcp open ccproxy-ftp工具
Nmap done: 1 IP address (1 host up) scanned in 0.62 seconds大數據
0x04 數據包分析
首先,咱們能夠把抓到的包分爲4部分:
0x041
IP 1.1.1.1 > 2.2.2.2: ICMP echo request, id 59748, seq 0, length 8
IP 2.2.2.2 > 1.1.1.1: ICMP echo reply, id 59748, seq 0, length 8
第一個數據包是掃描者向被掃描者發出ICMP請求回顯(類型爲8即ping)
第二個數據包是被掃描者發給掃描者的ICMP回顯應答(類型爲0)
能夠看出nmap第一個掃描項是先用ping來檢測主機是否存活,接下來,咱們看第二部分:
0x042
IP 1.1.1.1 > 2.2.2.2: ICMP time stamp query id 35654 seq 0, length 20
IP 2.2.2.2 > 1.1.1.1: ICMP time stamp reply id 35654 seq 0: org 00:00:00.000, recv 16:57:19.208, xmit 16:57:19.208, length 20
第三個數據包是掃描者向被掃描者發出ICMP時間戳查詢
第四個數據包是被掃描者發給掃描者的ICMP時間戳應答
簡單介紹下時間戳:ICMP時間戳請求容許系統向另外一個系統查詢當前的時間。返回的建議值是自午夜開始計算的毫秒數,協調的統一時間(Coordinated Universal Time ,UTC)(早起的參考手冊認爲UTC是格林尼治時間)。
這裏不過多介紹,有興趣的朋友能夠看一下《TCP/IP詳解 卷1:協議》一書的53-56頁,其中詳細講解了ICMP時間戳請求與應答。
0x043
IP 1.1.1.1.43085 > 2.2.2.2.80: Flags [.], ack 1250535980, win 1024, length 0
IP 2.2.2.2.80 > 1.1.1.1.43085: Flags [R], seq 1250535980, win 0, length 0
第五個數據包是掃描者使用本地43085端口發往被掃描者80端口的數據包,並明確說明我但願收到你回覆的1250535980號seq包,我能接受的window size是1024個緩存窗口大小,長度爲0
第六個數據包是被掃描者回應給掃描者的RST(復位)數據包,前面0x01部分成色字明確標明客戶端迴應了SYN/ACK表示端口在監聽 (開放),而 RST (復位)表示沒有監聽者。若是數次重發後仍沒響應,該端口就被標記爲被過濾。因此能夠判斷被掃描者2.2.2.2 80端口除於關閉狀態,但博主認爲此處存在誤報,好比,若是我不想訪客使用IP地址的方式來訪問個人博客,那我就能夠在nginx配置文件中這樣配置:
# vim /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
server_name _;
return 444;
}
#return後續的配置無效,非標準的444代碼能夠強制關閉服務器與客戶端的鏈接而不返回任何響應信息給客戶端
如上,這樣明明我開啓了80端口,但數據包中卻顯示我沒有監聽80端口,但若是你用nmap –Ss –p 80 2.2.2.2 直接掃描80端口你會發現,即便是RST(復位)flag,也顯示80端口是開放的,這就是nmap神奇的地方。
flag是tcp包中的標誌信息,[S]是SYN標誌,F(FIN),P(PUSH),R(RST),"."(沒有標記)操作系統
0x044
IP 1.1.1.1.43085 > 2.2.2.2.443: Flags [S], seq 1250535980, win 1024, options [mss 1436], length 0
IP 2.2.2.2.443 > 1.1.1.1.43085: Flags [S.], seq 2628103251, ack 1250535981, win 14600, options [mss 1460], length 0
IP 1.1.1.1.43085 > 2.2.2.2.443: Flags [R], seq 1250535981, win 0, length 0
回過頭來咱們簡單看下第七個數據包:鏈接被掃描者443端口….略
第八個數據包中被掃描者回應了掃描者SYN創建鏈接的請求,並標明我收到了你的1250535980序列號的包,而且我但願下一個數據包收到你的1250535981號包,個人窗口大小是14600,我能接受的每一個TCP包所能攜帶的最大數據量是1460個字節大小
第九個數據包掃描者直接發給被掃描者一個序列號爲1250535981的包,但長度爲0,windos size爲0表示RST(復位),主動斷開鏈接
0x045
IP 1.1.1.1.43341 > 2.2.2.2.2121: Flags [S], seq 1693928585, win 1024, options [mss 1436], length 0
IP 2.2.2.2.2121 > 1.1.1.1.43341: Flags [S.], seq 3143359954, ack 1693928586, win 14600, options [mss 1460], length 0
IP 1.1.1.1.43341 > 2.2.2.2.2121: Flags [R], seq 1693928586, win 0, length 0
第十個數據包也是同樣,掃描者向被掃描者發送SYN請求鏈接2121端口
第十一個數據包被掃描者回應說,我收到你的請求,你連把,我但願下一個收到你的1693928586號包
第十二個數據包掃描者回復說,給你1693928586號包,但我要RST(復位)主動斷開鏈接。
好吧,感謝你可以耐心看到結尾,若是有喜歡網絡分析的朋友,推薦給大家三本書:《TCP/IP 詳解 卷1:協議》,《Wireshark網絡分析就這麼簡單》(林沛滿2014年出版)和《Wireshark網絡分析的藝術》(林沛滿2016年出版)