高收益的笨辦法:暴破在Windows提權中的應用

FLy_鵬程萬里發表於2018-06-06

千辛萬苦拿下的 webshell 不是 www-data 使用者就是 networkservice 許可權,要想擴充攻擊面、擴大戰果,提權,是必經之路,也是後滲透階段成功的關鍵。windows 提權,我常用的手法包括 DB 命令執行提權、核心 exp 提權、dll 劫持提權、路徑未帶引號的服務提權、濫用高權 token 提權、三方軟體提權,每個手法有各自的使用門檻及適用場景,通常需要多種措施並舉,才能拿下目標。

個人而言,習慣先從 DB 入手,不論是否站庫分離,web 終究得有 DB,一方面,DB 內部自帶命令執行模組,另一方面,DB 常以 system 許可權執行,那麼,一旦拿下 DB,相當於獲得了以 system 許可權執行命令的能力,變向實現提權。要進入 DB,最直觀的方式使用正確的賬號/密碼登入,賬號/密碼通常位於 web.config 中,有 webshell 就有 web.config,有 web.config 就有 DB 的賬號/密碼,如果再有一點小運氣,找到的是 SA 賬號的密碼,基本上,你已經成功一半了。現在,用 SA 賬號進入 DB 的 xp_cmdshell 模組執行命令“whoami”,得到報錯資訊“呼叫 CreateProcess 失敗,錯誤程式碼: 5”,剛剛的陽光燦爛立馬陰轉暴雨,顯然,管理員禁用了 DB 的命令執行功能(該模組仍可訪問)。後續,把餘下的攻擊模型逐一嘗試,無果。

放棄是不可能的。再琢磨琢磨,既然有 DB 的 SA 賬號,何不用相同的密碼登入 OS 的 administrator 賬號試試?先找到 web.config,由於該 web 連線了多個 DB,所以配置檔案中出現了多項 DB 資訊:


剔重後得到 5 個密碼:victim@2014、victim、victim2015、sf0618@sf0618、xtepxscm。怎麼驗證?用 administrator 作為使用者名稱、上述五個密碼作為密碼字典,用 hydra 暴破 RDP,方便快捷。

不幸的是,目標環境未將 3389 暴露至公網,好吧,只得埠轉發。

埠轉發大概需要三步,先在自己的 VPS 上建立埠對應,再在攻擊端連線 VPS 上的轉發埠,最後在 webshell 上轉發。具體而言:第一步,用 sSocks(https://sourceforge.net/projects/ssocks/)在 VPS 上建立 3388 與 3389 埠對應關係,實現流量互通:


第二步,從攻擊端連線 VPS 的 3388 埠,第一次嘗試 administrator/victim@2014。建議用 freerdp 而非 rdesktop,因為前者支援遠端與本地連線等待、文字複製貼上、掛載遠端檔案系統:


第三步,立即在大馬上執行埠轉發,可能需要連續多次點選 start:


注意,整個過程對步驟先後順序敏感,VPS 上 rcsocks 埠對映好以後就可以不管了,先在攻擊端執行 xfreerdp,讓其會話保持,再在 webshell 上轉發內網的 3389。

如果看到如下報錯,則說明賬號或密碼錯誤:


逐一嘗試餘下四個密碼,均失敗。

administrators 群組中還有其他 6 成員,那麼要嘗試 5 × 6 次:


咬咬牙,雖然累但十來分鐘也能試完,無果。都到這個節目眼了,要不再試試常見弱口令?天,這不是累不累的問題了,哪怕只是 top100 的弱口令,手工驗證也完全不可行!我需要自動化。

自動化,想到的第一個思路,嘗試用 hydra 暴破本地迴環 127.0.0.1 的 RDP。hydra 官方不再支援 windows,所以,我只得在 cygwin 中原始碼構建可執行程式。我把 hydra.exe 及相關依賴打包到單獨目錄,脫離 cygwin 環境,在命令列中可正常執行 hydra.exe:


但,將 IP 設定為 127.0.0.1 後暴破 RDP 始終失敗,原來,RDP 禁止從 127.0.0.1 登入。此路不通。

第二個思路,將前面提到的三步封裝到指令碼中,呼叫 xfreerdp 遠端登入(將使用者名稱和密碼作為字典)、呼叫 curl 驅動 webshell 埠轉發。大概半小時,寫了個 bash 指令碼,驗證其功能,發現即便正確的密碼,也不是 100% 成功,為何?前面提過,webshell 上轉發埠流量的功能不太穩定,需要連續多試幾次,那麼將 curl 多呼叫幾次或許能解決這個問題,具體幾次合適,不好說。總感覺這種遠端驗證的方式,不僅麻煩、效率也低,我得想個更優的思路。

第三個思路,縷一縷,我要的是效率高、無依賴、高精準、體積小的工具,嗯,win32 原生程式直接在目標機器上本地暴破所有 OS 使用者的密碼,就它。這個工具要能幫我找到 are you admin? 的答案,所以,命名為 ruadmin。你知道,我移居 linux 多年,win32 忘得差不多了,所以,我找 MSDN 幫忙,花了兩個晚上,基本上,我付予了 ruadmin 幾個核心能力:高效精準驗證賬號密碼、自動獲取 OS 賬號、內建高命中率弱口令、綠色無依賴不查殺、相容 NT 架構的全版本系統。

高效驗證賬號密碼方面,呼叫 LogonUser(),不通過任何網路協議,直接本地驗證:


甚至能驗證空密碼的賬號。另外,一個賬號對應一個暴破執行緒,進一步提高效率:


自動獲取 OS 賬號方面,呼叫 NetUserEnum() 獲取包括隱藏賬號(如 yangyangwithgnu$)在內的所有使用者賬號:


如果覺得破解所有賬號耗時太長,你有兩個選擇,一是用 –user 指定暴破單一賬號、二是用 –one-quit 告訴 ruadmin 只要暴破出任一賬號立即結束。

內建高命中率弱口令方面,我把常見弱口令字典整合進 ruadmin,字典包含中國人弱口令、外國人弱口令、黑客常用口令等近 4W 條:


不滿意,你可以用 –passwds-file 指定自己的字典檔案。

其他方面。純 win32 實現,無任何依賴;沒用惡意程式碼,不會觸發 AV 報警;平臺無關,x64 和 x86 都能執行;同時,在生成可執行檔案時,我將 VS 工程設定為 project – properties – configuration properties – general – general – platform toolset – vs2015 – windows xp (v140_xp),這樣,ruadmin 就能支援客戶端系統 winXP~win10、服務端系統 server_2003~server_2016。

回到先前的目標環境中,看我如何用 ruadmin 實現提權。

上傳 ruadmin。有 webshell,上傳檔案易如反掌,但我們上傳的不是一般檔案,而是可執行程式,得儘可能為程式執行鋪平道路。從經驗來看,有兩點建議:一是上傳目錄方面,程式執行時可能生成臨時檔案,所以上傳的目錄最好具有讀寫許可權,如 C:\Windows\Temp\ 或 %temp% 是個選擇;二是檔名方面,應考慮到 AV 的反應,基礎名不要用 exp、agent、xxxx、info、hack、admin 等等這類帶有明顯攻擊性的字樣,可以隨機化(如,用 mneo 就不錯),副檔名方面,先在攻擊端將其改為 txt,上傳成功後再改回 exe,甚至,若目標環境禁止改名,採用未關聯任何開啟程式的副檔名(如,*.128),windows 允許在命令列中直接 *.128 這樣的檔案。具體而言,我將 ruadmin.exe 改為 amneo.128,進入 webshell 的 File Manager 模組,上傳目錄定為 C:\Windows\Temp\,選擇攻擊端檔案 amneo.128 上傳:


採用內建密碼暴破。進入 webshell 的 CmdShell 模組,不帶任何命令列選項直接執行 amneo.128:


ruadmin 採用預設選項,採用 39526 個字典項暴破自動獲取的 8 個作業系統賬號,半分鐘後,顯示未找到任何密碼。

採用 web.config 中的密碼暴破。顯然,內建字典無效,前面分析過 web.config 中含有多個 DB 的密碼:victim@2014、victim、victim2015、sf0618@sf0618、xtepxscm,我將其寫入目標上的 p0.txt 中,指定使用 p0.txt 作為密碼字典檔案,執行後仍然無果:


採用社工密碼暴破。我得根據該目標的屬型,重新制作一個具有社工型的字典。簡單分析發現,該網站域名含有 victim,而 DB 的密碼出現過 victim@2014、victim2015,那麼,我可以合理猜測管理員密碼由 victim、特殊字元、年份等三部分組成,但是 victim 有大小寫、特殊字元有十來個、年份也不確定,排列組合結果太多,必須找個工具基於規則自動生成。密碼字典生成,我推薦兩個工具 hashcat、crunch,這裡以前者為例。對滴,hashcat 不僅是雜湊暴破神器,也支援基於規則生成密碼字典,規則庫位於 hashcat/rules:


其中,dive.rule 含有我需要的規則,選之。我把 victim@2014、victim、victim2015、sf0618@sf0618、xtepxscm 視為基礎資訊存入 base.txt 中作為輸入,讓 dive.rule 模仿學習生成類似的密碼字典,儲存至 passwds.txt:


生成的字典有 26w 個,目標上有 8 個賬號,也就要列舉 268446 × 8 次,通過 webshell 執行耗時較長的命令時,頁面將報超時錯誤,無法正常顯示程式執行結果,所以,將命令執行結果重定向到文字中:


大概十分鐘之後 foo.txt 體積達到 1k 左右,說明命令執行完成,檢視 foo.txt:


成功暴破出兩個管理員賬號的密碼。

以管理員身份登入遠端桌面,實現提權。組合使用目標上的 webshell、VPS 上的 rcsocks、攻擊端上的 xfreerdp 將內網的 RDP 埠轉發至公網後,輸入 administrator/Victim@2017 成功登入目標:


某些環境限定了 RDP 源 IP,即便做了埠轉發也無法登入。沒關係,既然我有管理員的密碼,那麼只要找到類似 linux 上的 su 命令,也可以以管理員身份執行任意命令。windows 上的 runas 就具備這個功能,但它沒法將密碼作為命令列引數中,所以,用支援在命令列引數中輸入密碼的開源版本 cpau(http://www.joeware.net/freetools/tools/cpau/)。具體要執行什麼命令?根據各人喜好,我會直接反彈一個管理員許可權的 meterpreter。執行 cpau:


其中,我將 cpau.exe 重新命名為 asdf.64,tybdf.16 為 msfvenom 生成的反彈 payload。很快將獲得管理員的 meterpreter:


當然,ruadmin 並不完美,兩個致命傷你有必要了解,以評估是否具備使用環境。第一,對於開啟試錯鎖定賬號策略的環境,ruadmin 很可能導致賬號被鎖,存在影響業務的風險,我建議你用 –user 指定一個普通賬號先測試系統是否開啟鎖定賬號的策略,再做下一步打算;第二,ruadmin 使用的密碼驗證機制將導致生成大量登入失敗的日誌,可能引起管理員、AV 的注意,我沒啥能建議,自求多福。

從近期把 ruadmin 投入實戰中的效果來看,成績喜人!針對提權,大部份攻擊者也就會 DB 命令執行、核心 exp 這兩招,稍微有一定道行的會翻下存放明文密碼的檔案、找下存在配置缺陷的服務,再高階點的會盜用特權 token、攻擊萬能鑰匙,而低門檻的本地暴破,卻很少被納入“正統”提權手法名錄中,究其原因,大概有三:一是,完全沒想這個意識,最多用 hydra 遠端暴破下 RDP;二是,有這個意識,但缺乏類似 ruadmin 這類不依賴任何協議的本地暴破工具;三是,暴破乃是指令碼小子的行為,進不了大黑闊的法眼。目標驅動,為了實現提權,暴破這個高收益的笨辦法,你至少應該嘗試。


相關文章