IrisCTF2023题解

这是我加入r3之后第一次有输出的比赛,比赛难度不大,有些题目挺有新意的,记录一下我参与解决的题目。

OSINT

Czech Where?

开局一张图,直接喂给谷歌图片搜索

image

能找到同一地点的图片,来自一篇游记http://tabiichigo.livedoor.biz/archives/51921024.html

图片链接为:https://livedoor.blogimg.jp/rokitomo/imgs/4/e/4eff76c9-s.jpg

地点为捷克黄金巷Zlatá ulička u Daliborky

这篇文章也可以佐证20号在黄金巷中,“黃金巷真的非常狹小,總長應該只有十來公尺,共有No.11到No.27十七間屋子”

试来试去终于出了,flag是irisctf{zlata_ulicka_u_daliborky}

好好好,捷克语是吧….

Network

Where’s skat?

这一题一开始我以为是直接分析报文中地理相关信息,于是先研究了流量包中各种协议,一些DNS协议或者DHCP协议中可以使用地域相关字段,而在本题中不存在。后来想使用IP进行定位,只能定位到山景城的IP(但后面也证明了不是那里)。

Anaïs Huang师傅提出使用无线网络的SSID,根据含义明确的SSID可以有效找到大致的位置,例如

Morlin <=> Morlin Engineering\Morlin Guest…

ABM Parking <=> ABM Parking Services

Mag1str师傅则使用wigle.net这个网站利用流量中的BSSID信息准确的位置Union Station

image-20240110170358033

而flag是irisctf{los_angeles_union_station}

另外再补充一些wlan相关知识:https://forum.huawei.com/enterprise/zh/thread/580899002067599360

Foresics

Not Just Media

使用potplayer播放该视频,在“属性”中的“媒体内嵌资源”项上我们可以发现怪东西

image-20240110171444649

选中后点击“保存为其他名称”即可提取出来

打开预览一下就会发现存在字符替换的情况

image-20240110171630936

那么就有以下几种思路了:

  1. 提取被替换的字符
  2. 提取替换上去的字符
  3. 以这个字体重新渲染某个特定的字幕。

这一题是第三者,使用这个字体重新渲染一下mkv文件中的字幕即可。

怎么渲染呢?在fontsee.com这个网站中上传字体后输入字幕的内容即可。

提取字幕也可以使用potplayer,入口在“字幕”->“保存字幕”->“另存字幕为”

image-20240110172138663

What the Beep?

我愿称之为物理题。

思路很开门,给了四个html文件,文件名就是经纬坐标,打开后就能看到横轴为时间纵轴为分贝的折线图。

经过观察,记录数据如下:

位置 声强 近似
源点 140dB 140dB
上37.310205, -120.352005 55.70~56.67dB 56dB
下37.185287, -120.292548 49.00~49.985dB 49.5
左37.258453, -120.406603 51.79~52.2dB 52dB
右37.232087, -120.262349 52.04~53dB 52dB

思路就是:利用声音衰减规律计算距离,利用四个坐标计算范围,求交点。但具体数值的计算是不便的,不如转换为比例。

声音衰减公式

由上述公式可以推出r上:r下:r左:r右 = 2.2:1:1.4:1.4

于是用ps模个图看看大致位置。

map

可能偏差有点大,试了好多次都不对,于是心一横写了个枚举程序。

PS:我自己设置的参数爆破了好一会都没出,Crazy_Man随手一改就出来了,TQL,ORZ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 左上角 37.280627, -120.325931

# 右下角 37.277058, -120.323865
from pwn import *
import time

context(log_level = 'debug',os = 'linux')

max_retries = 3
retry_delay = 5 # 重试间隔时间(秒)

for x in range(7300, 7400, 20):
for y in range(5300, 5900, 20):
connected = False
retries = 0

while not connected and retries < max_retries:
try:
p = remote("what-the-beep.chal.irisc.tf", "10500", timeout=10) # 设置连接超时时间为10秒
p.recvuntil("Input: ")
payload = f"37.2{x}, -120.32{y}"
p.sendline(payload.encode())
r = p.recv(1024)
connected = True
except Exception as e:
print(f"Connection error: {e}. Retrying in {retry_delay} seconds...")
retries += 1
time.sleep(retry_delay)
continue

if retries == max_retries:
print(f"Max retries reached for coordinates ({x}, {y})")
else:
p.close()
time.sleep(2)
if "Not" not in r.decode():
print(r.decode())
print("*"*20)
p.interactive()

Investigator Alligator

背景故事就是机器被打了,加密了一些文件,用户还输入了一些东西。

拿到的是磁盘镜像,用7z直接解压了。

检查用户目录

在用户目录\home\stephen下我们发现了被加密的文件encrypted.img、可执行文件taunt和python脚本rswenc.py

简单分析tauna就是提示被PWNED了,然后让输入一些内容;rswenc.py则是和指定的服务器进行交互然后利用得到的密钥加密指定文件。

根据题目描述,管理员记录了流量和内存镜像

思路就很清晰了,分析流量呗

检查管理员目录

在root目录下找到.bash_history,可以确定capture下的network是受攻击时tcpdump获得的流量,使用LiME获取了内存镜像,位置为\LiME\src\sample.mem

分析

首先是流量分析,结合python脚本,我们筛选出ip.addr == 149.28.14.135 and tcp.port == 9281的流量,发现只有一条,并且数据也是明文传输的: eng0jieh7ahga7eidae6taebohhaicaeraef5ahng8ohb2Tho3ahz7ojooXeixoh0thoolung7eingietai8hiechar6ahchohn6uwah2Keid5phoil7Oovool3Quai

接下来就是编写脚本进行恢复被加密的数据了。

改改rswenc.py的ip和端口,再写个服务端发送密钥即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import socket

data = 'eng0jieh7ahga7eidae6taebohhaicaeraef5ahng8ohb2Tho3ahz7ojooXeixoh0thoolung7eingietai8hiechar6ahchohn6uwah2Keid5phoil7Oovool3Quai'
# 创建一个socket对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置超时时间(可选)
sock.settimeout(10)
try:
# 连接到指定的IP和端口
sock.connect(('127.0.0.1', 4444))
# 发送数据
sock.sendall(data.encode())
finally:
# 关闭连接
sock.close()

恢复出的数据用7z打开找到data\super_duper_important_info.png

image-20240110191740554

这是一半的flag,另一半也很容易想到就是用户输入的内容咯。

十六进制查看器打开sample.mem很容易就能找到

mem

PS:在检查用户目录下的bash_history时会发现可疑文件.cache/gunzip/gunzip,这就是攻击者的🐎.