网络靶场实战-恶意程序自启动

简介

当恶意程序入侵目标为个人计算机时,相较于服务器,个人计算机对关机或重启操作更加频繁,关机时计算机所有的进程都会被结束,因此恶意程序需要配置自启动来使自己在每次开机时能够被运行。

本篇介绍一个恶意样本(b8090d7d12d6f0abacd16ecfab252f48ee466a254c1751d928567485208634f9)中使用的自启技术,该样本是一个可执行程序,运行后会释放一些文件,其中两个文件比较重要,一个文件为saxbn.exe,该文件是联想应用商店的一个组件(LeASLane),是一个正常的程序。

图片

另一个文件名为libcrypto-3.dll,在正常情况下,该文件为OpenSSL的加密库,被LeASLane所依赖,攻击者通过劫持该文件,并对其使用了文件膨胀、seh异常、加壳等技术来对抗安全检测,在saxbn.exe运行时,会加载被劫持的libcrypto-3.dll,执行其中的恶意载荷。

图片

上述介绍中,可以知道该攻击利用了白加黑,那么想在每次开机时都执行恶意程序,saxbn.exe需要设置自启,该样本对saxbn.exe自启方式比较隐蔽,如果在没有原始样本的情况下,找到自启配置还是比较困难的,在隔离环境中执行样本,并将原始样本清理,然后试着用常规方式,看能否找到可疑的启动项。

自启动排查

上文中已经说明,想要执行恶意载荷,需要在每次开机时执行saxbn.exe,因此需要找到该程序的信息。

最常见的方式是去注册表中查找RUN启动项,配置项如下:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunonceHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnceHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\explorer\runHKCU\Software\Microsoft\Windows\CurrentVersion\RunHKCU\Software\Microsoft\Windows\CurrentVersion\RunonceHKCU\Software\Microsoft\Windows\CurrentVersion\RunServicesHKCU\Software\Microsoft\Windows\CurrentVersion\RunServicesOnceHKCU\Software\Microsoft\Windows\CurrentVersion\policies\explorer\run

对这些项逐个进行排查,没有发现可疑配置。

图片

然后排查启动项目录,需要自启动的程序会将自己的快捷方式保存在该目录下,按下Win + R键打开"运行"对话框,输入"shell:startup"打开启动项目录,勾选显示隐藏的项目,防止文件隐藏,发现该目录下为空,也没有发现可疑信息。

图片

接下来排查计划任务,恶意程序可以利用com接口,通过类似下方的代码,在计划任务中添加自启动

#include <windows.h>
#include <comdef.h>
#include <taskschd.h>
#include <iostream>#pragma comment(lib, "taskschd.lib")
#pragma comment(lib, "comsupp.lib")int main()
{HRESULT hr;// 创建与计划任务相关的 COM 对象CoInitializeEx(NULL, COINIT_MULTITHREADED);ITaskService* pService = NULL;hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (void**)&pService);if (FAILED(hr)){std::cout << "Failed to create an instance of ITaskService!" << std::endl;return -1;}// 连接到任务计划程序hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());if (FAILED(hr)){std::cout << "Failed to connect to the Task Scheduler service!" << std::endl;pService->Release();return -1;}ITaskFolder* pRootFolder = NULL;hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder);if (FAILED(hr)){std::cout << "Failed to get the root folder!" << std::endl;pService->Release();return -1;}ITaskDefinition* pTaskDefinition = NULL;hr = pService->NewTask(0, &pTaskDefinition);if (FAILED(hr)){std::cout << "Failed to create a new task definition!" << std::endl;pRootFolder->Release();pService->Release();return -1;}ITriggerCollection* pTriggerCollection = NULL;hr = pTaskDefinition->get_Triggers(&pTriggerCollection);if (FAILED(hr)){std::cout << "Failed to get the trigger collection!" << std::endl;pTaskDefinition->Release();pRootFolder->Release();pService->Release();return -1;}ITrigger* pTrigger = NULL;hr = pTriggerCollection->Create(TASK_TRIGGER_BOOT, &pTrigger);if (FAILED(hr)){std::cout << "Failed to create a new trigger!" << std::endl;pTriggerCollection->Release();pTaskDefinition->Release();pRootFolder->Release();pService->Release();return -1;}IActionCollection* pActionCollection = NULL;hr = pTaskDefinition->get_Actions(&pActionCollection);if (FAILED(hr)){std::cout << "Failed to get the action collection!" << std::endl;pTrigger->Release();pTriggerCollection->Release();pTaskDefinition->Release();pRootFolder->Release();pService->Release();return -1;}IAction* pAction = NULL;hr = pActionCollection->Create(TASK_ACTION_EXEC, &pAction);if (FAILED(hr)){std::cout << "Failed to create a new action!" << std::endl;pActionCollection->Release();pTrigger->Release();pTriggerCollection->Release();pTaskDefinition->Release();pRootFolder->Release();pService->Release();return -1;}IExecAction* pExecAction = NULL;hr = pAction->QueryInterface(IID_IExecAction, (void**)&pExecAction);if (FAILED(hr)){std::cout << "Failed to query IExecAction interface!" << std::endl;pAction->Release();pActionCollection->Release();pTrigger->Release();pTriggerCollection->Release();pTaskDefinition->Release();pRootFolder->Release();pService->Release();return -1;}// 设置要执行的程序hr = pExecAction->put_Path(_bstr_t("C:\\Path\\To\\Your\\Program.exe"));if (FAILED(hr)){std::cout << "Failed to set the path of the program to execute!" << std::endl;pExecAction->Release();pAction->Release();pActionCollection->Release();pTrigger->Release();pTriggerCollection->Release();pTaskDefinition->Release();pRootFolder->Release();pService->Release();return -1;}IRegisteredTask* pRegisteredTask = NULL;hr = pRootFolder->RegisterTaskDefinition(_bstr_t(L"YourTaskName"),pTaskDefinition,TASK_CREATE_OR_UPDATE,_variant_t(),_variant_t(),TASK_LOGON_INTERACTIVE_TOKEN,_variant_t(L""),&pRegisteredTask);if (FAILED(hr)){std::cout << "Failed to register the task definition!" << std::endl;pExecAction->Release();pAction->Release();pActionCollection->Release();pTrigger->Release();pTriggerCollection->Release();pTaskDefinition->Release();pRootFolder->Release();pService->Release();return -1;}std::cout << "The program has been added to startup successfully!" << std::endl;// 释放 COM 对象及其接口pRegisteredTask->Release();pExecAction->Release();pAction->Release();pActionCollection->Release();pTrigger->Release();pTriggerCollection->Release();pTaskDefinition->Release();pRootFolder->Release();pService->Release();CoUninitialize();return 0;
}

打开计划任务,发现也没有相关配置信息。

图片

由于自启的方式还有很多,接下来我们使用Autoruns 工具来查看是否有saxbn.exe启动项的一些信息。

Autoruns 是一款由 Sysinternals 开发的免费工具,用于管理Windows操作系统中自动启动的程序和服务。它提供了一个全面的系统启动项和登录项清单,包括注册表中的所有自动启动位置,从而帮助用户找到并禁用或删除不需要的自动启动项。Autoruns 还提供了强大的搜索功能,以帮助用户准确定位到特定的启动项。此外,该工具还可以显示每个启动项的详细信息,包括路径、描述、发布者和数字签名等,从而帮助用户判断是否需要保留或禁用该启动项。Autoruns 可以帮助用户提高计算机的启动速度,减少系统资源的占用,并且增加系统的安全性,因为某些恶意软件和病毒可能会利用自动启动功能在计算机启动时自动运行。使用Autoruns,用户可以轻松地管理系统的启动项,确保只有必要的程序和服务在系统启动时自动运行。

Autoruns 对自启动的检测是比较全面的,然而遗憾的是,我们在Autoruns中依然没有找到saxbn.exe自启动的信息,但是Autoruns帮我们排除了很多saxbn.exe可能配置的方法。

图片

样本中使用的自启动

那么恶意样本是如何配置自启动的呢?

恶意程序在释放saxbn.exe时,修改了注册表\HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders下Startup项,将其改为C:\Users\Public\Documents\miso。

图片

Windows开机时会根据Startup配置的值,去该目录下获取自启项,查看miso目录,发现有一个快捷方式,指向了加载恶意dll的白程序saxbn.exe。

图片

Windows默认情况下,Startup的初始值为C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,这与我们之前通过命令执行shell:startup打开的目录相同。但是恶意程序已经修改了Startup值,也就是说,即使修改了Startup项的值,执行shell:startup依旧会打开默认配置,但实际情况该目录已被替换,这会误导我们启动项目录好像没有问题,甚至Autoruns工具也没有检测出来。

总结

使用样本中自启方式,是比较隐蔽,但是该方式仍有缺点,当受害者通过shell:startup添加一些自启项时,会因默认目录被修改,如果没有将默认目录下的文件持续同步到新配置的目录,自启动项不会生效,这时受害者会警惕自己的计算机可能已经被入侵。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker向harbor上传大镜像的413报错

文章目录 一、背景二、问题三、处理1.调整harbor相关大小2.正向代理的nginx参数 一、背景 最近遇到了个需求&#xff0c;某厂商的系统模块以容器模式部署在我们的内网环境中&#xff0c;厂商为我们提供了一个公网仓库&#xff0c;需要我们自己下载相关镜像。因此&#xff0c;获…

快速找到销售爆款!淘宝商品关键词搜索API接口为你开启财富之门

在如今的电商时代&#xff0c;淘宝作为中国最大的网络购物平台&#xff0c;吸引了数以亿计的用户。对于卖家而言&#xff0c;如何快速找到热销商品&#xff0c;成为其成功的关键。淘宝商品关键词搜索API接口就是为了满足这一需求而诞生的工具&#xff0c;联讯数据为卖家提供了全…

C# 动态加载dll

方式1 using System; using System.Reflection;class Program {static void Main(){string dllPath "path/to/your/library.dll"; // 替换为你的DLL文件路径Assembly myAssembly Assembly.LoadFile(dllPath);Type myType myAssembly.GetType("YourNamespace…

番外篇 | YOLOv8改进之在C2f中引入即插即用RepViTBlock模块 | CVPR2024清华RepViT

前言:Hello大家好,我是小哥谈。YOLOv8是一种基于深度学习的实时物体检测算法,其通过将物体检测任务转化为目标框回归问题,并使用卷积神经网络实现高效的特征提取和目标分类。然而,YOLOv8在处理一些复杂场景和小目标时可能存在一定的性能限制。为了克服YOLOv8的局限性,清华…

JMM与内存屏障

一、cpu多核并发缓存架构解析 JMM内存模型&#xff1a;java多线程内存模型跟cpu缓存模型类似&#xff0c;是基于cpu缓存模型来建立的&#xff0c;java线程内存模型是标准化的&#xff0c;屏蔽掉了底层不同计算机的区别 JMM数据原子操作 read(读取)&#xff1a;从主内存读取数据…

算法题解记录17+++完全平方数

这是楼主第一次不靠题解&#xff0c;挑战动态规划的中等题目&#xff0c;虽然最终结果只超过了5%的人&#xff0c;不过我也很满意了。 本题楼主首先采用朴素的递归型动态规划&#xff0c;接着优化算法&#xff0c;使用借助HashMap存储临时数据的递归型动态规划&#xff0c;几次…

基于1-wire总线的多路温度监测系统

前言 在现代工业生产和环境监测中&#xff0c;温度是一个关键的参数&#xff0c;它直接影响到生产过程的稳定性和产品质量。为了确保温度控制在安全和有效的范围内&#xff0c;需要一种可靠且高效的多路温度监测系统。随着微电子技术和传感器技术的发展&#xff0c;基于1-Wire…

Redis key(BigKey、MoreKey)的存储策略

1. MoreKey 案例 1.1 大批量往 redis 里面 插入2000w 测试数据key (1) Linux Bash 下面执行&#xff0c;插入 100w rootspray:~# for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt; done; 查看 rootspray:~# more /tmp/redisTest.…

elementui单个输入框回车刷新整个页面

<!-- 搜索 --> <el-form :model"queryParams" ref"queryForm" :inline"true"><el-form-item label"名称" prop"nameLike"><el-input v-model"queryParams.nameLike" placeholder"请输入…

Arcgis Pro2.5安装教程(内含安装文件)

​最近处理的数据量大&#xff0c;发现arcmap这种老产品属实是不行了&#xff0c;相比于下一代的Arcgis Pro,不但运行速度慢&#xff0c;也容易遇到突然关闭的问题&#xff0c;之前基于团队的选择也没办法&#xff0c;最近实在是被数据搞得无语了&#xff0c;一鼓作气装上了Arc…

319_C++_使用QT自定义的对话框,既能选择文件也能选择文件夹,为什么使用QListView和QTreeView来达成目的?

解析 1: 在 Qt 中,QFileDialog::setOption 方法用于设置文件对话框的一些选项,以改变其行为或外观。QFileDialog::DontUseNativeDialog 是这些选项之一,当设置为 true 时,它会告诉 QFileDialog 不要使用操作系统提供的原生文件对话框,而是使用 Qt 自己实现的对话框样式。…

WAF攻防-漏洞发现协议代理池GobyAwvsXray

知识点 1、Http/s&Sock5协议 2、Awvs&Xray&Goby代理 3、Proxifier进程代理使用 4、Safedog&BT&Aliyun防护在漏洞发现中&#xff0c;WAF会对三个方向进行过滤拦截&#xff1a; 1、速度频率问题&#xff08;代理池解决&#xff09; 2、工具的指纹被识别&am…

MySQL查询重复数据获取最新数据

方法一&#xff1a; 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘se_jck的博客-CSDN博客 这个错误是由于 MySQL 的新版本中默认开启了ONLY_FULL_GROUP_BY模式&#xff0c;即在 GROUP BY 语句中的 SELECT 列表中&…

UE5不打包启用像素流 ubuntu22.04

首先查找引擎中像素流的位置&#xff1a; zkzk-ubuntu2023:/media/zk/Data/Linux_Unreal_Engine_5.3.2$ sudo find ./ -name get_ps_servers.sh [sudo] zk 的密码&#xff1a; ./Engine/Plugins/Media/PixelStreaming/Resources/WebServers/get_ps_servers.sh然后在指定路径中…

标准版配置的新增和使用

很多用户在使用标准版进行二开的时候&#xff0c;都会遇见需要增加配置的问题 这篇文章就详细的介绍了&#xff0c;怎么增加配置以及配置的调用 一、增加配置 1. 增加配置分类 在菜单维护-开发配置-配置分类中&#xff0c;点击添加配置分类 父级分类&#xff1a;选择此分类的…

基于51单片机电子钟闹钟12/24小时制LCD显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机电子钟闹钟12/24小时制LCD显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机电子钟闹钟12/24小时制LCD显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteu…

如何自动监控WordPress网站的运行状态

近来有不少Hostease的客户来咨询关于监控网站在线情况的方法&#xff0c;确实&#xff0c;尽管我们采取了各方面的措施来维护和保护WordPress网站&#xff0c;网站依然有可能由于一些不可控的原因关闭&#xff0c;这种情况往往事发突然&#xff0c;如果没有提前做好准备&#x…

评分卡制作过程中关键参数设定的思考

评分卡制作过程中关键参数设定的思考 评分卡、列线图和网络APP都是预测模型进入生产场景的形式。评分卡&#xff0c;常用于银行或金融机构的贷款审批过程中。其原理在于通过一系列与借款人相关的因素&#xff08;如年龄、收入、职业、信用记录等&#xff09;来为每个人打分&am…

一文速览Llama3:含8B和70B、长度8K、15T训练数据、组合PPO和DPO等方法

前言 4.19日凌晨正准备睡觉时&#xff0c;突然审稿项目组的文弱同学说&#xff1a;Meta发布Llama 3系列大语言模型了 一查&#xff0c;还真是 本文以大模型开发者的视角&#xff0c;帮你迅速梳理下LLama的关键特征&#xff0c;并对比上一个版本的LLama2&#xff0c;且本文后…

Python 字符串 Base64

因消息传输的需要&#xff0c;我们需要对大量文本的字符串进行一下 Base64 转换。 这样的好处是因为在传输的字符串中可能有存在一些特殊字符&#xff0c;这些特殊在经过网络传输的时候会出现编码的问题&#xff0c;并且会影响传输稳定性。 使用 Base64 可以避免这个问题。 方…