|
| 1 | +name: Cisco IOS XE Reconnaissance Command Activity |
| 2 | +id: 71ac5328-2364-40cf-8381-92b8dc531399 |
| 3 | +version: 1 |
| 4 | +creation_date: '2026-05-19' |
| 5 | +modification_date: '2026-05-20' |
| 6 | +author: Nasreddine Bencherchali |
| 7 | +status: production |
| 8 | +type: Anomaly |
| 9 | +description: | |
| 10 | + This analytic detects bursts of Cisco IOS or NX-OS discovery commands associated with Salt Typhoon tradecraft. |
| 11 | + Adversaries who gain initial access to network infrastructure devices typically perform systematic reconnaissance to understand the device configuration, network topology, security policies, connected systems, and potential attack paths. |
| 12 | + This reconnaissance phase involves executing multiple "show" commands to enumerate device details, running configurations, active connections, routing information, and VPN sessions. |
| 13 | +data_source: |
| 14 | + - Cisco IOS Logs |
| 15 | +search: |- |
| 16 | + `cisco_ios` |
| 17 | + facility IN ("AAA", "HA_EM") |
| 18 | + mnemonic IN ("AAA_ACCOUNTING_MESSAGE", "LOG") |
| 19 | + message_text IN ( |
| 20 | + "*show running-config*", |
| 21 | + "*show tacacs*", |
| 22 | + "*show cdp neighbors*", |
| 23 | + "*show file systems*", |
| 24 | + "*dir bootflash:*", |
| 25 | + "*show clock*", |
| 26 | + "*show platform software status control-processor brief*", |
| 27 | + "*terminal length 0*", |
| 28 | + "*terminal width 0*" |
| 29 | + ) |
| 30 | +
|
| 31 | + | rex field=message_text "^\w+:(?<aaa_src>[^:@]+)(?:@[^:]*)?:(?<aaa_user>[^:]*):(?<aaa_command>.*?)(?:\s+\((?<aaa_result>SUCCESS|FAILURE)\))?$" |
| 32 | + | rex field=message_text "^(?:[^:]+:\s+)?(?:catchall:\s+)?(?<eem_command>.+?)\s*$" |
| 33 | + | eval command=lower(trim(coalesce(aaa_command, eem_command, ""))) |
| 34 | +
|
| 35 | + | eval command_type=case( |
| 36 | + like(command, "show running-config%"), "show_conf", |
| 37 | + like(command, "show tacacs%"), "show_tacacs", |
| 38 | + like(command, "show cdp neighbors detail%"), "show_cdp", |
| 39 | + like(command, "show cdp neighbors%"), "show_cdp", |
| 40 | + like(command, "show file systems%"), "show_file", |
| 41 | + like(command, "dir bootflash:%"), "dir_bootflash", |
| 42 | + like(command, "show clock%"), "show_clock", |
| 43 | + like(command, "show platform software status control-processor brief%"), "show_platform", |
| 44 | + like(command, "terminal length 0%"), "terminal", |
| 45 | + like(command, "terminal width 0%"), "terminal", |
| 46 | + true(), null()) |
| 47 | + | where isnotnull(command_type) |
| 48 | + | eval user=coalesce(aaa_user, user, "unknown") |
| 49 | + | eval src_ip=coalesce(aaa_src, src_ip, "unknown") |
| 50 | + | eval dest=coalesce(host, dvc, dest, "unknown") |
| 51 | + | bin _time span=5m |
| 52 | + | stats count min(_time) as firstTime |
| 53 | + max(_time) as lastTime |
| 54 | + dc(command_type) as unique_recon_commands |
| 55 | + values(command_type) as command_types |
| 56 | + values(command) as commands |
| 57 | + by _time dest user src_ip |
| 58 | + | where unique_recon_commands >= 4 |
| 59 | + | `security_content_ctime(firstTime)` |
| 60 | + | `security_content_ctime(lastTime)` |
| 61 | + | `cisco_ios_xe_reconnaissance_command_activity_filter` |
| 62 | +how_to_implement: | |
| 63 | + Use the Cisco Catalyst Add-on for Splunk (https://splunkbase.splunk.com/app/7538) to Ingest Cisco IOS-XE syslog with sourcetype "cisco:ios". |
| 64 | + On Nexus, local accounting can emit "%AAA-6-AAA_ACCOUNTING_MESSAGE". |
| 65 | + On Catalyst, use TACACS+ command accounting or EEM catchall syslog for exec command visibility. |
| 66 | +known_false_positives: | |
| 67 | + Network audits and troubleshooting can produce similar command bursts. Tune the command list, threshold, and approved administrators for the environment. |
| 68 | +references: |
| 69 | + - https://www.cisa.gov/news-events/cybersecurity-advisories/aa25-239a |
| 70 | + - https://blog.talosintelligence.com/salt-typhoon-analysis/ |
| 71 | +drilldown_searches: |
| 72 | + - name: View the detection results for - "$dest$" |
| 73 | + search: '%original_detection_search% | search dest = "$dest$"' |
| 74 | + earliest_offset: $info_min_time$ |
| 75 | + latest_offset: $info_max_time$ |
| 76 | + - name: View risk events for the last 7 days for - "$dest$" |
| 77 | + search: '| from datamodel Risk.All_Risk | search normalized_risk_object IN ("$dest$") | stats count min(_time) as firstTime max(_time) as lastTime values(search_name) as "Search Name" values(risk_message) as "Risk Message" values(analyticstories) as "Analytic Stories" values(annotations._all) as "Annotations" values(annotations.mitre_attack.mitre_tactic) as "ATT&CK Tactics" by normalized_risk_object | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`' |
| 78 | + earliest_offset: 7d |
| 79 | + latest_offset: "0" |
| 80 | +intermediate_findings: |
| 81 | + entities: |
| 82 | + - field: dest |
| 83 | + type: system |
| 84 | + score: 20 |
| 85 | + message: User $user$ executed $unique_recon_commands$ Cisco reconnaissance command categories on $dest$. |
| 86 | +threat_objects: |
| 87 | + - field: commands |
| 88 | + type: command |
| 89 | +analytic_story: |
| 90 | + - Salt Typhoon |
| 91 | +asset_type: Network |
| 92 | +mitre_attack_id: |
| 93 | + - T1082 |
| 94 | + - T1016 |
| 95 | + - T1590 |
| 96 | +product: |
| 97 | + - Splunk Enterprise |
| 98 | + - Splunk Enterprise Security |
| 99 | + - Splunk Cloud |
| 100 | +category: application |
| 101 | +security_domain: network |
| 102 | +tests: |
| 103 | + - name: True Positive Test |
| 104 | + attack_data: |
| 105 | + - data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/emerging_threats/SaltTyphoon/salttyphoon_cisco.log |
| 106 | + source: ctb:nexus:syslog |
| 107 | + sourcetype: cisco:ios |
| 108 | + test_type: unit |
0 commit comments