2020.06.01-2020.08.30
文献整理——漏洞利用
一周后主动与夏老师交流,对当前的研究方向的困惑,以及存在的问题,是否修改当前的研究方向。唉,感觉,过去的半年,从来没有把这种研究放在心上,导致自己现在已经落后太多了,可能关键就在与研究方向的确定。
其实想跟夏老师说明,自己并不想做漏洞利用,漏洞信息挖掘?数据采集?方面的还可以。群体智能与态势感知。对方向的迷惑才是最难的。
基于群体智能的漏洞挖掘技术,能否成为一个很好的切入点呢?
读懂论文—–技术实现—–补充基础知识
1 Linux 内核漏洞利用生成关键技术研究
关键名词(不太理解的基础知识)
- SMAP超级用户模式访问保护
- 栈迁移
- 汇编指令mov、pop、let
- 程序编译执行的内存空间:bss、data、code、heap、stack
- nmap、nessus。网络扫描工具和评估系统漏洞的工具
- gcc编译器、gdb调试器以及nasm汇编器
- 栈金丝雀
- 模糊测试
- 符号执行
- 模型检测
- 污点分析
背景
漏洞 (vulnerability)是可以用来违反系统安全策略的缺陷或错误。
产生的原因:C/C++ 缺乏安全性检查->越界指针、悬空指针->内存破坏漏洞
常见的漏洞类型:栈缓冲区溢出 (stackbufferoverflow)、类型混淆 (typeconfusion)、内存释放后使用 (use-after-free)、空指针引用(nullpointerdereference)、使用未初始化变量(use-before-initialization)、内存信息泄露(information disclosure) 等类型。
分类:用户态程序漏洞利用、操作系统内核漏洞利用
作用:内核漏洞安全风险评估;提升系统安全防御能力;完善漏洞利用的理论研究。
内核漏洞利用生成技术
奇异状态机:内存安全违例操作-> 正常执行状态->异常状态。
内核漏洞利用定义:在基于奇异状态 机的漏洞利用模型下,漏洞利用就是在异常状态空间中,寻找一条路径以实现特 定计算目标的过程。
内核漏洞利用的过程:
- 构造内核漏洞触发验证程序。创建可执行程序,发起一系列系统调用并触发目标程序——Linux 内核中的漏洞
- 寻找漏洞利用原语。常见的漏洞利用原语种类包括控制流劫持、内存非法写和信息泄露等漏洞利用原语。触发内核漏洞后执行的程序。漏洞利用原语用于描述漏洞利用所需 的关键程序状态转换,因此漏洞利用原语有时也被简称为“可利用”(exploitable) 程序状态。从漏洞触发状态到漏洞可利用状态。
- 根据漏洞利用原语,生成漏洞利用。漏洞利用原语+漏洞触发的上下文(防御机制等)生成具体的漏洞利用方法。
面临的挑战:
- 缺乏内核漏洞利用生成所需的 “原料”— 漏洞利用原语。
- 缺乏漏洞利用原语进行“加工”的技术—即根据漏洞利用原语生成实际可用内核漏洞利用的技术(利用原语评估)。
现有内核漏洞利用的局限性
- 缺乏灵活变化漏洞触发上下文的能力
- 缺乏内核漏洞利用原语高效评估方法
- 突破绕过主流内核利用缓解机制的不足。
本文主要工作

- 基于模糊测试的内核UAF漏洞触发方式多样化。
- 基于内核部分符号执行的利用原语发现与评估技术。将控制流劫持、内存非法写和内存泄露等利用原语定义为符号 执行需探索的特殊程序状态;
- 内核控制流劫持原语评估与缓解绕过技术。绕过主流Linux内核利用缓解机制能力不足、构建利用链 困难以及利用路径陷阱导致的内核崩溃等问题
研究现状
漏洞挖掘技术
- 静态漏洞挖掘技术
- 符号执行
- 模糊测试
- 内核模糊测试
- 多程序分析技术的融合(动静结合?)
常见内存破坏漏洞
- 堆栈溢出漏洞
- 释放重用漏洞
- 类型混淆漏洞
常见漏洞利用原语
- 控制流劫持。可以分为代码注入攻击和代码重用攻击。
- 数据写入
- 信息泄露
常见控制流劫持防御机制
- 控制流完整性检查
- 数据流完整性检查(地址空间随机化也是为了保护数据流完整性)
操作系统内核漏洞
- rootkit,通过内核补丁获得内核权限。
- bootkit,修改引导扇区。
- 内存破坏漏洞
自动化生成技术
- SEMFuZZ
基于模糊测试的内核UAF漏洞触发多样化
- 悬空指针出现与解引用之间形成时间窗口
- 进行堆喷
- 修改漏洞触发验证程序
3.2 给出了UAF漏洞触发验证程序的原理,3.2.1给出了一个UAF漏洞实例程序。3.2.2指出了UAF漏洞过程中存在的问题和解决的办法。
UAF漏洞触发路径
- op1 申请一个对象
- op2 指针指向对象
- op3 悬空指针生成
- op4 对悬空指针解引用
- op5 其他对悬空指针解引用
相关定义:
- UAF漏洞触发上下文,op1~op4的四元组
- UAF漏洞触发的中间点,op3和op4之间的过渡期。
相关现象: - 内核对象有多重访问方式
- op4带来内核崩溃
- op4之后悬空指针消失
第四章: 基于内核部分符号执行的利用原语与评估技术
- 内存破坏检测器,程序插桩和动态翻译,寻找违反程序安全规则的状态。
- 漏洞 PoC 并使用 QEMU trace 插件或 intel-PT(processor tracing) 硬件特性等工具 记录 PoC 执行的路径,并采用符号跟踪技术 (symbolic tracing)1对路径进行模拟 重放,并收集路径上的约束(pathconstraints,又称pathpredicates)使用启发式规 则发现路径重放过程中的违例程序状态。
具体介绍:利用基于 UAF 漏洞触发中间点的模糊测试技术获得 多样化的内核漏洞触发上下文,然后利用部分符号执行来探索不同漏洞触发上 下文中的漏洞利用原语,并进一步基于漏洞利用原语生成漏洞利用。
- 首先,Fuze可以帮助安全分析人员自 动识别 UAF 漏洞利用相关的关键系统调用。
- 其次,它可以为安全分析人员自动 计算他需要堆喷射到漏洞对象区域的数据。
- 第三,它有助于安全分析人员查明需 要执行堆喷射和进行漏洞利用的时间范围。
- 最后,它为安全分析人员提供了绕过 部分内核利用缓解机制的能力。
实现方案
- QUEM虚拟系统+GDB调试获得执行状态快照
- 在符号执行过程中,从漏洞的角度对UAF漏洞和堆溢出漏洞进行符号化假设,即将UAF漏洞和堆溢出漏洞加入符号化过程。
- 漏洞利用原语发现:控制流劫持原语、内存非法写原语、内核内存泄露。
- 符号地址处理。绕过漏洞利用缓解机制。
- 利用原语评估。ret2usr,pivot2usr,cr4寄存器篡改
第五章:内核控制流劫持原语评估与缓解机制绕过技术
自动漏洞利用技术的工作流
- 利用原语发现
- 利用原语评估
漏洞利用存在的挑战
- 安全防御机制:编译器插桩、敏感数据保护、虚拟化程序管理、控制流完整性。
- 利用漏洞陷阱:意外终止利用。额外的约束条件、绕过陷阱约束。
- 不合适的漏洞利用原语。
KEPLER:单发漏洞利用链。图灵完备性。
- 增强控制流劫持原语。
- 绕过利用路径陷阱。
- 突破主流内核安全防御机制。
KEPLER由五个工具函数代码片段组成利用链
- 输入输出通道函数
- 绽放工具函数
- 桥接工具函数
KEPLER相关工具
- IDA SDK
- KVM QEMU
- angr
威胁模型与假设
- 内核安全防御机制的设定。SMEP、SMAP、KPTI、KASLR内核空间地址随机化,金丝雀
- 可用的漏洞利用原语:漏洞触发验证程序、控制流劫持原语、受限的内存泄露原语
实例
- 内核漏洞触发验证程序和漏洞利用原语
通过实例中的内核漏洞触发验证程序实现漏洞利用面临的挑战
- Linux内核安全防御机制。很多原有的攻击方法无法生效。ret2user/ret2dir/cr4寄存器劫持
- 利用路径陷阱
KEPLER设计概览
- 给出了工作模式图
- 设计需求:突破安全防御机制、magic gadget、ROP漏洞、自动化漏洞生成
KEPLER高层设计
- Kepler通过单发漏洞 利用链(“single-shot”exploit)将一个基于函数指针篡改的控制流劫持原语 CFHP 变成了基于栈溢出的控制流劫持原语 CFHP’ 。
KEPLER设计
原理
- 利用内核I/O函数打破了用户内核内存空间的隔离。
- 灵活复用内核中的原生代码,可以将单个控制流劫 持原语转化为栈溢出,并发起 ROP 攻击。
具体步骤
- 首先用copy_to_user()函数将内核栈的金丝 雀值拷贝到用户态,然后用copy_from_user()函数将攻击载荷拷贝到内核栈上 并构造栈溢出。
- 可利用内核中大量 存在的绽放工具函数(bloominggadget)来增强对通用寄存器的控制;并利用桥接工具函数(bridging gadget)来防止原漏洞利用路径上潜在的内核崩溃,从而 提升利用链的稳定性。
栈泄露工具(为了泄露栈金丝雀)
- copy_to_user通过将参数原地址设置成内核的栈帧,建立内核空间迁移到用户空间的信道。从而将内核栈金丝雀泄漏到用户空间
辅助函数()
- 执行一套寻找辅助函数的标准。
KEPLER部分5.5的主要内容
- 构建栈溢出
- 栈溢出工具代码片段
- 快速返回路径
- 触发分页错误
- 泄露栈金丝雀
- 栈泄露工具代码片段
- 辅助函数
- 单发漏洞利用技术
- 绽放工具函数:获得更多的寄存器
- 桥接工具函数:获得更多的控制流劫持原语
- 移位工具函数:
通过构建FUZZ与KEPLER两个系统,实现了漏洞利用。作者显然是网络安全方面非常厉害的博士生,在各种比赛中有所表现,还有很多论文。而且这里的漏洞利用对我来说,是在网络安全中,比较上层的部分知识,如果自己真的要走漏洞利用的方向。就必须,从基础的linux开始学习。
这对我来说,可能是非常巨大的挑战。
需要学习的内容
基础内容
- Linux系统编程(开发linux的C、C++应用)
- Linux系统教程(包括系统的工作原理)
- Linux内核源代码(github上的公开源码还有很多源码阅读的博客)
- 汇编语言学习(如何在Linux上运行汇编程序)
安全相关的内容
- 网络安全技术
- 网络渗透技术
- kali linux工具使用
- 漏洞挖掘技术
相关论文
- 漏洞挖掘的论文(如何发现漏洞)
- 漏洞利用的论文(如何利用漏洞)
2 相关技术和名词了解
内核保护机制
SMEP、SMAP
SMAP(Supervisor Mode Access Prevention,管理模式访问保护)和SMEP(Supervisor Mode Execution Prevention,管理模式执行保护)。禁止内核访问用户空间的数据和禁止内核执行用户空间的代码。arm里面叫PXN(Privilege Execute Never)和PAN(Privileged Access Never)
栈金丝雀
金丝雀是通过汇编来实现的。例如,由于 GCC 的 栈保护器 选项的原因使金丝雀能被用于任何可能有漏洞的函数上。函数序言加载一个魔法值到金丝雀的位置,并且在函数结语时确保这个值完好无损。如果这个值发生了变化,那就表示发生了一个缓冲区溢出(或者 bug),这时,程序通过 __stack_chk_fail 被终止运行。由于金丝雀处于栈的关键位置上,它使得栈缓冲区溢出的漏洞挖掘变得非常困难。

数据流完整性检查
控制流完整性检查
漏洞利用方法
ret2usr
在没有SMAP/SMEP的情况下把内核指针重定向到用户空间的漏洞利用方式被称为ret2usr。
ret2dir
physmap是内核管理的一块非常大的连续的虚拟内存空间,为了提高效率,该空间地址和RAM地址直接映射。RAM相对physmap要小得多,导致了任何一个RAM地址都可以在physmap中找到其对应的虚拟内存地址。另一方面,我们知道用户空间的虚拟内存也会映射到RAM。这就存在两个虚拟内存地址(一个在physmap地址,一个在用户空间地址)映射到同一个RAM地址的情况。也就是说,我们在用户空间里创建的数据,代码很有可能映射到physmap空间。基于这个理论在用户空间用mmap()把提权代码映射到内存,然后再在physmap里找到其对应的副本,修改EIP跳到副本执行就可以了。因为physmap本身就是在内核空间里,所以SMAP/SMEP都不会发挥作用。这种漏洞利用方式叫ret2dir。
pivot2usr
假设在执行指令call ,→ rax发现一个控制流劫持原语,为了发起 pivot2usr 攻击,首先,他需要将 控制流程劫持到到栈迁移工具代码片段:xchg eax,esp; ret。然后,他需要 通过将寄存器 eax 的值设置为用户空间中的地址来将栈转移 (stack pivot) 到用 户空间伪造的栈。由于攻击者可以完全控制位于用户态的伪栈内容,因此他可以 使用伪栈以及 Linux 内核中的工具代码片段准备 ROP 攻击载荷。这种漏洞利用 方法不会直接执行驻留在用户空间中的指令,因此可以在不触发 SMEP保护的情 况下成功实现任意代码执行
控制流劫持
代码注入攻击和代码重用攻击:传统代码注入攻击利用目标程序的输入信道将实现恶意功能的 Shellcode 注 入程序内存空间中并通过控制流劫持漏洞执行。通过代码重用攻击,既避免了注入攻击代码又可保证攻击代码的可执行 性。
堆喷射
的数据喷射到内核中并占据漏洞对象释放前所处位置,从而相应地操 纵其内容。通过slidecode与shellcode配合,实现执行用户代码的目的。
ROP返回式导向编程
ROP 通过将一系列以返回 (ret) 指令结尾的代码片段 连缀起来执行任意代码。ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。栈溢出的控制点是ret处,那么ROP的核心思想就是利用以ret结尾的指令序列把栈中的应该返回EIP的地址更改成我们需要的值,从而控制程序的执行流程。
程序分析技术(漏洞挖掘方法)
符号执行
不执行程序使用符号值来代替具体变量,来模拟每个路径来产生每一个执行的可能性,将执行语句的结果整合成若干条数学表达式。
对某结果的数学表达式进行求解,就能获得到达该结果的路径。
将产生漏洞的条件设置为程序执行的结果,降低分析程序的难度。
污点分析
污点分析可以抽象成一个三元组<sources,sinks,sanitizers>的形式,其中,source 即污点源,代表直接引入不受信任的数据或者机密数据到系统中;sink即污点汇聚点,代表直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性);sanitizer即无害处理,代表通过数据加密或者移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害。
污点分析就是分析程序中由污点源引入的数据是否没有经过无害处理,而直接传播到污点汇聚点。如果经过无害化处理,没有到达污点汇聚点,说明系统是信息流安全的;否则,说明系统产生了隐私数据泄露或危险数据操作等安全问题。
模糊测试
模糊测试(fuzzing)技术通过不断随机生成输入并检测程序错误检测漏洞 。模糊测试是工业界最流行的漏洞发现技术,但模糊测试技术存在着路径覆 盖率低,难以穿透复杂校验等特点。对于模糊测试的研究围绕主要从提升测试 用例质量和提高检测漏洞能力方面展开。
程序插桩
程序插桩,它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(本质上就是进行信息采集的代码段,可以是赋值语句或采集覆盖信息的函数调用),通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。
相关工具
漏洞检测工具、渗透测试工具、漏洞扫描工具
在分析技术集成与 平台建设方面,出现了 BAP[89]、BitBlaze[90]、angr[72],radare2[91] 等集成 了各类分析技术的二进制分析平台。
Nessus:Nessus 是目前全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用Nessus 作为扫描该机构电脑系统的软件。
nmap:nmap 也是不少黑客爱用的工具 ,黑客会利用nmap来搜集目标电脑的网络设定,从而计划攻击的方法。
Veracode:Veracode提供一个基于云的应用程序安全测试平台。无需购买硬件,无需安装软件,使用客户马上就可以开始测试和补救应用程序,另外Veracode提供自动化的静态和动态应用程序安全测试软件和补救服务。
CAIN:在口令破解上很有一套技术;
appscan:appscan是IBM公司开发的用于扫描web应用的基础架构,也是安全渗透行业扛把子的产品;
Nikto:Nikto是一款开源的(GPL)网页服务器扫描器,它可以对网页服务器进行全面的多种扫描;
parosproxy:parosproxy,这是一个对Web应用程序的漏洞进行评估的代理程序;
WebScarab:WebScarab记录它检测到的会话内容,使用者可以通过多种形式来查看记录;
Webinspect:惠普公司的安全渗透产品,运行起来占用大量内存,小家碧玉的就慎用了;
Whisker:Whisker是一款基于libwhisker的扫描器,但是现在大家都趋向于使用Nikto,它也是基于libwhisker的。
BurpSuite:是一款信息安全从业人员必备的集成型的渗透测试工具,它采用自动测试和半自动测试的方式;
Wikto:Wikto是一款基于C#编写的Web漏洞扫描工具;
Acunetix Web Vulnerability Scanner:(简称AWVS)是一款知名的网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞;
N-Stealth:N-Stealth 是一款商业级的Web服务器安全扫描程序。
3 环境构建
………..




