T1108 Splunk · SPL

Detect Redundant Access in Splunk

Adversaries may use more than one remote access tool with varying command and control protocols or credentialed access to remote services so they can maintain access if an access mechanism is detected or mitigated. If one type of tool is detected and blocked or removed as a response but the organization did not gain a full understanding of the adversary's tools and access, then the adversary will be able to retain access to the network. This deprecated technique has been superseded by T1136 (Create Account), T1505/003 (Web Shell), and T1133 (External Remote Services), but the underlying adversary behavior — establishing backup access channels in parallel — remains a critical detection target. Observable patterns include simultaneous deployment of web shells alongside account creation, installation of multiple remote access services within a short window, and evidence of access from multiple distinct toolsets or protocols to the same target environment.

MITRE ATT&CK

Tactic
Defense Evasion Persistence
Canonical reference
https://attack.mitre.org/techniques/T1108/

SPL Detection Query

Splunk (SPL)
spl
| union
  [ search index=wineventlog sourcetype="WinEventLog:Security" (EventCode=4720 OR EventCode=4726 OR EventCode=4738)
    | eval Signal="AccountCreatedOrModified", DeviceName=host, Detail=TargetUserName
    | table _time, DeviceName, Signal, Detail ]
  [ search index=wineventlog sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1
      (Image="*\ngrok.exe" OR Image="*\frpc.exe" OR Image="*\chisel.exe" OR Image="*\plink.exe"
       OR Image="*\AnyDesk.exe" OR Image="*\TeamViewer.exe" OR Image="*\ScreenConnect.exe"
       OR Image="*\vncviewer.exe" OR Image="*\vncserver.exe" OR Image="*\psexec.exe"
       OR (CommandLine="*ngrok*" AND (CommandLine="*tcp*" OR CommandLine="*http*" OR CommandLine="*tunnel*"))
       OR (CommandLine="*frpc*" AND CommandLine="*connect*"))
    | eval Signal="RemoteAccessToolExecution", DeviceName=host, Detail=mvjoin(mvappend(Image, CommandLine)," | ")
    | table _time, DeviceName, Signal, Detail ]
  [ search index=wineventlog sourcetype="WinEventLog:System" (EventCode=7045 OR EventCode=4697)
      (ServiceName="*vnc*" OR ServiceName="*rdp*" OR ServiceName="*ssh*" OR ServiceName="*remote*"
       OR ServiceName="*anydesk*" OR ServiceName="*teamviewer*" OR ServiceName="*screenconnect*"
       OR ServiceFileName="*ngrok*" OR ServiceFileName="*frpc*" OR ServiceFileName="*chisel*")
    | eval Signal="RemoteServiceInstalled", DeviceName=host, Detail=ServiceName
    | table _time, DeviceName, Signal, Detail ]
  [ search index=wineventlog sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=11
      (TargetFilename="*\inetpub*" OR TargetFilename="*\wwwroot*" OR TargetFilename="*\htdocs*")
      (TargetFilename="*.asp" OR TargetFilename="*.aspx" OR TargetFilename="*.php"
       OR TargetFilename="*.jsp" OR TargetFilename="*.jspx" OR TargetFilename="*.shtml")
      NOT (Image="*\w3wp.exe" OR Image="*\httpd.exe" OR Image="*\nginx.exe")
    | eval Signal="WebShellDropped", DeviceName=host, Detail=TargetFilename
    | table _time, DeviceName, Signal, Detail ]
  [ search index=wineventlog sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=13
      (TargetObject="*\CurrentVersion\Run*" OR TargetObject="*\CurrentVersion\RunOnce*")
      (Details="*ngrok*" OR Details="*frpc*" OR Details="*chisel*" OR Details="*anydesk*"
       OR Details="*teamviewer*" OR Details="*vnc*")
    | eval Signal="PersistenceRegistryKey", DeviceName=host, Detail=mvjoin(mvappend(TargetObject,Details)," = ")
    | table _time, DeviceName, Signal, Detail ]
| stats
    count as TotalEvents,
    dc(Signal) as DistinctSignals,
    values(Signal) as SignalTypes,
    values(Detail) as Details,
    earliest(_time) as Earliest,
    latest(_time) as Latest
  by DeviceName
| where DistinctSignals >= 2
| eval TimeWindowMinutes=round((Latest-Earliest)/60,1)
| eval TimeWindowHours=round(TimeWindowMinutes/60,1)
| sort - DistinctSignals TimeWindowMinutes
| table DeviceName, DistinctSignals, SignalTypes, Details, TimeWindowHours, Earliest, Latest
high severity medium confidence

Detects redundant access establishment by unioning five signal streams — account creation (Security EventCodes 4720/4726/4738), remote access tool execution (Sysmon EventCode 1), remote service installation (System EventCodes 7045/4697), web shell file drops to web server directories (Sysmon EventCode 11), and registry run-key persistence of remote tools (Sysmon EventCode 13) — then grouping by host. Hosts generating 2 or more distinct signal types within the search window are flagged. The SPL union approach allows the query to work even when some data sources are missing, degrading gracefully.

Data Sources

Process: Process CreationFile: File CreationWindows Registry: Registry Key ModificationUser Account: User Account CreationService: Service CreationSysmon Event ID 1Sysmon Event ID 11Sysmon Event ID 13Windows Security Event LogWindows System Event Log

Required Sourcetypes

XmlWinEventLog:Microsoft-Windows-Sysmon/OperationalWinEventLog:SecurityWinEventLog:System

False Positives & Tuning

  • IT administrators installing multiple remote management tools during provisioning or maintenance activities
  • Software deployment pipelines that create service accounts and install remote agents automatically during onboarding
  • Penetration testing engagements with authorized deployment of multiple access mechanisms
  • DevOps pipelines installing SSH, tunnel tools, and creating service accounts in sequence
  • Managed service providers (MSPs) deploying their standard RMM toolset during customer onboarding
Download portable Sigma rule (.yml)

Other platforms for T1108


Testing Methodology

Validate this detection against 5 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.

  1. Test 1Install Redundant Remote Access Service via SC.exe

    Expected signal: Windows System Event ID 7045: New Service Installed with ServiceName=RemoteAccessBackup, ServiceFileName=C:\Windows\System32\calc.exe, ServiceType=user mode service, StartType=auto start. Windows Security Event ID 4697 (if auditing enabled): A service was installed in the system. Sysmon Event ID 1 for sc.exe process creation with full command line captured.

  2. Test 2Create Backup Local Administrator Account

    Expected signal: Windows Security Event ID 4720: A user account was created — TargetUserName=df00tech-svc-backup. Security Event ID 4732: A member was added to a security-enabled local group — TargetUserName=df00tech-svc-backup, GroupName=Administrators. Security Event ID 4722: A user account was enabled. Sysmon Event ID 1 for net.exe and wmic.exe process creation with full command lines.

  3. Test 3Deploy ngrok Tunnel as Redundant C2 Channel

    Expected signal: Sysmon Event ID 1: Process Create for powershell.exe with Invoke-WebRequest command line downloading ngrok. Sysmon Event ID 11: File Create for ngrok.zip and ngrok.exe in %TEMP%. Sysmon Event ID 1: Process Create for ngrok.exe with 'http 8080' arguments. Sysmon Event ID 3: Network connection attempt from ngrok.exe to ngrok infrastructure (will fail or succeed depending on network access). Security Event ID 4688 (if command line auditing enabled).

  4. Test 4Drop Simulated Web Shell in IIS Web Root

    Expected signal: Sysmon Event ID 11: File Create with TargetFilename=C:\inetpub\wwwroot\df00tech-test-shell.aspx, Image=cmd.exe (unexpected parent for web root writes). Sysmon Event ID 1: Process Create for cmd.exe with echo/redirect command line. Security Event ID 4663 (object access, if file auditing enabled on inetpub) showing file create by cmd.exe.

  5. Test 5Add SSH Authorized Key for Persistent Backdoor Access (Linux/macOS)

    Expected signal: Linux auditd: syscall write/open on ~/.ssh/authorized_keys by the bash/sh process — generates SYSCALL and PATH audit records. Syslog/auth.log: no immediate logon event but future SSH logons using this key will generate 'Accepted publickey' entries identifying the key fingerprint. File integrity monitoring (FIM): if deployed, triggers on modification of ~/.ssh/authorized_keys.

Unlock Pro Content

Get the full detection package for T1108 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections