代码注入技术Process Doppelgänging利用介绍
0x00 前言
在最近的BlackHat Europe 2017,Tal Liberman和Eugene Kogan介绍了一种新的代码注入技术——Process Doppelgänging
据说这种利用方式支持所有Windows系统,能够绕过绝大多数安全产品的检测。于是,本文将要根据开源代码,编写程序,实现Process Doppelgänging,测试功能,分析利用思路
参考地址:
https://www.blackhat.com/docs/eu-17/materials/eu-17-Liberman-Lost-In-Transaction-Process-Doppelganging.pdf
0x01 简介
本文将要介绍以下内容:
·原理
·开源代码
·修复方法
·实际测试
·利用思路
·防御检测
0x02 Process Doppelgänging原理
原理上类似于Process Hollowing,但是更加高级:
·不需要使用傀儡进程
·不需要特殊的内存操作,例如SuspendProcess和NtUnmapViewOfSection
注:
关于Process Hollowing的介绍,可参考之前的文章《傀儡进程的实现与检测》
实现思路:
1.打开一个正常文件,创建transaction
关于NTFS transaction,可参考:
2.在这个transaction内填入payload,payload作为进程被启动
目前为止,杀毒软件无法对填入的payload进行扫描
3.回滚transaction
相当于还原transaction,清理痕迹
对应程序实现过程:
1.创建transaction
关键函数:
·NtCreateTransaction
2.在这个transaction内填入payload
关键函数:
·CreateFileTransacted
·NtCreateSection
3.payload作为进程被启动
关键函数:
·NtCreateProcessEx
·NtCreateThreadEx
4.回滚transaction
关键函数:
·NtRollbackTransaction
当然,还涉及到payload的写入,申请内存、PE文件结构等,这里暂不介绍,可直接参考POC源码
对于Native API的使用,可参考之前的文章《渗透技巧——”隐藏”注册表的创建》和《渗透技巧——”隐藏”注册表的更多测试》
注:
Win10 RS3前的Win10系统,使用该方法会蓝屏,原因在于NtCreateProcessEx函数传入的空指针,细节可参考:
https://bugs.chromium.org/p/project-zero/issues/detail?id=852
0x03 开源POC
目前, 已公开的POC有两个
1、processrefund
地址:
https://github.com/Spajed/processrefund
目前仅支持64位Windows系统
编译工具:VS2015,安装sdk
实际测试:
Win7 x64
测试如下图
注:
如果选择system32下的calc.exe,会提示权限不够
启动进程calc.exe,但实际上执行MalExe.exe,弹出对话框
进程calc.exe的图标和描述都是正常的calc.exe,数字签名也正常,如下图
2、hfiref0x的POC
https://gist.github.com/hfiref0x/a9911a0b70b473281c9da5daea9a177f
仅有一个c文件,缺少头文件ntos.h
可供参考的位置:
https://github.com/hfiref0x/UACME/blob/master/Source/Shared/ntos.h
但是还需要作二次修改
为了更加了解细节,决定不使用ntdll.lib文件(安装DDK后包含),改为通过ntdll获得Native API(当然,代码量也会增加)
以自己的方式重写一个ntos.h,并对原POC的inject.c作修改
开源地址如下:
https://github.com/3gstudent/Inject-dll-by-Process-Doppelganging
编译工具:VS2012
支持32位Windows系统
实际测试:
Win7 x86
测试如下图
注:
如果选择system32下的calc.exe,会提示权限不够
综上,我们可以看到,Process Doppelgänging在利用效果上和Process Hollowing类似:启动一个正常进程(正常的图标、签名、描述),在这个进程中执行payload
Process Doppelgänging在利用上的一个缺点: 需要替换文件,所以在替换system32下的文件时,会提示权限不够(管理员权限无法修改该路径下的文件)
0x04 利用思路
在上节我们测试了两个POC,对Process Doppelgänging有了一些认识
而在实际利用中,需要对POC作进一步修改,利用思路如下:
将读取payload的功能去掉,改为使用Buffer存储(可进行压缩编码减小长度)
执行时读取Buffer,解密执行
这样能进一步隐藏payload,实现payload的”无文件”(payload保存在exp中,不需要写入硬盘)
0x05 检测
Process Doppelgänging并不是能绕过所有的杀毒软件,几个关键函数的调用还是会被拦截(例如NtCreateThreadEx),并且进程的内存同PE文件存在差异
0x06 小结
本文介绍了Process Doppelgänging的原理,根据开源代码,编写程序,实现Windows x86和x64系统下的利用,测试功能,分析利用思路,介绍检测方法
- linux学习第四十二篇:PHP扩展模块安装
- linux学习第四十五篇:Nginx访问日志,Nginx日志切割,静态文件不记录日志和过期时间
- 合格的配置中心应有的素养No.76
- linux学习第四十六篇:Nginx防盗链,Nginx访问控制,Nginx解析php相关配置,Nginx代理
- linux学习第四十七篇:Nginx负载均衡,ssl原理,生产ssl密钥对,Nginx配置ssl
- linux学习第四十八篇:php-fpm的pool,php-fpm慢执行日志,定义open_basedir,php-fpm进程管理
- linux学习第五十一篇:NFS介绍,NFS服务端安装配置,NFS配置选项
- linux学习第五十二篇: exportfs命令,NFS客户端问题,FTP介绍,使用vsftpd搭建ftp服务
- linux学习第五十四篇:Tomcat介绍,安装jdk,安装Tomcat
- linux学习第五十九篇:LVS DR模式搭建,keepalived lvs
- linux学习第五十四篇:配置Tomcat监听80端口,配置Tomcat的虚拟主机,Tomcat日志
- linux学习第五十六篇:集群介绍,keepalived介绍,用keepalived配置高可用集群
- linux学习第五十八篇: 负载均衡集群介绍,LVS介绍,LVS的调度算法,LVS NAT模式搭建
- Python中eval带来的潜在风险,你知道吗?
- 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 数组属性和方法