网络攻防技术

网络攻防技术

三月 22, 2022

一、概述

二、信息收集

三、口令攻击

  1. 针对口令强度的攻击(弱口令攻击)

    1. 穷举法(暴破)
    2. 字典攻击
    3. 社工
      1. 组合攻击
      2. 撞库攻击
    4. 彩虹表破解:破解哈希算法(主用于MD5、HASH等)
      • 原理:基于内存 - 时间衡量方法,通过以一定存储空间换取时间的方式,提高对散列值的破解效率
    • windows远程口令猜解
      1. 基于IPC的远程口令猜解(IPC$文件和打印机共享:139、445)
        1
        net use \\目标主机IP\ipc$ "口令" /user:"用户名"
      2. 基于Thrminal Service的远程口令猜解(DRP服务:3389)
  2. 针对口令存储的攻击

    1. 缓存口令
      • 实现原理:在进行用户身份验证时,需要将口令配置加载到内存中,通过对内存读取
      • 相关工具:PWDump、Mimikatz
    2. 口令文件
      • 口令通过文件形式进行存放在系统中,对文件进行破解
      • 相关实例:
        1. windows账号和口令存放在SAM文件(C:\Windows\System32\config)
        2. Linux账号和口令存放在Shadow文件
    3. 口令的其他存储位置
      • (除了缓存和文件)存放其他位置:注册表、(及时口令)casch或内存、硬盘扇区、(主板BIOS存放位置)COMS
    • NTLM加密机制:
      1. 口令转换成Unicode编码
      2. MD算法对Unicode编码进行散列,得到128比特的散列结果,成为NTLM散列
      • CR方式:“挑战/响应”方式(服务器对挑战数据没有时效性要求,可以进行重放攻击)
  3. 针对口令传输的攻击

    1. 口令嗅探
    2. 键盘记录
    3. 网络钓鱼
    4. 重放攻击:(通信双方按照特定协议)嗅探当前通信流量,在适当的时候重发给通信的其中一方,达到欺骗目的。
      1. 简单重放
      2. 反向重放:向消息发送者重放数据
      • SMB协议(共享文件、打印机、通信对象之间资源)发展:明文 ==> LM验证机制(LAN Manager Callenge Response) ==> NTLM验证机制(Windows NT Challenge Response)

        四、软件漏洞

  4. 漏洞标准化研究

    1. CVE:Common Vulnerabilities & Exposures
      • 漏洞字典:漏洞对应CVE编号
    2. CWE:Common Weakness Enumeration
      • CWE是一种包括类缺陷、基础缺陷、变种缺陷等多层次的体系
        1. 字典视图:以字母表顺序排列
        2. 开发视图:针对软件开发者,以软件开发周期为参照分类
        3. 研究视图:这对学术界人士,从内在性质等方面分类
  5. 典型漏洞类型

    1. 栈溢出
      • 1986年首次出现真实攻击
      • 进程使用系统内存从低到高四结构:栈、堆、数据段、文本(代码)段
      • 栈空间是程序设计时规定好如何使用以及使用多少的内存空间(典型栈变量包括函数内部的普通变量、数组等)
      • 栈帧(stack Frame):每个进程有一个栈,这个进程中每个函数被调用时分别再栈中占用一段区域
      • 原理分析示例
        1
        2
        3
        4
        5
        6
        7
        8
        9
        #include<stdio.h>
        #include"windows.h"
        int main(int argc,char *argv[])
        {
        char name[16];
        strcpy(name,argv[1]);
        printf("%s\n",name);
        return 0;
        }
    2. 堆溢出
      • 堆结构特点
        1. 堆是程序运行时动态分配的内存(指不预先决定,需要参考用户反馈)
        2. 堆使用时需要程序员使用专用函数申请(如:C:malloc() ; C++:new())
        3. 一般一个堆指针来使用申请的内存,读写释放都通过这个指针完成
        4. 使用完毕后要通过释放函数回收内存,否则会造成内存泄漏(free() ; delete() )
      • 现代操作系统的堆结构:
        1. 堆块:堆区内存按不同大小组织成块,以堆块为单元进行标识,而不是传统字节标识
          • 块首:一个堆块头部的几个字节,用来标识这个块首自身信息。
          • 块身:紧跟在块首后面部分,最终分配给用户使用的数据区。
        2. 堆表:一般位于堆区起始位置,用于检索堆区中所有堆块的重要信息,包括堆块的位置、大小、空闲或占用等。
      • 原理分析示例:
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        #define BUFFSIZE 32
        int main(int argc,char* argv[])
        {
        char *buf1;
        buf1 = (char *)malloc(BUFFSIZE); //分配内存块
        strcpy(buf1,argv[1]); //向buf1拷贝参数
        printf("%s\n",buf1); //打印buf1
        free(buf1);
        return 0;
        }
      • 堆溢出攻击思路
        1. 构造数据溢出下一个堆块的块首
        2. 改写块首的前向指针和后向指针
        3. 分配、释放、合并等操作发生时获得一次向内存任意地址读写任意数据的机会
    3. 格式化串漏洞
      • 格式化串:在print系列函数中按照一定的格式对数据进行输出(既可输出到标准输出,也可输出到文件句柄、字符串等)
      • 格式化串漏洞原理:软件使用格式化字符串为参数,且该格式化字符串来自外部输入
        • 输入格式化字符串参数”%n”:『将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置』
        • “%p”
      • 优势:只要构造出指针就可以修盖内存中任何数值,攻击具有针对性。(栈溢出:地毯式轰炸)
    4. 整型溢出
      1. 存储溢出
      2. 运算溢出
      3. 符号溢出
    5. (UAF)释放再使用
  6. 溢出漏洞利用原理

  7. 漏洞利用保护机制

    五、Web应用攻击

    XSS攻击

    1
    <script>alert("err")</script>
  8. 主要类型
    1. 反射型【非持久】:输入攻击脚本直接返回到被攻击者浏览器
      1
      2
      http://www.example.com/test.php? 
      user=<script>alert('123')</script> //通过传递变量缺乏过滤进行执行
    2. 存储型【持久】:(一般用于论坛留言,评论,日志)将攻击脚本存储于服务器,受害者查看页面时执行
    3. DOM型(文档对象模型):针对web中的JavaScript代码的逻辑漏洞而执行攻击脚本
  9. 常用利用方法
    1. Cookie窃取
      1
      <script>alert(document.cookie);</script>	//visit:document.cookie to GetCookie
    2. 会话劫持
    3. 钓鱼:通过执行JavaScript代码动态生成页面内容或直接注入HTML代码(比传统钓鱼更具隐蔽性)
    4. 信息刺探:访问并窃取历史信息、端口信息、剪切板、IP、键盘信息等request对象
    5. 网页挂马
    6. xss蠕虫:一般用存储型将恶意代码保存于服务器

      SQL注入

  10. 注入条件:
    • 用户能够控制输入
    • 原本程序要执行的sql语句,拼接了用户输入数据
  11. 常用SQL注入
    1. Mysql
      1
      select 字段名 from 表名 where 条件 order by i limit m.n /*select一般语句*/
    2. php程序调用函数执行sql语句功能
      1
      xxx? id="select * from users where id=$id and pass='".$pass."'"; &pwd=
  12. 注入类型分类
    1. 按注入点类型
      1. 数字型(整型)
        • 注入点类型为数字(整型),不需要使用引号闭合
          1
          "9 or 1=1 --"
      2. 字符型
        • 一般需要使用引号(单、双)满足sql语句引号闭合语法要求
          1
          "xx' or 1=1 --"  --"xx":任意值 ; "--":注释符
      3. 搜索型
    2. 按注入技术(执行效果)分类
      1. 基于布尔的盲注
        • 在输入值后拼接布尔表达式(真值为0或1),通过回显信息的不同判断,某个参数是否为注入点
          1
          2
          3
          4
          5
          /*1=1:真值为true*/
          id = 3005 and 1=1 & pass= test
          /*1=2:真值为false*/
          id = 3005 and 1=2 & pass= test
          /*若回显信息不同,则$id为注入点*/
      2. 基于时间的盲注
        • 使用一些时间函数,如延迟函数slee()
          1
          2
          id=3005 and sleep(3) &pass=test
          /* web应用延迟3秒后显示登录失败,则$id注入点 */
      3. 基于报错的注入
        • 在php调用函数后输入错误验证传递,观察错误信息中显示出的对应数据库函数,可判断数据库类型
      4. 联合查询注入
      5. 堆查询注入
  13. 常用判断/查找注入点
    1. 经典:
      • and 1=1
      • and 2>1
      • or 1=1
      • or 1<1
    2. 数据库函数:
      • and sleep(4)=1
      • and length(user())>3
    3. 特殊符号:
      • 单引号(’)
      • 双引号(”)

        六、恶意代码

        七、假消息攻击

        八、拒绝服务攻击

        九、防御

        十、访问控制机制

        十一、防火墙

        十二、网络安全监控

        十三、追踪溯源