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中引入类与函数。
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调试看变量就能看到模数。
扔到factordb上看一眼,确实可以分解。
接下来就是通过已知的p、q、e生成pem格式的公私钥,这里我是用python生成的,之后再想办法将加密的aes_key解开。
由于之前吃的教训,加密类的东西我都尽量用同类语言做加解密防掉坑,再加上不是很懂java就直接用ruby。
aes_key: "bd541a3cc95e56c78ca1ceb905f354d8ae61ab9b89504af9e53bfa84bb59e302".decode("hex")
填了aes_key之后就可以解任意流量了。最后用wireshark大小排个序,从大到小一个一个手解(tshark不是很熟练..)就出了...
flag: ByteCTF{K1ng_0f_Pc4p}