Snipe-IT is one of the most widely deployed open-source IT asset management platforms, used by organizations to track hardware assets, software licenses with serial keys, accessories, and consumables. It holds two categories of particularly sensitive data: the complete hardware inventory mapping all devices to employees, and software license serial numbers including volume license keys for enterprise software like Microsoft Office, Windows, Adobe Creative Cloud, and other commercial products. Key assessment areas: the Snipe-IT REST API token provides complete asset and license enumeration; the Laravel APP_KEY in .env decrypts encrypted database fields; software license serial keys are stored in the licenses table; LDAP bind credentials are stored in the settings table; and the complete user-to-asset assignment data maps the organization's employee hardware allocation. This guide covers systematic Snipe-IT security assessment.
# Snipe-IT — API token authentication and hardware asset enumeration
SNIPEIT_URL="https://snipeit.example.com"
API_TOKEN="your-snipeit-api-token"
# Test API access and verify current user
curl -s "${SNIPEIT_URL}/api/v1/users/me" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Accept: application/json" 2>/dev/null | python3 -c "
import json,sys
d=json.load(sys.stdin)
print(f'User: {d.get(\"username\")} name={d.get(\"name\")} email={d.get(\"email\")}')
perms = d.get('permissions',{})
print(f'Superadmin: {perms.get(\"superadmin\")} admin: {perms.get(\"admin\")}')
" 2>/dev/null
# Enumerate all hardware assets — complete hardware inventory
curl -s "${SNIPEIT_URL}/api/v1/hardware?limit=500&offset=0" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Accept: application/json" 2>/dev/null | python3 -c "
import json,sys
d=json.load(sys.stdin)
assets = d.get('rows',[])
total = d.get('total',0)
print(f'Hardware assets: {total}')
for a in assets[:20]:
assigned = a.get('assigned_to',{}) or {}
print(f' [{a.get(\"id\")}] {a.get(\"name\")} tag={a.get(\"asset_tag\")} serial={a.get(\"serial\")}')
print(f' Model: {a.get(\"model\",{}).get(\"name\")} manufacturer={a.get(\"model\",{}).get(\"manufacturer\",{}).get(\"name\")}')
print(f' Assigned to: {assigned.get(\"name\")} ({assigned.get(\"type\")}) location={a.get(\"location\",{}).get(\"name\")}')
" 2>/dev/null
# Enumerate all users — complete employee/user list with asset counts
curl -s "${SNIPEIT_URL}/api/v1/users?limit=500" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Accept: application/json" 2>/dev/null | python3 -c "
import json,sys
d=json.load(sys.stdin)
users = d.get('rows',[])
print(f'Users: {d.get(\"total\",0)}')
for u in users[:20]:
print(f' [{u.get(\"id\")}] {u.get(\"username\")} name={u.get(\"name\")} email={u.get(\"email\")}')
print(f' Department: {u.get(\"department\",{}).get(\"name\")} location={u.get(\"location\",{}).get(\"name\")} assets={u.get(\"assets_count\")}')
" 2>/dev/null
# Snipe-IT software license enumeration — serial key extraction
SNIPEIT_URL="https://snipeit.example.com"
API_TOKEN="your-snipeit-api-token"
# Enumerate all software licenses — serial keys for all tracked software
curl -s "${SNIPEIT_URL}/api/v1/licenses?limit=500" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Accept: application/json" 2>/dev/null | python3 -c "
import json,sys
d=json.load(sys.stdin)
licenses = d.get('rows',[])
total = d.get('total',0)
print(f'Software licenses: {total}')
for lic in licenses:
cat = lic.get('category',{}) or {}
mfr = lic.get('manufacturer',{}) or {}
print(f' [{lic.get(\"id\")}] {lic.get(\"name\")} mfr={mfr.get(\"name\")} seats={lic.get(\"seats\")}')
print(f' Serial: {lic.get(\"serial\")} product_key={lic.get(\"product_key\")}')
print(f' Purchase price: {lic.get(\"purchase_cost\")} Expiry: {lic.get(\"expiration_date\")}')
" 2>/dev/null
# Get license seats — maps individual license key assignments to users
LICENCE_ID="1"
curl -s "${SNIPEIT_URL}/api/v1/licenses/${LICENCE_ID}/seats" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Accept: application/json" 2>/dev/null | python3 -c "
import json,sys
d=json.load(sys.stdin)
seats = d.get('rows',[])
print(f'License seats: {d.get(\"total\",0)}')
for s in seats:
assigned = s.get('assigned_to',{}) or {}
print(f' Seat {s.get(\"id\")}: {assigned.get(\"name\")} ({assigned.get(\"type\")}) license_key={s.get(\"license_key\")}')
" 2>/dev/null
# Snipe-IT .env and LDAP credential extraction
# Laravel .env — APP_KEY and database credentials
cat /var/www/html/snipeit/.env 2>/dev/null | grep -E "APP_KEY|DB_PASSWORD|DB_USERNAME|MAIL_PASSWORD|LDAP"
# APP_KEY — Laravel encryption key for encrypted database fields
# DB_PASSWORD — MySQL database password
# MAIL_PASSWORD — SMTP password for email notifications
# LDAP_BINDDN, LDAP_BINDPW — Active Directory bind credentials
# LDAP bind credentials in Snipe-IT settings (also in .env)
mysql -u snipeit -p"DB_PASSWORD" snipeit 2>/dev/null << 'EOF'
SELECT name, value FROM settings
WHERE name IN ('ldap_server', 'ldap_username', 'ldap_password',
'ldap_binddn', 'ldap_bindpw', 'mail_password',
'slack_endpoint', 'google_client_secret');
EOF
# ldap_password — Active Directory bind password (may be in .env or settings table)
# slack_endpoint — Slack webhook URL for notifications
# google_client_secret — Google OAuth application secret
| Security Test | Method | Risk |
|---|---|---|
| Software license serial key enumeration | GET /api/v1/licenses with API token — returns all software licenses with serial numbers and product keys; enterprise volume license keys for Microsoft, Adobe, and other commercial software; enables unauthorized software activation or resale of license keys | Critical |
| Hardware asset and user assignment enumeration | GET /api/v1/hardware — returns all IT assets with serial numbers, models, and employee assignments; complete hardware inventory mapping all devices to users, departments, and locations | High |
| Laravel APP_KEY extraction for decryption and session forgery | Read /var/www/html/snipeit/.env — APP_KEY enables decrypting any encrypted Snipe-IT database fields and forging Laravel session cookies for any user account | Critical |
| LDAP bind credential extraction | Read .env or MySQL settings table — LDAP_BINDPW / ldap_password for Active Directory bind account; enables AD enumeration with the Snipe-IT service account credentials | High |
| Employee directory and organizational structure | GET /api/v1/users — returns all employees with usernames, emails, departments, locations, and asset counts; complete organizational chart and directory for social engineering targeting | High |
Ironimo tests Snipe-IT deployments for API token asset and license serial key enumeration, Laravel APP_KEY extraction from .env, software license product key disclosure, LDAP bind credential access, employee directory and asset assignment enumeration, SMTP credential extraction from settings, API token permission scope assessment, and network-level exposure verification.
Start free scan