【笔记整理】网络攻防技术

4 漏洞的定义

  指信息系统硬件、软件、操作系统、网络协议、数据库等在设计上、实现上出现的可以被攻击者利用的错误、缺陷和疏漏

栈溢出的漏洞利用原理

  • 内存分布
  • 漏洞利用内存变化
  • 压栈/出栈
  • 栈溢出原理

溢出漏洞利用原理

基本流程

  • 注入恶意数据
  • 溢出缓冲区
  • 控制流重定向
  • 执行有效载荷

关键技术

  • 溢出点定位
  • 覆盖控制执行地址
  • 覆盖异常处理结构
  • 跳转地址的选定
  • shellcode的定位和跳转
溢出点定位
  • 探测法
  • 反汇编分析
探测法

也就是说只是随机数输入,通过报错信息判断

反汇编分析

就是反汇编分析

覆盖执行控制地址

执行控制地址可包括

  • 覆盖返回地址
  • 覆盖函数指针变量
  • 覆盖异常处理结构
覆盖异常处理结构
  • 异常处理是一种对程序异常的处理机制,它把错误处理代码和正常情况下执行的代码分开
  • 当程序发生异常时,系统中断进程,将控制权交给了异常处理程序
  • Windows的异常处理机制叫做结构化异常处理(Structured Exception Handling)
跳转地址的选定

跳转指令的搜索范围:

  • 用户空间的任意地址
  • 系统DLL
  • 进程代码段
  • PEB
  • TEB
Shellcode的定位和跳转
NOP SledDecoderReal_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的响应有四个部分

  • 问题部分
  • 回答部分:回答问题的记录
  • 权威部分:指向权威服务器的部分
  • 附加部分:与查询相关的部分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缓存中毒攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值