Μετάβαση στο περιεχόμενο
  • ChatBox

    ChatBox

    Chatroom Rules

    • Το GreekHacking.Gr είναι ένα ελληνικό forum και επιτρέπεται μόνο η χρήση της Ελληνική Γλώσσας (ούτε greeklish).
    • Δεν επιτρέπονται οι βρισιές και γενικά η χρήση χυδαίας γλώσσας.
    • Απαγορεύεται αυστηρά το πορνογραφικό, προσβλητικό και βίαιο περιεχόμενο.
    • Μην χρησιμοποιείτε κεφαλαία γράμματα η σύμβολα.
Ecstasy

Remote Heap Vulnerability | Protostar final2

Recommended Posts

Ecstasy

Σε αυτό το tutorial χρειάζεται λίγη γνώση απο binary exploitation, c programming, python, gdb, assembly, understanding of malloc algorithm

Ας αρχίσουμε διαβάζοντας τον κώδικα για να βρούμε πιο ειναι το πρόβλημα στο πρόγραμμα.

https://exploit.education/protostar/final-two/#source-code

Ο σέρβερ τρέχει στην θύρα 2993.

Για να μας διευκολύνει και να εστιάσουμε μόνο στο heap vulnerability κάποια μέρη του κώδικα τα έχουν κρύψει οπότε δεν χρειάζεται να ασχοληθούμε με αυτά.Το πρόγραμμα αρχίζει καλώντας την συνάρτηση get_requests() η οποία τρέχει ενα while loop 255 φορές άμα στείλουμε στον σέρβερ 128 bytes τα οποία αρχίζουν απο FSRD.Άμα δεν το κάνουμε αυτό η συνάρτηση κανει break και πάει στο for loop που εκεί κάνει free τα chunks που έγιναν allocate από το calloc.

int get_requests(int fd)
{
  char *buf;
  char *destroylist[256];
  int dll;
  int i;

  dll = 0;
  while(1) {
      if(dll >= 255) break;

      buf = calloc(REQSZ, 1);
      if(read(fd, buf, REQSZ) != REQSZ) break;

      if(strncmp(buf, "FSRD", 4) != 0) break;

      check_path(buf + 4);     

      dll++;
  }

  for(i = 0; i < dll; i++) {
                write(fd, "Process OK\n", strlen("Process OK\n"));
      free(destroylist[i]);
  }
}

Άρα όταν στείλουμε στον σέρβερ για παράδειγμα FSRD + 'A' *124 (total: 128 bytes) το πρόγραμμα θα καλέσει την check_path συναρτηση η οποία σαν parameter θα πάρει τους χαρακτήρες μετα το FSRD.Μετά στο check_path τσεκάρει αμα υπάρχει στο input που του δώσαμε ο χαρακτήρας '/' γυρίζει ενα pointer(στο τελευταίο '/' που θα βρεί) και μετράει το μέγεθος σε bytes απο το '/' μεχρι να συναντήση NULL TERMINATOR '0x00'.   Άμα υπάρχει '/' τότε ψάχνει με το strstr την λέξη ROOT και άμα την βρεί ψάχνει τον χαρακτήρα '/' πίσω στην μνήμη απο το ROOT.Όταν τελειώσουν όλα αυτά καλεί το memmove όπου μεταφέρει l bytes δηλαδή όσα υπολόγισε απο το τελευταίο '/' μεχρι το NULL Terminator από το p που ξαναλέω ειναι το τελευταίο '/' μεχρι το NULL terminator στο start που έιναι το '/' που βρέθηκε πριν το ROOT μεχρι το Null terminator.

void check_path(char *buf)
{
  char *start;
  char *p;
  int l;

  /*
  * Work out old software bug
  */

  p = rindex(buf, '/');
  l = strlen(p);
  if(p) {
      start = strstr(buf, "ROOT");
      if(start) {
          while(*start != '/') start--;
          memmove(start, p, l);
          printf("moving from %p to %p (exploit: %s / %d)\n", p, start, start < buf ?
          "yes" : "no", start - buf);
      }
  }
}

spacer.png

Παράθεση

Αλλά τι γίνεται άμα δώσουμε στον σέρβερ αυτό: FSRDROOT/BBBBB     ??? Ε λοιπόν εκεί είναι το πρόβλημα του προγράμματος.Το while loop θα συνεχίσει να κοιτάζει πίσω στην μνήμη στο heap μεχρι να βρεί το '/' και πολύ πιθανόν να κρασάρει πηγαίνοντας έξω από το start variable.Ας φτιάξουμε ένα σχέδιο στο απο πως ενα τέτοιο πρόβλημα μπορεί να γίνει exploited για να πάρουμε shell.

Κάνουμε ssh στο virtual machine του protostar με ssh root@ip με κωδικό godmode.Φτιάχνουμε ενα αρχείο έτσι ώστε να τρέχει κάθε φορά που ανοίγουμε το gdb έτσι ώστε να κάνει την δουλεία μας πιο έυκολη.

set disassembly-flavor intel
set follow-fork-mode child
set pagination off

break *check_path+117
commands
x/3wx $esp
end

run

Πρώτα θέτουμε το disassembly-flavor δηλαδή τα op codes σε intel γιατί προσωπικά με αυτά έχω μάθει να δουλεύω, μετά το επόμενο command είναι για να ακολουθήσει το gdb το child proccess το οποιο δημιουργεί το πρόγραμμα όταν δέχεται σύνδεση.Κάνουμε ένα break στο check_path+117 δηλαδή στο memmove και κανουμε print τα πρώτα τρια values στο stack οπου θα βρίσκονται τα parameters start, p, l.

Μετά για να είναι τελείως αυτοματοποιημένο δημιουργούμε ενα sh αρχείο.

#!/bin/bash

gdb -p $(ps aux | grep final2 | head -n 1 | awk '{print $2}') -x /tmp/gdb 
#το πρωτο parameter ψάχνει το pid του final2 και το κάνει attach στο gdb και το δεύτερο φορτώνει τα commands που έχουμε στο προηγούμενο αρχείο #που φτιάξαμε
#chmod +x /tmp/gdb.sh

Τρέχουμε το /tmp/gdb.sh και στην δικιά μας μηχανή τρέχουμε το send.py(Συμπληρώνει στην αρχή το FSRD και κάνει το μήνυμα να είναι 128 bytes) με python -i send.py ip address.Θα πετάξει interactive shell οπου μπορούμε να στείλουμε με το send command input στον σερβερ.Για παράδειγμα άμα του στείλουμε send("/ROOT/AAAA")To gdb θα κάνει output 3 values στο stack που τα πρώτα δύο είναι pointers στο start, p και το τριτο integer στο l

spacer.png spacer.png

Δοκίμασε να στείλεις ROOT/AAAA καί δες τι value έχει το start parameter δηλαδή το πιο πάνω στο stack στην περιπτωσή μου πάνω ήταν το 0x0804e010.

ΘΑ ΣΥΝΕΧΙΣΩ ΤΟ TUTORIAL ΑΥΡΙΟ :)) ΜΕΧΡΙ ΤΟΤΕ ΣΑΣ ΒΑΖΩ CHALLENGE ΝΑ ΔΙΑΒΑΣΕΤΕ ΚΑΙ ΝΑ ΚΑΤΑΛΑΒΕΤΕ ΤΟ MALLOC ALGORITHM

https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/

Και εδώ ένα post το οποίο μιλάει για την ευάλωτη version του heap algorithm το 2001 του doug lea στο οποιο βασίζεται αυτο το tutorial

http://phrack.org/issues/57/9.html

 

send.py

Edited by Ecstasy

Μοιράσου αυτή την δημοσίευση


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Απάντηση στο θέμα...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



ChatBox

ChatBox

Chatroom Rules

  • Το GreekHacking.Gr είναι ένα ελληνικό forum και επιτρέπεται μόνο η χρήση της Ελληνική Γλώσσας (ούτε greeklish).
  • Δεν επιτρέπονται οι βρισιές και γενικά η χρήση χυδαίας γλώσσας.
  • Απαγορεύεται αυστηρά το πορνογραφικό, προσβλητικό και βίαιο περιεχόμενο.
  • Μην χρησιμοποιείτε κεφαλαία γράμματα η σύμβολα.
×
×
  • Create New...