안녕하세요. 최근 CTF 문제들을 풀어보면서 도커파일을 활용하는데의 중요성을 많이 느껴서 기록할 겸해서 글을 적습니다.
도커파일이란?
Dockerfile은 도커 이미지를 만들기 위한 설정 파일로, CTF 관점에서 보면 출제자의 환경과 최대한 똑같은 환경에서 문제 해결을 수행하기 위해 제공되는 파일입니다.
예를 들어, 문제 폴더 내부를 보게 되면 아래와 같이 도커파일이 존재합니다.

그렇다면 이 도커파일이 왜 중요할까요?
도커파일이 없다면, 로컬 환경에서 문제 해결을 하더라도, 막상 리모트 환경에서 문제를 풀이할 때는 해결되지 않는 경우가 많습니다. 이는 특히 pwnable 문제에서 자주 발생하는 문제들인데요, 그 이유가 환경이 맞지 않아서 그렇습니다.
pwnable의 경우는 libc 파일마다 symbol들의 오프셋이 모두 다르기 때문에, 만약 잘못된 libc 파일을 가지고 풀이를 수행한다면, 문제 환경과 다른 오프셋이 되어서 풀이가 제대로 되지 않습니다.
그렇다면 웹해킹은 필요가 없는걸까요? 아닙니다. 웹해킹은 포너블과 같은 로되리안 문제는 발생하지 않지만, 가끔 가다가 서버에서 어떤 방식으로 동작되는지 이해해야 하는 경우가 있습니다. 이 때 환경을 구축하게 된다면 서버에서 정확히 어떤 방식으로 작동하는지를 이해할 수 있습니다.
환경 구축
그렇다면 이제 본격적으로 환경 구축을 해보겠습니다. 도커파일을 활용하기 위해서는 먼저 파일이 있는 위치로 이동해야 합니다.

이렇게 이동을 해주세요.
그리고 다음과 같이 입력합니다.
docker build -t <이미지 이름> .

그러면 다음과 같이 하나의 이미지가 만들어지게 됩니다. 이제 이 이미지를 가지고 컨테이너를 만들어보겠습니다.
docker run -d -t --privileged --name <이미지 이름> <컨테이너 이름>

이제 위와 같이 하나의 도커 컨테이너가 만들어지게 되었습니다.
웹해킹의 경우는 포너블과 달리 docker-compose.yml 파일을 주는 경우가 많습니다.

이 경우에는, Dockerfile이 있는 곳이 아닌, docker-compose.yml 파일이 존재하는 곳으로 이동해서 아래와 같이 명령어를 입력합니다.
docker-compose up --build

수행하면 위와 같이 서버가 구축됩니다. 이제 익스를 수행하면서 서버에 뜨는 로그들을 확인할 수 있습니다.
pwnable의 경우
pwnable의 경우는 익스플로잇을 수행하기 위해서 libc 버전이 중요하다고 얘기했었는데요, 그렇다면 이 컨테이너에 들어가서 다시 파이썬 깔고,, 이런 식으로 환경을 다시 구축해야 할까요?
그럴 필요는 없습니다. 그냥 단순히 컨테이너에서 libc파일과 ld 파일을 빼오기만 하면 됩니다.
docker cp <컨테이너 이름>:/lib/x86_64-linux-gnu/libc.so.6 ./libc.so.6
docker cp <컨테이너 이름>:/lib/ld-linux-x86-64.so.2 ./ld.so.2
이제 빼왔으면 이 라이브러리 파일들을 실행 파일에 적용시켜줍니다. patchelf를 이용하면 됩니다.
patchelf --set-interpreter ./ld.so.2 <실행 파일>
patchelf --set-rpath . <실행 파일>
여기까지 설정을 완료했다면, 출제자의 환경이 반영된 실행 파일이 완성되며, 이 파일을 이용해서 로컬에서 익스에 성공하면, 로되리안 없이 remote 환경에서도 성공하게 됩니다.