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%