w34kn3ss:利用OpenSSL的漏洞通过公钥获取私钥


靶机下载地址

1.信息收集

扫描端口:

通过目录扫描找到了一个图片,在/test/目录下。

图片上写”需要很多keys“。

用图片解析工具查看,没有得到任何有用信息:

回看nmap扫描结果,443端口给出了一个签发证书的域名地址:weakness.jth。编辑/etc

/hosts文件,把域名加入。

然后访问:http://weakness.jth/

对该网页进行目录扫描,发现了一个新目录/private

访问这个目录发现了两个文件:

第一个是mykey公钥,应该是用来登录ssh的。

第二个notes.txt的内容:

2.利用openssl漏洞爆破私钥

notes.txt提示密钥是由openssl 0.9.8c-1生成的。特意提示了版本信息,那说明这个版本可能存在漏洞:

注意到5720.py是一个暴力破解的脚本,把它复制过来:

这个exploits里注明了漏洞利用方法:

先下载文件debian_ssh_rsa_2048_x86.tar.bz2

然后把它解压在一个目录下,查看文件内容,这应该是一个个公钥和私钥对。

我们已经得到了mykey.pub文件,接下来就是找到与它配对的私钥。

在文件夹中找到了内容一致的公钥,它的同名文件即对应的私钥:4161de56829de2fe64b9055711f531c1-2537

现在有私钥了,那用户名呢?回看http://weakness.jth/ 的那只兔子,用户名为n30,隐藏在兔子里。

现在可以用以下命令连接ssh:

ssh -i 4161de56829de2fe64b9055711f531c1-2537 n30@weakness.jth

连接成功!

3.提权

目前用户为n30.获取user.txt

发现了一个名字很敏感的文件:code

查看了一下,是python编译的文件。

执行文件运行出现错误,但是输出了敏感信息:登录硬编码?

把这个文件下载到kali进行反编译,查看程序代码中是否有硬编码的登录信息:

把code移动到下载公钥的那个文件夹,或者用python开一个http服务都可以。

下载:

把code文件重新命名为code.pyc文件,上传到在线python反编译工具

反编译的代码:

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 2.7

import os
import socket
import time
import hashlib
print '[+]System Started at : {0}'.format(time.ctime())
print '[+]This binary should generate unique hash for the hardcoded login info'
print '[+]Generating the hash ..'
inf = ''
inf += chr(ord('n'))
inf += chr(ord('3'))
inf += chr(ord('0'))
inf += chr(ord(':'))
inf += chr(ord('d'))
inf += chr(ord('M'))
inf += chr(ord('A'))
inf += chr(ord('S'))
inf += chr(ord('D'))
inf += chr(ord('N'))
inf += chr(ord('B'))
inf += chr(ord('!'))
inf += chr(ord('!'))
inf += chr(ord('#'))
inf += chr(ord('B'))
inf += chr(ord('!'))
inf += chr(ord('#'))
inf += chr(ord('!'))
inf += chr(ord('#'))
inf += chr(ord('3'))
inf += chr(ord('3'))
hashf = hashlib.sha256(inf + time.ctime()).hexdigest()
print '[+]Your new hash is : {0}'.format(hashf)
print '[+]Done'

从源码中可以看出来被hash计算前的字符串为:

n30:dMASDNB!!#B!#!#33

这可能是n30用户的系统密码,n30用户有sudo权限,尝试执行sudo:

用密码:dMASDNB!!#B!#!#33 登录成功!

获取到root用户的flag。

4.总结

本靶机主要考察以下知识点:

  • 根据nmap扫描出的域名,访问获取线索;
  • 所谓兔子洞中也可能有隐藏的线索(用户名);
  • 利用openssl的版本漏洞,已知公钥获取私钥;
  • python文件的反编译,解析源码中硬编码信息。

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