MoeCTF 2023
Web
入门指北
十六进制转字符串可以得到以下内容
flag=bW9lY3Rme3czbENvbWVfVG9fbW9lQ1RGX1cyYl9jaGFsbGVuZ0UhIX0=再进行一次 base64 解码就可以得到 flag。
moectf{w3lCome_To_moeCTF_W2b_challengE!!}http
Payload 如下
Param: UwU=u
Body: Luv=u
X-Forwarded-For: 127.0.0.1
Cookie: character=admin
User-Agent: MoeBrowsermoectf{basic_http_knowledge_Xcpf6zq45VutatFPmmelppGUvZpFN_yK}
cookie
注册 POST /register
登录 POST /login
获取flag GET /flag ,回显没管理员权限,Cookie 存在 Token,将 Token 通过 base64 解码可以得到以下内容
修改成以下内容
并通过 base64 进行编码,并构造 Payload 如下
即可获取 flag moectf{cooKi3_is_d3licious_MA9iVff90SSJ!!M6Mrfu9ifxi9i!JGofMJ36D9cPMxro} 。
彼岸的flag
打开源代码梭哈。
gas!gas!gas!
moectf{Beautiful_Drifting!!_EUbAUerqztK_HgTz73ykI5tjKTs6ZkTb}
大海捞针
flag 在 id 920 中,moectf{script_helps_W4ybDNdcii8fJu2uinmgRX6XNZ0PxVOF}
signin
0x02 收集信息
得知 admin 密码为 admin 。
0x01 分析 eval
这串代码存在一个离谱的地方,就是这个 eval 函数,一步步来。
int.to_bytes() 函数会将一个整数转化为其字节表示,其中一个十六进制数和一个大整数进行异或,将异或的结果转化为160字节长度的字节串,并且是 big endian 字节顺序,再通过 .decode() 将字节转换成字符串,通过 .translate({ord(c):None for c in "\x00"}) 移除了所有的 \x00 的字节最后传递给 eval() 函数进行执行。
也就是说,base64.b64encode 其实是 base64.b64decode ,因此下方的 decrypt() 函数其实是下面这样的。
0x03 分析 gethash
程序会 hashed_users = dict((k,gethash(k,v)) for k,v in users.items()) 生成一个 dict 存放 username 和其根据 gethash() 函数所得到的值,但是当账号和密码相同时,gethash() 函数均返回 0 。以 {"admin": "admin"} 为例子,通过运行以上代码可以得到类似回显。
0x04 FLAG 获得方法
要获得 FLAG 需要使得 hashed == v ,也就是说需要使得 hashed 的值为 0 ,因为 admin 的 hash 值为 0 ,但是还需要通过某个手段来绕过这段代码的限制。
通过构造
进行 5 次 base64 编码得到
后构造 Payload 如下
即可得到回显如下
moe图床
通过访问 ./upload.php 可以得到内容如下
通过分析可以得知只对文件名的第二部分进行校对,因此可以通过修改文件名为 shell.png.php 进行绕过,构造 Payload 如下
通过蚁剑一把梭可以得到 flag 如下
了解你的座驾
通过 Network 可以发现 POST 请求,发现 xml ,尝试 XXE ,构造 Payload如下
即可得到 flag 如下
meo图床
通过上传图片后,可以得到以下 url
使用目录穿越查看根目录的 /flag ,url 如下
可以得到以下内容
通过访问 Fl3g_n0t_Here_dont_peek!!!!!.php 可以得到以下内容
分析得知是 md5 绕过,通过构造 Payload 如下
就可以到 flag 如下
夺命十三枪
0x00 POP 链
出去旅游的心海
打开发现 /wordpress ,用 WPSCAN 扫发现没有什么可用的东西,扫不出漏洞插件,只能知道 WordPress 的版本,通过查看网页源代码可以发现一个 API 如下
通过访问可以得到 logger.php 源码如下
通过分析代码可知可以进行 SQL 报错注入,那就试试!
构造 Payload 如下
可以得到数据库名 wordpress ,构造 Payload 如下
可以得到表名 secret_of_kokomi, visitor_record ,构造 Payload 如下
可以得到字段名 content, id ,构造 Payload 如下
可以得到 id 字段的全部内容 1,2,3 ,这时候就觉得怪了,这边 3 个,上面 content 字段就两个,不对哇,那就构造 Payload 如下看看
可以得到回显如下
哦?这不是 flag 嘛,用 mid() 函数截取输出下,Payload 如下
可以得到回显如下
拼起来就可以得到 flag 如下
moeworld
下载附件可以得到加密的压缩包 hint.zip 以及 题目描述一份。
0x00 信息收集
通过扫描靶机 IP 端口可以扫出以下内容
80
8000
8080
7777
22
8777
访问题目环境显示的是一个留言板,通过对 8000 端口进行目录扫描
可以得到该站点存在以下路径可以访问
/change
/console - Werkzeug Debugger
/index
/login
/logout
/register
通过随便注册一个账号可以发现如下内容
在 Header - Cookie 可以看到以下内容
访问 /console 可以发现是一个 Werkzeug Debugger 但是需要 PIN 才能解开,给了 app.secret_key 的 Hint 那就先试试伪造 Session 吧。
0x01 Flask Session 伪造
https://github.com/noraj/flask-session-cookie-manager
通过分析 secret_key 的生成方式可以得知只需要猜出 os.urandom(2).hex() 生成的随机值就行,这个随机值的范围是 0000-ffff (通过本地输出该函数发现是小写字母),通过结合 flask-session-cookie-manager3.py 编写一个脚本进行爆破。
通过上方的抓包获取到的 Session 用 flask-session-cookie-manager3.py 进行 decode 可以得到结构如下
也可以通过 https://www.kirsle.net/wizards/flask-session.cgi 在线 Decode。
使用脚本前需要修改脚本中 session 的 user 值,确保当前用户存在(
因此可以得到 os.urandom(2).hex() 生成的值为 06f0 ,secret_key 的值也就是 This-random-secretKey-you-can't-get06f0 。
通过 flask-session-cookie-manager 进行 encode 就可以进行 Session 伪造成 admin 了,具体操作如下
通过 BurpSuite 修改下 Cookie 中的 Session 就可以伪装成 admin 用户了,通过访问就可以得到以下内容。

可以得到 PIN 码是 904-474-531 ,那下一步就是去获取 Console
0x02 获取 Console
在 /console 页面输入 PIN 码后即可使用控制台,可以通过 Console 来反弹 Shell,可以选择在自己服务器上搭建一个 nps ,可以看看 官方文档 。安装完成后在 Linux 装上客户端,通过服务端的 客户端 - 新增 后生成的唯一验证密钥(Unique verify Key)进行连接,具体方法如下
如果服务器带了防火墙的,务必记得去开放端口,为了安全推荐使用不常用端口并限制源。
连接后,先进行一个端口监听。
然后在 Console 进行反弹 Shell,具体如下
就可以获得留言板所在容器的 Shell 了,通过题目描述中的内容,获取 readme 的内容,
之后还可以获取 flag 的内容,
下一步的操作就是扫内网 IP 段了。
0x03 获取压缩包密码
通过获取 hosts 内容可以得到以下内容
可以得到存在另外两个 IP 172.20.0.4 和 172.21.0.2 。
通过对这两个 IP 进行扫描可以得到以下内容
按照题目描述的提示去掉 .1 结尾的 IP 可以得到压缩包的密码如下
通过尝试发现下面那个是 hint.zip 的密码,解压后打开(丢 Linux 里面打开)来可以得到 Hint 如下
0x04 获取 flag2
提示中已经讲明了在 /app/tools 有 nps ,那就继续用 nps 吧。这里的 nps 是客户端,我们需要在我们的服务端(在自己搭建的 nps 所在的服务器)的 客户端 中新增一个供靶机进行内网渗透用,在获取到的靶机 Shell 中进行连接
连接成功后在 客户端 找到靶机所连接的 客户端 ID ,点击隧道,新增 TCP 隧道,服务器端口根据自行进行调节,我的设置如下
ssh
服务端端口 - 2222
目标 (IP:端口) - 172.20.0.2:22
redis
服务端端口 - 6379
目标 (IP:端口) - 172.20.0.2:6379
mysql
服务端端口 - 3309
目标 (IP:端口) - 172.20.0.3:3306
设置完后,通过打印 /app 路径的文件及目录可以发现以下内容
通过 cat 可以获取 dataSql.py 的内容如下
查看源码可以得到以下内容
账号 - root
密码 - The_P0sswOrD_Y0u_Nev3r_Kn0w
数据库名 - messageboard
通过我们搭建的内网渗透访问 <nsp服务端 IP>:3309 用以上获得的账号密码登录就能进入 MySQL,可以发现 messageboard 库中存在表名 flag ,flag 表存在字段 flag ,内容如下
0x05 获取 flag3
https://book.hacktricks.xyz/network-services-pentesting/6379-pentesting-redis#redis-rce
由于上面已经完成了映射,通过访问 <nsp服务端 IP>:6379 即可。先通过 ssh-keygen 生成一个密钥作为 SSH 登录凭证,如下所示
然后将登录凭证写入到一个文本中,并作为 ssh_key 参数的值存进去,
通过 redis-cli 连接修改 SSH 如下所示,
最后用 ssh 连进去获得 flag 即可,如下所示。
0x06 结果 & 其他
将三段 flag 拼起来就可以得到完整的 flag 如下
通过查看数据库中的 users 表可以看到 admin 的密码为 SecurityP@sSw0Rd 。
Misc
入门指北
base64 解码就可以得到 flag。
狗子(1) 普通的猫
用 010 打开 flag 就在末尾。
moectf{eeeez_f1ag_as_A_G1ft!}
狗子(2) 照片
需要增加下 ruby 的堆栈大小限制
狗子(3) 寝室
狗子(4) 故乡话
转 0 和 1 可以得到以下内容。
可以看出这里面的 1 组成了一个特殊的字符,通过 https://www.dcode.fr/standard-galactic-alphabet 翻译可以得到以下内容

狗子(5) 毛线球
通过 cat doggy.py 可以得到 doggy.py 的源码如下
代码简要意思就是,flag 会被藏在 python ... doggy.py 的进程中,可以通过 cat /proc/<pid>/environ 来获取 flag,并且这个进程会持续 5 分钟,超过五分钟进程消失后 flag 也跟着不见力。
由于能使用 cat ,上述脚本内容跟进程有关,那就扫一下进程吧。
通过扫进程可以发现有 3 个文件,分别是 startup2.sh 、doggy.py 和 yourcat.py 。
yourcat.py
startup2.sh
通过分析可以知道这题会将 flag 藏在 doggy.py 运行时所在的进程环境变量中,并且会删除 /flag 文件以免被找到,而在 yourcat.py 中还存在另外一条指令 story,这个最后我们再来说,先获取 flag !
在扫描进程中,得知 python /problem/doggy.py flag{HIDDEN} 的 PID 为 864,那就通过 nc 连接来获取即可。
而之前说的 story 则是一个彩蛋哦,彩蛋如下
狗子(6) 星尘之猫
zdjd
https://github.com/AddOneSecondL/zdjd_hoshino
将上述代码进行 base64 解码可以得到内容如下
通过提示可以得知需要看看比特币地址生成算法以及寻找 bl 开头并且以 sh 结尾的加密算法,根据寻找可以确定是 Blowfish 算法。
比特币地址生成算法详解 - https://www.cnblogs.com/zhaoweiwei/p/address.html
通过比特币地址生成算法可以看到使用了 sha-256 和 base58 ,将 zundujiadu? 和 dududu? 进行 sha-256 加密可以得到以下内容
从而可以得出 key 和 iv 如下
将密文进行 base58 解码后再丢进 Blowfish 解密,填进 cipher,key 和 iv ,解密后可以得到一串 base64 编码内容,解码后即可得到 flag 如下
打不开的图片1
用 010 打开搜索 flag ,可以找到 16进制内容如下
经过两次 Hex 就可以得到 flag moectf{XDU_i5_v3ry_6e@u2ifu1} 。
打不开的图片2
修改文件头 89 50 4E 47 ,并修改图片后缀为 .png 就可以得到 flag moectf{D0_yOu_1ik3_Bo7@ck_?} 。

机位查询
0x00
第一张图的信息有 南宁站、城市便捷酒店连锁、高铁商务酒店、猪霸王 。
通过分析以及通过百度全景可以得知附近只有 嘉士摩根国际 一个高楼,故确认为 jiashi 。百度地图

0x01
第二张图通过图片可以获得的信息 中山路美食街 ,并且该美食街位于图片正中间,说明沿着一条直线拍摄的,根据百度全景可以得知美食街对面的高楼就是 百盛步行街广场 ,故得到第二部分 baisheng 。百度地图

0x02
通过第三张图可以得到以下信息
因为存在远近的建筑物,根据这些建筑物画一条直线可以判断大体区域,再根据卫星图判断位置(以不会遮挡图片建筑物为准)。通过尝试 宁汇大厦、东方明珠花园和汇金苑 ,最后在 汇金苑 确认了答案(flag 提交成功),得出第三部分 huijin 。百度地图

奇怪的压缩包
压缩包包含以上内容,根据百度搜索得知是 .pptx 格式的,修改后缀即可打开这个 ppt ,但是目标并不是这个 ppt ,而是直接看压缩包里面的内容,通过翻看文件最终找到了 flag 。
第一段位于 ./ppt/sildes/slide2.xml ,通过用 010 打开可以得知 moectf{2ip ;
第二段位于 ./ppt/comments/comment1.xml ,通过打开 ppt 查看该评论所在的页面因此推断出他在第二段,即 _?_ ;
第三段位于 ./ppt/sildes/slide4.xml ,通过用 010 打开可以得知 n0_i4 ;
第三段位于 ./ppt/sildes/slide5.xml ,通过用 010 打开可以得知 _pp4x!} ;
因此 flag 就是 moectf{2ip_?_n0_i4_pp4x!} 。
building_near_lake
根据搜图可以找到是 厦门大学(翔安校区)-德旺图书馆(118.31768,24.612841) 百度地图
根据右键查看属性可以得知手机型号是 Xiaomi 22122RK93C,也就是红米 K30,发布会日期是 20221227,提交后就可以得到 flag 如下
base乐队

moectf{Th4_6@nd_1nc1ud45_F3nc4_@nd_b@s3}
烫烫烫
可以得到以下内容
将 所以说,codepage真的很重要啊( 进行 SHA-256 加密可以得到以下内容
将 flag 进行 AES-ECB 解密即可得到 flag 如下
你想要flag吗
使用 Audacity 可以看到以下内容。

Rabbit 解密 key:Bulbasaur 可以得到以下内容
照片冲洗
下载附件后用 010 打开可以发现下方存在另外一张图片

将上下两张图片分别提取出来如下图所示

结合题目描述得知这是一道盲水印题目,推断 2.png 是原图,1.png 是水印图。
https://github.com/linyacool/blind-watermark
https://github.com/chishaxie/BlindWaterMark
盲水印脚本有多种,并且 Python 2 和 Python 3 的解题结果不同,可以多尝试
这题解出来使用的是第一个 URL 的 Python 3 脚本
通过盲水印脚本可以解出 flag,先通过 pip 安装库
之后通过以下指令即可解出水印图如下

读出来即可得到 flag 如下
magnet_network
http://www.snowywar.top/?p=1118
用 010 打开压缩包查看文件头 28 B5 2F FD 00 58 8D 17 发现并不是 zip 压缩包文件头格式,用 file challenge.zip 看一下发现 Zstandard compressed data (v0.8+) ,通过咕鸽可以找到解压缩方法。
先修改后缀为
.zst;执行
zstd -d challenge.zst。
解压完就可以得到一个新的压缩包,里面存在一个 segments.torrent 文件,可以使用 Python 的 bencode 进行分析,先安装好环境。
从 files 可以得知一共有 6 个文件,并且注释中提示 flag 的长度为 24,并且 files 中的每个文件都是 4 个字节的实际长度,另外用 .pad 进行填充 16380 字节使得每个文件均为 16KB。
在BitTorrent协议中,文件被分为多个块或片段,每个片段的大小由
piece length字段定义。为了验证下载的数据的完整性,BitTorrent使用pieces字段存储每个片段的SHA1哈希值。为了计算某个特定片段的SHA1哈希值,你需要先获取该片段的原始数据内容,然后对这部分数据使用SHA1算法。
因此我们可以通过破解 SHA1 哈希值来获得 flag 的 4 个字节,在 6 个文件中,最后一个并没有使用 .pad 填充(由于不知道填充内容是什么,先用 \x00 尝试),可以通过 hashcat 直接暴力解出来 eSti ,而其他的需要在尾部加上 16380 个 \x00 才可以,尝试过跑字典发现行不了,跑到前一些就已经 79G 了,tkbl。也尝试过写个 rule ,但是 hashcat 读不了,因此还是得使用 Python 来写。
然后运行一下!
就可以得到 flag 如下
weird_package
根据题目得知需要先修复压缩包,先用 010 打开该文件

可以发现 ZIPDIRENTRY 是损坏的,我们需要根据上面的 record 对 ZIPDIRENTRY 进行修复。
先从 dirEntry[0] 开始,它对应的是 record[0] 。通过 dirEntry[0] 的 deFileNameLength 为 2 可以推断出他的文件名就是 record[0] 的文件名需要将 deFileName 改为 3/ 即可,如下图所示

以此类推,将 dirEntry[0] 到 dirEntry[8] 都恢复好,可以得到以下内容。

此时会发现 dirEntry[9] 的 deFileNameLength 为 0,需要先将它修改为 6 ,再去修改文件名, deFileNameLength 的修改可以参照上面的 dirEntry[8]。

修复好后,可以点击上图红色箭头所指向的按钮点击重新运行模板,就可以看到 deFileName 被正确修改为 3/9999 了,并且 endLocator 也正确的出现了(好欸)。
之后就是解压得到了 9 个文件,通过 CyberChef 来找 flag 的时候到了,经过一个一个试可以发现 1111 到 8888 得到的都是假的 flag moectf{wow_tHis_is_a_faKe_fLaG_HaHaHa_S66ilDMV3DciYf!lP0iYlJf!M3rux9G9V}

只有 9999 才是真的,flag 如下
Crypto
入门指北
bad_E
ezrot
Rot47 解码可以得到 flag 如下
可可的新围墙
猜测是栅栏解密,密文如下
通过设置栏数为 3 可以得到 flag 如下
皇帝的新密码
猜测是凯撒密码,密文如下
设置为 7 可以得到 flag 如下
不是“皇帝的新密码”
https://www.dcode.fr/vigenere-cipher
维吉尼亚密码解密
moectf{vIgENErE_CIphEr_Is_a_lIttlE_hardEr_thaN_caEsar_CIphEr_4u4u4EXfXz}
猫言喵语
先利用空格分割字符串
把 喵喵? 换成 - ,把 喵喵喵 换乘 . ,可以得到以下内容
用摩斯密码解码可以得到 flag 如下
factor_signin
|p-q|
n&n
rsa_signin
xorrrrrrrrr
result.log 的内容是通过从 article.txt 随机裁取 flag 长度的内容与 flag 进行异或的结果,一共循环 100 次也就是有 100 条异或结果。通过断言可以得到 flag 的前七个字节为 moectf{ ,最后一个字节为 } 。因此通过将 result.log 每条的前七个字节与 moectf{ 进行异或就可以获得 article.txt 中的 7 个字节,具体代码如下所示。
由于 100 次循环中,每次裁取得地方不同,部分会包含 keys 得内容,那么我们就可以通过这个进行爆破 flag 得中间部分。
通过 is_printable() 可以判断该字节是否为可打印字符,通过 all_possiable() 函数不断从每条得第八个字节开始进行每七个字节每七个字节得读取与 keys 中的内容进行异或处理,并且计算每个输出的个数判断频率。最后通过 sorted() 函数进行筛选并输出前 1000 个(如果不筛选的话有 27w 条),根据输出的内容进行拼接就可以得到 flag 了。
最后拼出来的 flag 如下
giant_e
https://raw.githubusercontent.com/orisano/owiener/master/owiener.py
当 e 很大的时候,d 就挺小
ez_chain
blockize() 函数会将传入的 long 值由十进制转换成 base 进制,在本题中 base 如下。
通过以下题目内容
可以得知 flag 共 72 字符,转 base 进制后共 15 位,最高位是 $461430682735^{14}$ ,又因为 flag 的前七个字符为 moectf{ ,通过以下代码
可以发现数组的第一个值都是 5329712293 ,因此可以推断出 blocks[0] 的值就是 5329712293 。
又因为 $encrypted[0] = blocks[0],\oplus,iv,\oplus,key $ ,反推即可得到 $key = blocks[0],\oplus,iv,\oplus,encrypted[0] $ 。
通过上述式子就可以得到 key 值为 421036458 ,实现代码如下。
得到 key 后就可以通过 $blocks[i] = encrypted[i],\oplus,encrypted[i-1],\oplus,key $ 一路逆推出整个 blocks 数组,最后再编写一个 base 进制转十进制的函数进行转换最后再用 long_to_bytes() 函数转就可以得到 flag 了,实现代码如下
Pwn
入门指北
moectf{M4ke_A_Promi5e_7hat_1_C4nn0t_Re9ret}
test_nc
baby_calculator
fd
反编译可以得到以下内容
fd 的值通常从3开始(0, 1, 2通常是标准输入、输出、错误)
输入 670 后即可得到 flag 如下
int_overflow
反编译可以得到以下内容
通过计算可以得到 -114514 的补码为 4294852782 ,通过输入后交互即可得到 flag 如下
ret2text_32
Desc:一道最基础的32位栈溢出题OvO
下载附件使用 IDA 打开后对 main 进行反编译可以得到以下内容
通过查看 vuln 函数的栈如下
因此需要用其他字符填充满 0x58+0x4 ,然后开始找地址。
https://blog.csdn.net/Morphy_Amo/article/details/121757953?ydreferer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8%3D
第一种,溢出后的返回地址是system的地址,也就是plt表中system的地址
第二种,溢出后的返回地址是call system的地址,这是程序中出现过的调用system的地址
通过查找可以找到 call system 的地址 0x080492A9 还有 /bin/sh 的地址 0x0804C02C ,寻找过程中可以使用 Shift+F12 通过 Strings 来找挺方便。

找出地址后就开始写脚本力,如下
nbytes 参数表示要读取的最大字节数,设置大点就行,然后通过栈溢出就能得到 sh 了。
之后就是通过 ls 和 cat 来获取 flag 了,过程如下
ret2text_64
https://xz.aliyun.com/t/12645
这道题的原理是通过覆盖函数的返回地址,通过 pop rdi; ret 可以将栈顶的值弹出到寄存器 rdi 中,并跳转到返回地址 system_addr ,以 rdi 寄存器的内容作为参数执行恶意命令。
下载附件使用 IDA 打开后对 main 进行反编译可以得到以下内容
通过查看 vuln 函数的栈如下
可以得出需要覆盖 0x50+0x8 的地址,并且通过 IDA 可以得到以下信息(通过 Functions 和 Strings)
通过以下命令可以得到 pop rdi ; ret 的地址
通过编写以下脚本即可执行获得 Shell
Reverse
入门指北
使用 IDA 打开即可得到 flag
moectf{F1rst_St3p_1s_D0ne}
base_64
https://tool.lu/pyc/
先进行反编译,反编译后得到以下代码
将 str1 放入 CyberChef 并修改字符集 string1 即可得到 flag moectf{pYc_And_Base64~}。
Xor
用 IDA 打开点击 main 按 F5 ,双点 enc 可以得到 enc 的内容如下
通过分析 main 函数可以得知将 enc 的每个与 0x39 进行异或即可得到 flag,编写脚本如下
UPX!
用 IDA 打开后对着 Functions 按 Shift+F12 ,可以找到以下内容

通过点击 welcome to moectf 并进行反编译可以得到以下内容
在 word_140196000 可以找到 enc ,对 enc 异或 0x67 再转字符串就可以得到 flag 了。
AI
EZ MLP
矩阵乘法不满足交换律,改变矩阵乘法顺序即可,即将下述函数
修改成
即可得到 flag 如下
Jail
Jail Level 0
Payload 如下。
Jail Level 1
Jail Level 2
Jail Level 3
原理就是使用 unicode 字符替换
Jail Level 4
Leak Level 0
源码如下
通过环境变量获取 key 后即可进入后门
Leak Level 1
源码如下
通过 unicode 字符可以进入 help()
第一次 help() 中查看 server 时,环境变为 server.py,此时可以查看变量
https://jbnrz.com.cn/index.php/2023/06/08/pyjail/
进入 help() 后输入 server ,弹出来后重复一次操作即可查看到环境变量得到 key
通过获得的 key 进入后门就可以得到 flag 了。
Leak Level 2
过滤字符改了,直接按照第一关的方法一把梭,过程如下
通过获得的 key 进入后门就可以得到 flag 了。
Forensics
随身携带的虚拟机
用 VMware 创一个 Windows 10 64位的虚拟机,载入 MoeCTF_Forensics_1.vmdk ,在回收站可以找到 BitLocker Recovery Key 4DFEE901-55AC-43EB-96F4-FFE09609952A ,里面则是 D 盘的恢复密钥,解开后可以得到 flag.txt ,内容如下
通过 base64 解密即可得到 flag 如下
坚持访问的浏览器
通过描述中的浏览器以及附件中出现的 .mozilla 把目标瞄准向 firefox ,.mozilla/firefox/profiles.ini 是 Firefox 的配置目录,保存了用户配置文件信息,内容如下
可以找到默认用户的配置文件存储在 ./1xp3jsq0.default-esr 中,题目中提到坚持访问那就从历史记录下手,./1xp3jsq0.default-esr/places.sqlite 保存的就是浏览器的历史记录和书签信息。通过访问这个数据库就可以找到历史记录,通过下列语句查询 moz_places 表可以得到历史记录
在其中可以找到一个链接,即 https://hymint.space/~koito/ ,通过访问即可得到 flag 如下
Last updated