2020年6月24日

さくっとDockerでOpen reflectorの環境を構築(Part2)

最終更新: 2023年7月3日

前回はDockerでOpen reflectorの環境を構築する経緯やDDoS攻撃のアンプ・リフレクションについてご紹介しました。
 

 
今回は具体的にどのようにDockerを構築したのか技術的な内容を中心に解説させていただきます。
 

 
ここでご紹介するコードや環境を改変して攻撃を行うのは絶対にいけません。不正アクセスになりますので、自分のPCの環境内で学習目的でご利用ください。
 


 
さっと環境についておさらいします。
 

 
Dockerホストで構築した環境は攻撃者のコンテナとOpen Reflectorのコンテナ、そして攻撃先となるWebコンテナから構成されています。下の絵の様な感じです。
 


 
まずdocker-compose ファイルから解説します。イメージを準備した後、このファイルのように作成するとdocker-compose up -dを実行することで、簡単にdocker環境がたちあがります。
 

 
以下ファイルの中身になります。
 


 

 
version: '3'

services:
 

 
target:
 

 
build: ../image/target
 

 
image: target
 

 
container_name: target
 

 
cap_add:
 

 
- ALL
 

 
networks:
 

 
1_user_net:
 

 
ipv4_address: 172.16.0.200
 

 
volumes:
 

 
- /media/sf_share:/share

dns1:
 

 
build: ../image/dns
 

 
image: dns
 

 
container_name: dns1
 

 
cap_add:
 

 
- ALL
 

 
networks:
 

 
1_user_net:
 

 
ipv4_address: 172.16.0.101
 

 
volumes:
 

 
- ./docker/dns/zones:/data/zones
 

 
- ./docker/dns/conf:/data/conf
 

 
- /media/sf_share:/share

dns2:
 

 
build: ../image/dns
 

 
image: dns
 

 
container_name: dns2
 

 
cap_add:
 

 
- ALL
 

 
networks:
 

 
1_user_net:
 

 
ipv4_address: 172.16.0.102
 

 
volumes:
 

 
- ./docker/dns/zones:/data/zones
 

 
- ./docker/dns/conf:/data/conf
 

 
- /media/sf_share:/share

dns3:
 

 
build: ../image/dns
 

 
image: dns
 

 
container_name: dns3
 

 
cap_add:
 

 
- ALL
 

 
networks:
 

 
1_user_net:
 

 
ipv4_address: 172.16.0.103
 

 
volumes:
 

 
- ./docker/dns/zones:/data/zones
 

 
- ./docker/dns/conf:/data/conf
 

 
- /media/sf_share:/share

attack-dns:
 

 
build: ../image/attack_dns
 

 
image: attack-dns
 

 
container_name: attack-dns
 

 
cap_add:
 

 
- ALL
 

 
networks:
 

 
1_user_net:
 

 
ipv4_address: 172.16.0.50
 

 
dns:
 

 
- 172.16.0.100

networks:
 

 
1_user_net:
 

 
driver: bridge
 

 
ipam:
 

 
driver: default
 

 
config:
 

 
- subnet: 172.16.0.0/24


 


 
上から解説しますと、servicesの下にコンテナを定義しています。targetが今回攻撃先となるコンテナになり、起動時にIPアドレスを172.16.0.200を割り当てています。
 

 
dns1~3まで、open reflectorになります。IPアドレスはそれぞれ172.16.0.101~103を割り当ててます。
 

 
attack-dnsは攻撃者のコンテナになります。IPアドレスは172.16.0.50を割り当ててます。
 

 
ここまで見ていただくとコンテナのイメージをビルドしてそのイメージでDockerコンテナが作成されます。open reflectorは共通のイメージを利用していますので、ここで必要な数のコンテナを起動するともっと多くのOpen reflectorを立ち上げることができます。
 


 
では今度はコンテナの元となるイメージをビルドするためのDcokerfileを見ていきます。
 

 
以下は攻撃先としているtargetコンテナで利用されているイメージのDockerfileになります。
 

 
このファイルに基づいてビルドされ、イメージファイルが作成されます。そしてそのイメージからコンテナが作成されます。
 

 
このイメージはコンテナ上で攻撃パケット収集ができるようにtcpdumpなどインストールしています。
 


 

 
FROM ubuntu:18.04

ENV HOME=/root DEBIAN_FRONTEND=noninteractive TZ=Asia/Tokyo
 

 
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# Install packages
 

 
RUN apt-get update

# Install the required packages for desktop
 

 
RUN apt-get install -y supervisor wget curl net-tools vim-tiny
 

 
#Install network utility
 

 
RUN apt-get install -y apache2 tcpdump iproute2 iputils-ping dnsutils
 

 
# Clean up
 

 
RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*

COPY supervisord/* /etc/supervisor/conf.d/
 

 
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]
 


 
次のDockerfileはOpen reflectorとなるDNSです。bindの他tcpdumpなどがインストールされています。
 

 
今回はどこからでもキャッシュDNSとして利用できるようにセキュリティ対策していないDNS設定にしております。
 


 

 
FROM ubuntu:18.04

ENV HOME=/root DEBIAN_FRONTEND=noninteractive TZ=Asia/Tokyo
 

 
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update -q
 

 
RUN apt-get -y upgrade
 

 
RUN apt-get -y install supervisor iproute2 iputils-ping tcpdump vim

RUN DEBIAN_FRONTEND=noninteractive apt-get -y install bind9 rsyslog dnsutils
 

 
RUN rm -rf /var/lib/apt/lists/*

COPY conf/* /etc/bind/
 

 
COPY supervisord/* /etc/supervisor/conf.d/
 

 
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]
 


 
下はnamed.confファイルのoptionsの設定になります。allow-recursion { any; }でどこからでも再帰問い合わせができる状態になっております。
 


 

 
options {
 

 
recursion yes;
 

 
allow-recursion { any; };
 

 
allow-query-cache { any; };
 

 
allow-query { any; };
 

 
directory "/var/cache/bind";
 

 
dnssec-validation auto;
 

 
auth-nxdomain no;
 

 
listen-on-v6 { any; };
 

 
};
 


 
次に攻撃者のイメージを構築するための、Dcokerfileになります。dns_amp.pyというスクリプトでDNSアンプ攻撃を行っておりますが、docker起動時にこのスクリプトが実行されるような作りになっております。
 

 
このスクリプトはこちらのページで確認できます。以前scapyをご紹介した時に利用したスクリプトと同じです。
 


 

 
FROM ubuntu:18.04

ENV HOME=/root DEBIAN_FRONTEND=noninteractive TZ=Asia/Tokyo
 

 
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# Install packages
 

 
RUN apt-get update
 

 
RUN apt-get install -y wget curl net-tools iputils-ping dnsutils python3-pip tcpdump
 

 
RUN pip3 install scapy
 

 
# Clean up
 

 
RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*

ADD dns_amp.py /tmp/dns_amp.py
 

 
RUN chmod +x /tmp/dns_amp.py
 

 
CMD ["/tmp/dns_amp.py"]
 


 
今回、docker-composeを利用することで、簡単に環境を構築できましたが、docker関連の詳細は割愛させていただきました。
 

 
ざっくりとした内容ですが、dockerはさくっと環境が構築できるところは魅力的です。皆さんも是非、dockerを楽しんでください!
 

関連リンク

  1. さくっとDockerでOpen reflectorの環境を構築(Part1)

  2. https://www.docker.com/

  3. http://docs.docker.jp/compose/toc.html

  4. ペネトレーションテストに役立つScapy