Winnti黑客组织MSSQL后门的示例分析
发布时间 - 2023-05-27 00:00:00 点击率:次一段时间以来,eset的研究人员一直在跟踪winnti的活动,该组织从2012年起就开始活跃,并针对视频游戏和软件行业供应链进行攻击。最近发现一处以前未被登记的后门,其攻击目标为microsoft sql(mssql)系统。这个后门与portreuse后门有多处相似之处,portreuse是winnti group使用的另一个工具,于2019年10月首次记录。
Winnti组织成员发布了一个新的后门样本,名为Skip-2.0,今年检测到了该样本。这个后门程序以MSSQL服务器11和12为目标,攻击者可以使用magic密码连接到任何MSSQL帐户,同时自动将这些连接隐藏在日志中。攻击者可以利用后门进入数据库,复制、修改或删除其中的内容,从而操纵游戏内货币,以获取经济利益。根据了解,Skip-2.0是第一个被公开记录的MSSQL服务器后门。
本文将重点介绍mssql服务器后门的技术细节和功能,以及skip.2-0与winnti已知武器库(特别是portreuse后门和shadowpad)的技术相似性。
vmprotected启动程序
我们在查找vmprotected启动程序时找到了skip-2.0,其有效负载通常是portreuse或shadowpad。
嵌入式有效载荷
与加密的portreuse和shadowpad有效负载一样,skip-2.0嵌入到vmprotected启动程序中,如图1所示:
加密
与其他使用VMProtect启动程序的相同,有效载荷也要进行加密。该加密方式采用RC5算法,密钥由volumeID和字符串"f@ukd!RCTO R$"组成。
持久性
与portreuse和shadowpad的一样,启动程序可能会通过利用dll劫持而持续存在,方法是将其安装在c:\windows\system32\tsvipsrv.dll。这会使得系统启动时标准的Windows SessionEnv服务加载DLL。
打包器
嵌入有效负载的解密后,实际上是winnti组的自定义打包程序。这个打包器与我们在白皮书中记录的代码是相同的。该工具被用于打包PortReuse后门,并将负载嵌入到受损的视频游戏中。
配置
程序打包配置中包含解密二进制文件所需的密钥,以及原始文件的名称、大小和执行类型(exe或dll)。有效载荷配置如表1所示。
打包器配置可以看出,有效负载称为内部装载器。内部加载程序是一个注入器的名称,它是winnti集团的武库的一部分,用于将portreuse后门注入监听特定端口的进程。
内部加载器
这是一种内部加载程序的变体,不是像注入portreuse后门时那样寻找监听特定端口的进程,而是寻找名为sqlserv.exe的进程,这是mssql server的常规进程名。如果找到,则内部加载程序会将有效负载注入此进程。此有效负载与自定义打包程序一起打包,该打包程序的配置列于表2中。
此注入负载的原始文件名为skip-2.0.dll。
skip-2.0
在被内部加载程序注入并启动之后,skip-2.0首先检查它是否在sqlserv.exe进程中执行,如果是,则检索sqllang.dll的句柄,该句柄由sqlserv.exe加载。然后继续从该dll中查找并挂接多个函数。图2描述了skip-2.0的运行过程。
Hooking sqllang.dll
skip-2.0使用的hook过程与netagent非常相似,netagent是负责安装网络hook的portreuse模块。该hook库建立在开源的distorm反汇编程序基础上,多个开源的挂接框架也使用了该反汇编程序。需要一个反汇编库来正确计算要hook的指令的大小。几乎相同的hook过程被NetAgent和Skip-2.0使用,如下图所示。
图3Hex-Rays output comparison between the NetAgent (left) and skip-2.0 (right) hooking procedures
有一个显著的区别就是skip-2.0中的hooking函数将要安装的钩子的地址作为参数,而对于netagent,要安装的钩子的地址是硬编码的。这是因为skip-2.0必须hooksqllang.dll中的多个函数才能正常运行,而netagent只针对一个函数。
要定位hook的每个sqllang.dll函数,skip-2.0首先通过解析pe头来检索加载到内存中的dll的大小(即其虚拟大小)。接着,需初始化sqllang.dll中需要匹配的字节数组,参照图4。一旦找到与字节数组匹配的第一个匹配项的地址,就会使用图3所示的过程安装钩子。
然后,钩子安装成功后会在cleartext中记录,该文件位于硬编码路径c:\ windows\temp\ts\u 2ce1.tmp中,如图5所示。
如果找不到目标函数,钩子安装程序将搜索具有不同字节模式集的回退函数。
通过匹配字节序列来定位目标函数的地址,而不是使用静态偏移量,再加上使用字节的回退序列,skip-2.0可以更灵活地适应mssql更新,并可针对多个sqllang.dll更新。
密码控制
skip-2.0的目标函数与身份验证和事件日志记录相关。目标功能包括:
CPwdPolicyManager::ValidatePwdForLogin CSECAuthenticate::AuthenticateLoginIdentity ReportLoginSuccess IssueLoginSuccessReport FExecuteLogonTriggers XeSqlPkg::sql_statement_completed::Publish XeSqlPkg::sql_batch_completed::Publish SecAuditPkg::audit_event::Publish XeSqlPkg::login::Publish XeSqlPkg::ual_instrument_called::Publish
其中最有趣的函数是第一个函数(cpwdpolicymanager::validatepwdforlogin),它负责验证为给定用户提供的密码。
此函数的钩子检查用户提供的密码是否与magic密码匹配;如果是,则不会调用原始函数,钩子将返回0,从而允许连接。接下来,设立一个全局标识,由其他负责事件日志记录的钩子函数进行检查。相应的反编译过程如图6所示。在设置此全局标志的情况下,hook的日志记录函数将静默返回,而不调用其对应的原始函数,因此不会记录操作。
如果使用magic密码登录,reportloginsaccess和issueloginsuccessreport挂钩将不会调用原始函数。feexecutelogontriggers也适用于同样的行为。其他日志记录功能,如xesqlpkg::sql_completed::publish或xesqlpkg::sql_batch_completed::publish,在用户使用魔法密码登录的情况下也将被禁用。还禁用了多个审核事件,包括secauditpkg::audit_event::publ
ish、xesqlpkg::login::publish和xesqlpkg::uau instrument_called::publish。
这一系列hook不仅允许攻击者通过特殊密码在受害者的mssql服务器中获得持久控制,而且使用该密码时禁用了多个日志,因此无法检测到攻击者。
研究人员对多个MSSQL Server版本测试了Skip-2.0,发现能够使用MSSQL Server 11和12的密码成功登录。为了检查skip-2.0是否针对特定的sqllang.dll版本,创建了一个yara规则,该规则可以在github库中找到。
与Winnti的联系
skip-2.0和来自winnti的其他工具有很多相似之处。vmprotected启动程序、自定义打包程序、内部加载程序和hook框架是winnti工具集的一部分。
# sql
# 字符串
# 事件
# github
# windows
# 算法
# 数据库
# microsoft
# mssql
# 多个
# 加载
# 所示
# 第一个
# 自定义
# 如图
# 句柄
# 之处
# 用户提供
# 反汇编
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
Laravel如何使用Eloquent进行子查询
Laravel怎么实现验证码(Captcha)功能
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Laravel如何实现多对多模型关联?(Eloquent教程)
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel中的withCount方法怎么高效统计关联模型数量
如何快速上传自定义模板至建站之星?
jQuery中的100个技巧汇总
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
如何快速生成高效建站系统源代码?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Laravel怎么调用外部API_Laravel Http Client客户端使用
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
js实现点击每个li节点,都弹出其文本值及修改
详解Android中Activity的四大启动模式实验简述
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
jQuery 常见小例汇总
如何快速搭建高效WAP手机网站吸引移动用户?
网站制作免费,什么网站能看正片电影?
Linux网络带宽限制_tc配置实践解析【教程】
制作公司内部网站有哪些,内网如何建网站?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
JavaScript如何实现错误处理_try...catch如何捕获异常?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
详解Huffman编码算法之Java实现
用v-html解决Vue.js渲染中html标签不被解析的问题
长沙做网站要多少钱,长沙国安网络怎么样?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
使用spring连接及操作mongodb3.0实例
如何确保西部建站助手FTP传输的安全性?
实例解析Array和String方法
如何制作一个表白网站视频,关于勇敢表白的小标题?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何在阿里云完成域名注册与建站?
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
如何在万网主机上快速搭建网站?
Android自定义listview布局实现上拉加载下拉刷新功能
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
西安专业网站制作公司有哪些,陕西省建行官方网站?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
微信推文制作网站有哪些,怎么做微信推文,急?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
上一篇:如何使用ps污点修复画笔工具
上一篇:如何使用ps污点修复画笔工具

