0×00 簡單介紹
這一章在博主我個人看來,對於web滲透的學習意義還是非常重大的。建議大家深度學習一下各種掃描的原理。
另外這篇文章針對的各種網絡掃描分析,用的是nmap,同時也有助於大家理解nmap的原理與使用。
可以參考:nmap教程-常用命令精華集合
“知己知彼,百戰不殆。”掃描探測,目的就是“知彼”,爲了提高攻擊命中率和效率,基本上常見的攻擊行爲都會用到掃描探測。
掃描探測的種類和工具太多了,攻擊者可以選擇現有工具或自行開發工具進行掃描,也可以根據攻擊需求採用不同的掃描方式。本文僅對Nmap
常見的幾種掃描探測方式進行分析。如:地址掃描探測、端口掃描探測、操作系統掃描探測、漏洞掃描探測(不包括Web
漏洞,後面會有單獨文章介紹Web
漏洞掃描分析)。
0×01 地址掃描探測
地址掃描探測是指利用ARP
、ICMP
請求目標網段,如果目標網段沒有過濾規則,則可以通過迴應消息獲取目標網段中存活機器的IP
地址和MAC
地址,進而掌握拓撲結構。
如:192.1.14.235
向指定網段發起ARP
請求,如果IP
不存在,則無迴應。
如果IP
存在,該IP
會通過ARP
迴應攻擊IP
,發送自己的MAC
地址與對應的IP
。
ARP
欺騙適用範圍多限於內網,通過互聯網進行地址掃描一般基於Ping
請求。
如:192.1.14.235
向指定網段發起Ping
請求,如果IP
存在,則返回Ping
reply
。
0×02 端口掃描探測
端口掃描是掃描行爲中用得最多的,它能快速獲取目的機器開啓端口和服務的情況。常見的端口掃描類型有全連接掃描、半連接掃描、祕密掃描和UDP
掃描。
1、全連接掃描
全連接掃描調用操作系統提供的connect()
函數,通過完整的三次TCP
連接來嘗試目標端口是否開啓。全連接掃描是一次完整的TCP連接。
1)如果目標端口開啓 攻擊方:首先發起SYN
包;
目標:返回SYN ACK
;
攻擊方:發起ACK
;
攻擊方:發起RST ACK
結束會話。
2)如果端口未開啓 攻擊方:發起SYN
包;
目標:返回RST ACK
結束會話。
如:192.1.14.235
對172.16.33.162
進行全連接端口掃描,首先發起Ping
消息確認主機是否存在,然後對端口進行掃描。
下圖爲掃描到TCP3389
端口開啓的情況。
下圖爲掃描到TCP1723
端口未開啓的情況。
2、半連接掃描
半連接掃描不使用完整的TCP
連接。攻擊方發起SYN
請求包;如果端口開啓,目標主機迴應SYN
ACK
包,攻擊方再發送RST
包。如果端口未開啓,目標主機直接返回RST
包結束會話。
如:192.1.14.235
對172.16.33.162
進行半連接端口掃描,首先發起Ping
消息確認主機是否存在,然後對端口進行掃描。
掃描到TCP80
端口開啓。
TCP23
端口未開啓。
3、祕密掃描TCPFIN
TCP FIN
掃描是指攻擊者發送虛假信息,目標主機沒有任何響應時認爲端口是開放的,返回數據包認爲是關閉的。
如下圖,掃描方發送FIN
包,如果端口關閉則返回RST
ACK
包。
4、祕密掃描TCPACK
TCP ACK
掃描是利用標誌位ACK
,而ACK
標誌在TCP
協議中表示確認序號有效,它表示確認一個正常的TCP
連接。但是在TCP
AC
K掃描中沒有進行正常的TCP
連接過程,實際上是沒有真正的TCP
連接。所以使用TCP
ACK
掃描不能夠確定端口的關閉或者開啓,因爲當發送給對方一個含有ACK
表示的TCP
報文的時候,都返回含有RST
標誌的報文,無論端口是開啓或者關閉。但是可以利用它來掃描防火牆的配置和規則等。
5、UDP端口掃描
前面的掃描方法都是針對TCP
端口,針對UDP
端口一般採用UDP
ICMP
端口不可達掃描。
如:192.1.14.235
對172.16.2.4
發送大量UDP
端口請求,掃描其開啓UDP
端口的情況。
如果對應的UDP
端口開啓,則會返回UDP
數據包。
如果端口未開啓,則返回“ICMP
端口不可達”消息。
0×03 操作系統的探測
NMAP
進行操作系統的探測主要用到的是OS
探測模塊,使用TCP/IP
協議棧指紋來識別不同的操作系統和設備。Nmap
內部包含了2600
多種已知操作系統的指紋特徵,根據掃描返回的數據包生成一份系統指紋,將探測生成的指紋與nmap-os-db
中指紋進行對比,查找匹配的操作系統。如果無法匹配,則以概率形式列舉出可能的系統。
如:192.168.1.50
對192.168.1.90
進行操作系統的掃描探測。首先發起Ping
請求,確認主機是否存在。
發起ARP
請求,獲取主機MAC
地址。
進行端口掃描。
根據綜合掃描情況,判斷操作系統類型。
0×04 漏洞掃描
操作系統的漏洞探測種類很多,本文針對“smb-check-vulns
”參數就MS08-067
、CVE2009-3103
、MS06-025
、MS07-029
四個漏洞掃描行爲進行分析。
攻擊主機:192.168.1.200
(Win7),目標主機:192.168.1.40
(WinServer
03);
Nmap
掃描命令:nmap
--script=smb-check-vulns.nse --script-args=unsafe=1 192.168.1.40
。
1、端口掃描
漏洞掃描前,開始對目標主機進行端口掃描。
2、SMB協議簡單分析
由於這幾個漏洞多針對SMB服務,下面我們簡單瞭解一下NAMP
掃描行爲中的SMB命令。
SMB Command:Negotiate Protocol
(0×72):SMB協議磋商
SMB Command: Session Setup AndX
(0×73):建立會話,用戶登錄
SMB Command: Tree Connect AndX
(0×75):遍歷共享文件夾的目錄及文件
SMB Command: NT Create AndX
(0xa2):打開文件,獲取文件名,獲得讀取文件的總長度
SMB Command: Write AndX
(0x2f):寫入文件,獲得寫入的文件內容
SMB Command:Read AndX
(0x2e):讀取文件,獲得讀取文件內容
SMB Command: Tree Disconnect
(0×71):客戶端斷開
SMB Command: Logoff AndX
(0×74):退出登錄
3、MS08-067漏洞
(1)MS08-067漏洞掃描部分源碼如下:
function check_ms08_067(host) if(nmap.registry.args.safe ~= nil) then return true, NOTRUN end if(nmap.registry.args.unsafe == nil) then return true, NOTRUN end local status, smbstate local bind_result, netpathcompare_result -- Create the SMB session \\創建SMB會話 status, smbstate = msrpc.start_smb(host, "\\\\BROWSER") if(status == false) then return false, smbstate end -- Bind to SRVSVC service status, bind_result = msrpc.bind(smbstate, msrpc.SRVSVC_UUID, msrpc.SRVSVC_VERSION, nil) if(status == false) then msrpc.stop_smb(smbstate) return false, bind_result end -- Call netpathcanonicalize -- status, netpathcanonicalize_result = msrpc.srvsvc_netpathcanonicalize(smbstate, host.ip, "\\a", "\\test\\") local path1 = "\\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\..\\n" local path2 = "\\n" status, netpathcompare_result = msrpc.srvsvc_netpathcompare(smbstate, host.ip, path1, path2, 1, 0) -- Stop the SMB session msrpc.stop_smb(smbstate)
(2)分析
嘗試打開“\\BROWSER
”目錄,下一包返回成功。
同時還有其它嘗試,均成功,綜合判斷目標存在MS08-067
漏洞。通過Metasploit
進行漏洞驗證,成功溢出,獲取Shell。
4、CVE-2009-3103漏洞
(1)CVE-2009-3103漏洞掃描部分源碼如下:
host = "IP_ADDR", 445 buff = ( "\x00\x00\x00\x90" # Begin SMB header: Session message "\xff\x53\x4d\x42" # Server Component: SMB "\x72\x00\x00\x00" # Negociate Protocol "\x00\x18\x53\xc8" # Operation 0x18 & sub 0xc853 "\x00\x26"# Process ID High: --> normal value should be "\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe" "\x00\x00\x00\x00\x00\x6d\x00\x02\x50\x43\x20\x4e\x45\x54" "\x57\x4f\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31" "\x2e\x30\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00" "\x02\x57\x69\x6e\x64\x6f\x77\x73\x20\x66\x6f\x72\x20\x57" "\x6f\x72\x6b\x67\x72\x6f\x75\x70\x73\x20\x33\x2e\x31\x61" "\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4c" "\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00\x02\x4e\x54\x20\x4c" "\x4d\x20\x30\x2e\x31\x32\x00\x02\x53\x4d\x42\x20\x32\x2e" "\x30\x30\x32\x00" )
(2)分析
十六進制字符串“0x00000000
到202e30303200
”請求,通過ASCII
編碼可以看出是在探測NTLM
和SMB
協議的版本。無響應,無此漏洞。
5、MS06-025漏洞
(1)MS06-025漏洞掃描部分源碼如下:
--create the SMB session --first we try with the "\router" pipe, then the "\srvsvc" pipe. local status, smb_result, smbstate, err_msg status, smb_result = msrpc.start_smb(host, msrpc.ROUTER_PATH) if(status == false) then err_msg = smb_result status, smb_result = msrpc.start_smb(host, msrpc.SRVSVC_PATH) --rras is also accessible across SRVSVC pipe if(status == false) then return false, NOTUP --if not accessible across both pipes then service is inactive end end smbstate = smb_result --bind to RRAS service local bind_result status, bind_result = msrpc.bind(smbstate, msrpc.RASRPC_UUID, msrpc.RASRPC_VERSION, nil) if(status == false) then msrpc.stop_smb(smbstate) return false, UNKNOWN --if bind operation results with a false status we can't conclude anything. End
(2)分析
先後嘗試去連接“\router
”、“ \srvsvc
”路徑,均報錯,無RAS
RPC
服務。
6、MS07-029漏洞
(1)MS07-029漏洞掃描部分源碼如下:
function check_ms07_029(host) --check for safety flag if(nmap.registry.args.safe ~= nil) then return true, NOTRUN end if(nmap.registry.args.unsafe == nil) then return true, NOTRUN end --create the SMB session local status, smbstate status, smbstate = msrpc.start_smb(host, msrpc.DNSSERVER_PATH) if(status == false) then return false, NOTUP --if not accessible across pipe then the service is inactive end --bind to DNSSERVER service local bind_result status, bind_result = msrpc.bind(smbstate, msrpc.DNSSERVER_UUID, msrpc.DNSSERVER_VERSION) if(status == false) then msrpc.stop_smb(smbstate) return false, UNKNOWN --if bind operation results with a false status we can't conclude anything. end --call local req_blob, q_result status, q_result = msrpc.DNSSERVER_Query( smbstate, "VULNSRV", string.rep("\\\13", 1000), 1)--any op num will do --sanity check msrpc.stop_smb(smbstate) if(status == false) then stdnse.print_debug( 3, "check_ms07_029: DNSSERVER_Query failed") if(q_result == "NT_STATUS_PIPE_BROKEN") then return true, VULNERABLE else return true, PATCHED end else return true, PATCHED end end
(2)分析
嘗試打開“\DNSSERVER
”,報錯,未開啓DNS
RPC
服務。
0×05 總結
1、掃描探測可以說是所有網絡中遇到最多的攻擊,因其僅僅是信息蒐集而無實質性入侵,所以往往不被重視。但掃描一定是有目的的,一般都是攻擊入侵的前兆。
2、修補漏洞很重要,但如果在掃描層面進行防禦,攻擊者就無從知曉你是否存在漏洞。
3、掃描探測一般都無實質性通信行爲,同時大量重複性動作,所以在流量監測上完全可以做到阻止防禦。
0×00 簡單介紹
這一章在博主我個人看來,對於web滲透的學習意義還是非常重大的。建議大家深度學習一下各種掃描的原理。
另外這篇文章針對的各種網絡掃描分析,用的是nmap,同時也有助於大家理解nmap的原理與使用。
可以參考:nmap教程-常用命令精華集合
“知己知彼,百戰不殆。”掃描探測,目的就是“知彼”,爲了提高攻擊命中率和效率,基本上常見的攻擊行爲都會用到掃描探測。
掃描探測的種類和工具太多了,攻擊者可以選擇現有工具或自行開發工具進行掃描,也可以根據攻擊需求採用不同的掃描方式。本文僅對Nmap
常見的幾種掃描探測方式進行分析。如:地址掃描探測、端口掃描探測、操作系統掃描探測、漏洞掃描探測(不包括Web
漏洞,後面會有單獨文章介紹Web
漏洞掃描分析)。
0×01 地址掃描探測
地址掃描探測是指利用ARP
、ICMP
請求目標網段,如果目標網段沒有過濾規則,則可以通過迴應消息獲取目標網段中存活機器的IP
地址和MAC
地址,進而掌握拓撲結構。
如:192.1.14.235
向指定網段發起ARP
請求,如果IP
不存在,則無迴應。
如果IP
存在,該IP
會通過ARP
迴應攻擊IP
,發送自己的MAC
地址與對應的IP
。
ARP
欺騙適用範圍多限於內網,通過互聯網進行地址掃描一般基於Ping
請求。
如:192.1.14.235
向指定網段發起Ping
請求,如果IP
存在,則返回Ping
reply
。
0×02 端口掃描探測
端口掃描是掃描行爲中用得最多的,它能快速獲取目的機器開啓端口和服務的情況。常見的端口掃描類型有全連接掃描、半連接掃描、祕密掃描和UDP
掃描。
1、全連接掃描
全連接掃描調用操作系統提供的connect()
函數,通過完整的三次TCP
連接來嘗試目標端口是否開啓。全連接掃描是一次完整的TCP連接。
1)如果目標端口開啓 攻擊方:首先發起SYN
包;
目標:返回SYN ACK
;
攻擊方:發起ACK
;
攻擊方:發起RST ACK
結束會話。
2)如果端口未開啓 攻擊方:發起SYN
包;
目標:返回RST ACK
結束會話。
如:192.1.14.235
對172.16.33.162
進行全連接端口掃描,首先發起Ping
消息確認主機是否存在,然後對端口進行掃描。
下圖爲掃描到TCP3389
端口開啓的情況。
下圖爲掃描到TCP1723
端口未開啓的情況。
2、半連接掃描
半連接掃描不使用完整的TCP
連接。攻擊方發起SYN
請求包;如果端口開啓,目標主機迴應SYN
ACK
包,攻擊方再發送RST
包。如果端口未開啓,目標主機直接返回RST
包結束會話。
如:192.1.14.235
對172.16.33.162
進行半連接端口掃描,首先發起Ping
消息確認主機是否存在,然後對端口進行掃描。
掃描到TCP80
端口開啓。
TCP23
端口未開啓。
3、祕密掃描TCPFIN
TCP FIN
掃描是指攻擊者發送虛假信息,目標主機沒有任何響應時認爲端口是開放的,返回數據包認爲是關閉的。
如下圖,掃描方發送FIN
包,如果端口關閉則返回RST
ACK
包。
4、祕密掃描TCPACK
TCP ACK
掃描是利用標誌位ACK
,而ACK
標誌在TCP
協議中表示確認序號有效,它表示確認一個正常的TCP
連接。但是在TCP
AC
K掃描中沒有進行正常的TCP
連接過程,實際上是沒有真正的TCP
連接。所以使用TCP
ACK
掃描不能夠確定端口的關閉或者開啓,因爲當發送給對方一個含有ACK
表示的TCP
報文的時候,都返回含有RST
標誌的報文,無論端口是開啓或者關閉。但是可以利用它來掃描防火牆的配置和規則等。
5、UDP端口掃描
前面的掃描方法都是針對TCP
端口,針對UDP
端口一般採用UDP
ICMP
端口不可達掃描。
如:192.1.14.235
對172.16.2.4
發送大量UDP
端口請求,掃描其開啓UDP
端口的情況。
如果對應的UDP
端口開啓,則會返回UDP
數據包。
如果端口未開啓,則返回“ICMP
端口不可達”消息。
0×03 操作系統的探測
NMAP
進行操作系統的探測主要用到的是OS
探測模塊,使用TCP/IP
協議棧指紋來識別不同的操作系統和設備。Nmap
內部包含了2600
多種已知操作系統的指紋特徵,根據掃描返回的數據包生成一份系統指紋,將探測生成的指紋與nmap-os-db
中指紋進行對比,查找匹配的操作系統。如果無法匹配,則以概率形式列舉出可能的系統。
如:192.168.1.50
對192.168.1.90
進行操作系統的掃描探測。首先發起Ping
請求,確認主機是否存在。
發起ARP
請求,獲取主機MAC
地址。
進行端口掃描。
根據綜合掃描情況,判斷操作系統類型。
0×04 漏洞掃描
操作系統的漏洞探測種類很多,本文針對“smb-check-vulns
”參數就MS08-067
、CVE2009-3103
、MS06-025
、MS07-029
四個漏洞掃描行爲進行分析。
攻擊主機:192.168.1.200
(Win7),目標主機:192.168.1.40
(WinServer
03);
Nmap
掃描命令:nmap
--script=smb-check-vulns.nse --script-args=unsafe=1 192.168.1.40
。
1、端口掃描
漏洞掃描前,開始對目標主機進行端口掃描。
2、SMB協議簡單分析
由於這幾個漏洞多針對SMB服務,下面我們簡單瞭解一下NAMP
掃描行爲中的SMB命令。
SMB Command:Negotiate Protocol
(0×72):SMB協議磋商
SMB Command: Session Setup AndX
(0×73):建立會話,用戶登錄
SMB Command: Tree Connect AndX
(0×75):遍歷共享文件夾的目錄及文件
SMB Command: NT Create AndX
(0xa2):打開文件,獲取文件名,獲得讀取文件的總長度
SMB Command: Write AndX
(0x2f):寫入文件,獲得寫入的文件內容
SMB Command:Read AndX
(0x2e):讀取文件,獲得讀取文件內容
SMB Command: Tree Disconnect
(0×71):客戶端斷開
SMB Command: Logoff AndX
(0×74):退出登錄
3、MS08-067漏洞
(1)MS08-067漏洞掃描部分源碼如下:
function check_ms08_067(host) if(nmap.registry.args.safe ~= nil) then return true, NOTRUN end if(nmap.registry.args.unsafe == nil) then return true, NOTRUN end local status, smbstate local bind_result, netpathcompare_result -- Create the SMB session \\創建SMB會話 status, smbstate = msrpc.start_smb(host, "\\\\BROWSER") if(status == false) then return false, smbstate end -- Bind to SRVSVC service status, bind_result = msrpc.bind(smbstate, msrpc.SRVSVC_UUID, msrpc.SRVSVC_VERSION, nil) if(status == false) then msrpc.stop_smb(smbstate) return false, bind_result end -- Call netpathcanonicalize -- status, netpathcanonicalize_result = msrpc.srvsvc_netpathcanonicalize(smbstate, host.ip, "\\a", "\\test\\") local path1 = "\\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\..\\n" local path2 = "\\n" status, netpathcompare_result = msrpc.srvsvc_netpathcompare(smbstate, host.ip, path1, path2, 1, 0) -- Stop the SMB session msrpc.stop_smb(smbstate)
(2)分析
嘗試打開“\\BROWSER
”目錄,下一包返回成功。
同時還有其它嘗試,均成功,綜合判斷目標存在MS08-067
漏洞。通過Metasploit
進行漏洞驗證,成功溢出,獲取Shell。
4、CVE-2009-3103漏洞
(1)CVE-2009-3103漏洞掃描部分源碼如下:
host = "IP_ADDR", 445 buff = ( "\x00\x00\x00\x90" # Begin SMB header: Session message "\xff\x53\x4d\x42" # Server Component: SMB "\x72\x00\x00\x00" # Negociate Protocol "\x00\x18\x53\xc8" # Operation 0x18 & sub 0xc853 "\x00\x26"# Process ID High: --> normal value should be "\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe" "\x00\x00\x00\x00\x00\x6d\x00\x02\x50\x43\x20\x4e\x45\x54" "\x57\x4f\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31" "\x2e\x30\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00" "\x02\x57\x69\x6e\x64\x6f\x77\x73\x20\x66\x6f\x72\x20\x57" "\x6f\x72\x6b\x67\x72\x6f\x75\x70\x73\x20\x33\x2e\x31\x61" "\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4c" "\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00\x02\x4e\x54\x20\x4c" "\x4d\x20\x30\x2e\x31\x32\x00\x02\x53\x4d\x42\x20\x32\x2e" "\x30\x30\x32\x00" )
(2)分析
十六進制字符串“0x00000000
到202e30303200
”請求,通過ASCII
編碼可以看出是在探測NTLM
和SMB
協議的版本。無響應,無此漏洞。
5、MS06-025漏洞
(1)MS06-025漏洞掃描部分源碼如下:
--create the SMB session --first we try with the "\router" pipe, then the "\srvsvc" pipe. local status, smb_result, smbstate, err_msg status, smb_result = msrpc.start_smb(host, msrpc.ROUTER_PATH) if(status == false) then err_msg = smb_result status, smb_result = msrpc.start_smb(host, msrpc.SRVSVC_PATH) --rras is also accessible across SRVSVC pipe if(status == false) then return false, NOTUP --if not accessible across both pipes then service is inactive end end smbstate = smb_result --bind to RRAS service local bind_result status, bind_result = msrpc.bind(smbstate, msrpc.RASRPC_UUID, msrpc.RASRPC_VERSION, nil) if(status == false) then msrpc.stop_smb(smbstate) return false, UNKNOWN --if bind operation results with a false status we can't conclude anything. End
(2)分析
先後嘗試去連接“\router
”、“ \srvsvc
”路徑,均報錯,無RAS
RPC
服務。
6、MS07-029漏洞
(1)MS07-029漏洞掃描部分源碼如下:
function check_ms07_029(host) --check for safety flag if(nmap.registry.args.safe ~= nil) then return true, NOTRUN end if(nmap.registry.args.unsafe == nil) then return true, NOTRUN end --create the SMB session local status, smbstate status, smbstate = msrpc.start_smb(host, msrpc.DNSSERVER_PATH) if(status == false) then return false, NOTUP --if not accessible across pipe then the service is inactive end --bind to DNSSERVER service local bind_result status, bind_result = msrpc.bind(smbstate, msrpc.DNSSERVER_UUID, msrpc.DNSSERVER_VERSION) if(status == false) then msrpc.stop_smb(smbstate) return false, UNKNOWN --if bind operation results with a false status we can't conclude anything. end --call local req_blob, q_result status, q_result = msrpc.DNSSERVER_Query( smbstate, "VULNSRV", string.rep("\\\13", 1000), 1)--any op num will do --sanity check msrpc.stop_smb(smbstate) if(status == false) then stdnse.print_debug( 3, "check_ms07_029: DNSSERVER_Query failed") if(q_result == "NT_STATUS_PIPE_BROKEN") then return true, VULNERABLE else return true, PATCHED end else return true, PATCHED end end
(2)分析
嘗試打開“\DNSSERVER
”,報錯,未開啓DNS
RPC
服務。
0×05 總結
1、掃描探測可以說是所有網絡中遇到最多的攻擊,因其僅僅是信息蒐集而無實質性入侵,所以往往不被重視。但掃描一定是有目的的,一般都是攻擊入侵的前兆。
2、修補漏洞很重要,但如果在掃描層面進行防禦,攻擊者就無從知曉你是否存在漏洞。
3、掃描探測一般都無實質性通信行爲,同時大量重複性動作,所以在流量監測上完全可以做到阻止防禦。