栈溢出脚本_漏洞练习之网络编程与堆栈溢出技术
0x00
公众号之前发过Exploit-Exercise之Nebula实践指南,Exploit-Exercise一共有5个镜像可供练习,如下所示
本系列文章将会介绍第二个镜像Protostar的通关经验。
Protostar涉及栈溢出、堆溢出、格式化字符串漏洞、网络编程、及综合性漏洞。
本文将介绍net,final部分。
关于环境准备,在官网https://exploit-exercises.lains.space/protostar/下载即可。下载后得到iso镜像,使用vmware安装。然后使用user/user即可登录
查看ip
知道ip后可以在kali中ssh连上
输入user即可
机器上所有需要分析的程序都在如下路径
0x01
第一关,net0
从源码中可以看出,会创建一个在2999端口监听的程序
生成随机数赋给wanted
服务端从标准输入读取输入,将值存在变量i里
i与变量wanted中的值相比较,如果相等则打印thank you sir/madam,我们的目标就是打印这条语句
简单测试下
连上2999端口后,程序会打印一条包括随机数串的消息,要求我们以小端32位形式回复就是将string转为integer)
这就很简单的,用python写个程序,包括如下功能:
1.连接到本地2999端口
2.读取服务端发来的信息
3.匹配出程序给出的数字
4.将其转为小端32位格式
5.发回去
6.读取服务端响应
代码如下
运行后如下所示
0x02
第二关 net1
和第一关类似,程序在2998端口监听,也会给出要转换的数据,我们按照要求转换后发送回去,只要服务端接收后返回的响应为you correctly sent the data,就说明我们成功了
先简单运行下
这就是要求我们将其转为string
这里同样明确我们的脚本需要具备的功能
1.连接到本地2998端口
2.读取服务端发来的数据
3.unpack数据并将其转为无符号整型,再用str函数处理
4.发给服务端
5.打印服务端的响应
代码如下
测试如下
0x03
第三关,net2
程序监听在2997端口
简单运行下
有无法打印的字符,我们使用hexdump可以看到具体的16进制
结合题目可知,是要求我们将4个无符号整型数相加
流程还是一样的,我们先明确脚本需要实现哪些功能:
1.连接到本地2997端口
2.读取4个数
3.将读取的数转为无符号整数并相加
4.发送给服务端
5.读取响应
代码如下
测试如下
0x04
第四关final0
从源码中可以看到,是在本地2995端口进行监听
我们连上去看看
输入test,会返回No such user test
程序在第19行调用get接收我们的输入,分配到buffer为512字节,不过我们可以输入更多,所以此处存在栈溢出漏洞。另外注意到我们输入的test,当程序返回时是TEST,这是因为源码中27到30行将其转为了大写。这样的话,我们直接写入的shellcode就会因此失效。不过仔细看代码,会发现,将字符转为大写的for中用的是strlen(buffer)来计算要转换的字符串的长度,而strlen遇到null就停止了。所以我们可以在null后面加上shellcode,这样我们的shellcode就不会因为被大写转换而失效了。(这一点在后面写payload时需要注意)
我们输入超过buffer大小的内容后,会生成coredump
其路径如下,我们使用gdb调试,注意到会有权限问题
此时需要切到root,密码为godmode
查看寄存器
可以看到eip寄存器被覆盖为0x44444444,也就是DDDD
说明偏移为532
为了拿到shell,我们需要execve函数和字符串/bin/sh的地址
先找execve的
gdb挂上后进行查找
在下图中找到了execve()的地址0x08048c0c
然后找/bin/sh字符串的地址
先查找程序依赖的动态链接库文件
在其中找/bin/sh
1176511是偏移,我们还要找到libc的起始地址
为此需要先找到final的进程id,再查看maps
权限不够,切到root
看到地址为0xb7e97000
所以字符串/bin/sh的地址为0xb7e97000+1176511
于是就可以写攻击脚本了
代码如下
注意
1.pad里的’\x00’就是为了防止shellcode失效而特地添加的null(见前面的解释)
2.exp中的AAAA是返回地址,这里不重要,也可以随意填
3.ifconfig就是我们想执行的命令,可以替换成任意命令
执行后如图所示
0x05
第五关final1
题目的提示告诉我们这是一个和格式化字符串有关的漏洞
经过代码审计,发现漏洞点位于第17行的snprintf和19行的syslog
这里是用syslog输出,那么我们可以考虑把syslog的地址改为shellcode的地址
我们先简单看看程序跑起来是怎样的,程序在2994端口监听,所以用nc连上2994
%n格式化字符会将已输出的字符数写入到对应参数的内存中,我们可以考虑先用%x打印出栈上的数据
然后去查看syslog
看最近的一条,没有看到aaaaaaa被打印出来,我们可以继续测试
再次查看syslog
看到aaaa被打印出来了,那么我们接下来的任务就是让其对齐,并准备在其中写入地址
输入如下时
此时在syslog看到
输入的AAAA对齐了
接下来就是要找到syslog函数的地址,并用shellcode的地址进行替换
寻找syslog的地址
接下来使用msfvenom生成监听4444端口的shellcode,如下
shellcode = "\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80" \ "\x5b\x5e\x52\x68\xff\x02\x11\x5c\x6a\x10\x51\x50\x89\xe1\x6a" \ "\x66\x58\xcd\x80\x89\x41\x04\xb3\x04\xb0\x66\xcd\x80\x43\xb0" \ "\x66\xcd\x80\x93\x59\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x68\x2f" \ "\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0" \ "\x0b\xcd\x80"
完整的代码如下所示
运行脚本
然后使用nc监听本地4444端口
下图使用了id,whoami,ls命令进行了测试
说明我们成功进行了漏洞利用
0x06
第六关 final2
从下图中我们可以看到,程序希望我们的输入以FSRD开头,然后寻找最后出现的”/”字符,从那里开始搜索单词“ROOT”,它使用memove替换了从单词“ / ROOT”开始直到最后一个斜杠“ /”的所有内容
我们可以来试一下
此时会生成coredump,在gdb中分析
可以看到是在调用free()的时候crash的
接下来就是需要找到我们可以在GOT中覆写的对象,先找write
找到write的地址为0x0804d41c,待会儿会有用到
继续测试
gdb调试
可以看到eax,edx被覆盖为了bbbb
我们来进一步分清楚eax,ebx是被哪一部分payload写入的
gdb调试
可以看到eax,edx分别被控制覆盖为了aaaa,bbbb
接下来就可以使用前面找到的write的地址0x0804d41c来测试
gdb调试
看到可以成功将61616161(即aaaa)写入了
于是就可以写我们的脚本了
执行脚本
nc监听本地4444端口,然后使用whoami,ls命令进行测试
说明成功实现了漏洞的利用
0x07
参考:1.https://exploit-exercises.lains.space/protostar/2.https://medium.com/bugbounty/3.https://medium.com/@airman604/4.https://medium.com/@coturnix97/exploit-exercises-protostar/
实验推荐
格式化(字符串)溢出实验
https://www.hetianlab.com/expc.do?ec=2a2450e9-563e-4d99-b0ab-089d65ba7d4d
(通过本实验,了解格式化字符串漏洞产生原理,并掌握其利用方法)
精选推荐
《Web安全零基础到精通》
如果你也是一名想进入Web安全行业,急需专业老师带路的人;
急需提升实战技能,想找一份心仪工作的0-3年Web安全新人;
在校大学生,想进入Web安全行业,急需参与实操项目的同学。
戳戳戳
栈溢出脚本_漏洞练习之网络编程与堆栈溢出技术相关推荐
- linux java socket编程_深入学习socket网络编程,以java语言为例
了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...
- java小球碰撞实验报告_实验五 Java网络编程及安全 实验报告 20135232王玥
北京电子科技学院(BESTI) 实验报告 课程:Java程序与设计 班级:1352 姓名:王玥 学号:20135232 成绩: 指导教师:娄嘉鹏 实 ...
- 栈溢出脚本_污点分析挖掘漏洞演示——如何在8小时内从零发现cve20120158(word溢出漏洞)...
更多全球网络安全资讯尽在邑安全 www.eansec.com 简介 最近一直在研究漏洞挖掘的东西. 网上能看到的漏洞挖掘的方法,大概就两种,一种是fuzzing,一种是静态分析和动态调试结合,人工审查 ...
- 在线五子棋JAVA网络编程_实验五 Java网络编程及安全
一.实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 二.实验步骤 1. 基于Java Socket实现安全传输 2. 基于TCP实现客户端和服务器,结对编 ...
- socket接收时信号量阻塞了会丢数据吗_浅谈Java网络编程——非阻塞I/O
文件描述符(descriptors) Unix中I/O的基本组成元素是字节序列.大多数程序应用于字节流或I/O流. 进程通过描述符引用I/O流,也被称作文件描述符.管道.文件.POSIX IPC's( ...
- linux多线程求和_(TCP IP网络编程)实验七 多线程编程
一.实验目的 (1) 理解线程和进程的联系和区别: (2) 掌握Linux下和Windows下创建线程的方法: (3) 掌握Linux下和Windows下线程同步的方法: (4) 使用多线程机制实现L ...
- 黑马程序员_基础复习八(网络编程)
----------------------------android培训.java培训.期待与您交流!---------------------------------- 文件上传案例分析 一.需求 ...
- mysql堆溢出_为什么这个MySQL触发器会导致堆栈溢出?
我今天遇到了同样的问题,每次触发都会导致堆栈溢出.原来我的Zend社区服务器安装附带了一个默认的my.cnf文件,其中thread_stack大小设置为128K,这导致每个线程中可用于堆栈的13107 ...
- 网络编程二-LINUX网络IO模型
目录 前言:网络编程里通用常识 一.同步和异步与阻塞和非阻塞 同步和异步 阻塞和非阻塞 两者的组合 二.五种I/O模型 阻塞I/O模型 非阻塞IO模型 IO复用模型 信号驱动IO 异步IO模型 5个I ...
最新文章
- QT的滚动条极简教程
- 每日一皮:程序员和黑客的区别
- 生物反应器:生物过程工程的动物细胞培养控制 Bioreactors : animal cell culture control for bioprocess engineering 英文原版
- Java培训教程:Java中的位移运算符!
- 计算机文化基础在线作业答案,中国石油大学17年秋《计算机文化基础》第一次在线作业答案...
- jQuery事件2——off取消事件绑定
- 0515 银行转帐功能演练
- PostgreSQL一些简单问题以及解决办法
- C++查漏补缺之流状态
- 让Fckeditor支持中文——解决“Error loading /fckeditor/fckstyles.xml ”
- 专访OneAPM创始人何晓阳:APM将是开发者必备服务
- 多种交换机端口镜像 Port Mirroring 配置
- 统计学-贾俊平(第四版)学习笔记
- CS224N WINTER 2022(二)反向传播、神经网络、依存分析(附Assignment2答案)
- mpush部署实现与测试
- Fiddler - IOS 开启证书(描述文件与设备管理 / 证书信任设置)
- java基础(一)基础认识、数据类型
- 做数据分析很重要的思维模式!!!
- python科学计算环境配置_ATLAS + NumPy + SciPy + Theano 的Python科学计算环境搭建
- 明明没PS,看起来却像PS过的32张照片
热门文章
- opengl java_android graphic(20)—java层OpenGL相关类
- asp.net mysql 增删该查_asp.net 数据库的增删改查
- python的判断与循环
- 第八章:软件包的安装与管理
- LeetCode:Find Peak Element - 寻找一个数组内的顶点
- 用Linux命令行实现删除和复制指定类型的文件
- “假冒hao123”“北大青鸟”被黑 钓鱼挂马两不误
- adobe FMS(flash media server)错误解决小结
- linux apache2.4环境,浅谈SUSE Linux下Apache2.4.43部署
- postman如何测试php接口_基于Postman的API自动化测试