ハッキングラボで楽しく遊びたかった その1

超スローペース
dockerイメージ構築まで

ハッキングラボ

ちょっと前のセールで安く買えたので楽しく遊ぶ。

環境はWindows10pro 64bit + docker toolbox
dockerでkali linuxのコンテナ立ち上げてデスクトップ環境作ってリモートで遊びたい。
本書ではVirtualBoxが推奨されてるし、普段docker toolbox使ってるんだから別にそっちに直接インストールしても良かったんだけど、せっかくだからデスクトップ環境に親しみたかった。
(本当はhyper-v使いたいんだよ, 切実に)

docker初心者があれこれやってるだけの記事だぞ

環境

Windows10 Pro上にWSL(ubuntu 18.04)とDocker Toolbox(VirtualBox)を導入し、
WSL上のdockerクライアント(19.03.6)からVirtualBox上のdockerデーモンにフォワーディングする。

VMの起動とサスペンドを自動化するため、VBoxHeadlessTrayを導入する。
対応するVirtualBoxのバージョンを2020年4月現在最新の6.1.0にする。

VirtualBox6.1.0に対応するExtension Packを導入する。
https://download.virtualbox.org/virtualbox/6.1.0/Oracle_VM_VirtualBox_Extension_Pack-6.1.0.vbox-extpack

以下、基本的にdockerコンテナを構築してハッキングラボを作成する。

dockerのインストール

1. dockerのインストール。
大筋はhttps://docs.docker.com/install/linux/docker-ce/ubuntu/ に従う。

2. WSLのマウントポイントの修正を行う。

$ nano /etc/wsl.conf
[automount]
root = /
options = "metadata"

3. docker quickstart terminal等からdockerホストのIPアドレスを調べる
f:id:sibogli:20200422010458p:plain

4. ~/.profileに以下を記述

$ nano ~/.profile
export DOCKER_HOST=tcp://{dockerホストのIPアドレス, 上記画像なら192.168.99.100}:2376
export DOCKER_CERT_PATH=/c/Users/{ユーザー名}/.docker/machine/certs
export DOCKER_TLS_VERIFY=1
export COMPOSE_TLS_VERSION=TLSv1_2

5. 自動起動設定

sudo systemctl enable docker

6. WSLの再起動

Kali Linuxコンテナの作成

本書で用いるペネトレーションテスト用のディストロだそうです。

Kali Linux公式を見ると、継続的にアップデートされるローリング版と、
複数回のアップデート毎に更新されるいわばリリース版とがあるらしい。
https://www.kali.org/docs/containers/official-kalilinux-docker-images/

後者のリリース版は更新間隔が長いため、
バグフィックス等のマイナーアップデートがどうしても欲しくなると予想してここはローリング版を選択。

docker pull kalilinux/kali-rolling

デスクトップ環境とRDPはLXDE + xorgxrdp + XRDPで構成してます。

Dockerfile群

デスクトップ環境の構築は先駆者が相当数いらっしゃったのでかなり参考にしました。
中でもyama07さんの物をベースにしています。
github.com

とりあえず本書を読み進めたいので、イメージの洗練は後でやります。
イメージサイズも肥大化(1.7GBほど)してるし、正直美しくないのですが、なんかいい感じのアドバイス貰えるかもしれないので晒します。

構成

.
|-- .docker
|   |-- Dockerfile
|   |-- docker-entrypoint.sh
|   `-- env
`-- docker-compose.yml

docker-compose.yml

version: '3.5'
services:
    lab:
        container_name: lab
        build: 
            context: .
            dockerfile: $PWD/.docker/Dockerfile
        tty: true
        stdin_open: true
        command: supervisord
        env_file:
            - $PWD/.docker/env
        networks:
            - lab
        ports:
            - 3390:3389
        restart: always

networks:
    lab:
        ipam:
            config:
                - subnet: 172.16.11.0/24

.docker/Dockerfile

FROM kalilinux/kali-rolling:latest

# ---------------
# Kali Linux setup 
# ---------------
ENV DEBIAN_FRONTEND=noninteractive

RUN apt update \
    && apt install -y --no-install-recommends kali-linux-core kali-desktop-lxde \
    gconf2 locales supervisor wget xorgxrdp xrdp \
    && apt install -y --install-recommends task-japanese task-japanese-desktop uim uim-mozc \
    && apt remove -y uim-anthy \
    && apt autoremove -y \
    && apt clean autoclean \
    && rm -rf /var/lib/{apt,dpkg,cache,lists,log}/ \
    && rm -rf /var/cache/apt/archives/*

RUN echo 'startlxde' > /etc/skel/.xsession \
    && install -o root -g xrdp -m 2775 -d /var/run/xrdp \
    && install -o root -g xrdp -m 3777 -d /var/run/xrdp/sockdir \
    && install -o root -g root -m 0755 -d /var/run/dbus \
    && install -o root -g root -m 0777 -d /var/log/xorgxrdp

RUN echo 'ALL ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/ALL

RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && echo 'Asia/Tokyo' > /etc/timezone

RUN locale-gen ja_JP.UTF-8 \
    && localedef -f UTF-8 -i ja_JP ja_JP \
    && echo 'LC_ALL=ja_JP.UTF-8' > /etc/default/locale \
    && echo 'LANG=ja_JP.UTF-8' >> /etc/default/locale

RUN chmod u+s /usr/sbin/useradd \
    && chmod u+s /usr/sbin/groupadd

# xrdp-sesman[9]: pam_unix(xrdp-sesman:auth): Couldn't open /etc/securetty: No such file or directory
RUN touch /etc/securetty \
    && chown xrdp:xrdp /etc/securetty

# [ERROR] Cannot read private key file /etc/xrdp/key.pem: Permission denied
RUN adduser xrdp ssl-cert

# Cannot open log file ".xorgxrdp.10.log"
RUN sed 's/.xorgxrdp.%s.log/\/var\/log\/xorgxrdp\/.xorgxrdp.%s.log/' -i /etc/xrdp/sesman.ini

# No session for pid xxxx
RUN mv /usr/bin/lxpolkit /usr/bin/lxpolkit.bak

# dconf-WARNING **: 16:05:43.242: failed to commit changes to dconf: 子プロセス“dbus-launch”の起動に失敗しました (そのようなファイルやディレクトリはありません)
RUN dbus-uuidgen --ensure=/etc/machine-id

WORKDIR /etc/xrdp
RUN wget http://w.vmeta.jp/temp/km-0411.ini \
    && chmod 644 km-0411.ini \
    && ln -s km-0411.ini km-e0010411.ini \
    && ln -s km-0411.ini km-e0200411.ini \
    && ln -s km-0411.ini km-e0210411.ini


# ---------------
# supervisor setup 
# ---------------
RUN echo '[supervisord] \n\
nodaemon=true \n\
user=root \n\
logfile=/var/log/supervisor/supervisord.log \n\
\n\
[program:dbus] \n\
command=/usr/bin/dbus-daemon --system --nofork --nopidfile \n\
stdout_logfile=/var/log/supervisor/jobs/dbus.log \n\
stdout_logfile_maxbytes=1MB \n\
stdout_logfile_backups=5 \n\
stdout_capture_maxbytes=1MB \n\
redirect_stderr=true \n\
\n\
[program:xrdp-sesman] \n\
command=/usr/sbin/xrdp-sesman --nodaemon \n\
stdout_logfile=/var/log/supervisor/jobs/xrdp-sesman.log \n\
stdout_logfile_maxbytes=1MB \n\
stdout_logfile_backups=5 \n\
stdout_capture_maxbytes=1MB \n\
redirect_stderr=true \n\
\n\
[program:xrdp] \n\
command=/usr/sbin/xrdp --nodaemon \n\
user=xrdp \n\
stdout_logfile=/var/log/supervisor/jobs/xrdp.log \n\
stdout_logfile_maxbytes=1MB \n\
stdout_logfile_backups=5 \n\
stdout_capture_maxbytes=1MB \n\
redirect_stderr=true' > /etc/supervisor/conf.d/xrdp.conf \
    && mkdir -p /var/log/supervisor/jobs


# ---------------
# Kali Linux setup
# ---------------
RUN apt remove -y --purge libreoffice* \
    && apt autoremove -y \
    && apt clean autoclean \
    && rm -rf /var/lib/{apt,dpkg,cache,lists,log}/ \
    && rm -rf /var/cache/apt/archives/*

WORKDIR /var/log

COPY ./.docker/docker-entrypoint.sh /tmp
RUN chmod +x /tmp/docker-entrypoint.sh
ENTRYPOINT ["/tmp/docker-entrypoint.sh"]

.docker/docker-entrypoint.sh

#!/bin/bash -e

USER=${USER:-${DEFAULT_USER}}
GROUP=${GROUP:-${USER}}
PASSWD=${PASSWD:-${DEFAULT_PASSWD}}
unset DEFAULT_USER DEFAULT_PASSWD

# Add group 
if [[ ! $(getent group ${GROUP}) ]]; then
    echo "add group: ${GROUP}"
    groupadd ${GROUP}
fi

# Add user
if [[ ! $(getent passwd ${USER}) ]]; then
    export HOME=/home/${USER}

    echo "add user: ${USER}"
    useradd -d ${HOME} -m -s /bin/bash -g ${GROUP} ${USER}

    # Set login password
    echo "set password: $PASSWD"
    echo ${USER}:${PASSWD} | sudo chpasswd

    [[ ! -e ${HOME}/.xsession ]] && \
        cp /etc/skel/.xsession ${HOME}/.xsession
fi
unset GROUP

sudo chmod u-s /usr/sbin/useradd
sudo chmod u-s /usr/sbin/groupadd

if [ ! -d "/tmp/init_check" ]; then
    mkdir -p /tmp/init_check

    [[ ! -e /etc/xrdp/rsakeys.ini ]] && \
        sudo -u xrdp -g xrdp xrdp-keygen xrdp /etc/xrdp/rsakeys.ini > /dev/null 2>&1
fi

# warning: password autofill
sed "s/username=ask\S*/username=ask${USER}/" -i /etc/xrdp/xrdp.ini
sed "s/password=ask\S*/password=ask${PASSWD}/" -i /etc/xrdp/xrdp.ini
unset USER PASSWD

set -- /usr/bin/supervisord -c /etc/supervisor/conf.d/xrdp.conf

exec "$@"

.docker/env

DEFAULT_USER=rdp
DEFAULT_PASSWD=pass

LANG=ja_JP.UTF-8
LANGUAGE=ja_JP:ja
LC_ALL=ja_JP.UTF-8

理解の向こう側

  • IMをuim-mozcで妥協した
    • 本当はibusかfcitx使いたかったんだけど、mozcとanthyをどうにも上手く認識してくれない
    • anthyは使いにくかったから嫌い
  • 検証のたびにID/PW入力するのダルかったから自動入力するようにした
    • どうせ機密情報なしのコンテナなんだしいいよな

リモート接続

Windowsリモートデスクトップ接続(mstsc.exe)を用いてRDP接続。
{dockerホストのIP}:3390 でアクセス。

(テレワークの癖でずっとlocalhostに接続しようとして失敗してて時間食った, てへ)

nil

やっとコンテナができたのでようやくラボで遊べます。
(とはいえ、その2がいつになるか分かりません)
(新コロ自粛が長続きするならたぶん近いうちに)