Skip to content

Commit 17dd1b2

Browse files
committed
[New Rule] Web Server Local File Inclusion Activity
1 parent 02979fe commit 17dd1b2

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
[metadata]
2+
creation_date = "2025/12/02"
3+
integration = ["nginx", "apache", "apache_tomcat", "iis"]
4+
maturity = "production"
5+
updated_date = "2025/12/02"
6+
7+
[rule]
8+
author = ["Elastic"]
9+
description = """
10+
This rule detects potential Local File Inclusion (LFI) activity on web servers by identifying HTTP GET requests that
11+
attempt to access sensitive local files through directory traversal techniques or known file paths. Attackers may
12+
exploit LFI vulnerabilities to read sensitive files, gain system information, or further compromise the server.
13+
"""
14+
from = "now-9m"
15+
interval = "10m"
16+
language = "esql"
17+
license = "Elastic License v2"
18+
name = "Web Server Local File Inclusion Activity"
19+
risk_score = 21
20+
rule_id = "90e4ceab-79a5-4f8e-879b-513cac7fcad9"
21+
severity = "low"
22+
tags = [
23+
"Domain: Web",
24+
"Use Case: Threat Detection",
25+
"Tactic: Reconnaissance",
26+
"Tactic: Credential Access",
27+
"Data Source: Nginx",
28+
"Data Source: Apache",
29+
"Data Source: Apache Tomcat",
30+
"Data Source: IIS",
31+
]
32+
timestamp_override = "event.ingested"
33+
type = "esql"
34+
query = '''
35+
from
36+
logs-nginx.access-*,
37+
logs-apache.access-*,
38+
logs-apache_tomcat.access-*,
39+
logs-iis.access-*
40+
| where
41+
http.request.method == "GET" and
42+
http.response.status_code == 200 and
43+
url.original like "*=*"
44+
45+
| eval Esql.url_original_url_decoded_to_lower = to_lower(URL_DECODE(url.original))
46+
47+
| where
48+
/* 1) Relative traversal */
49+
Esql.url_original_url_decoded_to_lower like "*../../../../*" or // Unix-style traversal
50+
Esql.url_original_url_decoded_to_lower like "*..\\\\..\\\\..\\\\..*" or // Windows-style traversal
51+
// Potential security check bypassing (enforcing multiple dots and shortening the pattern)
52+
Esql.url_original_url_decoded_to_lower like "*..././*" or
53+
Esql.url_original_url_decoded_to_lower like "*...\\*" or
54+
Esql.url_original_url_decoded_to_lower like "*....\\*" or
55+
56+
/* 2) Linux system identity / basic info */
57+
Esql.url_original_url_decoded_to_lower like "*etc/passwd*" or
58+
Esql.url_original_url_decoded_to_lower like "*etc/shadow*" or
59+
Esql.url_original_url_decoded_to_lower like "*etc/hosts*" or
60+
Esql.url_original_url_decoded_to_lower like "*etc/os-release*" or
61+
Esql.url_original_url_decoded_to_lower like "*etc/issue*" or
62+
63+
/* 3) Linux /proc enumeration */
64+
Esql.url_original_url_decoded_to_lower like "*proc/self/environ*" or
65+
Esql.url_original_url_decoded_to_lower like "*proc/self/cmdline*" or
66+
Esql.url_original_url_decoded_to_lower like "*proc/self/fd*" or
67+
Esql.url_original_url_decoded_to_lower like "*proc/self/exe*" or
68+
69+
/* 4) Linux webroots, configs & logs */
70+
Esql.url_original_url_decoded_to_lower like "*var/www*" or // generic webroot
71+
Esql.url_original_url_decoded_to_lower like "*wp-config.php*" or // classic WP config
72+
Esql.url_original_url_decoded_to_lower like "*etc/apache2*" or
73+
Esql.url_original_url_decoded_to_lower like "*etc/httpd*" or
74+
Esql.url_original_url_decoded_to_lower like "*etc/nginx*" or
75+
Esql.url_original_url_decoded_to_lower like "*var/log/apache2*" or
76+
Esql.url_original_url_decoded_to_lower like "*var/log/httpd*" or
77+
Esql.url_original_url_decoded_to_lower like "*var/log/nginx*" or
78+
79+
/* 5) Windows core files / identity */
80+
Esql.url_original_url_decoded_to_lower like "*windows/panther/*unattend*" or
81+
Esql.url_original_url_decoded_to_lower like "*windows/debug/netsetup.log*" or
82+
Esql.url_original_url_decoded_to_lower like "*windows/win.ini*" or
83+
Esql.url_original_url_decoded_to_lower like "*windows/system32/drivers/etc/hosts*" or
84+
Esql.url_original_url_decoded_to_lower like "*boot.ini*" or
85+
Esql.url_original_url_decoded_to_lower like "*windows/system32/config/*" or
86+
Esql.url_original_url_decoded_to_lower like "*windows/repair/sam*" or
87+
Esql.url_original_url_decoded_to_lower like "*windows/system32/license.rtf*" or
88+
89+
/* 6) Windows IIS / .NET configs, webroots & logs */
90+
Esql.url_original_url_decoded_to_lower like "*/inetpub/wwwroot*" or
91+
Esql.url_original_url_decoded_to_lower like "*/inetpub/logs/logfiles*" or
92+
Esql.url_original_url_decoded_to_lower like "*applicationhost.config*" or
93+
Esql.url_original_url_decoded_to_lower like "*/microsoft.net/framework64/*/config/web.config*" or
94+
Esql.url_original_url_decoded_to_lower like "*windows/system32/inetsrv/*" or
95+
96+
/* 7) PHP & protocol wrappers */
97+
Esql.url_original_url_decoded_to_lower like "*php://*" or
98+
Esql.url_original_url_decoded_to_lower like "*zip://*" or
99+
Esql.url_original_url_decoded_to_lower like "*phar://*" or
100+
Esql.url_original_url_decoded_to_lower like "*expect://*" or
101+
Esql.url_original_url_decoded_to_lower like "*file://*" or
102+
Esql.url_original_url_decoded_to_lower like "*data://text/plain;base64*"
103+
104+
| keep
105+
@timestamp,
106+
Esql.url_original_url_decoded_to_lower,
107+
source.ip,
108+
agent.id,
109+
host.name,
110+
http.request.method,
111+
http.response.status_code,
112+
event.dataset
113+
114+
| stats
115+
Esql.event_count = count(),
116+
Esql.url_original_url_decoded_to_lower_count_distinct = count_distinct(Esql.url_original_url_decoded_to_lower),
117+
Esql.host_name_values = values(host.name),
118+
Esql.agent_id_values = values(agent.id),
119+
Esql.http_request_method_values = values(http.request.method),
120+
Esql.http_response_status_code_values = values(http.response.status_code),
121+
Esql.url_original_url_decoded_to_lower_values = values(Esql.url_original_url_decoded_to_lower),
122+
Esql.event_dataset_values = values(event.dataset)
123+
by source.ip
124+
'''
125+
126+
[[rule.threat]]
127+
framework = "MITRE ATT&CK"
128+
129+
[[rule.threat.technique]]
130+
id = "T1083"
131+
name = "File and Directory Discovery"
132+
reference = "https://attack.mitre.org/techniques/T1083/"
133+
134+
[rule.threat.tactic]
135+
id = "TA0007"
136+
name = "Discovery"
137+
reference = "https://attack.mitre.org/tactics/TA0007/"

0 commit comments

Comments
 (0)