← Back to Writeups
CUSTOMEasyWeb

CommNet

XESXOR9/10/20262 min read
#web#custom#easy#broken_access_control#idor_exploitation

CommNet

Platform: CUSTOM | Category: Web | Type: Challenge | Difficulty: Easy | OS: N/A | **Author: XESXOR Techniques: broken_access_control, idor_exploitation

Summary

Walkthrough of the CUSTOM Web CommNet. Cut off from each other and besieged by undead propaganda, humanity's survivors rely on CommNet—until the white-hats break in to silence the broadcast and reconnect the enclaves.


title: "CommNet" id: 2026_01_27_hackthebox_commnet category: web difficulty: easy event: Hack The Box tags: ["nodejs", "idor", "express", "access-control", "secure-coding"] techniques: ["broken_access_control", "idor_exploitation"] tools: ["curl", "burp-suite"] indicators: ["m.id = ?", "recipient_id IS NULL"]

CommNet — Hack The Box

Description

Cut off from each other and besieged by undead propaganda, humanity's survivors rely on CommNet—until the white-hats break in to silence the broadcast and reconnect the enclaves.

Analysis

During a source code audit of the CommNet application, critical vulnerabilities were discovered in the message handling mechanism (routes/messages.js):

  1. IDOR (Insecure Direct Object Reference): The GET /api/messages/:id endpoint allowed any authenticated user to view any message in the database by simply specifying its ID. Access control checks (whether the user is the sender or recipient) were missing.
  2. Broadcast message leakage: The general message list (GET /api/messages/) displayed all broadcast messages (recipient_id IS NULL), allowing access to system or confidential information not intended for everyone.
  3. Unauthorized broadcasting: The POST /api/messages/ endpoint allowed any user to send broadcast messages, as there was no role verification when recipient_id was absent.

Solution

To fix the vulnerabilities, the following changes were made to routes/messages.js:

1. Restricting Access to Message List

Removed the OR m.recipient_id IS NULL condition so users only see messages where they are the sender or recipient.

javascript
// Before
WHERE m.sender_id = ? OR m.recipient_id = ? OR m.recipient_id IS NULL

// After
WHERE m.sender_id = ? OR m.recipient_id = ?

2. Fixing IDOR

Added a check to verify the message belongs to the current user when requesting by ID.

javascript
// Before
WHERE m.id = ?

// After
WHERE m.id = ? AND (m.sender_id = ? OR m.recipient_id = ?)

3. Restricting Broadcast Permissions

Added user role verification. Only administrators can send messages without specifying a recipient (broadcast).

javascript
// Added
const userRole = req.session.role;
if (!recipient_id && userRole !== 'admin') {
    return res.status(403).json({ success: false, error: 'Only admins can send broadcasts' });
}

Key Takeaways / Lessons

  • Mastering broken_access_control, idor_exploitation was key to this challenge.
  • Always check for common misconfigurations and verify assumptions.

Crafted by XESXOR Research • 2026-01-27 • CUSTOM • CommNet • Difficulty: Easy