Docker

前回はDockerでOpen reflectorの環境を構築する経緯やDDoS攻撃のアンプ・リフレクションについてご紹介しました。
今回は具体的にどのようにDockerを構築したのか技術的な内容を中心に解説させていただきます。
ここでご紹介するコードや環境を改変して攻撃を行うのは絶対にいけません。不正アクセスになりますので、自分のPCの環境内で学習目的でご利用ください。

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

DDoS Docker Containers

まず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を楽しんでください!

 

関連リンク