CreateRemoteThread盲注提权原理分析
时间:2021-07-26
本文章向大家介绍CreateRemoteThread盲注提权原理分析,主要包括CreateRemoteThread盲注提权原理分析使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
首先我们来看下进程程注入的核心逻辑(不考虑寻找目标进程、不考虑注入内容的执行)
/*
注入恶意Payload:
OpenProcess 可以打开目标进程
VirtualAllocEx 在目标进程中分配一块内存区域
WriteProcessMemory 在刚刚分配的内存区域中写入恶意的Payload
以上3个函数可以实现Payload的注入
*/
举一个具体的反射性DLL的例子
/*
#1 使用RWX权限打开目标进程(OpenProcess),并为该DLL分配足够大的内存(VirtualAllocEx)。
#2 将DLL复制到分配的内存空间(WriteProcessMemory)。
#3 计算DLL中用于执行反射加载的导出的内存偏移量(GetReflectiveLoaderOffset)。
#4 调用CreateRemoteThread(或类似的未公开的API函数RtlCreateUserThread)在远程进程中开始执行,使用反射加载函数的偏移地址作为入口点。
#5 反射加载函数使用适当的CPU寄存器查找目标进程的进程环境块(PEB),并使用它查找内存中的地址kernel32.dll以及任何其他所需的库。
#6 解析的KERNEL32出口目录中找到所需的API功能,如内存地址LoadLibraryA,GetProcAddress和VirtualAlloc。
#7 使用这些函数,然后正确加载DLL(本身)到内存中,并调用它的入口点,DllMain。
*/
总结:我们可以看到此类注入基本需要WriteProcessMemory函数的,也就是说必须有目标进程内存读写权限,当我们没有进程内存读写权限的时候这个思路就行不通了,那我们该怎么呢?
CreateRemoteThread盲注来解决以上问题
我们可以不具备目标进程的读写权限,但是我们至少需要具备以下三种权限
/*
(1) PROCESS_CREATE_THREAD
(2) PROCESS_CREATE_PROESS
(3) PROCESS_QUERY_LIMITED_INFORMATION
*/
因为经典的VirtualAllocEx、WriteProcessMemory、CreateRemoteThread的步骤不再适用(我们没有读写权限),我们就必须找到合适的新方法来运行我们的盲注的Code,最简单的方法就是
system("path_to_script");
因此,我们得找到两个东西,我们需要用到这两个东西去生成一个线程,尽管现在有ASLR,但是还是有很大的接近100%的概率在2个不同的用户会话进程中得到同样的系统调用地址。
/*
#1 Windows中我们拥有权限的一个指向某个位置的路径字符串
#2 我们的系统调用(例如,msvcrt.dll的_wsystem函数是一个好选择)
*/
定位调用和字符串
- 定为调用
void *StartAddress = (void *)GetProcAddress(LoadLibrary("msvcrt.dll"),"_wsystem");
- 定位字符串
通常的可用字符串有下列:
/*
C:\Users\Default
%temp%
%appdata%
...
*/
strings -eb shell32.dll | grep -P "^(\\\\[a-zA-Z0-9]{3,20}){2}^"
- 整一个bat文件做个做_wsystem的payload即可
net user /add adminuser adminpassword
net localgroup administrators adminuser /add
博主简介:博主国内安全行业目前最强大的网络安全公司做技术研究员,常年做技术工作。 获得过以下全国竞赛大奖: 《中国电子作品大赛一等奖》 《云计算技术大赛一等奖》 《AIIA人工智能大赛优胜奖》《网络安全知识竞赛一等奖》 《高新技术个人突出贡献奖》,并参与《虚拟化技术-**保密**》一书编写,现已出版。还拥有多项专利,多项软件著作权! 且学习状态上进,立志做技术牛逼的人。座右铭:在路上,永远年轻,永远热泪盈眶。可邮件联系博主共同进步,个人邮箱:pigeon_code@163.com
原文地址:https://www.cnblogs.com/mutudou/p/15060677.html
- Docker的核心概念,镜像操作
- RabbitMQ的基本使用到高级特性
- RabbitMQ的应用场景以及基本原理介绍
- JournalNode的edits目录没有格式化异常分析
- 聊一聊Javasript继承
- Git基础命令使用(个人总结)
- Centos搭建Docker环境
- Consul Config 使用Git做版本控制的实现
- 让XP支持4G内存
- Consul微服务的配置中心体验篇
- 如何使用Sentry实现Hive/Impala的数据脱敏
- 如何使用Oozie API接口向Kerberos环境的CDH集群提交Shell作业
- Docker下redis的主从、持久化配置
- vuejs、eggjs、mqtt全栈式开发设备管理系统
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- css的border-radius注意点
- js的join split startsWith endsWith
- 详解length charAt indexOf lastIndexOf includes concat slice substring substr详解
- sort实现
- border-radius
- USACO Training Section 1.1黑色星期五Friday the Thirteenth
- background-clip默认从border开始的哈
- background-origin默认从padding-box开始的哈
- USACO Training Section 1.1 坏掉的项链Broken Necklace
- 简易通讯录类实现原理
- 盒子模型box-sizing属性的用法
- JeecgBoot配置及前后端分离HelloWorld项目
- POJ 3122 Pie
- POJ 2456 Aggressive cows
- css内容 元素 元素空间的练习