Implant上线分析
sliver的Implant存在两种工作模式,一种是beacon模式,这是一种异步处理模式,Implant收到指令之后,并不会立即执行,而是等待一段时候之后进行处理。另外一种是session立即处理模式。在https://github.com/BishopFox/sliver/blob/master/implant/sliver/sliver.go
的main函数中,分别存在beaconStartup
和sessionStartup
。beaconStartup
对应的是beacon模式,sessionStartup
对应的是session模式。
|
|
在sessionStartup
中会调用StartConnectionLoop
函数创建链接,sessionMainLoop
函数进行链接之后的命令处理。而beaconStartup
会调用StartBeaconLoop
和beaconMainLoop
。通过对比sessionMainLoop
和StartBeaconLoop
两个函数,从代码逻辑上,两者并没有什么区别,从功能来看,两者区别在于通讯协议的处理上。可以看到,在beacon模式下,如果使用mtls协议,调用的是位于https://github.com/BishopFox/sliver/blob/master/implant/sliver/transports/beacon.go
的mtlsbeacon
函数,如果是session协议,则会调用位于https://github.com/BishopFox/sliver/blob/master/implant/sliver/transports/session.go
的mtlsConnect
函数。
|
|
在session模式下,https://github.com/BishopFox/sliver/blob/master/implant/sliver/sliver.go
的sessionMainLoop
方法,整个流程很纯粹就是一个session模式,逻辑也很简单,首先进行链接,然后注册Sliver Implant,也就是将主机信息发送过去,然后获取一些Handle(处理器)。然后接收命令,根据命令的类型,传递给不同的Handle进行处理。
|
|
在beacon模式下,https://github.com/BishopFox/sliver/blob/master/implant/sliver/sliver.go
中的beaconMainLoop
,可以看到在进行链接,发送注册信息之后,Implant休息了一段时间,之后执行beaconMain
|
|
在https://github.com/BishopFox/sliver/blob/master/implant/sliver/sliver.go
的registerSliver的作用是收集信息发送给服务端进行Sliver注册。存在一个yara检测点
|
|
Implant功能分析
0x01 backdoor
sliver的backdoor功能的作用是将一个恶意的payload载荷远程注入到磁盘文件中。
|
|
在/sliver/client/command/backdoor/backdoor.go
文件中,客户端获取profilename
,和远程文件路径
等信息,然后发送RPC。
|
|
在sliver/server/rpc/rpc-backdoor.go
中,首先获取对应的Session,然后下载远程文件,根据Profile名获取Profile的ShellCode,然后传入bj.Binject
方法做进一步加工,通过Update将加工过的文件上传入远程主机。
|
|
在/sliver/vendor/github.com/Binject/binjection/bj/inject_pe.go
文件中从事ShellCode的写入工作,这一部分逻辑也很简单,可以参考部分PE加壳工具的原理,首先在文件末尾添加一个新段,在PE的节区表中添加新段的相关信息。并将入口点指向新段的虚拟地址。禁用ALSR和DEP。
|
|
0x02 dllhijack功能
dllhijack功能原理基于Dll侧加载技术,
|
|
最终调用位于https://github.com/BishopFox/sliver/blob/master/server/rpc/rpc-hijack.go
的HijackDLL
函数。如果存在reference DLL,则读取reference DLL数据。如果不存在,则下载目标Dll,并读取。然后读取Profile数据,最后调用cloneExports
方法。
|
|
在cloneExports
方法中。cloneExports
主要逻辑就是在目标dll中新增一个节区,重新制作导出表,实现侧加载。
|
|
0x03 ExecuteAssembly
ExecuteAssembly的作用是内存执行Donot文件。
在https://github.com/BishopFox/sliver/blob/v1.5.30/server/rpc/rpc-tasks.go
的ExecuteAssembly
是ExecuteAssembly
的Main函数,首先会调用位于https://github.com/BishopFox/sliver/blob/a8a36dd6e2c9796c51ab6983b5b615d19c6a6995/server/generate/donut.go
的DonutFromAssembly
函数填充一些诸如donutArch
, Method
配置文件,然后填充ShellCode。
|
|
ShellCode的生成逻辑是这样的,在https://github.com/BishopFox/sliver/blob/a8a36dd6e2c9796c51ab6983b5b615d19c6a6995/vendor/github.com/Binject/go-donut/donut/donut.go
Sandwich函数生成的ShellCode主要包含3部分:shellcode_loader
,donut_loader
,payload(C#Assembly)
。shellcode_loader负责引导eip执行donut_loader,需要跳转payload大小(SizeOf(payload))后执行donut_loader。
|
|
donut_loader是一段ShellCode,其代码位于https://github.com/TheWover/donut/blob/master/loader/loader.c原理如下:
- 1> 加载CLR环境
- 2> 获取程序域
- 3> 装载程序集
- 4> 执行程序集
|
|
0x04 getprivs
https://github.com/BishopFox/sliver/blob/a8a36dd6e2/implant/sliver/priv/priv_windows.go
的getprivs作用是根据进程句柄获取进程权限信息,主要分5步
- 1)通过
GetCurrentProcess
获取当前进程Handle。 - 2)通过
OpenProcessToken
打开当前进程Token句柄。 - 3)通过
GetTokenInformation
获取Token信息,包含LUID
,attributes
,完整性级别。
|
|
0x05 getststem
0x06 impersonate
用于模拟用户登录(token),可以利用模拟用户登录来获取SYSTEM
在https://github.com/BishopFox/sliver/blob/v1.5.30/implant/sliver/priv/priv_windows.go
的impersonate方法中,核心是调用ImpersonateLoggedOnUser进行模拟登录,主要分为4步。
- 1)首先通过
OpenProcess
,OpenProcessToken
获取进程Token句柄。 - 2)通过
ImpersonateLoggedOnUser
进行模拟登录。 - 3)通过
DuplicateTokenEx
复制令牌,其实只是为了返回一个Token句柄罢了。 - 4)分别启用当前进程的线程的”SeAssignPrimaryTokenPrivilege”, “SeIncreaseQuotaPrivilege”权限。
|
|
0x07 make-token
用已经泄露的用户信息进行登录形成一个新的token用于登录,在https://github.com/BishopFox/sliver/blob/v1.5.30/implant/sliver/priv/priv_windows.go
的MakeToken方法中,核心是调用.LogonUser
和ImpersonateLoggedOnUser
进行登陆。
|
|
0x08 psexec
利用psexec原理进行命令执行。代码位于https://github.com/BishopFox/sliver/blob/v1.5.30/client/command/exec/psexec.go
的PsExecCmd方法。首先会从Profile中读取Service的二进制数据,并上传到目标主机,然后,创建和开启服务即可。Service二进制文件肯定是和正常的Psexec功能差不多。利用管道和拉起的进程通讯。并将结果传入发送给C2。
|
|
0x09 runas
以token方式执行,在https://github.com/BishopFox/sliver/blob/v1.5.30/implant/sliver/handlers/handlers_windows.go
的runAsHandler
和https://github.com/BishopFox/sliver/blob/v1.5.30/implant/sliver/priv/priv_windows.go
的RunProcessAsUser函数中。
|
|
0x10 spawdll
本质就是通过CreateRemoteThread进行Dll注入。位于https://github.com/BishopFox/sliver/blob/v1.5.30/implant/sliver/handlers/handlers_windows.go
的spawnDllHandler方法。和https://github.com/BishopFox/sliver/blob/v1.5.30/implant/sliver/taskrunner/task_windows.go
的SpawnDll
方法。
|
|
0x11 procdump
procdump进行进程转储,本质利用MiniDumpWriteDump的回调方法进行进程转储。
|
|