POC详情: 2a44f02afa2bfd9e8ea88b18ce41bd2cd4c3ca8a

来源
关联漏洞
标题: Artifex Ghostscript 安全漏洞 (CVE-2017-8291)
描述:Artifex Ghostscript是美国Artifex Software公司的一款开源的PostScript(一种用于电子产业和桌面出版领域的页面描述语言和编程语言)解析器,它可显示Postscript文件以及在非Postscript打印机上打印Postscript文件。 Artifex Ghostscript 2017-04-26及之前的版本中存在安全漏洞。远程攻击者可借助特制的.eps文档利用该漏洞执行命令。
介绍
# PIL-CVE-2017-8291

+ 화이트 햇 스쿨 3기 13반 백승훈(@shun1403) https://github.com/shun1403/PIL-CVE-2017-8291.git
+ 환경 : 우분투 리눅스

### 환경 구성
+ ```sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin```를 통해 V2로 업그레이드
+ 실행에 오류가 있을 경우 다음과 같은 명령어들로 docker 재설정
+ ```sudo apt remove docker docker-engine docker.io containerd runc -y```
+ ```sudo apt update```
+ ```sudo apt install -y ca-certificates curl gnupg lsb-release```
+ ```sudo mkdir -p /etc/apt/keyrings```
+ ```curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg```
+ ```echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu```
$```(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null```
+ ```sudo apt update```
+ ```sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin```
+ ```docker compose version```
+ 버전 확인 했을 때, 무사히 뜨면 됨
+ 
### git clone
```git clone https://github.com/vulhub/vulhub.git```
+ clone 후 진행하고자 하는 취약점 경로로 진입
+ 여기선 /vulhub/python/PIL-CVE-2017-8291

+ 다음과 같은 yml 파일을 참고하여 실습 진행
+ ```docker compose up -d``` : 컨테이너를 생성하고 백그라운드에서 진행하는 명령
+ 그 후 ```localhost:8000/``` 에 접속하여 파일 업로드 가능한 웹 페이지를 확인
![image](https://github.com/user-attachments/assets/337fa9e5-0a13-438a-b7bb-b9fd40581903)
+ 동일한 경로에 있는 조작된 poc.png 업로드 진행
+ 업로드를 진행하면 다음과 같이 뜨는 것을 확인할 수 있음
+ ![image](https://github.com/user-attachments/assets/4553d7c2-e9d6-4fe0-8758-b2c6c431a170)
+ 정상 기능이라면 png 파일 업로드 후 이미지의 가로, 세로 길이를 출력, 하지만 백엔드는 파일 헤더를 통해 이미지 유형을 분류하기 때문에, 확장자를 무시하고 실행 가능한 명령이 포함된 EPS 파일은 PNG 확장자로 변경하여 업로드 할 수 있음

+ 이를 이용하면 poc.png 파일을 업로드할 때 ```'tocuh /tmp/aaaaa'``` 명령 실행이 가능해질 것이고 POC 파일 내의 명령을 리버스 쉘 명령으로 변경하면 쉘 획득이 가능
+ 해당 파일을 업로드한 후, docker에 접속하여 /tmp에 가보면 명령어에 의해 aaaaa파일이 생성된 것을 확인 가

```python
command = ["gs",
            "-q",                         # 조용한 모드(출력 최소화)
            "-g%dx%d" % size,             # 출력 이미지 크기 설정 (픽셀 단위)
            "-r%fx%f" % res,              # 입력 이미지 해상도(DPI) 설정
            "-dBATCH",                    # 작업 완료 후 자동 종료
            "-dNOPAUSE",                  # 페이지 간 일시 정지 없이 연속 실행
            "-dSAFER",                    # 안전 모드 활성화
            "-sDEVICE=ppmraw",             # 출력 디바이스를 ppmraw로 설정
            "-sOutputFile=%s" % outfile,   # 출력 파일 경로 지정
            "-c", "%d %d translate" % (-bbox[0], -bbox[1]), 
                                            # 이미지 원점을 보정 (이동)
            "-f", infile,                  # 입력 파일 지정
          ]
```

# GhostScript 설치 여부 판단 코드 생략
``` python
try:
    with open(os.devnull, 'w+b') as devnull:
        subprocess.check_call(command, stdin=devnull, stdout=devnull)
    im = Image.open(outfile)
```

### 결과
![image](https://github.com/user-attachments/assets/997deab7-b572-4aa9-b85e-7712fcb839b7)


### 결론
해당 취약점은 Python Imaging Library(PIL)에서 발생한 취약점으로 CVE-2017-8291을 대상으로 진행되었다.
취약점은 PIL이 파일 확장자가 아닌 파일 헤더를 기반으로 이미지 유형을 판별하는 특성 때문에 발생하며, 이를 통해 실제로는 EPS 포맷 파일임에도 불구하고 확장자만 PNG로 변경하여 업로드 하면, 서버 측에서 GhostScript를 호출하면서 파일 내에 삽입된 임의 명령어가 실행될 수 있는 문제를 확인할 수 있었다.

프로젝트 과정에서 조작된 poc.png 파일을 업로드하여 서버 내부의 /tmp/aaaaa 파일 생성을 확인 함으로써, 취약점이 실제로 명령어 실행(RCE, Remote Code Execution)으로 이어질 수 있음을 재현하였다. 또한, 해당 ㅊ ㅟ약점은 원래 의도된 이미지 처리 기능을 악용해 리버스 쉘과 같은 고급 공격으로 확장될 수 있는 가능성을 내포하고 있는 것을 확인할 수 있다.
文件快照

[4.0K] /data/pocs/2a44f02afa2bfd9e8ea88b18ce41bd2cd4c3ca8a ├── [5.1K] 01.png ├── [2.2K] app.py ├── [ 171] docker-compose.yml ├── [1.8K] poc.png └── [4.7K] README.md 0 directories, 5 files
神龙机器人已为您缓存
备注
    1. 建议优先通过来源进行访问。
    2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
    3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。