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 |
|