
🔓 Herramienta CLI y biblioteca para ejecutar ataques de oráculo de relleno fácilmente, con soporte para solicitudes de red concurrentes y una interfaz de usuario elegante.
Herramienta CLI y biblioteca para ejecutar ataques de oracle de relleno fácilmente, con soporte para peticiones de red concurrentes y una interfaz de usuario elegante.
Asegúrate de tener Node.js instalado, luego ejecuta
$ npm install --global padding-oracle-attacker
o
$ yarn global add padding-oracle-attacker
Uso
$ 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]
Comandos
decrypt Encuentra el texto plano (foobar) para un texto cifrado dado (hex:0123abcd)
encrypt Encuentra el texto cifrado (hex:abcd1234) para un texto plano dado (foo=bar)
analyze Ayuda a determinar si la URL es vulnerable o no, y
cómo difiere la respuesta cuando ocurre un error de descifrado
(para el argumento <error>)
Argumentos
<url> URL a atacar. El payload se insertará al final por defecto. Para especificar
un punto de inyección personalizado, incluye {POPAYLOAD} en un encabezado (-H),
en el cuerpo de la petición (-d) o en la URL
<block_size> Tamaño de bloque usado por el algoritmo de cifrado en el servidor
<error> Cadena presente en la respuesta cuando falla el descifrado en el servidor.
Especifica una cadena presente en el cuerpo de la respuesta HTTP (como PaddingException)
o el código de estado de la respuesta HTTP (como 400)
Opciones
-c, --concurrency Peticiones a enviar concurrentemente [default: 128]
--disable-cache Deshabilitar la caché de red. Guardada en [default: false]
poattack-cache.json.gz.txt por defecto
-X, --method Método HTTP a usar al hacer la petición [default: GET]
-H, --header Encabezados a enviar con la petición.
-H 'Cookie: cookie1' -H 'User-Agent: Googlebot/2.1'
-d, --data Cuerpo de la petición
Cadena JSON: {"id": 101, "foo": "bar"}
Codificado URL: id=101&foo=bar
Asegúrate de especificar el encabezado Content-Type.
-e, --payload-encoding Codificación del payload de texto cifrado para {POPAYLOAD} [default: hex]
base64 FooBar+/=
base64-urlsafe FooBar-_
hex deadbeef
hex-uppercase DEADBEEF
base64(xyz) Base64 personalizado ('xyz' representa caracteres para '+/=')
--dont-urlencode-payload No codificar URL el {POPAYLOAD} [default: false]
--start-from-1st-block Comenzar el procesamiento desde el primer bloque [default: false]
en lugar del último (solo funciona con modo decrypt)
Ejemplos
$ 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=
Alias
poattack
padding-oracle-attack
const { decrypt, encrypt } = require('padding-oracle-attacker')
// o
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): Promiseencrypt(options: Object): Promiseurl: stringURL a atacar. El payload se añadirá al final por defecto. Para especificar un punto de inyección personalizado, incluye {POPAYLOAD} en la URL, en un encabezado (requestOptions.headers) o en el cuerpo de la petición (requestOptions.data)
blockSize: numberTamaño de bloque usado por el algoritmo de cifrado en el servidor.
isDecryptionSuccess: ({ statusCode, headers, body }) => booleanFunción que devuelve true si la respuesta del servidor indica que el descifrado fue exitoso.
ciphertext: Buffer (solo decrypt)Texto cifrado a descifrar.
plaintext: Buffer (solo encrypt)Texto plano a cifrar. El relleno se añadirá automáticamente. Ejemplo: Buffer.from('foo bar', 'utf8')
concurrency: number = 128Peticiones de red a enviar concurrentemente.
isCacheEnabled: boolean = trueLas respuestas se almacenan en caché por defecto y se guardan en poattack-cache.json.gz.txt. Establece a false para deshabilitar la caché.
requestOptions: { method, headers, data }requestOptions.method: stringMétodo HTTP a usar al hacer la petición. GET por defecto. POST, PUT, DELETE son algunas opciones válidas.
requestOptions.headers: { string: string }Encabezados a enviar con la petición. Ejemplo: { 'Content-Type': 'application/x-www-form-urlencoded' }
requestOptions.body: stringCuerpo de la petición. Puede ser una cadena JSON, parámetros codificados URL, etc. El encabezado Content-Type debe establecerse manualmente.
logMode: 'full'|'minimal'|'none' = 'full'full: Registrar todo en la consola (por defecto)
minimal: Registrar solo al inicio y al finalizar en la consola
none: No registrar nada en la consola
transformPayload: (ciphertext: Buffer) => stringFunción para convertir el ciphertext en una cadena al hacer una petición. Por defecto, ciphertext se codifica en hexadecimal y se inserta en el punto de inyección (al final de la URL a menos que esté presente {POPAYLOAD}).
decrypt)alreadyFound: BufferBytes de texto plano ya conocidos/encontrados que se pueden omitir (desde el final). Si proporcionas un Buffer de diez bytes, los últimos diez bytes se omitirán.
initFirstPayloadBlockWithOrigBytes: boolean = falseInicializar el primer bloque del payload con bytes originales del ciphertext en lugar de ceros.
Ejemplo: abcdef12345678ff 1111111111111111 en lugar de 00000000000000ff 1111111111111111
startFromFirstBlock: boolean = falseComenzar el procesamiento desde el primer bloque en lugar del último.
makeInitialRequest: boolean = trueHacer una petición inicial con el ciphertext original proporcionado y registrar la respuesta del servidor en la consola para permitir al usuario asegurarse de que las peticiones de red se están enviando correctamente.
encrypt)makeFinalRequest: boolean = trueDespués de encontrar los bytes del ciphertext para el nuevo plaintext, hacer una petición final con los bytes encontrados y registrar la respuesta del servidor en la consola.
lastCiphertextBlock: BufferTexto cifrado personalizado para el último bloque. El último bloque es solo ceros por defecto (000000000000000).
padding-oracle-attacker está escrito en TypeScript. Si deseas modificar los archivos fuente y ejecutarlos, puedes compilar los archivos a JS primero y ejecutarlos con node, o usar ts-node.
Ejemplo: yarn build luego node dist/cli ... o simplemente ts-node src/cli ...
yarn build o npm run buildCompila los archivos TypeScript dentro del directorio src a archivos JS y los saca al directorio dist.
yarn clean o npm run cleanElimina el directorio dist.
yarn lint o npm run lintAnaliza los archivos usando eslint.
yarn test o npm run testAnaliza y ejecuta las pruebas usando ava.
node test/helpers/vulnerable-server.jsEjecuta el servidor de pruebas que es vulnerable a ataques de oracle de relleno en http://localhost:2020
MIT © Kishan Bagaria