PsExec绕过姿势

极客

PsExec绕过姿势:那些年我们一起踩过的坑

说真的,提到 PsExec,搞渗透的兄弟们应该都不陌生吧?这玩意儿是 Sysinternals 套件里的老牌工具了,微软官方出品,正经得不能再正经,可偏偏就是这么一个"正经工具",被各路红队拿去当横向移动的利器,搞得杀软和 EDR 看见它就头疼,但问题来了——现在哪家终端防护不认识 PsExec 啊?你一落地,人家立马报警,那还玩个锤子?

PsExec绕过姿势

所以今天咱就唠唠 PsExec绕过姿势这事儿,纯干货,都是我踩坑踩出来的经验,希望能帮到正在看的你。

为啥 PsExec 这么容易被盯上?

先说说原理哈,PsExec 的核心逻辑其实不复杂:它通过 SMB 把一个小小的服务端程序(PSEXESVC.exe)丢到目标机器的 ADMIN$ 共享里,然后借助 Service Control Manager 创建一个服务,把这家伙拉起来当服务跑,从而拿到 SYSTEM 权限执行命令,听着是不是挺优雅?但问题恰恰出在这儿——服务创建、命名管道、PSEXESVC 这个特征名,全都是明晃晃的"指纹",EDR 只要盯着这几个点,一抓一个准。

我第一次用原版 PsExec 打内网的时候,那叫一个自信,结果呢?刚连上去,对面 Defender 直接给我来了个"服务已隔离",尴尬得我脚趾抠地,从那以后我就明白了,PsExec绕过姿势这事儿,必须得研究透彻。

常规的 PsExec绕过姿势有哪些?

改服务名和二进制名

这是最基础的一招了,原版 PsExec 支持 -r 参数指定远程服务名,你用个随机点的名字,-r WinUpdSvc,能绕开一部分基于服务名匹配的规则,不过说实话,现在这招基本属于"安慰剂"级别,稍微像样点的 EDR 都不吃这套了。

重命名 PsExec 本体

把 PsExec.exe 改成 svchost.exe 或者 rundll32.exe 之类的,改个哈希,能过一些静态特征,但你得注意,改完名字行为还是那个行为,动态检测照样能逮到你。

换用 Impacket 的 psexec.py

这个我强推!Impacket 那套 Python 工具里的 psexec.py,走的是同样的协议,但落地的是它自己的 remcomsvc,特征跟原版完全不一样,而且你可以随便改源码,把服务名、二进制名、命名管道全改成自定义的,绕过效果直接拉满,我去年打一个环境,原版 PsExec 秒被杀,换成改过的 psexec.py 之后,安安静静跑完了整个横向,那感觉,爽!

服务二进制路径做手脚

PsExec 创建服务的时候,ImagePath 指向的是 %SystemRoot%\PSEXESVC.exe,有些姿势会把二进制放到别的路径,或者干脆用 cmd /c 包装一层,让命令行特征变得不那么明显,不过这招得小心,包装太花哨反而触发启发式规则。

利用命名管道混淆

PsExec 通信靠的是命名管道,默认管道名是 \\.\pipe\psexesvc,这玩意儿特征太明显了,改管道名是很多PsExec绕过姿势里的必修课,Impacket 里改一下 pipe_name 参数就行,简单粗暴有效。

进阶思路:别死磕 PsExec 本身

说句掏心窝子的话,有时候绕来绕去,不如换个思路,PsExec 的本质是"远程创建服务执行命令",那咱们完全可以不用它,改用 WMI、WinRM、Scheduled Task 这些原生机制,效果一样,特征还更"干净",这就跑题了,今天主题还是 PsExec绕过姿势,咱就聚焦在这儿。

另外一个思路是"白加黑"——找个合法的、带签名的服务程序,把恶意载荷做成它的 DLL 侧加载,然后通过 PsExec 去启动这个合法程序,这样一来,服务名合法、二进制签名合法,EDR 看了都得愣三秒,这招我在实战里用过一次,效果拔群,但前提是你得找到合适的白程序,这就看个人积累了。

几个血泪教训

最后唠叨几句。PsExec绕过姿势这东西,没有一劳永逸的银弹,你今天改个服务名能过,明天厂商更新规则库就给你堵上了,所以啊,别迷信某一个姿势,得多准备几套方案,临场看环境切换,还有就是,测试的时候一定在隔离环境里多跑几遍,别一上来就往生产环境怼,我见过太多兄弟因为手快把靶机搞崩的,那场面,别提多尴尬了。

好了,今天就唠到这儿,希望这些PsExec绕过姿势的经验能给你点启发,如果你也有好用的姿势,欢迎评论区交流,咱一起进步!工具是死的,思路是活的,多动脑子比啥都强。

文章版权声明:除非注明,否则均为极客网安-咸鱼原创文章,转载或复制请以超链接形式并注明出处。

目录[+]