滲透實(shí)戰(zhàn):信息收集到提權(quán)的完整攻擊鏈復(fù)盤)
1. 從CH4INRULZ_v1.0.1的入口點(diǎn)說起為什么信息收集決定了后續(xù)所有攻擊路徑CH4INRULZ_v1.0.1這個(gè)靶機(jī)在圈子里被討論得不少但大多數(shù)人把注意力放在了后面的提權(quán)和橫向移動(dòng)上反而忽略了最開始的信息收集階段。我前后完整打了三遍這臺(tái)機(jī)器第一遍卡在Web入口第二遍卡在權(quán)限提升第三遍才真正把整條鏈路走通?;剡^頭來看前兩遍之所以卡住根本原因不是技術(shù)不夠而是信息收集做得太粗糙——掃到端口就急著去試漏洞看到目錄就急著去找利用腳本結(jié)果漏掉了最關(guān)鍵的一些線索。這臺(tái)靶機(jī)的設(shè)計(jì)思路很有意思它不像有些靶機(jī)那樣把入口藏得特別深而是把線索分散在多個(gè)看似不相關(guān)的服務(wù)里。你需要把這些碎片拼起來才能看到完整的攻擊面。這也是為什么我把它稱為“信息收集的試金石”——如果你能在這臺(tái)機(jī)器上把信息收集做扎實(shí)后面遇到更復(fù)雜的靶機(jī)時(shí)思路會(huì)清晰很多。這篇文章主要面向已經(jīng)有一定滲透測試基礎(chǔ)、但經(jīng)常在信息收集階段卡住的朋友。我會(huì)從最開始的端口掃描講起一步步拆解每個(gè)服務(wù)背后可能隱藏的線索以及這些線索如何串聯(lián)成一條完整的攻擊路徑。文章里提到的所有工具和命令都是通用型的你可以直接在自己的實(shí)驗(yàn)環(huán)境里復(fù)現(xiàn)。需要提前說明的是我使用的實(shí)驗(yàn)環(huán)境是完全隔離的本地虛擬網(wǎng)絡(luò)所有操作都在合法授權(quán)的靶機(jī)上進(jìn)行。提示滲透測試的核心不是“拿到shell”而是“理解為什么能拿到shell”。每一條命令背后都要有明確的意圖否則你只是在碰運(yùn)氣。2. 端口掃描與服務(wù)識別別讓“全端口掃描”變成走過場2.1 第一次掃描就漏掉了關(guān)鍵端口問題出在參數(shù)上我第一遍打這臺(tái)機(jī)器的時(shí)候用的是最常規(guī)的nmap -sV -sC 目標(biāo)IP掃出來的結(jié)果看起來挺正常22端口開著SSH80端口跑著Web服務(wù)還有一個(gè)不常見的端口。當(dāng)時(shí)我覺得信息夠了直接去Web目錄爆破結(jié)果折騰了兩個(gè)小時(shí)一無所獲。后來換了一臺(tái)機(jī)器重新掃用了-p-參數(shù)做全端口掃描才發(fā)現(xiàn)之前漏掉了一個(gè)高位端口上跑著的服務(wù)——那個(gè)服務(wù)才是真正的入口。這里要說的第一個(gè)經(jīng)驗(yàn)是默認(rèn)的nmap掃描只覆蓋最常見的1000個(gè)端口很多靶機(jī)作者會(huì)故意把關(guān)鍵服務(wù)放在高位端口上。如果你不做全端口掃描很可能從一開始就偏離了方向。正確的做法是先用-p-做一次快速的全端口發(fā)現(xiàn)然后再針對開放的端口做詳細(xì)的服務(wù)識別。# 第一步全端口快速掃描只關(guān)注哪些端口是開放的 nmap -p- --min-rate 5000 -T4 目標(biāo)IP -oN all_ports.txt # 第二步針對開放端口做詳細(xì)的服務(wù)版本和默認(rèn)腳本掃描 nmap -sV -sC -p 22,80,其他開放端口 目標(biāo)IP -oN detailed_scan.txt--min-rate 5000這個(gè)參數(shù)的意思是每秒至少發(fā)送5000個(gè)探測包在本地實(shí)驗(yàn)環(huán)境里可以大幅縮短掃描時(shí)間。-T4是時(shí)間模板表示比較激進(jìn)的掃描速度。這兩個(gè)參數(shù)配合使用全端口掃描通常在一兩分鐘內(nèi)就能完成。2.2 服務(wù)版本信息里藏著作者留下的“彩蛋”拿到詳細(xì)掃描結(jié)果后不要只看端口號和服務(wù)名稱要仔細(xì)讀版本信息。CH4INRULZ_v1.0.1的Web服務(wù)版本號里有一個(gè)很細(xì)微的線索——具體的版本字符串我在這里不展開但你要養(yǎng)成一個(gè)習(xí)慣把版本號復(fù)制出來去搜索引擎里查一下這個(gè)特定版本有沒有已知的公開漏洞。很多時(shí)候靶機(jī)作者就是故意選用了一個(gè)有已知漏洞的舊版本等著你去發(fā)現(xiàn)。除了版本號還要注意掃描結(jié)果里的HTTP標(biāo)題、SSL證書信息、SSH的banner信息。這些地方經(jīng)常會(huì)出現(xiàn)一些看起來像用戶名、路徑或者提示詞的字符串。我在這臺(tái)機(jī)器上就從一個(gè)服務(wù)的banner里提取到了一個(gè)疑似用戶名的字符串后來在爆破SSH的時(shí)候直接用上了省了很多時(shí)間。2.3 用表格整理掃描結(jié)果避免信息混亂當(dāng)你掃了多個(gè)端口、跑了多個(gè)腳本之后輸出會(huì)非常長。我的習(xí)慣是整理成一張表格把關(guān)鍵信息提取出來端口服務(wù)版本信息值得注意的細(xì)節(jié)22SSH某版本banner里有一個(gè)疑似用戶名80HTTP某版本首頁源碼里有注釋掉的路徑高位端口自定義服務(wù)未知響應(yīng)里包含一串編碼后的字符串這張表格看起來簡單但它能幫你在后續(xù)分析時(shí)快速定位到關(guān)鍵信息不用反復(fù)去翻掃描日志。尤其是當(dāng)你同時(shí)打多臺(tái)靶機(jī)的時(shí)候這種整理習(xí)慣能節(jié)省大量時(shí)間。3. Web服務(wù)的目錄爆破與源碼分析從“找不到”到“找到了但看不懂”3.1 目錄爆破字典的選擇比工具本身更重要Web入口是這臺(tái)靶機(jī)最直接的攻擊面但也是最容易讓人受挫的地方。我第一遍用dirb的默認(rèn)字典跑了一遍只發(fā)現(xiàn)了幾個(gè)常規(guī)目錄沒有任何有價(jià)值的發(fā)現(xiàn)。第二遍換了gobuster字典換成了directory-list-2.3-medium.txt結(jié)果多發(fā)現(xiàn)了兩個(gè)目錄其中一個(gè)目錄里有一個(gè)文件上傳點(diǎn)。這里的關(guān)鍵不是工具而是字典。不同的字典覆蓋的路徑范圍不一樣有些字典偏重常見CMS的路徑有些字典包含更多自定義的備份文件后綴。我的建議是至少準(zhǔn)備三套字典分別覆蓋常見目錄、備份文件后綴、以及API接口路徑。在本地實(shí)驗(yàn)環(huán)境里你可以把幾套字典合并起來用雖然掃描時(shí)間會(huì)長一些但覆蓋率會(huì)高很多。# 用gobuster做目錄爆破指定擴(kuò)展名和線程數(shù) gobuster dir -u http://目標(biāo)IP/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,txt,bak -t 50 -o gobuster_result.txt-x參數(shù)指定了要嘗試的文件擴(kuò)展名-t 50表示50個(gè)并發(fā)線程。在本地環(huán)境里這個(gè)速度是可以接受的但如果靶機(jī)性能有限建議把線程數(shù)降到20左右避免把服務(wù)打掛。3.2 源碼里的注釋和JS文件往往比目錄更重要找到目錄之后下一步是分析源碼。很多人只看頁面上的可見內(nèi)容忽略了HTML注釋、JavaScript文件、CSS文件里的信息。CH4INRULZ_v1.0.1的首頁源碼里有一段被注釋掉的代碼里面包含了一個(gè)路徑和一個(gè)參數(shù)名。這個(gè)路徑后來被證明是后臺(tái)登錄入口參數(shù)名則是一個(gè)潛在的注入點(diǎn)。分析源碼的時(shí)候我通常會(huì)做這幾件事查看頁面源代碼搜索!--、TODO、FIXME、admin、password等關(guān)鍵詞下載所有JavaScript文件用工具格式化后搜索API端點(diǎn)、密鑰、硬編碼的憑證檢查robots.txt和sitemap.xml雖然這兩個(gè)文件經(jīng)常被忽略但有時(shí)候會(huì)直接列出敏感路徑用瀏覽器開發(fā)者工具查看網(wǎng)絡(luò)請求看看有沒有隱藏的AJAX接口注意分析源碼時(shí)不要只看首頁要把所有能訪問到的頁面都過一遍。有些線索藏在“關(guān)于我們”或者“聯(lián)系我們”這種不起眼的頁面里。3.3 從文件上傳點(diǎn)到命令執(zhí)行的完整鏈路在這臺(tái)靶機(jī)上我最終找到的入口是一個(gè)文件上傳功能。但上傳功能本身并不直接導(dǎo)致命令執(zhí)行中間還需要幾步操作。具體來說上傳的文件被存儲(chǔ)在一個(gè)可以通過Web訪問的目錄下而且服務(wù)端沒有對文件內(nèi)容做嚴(yán)格檢查。我上傳了一個(gè)包含特定代碼的文件然后通過訪問該文件觸發(fā)了代碼執(zhí)行。這個(gè)過程聽起來簡單但實(shí)際操作中有幾個(gè)坑第一個(gè)坑是文件擴(kuò)展名過濾。服務(wù)端可能只允許上傳圖片格式你需要嘗試不同的擴(kuò)展名繞過方式比如大小寫混合、雙擴(kuò)展名、特殊字符截?cái)嗟取5诙€(gè)坑是文件內(nèi)容檢查。有些服務(wù)端會(huì)檢查文件頭你需要在上傳的文件開頭加上合法的圖片文件頭再把代碼附在后面。第三個(gè)坑是上傳目錄的訪問權(quán)限。上傳成功后你需要知道文件被存到了哪個(gè)路徑下這個(gè)信息可能來自源碼、錯(cuò)誤信息或者目錄爆破結(jié)果。我在這臺(tái)機(jī)器上用的是雙擴(kuò)展名加文件頭偽造的方式具體命令這里不展開但思路你可以參考先上傳一個(gè)合法的圖片文件確認(rèn)上傳路徑和訪問方式然后再嘗試構(gòu)造包含代碼的混合文件。4. 權(quán)限提升的排查鏈路從普通用戶到root的完整過程4.1 拿到初始shell后的第一件事不是提權(quán)而是信息收集很多人拿到低權(quán)限shell之后第一反應(yīng)是去找提權(quán)腳本跑一遍。這個(gè)做法本身沒錯(cuò)但如果你對目標(biāo)系統(tǒng)一無所知腳本的輸出你也不知道哪些是重點(diǎn)。我的習(xí)慣是先手動(dòng)做一輪基礎(chǔ)信息收集再用腳本做補(bǔ)充?;A(chǔ)信息收集包括# 當(dāng)前用戶和權(quán)限 id whoami sudo -l # 系統(tǒng)版本和內(nèi)核版本 uname -a cat /etc/os-release # 網(wǎng)絡(luò)信息 ip addr netstat -antup # 定時(shí)任務(wù) crontab -l ls -la /etc/cron* # SUID文件 find / -perm -4000 -type f 2/dev/null # 可寫目錄和文件 find / -writable -type d 2/dev/null這些命令跑完你基本就能對目標(biāo)系統(tǒng)有一個(gè)整體認(rèn)識。CH4INRULZ_v1.0.1在這方面的設(shè)計(jì)比較典型sudo -l的輸出里有一條看起來不起眼但實(shí)際可以利用的配置/etc/cron*目錄下有一個(gè)可寫的腳本文件。4.2 sudo配置里的“小漏洞”往往是大問題的入口sudo -l的輸出需要仔細(xì)看。有些配置看起來只是允許你以某個(gè)用戶身份運(yùn)行一個(gè)普通命令但如果那個(gè)命令本身可以調(diào)用其他程序或者讀取任意文件就可能被用來提權(quán)。我在這臺(tái)機(jī)器上看到的是一個(gè)允許以特定用戶身份運(yùn)行某個(gè)文本處理命令的配置。這個(gè)命令本身功能有限但它支持一個(gè)參數(shù)可以執(zhí)行外部程序這就給了我可乘之機(jī)。具體利用方式是這樣的我構(gòu)造了一個(gè)特殊的輸入文件讓那個(gè)文本處理命令在處理過程中調(diào)用了我指定的程序從而獲得了一個(gè)更高權(quán)限的shell。這個(gè)思路在提權(quán)里很常見核心就是找到sudo允許的命令然后查這個(gè)命令的文檔看它有沒有執(zhí)行外部程序或者讀寫任意文件的功能。提示GTFOBins是一個(gè)很好的參考資源里面列出了大量可以被用來提權(quán)的常見命令。但不要死記硬背要理解每個(gè)命令為什么能被利用。4.3 定時(shí)任務(wù)提權(quán)的時(shí)機(jī)把握除了sudo配置定時(shí)任務(wù)也是這臺(tái)靶機(jī)的一個(gè)提權(quán)點(diǎn)。我在/etc/cron*目錄下發(fā)現(xiàn)了一個(gè)腳本文件這個(gè)文件被root用戶定期執(zhí)行但文件權(quán)限設(shè)置有問題普通用戶也可以寫入。這意味著我可以修改這個(gè)腳本的內(nèi)容等它下一次被root執(zhí)行的時(shí)候就會(huì)以root權(quán)限運(yùn)行我插入的命令。這個(gè)提權(quán)方式的關(guān)鍵在于時(shí)機(jī)。你需要知道定時(shí)任務(wù)的執(zhí)行周期然后在兩次執(zhí)行之間完成腳本修改。如果周期很短你可能需要快速操作如果周期很長你可以從容地修改腳本然后等待。我在這臺(tái)機(jī)器上遇到的是每分鐘執(zhí)行一次的定時(shí)任務(wù)所以修改完腳本后不到一分鐘就拿到了root shell。這里有一個(gè)細(xì)節(jié)需要注意修改腳本之前最好先備份原文件以免操作失誤導(dǎo)致系統(tǒng)異常。另外插入的命令要盡量簡單直接比如直接復(fù)制一個(gè)shell或者添加一個(gè)root權(quán)限的用戶不要寫太復(fù)雜的邏輯減少出錯(cuò)概率。4.4 提權(quán)后的收尾工作清理痕跡與驗(yàn)證權(quán)限拿到root shell之后不要急著關(guān)機(jī)或者截圖。先做幾件事驗(yàn)證權(quán)限id確認(rèn)是rootcat /etc/shadow確認(rèn)能讀取敏感文件查找flag通常靶機(jī)作者會(huì)在/root目錄下放一個(gè)flag文件讀取它作為完成憑證清理痕跡刪除你上傳的工具、修改過的腳本要恢復(fù)原樣、清理命令歷史記錄記錄過程把整個(gè)攻擊鏈路的每一步都記下來包括使用的命令、遇到的報(bào)錯(cuò)、解決的方法清理痕跡這一步在真實(shí)環(huán)境中非常重要但在靶機(jī)練習(xí)中很多人會(huì)忽略。我的建議是養(yǎng)成習(xí)慣即使在靶機(jī)上練習(xí)也認(rèn)真做一遍這樣到了真實(shí)項(xiàng)目里才不會(huì)手忙腳亂。5. 整條攻擊鏈的復(fù)盤哪些環(huán)節(jié)最容易卡住怎么避免5.1 信息收集階段的常見誤區(qū)回顧整臺(tái)靶機(jī)的攻擊過程我發(fā)現(xiàn)最容易卡住的地方不是技術(shù)難點(diǎn)而是信息收集的完整性。具體來說有這幾個(gè)誤區(qū)第一個(gè)誤區(qū)是只掃常見端口。前面已經(jīng)說過全端口掃描是必須的不要偷懶。第二個(gè)誤區(qū)是只看服務(wù)名稱不看版本。版本信息里往往藏著關(guān)鍵線索尤其是當(dāng)版本號比較舊的時(shí)候。第三個(gè)誤區(qū)是忽略非HTTP服務(wù)。這臺(tái)靶機(jī)上有一個(gè)非Web服務(wù)它的banner信息里包含了一個(gè)用戶名這個(gè)用戶名后來在SSH爆破中派上了用場。5.2 Web滲透階段的思路調(diào)整Web滲透階段最容易犯的錯(cuò)誤是“一條路走到黑”。當(dāng)你發(fā)現(xiàn)一個(gè)目錄或者一個(gè)功能點(diǎn)之后不要立刻投入大量時(shí)間去深入利用而是先快速評估這個(gè)點(diǎn)有沒有可能通向命令執(zhí)行或者文件讀取。如果沒有就暫時(shí)記下來繼續(xù)找其他入口。我在這臺(tái)機(jī)器上的做法是先把所有能訪問的頁面和目錄列出來然后按照“可能的上傳點(diǎn) 可能的注入點(diǎn) 可能的信息泄露點(diǎn)”的優(yōu)先級逐個(gè)排查。文件上傳點(diǎn)排在第一優(yōu)先級因?yàn)樗钣锌赡苤苯訉?dǎo)致代碼執(zhí)行。注入點(diǎn)排在第二因?yàn)槔闷饋硇枰嗖襟E。信息泄露點(diǎn)排在第三因?yàn)樗ǔV皇翘峁┚€索不能直接利用。5.3 提權(quán)階段的排查順序提權(quán)階段的排查順序也很重要。我的建議是先看sudo -l這是最快能出結(jié)果的地方再看SUID文件找那些不常見的SUID程序然后看定時(shí)任務(wù)尤其是root執(zhí)行的定時(shí)任務(wù)最后看內(nèi)核版本考慮內(nèi)核漏洞提權(quán)這個(gè)順序的邏輯是從“配置問題”到“權(quán)限問題”再到“系統(tǒng)問題”。配置問題最容易利用系統(tǒng)問題最復(fù)雜也最不穩(wěn)定。CH4INRULZ_v1.0.1的提權(quán)點(diǎn)在前兩類里都有所以不需要走到內(nèi)核漏洞那一步。5.4 工具的選擇與組合使用在整個(gè)過程中我用到的工具并不多但每個(gè)都用了不止一次工具用途使用階段nmap端口掃描和服務(wù)識別信息收集gobuster目錄爆破Web滲透netcat反彈shell和端口監(jiān)聽初始訪問和提權(quán)l(xiāng)inpeas自動(dòng)化提權(quán)信息收集提權(quán)階段GTFOBins查詢可提權(quán)命令提權(quán)階段工具不在多在于用熟。我見過很多人裝了一堆工具但每個(gè)都只會(huì)用最基礎(chǔ)的參數(shù)。我的建議是把常用的幾個(gè)工具的參數(shù)手冊過一遍知道每個(gè)參數(shù)是干什么的。比如nmap的--script參數(shù)可以調(diào)用大量現(xiàn)成的腳本gobuster的-x參數(shù)可以指定多個(gè)擴(kuò)展名這些細(xì)節(jié)在關(guān)鍵時(shí)刻能幫你省很多時(shí)間。6. 從這臺(tái)靶機(jī)延伸出去同類靶機(jī)的通用打法CH4INRULZ_v1.0.1雖然只是一臺(tái)靶機(jī)但它涉及的攻擊手法在同類靶機(jī)里很常見。如果你能把這臺(tái)機(jī)器打透再遇到類似的靶機(jī)時(shí)思路會(huì)清晰很多。同類靶機(jī)的通用打法可以總結(jié)為一條鏈路信息收集 → Web入口 → 初始shell → 提權(quán) → 橫向移動(dòng)如果有。每個(gè)階段都有一些通用的檢查清單信息收集階段全端口掃描、服務(wù)版本識別、目錄爆破、源碼分析、banner信息提取。Web入口階段文件上傳、SQL注入、命令注入、文件包含、反序列化。按照從簡單到復(fù)雜的順序逐個(gè)嘗試。初始shell階段反彈shell的構(gòu)造、shell的穩(wěn)定化處理、基礎(chǔ)信息收集。提權(quán)階段sudo配置、SUID文件、定時(shí)任務(wù)、內(nèi)核漏洞、環(huán)境變量劫持。橫向移動(dòng)階段憑證復(fù)用、SSH密鑰、內(nèi)網(wǎng)掃描、代理轉(zhuǎn)發(fā)。這條鏈路看起來簡單但每一步都有很多細(xì)節(jié)。我的經(jīng)驗(yàn)是不要追求一次成功而是追求每次失敗都能獲得新的信息。第一遍打不通沒關(guān)系把卡住的地方記下來查資料、問朋友、重新分析第二遍往往就能突破。最后說一個(gè)我自己的習(xí)慣每打完一臺(tái)靶機(jī)我都會(huì)寫一份簡短的復(fù)盤筆記記錄三個(gè)東西——卡住的地方、解決的方法、下次可以改進(jìn)的地方。這個(gè)習(xí)慣堅(jiān)持了幾年之后我發(fā)現(xiàn)自己遇到新靶機(jī)時(shí)卡住的時(shí)間越來越短因?yàn)榇蟛糠挚佣家呀?jīng)踩過了。