中科大Hackergame2019部分WP

前阵子打了中科大主办的一个hackergame2019,题目还可以,一个人打的,比较菜,就做了几个WEB题MISC和一个比较简单的数学题。850分,排名423/1904(我太菜了,请不要喷)因为大佬众多,就不班门弄斧了,就写一下自己做出来的题吧。

 

WEB

签到题

很简单的输入token获取flag

什么按钮点不了?你还是别打CTF了,页面源码中

Disabled属性去掉就可以了

信息安全2077

Emmmmm打开题目发现居然还有这么久才到2077年,等到2077年都举办了多少届hackergame了,遂抓包,发现了第一个包里面看到的时间判断,我们需要通过POST的方式来取得flag

后该题复现的时候出现一些小问题(可能是环境关了?也可能是其他不可预知错误)导致后来抓到的包和之前的不一样,反正只要在前端审计的时候知道POST出去的包中的时间改为2077,UA头修改为黑曜石浏览器以后的就可以取得flag了

当时得到的flag是flag{Welc0me_to_competit1on_in_2077}

网页读取器

贴一下源码

from flask import Flask, render_template, request, send_from_directory
import requests  # well, requests is designed for humans, and I like it.


app = Flask(__name__)
whitelist_hostname = ["example.com",
                     "www.example.com"]
whitelist_scheme = ["http://"]


def check_hostname(url):
    for i in whitelist_scheme:
        if url.startswith(i):
            url = url[len(i):]  # strip scheme
            url = url[url.find("@") + 1:]  # strip userinfo
            if not url.find("/") == -1:
                url = url[:url.find("/")]  # strip parts after authority
            if not url.find(":") == -1:
                url = url[:url.find(":")]  # strip port
            if url not in whitelist_hostname:
                return (False, "hostname {} not in whitelist".format(url))
            return (True, "ok")
    return (False, "scheme not in whitelist, only {} allowed".format(whitelist_scheme))


@app.route("/")
def index():
    return render_template("index.html")


@app.route("/request")
def req_route():
    url = request.args.get('url')
    status, msg = check_hostname(url)
    if status is False:
        # print(msg)
        return msg
    try:
        r = requests.get(url, timeout=2)
        if not r.status_code == 200:
            return "We tried accessing your url, but it does not return HTTP 200. Instead, it returns {}.".format(r.status_code)
        return r.text
    except requests.Timeout:
        return "We tried our best, but it just timeout."
    except requests.RequestException:
        return "While accessing your url, an exception occurred. There may be a problem with your url."


@app.route("/source")
def get_source():
    return send_from_directory("/static/", "app.py", as_attachment=True)


if __name__ == '__main__':
    app.run("0.0.0.0", 8000, debug=False)

可以看到这是需要我们构造一个SSRF来读取,但是可以看到这边它进行了相应的过滤,但是却把@符号前面的都作为了用户名部分,于是直接构造如下payload:

http://202.38.93.241:10020/request?url=http%3A%2F%2Fweb1%2Fflag%3F%40example.com

达拉崩吧大冒险

这题挺有意思的,猜到了是大整数溢出,但是我是一次次试出来的,第一次直接给了个巨大的负数,加了几次不动了…于是开始不大的负数一点点加,差不多点了5分钟,终于变正了,这题参考一下别人的WP。

在王大妈这里,买入鲜美香脆可口甘甜现炸童子鸡可提升攻击力。通过修改网页代码,发现支持买入负数只鸡。此时攻击力会降低,而金钱会增加。但我们需要的是增加攻击力去打恶龙昆图库塔卡提考特苏瓦西拉松,钱再多也没用啊!

多次尝试后可得出,先买入 -MaxInt64 只(-9223372036854775808)童子鸡,此时攻击力会变成非常小的一个负数。再买入 -1 只童子鸡,攻击力会溢出,变为非常大的一个正数。(实际有很多种买法,让攻击力变得太小溢出即可)

第一步进入市场买鸡,将value改为-maxint64,提交

第二次再去买,改成-1即可溢出,攻击变正了

直接去打恶龙,打败恶龙取得flag

Math

宇宙终极问题

根据要求通过nc访问题目,输入token后出现如下问题

三个数的立方加起来等于42???我懵逼了,Google一下发现是著名的三立方问题,找到答案后输入取得flag

看到第二个问题我更懵了,遂放弃…后来看官方WP:谷歌一下就好了啊(我:???)

MISC

在这场比赛里MISC好像被分类为了General,不过并不影响

白与夜

这道题打开了就是一个图片,想到了图片隐写

用stegsolve打开直接看到了??

据我估计可能是两张透明度不同的图片叠加所致,直接通过Windows自带的照片工具看不出来,用有些工具可以很明显看到空白像素方块。

正则验证器

首先我们下载一下源码:

#!/usr/bin/env python3

import signal
import re


def flag(*args, **kwargs):
    print(open("flag").read())
    exit()


def main():
    print("Welcome to the free online Regular Expression Verifier")
    print("Please enter your RegEx and string and I will match them for you\n")

    r = input("RegEx: ")
    if len(r) > 6:
        print("Sorry your regex is too long.")
        exit()
    s = input("String: ")
    if len(s) > 24:
        print("Sorry your string is too long.")
        exit()

    r = re.compile(r)
    signal.signal(signal.SIGALRM, flag)
    signal.alarm(1)
    m = r.search(s)
    signal.alarm(0)
    if m:
        print("Your regex matches the string!")
    else:
        print("Your regex doesn't match the string!")


if __name__ == "__main__":
    signal.alarm(30)
    main()

可以看到程序执行了正则表达式的匹配,根据题目给出的提示:

一开始看的一脸懵逼,还请教了多位开发大佬,都说正则运行极快,那如何在6个字符以内的正则表达式对一串24个长度的字符串进行匹配还超过一秒呢?多方查找后,发现了一种叫做正则表达式DDOS的方法,一篇介绍的比较详细的文章链接如下:

https://www.freebuf.com/column/201766.html

以下题是比赛后才解出来的:

Happy LUG

题目给了这一张图,显然这是一个域名,当我们在浏览器中输入的时候无情返回错误

但是发现表情被解析成了xh–g28h

多方查阅资料后发现这和中文域名的原理差不多,是将包含特殊字符串转换为punycode。关于punycode百度百科解释:Punycode(译为:域名代码)是一种表示Unicode码和ASCII码的有限的字符集。例如:“münchen”(德国慕尼黑)会被编码为“mnchen-3ya”。我靠这也太少了吧,于是去了wiki:https://en.wikipedia.org/wiki/Punycode(非常详细,英文不好的同学自行Googletranslate)

根据渗透测试中信息收集常用的手法进行DNS解析,直接ping无果,nslookup也无果(当时比赛结束前就进行了这两步)。赛后灵光乍现想到Linux下信息收集常用的dig命令,一篇较为详细的文章连接如下https://blog.csdn.net/reyleon/article/details/12976889

针对这个域名直接在kali中运行dig命令是会报错的

因为他当中包含某些字符不被允许,正常情况下例如请求百度返回如下:

我们按照他的要求加上noidnout

返回得到了部分信息,之后试着查询A记录,发现并没有返回(意思大概是不存在IP地址?没有深究过不太了解),继续试着查询其他记录信息(这边直接查了txt记录),命令如下:

dig txt xn--g28h.hack.ustclug.org +noidnout

成功得到flag:flag{DN5_C4N_H4VE_em0ji_haha}

当然DNS的常见记录类型包括了A记录,MX记录,NS记录,CNAME记录,TXT记录,TTL值,PTR值。这个题我们直接执行dig any xn--g28h.hack.ustclug.org +noidnout查询所有记录的方式也是可以得到flag的。

 

由于本人水平有限(实在太菜),自己做出的题的WP就分享到这里。贴一下官方的Git仓库地址,里面包含了所有题目的源码和官方/选手的WP:

https://github.com/ustclug/hackergame2019-writeups

因为那上面的不少大佬WP写的比较迷我也没看懂,再来一篇某排名第四大佬的WP地址:

Hackergame 2019(中科大信安赛)write up

因为WP,某些原因导致图片可能没法看,PDF版本已上传到网盘,有需要的自取

链接:https://pan.baidu.com/s/1hjkPeLrVSiQmnjjf6rAjmA
提取码:vb9p

《中科大Hackergame2019部分WP》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注