本文首发于“合天智汇”公众号 作者:萌新

  • 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 = "x31xdbxf7xe3x53x43x53x6ax02x89xe1xb0x66xcdx80"  "x5bx5ex52x68xffx02x11x5cx6ax10x51x50x89xe1x6a"  "x66x58xcdx80x89x41x04xb3x04xb0x66xcdx80x43xb0" "x66xcdx80x93x59x6ax3fx58xcdx80x49x79xf8x68x2f"  "x2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1xb0"  "x0bxcdx80"

运行脚本

然后使用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

(通过本实验,了解格式化字符串漏洞产生原理,并掌握其利用方法

声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!

内存溢出的危害_漏洞练习之网络编程与堆栈溢出技术相关推荐

  1. 栈溢出脚本_漏洞练习之网络编程与堆栈溢出技术

    0x00 公众号之前发过Exploit-Exercise之Nebula实践指南,Exploit-Exercise一共有5个镜像可供练习,如下所示 本系列文章将会介绍第二个镜像Protostar的通关经 ...

  2. mysql堆溢出_为什么这个MySQL触发器会导致堆栈溢出?

    我今天遇到了同样的问题,每次触发都会导致堆栈溢出.原来我的Zend社区服务器安装附带了一个默认的my.cnf文件,其中thread_stack大小设置为128K,这导致每个线程中可用于堆栈的13107 ...

  3. 内存溢出的危害_内存溢出和内存泄漏的区别

    点击关注,我们共同每天进步一点点! 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了lo ...

  4. socket接收时信号量阻塞了会丢数据吗_浅谈Java网络编程——非阻塞I/O

    文件描述符(descriptors) Unix中I/O的基本组成元素是字节序列.大多数程序应用于字节流或I/O流. 进程通过描述符引用I/O流,也被称作文件描述符.管道.文件.POSIX IPC's( ...

  5. linux多线程求和_(TCP IP网络编程)实验七 多线程编程

    一.实验目的 (1) 理解线程和进程的联系和区别: (2) 掌握Linux下和Windows下创建线程的方法: (3) 掌握Linux下和Windows下线程同步的方法: (4) 使用多线程机制实现L ...

  6. 在线五子棋JAVA网络编程_实验五 Java网络编程及安全

    一.实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 二.实验步骤 1. 基于Java Socket实现安全传输 2. 基于TCP实现客户端和服务器,结对编 ...

  7. linux java socket编程_深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

  8. 黑马程序员_基础复习八(网络编程)

    ----------------------------android培训.java培训.期待与您交流!---------------------------------- 文件上传案例分析 一.需求 ...

  9. java小球碰撞实验报告_实验五 Java网络编程及安全 实验报告 20135232王玥

    北京电子科技学院(BESTI) 实验报告 课程:Java程序与设计         班级:1352 姓名:王玥 学号:20135232 成绩:             指导教师:娄嘉鹏       实 ...

  10. 堆栈溢出从入门到提高

    转自:http://www.jiaonan.net/html/2007/06/20070624034620915.htm 入门篇 2007-6-24 15:46:20 本讲的预备知识: 首先你应该了解 ...

最新文章

  1. linux的运维管理UNIT3
  2. Linux 服务器安装discuz 7.2论坛
  3. 50佳设计独特的名片设计欣赏(上篇)
  4. 【POJ - 1837】Balance(dp及其优化)
  5. html元素垂直水平居中显示,关于css:html-元素垂直水平居中
  6. 挑战程序设计竞赛(第一章)
  7. 解决“ssh服务器拒绝了密码 请再试一次”问题
  8. 高等数学学习笔记——第四十讲——微积分基本公式
  9. Hash和红黑树以及其在C#中的应用
  10. 金蝶kis迷你版操作大全
  11. VENDORNPC.LUA --随身商人
  12. Eclipse更改字体大小设置
  13. 信息安全人员关注网站
  14. put: File COPYING could be replicated to 0 nodes instead of minReplication.There are 0 datanodes解决方案
  15. IntelliJ Idea入门教程:如何新建项目
  16. 程序员即装逼又实用的Cmd命令行
  17. 视图的优点与缺点总结
  18. WF2011 Chips Challenge
  19. React实战精讲(React_TS/API)
  20. Eclipse 从SVN检出项目之《文件夹 “” 已不存在 》

热门文章

  1. [Asp.Net web api]基于自定义Filter的安全认证
  2. apache 配置用户级目录
  3. OpenGLES.gpus_ReturnNotPermittedKillClient
  4. Canvas里的globalCompositeOperation
  5. 怎样提高你的Google Adsense收入
  6. 软件工程总结--文字篇
  7. 【android高级编程】简答题汇总
  8. 需要重新启动php,win10电脑遇到问题要重新启动怎么回事
  9. Timeline使用手册
  10. javaSE基础之字符串