TStar CTF 2022
TOC
Into the Unknown|腾讯网络安全T-Star高校挑战赛 (tencent.com)
比赛结束后题目描述看不到了,只能在这里直接贴解题方法了。
第一题
题目知识点
web:
代码语言:txt复制使用fiddler或burp工具进行抓包
xxe(Xml外部实体攻击)
解题方法
登录:抓包,前端验证码。
在页面上随便点点,可以发现点赞会调用/api/like这个接口,并且传参是json类型。通过Header可以看出后端服务器是gunicorn,大部分情况表示后端使用的是Python和Flask框架。尝试了nosql注入,nodejs原型污染RCE,未果。
fuzz到可以将Content-Type
改为application/xml
使后端解析xml,尝试xxe读取本地文件。
通过报错信息谷歌搜索得知,后端解析xml使用的是lxml
库的某个版本,并且测试得知没有开启网络解析(即设置了no_network=False
)。
已知,xxe;条件:无回显,无网络,有报错;尝试使用报错带出文件内容。
xxe报错带出原理:拼接一个file://不存在的路径/读取的文件内容
路径,让xml库进行加载,由于这个路径对应的文件不存在,所以报错,从而从报错中回显文件内容。
lxml的xxe似乎有点坑,我本地复现得到的结果和远程的不一样,同一个payload我本地测试的是没反应也不报错。。。
代码语言:python代码运行次数:0复制#我本地测试使用的脚本
from lxml import etree
parser = etree.XMLParser(load_dtd=True,
no_network=False,
resolve_entities=True,)
tree = etree.parse("test.xml", parser=parser)
print("Your name is: " tree.xpath("name")[0].text)
总之,多试几个xxe的payload总有能用的
payload:
代码语言:html复制<?xml version="1.0" ?>
<!DOCTYPE x [
<!ENTITY % outside '
<!ENTITY % file SYSTEM "file:///proc/self/cwd/config.py">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///x/%file;'>">
%eval;
%error;
'>
%outside;
]>
<x></x>
读取文件成功后,已知后端是flask,大部分情况下flask的主程序都叫app.py
。xxe不能打相对路径,利用/proc/self/cwd
可以读取当前进程所在路径下的文件。
读取app.py
可以看到可读取的最后一行是from config import *
。
读取config.py
得到flag。
第二题
解题思路
我在看懂题目描述之前就猜了个深圳。。。shenzhen
第三题
题目知识点
misc:
代码语言:txt复制file命令或binwalk命令
wireshark使用
冷门的工具使用(adb restore和openssl rsautil)
使用Python脚本进行图片绘制
(非常简单的)安卓逆向
re/pwn:
代码语言:txt复制off by one溢出
解题方法
下载题目提供的附件,通过file
命令看出是pcap文件。pcap文件的内容是抓取的网络通信报文。
(使用binwalk工具也可看出是pcap文件。)
简单看了一下,是adb协议。
tcp.strem eq 3
是adb shell的流量,可以看到一个pass
文件的内容是yun202203
。
0012host:transport-anyOKAY0006shell:OKAYshell@hammerhead:/ $ cd /data/local/tmp/backupcd /data/local/tmp/backup
shell@hammerhead:/data/local/tmp/backup $ llss
pass
shell@hammerhead:/data/local/tmp/backup $ ccaatt ppaa
shell@hammerhead:/data/local/tmp/backup $ cat pass .............................
yun202203
shell@hammerhead:/data/local/tmp/backup $ eexxiitt
tcp.stream eq 1
是adb backup的数据。adb backup命令可以备份一个安卓安装包(apk)和这个安装包在备份时所拥有的数据文件。
把他的单向报文全部提取出来,删除开头的多余字符。让文件以ANDROID BACKUP
开头。
(友情提示:等wireshark加载完再点另存为。。。否则提取的报文不完整)
adb restore 跑到安卓真机里 就能拿到apk和apk在备份时的数据。需要用之前拿到的密码yun202203
adb restore test.ab
反编译apk,能拿到个ip地址
代码语言:java复制package ctf.misc.step;
public class Step1 {
public static String FlagStep1 = "175.178.148.197:80";
}
apk在备份时的数据/data/data/ctf.misc.step
可以拿到文件 flag.zip key.en private_key.pem
用private_key.pem
作为私钥,rsa解密 key.en
文件
openssl rsautl -decrypt -inkey private_key.pem -in key.en
得到9BlteBJnZpwrRjbL0DsGlFz5M MDG74jYIj0zzivGPVW75jYZQpdzpfrpEBcXAJqHrlZlEw9hMhRQ8FijkATyMxpKsPXEWT5K6M5
作为压缩包的密码,解压flag.zip得到
代码语言:txt复制1111111010010101010110111111110000010100011000111101000001101110100110100101000010111011011101010000110001000101110110111010110100100101101011101100000100100111011001010000011111111010101010101010111111100000000001111001000000000000110011010000110101010011011110001110110101101011000011110000110100101110010010111111000100001101000011010000100000100100101101001011010010101111010011110100111101001110000011110100101101001011010010001110011101101111011001110000001001010101001100011001001001001110111111111111011101101001010111001101110111001001110111000001111100011001000010100110110011111011010100111110010001100100011110011001100000000001001010101101010111001111111010110001101000101001010000011100111110010001000100101110101010011111111110111101011101000000010000000000111010111011110001010110111001110100000101110011101101110011101111111
总共数据长度是841字节,开根号是29,不难猜出是29*29的黑白图像,即一个二维码。
misc题中得到开根号为整数的 个数的0和1,大部分情况是画成正方形图片,是二维码。
编写脚本将1显示为黑色,将0显示为白色,得到二维码。
(我画图的脚本好像把x和y弄反了,今天打mrctf才意识到。。。不过画出来的二维码还是能扫的)
代码语言:python代码运行次数:0复制import cv2
import numpy as np
data = '1111111010010101010110111111110000010100011000111101000001101110100110100101000010111011011101010000110001000101110110111010110100100101101011101100000100100111011001010000011111111010101010101010111111100000000001111001000000000000110011010000110101010011011110001110110101101011000011110000110100101110010010111111000100001101000011010000100000100100101101001011010010101111010011110100111101001110000011110100101101001011010010001110011101101111011001110000001001010101001100011001001001001110111111111111011101101001010111001101110111001001110111000001111100011001000010100110110011111011010100111110010001100100011110011001100000000001001010101101010111001111111010110001101000101001010000011100111110010001000100101110101010011111111110111101011101000000010000000000111010111011110001010110111001110100000101110011101101110011101111111'
img_size = (29,29)
img = np.zeros(img_size, np.uint8)
for x in range(29):
for y in range(29):
pixel = int(data[x*29 y])
color = (255,255,255)
if pixel:
color = (0,0,0)
cv2.rectangle(img,(x,y),(x,y),color,1)
cv2.imshow("foo",img)
cv2.waitKey()
扫描二维码得到/033yia8rqea1921ca61/systemlockdown
和之前的ip地址拼接,得到http://175.178.148.197/033yia8rqea1921ca61/systemlockdown
下载url,得到一个压缩包,压缩包给出了c源码和编译好的exe可执行文件。
#define SYSTEM_SHUTDOWN 1
导致check函数直接return,那么memcmp(password, "888888", 6) == 0
就没有用了。
i = 0; i <= 6
但是char password[6]
可以off by one。
checker1 = (door_key *)&(management.key_data); 又导致checker1 的内存overlap ch last_ch i
if (ch != 'n' && last_ch && ch != last_ch)
限制输入只能是同样的字符
漏洞点是这样,但是我没太看明白,因为输入限制了只能是同样的字符,一共只有0000000
到9999999
十种输入,我爆破出的。。。
5555555
992e63080ee1e47b99f42b8d64ede953
代码语言:txt复制补充:
struct door_key {
unsigned char passed : 1;
unsigned char checksum1 : 2;
unsigned char checksum2 : 2;
unsigned char checksum3 : 3;
};
虽然unsigned char的大小是一个字节,但是他后面的冒号表示他是一个比特字段,即:passed占用1比特,checksum1占用2比特,checksum2占用2比特,checksum3占用3比特。
所以door_key结构体的实际大小是1字节,off by one正好可以控制整个door_key结构体。
'5'的ascii码是53,转为二进制是00110101,即checksum3的值为0b001=1,checksum2的值为0b10=2,checksum1的值为0b10=2,passed的值为0b1=1。
满足
if ((checker1->passed && (checker1->checksum1 == checker1->checksum2) && checker1->checksum3 > 0))
的条件。
因此密码只要以字符5结尾即可,而密码必须是同样的字符,所以密码是5555555。
第四题
题目知识点
misc:
代码语言:txt复制图片编辑
十六进制编辑器使用
摩尔斯解密
解题方法
下载附件,解压压缩包,得到一个残破的二维码
,一个我真是一个压缩包
。
二维码缺少了左上角的定位点,无法扫描。把二维码右上角的定位点复制到左上角,使二维码可以扫描。
扫描二维码得到url http://public.huoxian.cn/ctf/call_me.zip
题目给出的我真是一个压缩包
压缩包使用010 editor打开,不难看出压缩包的魔法字节PK
被改成了PJ
,导致压缩软件无法识别这一个压缩包。改回PK
即可解压压缩包。
解压压缩包,拿到一个mp3 。听内容是摩尔斯。摩尔斯的内容是19910386797
从二维码扫描得到的url下载,得到另一个压缩包,用19910386797
作为密码解压得到 https://darknet.hacker5t2ohub.com/
4的flag就是darknet.hacker5t2ohub.com
第五题
题目知识点
二进制/web:
代码语言:txt复制数据类型(short)
整数溢出漏洞
misc:
代码语言:txt复制解密hash。。。
解题方法
尝试sql注入,意外通过报错发现 后端是go写的。
代码语言:txt复制{"code":1, "msg":"service codec Unmarshal: 1 error(s) decoding:
* cannot parse 'gid' as int: strconv.ParseInt: parsing "12'": invalid syntax"}
无法注入,推测漏洞点是整数溢出。购买数量太大也不允许。
推测金额是short
即有符号16比特整数
或 int16
,范围是-32768
到32767
。
第九个商品价格1000
,购买33个的总金额为33000
,溢出之后变成-32536
,即自己购买商品之后自己的余额不会扣反倒会增加32536。
(不清楚余额是用什么类型存储的,可以给他玩成负数,余额负了好像溢出都不让。。。)
购买付费咨询
之后查看右上角的消息可以得到提示
商品【付费咨询】购买成功,信息如下: 前往微信公众号“腾讯安全应急响应中心”(tsrc_team),回复"T-Star666"获取信息
去公众号回复得到提示
代码语言:txt复制你要找的人,即将发起大范围蠕虫攻击!行动计划就藏匿在邮件中,只有解出密匙才能破除攻击!http://159.75.190.64/
nightbaron042@sohu.com
nightBaron1996
登陆邮箱。查看邮件。
代码语言:txt复制Hi bros,
冬去春来,终于迎来此刻。等待良久,时机已经成熟。等待的日子里,我看了很多书,那些书页中的章节和段落就像时钟的时针和分针一样不断前行,指引我们通向胜利。
这次行动一切顺利,我将乘胜追击,发起勒索病毒蠕虫攻击,对所有目标电脑文件进行加密,并自动扩散,只有我的KEY才能解密。
数据勒索加密行动已经于今天 1点8分 启动。须知,T-Star特工诡计多端,为防他们从中作梗,我已将KEY进行HASH处理,分别交由不同的人保管。以他们的算力,应该很难破解。米特尼克曾经写道,人的因素是安全过程中最薄弱的环节。各位务必提高警惕,严加保密、妥善储存。
这封邮件非常重要,关键时刻将发挥巨大作用,好戏在即,各位拭目以待。
Key Hashes Part 1: https://pastebin.com/QZ7QBmmd
Key Hashes Part 2: https://pastebin.com/TUNVRVvk
Key Hashes Part 3: https://pastebin.com/rTqtad96
NightBaron
Address: Soldier Island
Github: nightBaron042
IF YOU'RE LOOKING, YOU WON'T FIND IT
下载三个url里的文件,得到一堆hash。。。
访问http://159.75.190.64/
需要一个key,推测key是一堆hash解出来的结果
以前做过类似的题,flag是一篇论文,每个用空格分隔的单词被单独hash,给出一堆hash,要你找出这篇论文的完整内容。
如果土豪可以用cmd5等网站付费解密所有hash得到完整内容。如果不是土豪,可以解前几个单词的hash拿到前几个单词的原文,然后谷歌搜索论文的全文。
cmd5免费用户有限制,但是多跑几个解密hash网站总能免费解几个。
代码语言:txt复制Security is too often merely an illusion, an illusion sometimes
搜索这一小段找到原文,找到原文对应的一整段。作为key提交得到flag。
代码语言:txt复制Security is too often merely an illusion, an illusion sometimes made even worse when gullibility, naivete, or ignorance come into play. The world's most respected scientist of the twentieth century, Albert Einstein, is quoted as saying, "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former." In the end, social engineering attacks can succeed when people are stupid or, more commonly, simply ignorant about good security practices. With the same attitude as our security-conscious homeowner, many information technology (IT) professionals hold to the misconception that they've made their companies largely immune to attack because they've deployed standard security products - firewalls, intrusion detection systems, or stronger authentication devices such as time-based tokens or biometric smart cards. Anyone who thinks that security products alone offer true security is settling for. the illusion of security. It's a case of living in a world of fantasy: They will inevitably, later if not sooner, suffer a security incident.
代码语言:txt复制key正确,恭喜恢复电脑,快去提交flag吧:flag{ski931iwasjudqwkashajdsakdhadjshakdhsahkd}
第六题
题目知识点
misc:
代码语言:txt复制file命令或binwalk命令使用
docx隐写(隐藏文字,书签,隐藏的图片)
隐写工具的使用(outguess)
web:
代码语言:txt复制ssrf(利用服务器访问其他网站的功能,以服务器身份或地址访问某个需要服务器身份或地址才能访问的目标,拿到隐私信息或攻击内网设施)
解题方法
下载附件,file命令得知是一个docx文档。docx的本质是压缩包。
打开docx提示
代码语言:txt复制喜欢我给你的惊喜吗?
我已将线索藏到三个不同的地方,
其中一个提示为123456
来找我吧,
记住,你只能一个人来
否则,你会受到惩罚哦
根据提示,有三段url。
第一段 GE3TKLRRG44C4MJUHAXDCOJX
在word书签(插入-书签)里。base32转码得到 175.178.148.197
第二段 Flag2: 772e91/webs
隐藏文字,将docx另存为为html,记事本打开可以看到
第三段 根据题目提示 guess为 outguess工具 使用outguess工具 以123456
为密码 将docx作为压缩包解压可以得到image1.jpg
解密得到
/062ycz7s9458b
outguess命令使用语法: ./outguess -k 123456 -r '/mnt/d/data/user/Desktop/image1.jpg' out.txt
问:为什么guess就是outguess呢? 答:misc题就这样嘛。之前有个题的描述是guess out the flag 也是用outguess做。这提示很清晰是不是?
得到 175.178.148.197/062ycz7s9458b772e91/webs
访问url得知是php。这个页面的功能是拉取另一个页面并且把拉取结果返回。
通过分析(测试得知他支持scp://协议),推测后端拉取的方式是curl。尝试使用gopher协议打mysql或者php-fpm,或file协议读取本地文件,未果。
http://175.178.148.197/062ycz7s9458b772e91/webs/?url=http://www.baidu.com
因为不允许使用扫描器,通过猜路径猜到/062ycz7s9458b772e91/webs/flag.php
,访问提示只允许localhost访问
所以利用curl进行ssrf访问得到flag。
代码语言:txt复制http://175.178.148.197/062ycz7s9458b772e91/webs/?url=127.0.0.2/062ycz7s9458b772e91/webs/flag.php
T-STAR{ThereAreNoBoundaries}
url使用ipv6 http://[::1]/也能绕过,但是好像flag.php不认。。。可能写死了只能127.0.0.2