HSCSEC CTF 2023 OTP 赛后复现

警告
本文最后更新于 2023-02-13,文中内容可能已过时。
考点

PGP 加密系统是采用公开密钥加密与传统密钥加密相结合的一种加密技术。它使用一对数学上相关的钥匙,其中一个(公钥)用来加密信息,另一个(私钥)用来解密信息。

一次性密码(One Time Password,简称 OTP),又称 “一次性口令”,是指只能使用一次的密码。

这道题有些没见过的知识点,加上附件有些问题,赛后复现一下

解压压缩包,压缩包注释

获得密钥

1
2
@4VM*2U959%9-:UI*5&I66%%Z47I253%:4%0P.5!4,#D`
`

解码顺序 uuencode base64 base32

根据提示 解码的每一步都有用,把解码过程存一份

1
2
3
4
5
6
7
8
@4VM*2U959%9-:UI*5&I66%%Z47I253%:4%0P.5!4,#D`
`

SkJKVUdVMkZJTjVXQzQzRU1ZPT09PT09

JBJUGU2FIN5WC43EMY======

HSCSEC{asdf

用 VeraCrypt 挂载,密码是 HSCSEC{asdf

image-20230213202226225

得到一个邮件文件 eml 和备忘录.txt 还有 pgp 私钥

image-20230213203644089

备忘录里面是 flag3 用 uuencode 解密

1
flag3:}

双击打开 eml,默认 win10 会用自带的邮件打开

image-20230213202358596

保存所有附件

PGP 解密

ASC 文件通常被用作由 PGP 使用的装甲 ASCII 文件

asc 是使用 PGP 密钥加密的文件,可以用 PGP Desktop 解密

不过需要破解版,这里使用免费的 Kleopatra 软件

官网下载 www.gpg4win.org

安装后选择证书,导入

image-20230213203114928

或者,双击 pgp 打开也可以导入证书

image-20230213203815633

然后双击 asc 解密即可

密码是刚才解密过程中得到的

1
SkJKVUdVMkZJTjVXQzQzRU1ZPT09PT09

image-20230213204101034

解密成功后全部保存

image-20230213204259005

得到 encrypted 文件,其实还是个 eml 文件,重命名打开

OTP 解密

保存附件 OTP.rar 解压得到 OTP.exe

这里本意是让我们通过 OTP(一次性密码)来进行解密,输入正确的密钥可以得到 flag

方法一

但是这里已知这是用 python 打包的 exe,尝试逆向

image-20230213204657533

image-20230213204705032

因为出题的时候没有混淆,所以也可以用逆向的方式获得 flag2

1
flag2:T0tpls_sAv3

然后我们尝试一下使用正常方法获取 OTP

方法二

OTP 的密钥是以 base32 的方式存储的

也就是刚才得到的

1
JBJUGU2FIN5WC43EMY======

这里这道题是使用的 TOTP (Time-based OTPs) 基于时间的 OTP

密钥是根据时间动态变化的

用到 python 的一个库 pyotp https://github.com/pyauth/pyotp

1
2
3
import pyotp
totp = pyotp.TOTP('JBJUGU2FIN5WC43EMY======')
print(totp.now())

这样可以生成现在的密钥

image-20230213205620296

可以看到正确生成了

方法三

也可以使用 OTP 管理器 比如电脑端的 Thetis Key Manager

安卓端的 Authenticators

是否见过微软的动态验证码,扫描二维码绑定,那个就是 TOTP

生成二维码的话可以用这段代码

1
2
3
4
5
6
import pyotp
import qrcode

qr_uri = pyotp.totp.TOTP('JBJUGU2FIN5WC43EMY======').provisioning_uri('test')
img = qrcode.make(qr_uri)
img.get_image().show()

image-20230213205909222

用手机软件扫描也是一样的,得到 6 位动态密钥

然后我们拼起来得到 flag

1
HSCSEC{asdfT0tpls_sAv3}
0%