当前位置:   article > 正文

Windows IPC

windows ipc

文章目录

第一部分 IPC

1 什么是 IPC ?

​ IPC(Inter-Process Communication),含义为进程间通信或者跨进程通信,指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位(进程是分配资源最小的单位,而线程是调度的最小单位,线程共用进程资源)。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。

​ 任何一个操作系统都需要有相应的IPC机制,比如Windows上可以通过剪贴板、管道和邮槽等来进行进程间通信,而Linux上可以通过命名共享内容、信号量等来进行线程间通信。

​ 通常在渗透测试情况下,我们所说的 IPC 主要针对的是windows中的IPC

1.1 IPC 通信

​ 默认情况下,IPC是Windows中的一个默认共享资源,代表IPC服务。它通常用于管理目的,如远程管理计算机。默认情况下,IPC 共享被创建,但不允许匿名访问,这意味着只有具有适当凭据的用户才能使用 IPC$ 进行通信。

1.2 Windows 上常见的 IPC 机制有哪些?

  • 命名管道 (Named Pipes):允许进程通过一个命名的管道进行通信,这个管道就像一个文件系统对象
  • 邮件槽 (Mailslots):一种简单的单向通信机制,适用于无连接的通信
  • 共享内存 (Shared Memory):允许多个进程访问同一块内存区域
  • 远程过程调用 (RPC):一种网络通信协议,允许一个进程调用另一个进程的函数或方法,就像它们是本地的一样
  • 组件对象模型 (COM):一种允许软件组件进行通信的模型,可以在进程间或跨网络使用
  • Windows套接字 (Winsock):基于 TCP/IP 协议的网络通信接口
  • 剪贴板:一种简单的 IPC 形式,允许不同应用程序之间共享少量数据,如文本或图像

2 IPC 的主要作用有哪些?

  1. 数据交换:允许不同进程之间交换数据,即使这些进程由不同的用户运行或属于不同的可执行文件。
  2. 资源共享:进程可以通过 IPC 共享资源,如内存、文件或设备。
  3. 协调操作:进程可以使用 IPC 来协调它们的行为,同步它们的操作,或请求其他进程提供的服务。
  4. 网络通信:在网络环境中,IPC 可以跨越网络连接,使得远程计算机上的进程可以像在本地计算机上一样进行通信。
  5. 提高效率:通过允许进程间直接通信,IPC 减少了数据传输的开销,提高了系统的整体效率。

3 IPC 的利用

3.1 IPC 链接

3.1.1 建立 IPC 链接

net use \\[:host]\IPC$ [: password] /user:[: username]

3.1.2 删除 IPC 链接

net use \\[:host]\IPC$ /del

3.2 IPC 空会话登录

​ 适用于: Windows 7、Windows Server 2003、Windows Server 2008、Windows Server 2008 R2、Windows Vista、Windows XP

3.2.1 什么是 IPC$ 空链接

​ 空链接就是不用密码和用户名的IPC连接。空会话是在没有信任的情况下与服务器建立的会话(即未提供用户名与密码),但根据 WIN2000 的访问控制模型,空会话的建立同样需要提供一个令牌,但这并不表示空会话的令牌中不包含 安全标识符SID (它标识了用户和所属组),对于一个空会话, LSA 提供的令牌的 SID 是 S- 1-5-7 ,这就是空会话的 SID ,用户名是: ANONYMOUS LOGON (这个用户名是可以在用户列表中看到的,但是不能在 SAM 数据库中找到,属于系统内置的帐号)

3.2.2 关于 ANONYMOUS LOGON

​ ANONYMOUS LOGON是指一种网络访问类型,用户无需提供任何身份验证凭据(例如用户名或密码)即可登录系统或网络资源,在Windows中作为一个内置安全主体出现。它主要代表匿名登陆的用户,例如Guest用户。它的全名是:NT AUTHORITY\ANONYMOUS LOGON。

​ NT Authority 是各种预定义的、特殊用途的 Windows 帐户和组的名称,它们是操作系统功能的一部分,允许核心操作系统服务和功能发挥作用。它们促进资源访问并控制 Windows 系统内的安全边界。

​ 当您在权限或访问控制列表 (ACL) 上下文中看到“NT Authority”时,通常表示权限或特权被授予系统级实体而不是特定用户或组。例如,“NT Authority\SYSTEM”指的是本地系统帐户,该帐户对系统具有较高的权限。

​ 一些常见的 NT Authority 安全原则包括:

  1. NT Authority\SYSTEM:代表本地系统帐户,该帐户对系统具有完全控制权
  2. NT Authority\Authenticated Users:表示已通过域身份验证的所有用户
  3. NT Authority\Network Service:代表Network Service帐户,该帐户是一个具有低级权限的内置帐户
  4. NT Authority\Local Service:代表Local Service帐户,它是一个内置帐户,具有类似于Network Service的低级权限
3.2.3 如何建立 IPC$ 空链接

net use \\[: hostname] “” /user:“”

net use \\[: hostname] /user:“” “”

在这里插入图片描述

3.2.4 IPC$ 空链接可能会造成的危害
  • 枚举用户帐户
  • DOS 攻击
  • 暴力攻击
  • 未经身份验证访问共享
3.2.4.1 查看远程主机的共享资源

net view \\ip

​ 此命令不能显示默认共享(IPC 、 A d m i n 、Admin Admin、盘符共享)

在这里插入图片描述

3.2.4.2 查看远程主机的当前时间

net time \\ip

在这里插入图片描述

3.2.4.3 得到远程主机的 NetBIOS 用户名列表

nbtstat -A ip

在这里插入图片描述

3.3 IPC$ & SMB Protocol

​ 关于这章节的内容IPC横向、Hash传递等将会在后续章节、文章中慢慢为补充

3.3.1 查看文件列表

dir \\[: hostname]\path

在这里插入图片描述

3.3.2 上传文件

copy [: local_path] \\[: hostname]\[: remote_path]

在这里插入图片描述

3.3.3 下载文件

copy \\[: hostname]\[: remote_path] [: local_path]

在这里插入图片描述

3.3.4 查看文件内容

type \\[: hostname]\[: remote_file_path]

在这里插入图片描述

4 IPC共享、默认共享、普通共享

​ 在windows上除了上述的 IPC 共享,还有默认共享和普通共享,他们之间又有什么不一样的呢?

4.1 IPC共享(Inter-Process Communication)

  • IPC共享是一种特殊的共享,它不对应于文件系统中的任何实际文件夹或文件
  • 它用于进程间的通信,允许网络上的其他计算机访问特定的命名管道
  • IPC$共享在Windows中默认开启,用于支持远程管理工具,如远程桌面(RDP)和远程管理(如通过MMC控制台)

4.2 默认共享

  • 默认共享是Windows系统在安装时自动创建的共享,它们对应于系统上的一些特殊资源
  • 常见的默认共享包括:ADMIN$(表示系统管理员目录),C$D$等(分别对应于系统上的C盘、D盘等驱动器)
  • 默认共享通常只对管理员和系统账户可见,普通用户无法访问
  • 它们主要用于系统管理,如远程访问系统驱动器进行维护或恢复操作

4.3 普通共享

  • 普通共享是用户手动创建的共享,可以指向任何文件夹或打印机
  • 用户可以设置共享名,添加用户或用户组,并为它们分配权限,如读取、更改或完全控制
  • 普通共享是最常见的共享类型,用于在网络用户之间共享文档、图片、视频等文件
  • 普通共享可以通过“文件和打印机共享”向导在文件或文件夹的属性中设置

5 IPC连接日志查询

​ IPC连接在Windows系统中用于进程间通信,它涉及到文件和打印服务共享。在IPC连接过程中,Windows系统会记录一些安全事件日志,这些日志具有特定的事件ID,每个ID代表不同的操作或状态。以下是一些常见的与IPC连接相关的Windows日志事件ID及其含义:

  1. 事件ID 5140:尝试使用密码登录,但密码不正确。
  2. 事件ID 5142:尝试登录,但用户的账户已锁定。
  3. 事件ID 4624:成功登录尝试。
  4. 事件ID 4625:登录尝试失败。
  5. 事件ID 4648:使用显式凭据尝试登录。
  6. 事件ID 4649:检测到重放攻击,这可能与IPC连接有关。
  7. 事件ID 4656:请求了对象的句柄。
  8. 事件ID 4663:尝试对对象执行操作,可能与IPC连接时的文件或目录访问有关。
  9. 事件ID 4688:创建了一个新的进程。
  10. 事件ID 4689:一个进程已经退出。
  11. 事件ID 4672:分配给新登录的特权。
  12. 事件ID 5137:Windows 无法刷新应用程序控制策略,可能与IPC连接时的策略执行有关。
  13. 事件ID 5138:尝试刷新应用程序控制策略,但没有成功激活

在这里插入图片描述

第二部分 PsExec

1 什么是 PsExec

​ psexec 是一个命令行工具,它使用 Windows 的 SMB (Server Message Block) 协议来执行远程命令。SMB 协议主要用于文件共享和打印服务,但也提供了运行远程系统上的程序的能力。

​ 当您使用 PsExec 连接到远程计算机时,它首先会在远程计算机上创建一个名为 PSEXESVC 的服务。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2 PsExec 建立连接流程

  1. TCP三次握手,通过SMB会话进行身份验证。
  2. 连接admin 共享,通过 S M B 访问默认共享文件夹 A D M I N 共享,通过 SMB 访问默认共享文件夹 ADMIN 共享,通过SMB访问默认共享文件夹ADMIN,写入PSEXESVC.exe文件;
  3. 利用ipc命名管道调用svcctl服务
  4. 利用svcctl服务开启psexesvc服务
  5. 生成4个命名管道以供使用。一个psexesvc管道用于服务本身,另外的管道stdin(输入)、stdout(输出)、stderr(输出)用于重定向进程

​ (以下将会以数据包的方式生动形象的解释整个连接过程)

2.1 建立 TCP 连接

在这里插入图片描述

​ 首先会向目标主机发送TCP三次握手数据包尝试创建连接,如果目标主机拒绝连接或者不在线,则TCP连接失败,退出程序。

2.2 协商SMB协议通信版本

​ 接下来需要协商通信协议版本,PsExec 利用的协议主要是SMB协议。SMB(全称是Server MessageBlock)是一个协议名,可用于在计算机间共享文件、打印机、串口等,电脑上的网上邻居就是靠它实现的,SMB工作原理如下:攻击机向目标机器发送一个SMB negotiate protocol request请求数据包,并列出它所支持的所有SMB协议版本(其中Dialect带有一串16进制的code对应着SMB的不同版本以此分辨准确版本),若无可使用的版本返回0XFFFFH结束通信。

在这里插入图片描述

​ 目标机器返回NEGTIATE ResponseDialect数据包协商确定使用SMB2.1,至此SMB协商使用SMBv2协议通信过程结束。

在这里插入图片描述

2.3 NTLM 身份验证

​ 协商完 SMB 版本过后,就是NTLM身份认证开始,攻击机向目标机器发送SESSION_SETUP_ANDX协商请求,以完成攻击机与目标机器之间的身份验证,该请求包含用户名密码。

在这里插入图片描述

2.4 枚举共享网络资源名称及访问权限

​ 成功通过NTLM身份认证后,攻击机向目标机器发送Tree connect rerquest SMB数据包,并列出想访问网络资源的名称ipc 、 a d m i n 、admin admin,目标机器返回tree connect response响应数据包表示此次连接是否被接受或拒绝

在这里插入图片描述

在这里插入图片描述

2.5 向 admin$ 写入 PSEXESVC.exe 文件

​ 连接到相应资源后,通过 SMB 访问默认共享文件夹ADMIN$,写入PSEXESVC.exe文件。路径为 C:\windows\System32\PSEXESVC.exe

在这里插入图片描述

注意1:C:\windows\System32\PSEXESVC.exe 是微软官方工具默认设定的,一般情况下无法修改

在这里插入图片描述

​ close request and response 数据包表示PSEXESVC.exe文件完成写入。

在这里插入图片描述

2.6 创建系统服务

​ 接着查看openservicew request的数据包,发现攻击机开始远程调用svcctl协议并打开psexesvc服务(psexec必须调用svcctl协议,否则psexesvc服务无法启动)。

在这里插入图片描述

​ 在完成文件上传之后依次使用OpenSCManagerW、OpenServicceW、StartServiceW方法来创建启动服务。

在这里插入图片描述

2.6.1 SMB 协议中常见管道
  • \.\pipe:这是系统级管道的根目录,包含了许多系统服务和进程使用的命名管道。例如,.\pipe\lsass是Local Security Authority Subsystem Service(LSASS)使用的管道
  • .\pipe\lsass:用于与本地安全子系统(Local Security Authority SubsystemService,LSASS)通信,LSASS负责处理登录认证、密码策略等安全相关的功能,SMB流量中会经常看见和lsass协议服务通信的流量
  • .\pipe\winreg:用于与Windows注册表服务(Windows Registry Service)通信,允许应用程序访问和操作系统的注册表,SMB流量中会经常看见和lsass协议服务通信的流量
  • .\pipe\svcctl:用于与服务控制管理器(Service Control Manager)通信,允许应用程序创建、修改和管理系统服务,SMB流量中会经常看见和svcctl协议服务通信的流量用来远程启动应用和服务
  • .\pipe\browser:用于与计算机浏览器服务(Computer Browser Service)通信,负责在网络上发现和维护共享资源列,SMB流量中会经常看见和browser协议服务通信的流量
  • .\pipe\epmapper:用于与终结点映射器(Endpoint Mapper)通信,EPMapper服务负责映射RPC终结点标识符(RPC Endpoint Identifiers,EPI)到网络地址和端口号,SMB流量中会经常看见和epmapper协议服务通信的流量

2.7 数据流重定向

​ 后续创建了psexesvc、stdin、stdout、stderr 4个命名管道。用于对程序标准输入流、标准输出流、错误数据流进行重定向。

​ 管道创建成功后,psexec可以正常使用,已成功连上目标机器cmd。

在这里插入图片描述

2.8 心跳数据包

​ 在连接过程中,攻击机会每隔30s向目标机器发送一次TCP-keep-alive数据包,保持TCP心跳连接。

在这里插入图片描述

2.9 断开连接

​ 退出远程连接时,tcp四次挥手关闭连接,psexesvc、stdin、stdout、stderr4个管道也会关闭,会话结束。

在这里插入图片描述

3 PsExec 部分Assembly分析

在这里插入图片描述

3.1 NTLM 身份认证阶段

​ GetComputerNameW 函数来提取本地计算机的 NetBIOS 名称

在这里插入图片描述

​ LookupPrivilegeValue 函数检索指定系统上用于本地表示指定特权名称 (LUID) 本地唯一标识符

在这里插入图片描述

​ 如果能够IPC链接,那么就使用CreateRestrictedToken 创建一个新的访问令牌

在这里插入图片描述

​ 具体和远端身份校验的时候是在后面 使用 WNetAddConnection2W API 与远程计算机上的 IPC$ 共享建立连接 的时候,这里只是简单接解析一下用到的函数

3.2 PSEXESVC 文件上传阶段

​ 可执行文件通过调用 CreateEventW API 创建一个未命名的事件对象
在这里插入图片描述

​ 并使用SetConsoleCtrlHandler将一个新函数添加到当前进程的处理函数列表中
在这里插入图片描述

​ 显示一条中间消息,提供有关接下来将发生的操作的详细信息(这些消息在正常执行期间几乎看不见,以为每个阶段运行完后控制台数据流缓冲区都会被刷新)

在这里插入图片描述

​ 使用 WNetAddConnection2W API 与远程计算机上的 IPC$ 共享建立连接。

在这里插入图片描述
在这里插入图片描述

​ 使用 FindResourceW 函数调用来确定名为 PSEXESVC.EXE 资源路径,将资源加载到内存中,并通过调用以下函数检索指向内存中指定资源的指针:LoadResource、SizeofResource 和 LockResource

在这里插入图片描述

​ 使用 WNetAddConnection2W API 对远程计算机上的 admin$ 共享资源文件进行访问

在这里插入图片描述
在这里插入图片描述

​ 尝试写入远程计算机上的 系统文件共享路径写入 PSEXESVC.EXE (\\\\192.168.75.133\\ADMIN$\\PSEXESVC.EXE)

在这里插入图片描述
在这里插入图片描述

​ 清空原本控制台的连接信息

在这里插入图片描述

3.3 PSEXEV服务开启阶段

​ 清空控制台缓存内容,打印新的字符

在这里插入图片描述

​ 创建 PSEXESVC服务,通过调用 OpenSCManagerW 例程 (0xF003F = SC_MANAGER_ALL_ACCESS ) 建立与远程计算机上的服务控制管理器的连接

在这里插入图片描述

在这里插入图片描述

​ 并远程主机上的进程创建了一个名为“PSEXESVC”的新服务(0xF01FF = SERVICE_ALL_ACCESS、0x10 = SERVICE_WIN32_OWN_PROCESS、0x3 = SERVICE_DEMAND_START):

在这里插入图片描述

​ 自系统启动以来经过的毫秒数通过对 GetTickCount 的函数调用来提取
在这里插入图片描述

​ 使用 OpenServiceW 获取 PSEXESVC 系统服务句柄

在这里插入图片描述

​ 再使用 StartServiceW 启动 PSEXESVC服务

在这里插入图片描述

​ 并在远端通过调用 QueryServiceStatus 来查看 PSEXESVC 服务的当前状态

在这里插入图片描述

3.4 写入临时 .key 凭据文件

​ 会向远端admin$目录写入文件

在这里插入图片描述

在这里插入图片描述

​ 可以在目标机器上看到对应文件(%systemroot%\PSEXEC-WIN-***-.key)

在这里插入图片描述

​ 这个文件只能在 system 以上权限下才能查看

在这里插入图片描述

3.5 管道通信

​ PsExec.EXE 从远程计算机打开 \pipe\PSEXESVC 管道,并通过调用 SetNamedPipeHandleState API 来修改管道模式(0x2 = PIPE_READMODE_MESSAGE)

在这里插入图片描述

​ 根据文献[9]所述,出现了一部分间接调用用于程序方法初始化部分数据及方法,RtlInitUnicodeString函数用于初始化“\Device\LanmanRedirector<计算机名\IP地址>\ipc$”Unicode字符串,但是在新版(我当前测试版本v2.43)的程序中,已经修改成了使用call方法直接调用

在这里插入图片描述

​ PSEXEC.EXE 使用 NtOpenFile 打开 \\192.168.75.133\ipc$ 共享(0x100001 = FILE_READ_DATA | SYNCHRONIZE、0x1 = FILE_SHARE_READ、0x90 = FILE_SYNCHRONOUS_IO_ALERT | FILE_CREATE_TREE_CONNECTION)

在这里插入图片描述

​ PsExec 通过调用 NtFsControlFile 函数并使用特定的控制代码 0x1401a3 = FSCTL_NETWORK_GET_CONNECTION_INFO来获取连接信息

__kernel_entry NTSYSCALLAPI NTSTATUS NtFsControlFile(
  [in]            HANDLE           FileHandle,
  [in, optional]  HANDLE           Event,
  [in, optional]  PIO_APC_ROUTINE  ApcRoutine,
  [in, optional]  PVOID            ApcContext,
  [out]           PIO_STATUS_BLOCK IoStatusBlock,
  [in]            ULONG            FsControlCode,
  [in, optional]  PVOID            InputBuffer,
  [in]            ULONG            InputBufferLength,
  [out, optional] PVOID            OutputBuffer,
  [in]            ULONG            OutputBufferLength
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

​ 第二次调用 NtFsControlFile 发送另一个控制代码 0x1401AC = FSCTL_NETWORK_DELETE_CONNECTION

在这里插入图片描述

​ 而后又分别建立了 stdin、 stdout、 stderr 三个信道

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​ PsExec 等待 stdin 管道返回可供连接的实例,管道和其他对应于标准输出\错误的管道是由远程主机上启动的 PSEXESVC 进程创建的。

在这里插入图片描述

​ 使用 CreateFileW 打开上述命名管道

在这里插入图片描述

3.6 数据流加密

3.6.1 密钥生成

​ 用 GetVersion API 检索操作系统的主要版本号和次要版本号

在这里插入图片描述

​ 之后将会把之前生成的 .key 文件删除

在这里插入图片描述

​ 通过调用 CryptAcquireContextW (0x18 = PROV_RSA_AES ) 获取特定 CSP(加密服务提供商)内密钥容器的句柄

在这里插入图片描述

​ CryptCreateHash 用于创建哈希对象(0x8004 = CALG_SHA1)

​ AES256 密钥是使用 CryptDeriveKey (0x6610 = CALG_AES_256) ,这是一种从 SHA1 哈希算法派生而来

在这里插入图片描述

​ 创建名为 Global\PSEXESVC-<计算机名称\IP 地址>-<进程 ID> 的事件对象

在这里插入图片描述

3.6.2 通信加/解密

​ 数据缓冲区中使用AES256算法进行加密

在这里插入图片描述

在这里插入图片描述

​ 使用WriteFile API 用于从管道写入加密后数据

在这里插入图片描述
在这里插入图片描述

​ ReadFile API 用于从管道读取加密数据,再通过调用 CryptDecrypt 使用 AES 算法对缓冲区进行解密

在这里插入图片描述

​ 进程标识符是通过调用 GetCurrentProcessId 函数获得的

在这里插入图片描述

​ 并通过进程标识符创建名为“Global\PSEXESVC-<计算机名称\IP 地址>-<进程 ID>”的事件对象

在这里插入图片描述

3.7 数据通信

在这里插入图片描述

​ CreateThread API 用于创建两个线程,最终将执行 处理标准错误函数 和 处理标准输入函数(0x4 = CREATE_SUSPENDED)

在这里插入图片描述

​ 使用 DuplicateHandle (0x10000000 = GENERIC_ALL)复制线程句柄

在这里插入图片描述

​ 使用 SetConsoleTitleW 更改控制台窗口的标题,并使用WaitForMultipleObjects 函数,以挂起进程,直到上述线程完成并且上面创建的事件对象处于有信号状态

在这里插入图片描述

​ 使用 SetEvent 将事件对象设置为有信号状态

在这里插入图片描述

​ 第二次调用 WaitForMultipleObjects 会挂起进程,直到上述两个线程完成

3.7.1 处理标准输入

​ 线程通过调用 GetStdHandle 例程获取标准输入设备的句柄,调用 WaitForSingleObject 函数来检查事件对象是否处于有信号状态,如果有输入数据流传递过来,使用 ReadConsoleW 函数从控制台输入缓冲区挨个读取字符

在这里插入图片描述

​ 管道实例的服务器端使用 DisconnectNamedPipe 与进程断开连接

在这里插入图片描述

3.7.2 处理标准错误

​ 处理标准错误的逻辑与处理标准输入的差不多,就不展开了

3.7.3 处理标准输出

​ (这里我以处理 whoami 结果为例)

​ 使用 ReadFile API 用于从 stdin 管道读取加密数据

在这里插入图片描述

在这里插入图片描述

​ ReadFile API 用于从上述管道读取加密数据

在这里插入图片描述

​ 通过调用 CryptDecrypt 使用 AES 算法对缓冲区进行解密

在这里插入图片描述

​ MultiByteToWideChar 用于将字符串映射到 UTF-16(宽字符)字符串

在这里插入图片描述

在这里插入图片描述

​ 使用 GetStdHandle (0xFFFFFFF5 = STD_OUTPUT_HANDLE )检索标准输出设备的句柄

在这里插入图片描述

​ 上面解密的缓冲区通过调用 WriteFile 写入标准输出

在这里插入图片描述

在这里插入图片描述

3.8 服务关闭

​ 具体流程如下所示

在这里插入图片描述

3.8.1 删除 CSP 通信加/解密相关内存

​ 使用cryptReleaseContext在程序完成 CSP 的使用后调用此函数,释放的 CSP 句柄,令其不再有效

在这里插入图片描述

​ 继续调用cryptDestroyKey函数将 CSP 引用会话密钥,或已导入加密服务提供程序(CSP) 通过 CryptImportKey的公钥销毁密钥,并释放该密钥使用的内存

在这里插入图片描述

3.8.2 删除 PSEXESVC 服务

​ 删除PSEXESVC服务相关信息

在这里插入图片描述

3.8.3 删除 PSEXESVC.EXE 文件

​ DeleteFileW 用于删除之前创建的 PSEXESVC.exe 文件

在这里插入图片描述

3.8.4 删除 IPC 链接

​ WNetCancelConnection2W API 用于取消现有的网络连接(IPC$)

在这里插入图片描述

3.8.5 删除 .key 文件

​ 会尝试删除 .key 文件,因为 .key 文件会在管道正确建立后被删除,但是如果出现不可知情况的话,在退出程序后将会尝试删除这个文件

在这里插入图片描述

在这里插入图片描述

第三部分 连接过程可能出现的问题

1 [-] [Errno Connection error (192.168.70.210:445)] [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败

在这里插入图片描述

​ 在当前测试环境中,目标对象防火墙策略开启,流量被拦截

1.1 出现问题的原因

​ 因为是 Connection error 由于连接方在一段时间后没有正确答复或连接的主机没有反应 ,建立连接过程超时,在排除网络不稳定的可能性外,所以怀疑是流量不放通

1.2 解决方法

​ 所有的结局方案我都是尽量通过命令行完成,因为在渗透环境中获取到一个临时会话还是容易的

1.2.1 关闭防火墙

​ 关闭服务器防火墙后成功获取shell

在这里插入图片描述

​ (1.2.1.1 - 1.2.1.4 针对的是 windows version 7 及以上高版本windows)

1.2.1.1 域网络防火墙
1.2.1.1.1 关闭域网络防火墙
netsh advfirewall set domainprofile state off
  • 1
1.2.1.1.2 开启域网络防火墙
netsh advfirewall set domainprofile state on
  • 1
1.2.1.2 专用网络防火墙
1.2.1.2.1 关闭专用网络防火墙
netsh advfirewall set privateprofile state off
  • 1
1.2.1.2.2 开启专用网络防火墙
netsh advfirewall set privateprofile state on
  • 1
1.2.1.3 公用网络防火墙
1.2.1.3.1 关闭公用网络防火墙
netsh advfirewall set publicprofile state off
  • 1
1.2.1.3.2 开启公用网络防火墙
netsh advfirewall set publicprofile state on
  • 1
1.2.1.4 所有网络
1.2.1.4.1 关闭所有网络防火墙
netsh advfirewall set allprofiles state off
  • 1
1.2.1.4.2 打开所有网络防火墙
netsh advfirewall set allprofiles state on
  • 1

​ (1.2.1.5 针对较旧的Windows版本 – XP / Server 2003)

1.2.1.5 防火墙通信规则
1.2.1.5.1 禁用防火墙通信规则
netsh firewall set opmode mode=DISABLE
  • 1
1.2.1.5.2 启用防火墙通信规则
netsh firewall set opmode mode=ENABLE
  • 1
1.2.2 添加出站/入站规则

​ 直接关闭防火墙的话动静太大了,在可以的情况下我们应尝试缩小动作影响范围(通常设置规则需要管理员权限)

1.2.2.1 添加入站规则
1.2.2.1.1 允许特定端口的入站规则
netsh advfirewall firewall add rule name="规则名称" dir=in action=allow protocol=TCP localport=端口号
  • 1

​ 例如在这里我们建立入站规则 PsExec :尝试放通445端口,允许445端口流量入站

netsh advfirewall firewall add rule name="PsExec" dir=in action=allow protocol=TCP localport=445
  • 1

在这里插入图片描述

1.2.2.1.2 允许特定可执行文件的入站规则
netsh advfirewall firewall add rule name="规则名称" dir=in action=allow program="程序路径" enable=yes
  • 1
1.2.2.2 添加出站规则

​ 如果想添加的是出站规则,只需将 dir=in 改为 dir=out即可

1.2.2.2.1 允许特定端口的出站规则
netsh advfirewall firewall add rule name="规则名称" dir=out action=allow protocol=TCP localport=端口号
  • 1
1.2.2.2.2 允许特定可执行文件的出站规则
netsh advfirewall firewall add rule name="规则名称" dir=out action=allow program="程序路径" enable=yes
  • 1
1.2.2.3 查看所有防火墙规则
netsh advfirewall firewall show rule name=all
  • 1

2 [-] SMB SessionError: STATUS_ACCOUNT_RESTRICTION(Indicates a referenced user name and authentication information are valid, but some user account restriction has prevented successful authentication (such as time-of-day restrictions).)

在这里插入图片描述

​ 在当前测试环境中,这个建立链接的过程,我们可以看到,authentication认证过程出现了问题

2.1 出现问题的原因

​ 使用 gpedit.msc 打开组策略编辑器,我们在本地计算机 策略 -> 计算机配置 -> Windows 设置 -> 安全设置 -> 账号策略 -> 密码策略中可以看到其中有一项策略:

密码必须符合复杂性要求

这条策略迫使我们的用户密码需要一定的强度。

在这里插入图片描述

​ 但是可能在真实渗透环境中,本地主机用户中就存在空密码或者弱密码用户

2.2 解决方法

2.2.1 编辑策略文件
[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=1
[System Access]
PasswordComplexity = 0
MinimumPasswordLength = 0
PasswordHistorySize = 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

PasswordComplexity = 0 关闭密码复杂度

MinimumPasswordLength = 0 允许空密码

2.2.2 计算机导入修改后配置文件

secedit /configure /db %windir%\security\local.sdb /cfg [: 修改后的配置文件在远程主机的位置] /areas SECURITYPOLICY

2.2.3 刷新组策略:

gpupdate /force

在这里插入图片描述

3 [*] Requesting shares on 192.168.70.210…[-] share ‘ADMIN$’ is not writable.[-] share ‘C$’ is not writable.

在这里插入图片描述

​ 使用 impacket.py 进行横向时可以发现当前用户对 Admin$C$ 共享文件路径并没有写权限

在这里插入图片描述

​ 而如果直接使用 PsExec.exe 建立连接则会提示远端拒绝连接

3.1 出现问题的原因

  • 当前用户权限过低,对共享文件夹没有"写"权限
  • LocalAccountTokenFilterPolicy 限制

3.2 解决方法

3.2.1 提升当前账号的权限

​ 共享文件夹仅对部分组成员进行写权限的开放,当前用户权限过低,无法向目标文件夹写入文件。

3.2.1.1 查看当前主机共享文件
net share
  • 1

在这里插入图片描述

3.2.1.2 查看共享文件夹 ACL 权限访问矩阵

icacls “文件路径”

在这里插入图片描述

3.2.1.3 提升当前用户权限

​ 在上述 ACL 矩阵中可以看到本地管理员权限对默认共享文件有 Full 权限(Read权限和 Write 权限),查看本地管理员组用户

net localgroup administrators

发现本地计算机管理员组用户里不存在我们的Mike(测试账号)用户

在这里插入图片描述

​ 尝试将 Mike 加入管理员组,成功 PsExec 获取 shell

在这里插入图片描述

在这里插入图片描述

3.2.2 突破 LocalAccountTokenFilterPolicy

​ 关于什么是 LocalAccountTokenFilterPolicy 将会在下一个部分展开讲解,这里我们只简略说明

3.2.2.2.1 修改 LocalAccountTokenFilterPolicy 表项
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy
  • 1

在这里插入图片描述

​ 可以看到这里的表项数值为0,有些计算机上可能也不存在这条表项,使用下面的语句修改/添加该表项

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t reg_dword /d 1 /f
  • 1

在这里插入图片描述

4 Make sure that the default admin$ share is enabled on 192.168.70.210.

4.1 出现问题的原因

  • 默认共享文件 admin$ 被关闭
  • 默认共享服务 lanmanServer 被关闭

4.2 解决方法

4.2.1 开启 lanmanServer 服务
net start LanmanServer
  • 1

在这里插入图片描述

4.2.2 打开默认共享文件夹

net share

在这里插入图片描述

​ 可以看到当前主机并不开放默认共享的文件夹,这是我们可以手动尝试开启

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v AutoShareServer /t reg_dword /d 1 /f
  • 1

在这里插入图片描述

注意1:部分表项属于系统预定义表项,可以不再注册表中显示

在这里插入图片描述

注意2: 修改完服务相关配置后,需要重启服务或者重启计算机才能够使得配置生效

在这里插入图片描述

5 因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的 SMB1 协议,而此协议是不安全的,可能会使你的系统遭受攻击

​ 在尝试建立 IPC 通信时发生错误

发生系统错误 384。

因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的 SMB1 协议,而此协议是不安全的,可能会使你的系统遭受攻击 。
你的系统需要 SMB2 或更高版本。有关如何解决此问题的信息,请参见: https://go.microsoft.com/fwlink/?linkid=852747

在这里插入图片描述

5.1 出现问题的原因

​ 微软已经宣布 SMB1 将不再被支持,并且在未来的 Windows 版本中可能会被完全移除

5.2 解决方法

5.2.1 检查 SMB1 服务是否安装
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
  • 1

在这里插入图片描述

5.2.2 开启 SMB1 服务

​ 如果 SMB1 已经安装,但是禁用状态,可以使用以下命令启用(但是会重启客户端系统)

Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
  • 1

在这里插入图片描述

参考文献

[1] https://blog.csdn.net/no1xium/article/details/107358939

[2] https://learn.microsoft.com/zh-cn/sysinternals/downloads/psexec

[3] https://blog.csdn.net/weixin_41101173/article/details/79868887

[4] https://upimg.baike.so.com/doc/3974871-27398037.html

[5] https://blog.csdn.net/qq_45521281/article/details/105820827

[6] https://www.calcomsoftware.com/nt-authority-anonymous-logon/

[7] https://mp.weixin.qq.com/s/BZPc8J2_2_SjwX0nepkXLQ

[8] https://blog.csdn.net/javajiawei/article/details/138700056

[9] https://cybergeeks.tech/reverse-engineering-psexec-for-fun-and-knowledge/

[10] https://learn.microsoft.com/zh-cn/windows/win32/api/@[toc]

关注我们,咱们在安全的路上,扬帆起航
  • 1

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/935916
推荐阅读
相关标签
  

闽ICP备14008679号