0%

SUSCTF2022 java复现

为什么我是SUSCTF的出题人加运维还要复现自己的比赛的java呢?
因为我是垃圾,不会java,现在开始学(其实是某天晚上想去打D3然后发现已经开赛一小时不能注册然后没事做了)
但是出题人说并不想公布环境,所以。我也就不好分享环境了

从运维的角度讲一下这次比赛这两个题反复revenge的情况和出题人的预期解吧

baby gadget1 & revenge

jdk使用的版本是8u181(上帝视角。感觉做题的时候会有点猜,这个事情赛后也被师傅们吐槽了。。。。),这个版本是LDAP Reference修复的前一个版本,也就意味着JNDI注入即可rce。但是这个题配了openrasp,执行命令会被拦截(然后我再学一下openrasp的配置)

阅读全文 »

SUSCTF2022 出题笔记

菜狗第一次承办这么大的比赛,人都麻了,呜呜。
几天高强度当客服希望能给师傅们带来好一点的体验。相较于较为官方的wp和源码,这个小小的博客记录一下出题的心路历程,以及各种碎碎念(说起来比赛到一半被某个师傅抓包博客了,幸好之前没把这些东西放上去)
官方wp
我的题目的源码以及部分poc

checkin

赛宁说要用discord以及与国际接轨,又说一血播报最好是个机器人。就脑袋一拍写了这么个东西。然后比赛全程使用英文,然后我的Chinglish遭到了许多师傅的吐槽。呜呜,因为我的智力条件你也知道.jpg

没有任何的难度,如果你仔细看了题目描述的话。。。PM的意思是private message,再翻译一下就是私聊。。。然后bot只会在challenge-checkin频道工作,但是还是有好多人在misc频道疯狂发>PM之类的东西,麻了。我在里面反复提醒,大伙也不看历史记录,就憨憨的在里面狂发,感到无奈。。。

阅读全文 »

DiceCTF2022究极坐牢

太难了,我直接坐牢

十个web复现都不知道要复现到什么时候
当然,赛时被300解的最简单web爆杀,第二天勉强看了下题等wp了
为什么我这么垃圾呢

说起来他们的web题目都挺短小精悍的,我看的几个题代码都不长,真是tql

(看完几个wp之后感觉都不是特别特别难。。。但是knock-knock这个题看了一个下午我就麻了。。呜呜,早知道快速切换看题了)

阅读全文 »

hgame 2022 web

带着大一萌新一起看题,边做边记录一下,整体坐下来感觉并不是特别好呢。。。感觉比较坑的题占了一小半的数量。。。不过蹭别人的题就不要再逼逼赖赖了

week1

ezauth

先试试jwt cracker,然后Ubuntu16.04的openssl的版本是1.0.2,有点古老
编译起来之后运行报错,翻下代码能发现是EVP_get_digestbyname这个函数似乎有问题,搜索一下大概是这个原因
https://github.com/openssl/openssl/issues/6390

阅读全文 »

[RWCTF2021]wp

好像也一个题不会来着,其实算是个复现吧。。。
以及寒假+过年摸了好久的鱼。。。

Hack into Skynet

最多解的web,是一个加了一个迷之AI的pgsql注入

#!/usr/bin/env python3

import flask
import psycopg2
import datetime
import hashlib
from skynet import Skynet

app = flask.Flask(__name__, static_url_path='')
skynet = Skynet()

def skynet_detect():
    req = {
        'method': flask.request.method,
        'path': flask.request.full_path,
        'host': flask.request.headers.get('host'),
        'content_type': flask.request.headers.get('content-type'),
        'useragent': flask.request.headers.get('user-agent'),
        'referer': flask.request.headers.get('referer'),
        'cookie': flask.request.headers.get('cookie'),
        'body': str(flask.request.get_data()),
    }
    _, result = skynet.classify(req)
    return result and result['attack']

@app.route('/static/<path:path>')
def static_files(path):
    return flask.send_from_directory('static', path)

@app.route('/', methods=['GET', 'POST'])
def do_query():
    if skynet_detect():
        return flask.abort(403)

    if not query_login_state():
        response = flask.make_response('No login, redirecting', 302)
        response.location = flask.escape('/login')
        return response

    if flask.request.method == 'GET':
        return flask.send_from_directory('', 'index.html')
    elif flask.request.method == 'POST':
        kt = query_kill_time()
        if kt:
            result = kt 
        else:
            result = ''
        return flask.render_template('index.html', result=result)
    else:
        return flask.abort(400)

@app.route('/login', methods=['GET', 'POST'])
def do_login():
    if skynet_detect():
        return flask.abort(403)

    if flask.request.method == 'GET':
        return flask.send_from_directory('static', 'login.html')
    elif flask.request.method == 'POST':
        if not query_login_attempt():
            return flask.send_from_directory('static', 'login.html')
        else:
            session = create_session()
            response = flask.make_response('Login success', 302)
            response.set_cookie('SessionId', session)
            response.location = flask.escape('/')
            return response
    else:
        return flask.abort(400)

def query_login_state():
    sid = flask.request.cookies.get('SessionId', '')
    if not sid:
        return False

    now = datetime.datetime.now()
    with psycopg2.connect(
            host="challenge-db",
            database="ctf",
            user="ctf",
            password="ctf") as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT sessionid"
           "  FROM login_session"
           "  WHERE sessionid = %s"
           "    AND valid_since <= %s"
           "    AND valid_until >= %s"
           "", (sid, now, now))
        data = [r for r in cursor.fetchall()]
        return bool(data)

def query_login_attempt():
    username = flask.request.form.get('username', '')
    password = flask.request.form.get('password', '')
    if not username and not password:
        return False

    sql = ("SELECT id, account"
           "  FROM target_credentials"
           "  WHERE password = '{}'").format(hashlib.md5(password.encode()).hexdigest())
    user = sql_exec(sql)
    name = user[0][1] if user and user[0] and user[0][1] else ''
    return name == username

def create_session():
    valid_since = datetime.datetime.now()
    valid_until = datetime.datetime.now() + datetime.timedelta(days=1)
    sessionid = hashlib.md5((str(valid_since)+str(valid_until)+str(datetime.datetime.now())).encode()).hexdigest()

    sql_exec_update(("INSERT INTO login_session (sessionid, valid_since, valid_until)"
           "  VALUES ('{}', '{}', '{}')").format(sessionid, valid_since, valid_until))
    return sessionid

def query_kill_time():
    name = flask.request.form.get('name', '')
    if not name:
        return None

    sql = ("SELECT name, born"
           "  FROM target"
           "  WHERE age > 0"
           "    AND name = '{}'").format(name)
    nb = sql_exec(sql)
    if not nb:
        return None
    return '{}: {}'.format(*nb[0])

def sql_exec(stmt):
    data = list()
    try:
        with psycopg2.connect(
                host="challenge-db",
                database="ctf",
                user="ctf",
                password="ctf") as conn:
            cursor = conn.cursor()
            cursor.execute(stmt)
            for row in cursor.fetchall():
                data.append([col for col in row])
            cursor.close()
    except Exception as e:
        print(e)
    return data

def sql_exec_update(stmt):
    data = list()
    try:
        with psycopg2.connect(
                host="challenge-db",
                database="ctf",
                user="ctf",
                password="ctf") as conn:
            cursor = conn.cursor()
            cursor.execute(stmt)
            conn.commit()
    except Exception as e:
        print(e)
    return data

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)
阅读全文 »