
🔓 Ferramenta CLI e biblioteca para executar ataques de padding oracle facilmente, com suporte para requisições de rede concorrentes e uma interface elegante.
Ferramenta CLI e biblioteca para executar ataques de padding oracle facilmente, com suporte para requisições de rede concorrentes e uma interface elegante.
Certifique-se de que o Node.js está instalado e então execute
$ npm install --global padding-oracle-attacker
ou
$ yarn global add padding-oracle-attacker
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 Encontra o texto simples (foobar) para o texto cifrado fornecido (hex:0123abcd)
encrypt Encontra o texto cifrado (hex:abcd1234) para o texto simples fornecido (foo=bar)
analyze Ajuda a descobrir se a URL é vulnerável ou não, e
como a resposta difere quando ocorre um erro de descriptografia
(para o argumento <error>)
Arguments
<url> URL a atacar. O payload será inserido no final por padrão. Para especificar
um ponto de injeção personalizado, inclua {POPAYLOAD} em um cabeçalho (-H),
corpo da requisição (-d) ou na URL
<block_size> Tamanho do bloco usado pelo algoritmo de criptografia no servidor
<error> A string presente na resposta quando a descriptografia falha no servidor.
Especifique uma string presente no corpo da resposta HTTP (como PaddingException)
ou o código de status da resposta HTTP (como 400)
Options
-c, --concurrency Requisições a serem enviadas simultaneamente [padrão: 128]
--disable-cache Desabilitar cache de rede. Salvo em [padrão: false]
poattack-cache.json.gz.txt por padrão
-X, --method Método HTTP a ser usado ao fazer a requisição [padrão: GET]
-H, --header Cabeçalhos a serem enviados com a requisição.
-H 'Cookie: cookie1' -H 'User-Agent: Googlebot/2.1'
-d, --data Corpo da requisição.
String JSON: {"id": 101, "foo": "bar"}
Codificado em URL: id=101&foo=bar
Certifique-se de especificar o cabeçalho Content-Type.
-e, --payload-encoding Codificação do payload do texto cifrado para {POPAYLOAD} [padrão: hex]
base64 FooBar+/=
base64-urlsafe FooBar-_
hex deadbeef
hex-uppercase DEADBEEF
base64(xyz) base64 personalizado ('xyz' representam os caracteres para '+/=')
--dont-urlencode-payload Não codificar {POPAYLOAD} na URL [padrão: false]
--start-from-1st-block Iniciar o processamento a partir do primeiro bloco em vez [padrão: false]
do último (funciona apenas no modo decrypt)
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
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): Promiseencrypt(options: Object): Promiseurl: stringURL a atacar. O payload será anexado ao final por padrão. Para especificar um ponto de injeção personalizado, inclua {POPAYLOAD} na URL, em um cabeçalho (requestOptions.headers) ou no corpo da requisição (requestOptions.data)
blockSize: numberTamanho do bloco usado pelo algoritmo de criptografia no servidor.
isDecryptionSuccess: ({ statusCode, headers, body }) => booleanFunção que retorna true se a resposta do servidor indicar que a descriptografia foi bem-sucedida.
ciphertext: Buffer (apenas decrypt)Texto cifrado a ser descriptografado.
plaintext: Buffer (apenas encrypt)Texto simples a ser criptografado. O padding será adicionado automaticamente. Exemplo: Buffer.from('foo bar', 'utf8')
concurrency: number = 128Requisições de rede a serem enviadas simultaneamente.
isCacheEnabled: boolean = trueAs respostas são armazenadas em cache por padrão e salvas em poattack-cache.json.gz.txt. Defina como false para desabilitar o cache.
requestOptions: { method, headers, data }requestOptions.method: stringMétodo HTTP a ser usado ao fazer a requisição. GET por padrão. POST, PUT, DELETE são algumas opções válidas.
requestOptions.headers: { string: string }Cabeçalhos a serem enviados com a requisição. Exemplo: { 'Content-Type': 'application/x-www-form-urlencoded' }
requestOptions.body: stringCorpo da requisição. Pode ser uma string JSON, parâmetros codificados em URL, etc. O cabeçalho Content-Type deve ser definido manualmente.
logMode: 'full'|'minimal'|'none' = 'full'full: Registra tudo no console (padrão)
minimal: Registra apenas após o início e a conclusão no console
none: Não registra nada no console
transformPayload: (ciphertext: Buffer) => stringFunção para converter o ciphertext em uma string ao fazer uma requisição. Por padrão, o ciphertext é codificado em hex e inserido no ponto de injeção (final da URL, a menos que {POPAYLOAD} esteja presente).
alreadyFound: BufferBytes de texto simples já conhecidos/encontrados que podem ser ignorados (a partir do final). Se você fornecer um Buffer de dez bytes, os últimos dez bytes serão ignorados.
initFirstPayloadBlockWithOrigBytes: boolean = falseInicializar o primeiro bloco de payload com os bytes originais do ciphertext em vez de zeros.
Exemplo: abcdef12345678ff 1111111111111111 em vez de 00000000000000ff 1111111111111111
startFromFirstBlock: boolean = falseIniciar o processamento a partir do primeiro bloco em vez do último.
makeInitialRequest: boolean = trueFazer uma requisição inicial com o ciphertext original fornecido e registrar a resposta do servidor no console para permitir que o usuário verifique se as requisições de rede estão sendo enviadas corretamente.
makeFinalRequest: boolean = trueApós encontrar os bytes do ciphertext para o novo plaintext, fazer uma requisição final com os bytes encontrados e registrar a resposta do servidor no console.
lastCiphertextBlock: BufferTexto cifrado personalizado para o último bloco. O último bloco é apenas zeros por padrão (000000000000000).
padding-oracle-attacker é escrito em TypeScript. Se você deseja modificar os arquivos fonte e executá-los, pode compilar os arquivos para JS primeiro e executá-los usando o node, ou usar o ts-node.
Exemplo: yarn build e depois node dist/cli ... ou simplesmente ts-node src/cli ...
yarn build ou npm run buildCompila os arquivos TypeScript dentro do diretório src para arquivos JS e os envia para o diretório dist.
yarn clean ou npm run cleanExclui o diretório dist.
yarn lint ou npm run lintAnalisa os arquivos usando o eslint.
yarn test ou npm run testAnalisa e executa os testes usando o ava.
node test/helpers/vulnerable-server.jsExecuta o servidor de teste que é vulnerável a ataques de padding oracle em http://localhost:2020
MIT © Kishan Bagaria