Exploit-Exercise之Nebula实践(四)

获取15关卡的flag。

由题目的提示可知,这题需要用到strace,使用strace观察flag15的调用情况。
在这里插入图片描述
直接strace跟踪flag15
在这里插入图片描述
结果如下:
在这里插入图片描述
可以看到(图中受限于屏幕空间没有截全),flag15大量调用libc.so.6
再使用readelf查看
在这里插入图片描述
结果如下
在这里插入图片描述
可以看到程序对libc.so.6存在依赖,可题目没有提供。我们需要写libc.so.6到哪个路径,让.so函数直接getflag呢?
我们使用objdump
在这里插入图片描述
由于我们对/var/tmp有写入权限,因此我们可以在上图路径下添加一个假的libc,so
进入到相应目录,创建pwn15.c,写入如下代码
在这里插入图片描述
编译
在这里插入图片描述
报错,采用如下方法解决
创建一个名为verscript的文件,写入
在这里插入图片描述
重新编译
在这里插入图片描述
在这里插入图片描述
执行
在这里插入图片描述
添加相应编译选项(Bstatic)重新编译
在这里插入图片描述
执行,可以看到成功通关
在这里插入图片描述

获取关卡16,17的flag16(这一关必须一打开虚拟机马上做,不然过一会儿web服务就自动关闭了,我谷歌过,找不到解决方案)

再做这一题之前,同样再官网上查看代码,注意到提示我们,一个perl脚本再1616端口运行
在这里插入图片描述
全部代码如下:
在这里插入图片描述
或者直接在/home/flag16下输入nano index.cgi查看
在这里插入图片描述
通读代码可知,实现的是一个认证过程,接收GET方式传递的参数username和password,在11行处可以看到将参数中的英文转换成了大写,在12行过滤了空格,在第14行调用egrep判断同时存储结果到数组@output中,在15行开始的foreach里进行数组的遍历与判断。
此处漏洞产生的点在于:调用了属于shell命令的egrep来处理username,而username又是我们可控的参数。可能开发者考虑到我们会进行此处的漏洞利用,才做了两个限制:转换为大写,删除空格。因为linux下默认是区分大小写的,可能开发者因此就认为这是安全的。不过,了解shell的人都知道,存在通配符“”,这可以用于替换任意字符串。因此,我们在攻击利用中无需考虑大小写的问题。至于空格的问题,比如本来的命令是echo #,被过滤后就成了echo#,这是无效的,所以我们可以使用”;”来分割命令。
那么我们现在的目标就是把第14行的代码改成这样就行了:
在这里插入图片描述
当然了,这个PWN16里面的内容需要我们自己写入。
只要能够控制14行的代码如上所示,便能根据我们的需要执行命令。
按照这一系列挑战的要求,我们需要得到getflag命令执行后的结果,作为对照,我们顺便显示下我们当前的用户。
因此PWN16的具体内容如下:
在这里插入图片描述
给它添加执行权限
在这里插入图片描述
接下来我们使用nc模拟web端的访问,在此之前需要将username的值,也就是;/
/PWN16转换成url编码,
在这里插入图片描述
然后启动nc
在这里插入图片描述
接下来ctrl+c结束,回到tmp查看文件,看到多出来一个flag16.out
在这里插入图片描述
查看内容。可以看到已经成功通关了
在这里插入图片描述
17
再进入下一关前,输入如下命令切换用户
在这里插入图片描述
密码默认不会显,密码也是level17
确认用户后开始做题
在这里插入图片描述
题目提示我们在10007端口监听的python脚本存在漏洞
代码如下:
在这里插入图片描述
通读代码,脚本的作用就是建立socket监听,端口为10007,接收客户请求,将客户端发送的数据使用pickle.loads处理。
对序列化了解的同学可能知道python中的序列化、反序列化主要就是pickle模块进行的。而经典的反序列化漏洞在python中的时实现也离不开pickle.
pickle.loads()方法的参数如下:
pickle.loads(bytes_object, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
pickle.loads()方法跟pickle.load()方法的区别在于,pickle.loads()方法是直接从bytes对象中读取序列化的信息,而非从文件中读取。
我们可以先试着来看看看看序列化和反序列化的流程
写一个测试脚本如下
在这里插入图片描述
执行后可以看到多出一个h
在这里插入图片描述
查看h内容
在这里插入图片描述
这便是我们序列化后存储的内容了
可以序列化自然就可以反序列化回来,写test2.py,内容如下
在这里插入图片描述
将序列化的数据所在的文件读入,使用pickle.load将其反序列化
执行结果如图
在这里插入图片描述
那么,设想一下,如果使用pickle.loads方法反序列化被我们精心构造的数据呢?
我们希望执行的python脚本内容如下:
在这里插入图片描述
其对应的序列化数据如下,将其保存为exp17
在这里插入图片描述
接下来我们将其传给正在监听的端口
使用nc实现
在这里插入图片描述
使用ctrl+c终止,接下来查看我们再序列化数据中指定的文件,可以看到成功通关

获取关卡18,19的flag18

本题代码量较大,就不贴出来了
通读代码,可以知道主要实现如下:启动后,程序会查看两个参数,-d,能够将日志记录到提供的文件中,-v增加详细程度
然后程序启动并开始将详细程度写入调试文件,并且为二进制程序设置EUID权限。此时程序开始接收输入。
代码中如果fopen函数打开失败,这意味着如果密码文件无法读取,那么它会登录到用户。那么我们就可以尝试删除密码文件,这样的话fopen失败并返回NULL文件描述符,但是我们无法删除。另外一种使fopen函数调用失败的方法耗尽文件描述符,如此密码文件便无法分配到文件描述符。我们可以通过这个办法来使fopen函数调用失败。
首先我们看下一个进程可以打开多少个文件描述符
在这里插入图片描述
可以看到是1024个,由于标准输入输出和错误占了3个,我们需要在fopen函数打开失败和我们登录之前耗尽1021个文件描述符
像这样子
输入
在这里插入图片描述在这里插入图片描述

回显提示我们无法加载共享库,即无法打开libnurses.so.5
首先我们关闭日志文件,释放其文件描述符
在这里插入图片描述在这里插入图片描述

/bin/sh没有-d参数,查看bash的手册页和-rcfile选项知道,–rcfile选项可以强制Bash从文件而不是~/.bashrc中读取和执行命令
因此我们重新输入如下命令
在这里插入图片描述
在这里插入图片描述
现在可以了,但是我们的rcfile是日志文件,因为当它尝试执行Starting时会失败。我们需要在payload后调用可执行文件。
在这里插入图片描述
倒数第四句话告诉我们提权成功

19
首先切换用户
在这里插入图片描述
代码如下:
在这里插入图片描述
通读代码,可以知道:执行程序时,首先通过getpid()得到父进程pif号,根据这个pid赵找到/proc下的当前pid号的文件夹,如果这个文件夹属于root,则执行shell
很明显,正常情况下,是无法执行shell的
此处涉及到一个知识点:linux中进程有父子关系,如果在子进程执行完毕之前父进程被销毁则子进程成为孤儿进程,其收养进程是init,pid为1.init进程是linux启动时创建的第一个进程,是所有进程的父进程,具有root权限。因此我们可以首先fork一个进程,然后在子进程执行完毕之前结束掉父进程,这样子进程就满足执行shell的条件了。
代码如下:
在这里插入图片描述
编译、链接
在这里插入图片描述
运行
在这里插入图片描述
查看当前目录,可以看到多出了flag19
在这里插入图片描述
查看flag19,从信息中可以知道我们已经成功通关
在这里插入图片描述

扩展

1.《unix环境高级编程》
2.《鸟哥的linux私房菜》
3.《深入理解linux内核》

参考

https://github.com/1u4nx/Exploit-Exercises-Nebula
https://nitesculucian.github.io/2017/10/24/180000-Exploit-Exercises-Nebula-07.html
https://mike-boya.github.io/blog/2016/02/15/exploit-exercises-nebula-level08/
https://73696e65.github.io/2015/06/exploit-exercises-nebula-11-15
http://blog.yyx.me/posts/exploit-exercises-nebula-level-15-19.html
http://www.kroosec.com/2012/11/nebula-level15.html
https://decepticode.wordpress.com/2016/05/04/nebula-level16/
https://mike-boya.github.io/blog/2016/02/22/exploit-exercises-nebula-level17/
http://www.php.cn/python-tutorials-372984.html
http://www.pwntester.com/blog/2013/11/27/nebula-level18-write-up/
http://blog.ferling.eu/wargames/nebula/level19
https://blog.csdn.net/hurricane_0x01/article/details/53926752
http://seclists.org/fulldisclosure/2014/May/128

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值