您当前的位置: 首页 >  linux

合天网安实验室

暂无认证

  • 0浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

linux实践 | Exploit-Exercise之Nebula实践指南(三)

合天网安实验室 发布时间:2018-05-11 18:13:26 ,浏览量:0

本文作者: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元不等的稿费哟。

有才能的你快来投稿吧!

点击了解投稿详情 重金悬赏 | 合天原创投稿等你来!

关注
打赏
1665306545
查看更多评论
立即登录/注册

微信扫码登录

0.0498s