浏览器标题切换
浏览器标题切换end
把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

Hackergame2022 Writeup

萌新的第一次hackergame记录!

本writeup根据思路顺序呈现,所以可能有点啰嗦

赛中解决的题目

签到

还不太适应模式,刚进去的时候玩了好久的画图,然后F12打开network->result把代码copy到vscode里面盯了十几二十分钟试图篡改时间戳,结果失败

然后回去再看了一下网址栏发现直接把4个问号改成2022就好了

猫咪问答easy-version

前三道题,第一道直接百度战队名就可以在新闻里面找到成立时间了,第二道题可以在中科大的LUC协会官网找到对应的那场会议的录屏(点进去评论区全是猫咪问答就知道找对了233),然后再搜了一下kde是什么上官网找了找发现了这个应用的名字,第三题的话上Wikipedia半分钟就能找到了

第六题的话,找到了2011/01/01但是好像不是这个时间..并没有告诉我更早的时间,4应该是直接上github找对应的仓库就可以了,然而网址的解密至今没有想法喵,所以就弃置了打算等如果写出来网址解密就继续扒一扒这两题。

旅行照片2.0

第一题查了一下exif是什么东西,惊为天人(下次回家就扒我爸照片看看他那些照片的iso和光圈还有快门速度都是怎么调了,直接开学!)然后把这张照片扔到一个在线的exif解析平台就能看到第一题要求的所有信息了

第二题的话,一开始查exif是什么东西的时候得知照片种可能有GPS信息,于是查了查怎么写扒照片里的GPS信息的代码,但是搞完后发现并不带这个信息,于是只能稍微裁了一下照片然后去google识图发现是日本千叶海洋球场(带夕阳直接找出来一堆奇怪的地方x),于是邮编get,手机型号的话上淘宝找了小米的手机哪个后置摄像头跟反光照出来的一样,至于找飞机还是太过魔幻,感觉应该是降落在成田国际机场的,但是试了几个方向正确的飞机,现在还没成功...也暂且弃疗了

家目录里面的秘密

vscode部分,我是所有有代码的翻出来然后ctrl+F找flag关键词的,不过出于习惯的找文件路径很快在某个文件夹下的user/history的文件中找到了,rclone就没有啥思路了(查了一下是个什么东西,但是不知道从何下手...等writeup出来再看看)

企鹅拼盘(4bit)

16种情况,一个个试就行了

HeiLang

怎么还嘲讽赛博丁真(乐

把每个|替换成“]=a[”让它能够运行就行了,不是很会用正则表达式所以干脆写了个cpp替换了一下

Xcaptcha

一个让我学到许多也破防许多的题目,写了大概两天半,以下是曲折的心路历程

一开始检查元素查了一下,发现需要发送post请求,看过了很多人本以为是静态的于是靠手速截图ocr了一下把算式搞出来然后用urllib写了个post交了一下结果连进都没进去...

然后再试了一次发现每次刷新cookie都会变,而且验证所需的算式也是动态的(这时候才发现有个Preserve Log的按键而不用靠手速来点(捂脸),并且这时候发现点进去有一个get请求,并且发现同次的post的cookie以及get的set-cookie是相同的,这时候就觉得应该可以先进行get请求然后通过它获取cookie还有算式的数据然后再来发送一个post完成提交。

思路有了,但是具体实现完全没有想法。(这对于只学过一点点python语法还有c#语法的小白还是有点困难了)决定面向搜索引擎编程,首先查了一下怎么获取动态cookie,了解到了原来有selenium这个库,跟着教程捣鼓安装然后敲了个get的代码获取了一个cookie,然后就思考如何获取算式,因为之前学爬虫学到xpath就因为军训歇下来了没有继续了,于是打开了尚硅谷继续从爬虫视频里面学习xpath的语法:)然后分别尝试了在线和离线两种的解析方式,在线的报错没有看懂,于是干脆把get获取的page_source放到本地,然后用etree离线搞一下,结果发现!meta nmd不是完全对称的没法用xpath...破防...于是干脆使用暴力一点的做法,看了一下page是str类型的,那我大力split!一个个遍历定位!然后再转int累加(这时代码就逐渐oi向了起来)

可以了,那综合一下再用urllib发个post,“验证失败”,经过一番思考并做无用功的捣鼓,把selenium的get_cookies也改成从headers里面用相同的方法暴力获取set-cookies..但是还是不行(成果是让代码几乎完全oi风格化了x)

一小时后终于发现应该是这个urllib+selenium的实现和我的需求不对应,应该是等价变成打开两次网页,或者说打开网页的想法就是错误的,于是决定干脆学了一个半爬虫库了干脆再学一个request...

第三天:request堂堂速通!思路是一样的,所以问题应该就是我上面写的缝合怪的问题了...实现方法都是完全一样的(代码量还是上面的\(\frac{1}{3}\)

干脆把两份代码都放一下吧

import requests

if __name__ == "__main__" :
    hd = {
        "Cookie" : "session=.eJwdkMtOAmEMhd9ltk5i73_rjiiR0ZgwIsRxKxgRIvcAGt_d6qJJc9rznabf1X522ldXFZqZOzkUL6KkKl4zCwcUcY-ioG451QgmFkAtqVApFjUpCVpoCLJzYUMT8uLKCCKhRRGCtEZRcyGDwMIFXEAQU0kYiAOFcFJKjUbABOCEUXLTc5yx6VR1BMpMFKmR0FHDJMjdAhgTy3_UKOxq5JTFNRnbfxoAslkekUlgaURktWwgzKiqq_1qMfvMZ6Rbrh763XXT3szb-Wj-1a6PH9vp8XJ_PkpzQbulL7rFYNgO-xMadxNf6GrXNu-9Zr25fRuOX_pPMtPB_e7w2G7Pp52dJ8vNc3PXpDId9Q7yOu2qn1-2QV2j.Y1qc9w.EypWQ93Hpc-evjQJf-dRU21WFKM",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
    }
    url = "http://202.38.93.111:10047/xcaptcha"
    # url = "http://baidu.com"
    #req = requests.get(url=url,headers=hd)
    req = requests.get(url=url,headers=hd)
    hd["Cookie"] = req.headers['Set-Cookie']
    data = {
        "captcha1" : "",
        "captcha2" : "",
        "captcha3" : ""
    }
    content = req.text
    string_list = content.split()
    ans = 0
    checklist = [0] * 3
    for i, S in enumerate(string_list) :
        if S == "的结果是?</label>" :
            checklist[ans] = str(string_list[i-1])
            ans = ans + 1
    Ans = [0] * 3
    for i, S in enumerate(checklist) :
        List = S.split('>')
        List1 = str(List[1]).split('+')
        Ans[i] = int(List1[0]) + int(List1[1])
    data["captcha1"]=str(Ans[0])
    data["captcha2"]=str(Ans[1])
    data["captcha3"]=str(Ans[2])

    req1 = requests.post(url=url,headers=hd,data=data)
    print(req1.text)

下面是我失败的缝合怪代码...

import urllib.parse
import urllib.request
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from seleniumwire import webdriver
import time

if __name__ == "__main__" :
    option = webdriver.ChromeOptions()
    option.add_experimental_option('useAutomationExtension',False)
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    Cookie1 = dict(
        name = "session", 
        value = ".eJwdkMtOAmEMhd9ltk5i73_rjiiR0ZgwIsRxKxgRIvcAGt_d6qJJc9rznabf1X522ldXFZqZOzkUL6KkKl4zCwcUcY-ioG451QgmFkAtqVApFjUpCVpoCLJzYUMT8uLKCCKhRRGCtEZRcyGDwMIFXEAQU0kYiAOFcFJKjUbABOCEUXLTc5yx6VR1BMpMFKmR0FHDJMjdAhgTy3_UKOxq5JTFNRnbfxoAslkekUlgaURktWwgzKiqq_1qMfvMZ6Rbrh763XXT3szb-Wj-1a6PH9vp8XJ_PkpzQbulL7rFYNgO-xMadxNf6GrXNu-9Zr25fRuOX_pPMtPB_e7w2G7Pp52dJ8vNc3PXpDId9Q7yOu2qn1-2QV2j.Y1qc9w.EypWQ93Hpc-evjQJf-dRU21WFKM"
        )
    url = "http://202.38.93.111:10047/xcaptcha"
    urll = "http://baidu.com"
    s = Service("C:\Program Files\Google\Chrome\Application\chromedriver.exe")
    driver = webdriver.Chrome(service=s,options=option)
    driver.get(url)
    #print(driver.page_source)
    driver.add_cookie(Cookie1)
    driver.get(url)
    #print(driver.page_source)
    #time.sleep(20)
    strr = ""

    # 获取response-headers 的 cookie
    for request in driver.requests :
        txt = str(request.response.headers)
        #print(txt)
        List2 = txt.split()
        for i, S in enumerate(List2):
            if S == 'Set-Cookie:' :
                strr += List2[i+1]
                strr += List2[i+2]
                strr += List2[i+3]
                break
    strrr = ""
    LList = strr.split(';')
    index = 0
    for i in LList :
        index = index + 1
        strrr += i
        if index != 3 :
            strrr += '; '
    strr = strrr
    #print(strr)
    # 获取request-headers 的 cookie
    # for request in driver.requests :
    #     txt = str(request.headers)
    #     List2 = txt.split()
    #     print(List2)
    #     for i, S in enumerate(List2):
    #         if S == 'Cookie:' :
    #             strr += List2[i+1]
    #             break
    
    text = driver.page_source
    string_list = text.split()
    ans = 0
    checklist = [0] * 3
    for i, S in enumerate(string_list) :
        if S == "的结果是?</label>" :
            checklist[ans] = str(string_list[i-1])
            ans = ans + 1
    Ans = [0] * 3
    for i, S in enumerate(checklist) :
        List = S.split('>')
        List1 = str(List[1]).split('+')
        Ans[i] = int(List1[0]) + int(List1[1])
    #    print(List1[0], List1[1], Ans[i])

    # # captcha1 = driver.find_element("xpath", '//label[for="captcha1"]/text()')
    # # # 搞不懂搞不懂
    # # print(captcha1)

    hd = {
        "Cache-Control": "max-age=0",
        "Content-Length": "29",
        "Content-Type": "application/x-www-form-urlencoded",
        "Cookie": "",
        "Host": "202.38.93.111:10047",
        "Origin": "http://202.38.93.111:10047",
        "Proxy-Connection": "keep-alive",
        "Referer": "http://202.38.93.111:10047/",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
    }
    hd["Cookie"] = strr
    data = {
        "captcha1":"337605126759167072227735090115749459132", 
        "captcha2":"275363884278949671003218244434521978720",
        "captcha3":"449082777171456801985478338295611554214" 
    }
    data["captcha1"]=str(Ans[0])
    data["captcha2"]=str(Ans[1])
    data["captcha3"]=str(Ans[2])
    data = urllib.parse.urlencode(data).encode('utf-8')
    R = urllib.request.Request(url=url, data=data,headers=hd)
    response = urllib.request.urlopen(R)
    content = response.read().decode('utf-8')
    print(content)

LaTeX 机器人

  • 没有特殊字符的part

本来看到这题以为是sql注入的,都已经打开sql注入的语句列表准备突击速成了,不过在此之前还是打算先了解一下如何通过这个latex的实现流程或者照片的生成进行攻击,于是google查找了一下“pdflatex漏洞”,结果找到了一篇非常有启发性的文章,在其中发现了latex有\input和\write18等实现,并在知乎找到了另一个与图片有关的sql注入,这时候大概脑子里有了一点模糊的方向。然后点开了他的压缩包仔细读了一下(现在居然也能读懂没学过的语言大概是在干啥了),发现实现规则实际上是将

\documentclass[preview]{standalone}
\begin{document}
$$
$$
\end{document}

这两段分别插入你写的数学公式的前后,而flag1又保证了只有普通字符,那我只需要对上下的两个$$分别再匹配一次然后\input flag1就行了

最终实现是

qaq$$ \input{/flag1} $$qwq
  • 有特殊字符的part

把/flag1换成/flag2后发现无法编译,接着去上了节体育课,在体育课时有了几个想法

  1. 首先一开始根据查到的信息脑补了一个获取信息然后插入到生成图片的exif上面的方法,但是觉得实现难度太高了就完全没去想怎么写了。然后在写flag1之前查了一下input的实现,发现是直接把文本copy过来到这个tex里面,那我只需要这个copy过来的文本没有特殊字符就行了——刚才又了解到write18方法可以直接打开shell,那么我只要写一个shell里面的命令把flag2里面的特殊字符替换一下就行了!

    结果晚上写了一下发现不行...觉得可能是服务器没有给改文件的权限,于是放弃了这条路,代码如下

     qwq$$
     \immediate\write18{
     sed -i 's/#/bar/g' 's/_/Bar/g' flag2
     }
     \input{/flag2}
     $$qaq
    
  2. 另一种朴素的想法是,那我换成\text{}直接强转为文本输出,但是也会转义,那另一种思路应该就是找个不转义内容但能在最终生成的pdf中呈现内容的method。我唯一想到的是要么使用\url方法将这个flag2作为url输出要么这个作为latex中的代码块输出..但是因为它们都要用到特定的宏包但我又不能额外使用宏包而寄了...在接下来的三个小时高强度尝试了我所知的各种不需要用到usepackage的latex命令,并在过程中发现了一个tex论坛,后来逐渐从google转到了tex论坛中高强度检索,然后找到了\verbatim这个命令,接着往下找,发现了\VerbatimInput并在一个五年前的帖子中找到了和我同样需求的人(帖子)

    但我尝试这个后bot解析不了..这个东西也需要宏包...变成了狂暴翻帖组长,继续想了想,想到\def和\newcommand这种类似#define的命令如果可以传入参数的话可能就会先将语句执行出来后再进行语块组合,那么newcommand又可以自定义参数,于是定义了这么一个命令传了三个参数也寄了,此时已经接近凌晨两点了,于是摆烂睡觉。

    第二天起床不是很甘心,继续研究了一下发现一个帖子里面说newcommand不能包含\end{}命令会报语法错误,于是把昨晚那个传3个参数改成传2个参数然后\end{verbatim}独立出来,就解决了...(所以其实昨晚熬到两点也是可以解决问题的,雾)

    最终的命令很简洁:

    qwq$$
    \newcommand\qwq[2]{#1 #2}
    \qwq{\begin{verbatim}}{\input{/flag2}}
    \end{verbatim}
    $$qaq
    

写完latex-bot这题也就剩一两个小时比赛结束了,最终结果是1050分,给我的感觉就是hackergame真好玩但是我已经要变成狂暴补作业组长了...因为在比赛开始三天我才在GZTime等学长在群里复读“来打hackergame谢谢喵”才发现原来hackergame开始了:),所以时间其实不是很充足,不过还好因为是大一大部分课可以摸鱼想题勉强还行,可能多个一两天时间能再突击学习一点多混个两三百分吧,不过现在这个分数我也很满意了,毕竟只是刚接触这玩意的萌新一枚,每道题都花了大量时间学相关概念...

四天半的突击hackergame也确实让我受益匪浅,了解并实践了HTTP的get和post请求,掌握了一些开盒技巧,对漏洞利用有了一点粗浅的认知,了解了大量的latex语法(相比以前),突击学习了三个爬虫库,掌握了不少使用搜索引擎的实用技巧,发现了一个很有用的tex论坛(环境非常和谐)...不过了解到了很多接下来可以学习的方向感觉是最大的收获(果然任务驱动式学东西更加适合我,就是累死个人)

明年还打!

rank.png

赛后一周,终于把前面沉迷hackergame而欠下的作业补完,趁现在还没进入高强度icpc备赛,决定继续补一下题,就在这里记录一下补题记录。

补题

微积分计算小练习

赛时看到这道题的时候就觉得应该是个漏洞注入的题目,不过当时不知道怎么下手,赛后看了一下别人的writeup发现是个xss注入,于是去学习了一下xss注入的姿势。

在搜索的时候发现了美团技术平台的一篇文章,翻了翻受益颇多,了解到了xss注入的基本概念和对应的一些操作,这时候回去看一眼题目,随便提交了个12345看了一下源码,发现greeting的代码是直接拼接了username上去的,那么这应该就是xss注入的注入点了,打开bot.py看了看,发现了代码driver.execute_script(f'document.cookie="flag={FLAG}"') 逻辑大概是flag被放在了document.cookie里面(不由感慨写xctptha的时候高强度突击爬虫库现在居然基本看得懂selenium了),又没有任何敏感词过滤,那应该直接注入将cookie放到greeting上面就可以了。不过读取图片失败就执行js脚本这个trick在没有看writeup之前确实没能想到。

<img src = a onerror= 'var a=document.cookie;document.querySelector("#score").textContent=a;'>

于是就输出了flag{xS5_1OI_is_N0t_SOHARD_23e903464f},xss注入真是太奇妙辣

同时在美团技术平台上面那篇文章给了点xss注入小练习的链接,于是决定顺便去玩一下,把链接放在这里

alert(1) to win

prompt(1) to win

XSS game

posted @ 2022-10-29 13:01  henry_y  阅读(146)  评论(0编辑  收藏  举报