18th 2018 PoC 해킹캠프 cntdic #구축편

18th 2018 PoC 하계 해킹캠프 문제 구축&풀이 여행 - #구축편

18th 2018 PoC 해킹캠프 cntdic #구축편

시작하기 전에..

18 회 해킹캠프가 2일 남은 오늘 글을 쓰고 있습니다! (물론 이 글은 해킹캠프가 끝난 이후에 올라갑니다)

이번에 내부 CTF 양산형 포너블 문제로 cntdic 이라는 문제를 냈는데요, Countries Dictionary 의 줄인말로 나라를 관리할 수 있는 사전을 구현한 문제고, 100% 단일 스레드 스택 기반 트릭을 의도하고 냈으며, 구조체를 사용한 간단한 포너블 문제입니다.

해킹캠프가 얼마 남지 않았으니 이제 슬슬 구축해야겠다.. 라고 생각했고, 내 서버도 있겠다 하고 제 서버에 구축을 하기로 결정했습니다.

저번 CTF 때 구축시 쌩으로 호스트에 계정을 만들고 올렸었는데, 그 때는 서버가 거의 아무 용도로 사용하지 않아서 별로 신경을 안썼었습니다.

그러나 이번에는 git 서비스, 블로그, 메일 서비스 을 구축함으로써, 혹시 모를 문제가 생길 가능성이 있기 때문에

저보다 잘하는 분들이 많이 오시니까 절대로 털리면 안되잖아요?

그래서 Docker 를 사용하고, 배울 겸 구축 여행기를 올리고, 올리는 김에 별거 없지만 풀이도 올리려고 합니다.

구축 환경

Server Region : Tokyo
Server OS : Ubuntu 18.04 64 bit
Server UFW Status : Inactive
Binary : ELF 32-bit, for GNU/Linux 2.6.32, stripped

구축 시작!

모든 구축 과정은 root 계정으로 로그인 하여 진행하였습니다.

먼저 xinetd 와 32비트 바이너리를 64비트에서 실행하기 위해 gcc-multilib 을 설치하겠습니다.

apt install gcc-multilib xinetd

apt-install-1

32 비트 바이너리가 잘 실행이 되는지 확인해보겠습니다.

run_check

바이너리가 잘 동작하는 것은 확인 했으니, 이제 폴더를 정리하겠습니다.

먼저 pwnable-cntdic 폴더를 만들어주고,

mkdir pwnable-cntdic && cd pwnable-cntdic

이제 그 안에 xinetd 파일에 이렇게 씁시다.

service cntdic 
{
    disable     = no
    type        = UNLISTED
    wait        = no
    server      = /home/cntdic/cntdic
    socket_type = stream
    protocol    = tcp
    user        = cntdic
    port        = 1800
    flags       = REUSE
}

그리고 home 폴더를 만들어 cntdic 바이너리와 플래그 파일을 넣어줍니다.

이제 본격적으로 도커를 설치하고 설정해보겠습니다

도커 설치는 다음 명령어를 통해 진행할 수 있습니다.

curl -sL https://get.docker.com/ | sh

docker-install

도커가 설치되었는지 확인해보고,

docker version

docker-version

도커 이미지 실행을 깔끔하고 편하게 위해서 Composer 도 설치해주고, 설치 확인까지 해보겠습니다.

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version

docker-compose

다음은, docker-compose.yml 파일을 넣어줍시다. (cat > docker-compose.yml 등을 이용)

version: '2.4'

services:
    cntdic:
        build: ./
        ports:
            - "1800:1800"

그리고 마지막으로 Dockerfile 를 만들겠습니다.

FROM ubuntu:18.04
RUN apt update
RUN apt install xinetd -y
RUN apt install libc6-dev-i386 -y
RUN useradd -mU cntdic
COPY ./home /home/cntdic
COPY ./xinetd /etc/xinetd.d/cntdic
RUN chmod 750 /home/cntdic /home/cntdic/cntdic
RUN chmod 440 /home/cntdic/flag
RUN chown -R root:cntdic /home/cntdic
CMD ["/usr/sbin/xinetd","-dontfork"]

그 다음 docker-compose 로 실행시키겠습니다.

docker-compose up -d

docker-compose-up-1

이렇게 Creating pwnable-cntdic_cntdic ... done 가 뜨고 nc 연결이 가능해진 것을 확인할 수 있습니다.

실행중인 컨테이너를 확인해보면 또한 컨테이너가 잘 생성되었다는 것을 알 수 있습니다.

docker ps

docker-final-ps

그리고 이 컨테이너를 종료하고 싶다면

docker-compose down

docker-compose-down

이 명령어를 사용하시면 됩니다.

출처 및 라이센스

이 글의 일부 내용은 KSHMK 님의 블로그에서 가져왔으며, (링크) 라이센스의 사용 조건에 따라 이 글의 라이센스 또한 CC BY-NC-SA 4.0 을 따릅니다.