티스토리 뷰

728x90
반응형

단순하게 명령어를 입력받고 그 명령어 결과를 출력하는 코드를 main.py 로 만들었다고 가정하고, docker 파일 구성에 대해서 말씀드려보겠습니다.

참고용이며 이 틀을 기반으로 문제를 만드시면 되겠습니다.

반드시 socat을 이용하지 않더라도 xinetd, nc, socket programming 등을 이용해서 동일한 환경을 구축하실 수 있습니다.

main.py

#!/usr/bin/env python3
import subprocess

if __name__ == '__main__':
	argument = input('Command: ')
	try:
		proc = subprocess.Popen(argument.split(' '),stdout=subprocess.PIPE,stderr=subprocess.PIPE)
		out, err = proc.communicate()
		print(out.decode('utf-8'))
	except:
		pass

input으로 사용자가 입력한 명령어를 입력받고, Popen 함수로 명령어 실행 결과를 가져와서 출력합니다.

Dockerfile

FROM ubuntu:22.04

RUN apt-get -y update --fix-missing
RUN apt-get -y upgrade
RUN apt-get -y install socat python3 python3-pip
RUN groupadd -r ctf && useradd -r -g ctf ctf
RUN chmod 1733 /tmp /var/tmp /dev/shm
# RUN pip3 install some_package_name

ADD . /home/ctf

WORKDIR /home/ctf
RUN echo "FLAG{FAKE_FLAG}" > flag.txt
RUN chmod 440 flag.txt
RUN chmod 550 main.py

RUN chown -R root:ctf /home/ctf

USER ctf
CMD socat TCP-L:9999,reuseaddr,fork EXEC:"./main.py"

socat을 이용해서 접속자 별로 main.py 파이썬 코드를 실행하도록 합니다.

docker-compose.yml

version: '3'
services:
  ctf_chall01:
    build: .
    ulimits:
      nproc: 65535
      core: 0
    ports:
      - "10007:9999"
    restart: unless-stopped

참고로 core: 0 은 core dump 파일을 만들지 않겠다는 의미입니다.

불필요한 덤프 파일을 만들어서 리소스를 소모하지 않게 방지합니다.

이외에도 다양한 설정값들이 있는데 아래 문서를 참고하시면 되겠습니다.

https://docs.docker.com/compose/compose-file/compose-file-v3/

 

Compose file version 3 reference

 

docs.docker.com

 

728x90
반응형
댓글