通过PowerShell访问Windows Api【转】

前言

在Mottoin之前发布过的文章《Powershell禁用绕过白名单防护》曾提到过。Powershell是微软的后期开发语言,从本质上来讲,C#和PowerShell其实都是运行在.Net框架之上的高级实现。这也就意味着,我们可以通过C#可执行程序直接调用.Net框架开放给PowerShell的那部分功能。可以编写一个C#程序,然后用它来实现PowerShell脚本的所有功能。

User32 : : MessageBox

从MSDN中可以看到C函数结构如下

这可以很容易转化为C #,几乎就是一个文字的复制/粘贴的实例

创建消息框,是调用api最直接的一个。

执行以上的脚本:

1

当然也可以改变消息框的类型:

2

User32 : : CallWindowProc

从dll中调用一个功能函数

CallWindowProc只有在当前函数没有任何参数的情况下才能生效,User32.dll中包含一个LockWorkStation函数,是用来锁定用户桌面的

4

运行这个脚本,将会锁定计算机的桌面

3

重新登录后,可以看到该函数提供的输出

5

MSFvenom : : WinExec (..or not)

尝试用msfvenom生成一个dll

6

我并没有太多的使用msfpayload生成dll,因为他做不到我想要做的事,而且所有的内容会在ida里暴露出来。

7

该dll并没有调用WinExec,而是dll在建立时调用了CreateProcess.

8

这个调用有些奇怪,看起来像是CreateProcess在挂起(dwCreationFlags = 0x44)的状态下,启动rundll32.exe,rundll32.exe通常是在lpApplicationName,这次却被放置在lpCommandLine,无论怎么样,当lpCommandLine第一个参数被当作模块名称时lpApplicationName可以为null,是合法的。

然后shellcode获得了进程的句柄,注入进字节数组的载荷并恢复线程。

9

反观我们最初的目标,从powershell中执行一个有效的payload是简单直接的。由于所有的东西都在ida的DLLMain中,我们只需要从适当的路径调用LoadLibrary。一个缺点是,当我们开始调用的话,powershell将会被冻结,为避免这种情况,需要在后台启动进程。

10

执行之后将会弹出计算器

11

Kernel32 : : CreateProcess

之前演示的都是小规模,不会遇到什么问题,但并非每次都是这样。调用CreateProcess API是一个很好的例子,但是当你在远程计算机上运行命令的时候,总会弹出cmd窗口,再仔细看windows api可以发现CreateProcess API提供了更详细的功能,包括去处cmd的gui窗口

上面的代码,标志着没有窗口的执行cmd.exe,然后使用cmd.exe执行calc.exe,你可以确认,cmd与进程管理器没有关联的窗口

12

代码看起来有点麻烦,我们修改下

然后来对比看一下

第一张是正常显示cmd.exe的窗口的

13

下面是经过我修改代码之后的效果,是不显示cmd.exe窗口的

14

这里的cmd被称作“无窗口cmd”,cmd.exe去执行bitsadmin命令抓取在greyhathacker域中执行的二进制文件和结果。

15

Netapi32 : : NetSessionEnum

最后的例子,我们看看NetSessionEnum API。这是一个伟大的小API gem,特别是当它涉及到redteaming,它允许一个域用户枚举域身份验证会话连接,它不需要管理员权限。正如我在引言中提到的,已经有个伟大的工具,利用这个,最值得注意的是netsess和Veil-Powerview。下面的脚本是非常类似于“netsessions“PowerView 但是它不使用反射。

测试的时候可以看到如下输出

4-26 5-26 6-24 7-21 8-20 9-20 10-19 16-12

结束语

希望本文章能在powershell调用windows api这方面给你一些启发

此条目发表在未分类, 经验技术分类目录。将固定链接加入收藏夹。