ByteCTF

被师傅们带飞呜呜呜,只拿了一个一血

image-20211017205039413

Checkin

Description

字节跳动安全系列活动主题名字是什么?你造吗?关注【字节跳动安全中心】公众号并回复本次大赛主题(4字),会有意外惊喜!

Analyze

公众号发”安全范儿“

flag

ByteCTF{Empower_Security_Enrich_Life}

frequently

Description

Someone wants to send secret information through a surreptitious channel. Could you intercept their communications?

Analyze

一个流量包,里面有很多加密流量,但是并没有什么乱用,信息都在dns中,首先过滤器dns,发现

image-20211017185316084然后我们加个过滤IP,只需要发送端的

dns && ip.src == 10.2.173.238 && ip.dst==8.8.8.8

image-20211017185503291

另存为12.pcap,tshark提取数据,

tshark -T fields -r 12.pcap -e dns.qry.name -e dns.id > q.txt

因为里面有些id是相同的,存在重传,这里脚本梭一下

import re,base64

f = open('q.txt','r').read().split('\n')
# print(f)
ff = []
for i in f:
    if i not in ff:
        ff.append(i)
res = ''
for ii in ff:
    data = re.findall(r'(.*?)\.bytedanec\.top',ii)
    if len(data) != 0:
        if len(data[0]) >2:
            res += data[0]

print(res)
f2 = open('out1.png','wb')
dd2 = base64.b64decode(res.encode())
f2.write(dd2)
f2.close()

但是出来的图片并没有什么卵用

out1

我们还可以看到里面有许多的o和i组成的脏数据,这里全部提出来后转2进制,o对应0,i对应1,

import re
from Crypto.Util import number

f = open('q.txt','r').read().split('\n')
# print(f)
ff = []
for i in f:
    if i not in ff:
        ff.append(i)
res = ''
for ii in ff:
    data = re.findall(r'(.*?)\.bytedanec\.top',ii)
    if len(data) != 0:
        if len(data[0]) <2:
            res += data[0]
print(number.long_to_bytes(int(res.replace('o','0').replace('i','1'),2)))

得到b'The first part of flag: ByteCTF{^_^enJ0y&y0ur'

的前半部分flag,后半部分在流量包的udp的第一个流中

image-20211017190058913

稍微读读写写得到flag

flag

ByteCTF{^_^enJ0y&y0urse1f_wIth_m1sc^_^}

BabyShark

Analyze

和114爷一起做的,根本不会做呜呜呜

首先给出pcap文件,tcp.stream eq 0找到adb tcpip安装apk的数据包。adb tcpip协议中有些命令混进去了,要删掉才能得到正确的apk。

image-20211017180306781

整一个安卓手机连上adb tcpip,使用adb install test.apk安装apk,本地抓包,测试得知WRTE命令一共24个字节,所以导出tcp.stream eq 0,搜索WRTE,删除所有的WRTE和之后的20个字节

再删除头尾的CMD、OKAY命令,得到一个apk包。(此时已经能用7zip打开并提取dex查看,由于某些原因apk的zip的末尾存在半个zip,导致apk签名错误,删掉之后可以得到签名正确的apk包)

image-20211017094012413

image-20211017101122810

jadx打开dex得知,解密flag的逻辑是,从/sdcard/PBClass.dex加载com.bytectf.misc1.KeyPB类,从http://192.168.2.247:5000/api得到一个byte[]数组,传入KeyPB的某个方法得到某个对象,然后调用这个对象的getKey方法得到long类型的密钥,最后使用密钥解密字符串AesUtil.decrypt(密钥, "8939AA47D35006FB2B5FBDB9A810B25294B5D4D76E4204D33BA01F7B3F9D99B1");为flag。

从pcap文件中找到/api的返回值。08 8B B7 BD F5 DB D5 37 11 A1 F8 31 E6 D6 1C C8 40

拿不到/sdcard/PBClass.dex,只能猜PB代表什么,不是P**nhuB,fuzz得知为protobuf格式,使用cyberchef解密得到long类型的密钥244837809871755LFrom Hex, Protobuf Decode - CyberChef (gchq.github.io)Protobuf_Decode('',false,false)&input=MDggOEIgQjcgQkQgRjUgREIgRDUgMzcgMTEgQTEgRjggMzEgRTYgRDYgMUMgQzggNDA)

然后据此根据反编译源码写出exp:

import com.bytectf.misc1.AesUtil;

public class exp {
    public static void main(final String[] args) {
        final String flag = AesUtil.decrypt(244837809871755L,
                "8939AA47D35006FB2B5FBDB9A810B25294B5D4D76E4204D33BA01F7B3F9D99B1");
        System.out.println(flag);
    }
}

直接输出flag得到flag:

image-20211017182357255

flag

ByteCTF{Tr4ff1c4nalys_i5@Us3fu1}

HearingNotBelieving

Description

Hearing is not believing

Analyze

前面的是频域图中有二维码,截图后手拼下得到前半段flag

image-20211017190810195

image-20211017190919810

扫描得到m4yB3_

然后后面的稍微听一下就知道是robot36的音频,手机上放着然后导出,然后用ppt拼图,得到另一半flag的png

image-20211017191218231

2

处理下扫描得到后半段flag:U_kn0W_S57V}

image-20211017191500323

image-20211017193031344

flag

ByteCTF{m4yB3_U_kn0W_S57V}

Lost Excel

Description

Please find out who leaked this document asap

Analyze

首先excel解压,里面媒体文件夹有一张图,用stegsolve可以看到里面有

image-20211017194549926

然后里面的间隔可以看到很有规律,再根据提示,我们可以知道他的一块是8,所以说我们可以看到4块像素为一组,这里我们先处理下原图image1.png

from PIL import Image
import numpy as np

p = Image.open('image1.png').convert('L')
a,b = p.size

p1 = Image.new('1',(a,b))

for y in range(b):
    for x in range(a):
        if p.getpixel((x,y)) == 254:
            p1.putpixel((x,y),1)
p1.save('1.png')

得到

1

然后看图看了半天,发现他竖着存在一个循环

13

然后我们四个像素块提一下,发现他图像只存在

白黑 黑白 黑黑 黑黑
黑黑 黑黑 白黑 黑白

四种情况,猜测这里可能是四进制,写下脚本

from PIL import Image
from Crypto.Util import number

p = Image.open('13.png').convert('1')# 13是循环图片
a,b = p.size

res = ''
for y in range(0,b-7,8):
    for x in range(0,a-7,8):
        data = [p.getpixel((x,y))//255,p.getpixel((x+4,y))//255,p.getpixel((x,y+4))//255,p.getpixel((x+4,y+4))//255]
        if 1 in data:
            res += str(data.index(1))
        else:
            continue
print(number.long_to_bytes(int(res,4)))

得到

b'el{t}deFyMdcTBWixC\x00nHEe'

没什么用,然后换1.png跑了下试试

from PIL import Image
from Crypto.Util import number

p = Image.open('1.png').convert('1')
a,b = p.size

res = ''
for y in range(0,b-7,8):
    for x in range(0,a-7,8):
        data = [p.getpixel((x,y))//255,p.getpixel((x+4,y))//255,p.getpixel((x,y+4))//255,p.getpixel((x+4,y+4))//255]
        if 1 in data:
            res += str(data.index(1))
        else:
            continue
print(number.long_to_bytes(int(res,4)))

得到flag

image-20211017203344651

flag

ByteCTF{ExcelHiddenWM}