渗透测试中的 ClickOnce
0x00 前言
最近 Casey Smith@subTee 在《Mimikatz Delivery via ClickOnce with URL Parameters》中介绍了如何在 ClickOnce 程序中传入 URL 参数,实现执行 mimikatz 的技巧,并分享了一个 POC
我对此很感兴趣,于是做了进一步的学习和研究
本文将会记录学习心得,介绍 ClickOnce 的使用方法,总结基于 ClickOnce 的攻击技巧和防御措施
- 博客地址:http://subt0x10.blogspot.com/2016/12/mimikatz-delivery-via-clickonce-with.html
- POC 地址:https://gist.github.com/subTee/bd446efeacf656c67f5c17ca0787f15b
0x01 简介
ClickOnce:
ClickOnce 是一种部署技术,使用该技术可创建自行更新的基于 Windows 的应用程序,这些应用程序可以通过最低程度的用户交互来安装和运行
使用用 ClickOnce 主要解决了程序部署中的几个问题:
- 更新应用程序的困难 使用 Microsoft Windows Installer 部署,每次应用程序更新时,用户都必须重新安装整个应用程序;使用 ClickOnce 部署,则可以自动提供更新。只有更改过的应用程序部分才会被下载,然后会从新的并行文件夹重新安装完整的、更新后的应用程序。
- 对用户的计算机的影响 使用 Windows Installer 部署时,应用程序通常依赖于共享组件,这便有可能发生版本冲突;而使用 ClickOnce 部署时,每个应用程序都是独立的,不会干扰其他应用程序。
- 安全权限 Windows Installer 部署要求管理员权限并且只允许受限制的用户安装;而 ClickOnce 部署允许非管理用户安装应用程序并仅授予应用程序所需要的那些代码访问安全权限
简单理解,ClickOnce 部署的优点:
- 简化安装和更新应用程序的过程
- 可以自动更新
- 支持从 Web 更新
- 更安全,仅授予应用程序所必需的权限,通常为 Intranet 区域
详细介绍可参考如下链接:https://msdn.microsoft.com/zh-cn/cn/library/142dbbz4(v=vs.90).aspx
ClickOnce 安装成功后,会在开始菜单下保存该安装程序
接下来介绍如何开发 ClickOnce 程序并在网站上发布
0x02 使用 ClickOnce 的常规方法
1、配置 Web 服务器
测试系统:Windows Server 2008 R2
1. 安装 Web 服务器(IIS)
在"服务器管理器"-"角色"-"添加角色"-选择"Web 服务器(IIS)"进行安装
在"开始"-"管理工具"-"Internet 信息服务(IIS)管理器"打开 IIS,点击"浏览网站",看是否正常显示
用 http 访问 Windows Server 2008 Web 服务器的 IP 地址,看是否正常显示
若以上测试通过,则说明 IIS 已安装成功且能正常使用
2. 添加虚拟目录
设置别名: publich
设置物理路径: c:\publish
如图
访问该虚拟目录:http://192.168.81.140/publish/
报错:
HTTP 错误 403.14 - Forbidden
Web 服务器被配置为不列出此目录的内容。
如图
3. 启用目录浏览
打开 IIS 管理器,切换到功能试图,找到目录浏览,如图
在目录浏览的操作界面下选择启用,如图
此时,文件能够正常访问,如图
2、开发 ClickOnce 程序
1. 新建标准 c#工程
添加测试代码:System.Diagnostics.Process.Start("calc.exe");
2. 找到项目-属性-发布
如下图,设置发布文件夹位置,选择立即发布
C:\1 下生成三个文件,分别为:
- setup.exe
- ConsoleApplication3.application
- Application Files
如图
安装成功后,在开始菜单自动生成快捷方式,文件夹名称为 ClickOnce 程序中发布者的名称
安装文件保存在 %USERPROFILE%\Local Settings\Apps\2.0
下
程序安装列表中也会存在,可在此处卸载 ClickOnce
3. 在 IIS 服务器上发布
将步骤 2 新生成的三个文件复制到 c:\pubish
下
4. 测试
在另一台测试主机访问该 Web 目录,点击提示安全警告,如图
选择运行,接着提示安全警告,如图
选择运行,执行 setup.exe,弹出计算器,如图
注:在发布项下有多个选择可供选择,用来指定安装模式、应用程序文件、系统必备组件、更新选项等
0x03 基于 ClickOnce 的攻击技巧
基于 ClickOnce 的特性,最常见的利用方式为钓鱼攻击,所以接下来整理一下在钓鱼攻击中 ClickOnce 都有哪些利用方法
1、增加权限
在用户看来,更新程序的过程常常需要管理员的权限,所以在运行更新程序的过程中,如果程序弹框提示需要管理员权限,用户往往会选择同意,触发的 payload 随即获得了管理员权限
2、利用自动更新功能替换 payload
ClickOnce 支持自动更新功能,在运行时可检查新版本并自动更新
注:ClickOnce 安装成功后,会在开始菜单下保存该安装程序
如图
开启自动更新的步骤:
1. 指定更新网址
设置"安装文件夹 URL",填入 IIS 服务器的下载地址就好,如图
注:IIS 服务器上不需要安装 Visual Studio
2. 设定自动更新
选择更新选项,启用 应用程序应该检查更新,如图
3. 指定版本号
如下图,选定"随每次发布自动递增修订号"
4. 测试
在 IIS 发布初始版本,测试主机下载安装,启用 应用程序应该检查更新 后,安装后的 ClickOnce 在每次运行时会访问服务器检查是否有更新,如果服务器有更新,会弹出更新对话框。
如图
点击确定后,安装程序更新为新版本,成功实现替换 payload
3、将 url 参数作为 payload 执行
测试之前,Visual Studio 需要作如下设置:
1. 需要支持 ClickOnce
安装 Visual Studio 的过程需要选择该项
如图
否则在"using System.Deployment.Application;"时会报错,提示如下:
命名空间“System.Deployment”中不存在类型或命名空间名“Application”(是否缺少程序集引用?)
2. 添加引用
在项目工程中添加引用"System.Deployment",如图
在项目工程中添加引用"System.Web"
否则报错,提示如下:
当前上下文中不存在名称“HttpUtility”
如图
3.设置"允许向应用程序传递 URL 参数"
如图
否则,无法向 ClickOnce 传入参数
测试代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Deployment.Application;
using System.Web;
using System.Collections.Specialized;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
try
{
NameValueCollection nvc = GetQueryStringParameters();
foreach (string key in nvc)
{
Console.WriteLine(nvc[key]);
Console.ReadLine();
}
}
catch
{
Console.WriteLine("No Params");
Console.ReadLine();
}
}
public static NameValueCollection GetQueryStringParameters()
{
NameValueCollection col = new NameValueCollection();
if (ApplicationDeployment.IsNetworkDeployed)
{
string queryString = ApplicationDeployment.CurrentDeployment.ActivationUri.Query;
col = HttpUtility.ParseQueryString(queryString);
}
return col;
}
}
}
注:测试代码选自 https://gist.github.com/subTee/bd446efeacf656c67f5c17ca0787f15b
将新的 ClickOnce 程序发布
注:只需要将.application 和 Application Files 上传至网站就好,不需要提供 setup.exe
测试主机在 IE 浏览器访问如下 URL:
http://192.168.81.140/publish/ConsoleApplication3.application?N=TEST
程序自动识别参数并解析输出,如图
4、结合网站的重定向功能,触发不同的 payload
网站的重定向可导致 URL 的参数不同,这样就可以实现触发不同的 payload
细节略
可参考 https://blog.netspi.com/all-you-need-is-one-a-clickonce-love-story/
0x04 钓鱼攻击的缺陷:
不同系统.net 版本不同,所以钓鱼利用场景受限
系统在执行 ClickOnce 程序的过程会检查数字签名验证发布者,否则会提示安装包不可信
0x05 防御
1、对 ClickOnce 程序提高警惕,识别真伪
运行特殊后缀名的程序(如.application) 就会对 ClickOnce 程序进行安装,不需要 setup.exe,用户需要对此提高警惕
2、禁用特殊后缀名,如.application
不同.net 版本生成的 ClickOnce 程序后缀名存在差异,如下链接有更详细的关于 ClickOnce 程序后缀名的介绍: https://robindotnet.wordpress.com/2010/06/12/mime-types-for-clickonce-deployment/
0x06 检测
1、安装 ClickOnce 程序后,会在注册表留下痕迹
注册表位置:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
如图
2、安装 ClickOnce 程序后,会在如下目录保存文件:
%USERPROFILE%\Local Settings\Apps\2.0
测试主机上的路径为:
C:\Users\a\Local Settings\Apps\2.0
每个 ClickOnce 程序都有一个特殊名字的文件夹,如图
注:删除文件夹将从系统中删除 ClickOnce 应用程序
3、安装程序列表也会存在 ClickOnce 程序名称
0x07 小结
通过 ClickOnce 进行钓鱼,相比于常规的钓鱼方式,由于后缀名不常见,因此欺骗性更高,支持的扩展功能如解析 URL 参数、自动更新等功能,使得其利用方法更加灵活
但是,只要用户提高警惕,验证 ClickOnce 程序的数字证书,只运行受信任的程序,就可以防范此类钓鱼方式的攻击
未知攻焉知防,希望本文帮助大家更好的认识这个技术,保护自己的安全
参考学习资料:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论