4 漏洞的定义
指信息系统硬件、软件、操作系统、网络协议、数据库等在设计上、实现上出现的可以被攻击者利用的错误、缺陷和疏漏
栈溢出的漏洞利用原理
- 内存分布
- 漏洞利用内存变化
- 压栈/出栈
- 栈溢出原理
溢出漏洞利用原理
基本流程
- 注入恶意数据
- 溢出缓冲区
- 控制流重定向
- 执行有效载荷
关键技术
- 溢出点定位
- 覆盖控制执行地址
- 覆盖异常处理结构
- 跳转地址的选定
- shellcode的定位和跳转
溢出点定位
- 探测法
- 反汇编分析
探测法
也就是说只是随机数输入,通过报错信息判断
反汇编分析
就是反汇编分析
覆盖执行控制地址
执行控制地址可包括
- 覆盖返回地址
- 覆盖函数指针变量
- 覆盖异常处理结构
覆盖异常处理结构
- 异常处理是一种对程序异常的处理机制,它把错误处理代码和正常情况下执行的代码分开
- 当程序发生异常时,系统中断进程,将控制权交给了异常处理程序
- Windows的异常处理机制叫做结构化异常处理(Structured Exception Handling)
跳转地址的选定
跳转指令的搜索范围:
- 用户空间的任意地址
- 系统DLL
- 进程代码段
- PEB
- TEB
Shellcode的定位和跳转
NOP Sled | Decoder | Real_shellcode |
---|
NOP Sled:类似NOP指令一样的填充,无意义,可以是NOP,也可以是一些无副作用指令
Decoder: 解码部分,对Real_shellode进行解码
Real_shellcode:经过了编码处理的shellcode
Shellcode相关(了解)
什么是Shellcode
通常是一段能够完成一定功能的、可由计算机直接执行的机器代码,通常是十六进制
汇编生成ShellCode的思路
(这里的shellcode功能是执行一个函数)
-
将参数压栈
-
将参数地址压栈
-
call 我们要调用的函数的地址
注意:
-
Push是四个字节对齐的,因此必须每次压栈四个字节或者一个字节一个字节赋值
-
如果 user32.dll 没有加载时, 那个 API 地址将不会指向 MessageBoxA 函数,代码将会失败
-
shellcode 调用函数后,没有做扫尾工作
-
Shellcode 包含 null 字节
shellcode的正常退出
-
进程方面:ExitProcess()
-
SEH: 强制产生异常调用
-
线程方面:ExitThread()
以下是进程方面的正常退出
xor eax, eax //清零
push eax //这是ExitProcess函数的参数
mov eax, 0x7c81cafa // ExitProcess(exitcode)
call eax
null字节的问题
- 用 add&sub 来重新产生原来的值
- sniper:precision-null-byte-boming
- 将原始值一字节一字节写入
- xor
- 寄存器:32 位->16 位->8 位
- 用可替代指令
- 从 null 字节到空格&null 字节
加载DLL(Dynamic Link Library)
这个应该是特指 windows中的动态链接库程序,比如USER32.DLL就是在程序要使用窗口界面的时候所需要加载的链接库。
DLL也是一个二进制文件,当程序运行的时候会将DLL映射到进程的地址空间,访问DLL中导出的函数
PUSH 0x00206c6c
PUSH 0x642e3233
PUSH 0x72657375
//以上导入参数
//以下加载dll
mov eax,esp
push eax
mov eax,0x7c801d7b //LoadLibrary sp3
call eax
通用的shellcode编写
静态函数地址获取
将每个版本的Windows操作系统所地应的函数的地址列出来,然后针对不同版本的操作系统使用不用的地址
动态定位函数地址
使用 GetProcAddress() 函数和 LoadLibrary() 函数动态获取其它函数的地址
- 首先需要获取到GetProcAddress() 函数的地址
- 通过GetProcAddress() 函数的地址获取其他函数的地址( LoadLibrary() 等)
- 再调用其他函数的地址
注意:
LoadLibraryA/W是在系统库kernel32.dll中,其地址也可以使用GetProcAddress得到。
而Kernel32.dll一般都会加载,所以只要在内存中查找Kernel32.dll库和GetProcAddress函数的地址就可以。
获取地址的方法
- 暴力搜索
- 使用PEB获取GetProcAddress的地址
- SHE获取Kernel基址
- Hash法查找所有函数地址
什么是TEB
系统在此TEB中保存频繁使用的线程相关的数据。位于用户地址空间,在比 PEB 所在地址低的地方。
进程中的每个线程都有自己的一个TEB。一个进程的所有TEB都以堆栈的方式,存放在从0x7FFDE000开始的线性内存中,每 4KB为一个完整的TEB
使用PEB的方法
- 查找Kernel32.dll的方法
引出表
就是一个储存着win系统中的API函数的表,这个表结构中有着所有API函数的名称、序号、地址。
地址是:Kernel32.dll基址+0x3c+0x78
5 Web应用攻击
XSS攻击
同源策略
A网页设置的cookie,B网页不能打开,除这两个网页同源
同源: 协议相同、域名相同、端口相同
XSS攻击的危害
- 网络钓鱼,盗取账号
- 窃取用户cookie资料
- 劫持用户会话
- 强制弹出广告
- 网页挂马
- 传播跨站脚本蠕虫
XSS攻击分类
- 反射型XSS
恶意信息直接留在URL中,有时候会直接将URL进行简化让人看不出来有恶意信息 - 存储型XSS
恶意数据是直接存在服务器端的,当我们访问了服务器,就是访问了恶意信息 - DOM型XSS
- 是基于js上的
- 不需要和服务端进行交互
XSS攻击的防范
- HttpOnly属性
- 安全编码:PHP语言中的安全编码的函数有 htmlentities()函数和htmlspecialchars()函数
7 假消息攻击
TCP攻击
Syn-Flooding的攻击原理和步骤
原理
当服务器接收到初始SYN数据包时,它使用TCB(传输控制块)存储有关连接的信息。而服务器将TCB存储在仅仅用于半开放连接的队列里面,在服务器获得了ACK包后,将TCB从队列里面取出。
如果没有被取出,服务器重新发送SYN+ACK包,同时过一段时间后TCB被丢弃。
所以如果我们发送大量的SYN包,通过在插入TCB在队列中来消耗队列。
步骤
在关闭了syn_cookies的同时,进行随机ip源地址的大量syn连接请求的发送
TCP重置攻击的攻击原理和步骤
原理
要断开TCP之间的连接,出来进行四次挥手之外,还可以使用重置标志:RST标志,这个标志可以直接进行断开连接
- 目标:断开A和B之间的TCP连接。
伪造的RST数据包需要正确设置以下字段:
- 源IP地址,源端口,
- DestinationIP地址,DestinationPort
- Sequencenumber(在接收器窗口内)
攻击步骤
步骤:
- 在攻击者机器上使用Wireshark,嗅探流量
- 检索目标端口(23)、源端口号和序列号。
TCP会话劫持攻击的原理和步骤
目标:在已建立连接中注入数据。
伪造TCP数据包:需要正确设置以下字段:
- 源IP地址,源端口,
- 目标IP地址,目标端口
- 序列号(在接收器窗口内)
DNS攻击
DNS的响应
DNS的响应有四个部分
- 问题部分
- 回答部分:回答问题的记录
- 权威部分:指向权威服务器的部分
- 附加部分:与查询相关的部分
以上是向一个root DNS服务器进行IP地址询问
root地址不知道答案,所以没有回答部分,但给了我们权威部分和附加部分
附加部分就是给了权威DNS服务器的IP地址
本地DNS缓存中毒攻击
攻击机和受害机时处于在同一个局域网之中
在看到来自本地DNS的查询后伪造DNS应答
也就是进行数据包嗅探,当出现DNS查询包的时候,构造包对其进行回复
回复中将权威部分换成我们想要设定的DNS域名
远程DNS缓存中毒攻击
当攻击机不在局域网的时候,他们需要猜测查询数据包使用的两个随机数:
- 源端口号(16位随机数)
- 事务ID(16位随机数)
导致攻击很困难
Kaminsky攻击
Kaminsky攻击可以解决这个问题
通过在发送向DNS服务器查询包的同时发送伪造回复,可以实现远程DNS缓存中毒
因为我们构造回复包的时候设定让此DNS将权威DNS服务器的地址设置成我们自己的地址,达成缓存中毒
来自恶意DNS服务器的回复伪造攻击
当用户访问网站(如attacker32.com)时,DNS查询最终将到达attacker32.com域的权威名称服务器。
除了在响应的应答部分提供IP地址外,DNS服务器还可以在授权和其他部分提供信息。攻击者可以使用这些部分提供欺诈信息。
防止DNS缓存中毒攻击
DNSSEC
- DNSSEC是DNS的一组扩展,旨在对DNS数据提供身份验证和完整性检查。
- 使用DNSSEC,来自DNSSEC保护区的所有答案都经过数字签名。
- 通过检查数字签名,DNS解析器能够检查信息是否真实。
TLS/SSL
传输层安全(TLS/SSL)协议提供了针对缓存中毒攻击的解决方案。
- 在使用DNS协议获取域名(www.example.net)的IP地址后,计算机将询问
- IP地址的所有者(服务器)是否为www.example.net。
- 服务器必须提供由受信任实体签名的公钥证书,并证明它知道与www.example.net关联的相应私钥(即,它是证书的所有者)。
- HTTPS构建在TLS/SSL之上。它可以击败DNS缓存中毒攻击。