最近客户应急需求有点多,于是就给刚学应急三天半的练习生甩了个练手的机会,屁颠屁颠去排查了~
-----------------2000 YEARS LATER --------------
老师傅:“什么进程?”
基础概念介绍
服务
svchost.exe
这里也需要注意下不同版本的系统 svchost.exe 进程的数量也是有区别的:
-
Win 2000:最少有 2 个,一个是 RPCSS(Remote Procedure Call)服务进程,另外一个是由很多服务共享的 svchost.exe;
-
Win XP:最少 4 个,分别启动四个服务组;
-
Win 10:多个 svchost.exe 进程。
svchost.exe 的启动机制
与 svchost.exe 相关的注册表主要有两个:一个记录服务组的包含关系,另一个记录具体服务的细节信息。
# 服务组
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvcHost
# 服务
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetService
svchost 注册表项对服务进行分组管理,只要是需要 svchost.exe 去启动的服务,都要放在这里。
系统启动后 svchost.exe 首先根据这里的键值来管理 DLL 的加载,这里的每一个键值同时也对应着一个 svchost.exe 进程,也就是同组服务共用一个 svchost.exe 进程。(注意这里的服务组不会一次性全部加载,而是根据需要加载)。
当加载组中具体的某个服务时,svchost.exe 则会根据 Service注册表项中对应的服务项读取服务的详细信息。
注意:在启动一个 svchost.exe 负责的服务时,服务管理器如果遇到可执行程序内容 ImagePath 已经存在于服务管理器的映象库中,就不在启动第2个 svchost.exe 进程,而是直接启动服务。这样就实现了多个服务共享一个 svchost 进程。
svchost.exe 参数
-k // 指定服务组,在指定注册表中寻找该服务组,并加载该组中引用的每个服务
-s // 指定服务,从指定的服务组中启动该服务
-p // Windows10 新增的 ACG(任意代码防护)安全机制,强制执行以下策略来保护进程:
// BinarySignaturePolicy:签名校验策略,阻止未(经过微软)签名的模块加载
// DynamicCodePolicy:进程动态代码策略,阻止进程生成动态代码或修改现有的可执行代码
// ExtensionPointDisablePolicy:扩展点禁用策略,阻止使用某些内置的第三方扩展点
各阶选手如何利用 svchost
黑客视角:能把自己伪装成系统进程,还能伴随着系统启动而自动运行,还不容易被发现,发现了也轻易不敢把我怎么滴,这不就是我想要的么~~~
1.青铜选手
假装自己就是 svchost
这类手法比较低级,很容易被分析人员识破,算是上古时期的利用手法了,现在偶尔也能碰到。主要通过名称或者路径混淆来伪装自己:一种是将与 “svchost.exe” 相似名称的木马文件放置在系统路径下;另一种是在其他系统路径下放置恶意的 “svchost.exe” 文件。
务必要牢记 svchost.exe 在系统磁盘上的两个路径,如果出现在其他地方就要注意了。
set 命令查看 环境变量 %systemroot% 为系统根目录,一般为 “C:Windows”,可以通过
systemroot%System32svchost.exe
systemroot%Syswow64svchost.exe(32位)
svch0st.exe
svchsot.exe
scvhost.exe
scvh0st.exe
svhost.exe
svchosl.exe
...
C:SysDayN6svchost.exe
C:Syswm1isvchost.exe
C:SysAd5Dsvchost.exe
C:SysWsj7svchost.exe
C:windowssystem32winssvchost.exe
...
我们了解了服务和 svchost.exe 的原理,那怎么去创建一个 svchost.exe 启动服务也就简单了,这也是很多木马作者常用的一种权限维持手段:创建自启动服务。
-
在 Service 注册表项中注册服务的基本信息,如:Description、Displayname、ImagePath、Type、Start 等,以及设置 Servicedll 项指定后门 DLL 文件的位置; -
在 svchost 注册表项中将要启动的后门服务放置到现有服务组中或者新建一个服务组; -
编写实现恶意功能的 dll 文件,封装服务所需的 ServiceMain 导出函数; -
将上述过程封装在一个 .exe 的可执行文件中,即完成了一个通过服务驻留的木马。
-
在现有的服务组中加入后门服务; -
替换系统中已有服务的 DLL 文件; -
利用已经在系统中,但没有被安装使用的服务,修改其 DLL 指向与启动方式; -
寻找对系统影响较小的服务,篡改其 DLL 指向。
3.钻石选手
-
dll 劫持:程序在启动时主动加载事先放置好的恶意 dll(圈里常说的“白+黑”技术其实就是 dll 劫持技术,让一个正常的应用程序在启动过程中加载事先放置的恶意 dll)。 -
dll 注入:将一个恶意 dll 放进正在运行的进程的内存空间中,让这个 dll 成为他的一部分,创建定时的线程被动运行 dll 。
4.星耀选手
针对 DLL 劫持/注入和傀儡进程的技术细节本文不做深入探讨,后续会针对性发表相关技术文章。
5.王者选手
杂么揪出 svchost 背后的恶人
1、定位进程
-
netstat:通过查看已经建立连接的 TCP 会话定位 -
火绒剑:通过监控进程网络动作定位 -
ProcessMonitor:通过捕获网络日志定位 -
DNSQuerySniffer:通过捕获 DNS 请求源端口,结合 Monitor 定位 -
主动修改恶意域名指向,通过捕获网络连接定位 -
...
2、火眼金睛
对付一些仿冒 svchost.exe 的恶意程序,我们可以通过 tasklist 命令来查看每个 svchost.exe 启动的服务,如果某个 svchost.exe 对应的服务显示“暂缺”,就说明该进程所提供服务对应的 dll 存在缺失,这种情况说明该进程大概率就不是给我们系统提供服务的进程,只需根据 PID 对应具体的进程信息,查看可执行文件路径,然后通过沙箱等方式判断是否为恶意程序。
tasklist /svc | findstr "svchost"
-
非系统路径下的 svchost.exe 文件
-
父进程非 services.exe 的 svchost.exe 进程
-
形似 svchost.exe 的进程
-
没有签名的进程文件
-
描述、公司等信息为空的进程文件
-
启动时间与其他大部分 svchost.exe 滞后的进程文件
-
...
3、服务分析
-
服务名称为不可读的随机字符串 -
没有描述信息的服务 -
注册表修改时间与其他大部分服务滞后的服务 -
启动文件不在系统目录下的服务(如:Temp、Desktop等目录) -
没有数字签名的服务(Power Tool 等工具可以直接过滤非微软服并校验签名) -
通过火绒剑等工具查看服务的导入模块,是否存在没有描述信息或签名的 dll 文件 -
查看 svchosts 注册表项,是否存在未知的服务组,或已有服务组中是否存在可疑的服务 -
查看 services 注册表项,是否存在随机命名的服务 -
........
通过 Power Tool 发现无签名、无描述信息、启动目录可疑的 Metasploit 后门服务
4、进程分析
针对 dll 注入这类攻击手法,我们要了解 dll 注入的本质:在目标进程中增加一个线程,通过 LoadLlibrary 等方式来载入目标 dll。所以,我们可以着重从可疑进程的线程入手,查看是否存在没有描述及模块信息的可疑的线程。
5、内存分析
最后
特别鸣谢微步应急扛把子“乔峰扛着音响来了”对笔者的技术指导,本篇文章旨在带大部分入门应急响应的小伙伴了解 svchost.exe 进程及背后的机制,以及在应急响应实战中如何分析的一些小技巧,希望能对大家带来帮助。
在真实的应急场景中,我们不能将眼光只局限于 svchost.exe 这个进程,面对其他进程的 dll 注入、dll 劫持、白加黑等利用手法,我们同样可以使用这些技巧进行分析,后续我们会根据真实的病毒样本或应急案例带大家进行实际的分析运用,敬请期待~~~
注:部分图片来自网络,如有侵权,联系删除。
- END -
微步情报局招聘通道
❖
沙箱安全开发(Linux方向) 戳我查看岗位详情
❖
高级应急响应工程师 戳我查看岗位详情
❖
高级渗透测试工程师 戳我查看岗位详情
点击下方名片,关注我们
第一时间为您推送最新威胁
原文始发于微信公众号(微步在线研究响应中心):一文读懂svchost:被黑客“玩坏”的神秘进程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论