首先先科普用户态内核态
两者的在指令上的区别
一般来说,ring0权限下开放的指令有:IO读写、网卡访问、申请内存、访问硬件资源。
一般来说,ring3权限下开放的指令有:普通的计算指令等
两者在空间权限的区别
用户态和内核态的栈(用来储存函数 或者 形参的地方)是不同的,分别是用户栈和内核栈。
用户态可以访问虚拟内存0-3G的空间,内核态访问0-4G的空间
如图所示 我们可以看到内核态,它可以通过驱动的方式,复写物理内存
下面来介绍这款Rootkit软件
R77 是一个 Ring 3 rootkit,它隐藏了所有内容:
-
文件、目录
-
进程和 CPU/GPU 使用情况
-
注册表项和值
-
服务业
-
TCP 和 UDP 连接
-
交汇点、命名管道、计划任务
按前缀隐藏
开头的一切都是隐藏的。"$77"
组态系统
动态配置系统允许按PID和名称隐藏进程,按完整路径隐藏文件系统项目,特定端口的TCP和UDP连接等。
该配置位于没有提升权限的任何进程中,并且可由任何进程写入。此密钥的 DACL 设置为向任何用户授予完全访问权限。HKEY_LOCAL_MACHINE\SOFTWARE\$77config
此外,密钥被 rootkit 隐藏。$77config
安装
r77 的部署只需要一个文件:.执行在系统上保留 r77 并注入所有正在运行的进程。Install.exe
Uninstall.exe
从系统中完全、优雅地移除 R77。
Install.shellcode
是安装程序的 shellcode 等效项。这样,安装可以集成而不会掉落。shellcode 可以简单地加载到内存中,强制转换为函数指针,然后执行:Install.exe
int main()
{
// 1. Load Install.shellcode from resources or from a BYTE[]
// Ideally, encrypt the file and decrypt it here to avoid scantime detection.
LPBYTE shellCode = ...
// 2. Make the shellcode RWX.
DWORD oldProtect;
VirtualProtect(shellCode, shellCodeSize, PAGE_EXECUTE_READWRITE, &oldProtect);
// 3. Cast the buffer to a function pointer and execute it.
((void(*)())shellCode)();
// This is the fileless equivalent to executing Install.exe.
return 0;
}
执行流程
rootkit 驻留在系统内存中,不会将任何文件写入磁盘。这是分多个阶段实现的。
此图显示了从安装程序的执行一直到每个进程中运行的 rootkit DLL 的每个阶段。该文档有一章详细介绍了每个阶段的实现。
AV/EDR 规避
目前正在使用几种 AV 和 EDR 规避技术:
-
AMSI旁路:PowerShell 内联脚本通过修补禁用 AMSI 以始终返回 。多态性用于逃避 AMSI 旁路的特征检测。
amsi.dll!AmsiScanBuffer
AMSI_RESULT_CLEAN
-
DLL 解钩:由于 EDR 解决方案通过挂钩来监控 API 调用,因此需要通过从磁盘加载新副本并恢复原始部分来删除这些挂钩。否则,将检测到工艺空心化。
ntdll.dll
ntdll.dll
测试环境
测试控制台是一个有用的工具,用于将 r77 注入到各个进程中并测试配置系统。
安装
install.exe是把r77注入到所有能注入的进程和启动系统rootkit的,所以安装完可以把程序删了,实现无文件启动
test console是测试r77的功能,比如注入r77或隐藏进程,但功能只有安装r77以后才能用
下载解压以后直接点击install.exe安装就行了
r77 Rootkit 1.5.2.zip (ZIP Password: bytecode77)
Technical Documentation
使用效果
文件隐藏
进程隐藏
服务隐藏