这是我给九月的答卷
原创
ptr
ptr
UpRoot
2026年10月1日 16:30
江苏
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
前言
好久不见,大家。
在九月的第一天,我给自己定了几个目标,分别是:
从我打的这段字就看出来了,那时候还是个什么都不懂的,写加载器只会分离和纤程执行的ai小子,lnk钓鱼都能写成link,白加黑、侧加载就知道个名词,pdf钓鱼也不知道宏很早就被ban了。
经过一段时间的去问去学后,总算有了些自己的小总结,九月的最后一天,我想我可以把这个月学到的东西,做成个答卷,给自己个交付了。
这次我做的冲锋马架构是这样的:
压缩包lnk方式投递,包内主要是白加黑和加密的载荷,可以贴合微信和邮箱钓鱼场景。经典的lnk配合白加黑打法。效果如下:
原始白加黑exe马子双击运行,av/edr都可以无感k掉并权限维持上线,这里主要测试lnk下的,因为lnk下av/edr,敏感度会更高。
微步沙箱监测黑dll,仅监测出来加了vmp的壳。
火绒。
已关注
关注
重播 分享 赞
关闭
观看更多
更多
退出全屏
切换到竖屏全屏退出全屏
UpRoot已关注
分享视频
,时长02:05
0/0
00:00/02:05
切换到横屏模式
继续播放
[ ]
进度条,百分之0
播放
00:00
/
02:05
02:05
倍速
全屏
倍速播放中
0.5倍0.75倍1.0倍1.5倍2.0倍
超清流畅
继续观看
这是我给九月的答卷
观看更多
原创
,
这是我给九月的答卷
UpRoot已关注
分享点赞在看
已同步到看一看写下你的评论
视频详情
卡巴斯基。
已关注
关注
重播 分享 赞
关闭
观看更多
更多
退出全屏
切换到竖屏全屏退出全屏
UpRoot已关注
分享视频
,时长01:53
0/0
00:00/01:53
切换到横屏模式
继续播放
[ ]
进度条,百分之0
播放
00:00
/
01:53
01:53
倍速
全屏
倍速播放中
0.5倍0.75倍1.0倍1.5倍2.0倍
超清流畅
继续观看
这是我给九月的答卷
观看更多
原创
,
这是我给九月的答卷
UpRoot已关注
分享点赞在看
已同步到看一看写下你的评论
视频详情
360,我测试了很长一段时间,直接执行exe马子上线无障碍,但通过lnk执行发现360对lnk行为十分敏感,因此我选了笨一点的办法,分而治之,如果是360就不做kill的操作,仅bypassUAC上线,后续可根据实际情况决定是否需要k掉。
已关注
关注
重播 分享 赞
关闭
观看更多
更多
退出全屏
切换到竖屏全屏退出全屏
UpRoot已关注
分享视频
,时长01:32
0/0
00:00/01:32
切换到横屏模式
继续播放
[ ]
进度条,百分之0
播放
00:00
/
01:32
01:32
倍速
全屏
倍速播放中
0.5倍0.75倍1.0倍1.5倍2.0倍
超清流畅
继续观看
这是我给九月的答卷
观看更多
原创
,
这是我给九月的答卷
UpRoot已关注
分享点赞在看
已同步到看一看写下你的评论
视频详情
如果是360edr的环境下,我通过qos策略对遥测传感器做了限速,可在一定程度上致盲。
奇安信天擎edr。
已关注
关注
重播 分享 赞
关闭
观看更多
更多
退出全屏
切换到竖屏全屏退出全屏
UpRoot已关注
分享视频
,时长01:50
0/0
00:00/01:50
切换到横屏模式
继续播放
[ ]
进度条,百分之0
播放
00:00
/
01:50
01:50
倍速
全屏
倍速播放中
0.5倍0.75倍1.0倍1.5倍2.0倍
超清流畅
继续观看
这是我给九月的答卷
观看更多
原创
,
这是我给九月的答卷
UpRoot已关注
分享点赞在看
已同步到看一看写下你的评论
视频详情
技术栈
语言用的C#,编译DLL,用的是NativeAOT。
落地3个文件,分别是b.exe(白文件)、sync\_frame.dll(vmp加壳的黑dll)、sync\_frame.pay(AES加密的载荷)。
整体的工作流是这样的,我画了个图:
基本项
具体来说,我的思路是这样的:
白加黑调用黑dll导出函数,执行马子逻辑之前,我先做了环境监测,具体来说是:
1、反虚拟机:提取机器指纹、网卡、MAC地址做匹配。
2、反沙箱:我对沙箱的指纹进行了收集,国内常见的沙箱,如微步云沙箱、奇安信天穹云沙箱、360云沙箱等,我针对沙箱的壁纸情况、开机时间、输入空闲,父进程监测(进程快照的方式)、最近文档、出网ip,做了打分,如果程序收集的分数超出我设定的阈值,直接拒绝执行。
3、反调试:主要检测三块,用户态的远程/附加调试、内核调试器、硬件断点。针对远程/附件调试,做了基本的IsDebuggerPresent(PEB里的BeingDebugged单字节标志,有用户态调试器挂在进程上会置为1)和CheckRemoteDebuggerPresent(从内核寻找是否正在被调试);针对内核调试器,通过NtQueryInfomationProcess组合拳进内核问三个信息类(调试端口号、调试对象句柄、调试标志),通过遍历PEB对NtGlobalFlag做查询,看是否有0x70这样的调试标志位;针对硬件断点,通过GetThreadContext读Dr0-Dr3/Dr7,Dr0-Dr3存硬件断点地址,Dr7是开关,如果正在被调式,那CPU调试寄存器中会存在这几个特征。
做好基本的环境检测后,下面进入提权,我设计这一块的时候是为了方便后续的加驱动去byovd,如果是实战情况下,最好还是去掉,尽量少一些注册表操作的行为,确保能够上线:
我对bypassUAC的理解有两种:基于COM接口和基于白名单。
这里简单复习一下:
一些windows自带的com类再被调用时可被AIS直接以高完整性令牌实例化。cmstlpua.dll中有个com类叫ICMLuaUtil能够调ShellExec执行任意命令。因此,我们就可以通过调这个类的方法实现高权限执行命令。这就是基于COM接口的bypassUAC。
一些windows自带的文件AIS同样静默给高完整性运行,这些文件中有的程序在启动后会走注册表中一个用户可写的键,HKCU\\Software\\Classes\\ms-settings\\Shell\\Open\\command。因此,我们就可以通过劫持注册表的键指向我们的马子,从而实现马子bypassUAC高权限运行。
那么针对实战情况下,我选用的是基于白名单的方式,用的fodhelper.exe,360针对com接口监测的很严重,我目前没研究出来绕过的办法,但是针对fodhelper.exe,我通过注册表相对路径的方式就可以实现绕过检测了。
以上是基本马子运行的前置条件,下面我们开始正式的对抗av/edr。
av/edr对抗
针对av我们可以大胆的一些操作,但是针对edr,我们不得不考虑其遥测机制,我们知道edr核心在于内核回调+ETW订阅+文件滤波+传感。这些组件通过驱动注册在R0,用户态很难操作。
但用户态R3并非什么都做不了,经典的对抗可以是对API脱钩、可以是R3致盲。
那针对API脱钩,古法是syscall,现代更好的玩法是从磁盘中取一份感觉的ntdll.dll覆盖进程中调用的ntdll.dll的.text。但不幸的是,这种玩法,针对国内的主流edr,会被监测到,用来对抗av,还是有点用处的:
那致盲呢?我这里采用的是前端时间公布的qos策略限速。对edr的传感器限速在几十bit,那发生基本的事件就很难再上报到主控进行云端分析了。
具体可以参考这个项目:https://github.com/TwoSevenOneT/EDRChoker
真正对抗edr,我们需要r0的能力。如何到r0?那byvod就得闪亮登场了。
通过向驱动的设备进行ioctl,我们可以拿到某个功能的原语。那对于av/edr对抗来说,最好的是任意内核读写、其次是内核态任意进程终止。
如果有了任意内核读写的驱动,我们就可以对edr的回调数组进行置空,从而摘掉回调函数,致盲edr。
由于时间比较紧,我只找到了一家零信任的内核态任意进程kill的驱动,并且尚未被loldrivers收录,可以满足我的日常使用。
但是为什么,我架构图里要写分而治之呢?针对我目前的能力,通过lnk去对注册表进行操作加驱动的话,360会监测到。所以,我就选择针对不同的杀软,指定不同策略。
如果进程中存在ZhuDongFangYu.exe,我就不选择byovd,直接走上线的逻辑。
如果不存在,我就byovd,k掉进程快照中拿到的av/edr进程,然后走上线的逻辑。
C2上线
针对上线逻辑,这是我读了很多APT、银狐组织已经被公开的样本分析文章内化出来的。
在释放载荷后,落盘的是AES加密的载荷,密钥在远程的存储桶中并加密存储,黑dll通过访问存储桶拿到加密的密钥再通过自定义的解密算法得到明文密钥对载荷进行解密加载进内存。
由于我使用的C2是vshell,内存特征已经被各大杀软标记了,因此,在加载的时候,我尝试了在内存侧做对抗。
我第一时间想到的是sleep mask,但我发现对vshell这种go的beacon很难做sleepmask,很容易崩。(有的师傅通过定时器对指定地址去抹除PE头,确实也是一种办法。)
注意看火绒报警,基本是把关键的特征写死了,如果使用vshell自己的加载器去进内存的话,内存地址是固定的,这个火绒已经比标记了。这里火绒还结合了另一个方面,就是如果不是这个地址的话,那私有内存里存了一个PE文件,如果磁盘上没有对应文件的话,也是不合法的。
因此常用的“改权限,VirtualAlloc,进内存,改权限,执行”的方式,正好会命中火绒的HEUR:HackTool/Sliver.c一类“无文件背书的私有映像”启发式。
那我是怎么做的呢?
如果你研究过vshell的大马的话,你会发现,其加载器加载的最后是一个dll文件,那我们只需要写一段加载逻辑,加载这个dll就可以了。
我的做法是:
1、释放落地加密dll。
2、LoadLibaryExw加载dll,只映射+内核做重定位,跳过导入解析/TLS初始化/构造器。
3、原为解密节内容和我的加密侧脚本逻辑对齐。
4、手工解析IAT(很难,把dll给AI让其根据IAT去解析写出来标准代码复用即可)
5、C#加载Go写的dll需要补TLS槽位,同样让AI写这一块的代码。
6、调入口点,加载整个dll上线。
基于此,”私有内存+完整映像+地址特征“的启发式查杀就不会告警了。
权限维持
用的是白加黑调用COM接口做计划任务实现每29分钟执行一次上线逻辑,360、火绒都吃这一套。
这里需要补充一个命名互斥体,防止多个beacon打架,实现逻辑是:进程活着就是锁被持有,进程一死内核自动把互斥体标记成abandoned,下一个实例直接接管。解决一个beacon在线,下次计划任务再上线一次的问题。
九月给自己定的目标,交这份卷子,能得多少分呢?
正入万山围子里,一山放出一山拦。
多看、多学、多问,自会有“有志者、事竟成”来回答,那结局会是“苦心人、天不负”吗?
我想,会的。
- END -
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论