
🌸 Interaktive Shellcoding-Umgebung zum einfachen Erstellen von Shellcodes
Shellen ist eine interaktive Umgebung zum Erstellen von Shellcodes. Wenn du ein praktisches Werkzeug zum Schreiben von Shellcodes suchst, dann könnte Shellen dein Freund sein. Shellen kann auch als Assemblierungs- oder Disassemblierungswerkzeug verwendet werden.
Die Engines keystone und capstone werden für alle Operationen von Shellen verwendet.
Shellen funktioniert nur mit python3. python2-Unterstützung könnte in der Zukunft erscheinen.
Zuerst solltest du die Abhängigkeiten von Shellen installieren:
$ sudo apt-get install cmake python3-dev python3-setuptools
Du kannst die stabile Version von Shellen mit pip3 installieren:
$ sudo pip3 install shellen
Oder falls du bereits alle erforderlichen Pakete hast (siehe Voraussetzungen):
$ python3 setup.py install
Falls du Probleme bei der Installation von keystone-engine hast, solltest du keystone-engine kompilieren (siehe die Datei COMPILE.md im Repository keystone)
Nachdem du Shellen und die erforderlichen Pakete installiert hast, kannst du Shellen starten, indem du Folgendes in deinem Terminal eingibst:
$ shellen
Du kannst den Befehl help von Shellen ausführen, um Informationen über die Verwendung von Shellen zu erhalten.
Shellen assembliert und disassembliert Instruktionen, daher gibt es zwei Verwendungsmodi: asm bzw. dsm. Weitere Funktionen umfassen das Durchsuchen von Syscall-Tabellen und die Suche nach gängigen Shellcodes.
Shellen verfügt über eine nützliche Eingabeaufforderung, die den aktuellen Modus, das Betriebssystem (OS für Syscalls) und die gewählte Architektur des aktuellen Modus anzeigt. Die Eingabeaufforderung von Shellen sieht wie folgt aus:
L:asm:x86_32 >
Du kannst deine Eingabe bearbeiten, als ob du in einem Terminal tippen würdest. Außerdem speichert Shellen deinen Befehlsverlauf (drücke einfach die Pfeil-nach-oben-Taste, um deine vorherigen Befehle zu sehen).
L ist die Kurzform von Linux in der Eingabeaufforderung. Unten sind alle anderen Betriebssystemnamen aufgelistet:
L ist LinuxW ist WindowsM ist MacOSWenn du das Betriebssystem wechseln möchtest, gib setos [linux/windows/macos] wie folgt ein:
L:asm:x86_32 > setos windows
[+] OS changed to windows.
Um den aktuellen Modus zu wechseln, gib asm oder dsm in der Eingabeaufforderung ein.
L:dsm:arm32 > asm
[+] Changed to asm (assembly) mode
L:asm:x86_32 > dsm
[+] Changed to dsm (disassembly) mode
L:dsm:arm32 >
| Befehl | Beschreibung |
|---|---|
clear | Leert den Terminalbildschirm. Wie üblich cls unter Windows oder clear unter *nix-Systemen. |
Um Instruktionen zu assemblieren, gib sie ein und trenne sie mit Semikolons, wie hier gezeigt:
L:asm:x86_32 > mov edx, eax; xor eax, eax; inc edx; int 80;
[+] Bytes count: 7
Raw bytes: "\x89\xc2\x31\xc0\x42\xcd\x50"
Hex string: "89c231c042cd50"
Falls deine assemblierten Bytes ein Nullbyte enthalten, wird Shellen dich darauf hinweisen.
Disassemblieren ähnelt dem Assemblieren. Gib stattdessen deine Bytes in der Eingabeaufforderung ein und sieh dir das Ergebnis an!
L:dsm:x86_32 > 89c231c042cd50
0x00080000: mov edx, eax
0x00080002: xor eax, eax
0x00080004: inc edx
0x00080005: int 0x50
Außerdem kannst du deinen Shellcode in einem Unterprozess ausführen. Sei dir bewusst, dass dies deinem System schaden kann!. Springt zum letzten Shellcode in einem Unterprozess. Was könnte schon schiefgehen?' Beachte, dass du nicht kontrollieren kannst, an welcher Basisadresse dein Code geladen wird, und dass vorausgesetzt wird, dass die Instruktionen für deine CPU sinnvoll sind. Siehe help innerhalb von shellen, um zu erfahren, wie du es verwendest.
Ich plane, den Unterprozess in einer virtuellen Umgebung auszuführen, um das Ausführen potenziell gefährlicher Shellcodes sicherer zu machen.
Die Modi asm und dsm funktionieren für verschiedene Architekturen. Um eine Liste der verfügbaren Architekturen für den aktuellen Modus von Shellen zu sehen, gib Folgendes ein:
L:dsm:x86_32 > archs
┌────────┬────────┬─────────┬─────────┬────────┐
│ │ │ │ │ │
│ arm32 │ mips32 │ sparc32 │ systemz │ x86_16 │
│ arm64 │ mips64 │ sparc64 │ │ x86_32 │
│ arm_tb │ │ │ │ x86_64 │
└────────┴────────┴─────────┴─────────┴────────┘
Wenn du die aktuelle Architektur wechseln möchtest, gib Folgendes ein:
L:dsm:x86_32 > setarch arm32
[+] Architecture of dsm changed to arm32
Wenn du einen Shellcode erstellst, benötigst du Syscalls. Um mit Shellen nach Syscalls zu suchen, gib sys und den Namen des gewünschten Syscalls ein. Shellen erstellt eine Liste von Syscalls, die den gesuchten Syscall enthalten könnte.
L:asm:x86_32 > sys open
┌────────┬───────┬──────────────────────┬──────────────────────┬──────────────┬──────────────┐
│ name │ eax │ ebx │ ecx │ edx │ esi │
├────────┼───────┼──────────────────────┼──────────────────────┼──────────────┼──────────────┤
│ open │ 0x05 │ const char *filename │ int flags │ umode_t mode │ - │
│ openat │ 0x127 │ int dfd │ const char *filename │ int flags │ umode_t mode │
└────────┴───────┴──────────────────────┴──────────────────────┴──────────────┴──────────────┘
sys gibt eine Liste möglicher Varianten für den angegebenen Syscall aus. Die Syscall-Tabelle, die Shellen durchsucht, hängt von der gewählten Architektur und dem Betriebssystem (OS) ab. In diesem Fall ist die Architektur x86_32 und das Betriebssystem Linux.
Shellen kann dir je nach Schlüsselwort eine Liste gängiger Shellcodes anzeigen. Die Schlüsselwortsuche von Shellen nutzt die API von shell-storm.org (Dank an den Autor!) und kann wie folgt verwendet werden:
L:asm:x86_32 > shell <keyword> <count>
Beachte, dass der Parameter count nicht erforderlich ist. Im Abschnitt Bilder gibt es ein Bild der Ausgabe von shell <keyword> <count>.
Derzeit wird Shellen nur unter Linux unterstützt. Wenn du Funktionen für Windows oder MacOS hinzufügen möchtest, erstelle ein Issue und ich werde die Unterstützung hinzufügen.
Wenn du ein Problem/einen Bug oder etwas Ähnliches findest, erstelle ein Issue zu diesem Problem. Wenn du außerdem denkst, dass eine Funktion eine schöne Ergänzung für Shellen wäre, mache dasselbe – erstelle ein Issue und ich werde versuchen, deine gewünschte Funktion hinzuzufügen.
asm und dsmNur ein paar Bilder. (Sie sind veraltet, weil verschiedene Funktionen hinzugefügt wurden)
help |
| Zeigt die Hilfemeldung an. |
quit,q,exit | Beendet die aktuelle Sitzung und beendet das Programm |