本文作者:Yale
原创投稿详情:重金悬赏 | 合天原创投稿等你来!
上两篇文章介绍了前13部分(Exploit-Exercise之Nebula实践指南(一);Exploit-Exercise之Nebula实践指南(二)),本篇接着介绍最后的13-19部分,通过本系列的挑战可以很快的入门linux在信息安全方向的实践。
13
代码如下
代码的作用是:通过getuid获取当前用户的uid,如果等于FAKEUID(在第7行已经宏定义),则可以读取token
很明显,这题要想通过必须修改uid。或者说当getuid调用时,getuid得到的uid为1000.
用什么黑魔法呢?我们先来看一下当前的uid
Uid为1014,而我们需要的uid为1000,先用gdb调试
输入disasmain反汇编主函数
注意到080484ef处调用函数,getuid(),再080484f4则是进行判断。判断后的结果就是getuid的返回值,也就是getuid获取到的uid。我们只要把这里的值修改为1000就可以了
按q退出,然后在判断语句处下断点
输入run执行程序
程序在断点处自动暂停,查看eax寄存器
可以看到打印出的值就是我们的uid,那么我们将其修改为1000就可以了
输入continue,程序继续运行
成功获取到token
切换为flag13用户,并使用上图token登录
执行getflag,成功通关
14
由题目的提示可知,flag14加密输入并且标准输出,题目需要我们解密一个加密过的token
首先进入flag14所在目录,运行flag14
提示需要-e参数,加密123为135
加密abc为ace
这个加密算法在多试几次也一样,很好看出来。
对于123而言,1+0=1,2+1=3,3+2=5,前一个加数是明文,后一个加数是数组下标。对于abc同样也是如此。
知道算法后,直接写出解密算法就可以了,拿python来做
注意一定要切换到/tmp路径,在flag路径我们没有写入权限
代码如下:
运行后得到明文
切换到flag14账户,使用上图明文登录,注意输入密码时不回显
执行getflag,成功通过
15
由题目的提示可知,这题需要用到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
(这一关必须一打开虚拟机马上做,不然过一会儿web服务就自动关闭了,我谷歌过,找不到解决方案)
再做这一题之前,同样再官网上查看代码,注意到提示我们,一个perl脚本再1616端口运行
全部代码如下:
或者直接在/home/flag16下输入nanoindex.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
本题代码量较大,就不贴出来了
通读代码,可以知道主要实现如下:启动后,程序会查看两个参数,-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,从信息中可以知道我们已经成功通关
参考:
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
(本系列文章到此全部更新完啦)
看不过瘾?合天2017年度干货精华请点击《【精华】2017年度合天网安干货集锦》
别忘了投稿哦!
合天公众号开启原创投稿啦!!!
大家有好的技术原创文章。
欢迎投稿至邮箱:edu@heetian.com
合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哟。
有才能的你快来投稿吧!
点击了解投稿详情 重金悬赏 | 合天原创投稿等你来!