Sechack

Docker를 이용한 pwnable환경 세팅 본문

Tools

Docker를 이용한 pwnable환경 세팅

Sechack 2021. 11. 28. 20:43
반응형

처음 pwnable을 공부하시는 분들이면 대부분 vmware를 이용해서 우분투 환경을 세팅할것이다. 하지만 vmware특성상 무겁기도 하고 단순한 실습을 넘어서 CTF를 하실 분들이라면 pwnable특성상 ubuntu버전에 따라서 exploit방법이 달라지기 때문에(heap exploit의 경우는 glibc버전 차이가 매우 심함) vmware에 자주 사용되는 ubuntu환경들을 전부 구축해둬야 하고 새로운 환경이 나오면 또 그걸 구축하는데도 매우 오래걸린다.

 

 

vmware에 ubuntu라는 OS만 설치하는데도 몇십분 이상이 걸리고 설치하고 pwnable환경을 세팅해주는데도 몇십분 이상이 걸린다.  또한 용량도 많이 차지한다. 저도 처음에는 컴퓨터가 windows 8.1이라서 Docker Desktop도 안깔리고 wsl2도 안되서 어쩔 수 없이 vmware를 사용했다. 이번에 노트북을 사면서 windows10의 기능을 활용하고자 wsl2를 사용하다가 wsl2는 20.04, 18.04밖에 지원 안해서 결국 Docker Desktop을 찾게 되었다. Docker를 사용하면 vmware와 다르게 OS의 이미지를 받아와서 ubuntu환경을 실행하는데 단 1분도 걸리지 않는다.

 

 

Docker는 Container단위로 독립된 환경에서 실행이 된다. Docker image를 하나 빌드해놓고 똑같은 Docker image로 Container를 여러개 만들면 똑같은 OS환경이 Container단위로 격리되어서 실행되서 똑같은 image라고 하더라도 독립된 환경을 여러개 생성하는게 가능해진다. Docker는 Container단위로 격리되서 실행된다는 점과 용량이 작고 간단하고 빠르게 원하는 환경을 구축할 수 있다는 이점이 있어서 CTF나 Wargame문제 서버를 제작할때도 애용된다. 거의 대부분의 CTF와 Wargame문제 서버는 Docker로 구축된다.

 

 

그러면 이렇게 장점이 많은 Docker로 pwnable문제를 풀기 위한 환경을 ubuntu버전별로 세팅해볼것이다. 가장 많이 쓰이는 ubuntu 16.04, 18.04, 20.04, 21.10이렇게 4가지 버전을 들고왔다. 18.04, 20.04, 21.10은 스크립트가 비슷한데 16.04는 ruby버전과 python3버전때문에 스크립트가 살짝 다르다. 16.04에는 seccomp-tools가 잘 설치가 안되길래 뺐다. seccomp걸린 문제 확인할때는 다른 버전에서 확인만 하고 돌아오도록 하는걸로...

 

 

Docker image를 제작할때는 Dockerfile이라는 스크립트 파일을 이용해서 제작한다. Dockerfile에서 가장 많이 쓰이는 명령으로는 RUN명령어가 있는데 RUN apt update를 하면 apt update가 실행이 된다. 명령어 이름에서 알 수 있듯이 셸 명령어를 실행시켜주는 녀석이다. Dockerfile을 다 작성하면 Dockerfile내용대로 빌드하고 Docker image가 생성되게 된다. Dockerfile내용대로 세팅된 image이다. image를 docker run명령어나 Docker Desktop이용해서 실행시켜주면 Container가 생기게 된다. 우리는 환경이 구축된 Container안에서 pwnable을 하면 된다.

 

 

그럼 제가 작성한 pwnable용 ubuntu image를 생성하는 Dockerfile을 공유하도록 하겠습니다.

 

 

ubuntu 16.04

 

 

FROM ubuntu:16.04

ARG DEBIAN_FRONTEND=noninteractive

ENV TZ Asia/Seoul
ENV PYTHONIOENCODING UTF-8
ENV LC_CTYPE C.UTF-8

WORKDIR /root

RUN apt update && apt install -y netcat
RUN apt update && apt install vim git gcc ssh curl wget gdb sudo zsh python3 python3-dev python3-pip libffi-dev build-essential libssl-dev libc6-i386 libc6-dbg gcc-multilib make -y

RUN dpkg --add-architecture i386
RUN apt update
RUN apt install libc6:i386 -y

RUN pip3 install unicorn
RUN pip3 install keystone-engine
RUN pip3 install -U pip==20.3.4
RUN pip3 install -U pwntools
RUN pip3 install capstone ropper
RUN pip3 install ropgadget
RUN apt install libcapstone-dev -y

RUN wget https://github.com/hugsy/gef/archive/refs/tags/2020.03.tar.gz
RUN tar -xzvf 2020.03.tar.gz
RUN echo source ~/gef-2020.03/gef.py >> ~/.gdbinit

RUN apt install ruby-full -y
RUN apt install ruby-dev -y
RUN gem install one_gadget -v 1.7.3

RUN wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh || true
RUN mkdir -p "$HOME/.zsh"
RUN git clone https://github.com/sindresorhus/pure.git "$HOME/.zsh/pure"
RUN echo "fpath+=("$HOME/.zsh/pure")\nautoload -U promptinit; promptinit\nprompt pure" >> ~/.zshrc

RUN git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
RUN echo "source ./zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc

RUN git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
RUN echo "source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh" >> ~/.zshrc
RUN echo "ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=111'" >> ~/.zshrc

 

 

ubuntu 18.04

 

FROM ubuntu:18.04

ARG DEBIAN_FRONTEND=noninteractive

ENV TZ Asia/Seoul
ENV PYTHONIOENCODING UTF-8
ENV LC_CTYPE C.UTF-8

WORKDIR /root

RUN apt update && apt install -y netcat
RUN apt install vim git gcc ssh curl wget gdb sudo zsh python3 python3-pip libffi-dev build-essential libssl-dev libc6-i386 libc6-dbg gcc-multilib make -y

RUN dpkg --add-architecture i386
RUN apt update
RUN apt install libc6:i386 -y

RUN python3 -m pip install --upgrade pip
RUN pip3 install unicorn
RUN pip3 install keystone-engine
RUN pip3 install pwntools
RUN pip3 install ropgadget
RUN apt install libcapstone-dev -y

RUN git clone https://github.com/hugsy/gef ./gef
RUN echo source ~/gef/gef.py >> ~/.gdbinit

RUN apt install ruby-full -y
RUN gem install one_gadget seccomp-tools

RUN wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh || true
RUN mkdir -p "$HOME/.zsh"
RUN git clone https://github.com/sindresorhus/pure.git "$HOME/.zsh/pure"
RUN echo "fpath+=("$HOME/.zsh/pure")\nautoload -U promptinit; promptinit\nprompt pure" >> ~/.zshrc

RUN git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
RUN echo "source ./zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc

RUN git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
RUN echo "source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh" >> ~/.zshrc
RUN echo "ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=111'" >> ~/.zshrc

 

 

ubuntu 20.04

 

 

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

ENV TZ Asia/Seoul
ENV PYTHONIOENCODING UTF-8
ENV LC_CTYPE C.UTF-8

WORKDIR /root

RUN apt update && apt install -y netcat
RUN apt install vim git gcc ssh curl wget gdb sudo zsh python3 python3-pip libffi-dev build-essential libssl-dev libc6-i386 libc6-dbg gcc-multilib make -y

RUN dpkg --add-architecture i386
RUN apt update
RUN apt install libc6:i386 -y

RUN python3 -m pip install --upgrade pip
RUN pip3 install unicorn
RUN pip3 install keystone-engine
RUN pip3 install pwntools
RUN pip3 install ropgadget
RUN apt install libcapstone-dev -y

RUN git clone https://github.com/hugsy/gef ./gef
RUN echo source ~/gef/gef.py >> ~/.gdbinit

RUN apt install ruby-full -y
RUN gem install one_gadget seccomp-tools

RUN wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh || true
RUN mkdir -p "$HOME/.zsh"
RUN git clone https://github.com/sindresorhus/pure.git "$HOME/.zsh/pure"
RUN echo "fpath+=("$HOME/.zsh/pure")\nautoload -U promptinit; promptinit\nprompt pure" >> ~/.zshrc

RUN git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
RUN echo "source ./zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc

RUN git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
RUN echo "source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh" >> ~/.zshrc
RUN echo "ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=111'" >> ~/.zshrc

 

 

ubuntu 21.10

 

 

FROM ubuntu:21.10

ARG DEBIAN_FRONTEND=noninteractive

ENV TZ Asia/Seoul
ENV PYTHONIOENCODING UTF-8
ENV LC_CTYPE C.UTF-8

WORKDIR /root

RUN apt update && apt install -y netcat
RUN apt install vim git gcc ssh curl wget gdb sudo zsh python3 python3-pip libffi-dev build-essential libssl-dev libc6-i386 libc6-dbg gcc-multilib make -y

RUN dpkg --add-architecture i386
RUN apt update
RUN apt install libc6:i386 -y

RUN python3 -m pip install --upgrade pip
RUN pip3 install unicorn
RUN pip3 install keystone-engine
RUN pip3 install pwntools
RUN pip3 install ropgadget
RUN apt install libcapstone-dev -y

RUN git clone https://github.com/hugsy/gef ./gef
RUN echo source ~/gef/gef.py >> ~/.gdbinit

RUN apt install ruby-full -y
RUN gem install one_gadget seccomp-tools

RUN wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh || true
RUN mkdir -p "$HOME/.zsh"
RUN git clone https://github.com/sindresorhus/pure.git "$HOME/.zsh/pure"
RUN echo "fpath+=("$HOME/.zsh/pure")\nautoload -U promptinit; promptinit\nprompt pure" >> ~/.zshrc

RUN git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
RUN echo "source ./zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc

RUN git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
RUN echo "source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh" >> ~/.zshrc
RUN echo "ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=111'" >> ~/.zshrc

 

 

pwnable용 ubuntu환경을 구축하는 Dockerfile들입니다. 이 버전들 외에 다른 버전들도 비슷하게 작성해주시면 됩니다.

Dockerfile을 각각 다른 디렉터리에 넣어두고 원하는 Dockerfile이 있는 디렉터리로 가셔서 docker build -t [imagename]:[tag] . 명령을 실행하면 작성한 Dockerfile대로 Docker image가 빌드하는 모습을 보실 수 있습니다.

 

 

 

4개의 Docker image가 모두 빌드된 모습입니다. 빌드는 image 1개당 웬만해선 30분 안에 완료됩니다. Docker Desktop을 보면 image 1개당 대략 1GB정도의 용량을 차지한다는걸 볼 수 있는데 매우 적은 용량입니다. 

 

 

 

image에 커서를 가져가면 뜨는 RUN버튼을 눌러주시고 Container이름을 지정해주면 Docker Container가 생성됩니다.

 

 

 

생성된 Container에 zsh로 접속하면 이쁜 디자인의 shell을 볼 수 있습니다. 위에 사진에 보이다시피 gef, pwntools등 pwnable에 필요한 대부분의 요소들이 깔려있는 Container를 사용할 수 있습니다. 이제 저 환경에서 pwnable을 해주시면 됩니다.

 

 

Visual Studio Code랑 Docker랑 연동해서 편하게 작업하는것도 있던데 이것도 한번 찾아봐야겠네요.

반응형
Comments