一、冰蝎介绍部分

“冰蝎”是一款动态二进制加密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)

查看password.txt,我们可以通过服务端来看看password.txt的内容(322)
(估计到后面会用到这个)

继续查看攻击者行为

攻击者查看了AppData

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

查看了Local

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

攻击者从这里就有意思了 查看了Google的目录文件

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

查看了chrome浏览器的表单

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

查看了User Data表单

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

查看了Default表单

继续分析攻击者行为(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