CyberChef

Inhalt

Über CyberChef
CyberChef herunterladen und lokal verwenden
HTTP-Anfragen mit CyberChef
Einschränkungen
Flow Control Operationen
Fork und Merge
Subsection
Register
Jump, Conditional Jump, Label und Return
Fallbeispiel

Über CyberChef

CyberChef ist eine Webanwendung für die Analyse und das Dekodieren von Daten. Die vielen verfügbaren Operationen (Funktionen / Tätigkeiten) ermöglichen bestimmte Daten zu extrahieren, zu konvertieren oder neu zu formatieren.

Mehrere Operationen lassen sich nacheinander ausführen, um die Daten weiter zu bearbeiten. Die auszuführenden Operationen werden passend zum Namen der Webanwendung "Rezept" genannt.

Nur mit Drag und Drop ist es möglich, URLs oder E-Mail-Adressen aus einem Text oder einer Datei zu extrahieren, Zeitangaben in andere Zeitformate zu konvertieren oder EXIF-Informationen aus Bilddateien auszulesen.

CyberChef GUI

Die Benutzeroberfläche ist einfach und größtenteils selbsterklärend. Über die Titelleistenschaltflächen der Bereiche "Input" und "Output" können Eingabedateien ausgewählt oder das Ergebnis in eine Datei gespeichert werden.

Operationen lassen sich per Drag und Drop zu einem Rezept hinzufügen, verschieben und wieder entfernen. Ein Rezepte kann über die Schaltflächen in der Titelleiste des Recipe-Bereichs in mehreren Formaten gespeichert und geladen werden. So ist es möglich, kopierte Rezepte - z.B. von dieser Seite - in CyberChef einzufügen. Ein Link mit dem Rezept als Parameter kann auch im Browser als Lesezeichen gespeichert werden.

CyberChef herunterladen und lokal verwenden

Die jeweilige Version wird direkt in CyberChef über den Link "Download CyberChef" in der linken oberen Ecke heruntergeladen. Um keine sensiblen Daten über das Internet zu senden, sollte CyberChef immer lokal ausgeführt werden.

HTTP-Anfragen mit CyberChef

Durch die Sicherheitsmechanismen moderner Webbrowser können keine HTTP-Anfragen von CyberChef ausgeführt werden, sofern der Webserver dies nicht explizit über einen HTTP Response Header erlaubt - dies wird Cross-Origin Resource Sharing (CORS) genannt. Um dennoch HTTP-Anfragen an beliebige Webserver stellen zu können, muss die Zeile "Access-Control-Allow-Origin: *" zu der Antwort des Webservers hinzugefügt werden. Für Firefox, Chrome und andere gängige Browser gibt es diverse Add-ons, die dies erlauben. Nach der Verwendung sollte das Add-on deaktiviert bzw. die Access-Control-Allow-Origin-Zeile wieder entfernt werden.

Es gibt aber auch noch weitere Einstellungsmöglichkeiten über die Response-Header, wie eine Einschränkung der URL oder der Request-Methode. Auch andere Lösungen sind möglich, wie ein lokaler Proxy-Server oder ein eigener Webserver, der als Proxy fungiert oder die gewünschten Daten zurückgibt.

Einschränkungen

CyberChef kann nur mit einer überschaubaren Menge an Daten umgehen. So benötigen große Logdateien mit mehreren Megabyte beispielsweise so viel Verarbeitungszeit, dass eine andre Lösung zweckdienlicher ist.

Komplexe Aufgaben können nicht oder nur sehr aufwändig realisiert werden. In diesen Fällen ist ein einfaches Skript oder Programm besser geeignet.

Gefällt dir meine Webseite, meine Freeware-Programme oder Online-Tools?

Dann spende bitte per PayPal und hilf mit, den Inhalt weiterhin kostenlos anbieten zu können - jeder Betrag ist willkommen!

Lese mehr über Unterstützungs­möglichkeiten...

Flow Control Operationen

Unter "Flow control" finden sich Operationen, die sich auf die Reihenfolge der Abarbeitung eines Rezepts auswirken. Mit ihnen lassen sich Bedingungen für die Verarbeitung festlegen oder Arbeitsschritte nur für bestimmte Daten ausführen.

Die Operation "Comment" ermöglicht die Eingabe von Kommentartexten. Kommentare sind besonders bei komplexeren Rezepten hilfreich, können aber auch zur allgemeinen Beschreibung des Rezepts nützlich sein.

Fork und Merge

"Fork" unterteilt die Daten und verarbeitet jeden Teil einzeln. Anschließend werden die Teile mit "Merge" wieder zusammengefügt. Damit ist es etwa möglich, die Zeilen eines Textes einzeln zu verarbeiten.

Beispieleingabe:

1 1 1
2 2 2
3 3 3

Die Zahlen in den drei Zeilen sollen addiert werden. Dazu wird "Fork" dem Rezept hinzugefügt. Die Standardeinstellung von "Fork" trennt die Daten bereits in Zeilen. Mit der Operation "Sum" und einem Leerzeichen als Trennzeichen erfolgt die Addition aller Zahlen einer Zeile.

Die Ausgabe ist jetzt:

3
6
9

"Merge" führt die Verarbeitung wieder zusammen. Eine zweite Sum-Operation mit dem Trennzeichen "Line feed" (Zeilenumbruch) zählt die Zeilen zusammen und gibt die Zahl 18 aus.

Beispiel-Rezept für Fork und Merge
Fork('\\n','\\n',false)
Sum('Space')
Merge(true)
Sum('Line feed')

Beispiel ausprobieren

Subsection

Die Operation "Subsection" funktioniert ähnlich wie "Fork", nur dass die nachfolgenden Operationen mit bestimmten Daten durchgeführt werden. Diese werden mit einem regulären Ausdruck bestimmt.

Beispieleingabe:

123 # 456 # 789

Eine Subsection-Operation mit dem Ausdruck "[0-9]+" unter "Section" verarbeitet alle zusammenhängenden Zahlen mit den nächsten Operationen einzeln nacheinander. Beispielsweise berechnet die Operation "CRC-16" die Prüfsummen von jeder Zahl getrennt, was zur Ausgabe "ba04 # 88d6 # 1c62" führt.

Beispiel-Rezept für Subsection
Subsection('[a-zA-Z0-9]+',true,true,false)
CRC-16_Checksum()

Beispiel ausprobieren

Register

"Register" ermöglicht das Zwischenspeichern von bestimmten Daten, die später in anderen Operationen verwendet werden können. Die Auswahl der Daten für die Register erfolgt mit den Treffergruppen eines regulären Ausdrucks. Die Register werden mit "$Rn" angegeben, wobei "n" eine Zahl ist und für die entsprechende nullbasierte Treffergruppe steht.

Beispieleingabe:

1+2=3

Eine Register-Operation mit dem Extractor-Ausdruck "([0-9]+)\+([0-9]+)=([0-9]+)" speichert die Zahlen vor und nach dem Plus-Zeichen, sowie das Ergebnis in jeweils einem Register.

In einer "Find / Replace"-Operation wird anschließend nach "=$R2" gesucht, was dem Text "=3" entspricht. Aus der Ersetzung mit " ergibt $R2 ($R0 plus $R1)" resultiert schließlich der Text "1+2 ergibt 3 (1 plus 2)".

Beispiel-Rezept für Register
Register('([0-9]+)\\+([0-9]+)=([0-9]+)',true,false,false)
Find_/_Replace({'option':'Regex','string':'=$R2'},' ergibt $R2 ($R0 plus $R1)',true,false,true,false)

Beispiel ausprobieren

Jump, Conditional Jump, Label und Return

Mit den Jump-Operationen lassen sich nicht erforderliche oder nicht gewünschte Verarbeitungsschritte überspringen. Ein "Conditional Jump" wird nur dann ausgeführt, wenn ein regulärer Ausdruck zutrifft.

Mit "Label" wird eine Stelle im Rezept als Sprungziel für die Operationen "Jump" und "Conditional Jump" gekennzeichnet. Um die Verarbeitung bei einem Label fortzusetzen, muss der Name des Labels in der Jump-Operation angegeben werden.

"Return" ist eine Anweisung, um die Ausführung des Rezepts an dieser Stelle zu beenden. In Verbindung mit dem Aktivieren und Deaktivieren der Operation eignet sich das gut zum Testen eines Rezeptabschnitts.

Beispieleingabe:

https%3A%2F%2Fwww.gaijin.at%2F
aHR0cHM6Ly93d3cuZ2FpamluLmF0Lw

Diese beiden Zeilen enthalten jeweils die URL "https://www.gaijin.at/" in URL-Kodierung und Base64-kodiert. Um die Zeilen abhängig vom Inhalt zu dekodieren, kommt die Operation "Conditional Jump" nach einer Fork-Operation zum Einsatz. Wenn ein Prozentzeichen mit anschließenden Hexadezimalzeichen enthalten ist, soll nach dem Label "urldecode" fortgesetzt werden. Ansonsten wird die Eingabe mit Base64 dekodiert und die Verarbeitung anschließend mit "Return" beendet. Nach der Return-Operation wird das Label "urldecode" platziert, gefolgt von der URL-Decode-Operation.

Beispiel-Rezept für Conditional Jump, Label und Return
Fork('\\n','\\n',false)
Conditional_Jump('%[a-zA-Z0-9]{2}',false,'urldecode',10)
From_Base64('A-Za-z0-9+/=',true,false)
Return()
Label('urldecode')
URL_Decode()

Try example

Fallbeispiel

Sehen wir uns nun ein Beispiel einer Webseite an, die versucht, einige Codeteile zu verschleiern. Die Buchstaben und Zahlen in den Bezeichnungen wurden abgeändert, die Optik blieb jedoch erhalten. Der URL-Shortener-Dienst und die Zieladresse wurden ebenfalls geändert.

Auszug aus dem Quelltext der Webseite
...
<script>/* u4l14g9r53o4 */
function h43v73s30w75p(j6l3n8e67q){/* k5f54i12t16u19r9 */ return j6l3n8e67q.split('').reverse().join('');/* p3n60r82g8d3 */}
function j12k7u6d96r(){/* u4l14g9r53o4 */ window.location.href = h43v73s30w75p(atob('MEhRRGsveWwudC8vOnNwdHRo')); /* k5f54i12t16u19r9 */}
if ( navigator.userAgent.indexOf("Google") != -1 ) {/* j6l3n8e67q */ document.writeln('<style>#i87z4o8g84 {display:none;}</style>'); /* p3n60r82g8d3 */ } else { /* u4l14g9r53o4 */ document.writeln('<style>#i87z4o8g84 {display:block;}</style>'); /* k5f54i12t16u19r9 */ }
/* p3n60r82g8d3 */</script>
...
<a id="o6h9e18b12" href="#" onclick="j12k7u6d96r();return false;">
...

Auf den ersten Blick sind nur wahllose Buchstaben- und Zahlenketten zu sehen. Im unteren Teil verweist der Link auf eine JavaScript-Funktion namens "j12k7u6d96r". Diese enthält eine Zuweisung eines Wertes zur Eigenschaft "window.location.href". Wird dieser Eigenschaft eine URL zugewiesen, ruft der Browser diese Adresse im selben Fenster auf. Hier wurde ganz offensichtlich versucht, diese URL zu verschleiern.

Um den Quelltext übersichtlicher anzuzeigen, kopieren wir den Code zwischen den script-Tags und fügen ihn als Eingabe in CyberChef ein. Die Operation "JavaScript Beautify" formatiert den Quellcode. Bei der Option "Include comments" entfernen wir das Häkchen, um auch die ohnehin nur der Verwirrung dienenden Kommentare zu entfernen.

Das Rezept

JavaScript_Beautify('\\t','Auto',true,false)

liefert diese Ausgabe:

function h43v73s30w75p(j6l3n8e67q) {
    return j6l3n8e67q.split('').reverse().join('');
}
function j12k7u6d96r() {
    window.location.href = h43v73s30w75p(atob('MEhRRGsveWwudC8vOnNwdHRo'));
}
if (navigator.userAgent.indexOf('Google') != -1) {
    document.writeln('');
} else {
    document.writeln('');
}

Jetzt versuchen wir, die eigentliche Adresse herauszufinden, die gleich mit mehreren Funktionen verschleiert wird. Als Ausgangstext wird die Zeichenfolge "MEhRRGsveWwudC8vOnNwdHRo" verwendet, die der ersten (innersten) Funktion als Parameter übergeben wird. Mit der JavaScript-Funktion "atob" wird ein in Base64 kodierter Text wieder dekodiert. Anschließend teilt die benutzerdefinierte Funktion "h43v73s30w75p" mit der Java-Script Funktion "split" den Text in einzelne Zeichen auf. Diese werden dann mit "reverse" in umgekehrter Reihenfolge angeordnet und mit "join" wieder zusammengefügt.

Dies bilden wir mit CyberChef nach, indem wir den Text "MEhRRGsveWwudC8vOnNwdHRo" als neue Eingabe verwenden. Das Rezept ersetzen wir nun durch:

From_Base64('A-Za-z0-9+/=',true,false)
Reverse('Character')

Als Ergebnis wird die URL "https://t.ly/kDQH0" ausgegeben, die zu einem URL-Shortener-Dienst gehört. Solche Kurz-URLs verweisen auf andere - meist längere - URLs.

Mit dem Online-Tool "Website Information" können wir jetzt die eigentliche Ziel-URL ermitteln. Dazu tragen wir die Kurz-URL in das Eingabefeld "URL" ein und setzen die Anzahl der Umleitungen auf "0". Nach dem Absenden der Anfrage erhalten wird als Ergebnis die HTTP-Kopfzeilen der Serverantwort.

Auszug aus dem Ergebnis
Status-Code:302 (Found)
Date:Wed, 03 May 2023 01:23:45 GMT
Content-Type:text/html; charset=UTF-8
Connection:close
Location:https://www.bad-server.example/malicious-file
Cache-Control:no-cache, private
...

Am Statuscode 302 in der ersten Zeile erkennen wir, dass es sich um eine Weiterleitung handelt. Das Ziel dieser Weiterleitung und die gesuchte eigentliche Adresse steht in der Zeile "Location" (Adresse geändert).


Gefällt dir meine Webseite, meine Freeware-Programme oder Online-Tools?

Dann spende bitte per PayPal und hilf mit, den Inhalt weiterhin kostenlos anbieten zu können - jeder Betrag ist willkommen!

Lese mehr über Unterstützungs­möglichkeiten...




Diese Webseite verwendet Cookies und verarbeitet Daten. Informationen zur Datenverarbeitung sowie zur Möglichkeit, diese abzulehnen, finden Sie in der Datenschutzerklärung. Ok