| ID | Technique | Tactic |
|---|---|---|
| T1021 | Remote Services | Lateral Movement |
| T1562 | Impair Defenses | Stealth |
Detection: Cisco IOS XE VTY Access Class Tampering
Description
This analytic detects rapid modification of Cisco IOS-XE VTY access-class settings. The Salt Typhoon notes describe configure HTTP activity followed by line vty changes and removal/re-application of an access-class within 60 seconds.
Search
1`cisco_ios`
2facility IN ("HA_EM", "PARSER")
3mnemonic IN ("LOG", "CFGLOG_LOGGEDCMD")
4message_text IN (
5 "*access-class*",
6 "*configure http*",
7 "*line vty*"
8)
9
10| rex field=message_text "^(?:[^:]+:\s+)?(?:catchall:\s+)?(?<eem_command>.+?)\s*$"
11
12| rex field=message_text "<enteredCommand><cli>(?<parser_command>.*?)</cli>"
13
14| rex field=message_text "<user>(?<parser_user>[^<]+)</user>"
15
16| rex field=message_text "<srcIP>(?<parser_src_ip>[^<]+)</srcIP>"
17
18| eval command=lower(trim(coalesce(parser_command, eem_command, "")))
19
20| eval event_type=case(
21 like(command, "configure http%") OR like(command, "ip http secure-server%"), "http_config",
22 like(command, "line vty%"), "line_vty",
23 like(command, "no access-class%"), "remove_access_class",
24 like(command, "access-class%"), "add_access_class",
25 true(), null())
26
27| where isnotnull(event_type)
28
29| eval user=coalesce(parser_user, user, "unknown")
30
31| eval src_ip=coalesce(parser_src_ip, src_ip, "unknown")
32
33| eval dest=coalesce(host, dvc, dest, "unknown")
34
35| bin _time span=1m
36
37| stats count min(_time) as firstTime
38 max(_time) as lastTime
39 values(event_type) as event_types
40 values(user) as user
41 values(src_ip) as src_ip
42 values(command) as commands
43 by _time dest
44
45| where mvfind(event_types, "line_vty") >= 0
46 AND
47 mvfind(event_types, "remove_access_class") >= 0
48 AND
49 mvfind(event_types, "add_access_class") >= 0
50
51| `security_content_ctime(firstTime)`
52
53| `security_content_ctime(lastTime)`
54
55| `cisco_ios_xe_vty_access_class_tampering_filter`
Data Source
| Name | Platform | Sourcetype | Source |
|---|---|---|---|
| Cisco IOS Logs | Other | 'cisco:ios' |
'cisco:ios' |
Macros Used
| Name | Value |
|---|---|
| security_content_ctime | convert timeformat="%Y-%m-%dT%H:%M:%S" ctime($field$) |
| cisco_ios_xe_vty_access_class_tampering_filter | search * |
cisco_ios_xe_vty_access_class_tampering_filter is an empty macro by default. It allows the user to filter out any results (false positives) without editing the SPL.
Annotations
Default Configuration
This detection is configured by default in Splunk Enterprise Security to run with the following settings:
| Setting | Value |
|---|---|
| Disabled | true |
| Cron Schedule | 0 * * * * |
| Earliest Time | -70m@m |
| Latest Time | -10m@m |
| Schedule Window | auto |
| Creates Finding (Notable) | No |
| Creates Intermediate Finding (Risk Event) | Yes |
Implementation
Use the Cisco Catalyst Add-on for Splunk (https://splunkbase.splunk.com/app/7538) to Ingest Cisco IOS-XE syslog with sourcetype "cisco:ios" and enable archive/config command logging.
Known False Positives
VTY ACL changes occur during legitimate management access updates. Filter approved maintenance windows and known administrators.
Associated Analytic Story
Intermediate Findings
| Message | Entity Field | Entity Type | Risk Score |
|---|---|---|---|
| Cisco IOS-XE VTY access-class settings were removed and reapplied on $dest$ by $user$. | dest | system | 20 |
Threat Objects
| Field | Type |
|---|---|
| commands | command |
References
Detection Testing
| Test Type | Status | Dataset | Source | Sourcetype |
|---|---|---|---|---|
| Validation | ✅ Passing | N/A | N/A | N/A |
| Unit | ✅ Passing | Dataset | ctb:catalyst:syslog |
cisco:ios |
| Integration | ✅ Passing | Dataset | ctb:catalyst:syslog |
cisco:ios |
Replay any dataset to Splunk Enterprise by using our replay.py tool or the UI.
Alternatively you can replay a dataset into a Splunk Attack Range
Source: GitHub |
Version: 1