0x01 环境介绍
下载(镜像):https://download.vulnhub.com/trollcave/trollcave-v1-2.ova
刚打开虚拟机时,可能靶机没有网络,可以看这篇文章进行网络配置
https://www.ordshine.cn/security/labs/217.html
0x02 信息搜集
主机发现
arp-scan -l
可以看到该靶机的ip地址为 192.168.80.146
端口扫描
nmap -A 192.168.80.146 -oA notes/nmap/trollcave/trollcave
目录扫描
这里使用dirsearch
python dirsearch.py -u http://192.168.80.146/ -e* -r
-e* 表示扫描所有类型的网站脚本,也就是后缀名
-r 表示递归搜索
先访问一下80端口
可以看到是有Home Log in Register功能
在线用户 是个 Moderator
还有king用户 是Superadmin
因为发现查看不同用户时,页面的url不同,尝试更改
应该是由17个用户,利用python写一个小脚本,把用户和级别统计一下
#coding:utf-8
import requests
import re
def get_userinfo(id):
req = requests.get("http://192.168.80.146/users/%s" % id).text
# match <h1>King's page</h1>
username = re.search('<h1>(.*?)\'s',req).group(1)
# match <b>Superadmin</b>
userlevel = re.search('\s<b>\s(.*?)\s</b>',req).group(1)
return username,userlevel
for i in range(0,20):
try:
username,userlevel=(get_userinfo(i))
print(username+":"+userlevel)
except:
None
但是注册功能已经关闭了
可以看到是有个/login 目录
指纹识别
尝试登录
发现,如果账户存在时,会有不一样的提示信息
但是如果账号不存在则是红色的警告提示
编写一个python脚本将这些信息保存下来
# coding:utf-8
import requests
import re
def get_userinfo(id):
req = requests.get("http://192.168.80.146/users/%s" % id).text
# <div class='container'><p><h1>King's page</h1>
username = re.search("<h1>(.*?)\'s", req).group(1)
# username = re.search("<div class='container'>/s<p>/s<h1>(.*?)'s page</h1>", req).group(1)
return username
# return req
def get_notice(username):
url = "http://192.168.80.146/login"
cookies = {"_thirtytwo_session": "aGRTeEI5bzRualFGbkJqeDhMblN2STBYMURNaVF4RjlyY0JrNGc3dW5ZSVljK01jenNjNTV0L3pMcGdobnBtY2JNWUx0MjkzUENocFVqSmVjYXhGMXdBc29tTmpqc3ZLNXlOOTZuYmI5MmNHRzdoMm03WG15a05YS3dabWM5N1Q0eFhhTjh4MjE0ZktUa3lBQThQeDA0WDYxUlRHTXBtT1drRkhWZmhuRmprSG9PS29vc09rT1RGZkszU250ZFNCaFNBREZDd1lFQjk1UHpZNVdneTNXLzhrRFFxT20rL3JBSGVhMnF1Nmx3az0tLUx1TUhWV3VJVnB6Z2o4UHRuRkl4SFE9PQ%3D%3D--eabac19d78d301cf7e5fa2639ee768fda9dbd5db"}
data={"authenticity_token": "1os5OczhcWEbVTl5Xf5ciS/ZEc2EreVeRAsH6d/JSg4pBL0Lg3bz9Kc2AvK/I8MmiEg0LparpPkHQysbXstY5Q==", "session[name]": username, "session[password]": "123", "commit": "Log+in"}
req = requests.post(url=url, cookies=cookies, data=data).text
# match <div id='notice'>:)</div>
notice = re.search("<div id='notice'>(.*?)</div>", req).group(1)
return notice
# print(get_notice("King"))
for i in range(0, 20):
try:
username = get_userinfo(i)
notice = get_notice(username)
print(username + ":" + notice)
except:
None
#print(get_userinfo(1))
在博客里面有个密码重置的文章,看一看如何可以密码重置从而修改掉其他账户的信息
可以看出,网站的框架是rails,一个ruby语言的全栈框架,并且该网站已经部署了密码重置的功能
当然也可以使用指纹识别的工具
0x03 漏洞发现
密码重置的介绍可以看这两篇文章,Rails —密码恢复 | 码农家园 (codenong.com),Ruby on Rails 教程 - 第 12 章 重设密码 (railstutorial-china.org)
可以访问/password_resets/new路径重设密码
我想要给King用户重置,但发现这里只可以给普通用户进行重置密码
那我们就给xer用户重置
必须超过十个字符,成功将xer用户密码重置成1111111111
登录成功后继续寻找突破口,发现有一个文件上传的功能
尝试写入php一句话,上传失败,看来是不能通过文件上传突破了
欸,刚刚的那个修改链接呢,可以修改King的吗,试一下
发现修改成功了
那这个用户可以文件上传么,尝试一下,看来还是不行
发现有个控制面板,可以打开文件上传的功能,打开后再次上传一句话
这次成功上传,但是文件路径在哪里呢,根目录? 并不是
呃。。。,找一找
这里可以删除文件,发现可以右键打开,那就打开看一看
文件路径有了,访问一下
感觉怪怪的,哦没有被解析,那有没有可以解析的目录呢
尝试上传的时候进行目录跳跃
并没有被解析
好叭,想想别的办法
发现首页有一篇这样的文章
提到了使用rails用户
前面发现存在任意目录上传的漏洞,那我们可以猜测是不是存在rails用户,通过上传authorized_keys 到rails用户的.ssh目录下,这样rails用户就可以免密码进行ssh登录
于是先在本地生成ssh key
ssh-keygen -f rails
然后把公钥修改名称为authorized_keys
进行ssh连接
# ssh -i rails rails@192.168.80.146
登录成功
0x04 漏洞利用
版本是Ubantu 16.04.4 LTS
搜索一下这个版本是否有漏洞
发现 CVE-2017-16995
该漏洞存在于调用eBPF bpf(2)的Linux内核系统中,当用户提供恶意BPF程序使eBPF验证器模块产生计算错误,导致任意内存读写问题, 低权限用户可使用此漏洞获得管理权限。
0x05 权限提升
因为exp是C语言,但是本地靶机并没有gcc环境,那就本地编译,然后再传送的靶机上
gcc -o 44298.c exp
然后将exp传到靶机上,可以使用python开启一个http服务,然后wget下载到靶机上
然后添加执行权限 chmod + x
执行之后报错了
rails@trollcave:~$ ./exp
./exp: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./exp)
GLIBC_2.34' not found,经过百度,发现问题是glibc版本不对
尝试了更新靶机的glibc版本,因为是这个压缩包是外网的,下载实在是太慢了,然后在本地下载的,又建立了http服务wget下载到靶机,安装发现权限不够,呃呃
冷静下来仔细想了想问题,是不是我kali的glibc版本太高,查了一下是2.35的,或许是呢,我又用了一个低版本的glibc2.31 的kali,重新编译了一下exp,成功执行,获得root权限
查看flag.txt
查看网络连接情况