1use anomaly_grid::*;
8
9use std::time::Instant;
10
11fn main() -> Result<(), Box<dyn std::error::Error>> {
12 println!("š”ļø Network Security Monitoring with Anomaly Grid");
13 println!("Detecting APTs, DDoS, and network intrusions\n");
14
15 let normal_events = generate_enterprise_traffic(5);
17 println!(
18 "Generated {} normal network events (5 days)",
19 normal_events.len()
20 );
21
22 let mut detector = AnomalyDetector::new(4)?; let train_start = Instant::now();
27 detector.train(&normal_events)?;
28 println!("Training completed in {:?}", train_start.elapsed());
29
30 println!("\nš Starting real-time network monitoring...");
32
33 let attack_scenarios = vec![
35 ("Advanced Persistent Threat", generate_apt_campaign()),
36 ("DDoS Attack", generate_ddos_attack()),
37 ("Port Scan", generate_port_scan()),
38 ("SQL Injection", generate_sql_injection()),
39 ("Lateral Movement", generate_lateral_movement()),
40 ];
41
42 for (attack_name, attack_sequence) in attack_scenarios {
43 println!("\nTesting: {attack_name}");
44
45 let detect_start = Instant::now();
46 let anomalies = detector.detect_anomalies(&attack_sequence, 0.001)?;
47 let detect_time = detect_start.elapsed();
48
49 if !anomalies.is_empty() {
50 let max_strength = anomalies
51 .iter()
52 .map(|a| a.anomaly_strength)
53 .fold(0.0, f64::max);
54
55 let min_likelihood = anomalies
56 .iter()
57 .map(|a| a.likelihood)
58 .fold(f64::INFINITY, f64::min);
59
60 println!(" ā
THREAT DETECTED");
61 println!(" š Anomalies found: {}", anomalies.len());
62 println!(" Max anomaly strength: {max_strength:.3}");
63 println!(" Min likelihood: {min_likelihood:.2e}");
64 println!(" Detection time: {detect_time:?}");
65
66 let threat_level = if max_strength > 0.9 {
68 "CRITICAL"
69 } else if max_strength > 0.7 {
70 "HIGH"
71 } else if max_strength > 0.5 {
72 "MEDIUM"
73 } else {
74 "LOW"
75 };
76
77 println!(" Threat Level: {threat_level}");
78 } else {
79 println!(" ā No anomalies detected");
80 }
81 }
82
83 println!("\nš¦ Batch Processing Demonstration");
85 let batch_sequences = vec![
86 generate_normal_session(),
87 generate_malware_communication(),
88 generate_data_exfiltration(),
89 ];
90
91 let batch_start = Instant::now();
92 let config = AnomalyGridConfig::default().with_max_order(5)?;
93 let batch_results = batch_process_sequences(&batch_sequences, &config, 0.01)?;
94 let batch_time = batch_start.elapsed();
95
96 println!(
97 "Processed {} sequences in {:?}",
98 batch_sequences.len(),
99 batch_time
100 );
101 for (i, results) in batch_results.iter().enumerate() {
102 println!(" Sequence {}: {} anomalies detected", i + 1, results.len());
103 }
104
105 Ok(())
106}
107
108fn generate_enterprise_traffic(days: usize) -> Vec<String> {
109 let mut traffic = Vec::new();
110 let events_per_day = 10000;
111
112 let normal_patterns = vec![
113 vec!["TCP_SYN", "TCP_ACK", "HTTP_GET", "HTTP_200", "TCP_FIN"],
115 vec![
116 "TCP_SYN",
117 "TCP_ACK",
118 "TLS_HANDSHAKE",
119 "HTTPS_POST",
120 "HTTP_201",
121 "TCP_FIN",
122 ],
123 vec![
125 "TCP_SYN",
126 "TCP_ACK",
127 "SMTP_HELO",
128 "SMTP_AUTH",
129 "SMTP_DATA",
130 "SMTP_QUIT",
131 ],
132 vec![
133 "TCP_SYN",
134 "TCP_ACK",
135 "IMAP_LOGIN",
136 "IMAP_SELECT",
137 "IMAP_FETCH",
138 "IMAP_LOGOUT",
139 ],
140 vec!["UDP_DNS_QUERY", "DNS_A_RECORD", "UDP_DNS_RESPONSE"],
142 vec!["UDP_DNS_QUERY", "DNS_MX_RECORD", "UDP_DNS_RESPONSE"],
143 vec![
145 "TCP_SYN",
146 "TCP_ACK",
147 "LDAP_BIND",
148 "LDAP_SEARCH",
149 "LDAP_UNBIND",
150 ],
151 vec![
152 "TCP_SYN",
153 "TCP_ACK",
154 "SMB_NEGOTIATE",
155 "SMB_SESSION",
156 "SMB_TREE_CONNECT",
157 ],
158 vec![
160 "IPSEC_INIT",
161 "IPSEC_AUTH",
162 "IPSEC_ESTABLISHED",
163 "DATA_TRANSFER",
164 "IPSEC_CLOSE",
165 ],
166 ];
167
168 for _ in 0..days {
169 for _ in 0..events_per_day {
170 let pattern = &normal_patterns[traffic.len() % normal_patterns.len()];
171 traffic.extend(pattern.iter().map(|s| s.to_string()));
172 }
173 }
174
175 traffic
176}
177
178fn generate_apt_campaign() -> Vec<String> {
179 vec![
180 "SPEAR_PHISHING_EMAIL",
182 "MACRO_EXECUTION",
183 "PAYLOAD_DOWNLOAD",
184 "PERSISTENCE_REGISTRY",
185 "SCHEDULED_TASK_CREATE",
186 "NETWORK_DISCOVERY",
188 "SERVICE_ENUMERATION",
189 "USER_ENUMERATION",
190 "DOMAIN_TRUST_DISCOVERY",
191 "REMOTE_SYSTEM_DISCOVERY",
192 "CREDENTIAL_DUMPING",
194 "PASS_THE_HASH",
195 "REMOTE_DESKTOP",
196 "ADMIN_SHARE_ACCESS",
197 "SERVICE_EXECUTION",
198 "FILE_SYSTEM_SEARCH",
200 "DATA_STAGING",
201 "ARCHIVE_CREATION",
202 "SENSITIVE_DATA_ACCESS",
203 "DATABASE_QUERY",
204 "C2_COMMUNICATION",
206 "DATA_ENCRYPTION",
207 "EXTERNAL_TRANSFER",
208 "DNS_TUNNELING",
209 "STEGANOGRAPHY",
210 "LOG_DELETION",
212 "ARTIFACT_REMOVAL",
213 "TIMESTAMP_MODIFICATION",
214 ]
215 .into_iter()
216 .map(String::from)
217 .collect()
218}
219
220fn generate_ddos_attack() -> Vec<String> {
221 vec![
222 "UDP_FLOOD",
224 "UDP_FLOOD",
225 "UDP_FLOOD",
226 "UDP_FLOOD",
227 "UDP_FLOOD",
228 "ICMP_FLOOD",
229 "ICMP_FLOOD",
230 "ICMP_FLOOD",
231 "ICMP_FLOOD",
232 "TCP_SYN_FLOOD",
234 "TCP_SYN_FLOOD",
235 "TCP_SYN_FLOOD",
236 "TCP_SYN_FLOOD",
237 "TCP_ACK_FLOOD",
238 "TCP_ACK_FLOOD",
239 "TCP_ACK_FLOOD",
240 "HTTP_GET_FLOOD",
242 "HTTP_GET_FLOOD",
243 "HTTP_GET_FLOOD",
244 "HTTP_GET_FLOOD",
245 "HTTP_POST_FLOOD",
246 "HTTP_POST_FLOOD",
247 "HTTP_POST_FLOOD",
248 "SLOWLORIS_ATTACK",
249 "SLOWLORIS_ATTACK",
250 "DNS_AMPLIFICATION",
252 "NTP_AMPLIFICATION",
253 "MEMCACHED_AMPLIFICATION",
254 ]
255 .into_iter()
256 .map(String::from)
257 .collect()
258}
259
260fn generate_port_scan() -> Vec<String> {
261 vec![
262 "TCP_SYN",
263 "TCP_RST",
264 "TCP_SYN",
265 "TCP_RST",
266 "TCP_SYN",
267 "TCP_RST",
268 "TCP_SYN",
269 "TCP_RST",
270 "TCP_SYN",
271 "TCP_RST",
272 "TCP_SYN",
273 "TCP_RST",
274 "UDP_PROBE",
275 "ICMP_UNREACHABLE",
276 "UDP_PROBE",
277 "ICMP_UNREACHABLE",
278 "STEALTH_SCAN",
279 "FIN_SCAN",
280 "NULL_SCAN",
281 "XMAS_SCAN",
282 ]
283 .into_iter()
284 .map(String::from)
285 .collect()
286}
287
288fn generate_sql_injection() -> Vec<String> {
289 vec![
290 "TCP_SYN",
291 "TCP_ACK",
292 "HTTP_POST",
293 "SQL_INJECTION_ATTEMPT",
294 "ERROR_BASED_SQLI",
295 "UNION_BASED_SQLI",
296 "BLIND_SQLI",
297 "TIME_BASED_SQLI",
298 "DATABASE_ERROR",
299 "SENSITIVE_DATA_LEAK",
300 "HTTP_500",
301 "TCP_RST",
302 ]
303 .into_iter()
304 .map(String::from)
305 .collect()
306}
307
308fn generate_lateral_movement() -> Vec<String> {
309 vec![
310 "CREDENTIAL_THEFT",
311 "PASS_THE_TICKET",
312 "GOLDEN_TICKET",
313 "SILVER_TICKET",
314 "DCSYNC_ATTACK",
315 "KERBEROASTING",
316 "SMB_RELAY",
317 "NTLM_RELAY",
318 "REMOTE_EXECUTION",
319 "PSEXEC",
320 "WMIEXEC",
321 "SCHTASKS_ABUSE",
322 ]
323 .into_iter()
324 .map(String::from)
325 .collect()
326}
327
328fn generate_normal_session() -> Vec<String> {
329 vec![
330 "TCP_SYN",
331 "TCP_ACK",
332 "HTTP_GET",
333 "HTTP_200",
334 "HTTP_GET",
335 "HTTP_200",
336 "HTTP_POST",
337 "HTTP_201",
338 "TCP_FIN",
339 "TCP_ACK",
340 ]
341 .into_iter()
342 .map(String::from)
343 .collect()
344}
345
346fn generate_malware_communication() -> Vec<String> {
347 vec![
348 "DNS_QUERY_SUSPICIOUS",
349 "C2_DOMAIN_RESOLUTION",
350 "TCP_SYN",
351 "TCP_ACK",
352 "ENCRYPTED_C2_TRAFFIC",
353 "BEACON_HEARTBEAT",
354 "COMMAND_DOWNLOAD",
355 "PAYLOAD_EXECUTION",
356 "DATA_UPLOAD",
357 "TCP_FIN",
358 ]
359 .into_iter()
360 .map(String::from)
361 .collect()
362}
363
364fn generate_data_exfiltration() -> Vec<String> {
365 vec![
366 "FILE_SYSTEM_ACCESS",
367 "SENSITIVE_FILE_READ",
368 "DATA_COMPRESSION",
369 "ENCRYPTION_PROCESS",
370 "EXTERNAL_CONNECTION",
371 "LARGE_DATA_TRANSFER",
372 "STEGANOGRAPHY_ENCODING",
373 "COVERT_CHANNEL",
374 ]
375 .into_iter()
376 .map(String::from)
377 .collect()
378}