
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin で V2 にアップグレードsudo apt remove docker docker-engine docker.io containerd runc -ysudo apt updatesudo apt install -y ca-certificates curl gnupg lsb-releasesudo mkdir -p /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgecho "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/nullsudo apt updatesudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugindocker compose versiongit clone https://github.com/vulhub/vulhub.git
clone 後、実施したい脆弱性のパスへ移動
ここでは /vulhub/python/PIL-CVE-2017-8291
次のような yml ファイルを参考に演習を実施
docker compose up -d : コンテナを作成し、バックグラウンドで実行するコマンド
その後 localhost:8000/ にアクセスし、ファイルアップロード可能な Web ページを確認

同じパスにある改変された poc.png をアップロード
アップロードすると、次のように表示されることを確認できる

正常な機能であれば、PNG ファイルのアップロード後に画像の幅と高さを出力する。ただし、バックエンドはファイルヘッダーを基に画像タイプを判別するため、拡張子を無視して、実行可能なコマンドが含まれる EPS ファイルを PNG 拡張子に変更してアップロードすることができる。
これを利用すると、poc.png ファイルをアップロードする際に 'tocuh /tmp/aaaaa' コマンドを実行できるようになり、POC ファイル内のコマンドをリバースシェルコマンドに変更すればシェルを取得できる
そのファイルをアップロードした後、docker に接続して /tmp を確認すると、コマンドによって aaaaa ファイルが生成されたことを確認できる
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, # 입력 파일 지정
]
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)

本脆弱性は、Python Imaging Library(PIL)で発生した脆弱性であり、CVE-2017-8291 を対象として検証を行った。 この脆弱性は、PIL がファイル拡張子ではなくファイルヘッダーを基に画像タイプを判別する特性によって発生する。これにより、実際には EPS 形式のファイルであっても、拡張子だけを PNG に変更してアップロードすると、サーバー側で GhostScript が呼び出され、ファイル内に挿入された任意のコマンドが実行される可能性がある問題を確認できた。
プロジェクトの過程で、改変された poc.png ファイルをアップロードし、サーバー内部の /tmp/aaaaa ファイルの生成を確認することで、この脆弱性が実際にコマンド実行(RCE, Remote Code Execution)につながることを再現した。また、この脆弱性は、本来意図された画像処理機能を悪用して、リバースシェルなどの高度な攻撃へ拡張される可能性を内包していることを確認できる。