Ladon下的Powershell混淆还原
前言
Ladon为大型内网渗透工具,可PowerShell模块化、可CS插件化、可内存加载,无文件扫描。含端口扫描、服务识别、网络资产探测、密码审计、高危漏洞检测、漏洞利用、密码读取以及一键GetShell,支持批量A段/B段/C段以及跨网段扫描,支持URL、主机、域名列表扫描等。
此次我们着重于对PowerShell的混淆进行简单的分析,其对应混淆的方式是将Powershell脚本通过只包含特殊符号来进行,如下图:

还原混淆
我们此处以2023 *CTF中的ez_code为例
我们可以看到其对应的代码由符号组成(代码太长了此处就不贴完了)
| 1 |  | 
看上去让人挺无从下手的不是吗?我们首先找到分号以及大括号来将其进行简单的划分,我们将分号前的作为第一部分,分号后的作为第二部分
第一部分
| 1 |  | 
在powershell中我们可以使用${变量名}的方式来定义任意变量,我们先看上面部分,$()为空子表达式等价于$null当我们在前面加上一个+时会将其转换为数值 0,所以上述中的混淆中第一个大括号{ ${-``} = + $() }为定义了${-``}变量值为 0
利用上述规则我们可以将部分变量进行表达出来,其实还一个最简单的方式获取对应变量代表的值,我们可以使用echo来打印对应变量的值
在输出时我们同样以大括号拆开后来辨别对应变量名,之后将其进行输出即可快速得到对应的值
在翻译过程我们可以注意到有@{}的出现,其代表着一个空的哈希表,当我们将其放在子表达式$()中,并转换为字符串即"$(@{})"时,我们便可以得到字符串System.Collections.Hashtable此时我们可以按照下述索引进行替换
| 1 |  | 
同样的在翻译工程中我们还会遇到$?,其一个自动变量指示的是我们上一条语句的执行情况,如果执行成功为True反之为False,我们同样可以利用索引来取对应字符
翻译出来后我们可以发现有"".inSert字样,Insert()为System.String中的一个方法名,原型如下:
| 1 |  | 
我们使用<Object>.Method name可以得到上述一个方法对象
对于"".inSert我们同样可以创建一个索引表如下:
| 1 |  | 
经过上述转换后我们可以得到对应的变量名与其值为:
| 1 |  | 
第二部分
之后我们将其进行批量替换,用对应数字或者字符串来替换第二部分中的变量。在这之后我们可以大致得到一串由[CHar]xx+[CHar]xx组成的串
xx为某些数字,由我们之前的字符串替换得到
解密
我们此时可以将其直接替换掉[CHar]以及+可以直接将其丢进Cyberchef中进行转换,之后我们便可以得到对应的源代码程序
| 1 |  | 
不难看出是一个XXTEA,我们写出对应解密脚本将其进行解密即可
| 1 |  |