2020字节CTF KOP

题目提供了一个pcap流量包,打开看是802.11,一看就是要破解无线WiFi密码了,先转成hashcat可破解的hash(在线: https://hashcat.net/cap2hccapx/)

因为SSID=ByteCTF\d{8},合理猜测密码就是8位数字或8位数字相关的,然后扔到vast.ai上跑GPU(4x 3070基本十几秒就跑出来了)。参考这里 可得 hashcat命令 hashcat -m 2500 -a3 capture.hccapx ByteCTF?d?d?d?d?d?d?d?d

密码ByteCTF20201212

解密cap包用aridecap-ng即可,即airdecap-ng -e ByteCTF\\d{8} -p ByteCTF20201212,注意反斜杠要转义变\\

解密流量里分为两部分,第一部分是5555端口转的adb流量,通过adb将metepreter apk安装进手机(做到这的时候就给hint了= =),但是因为有些包没记录下来所以解不出完整的apk。

第二部分就是meterpreter流量了,如何解密meterpreter流量就是关键。

流程(参考这里):

被控机 192.168.2.2;控制端 192.168.2.1

1. 被控机通过http通知控制机上线(也就是开始心跳)

2. 控制机收到上线信息回200 OK

3. 由于题目hint给出android/meterpreter_reverse_http,是stageless的,主要控制逻辑都在apk里了就不用再去下二进制文件动态执行,所以接下来就是密钥协商,被控机发http心跳到控制端,控制端在200 OK返回包中发送rsa公钥请求协商。

4. 被控端收到rsa公钥,生成指定长度(本题是16bytes)随机数做aes密钥,通过Post请求将用公钥加密的aes密钥发到控制端。

5. 控制端解出aes密钥,接下来则通过这个aes密钥加密数据传输控制命令。

又看到这里,官方都直接给python写的meterpreter了,就直接拿来用。(其中met_rsa_encrypt与met_aes_decrypt这两个函数在这里没有,就直接去msf源码里找,在这里 ,直接对着代码在python meterpreter前面加就ok),调试的时候把最后的meterpreter.run()去掉然后ipython meterpreter.py -i即可在python console中引入类与函数。

rsa公钥
rsa公钥加密的aes_key

python meterpreter里有一个Transport类,直接用这个类里的decrypt_packet函数解包就ok,如果要更直观的看包里的信息就用packet_enum_tlvs函数(eg: list(packet_enum_tlvs(Transport().decrypt_packet(pkt))) ),里面type的整数直接拿到android meterpreter.apk里搜(我直接生成的meterpreter.apk,包里的apk因为记录问题没有传完整,即WRTE与OKAY中间的提出来就是)

接下来就是通过rsa解aes_key了(因为Transport类里就有变量定义aes_key,创建对象的时候直接赋值进去就可以)

想到了rsa的模数可分解的时候就给hint了...通过网上的代码可以轻而易举的将公钥导入到java中,之后用Jetbrains家的IDEA调试看变量就能看到模数。

n与e都出现了

扔到factordb上看一眼,确实可以分解。

接下来就是通过已知的p、q、e生成pem格式的公私钥,这里我是用python生成的,之后再想办法将加密的aes_key解开。

由于之前吃的教训,加密类的东西我都尽量用同类语言做加解密防掉坑,再加上不是很懂java就直接用ruby。

ruby代码

aes_key: "bd541a3cc95e56c78ca1ceb905f354d8ae61ab9b89504af9e53bfa84bb59e302".decode("hex")

填了aes_key之后就可以解任意流量了。最后用wireshark大小排个序,从大到小一个一个手解(tshark不是很熟练..)就出了...

flag: ByteCTF{K1ng_0f_Pc4p}