写在前面

哥斯拉和冰蝎的加密方式是基于对称密码AES的,所以如果我们想清楚地了解他们的通信过程和解题原理,那么我们必须要对对称密码有一个基本的认识。这里我仅介绍AES。

对称密码AES的明文长度和密文长度都可选为128bit、192bit、256bit,当然大部分情况下我们碰到的是128bit。那么就引申出了一个问题,在实际通信中通信双方发送的信息并不总是AES明文长度规定的倍数,算法设计的好是一方面,但如何将它应用到实际呢?为了解决这个问题,产生了许多分组密码的工作模式,如下面要介绍的ECB(Electronic Codebook电码本)模式、CBC(Cipher Block Chaining分组密码链接)模式,以及CFB(Cipher Feedback密码反馈)模式、OFB(Output Feedback输出反馈)模式……

ECB模式正如它的名字一样,就像一个电码本,每次的密钥都是相同的,对相同的明文进行加密,产生的密文也相同。因此它不需要设置初始向量。

CBC模式,它将明文分成固定长度的块,并使用前一个块的密文与当前块的明文进行异或操作,然后再进行加密。在加密过程中,需要使用初始化向量 (IV) 来避免加密结果的重复性。(至于为什么要使用初始向量,我们可以想一下对除第一块以外的所有块来说可以使用前一个块的密文进行异或操作,但是对于第一块,它没有所谓的前一块,因此需要一个初始向量。)可以看到CBC解决了ECB对同一明文加密产生的结果都相同的缺点。

在冰蝎3中,木马的加密方式为openssl_decrypt($post, "AES128", $key),而在openssl中,默认的AES-128加密模式是CBC,这也就是为什么对冰蝎3使用Cyberchef配方时,选用的AES需要使用CBC模式并且设置初始向量了(这里其实我有个疑问,在CBC-MAC中初始向量的设置为全0,但是不知道为什么平时解题时也需要设置成全0)

在冰蝎4中,加密方式变成可选的了,其中aes和aes_with_magic的加密方式选用的是ECB模式,那么我们使用Cyberchef配方的时候就要使用ECB模式。冰蝎4的其他加密方式没有使用AES,那么我们如何解密呢?很简单,就如下图一样,冰蝎4的作者开发了一个新功能,叫传输协议,点进去我们就能看到加解密函数了,在最下方我们可以直接进行加解密操作。

哥斯拉

JAVA_AES_BASE64

拿到题目,过滤一下http流。

追踪一下第一个http流,看到有个压缩包文件头,foremost一下可以得到一个压缩包,解压得到一个1.jsp,里面有jsp马的基本信息。

密钥长度为16字节,也就是128bit,对应AES 128bit加密(AES加密的明文长度和密钥长度可选为128bit、192bit、256bit,因此我们需要确定它是哪一种加密)。

再后面可以看到有个md5(截图没截全- -),它的内容是md5(pass+xc)

实际上它是产生一个md5,然后在服务器返回的密文的前面加上这个md5的前16位,在密文的后面加上这个md5的后16位。
举个例子:MD5(ctfisfun3c6e0b8a9c15224a) --> 49b3c226f3e5f760fd90ec52257b31ef
返回包:49B3C226F3E5F760Al5MzPZGMHluPQjF5m3gJoo5PHEm5c7LE599etzDLPWu6nXxjYUIOejLmnUHclk6zZ4Vf0j83e6nz7j0tfkcq8TDelVE2RaCXZrwHMAQaXA=FD90EC52257B31EF
可以看到前16位是md5的前16位,后16位是md5的后16位,这也就是为什么解密的时候需要先手动去除前16位和后16位。

既然已经知道jsp马的名称(1.jsp),以及它的密钥和连接密码,那么流量中对1.jsp的访问就是对木马操作的过程。接下来我们只需要找到加密后的密文,然后用上一篇文章中给的CyberChef配方进行解密即可,这里再放一次配方,使用时只需将AES的key改成题目中的即可。

1.请求包解密,CyberChef 配方

URL_Decode()
From_Base64('A-Za-z0-9+/=',true,false)
AES_Decrypt({'option':'UTF8','string':'3c6e0b8a9c15224a'},{'option':'Hex','string':''},'ECB','Raw','Raw',{'option':'Hex','string':''},{'option':'Hex','string':''})
Gunzip()

2.返回包解密,CyberChef 配方

自己先手动删掉前16和后16的字符串

From_Base64('A-Za-z0-9+/=',true,false)
AES_Decrypt({'option':'UTF8','string':'3c6e0b8a9c15224a'},{'option':'Hex','string':''},'ECB','Raw','Raw',{'option':'Hex','string':''},{'option':'Hex','string':''})
Gunzip()

请求包解密示例

响应包解密示例

找到这些请求包响应包,一个一个解密即可得到信息。后续解题过程不再赘述。这道题目最后问了一下黑客创建了一个用户是什么名称,WP上过滤的是websocket流量,搜了一下发下websocket和http都是应用层的流量,但是websocket是和服务器建立连接的全双工通信,http是请求-响应。(实际上我也不是很清楚为什么这道题为什么又有http又有websocket,有没有懂得师傅教教orz)

具体哥斯拉base64的做题流程如上,最为核心的点就是找到密钥和连接密码,然后使用CyberChef配方解密即可,是挺麻烦的:( ,不过b神好像做了个工具能自动分析,我还没研究透彻,师傅们可以关注b神b站账号https://space.bilibili.com/183379727/dynamic

本来打算再做一道哥斯拉raw例题的,但是到现在也不知道具体思路是什么,等以后学会了再补上。

JAVA_AES_RAW

ok学会了,刚好有个陇剑杯,里面恰好有一个RAW类型的题目。

题目内容:

服务器开放了哪些端口,请按照端口大小顺序提交答案,并以英文逗号隔开(如服务器开放了80 81 82 83端口,则答案为80,81,82,83)

先过滤一下tcp流,可以看到这是典型的端口扫描(极有可能是nmap),攻击者发送SYN包,如果端口开放,则受害主机会发送SYN,ACK包作为响应,如果端口关闭,则发送RST包,如果端口被过滤,则不返回响应包。熟悉nmap的师傅应该很快就能联想到nmap的TCP SYN扫描,也叫做TCP半开扫描,参数为-sS。原理就是在上述的前提下,如果攻击者收到了受害者返回的SYN,ACK的响应包,则立即发送RST包终止连接,这样避免建立连接的过程,提高扫描速度。

知道了原理之后,我们过滤一下SYN,ACK包。

tcp.connection.synack

80端口肯定毫无疑问是开放的,因为两台主机之间一直在交互。我们追踪888和8888看一下。

和我们前面所讲的完全一样,所以可以断定这两个端口也是开放的。

答案:80,888,8888

题目内容:

服务器中根目录下的flag值是多少?

过滤一下http响应为200的流量。

一个一个看下去,在24208包里面有哥斯拉的密钥。

这是哥斯拉的JAVA_AES_RAW的payload,可以看到xc=748007e861908c03,解密时需要复制密文的十六进制,然后使用AES解密,最后使用Gunzip()解压缩,因为哥斯拉传输数据时使用Gunzip压缩。与BASE64的区别就是返回包不需要去掉前后的16位。

CyberChef配方为

From_Hex('Auto')
AES_Decrypt({'option':'UTF8','string':'748007e861908c03'},{'option':'Hex','string':''},'ECB','Raw','Raw',{'option':'Hex','string':''},{'option':'Hex','string':''})
Gunzip()

答案:flag{9236b29d-5488-41e6-a04b-53b0d8276542}

题目内容:

该webshell的连接密码是多少?

密码md5之后的前16位作为key,也就是说我们得到的xc=748007e861908c03是密码md5的前16位。解密后得到链接密码为14mk3y

答案:14mk3y

冰蝎

冰蝎4xor_base64

题目流量不是很多,是b神出的题。先追踪tcp流找一个短的密文。

找到之后,然后丢到冰蝎4的传输协议里面一个一个试试,最后发现在xor_base64模式下能解出来明文。

那么就能确定这道题采用的xor_base64的加密方式了,然后对流量包中的密文逐个进行解密,就可以得到flag了。

这里再说一下xor的题目,就不再单列了,思路都是一样。

可以看到xor题目的特点是有很多字符,解题过程和上面一样,直接丢到传输协议解密即可。

写在最后

这篇主要解了两个比较简单的,但是核心就是找密钥,确定加解密方式。但是在有的时候还会碰到一种题型,就是密钥无论如何都找不到,那么此时就需要进行爆破密钥了。爆破的原理很简单,以冰蝎为例,作者在密钥创建语句后面添加了一段注释密钥为密码的32位md5值的前16位,那么我们只需要猜测密码是什么,然后取它32位md5值的前16位作为测试密钥,如果能解出来明文信息,那么就可以认定这个密码就是连接密钥,这个密钥就是AES的密钥。关于冰蝎爆破,在b神工具里面有。(b神太强了!!!orz)