一、冰蝎介绍部分
“冰蝎”是一款动态二进制加密webshell客户端。简单的来说是菜刀,蚁剑的进化版。主要的文献在GitHub,先知社区,还有其他的地方。(主要参考链接:https://github.com/rebeyond/Behinder)
冰蝎加密的地方主要是在:$post=openssl_decrypt($post, "AES128", $key);非常典型的一个加密格式。
冰蝎过waf的过程如下:
1.首次链接一句话服务端的时候,客户端向服务器发起一个GET请求,服务器端随机生成一个128位的密钥,把密钥回显给客户端,同时把密钥写进服务器的session里面
2.客户端获取密钥之后,对本地的二进制payload先进行AES加密,再通过POST方式发送到服务器端。
3.服务器收到数据以后,从Session中取出密钥,进行AES解密,解密之后得到二进制payload的数据
4.服务器解析二进制文件,执行任意代码,并将执行结果加密返回。
5.客户端解密服务器端返回的结果
下面为执行的流程图

二、有关于冰蝎流量的分析(2019 3ctf线上赛)
题目附件
第一步:首先将流量包用wireshark打开,发现里面清一色的TCP和HTTP的数据包。

只好先从追踪流开始,右键->追踪流->TCP流
发现有几个流里面有几个有意思的内容:
第二步:逐步分析TCP流
在流1里面能明显的看到有马上传,分析内容之后发现是冰蝎(因为有特征的AES加密)
在蓝色字体部分发现上传马成功,并且生成了一个名为:file_5d81f9f4d22d41.67475082.php

流2:首先看到的是一个GET请求(在这里面有一个坑,冰蝎在进行第一步GET请求之后,服务器随机产生一个128位的密钥返还给客户端,如果这一过程顺利即双方建立起一个约定之后,客户端才会把进行POST请求,这一个过程完了之后,才算真正的建立起了连接)
像这样:

在流2里面我们能get到的信息就是 1、AES密钥为d59042be6e437849 2、PHPSession= hie9ignjc1393vr719m0n38872。
第三步:现在解密被AES加密之后的信息,也就是POST里面的内容

使用AES密钥解密之后

在结果那里,发现我们还要再将内容进行base64解密

也就是这样
客户端发送过去的就是就是一个马,现在我们来看看服务端返回的是什么

因为服务端也是AES加密返还回来的,所以依然是进行AES解密

发现结果后面有base64返回的结果:翻过来就是{"status":"success","msg": “f5dfe44a-0213-45db-a617-8db5e5a07ab3 "}
代表执行成功,命令执行的结果为 f5…
知道以上的格式之后,我们可以凭借着状态为success的前提,去推测攻击者的思路
第四步:分析和推测攻击者行为(最重要的一步)
现在我们通过流量包来分析攻击者的攻击行为
可以使用导出对象->HTTP将HTTP里面的东西导出来,依然是要先解密,再base64之后,才能看得到原文
1、已知的是首先上传了一个冰蝎脚本,攻击者成功控制了受害机
2、再查看了phpinfo(239)

3、查看客户端(攻击者)发送了什么(307)

4、继续查看攻击者发送了什么(320)


继续查看攻击者行为

继续查看攻击者行为(362)

继续查看攻击者行为(384)

继续分析攻击者行为(399)

继续分析攻击者行为(414)

继续分析攻击者行为(442)

继续分析攻击者行为(501)

攻击者下载了Cookies,看看服务端返回的是个啥

像是一个sql文件,先放着等会看看
……………………………………………………………后面还有几个,这里我们就直接跳到关键的部分………
继续分析攻击者行为(653)

攻击者下载了Master Key file
我们也需要把这个Master Key file下载下来,并且要把文件名AES解密一下
也就是文件名为:6ecf76bd-1803-437e-92e6-28dd36c907aa
------------------------------从这里开始解密了----------------------------
第五步:将SQL流提取出来,保存为db文件
在SQLiteStudio里面打开
在数据关系里面发现了flag(多半八九不离十),又发现了在cookie里面的encrypted_value的数据类型为BLOB,使用脚本提取出来
#by:aaaaa
from os import getenv
import sqlite3
import binascii
conn = sqlite3.connect("3.db")
cursor = conn.cursor()
cursor.execute("select encrypted_value BLOB from cookies")
for result in cursor.fetchall():
print(result)
print (binascii.b2a_hex(result[0]))
f = open("save.txt", "wb")
f.write(result[0])
f.close()
解出来的结果就作为DPAPI blob file的文件 blob.txt
第六步:打开Windows Password Recovery,然后Utils→DPAPI Decoder and Analyser →Decrypt DPAPI data blob
导入blob.txt

再导入Master Key file(注意文件名!!!)

写入User ID:S-1-5-21-2127750816-4215895028-2373289296-1001
再写入User logon password:p@ssw0rd
就会出现flag

出现flag:028dedc531
附录:极其重要的DPAPI内容
DPAPI全称Data Protection Application Programming Interface,他是作为Windows系统的一个数据保护接口被广泛使用。也就是说我们一般在浏览器里面点击的保存密码,都会通过DPAPI的保护。
参考连接:
《利用动态二进制加密实现新型一句话木马之Java篇》:https://xz.aliyun.com/t/2744
《红蓝对抗——加密Webshell“冰蝎”攻防》:https://xz.aliyun.com/t/6550
《渗透技巧——离线导出Chrome浏览器中保存的密码》:https://zhuanlan.zhihu.com/p/33634735