强网杯部分题目WriteUp

2022-11-11 20:24:11 浏览数 (1)

MISC

miscstudy

  • 题目描述:本题目flag由7个部分构成,第一个部分为flag{level1...,最后一个部分为 !!!} 每一关都会存有flag的一部分,将所有flag的字符串拼接即为最后flag

首先下载附件,得到一个流量包,粗略的查看一下,发现有很多TLS协议,那么可知是https流量,需要一个ssl.log,但是题目没有直接给出来,那么应该需要我们查看流量包自己找寻。然后查看了一波HTTP流,发现这样一个数据包,且返回的状态码为304(即服务端已经执行了GET,但文件未变化):

访问这个ip地址(http://39.99.247.28/fonts/1),得到了这样一个页面:

那么最后一行以外的就应该是ssl.log,最后一行是flag的一部分。

然后我们将上面的另存为ssl.log,在wireshark里面选择加载以后,发现HTTP流多了一个访问图片的数据流,如下图所示:

那么我们访问这个地址(https://www.qiangwangbei.com/images/4e5d47b2db53654959295bba216858932.png),得到一张图片,将其另存为,用winhex查看末尾除了一个bGV2ZWwzX3N0YXJ0X2l0(即level3_start_it的base64值)以外,还可以看到一大堆如下图所示的base64值:

那么我们解得base64值可以知道这一串是length为3600的01串,那么想到将其转成60*60的二维码,脚本如下:

代码语言:javascript复制
from PIL import Image
fp = open('qrcode.txt','r')
fp1 = Image.new('RGB',(60,60))
a = fp.read()
for i in range(len(a)):
    if a[i]=='0':
        fp1.putpixel((i//60,i`),(0,0,0))
    else:
        fp1.putpixel((i//60,i`),(255,255,255))
fp1.show()

得到一张二维码以后,扫码可得一个百度网盘链接,下载可得一个level4.zip,解压以后得到一张图片,使用stegdetect对其先进行分析:

代码语言:javascript复制
stegdetect.exe -tjopi -s 10.0 level4.jpg

可以发现这张图片是jphide加密,但是我们不知道密码是啥,这时可以用stegdetect下的stegbreak字典破解:

代码语言:javascript复制
stegbreak.exe -r rules.ini -f password.txt -t p level4.jpg

jphide[v5](power123)中的power123即为密码

使用jphide下的工具JPHS从level4.jpg图片提取出隐藏信息:

得到另一个百度网盘链接 level4_here_all,访问下载得到level5.zip,然后解压(队友解压的时候说会出现压缩文件损坏的情况,我用bandizip自动解压没有遇到任何问题),解压以后出现两张图片和level6.zip和level7.zip,其中有一张图片上面写着level5_is_aaa,然后我们先看level6.zip,排除伪加密后查看压缩包内容,发现里面是3个txt,原始大小都不大,那么我们尝试CRC32爆破:

代码语言:javascript复制
import binascii
import string 
import zipfile
dic = 'abcdefghijklmnopqrstuvwxyz0123456789_'
def CrackCrc5(crc):
    for i in dic :
        for j in dic:
            for p in dic:
                for q in dic:
                    for r in dic:
                        s=i j p q r
                        s=bytes(s,encoding="UTF-8")
                        if crc == (hex(binascii.crc32(s))):
                            return s.decode()
def CrackCrc4(crc):
    for i in dic :
        for j in dic:
            for p in dic:
                for q in dic:
                    s=i j p q
                    s=bytes(s,encoding="UTF-8")
                    if crc == (hex(binascii.crc32(s))):
                        return s.decode()
def getcrc32():
    l=[]
    for i in range(1,4):
        file = 'level6.zip'
        f = zipfile.ZipFile(file,'r')
        GetCrc = f.getinfo(str(i) '.txt')
        crc = GetCrc.CRC
        l.append(hex(crc))
    return l
if __name__  == "__main__":
    l = getcrc32()
    print(CrackCrc5(l[0]))
    print(CrackCrc4(l[1]))
    print(CrackCrc5(l[2]))

得到level6_isready,那么还剩下一个1.pnglevel7.zip,然后我们会发现level7.zip里面也有一张图片叫1.png,那么查看一下CRC32,发现1.pnglevel7里面的1.png是一样的,那么就使用明文攻击破解level7.zip

破解完后的level7.zip里面发现有两张看起来一模一样但是大小有明显差异的图片,那么考虑盲水印:

得到一张level7.png:

访问这个网址,F12发现有行注释:

然后注释说是it become a blank(空白的),同时关于 HTML有个叫snow隐写的:

snow 是一款在html嵌入隐写信息的软件, 它的原理是通过在文本文件的末尾嵌入空格和制表位的方式嵌入隐藏信息, 不同空格与制表位的组合代表不同的嵌入信息。

找到一个在线的snow隐写解密网址,输入我们前面访问的网址,密钥为no one can find me

得到最后一部分flag:

把前面的每一块都合起来,得到最后的flag:

flag{level1_begin_and_level2_is_comelevel3_start_itlevel4_here_alllevel5_is_aaalevel6_isreadylevel7isherethe_misc_examaaaaaaa_!!!}

Blockchain

IPFS

  • 题目描述:Do you know IPFS? ( flag = flag{.*} len(flag) = 0x26 , The form of flag is lowercase)

下载附件,得到这样一个文本:

大意就是pic1.jpg分成6块传输,给了每一块的hash values;然后pic2.jpg是一块传输,给了sha256sum

然后我们找到一个api是根据hash values来获得IPFS文件:https://ipfs.io/ipfs/[Hash值]

然后我们把pic1.jpg的6块分别下载,发现有一张是显示了部分图片,如下图所示:

但是其只有开头部分图像,剩下部分没有显示,那么就可以得知其他5块应该是pic1.jpg的数据块,那么我们可以把这六块拼接合成一张图片。然后剩下5块里面有一块大小是20.9KB,其余都是26KB,那么这一块就应该是最末尾那一块,其余四块顺序不知,稍微爆破一下,可以得到下面这样一张图片:

然后我们在对pic2.jpg进行一个恢复,根据这篇文章:https://www.jianshu.com/p/01084174a58d

可知sha256sum得先加上1220得到multihash编码,然后进行Base58加密,得到Hash值

然后访问得到pic2.jpg

那么我们得知flag=flag{md5(hash1 hash2)}

然后现在hash2我们已经知道了,hash1目前还不知道,然后我们查到一个上传的api,然后又因为pic1.jpg是分块传输的(26KB = 26624B),所以根据其写了个脚本:

代码语言:javascript复制
import requests
import json
import hashlib
proxy='127.0.0.1:7890'
proxies={
    'http':'http://' proxy,
    'https':'https://' proxy
}
def add(Path): 
    url = 'https://ipfs.infura.io:5001/api/v0/add?pin=false&chunker=size-26624' 
    with open(Path,'rb') as f: 
        files = {"upload":(Path,f)} 
        try: 
            p = requests.post(url, files=files,proxies=proxies) 
        except: 
            return 0 
        return json.loads(str(p.content,'utf-8'))['Hash']
hash1 = add('10.jfif')
print(hashlib.md5((hash1 'QmVBHzwuchpfHLxEqNrBb3492E73DHE99yFCxx1UYcJ6R3').encode('utf-8')).hexdigest())

然后得到flag:flag{35fb9b3fe44919974a02c26f34369b8e}

强网先锋

主动

最基础的一个命令执行,但是拦截了flag

所以有多种思路

  • 思路一:

直接构造?ip=1;cat fla* 即可

  • 思路二:

构造?ip=127.0.0.1 || echo "Y2F0IGZsYWcucGhwCg=="|base64 -d|sh

  • 思路三:

构造?ip=||cat fla*

upload

拿到一个流量包,直接wireshark分析一下。

发现一个steghide.php,并且有一段jpg的数据。那就提取出图片然后steghide隐写解一下就好了。

直接steghide密码猜测为123456拿到flag.txt查看拿到flag

Funhash

总共是三个level

  • level1:

经典的!=使用0e绕过,这里是用md4加密,经过查询爆破可知0e251288019经过md4加密以后还是0e开头

  • level2:

经典的数组绕过,构造hash2[]=0&hash3[]=1

  • level3:

md5绕过,可以爆破得到

最后payload:http://39.101.177.96/?hash1=0e251288019&hash2[]=0&hash3[]=1&hash4=ffifdyop

0 人点赞