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
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
| ID |
Technique |
Tactic |
| T1021 |
Remote Services |
Lateral Movement |
| T1562 |
Impair Defenses |
Stealth |
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 |
Anomaly detections generate Intermediate Findings (Risk Events). They do not generate a Finding (Notable) directly.
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
| 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