trollcave-v1-2

发布于 2023-02-20  488 次阅读


0x01 环境介绍

image-20221115160031229

下载(镜像):https://download.vulnhub.com/trollcave/trollcave-v1-2.ova

刚打开虚拟机时,可能靶机没有网络,可以看这篇文章进行网络配置

0x02 信息搜集

主机发现

arp-scan -l
image-20221115100551534

可以看到该靶机的ip地址为 192.168.80.146

端口扫描

nmap -A 192.168.80.146 -oA notes/nmap/trollcave/trollcave
image-20221115163016777

目录扫描

这里使用dirsearch

python dirsearch.py -u http://192.168.80.146/ -e* -r

-e* 表示扫描所有类型的网站脚本,也就是后缀名

-r 表示递归搜索

先访问一下80端口image-20221115164905346

可以看到是有Home Log in Register功能

image-20221115165051193

在线用户 是个 Moderator

image-20221115165134999

还有king用户 是Superadmin

image-20221115165305226

因为发现查看不同用户时,页面的url不同,尝试更改

image-20221115171152690

应该是由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
image-20221115173051042

但是注册功能已经关闭了

image-20221115165037323
image-20221115164814537

可以看到是有个/login 目录

指纹识别

image-20221115164633044

尝试登录

发现,如果账户存在时,会有不一样的提示信息

image-20221118132752820

但是如果账号不存在则是红色的警告提示

image-20221118132815463

编写一个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))
image-20230220093515205

在博客里面有个密码重置的文章,看一看如何可以密码重置从而修改掉其他账户的信息

image-20230220093219487

可以看出,网站的框架是rails,一个ruby语言的全栈框架,并且该网站已经部署了密码重置的功能

当然也可以使用指纹识别的工具

image-20230220094652358

0x03 漏洞发现

密码重置的介绍可以看这两篇文章,Rails —密码恢复 | 码农家园 (codenong.com)Ruby on Rails 教程 - 第 12 章 重设密码 (railstutorial-china.org)

image-20230220095228312

可以访问/password_resets/new路径重设密码

image-20230220095307298

我想要给King用户重置,但发现这里只可以给普通用户进行重置密码

那我们就给xer用户重置

image-20230220095708327
image-20230220095848744

必须超过十个字符,成功将xer用户密码重置成1111111111

登录成功后继续寻找突破口,发现有一个文件上传的功能

image-20230220100055172

尝试写入php一句话,上传失败,看来是不能通过文件上传突破了

欸,刚刚的那个修改链接呢,可以修改King的吗,试一下

image-20230220101035988

发现修改成功了

那这个用户可以文件上传么,尝试一下,看来还是不行

image-20230220101209310

发现有个控制面板,可以打开文件上传的功能,打开后再次上传一句话

这次成功上传,但是文件路径在哪里呢,根目录? 并不是

呃。。。,找一找

image-20230220101435955

这里可以删除文件,发现可以右键打开,那就打开看一看

image-20230220101514120

文件路径有了,访问一下

image-20230220101731340

感觉怪怪的,哦没有被解析,那有没有可以解析的目录呢

尝试上传的时候进行目录跳跃

image-20230220121236812
image-20230220121301640
image-20230220121326319

并没有被解析

好叭,想想别的办法

发现首页有一篇这样的文章

image-20230220123340347

提到了使用rails用户

前面发现存在任意目录上传的漏洞,那我们可以猜测是不是存在rails用户,通过上传authorized_keys 到rails用户的.ssh目录下,这样rails用户就可以免密码进行ssh登录

于是先在本地生成ssh key

 ssh-keygen -f rails
image-20230220124018364

然后把公钥修改名称为authorized_keys

image-20230220124445716

进行ssh连接

# ssh -i rails rails@192.168.80.146

登录成功

image-20230220124927916

0x04 漏洞利用

版本是Ubantu 16.04.4 LTS

搜索一下这个版本是否有漏洞

发现 CVE-2017-16995

该漏洞存在于调用eBPF bpf(2)的Linux内核系统中,当用户提供恶意BPF程序使eBPF验证器模块产生计算错误,导致任意内存读写问题, 低权限用户可使用此漏洞获得管理权限。

image-20230220141711681

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版本不对

image-20230220145709830

尝试了更新靶机的glibc版本,因为是这个压缩包是外网的,下载实在是太慢了,然后在本地下载的,又建立了http服务wget下载到靶机,安装发现权限不够,呃呃

冷静下来仔细想了想问题,是不是我kali的glibc版本太高,查了一下是2.35的,或许是呢,我又用了一个低版本的glibc2.31 的kali,重新编译了一下exp,成功执行,获得root权限

image-20230220191027632

查看flag.txt

image-20230220191708914

查看网络连接情况

image-20230220192401971