首页
社区
课程
招聘
[原创]PowerShell脚本之Invoke-Expression 函数 Hook
发表于: 2019-8-6 15:05 13859

[原创]PowerShell脚本之Invoke-Expression 函数 Hook

2019-8-6 15:05
13859

vs2013,WDK8.1,dnspy

最近在分析一个APT组织样本的时候,发现了一件有意思的事情,该样本进行了80多层混淆,可能还要多,没有查。

原始文件第一层powershell脚本代码:

图片描述

放眼望去,一片混淆,有反转,有正则表达式。开始以为只有几层,就尝试手动解,没想到越解越多。

图片描述

这样谁能受得了?百度了一下没有找到这种去混淆工具。

既然每次混淆后都会调用执行函数,那就把每次执行的参数记录下来,最后终将执行混淆后的代码

原理就是Inlie Hook ,不管再怎么混淆,都将执行iex(invoke expression)函数。

我们只需要对该函数进行Inlie Hook ,然后继续执行原始的代码就行了

图片描述

不过有意思的是,这个Powershell_ise.exe是基于C#开发的,那么他的dll也都是

图片描述

那么我们要如何去hook呢?

在Hook之前,我们要必定要找到 代码所在的模块

我们可以使用Get-Command命令来查询一个Cmdlet所在模块

可以使用以下命令查看实现iex所属.net类的完全限定名称:

图片描述

我们用dnspy打开GAC程序集,并定位到该模块

图片描述

定位到Microsoft.Powershell.Commands包下的InvokeExpressionCommand类,发现该类只有一个函数

图片描述

验证是不是我们要Hook的函数,下个断点,调试程序powershell_ise.exe,并执行iex "get-process",发现确实是我们要Hook的代码

图片描述

我们在这里尝试修改代码是可以改的,但是却不能让程序执行我们的代码,这个模块所在的位置在用户层是没有权限访问的,或者说exploer.exe(资源管理器)是没有权限访问到这个目录的

图片描述

在修改完Hook代码后,这里有两种方式替换掉目标dll:

第一种:用ARK工具,例如PcHunter等工具可以访问到该目录,并且可以删除掉。

图片描述

然后用cmd命令 ,复制到该目录(缺陷:powershell_ise程序在被调试加载和单独运行的时候,加载的模块并不是通一个,然而另外一个模块,用cmd复制过去也是没有用的)

第二种,自己编写patch程序(驱动模块,因为需要system权限,我们可以替换cmd的token,也可以自己复制替换)

dll模块的Hook代码,有过C#开发经验的,编写代码还是比较简单的。

我们在这里不改变程序的流程,只把参数记录下来,并写文件到C盘。改后如下:

图片描述

修改后将代码保存到桌面,原始路径你是没有权限保存的。

之前有说过,我们直接运行powershell_ise和在调试器里运行,其加载的模块是不一样,如下图:

调试时要hook的模块:

图片描述

直接运行加载的模块:

图片描述

经过分析,加载的模块虽然大小不一样,但是包是一样的,起码我们要改的代码处是一样的。

程序正常运行时,如果Microsoft.PowerShell.Commands.Utility.ni.dll不存在则加载Microsoft.PowerShell.Commands.Utility.dll

我们的patch程序,要做的事有如下几件:

注:必须要先删除,直接覆盖是不行的

正常运行时的路径如下:

C:\Windows\assembly\Nativeimages_v2.0.50727_32\Microsoft.PowerShel#\不变,后边是在变化的,我们要去动态获取。

获取代码(对该目录进行递归,找到文件,保存当前目录路径):

将获取的路径写到本地(也可以不用写,把消息发送到0环也行)

图片描述

3环的程序,就是为了获取路径

那么0环的程序,自然就是要读取路径,删除,复制(比较简单,并没有什么技术含量)

图片描述

在0环是没有删除文件和读取文件的,需要自己封装。

驱动的所有代码如下:

驱动(删除两个dll,并复制我们修改过后的dll到目标目录)

图片描述

80层混淆:

图片描述

去混淆后:

图片描述

去混淆后是MuddyWater常用的powershell远控

 
 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-8-6 15:08 被Kalendsi编辑 ,原因: 图片不清晰
上传的附件:
收藏
免费 6
支持
分享
最新回复 (8)
雪    币: 2170
活跃值: (2354)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
2
不知为什么,上传MD文档,图片加载不成功,一张一张贴进去的,照片好像有点不清晰
2019-8-6 15:06
0
雪    币: 768
活跃值: (1909)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
3
样本呢?
2019-8-6 15:40
0
雪    币: 9217
活跃值: (1911)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2019-8-6 15:54
0
雪    币: 495
活跃值: (147)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
感谢分享 干货啊,用PsExec提升到system权限能删除嘛?
2019-8-19 22:17
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
您好,Powershell攻击的样本可以分享一下吗?
2019-10-9 11:53
1
雪    币: 83
活跃值: (1092)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
mark
2019-10-11 12:35
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
劫持dll或者添加导入表加载自己的dll,然后inline不行吗?估计定位函数位置会麻烦点,但是不用上驱动替换文件什么的啊。
2019-12-11 16:08
0
游客
登录 | 注册 方可回帖
返回
//