commit
This commit is contained in:
parent
e97f8d3a70
commit
40cd619180
@ -124,7 +124,6 @@ class MispAnalyzer(interface.BaseAnalyzer):
|
|||||||
return []
|
return []
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# For IP searches, query both ip-src and ip-dst
|
|
||||||
search_types = []
|
search_types = []
|
||||||
if attr.startswith("ip-"):
|
if attr.startswith("ip-"):
|
||||||
search_types = ["ip-src", "ip-dst"]
|
search_types = ["ip-src", "ip-dst"]
|
||||||
@ -134,6 +133,7 @@ class MispAnalyzer(interface.BaseAnalyzer):
|
|||||||
all_results = []
|
all_results = []
|
||||||
|
|
||||||
for search_type in search_types:
|
for search_type in search_types:
|
||||||
|
|
||||||
payload = {
|
payload = {
|
||||||
"returnFormat": "json",
|
"returnFormat": "json",
|
||||||
"value": value,
|
"value": value,
|
||||||
@ -169,20 +169,17 @@ class MispAnalyzer(interface.BaseAnalyzer):
|
|||||||
if response.status_code == 200:
|
if response.status_code == 200:
|
||||||
data = response.json()
|
data = response.json()
|
||||||
attributes = data.get("response", {}).get("Attribute", [])
|
attributes = data.get("response", {}).get("Attribute", [])
|
||||||
|
for i, attr_data in enumerate(attributes):
|
||||||
|
event_data = attr_data.get("Event", {})
|
||||||
all_results.extend(attributes)
|
all_results.extend(attributes)
|
||||||
else:
|
|
||||||
logger.debug(f"MISP API returned status {response.status_code} for {value} ({search_type})")
|
|
||||||
|
|
||||||
# Small delay between search types
|
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
if all_results and self.include_community:
|
unique_event_ids = set()
|
||||||
orgs = set()
|
|
||||||
for attr_data in all_results:
|
for attr_data in all_results:
|
||||||
org = attr_data.get("Event", {}).get("Orgc", {}).get("name", "Unknown")
|
event_id = attr_data.get("Event", {}).get("id")
|
||||||
orgs.add(org)
|
if event_id:
|
||||||
if len(orgs) > 1 or (orgs and list(orgs)[0] not in ["Unknown", "Your Org"]):
|
unique_event_ids.add(event_id)
|
||||||
logger.info(f"Community hit for {value}: {len(all_results)} matches from {', '.join(list(orgs)[:3])}")
|
|
||||||
|
|
||||||
return all_results
|
return all_results
|
||||||
|
|
||||||
|
126
testscript.py
Normal file
126
testscript.py
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
MISP Debug Test Script
|
||||||
|
Run this standalone to test exactly what the script sees from MISP API
|
||||||
|
"""
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
MISP_URL = "https://misp.cc24.dev"
|
||||||
|
MISP_API_KEY = "QUcv9s0M7nl10eIIxbEJchZyJpO4oZeu9i3sPOlZ"
|
||||||
|
TEST_IP = "196.251.115.108"
|
||||||
|
|
||||||
|
def test_misp_queries():
|
||||||
|
"""Test both ip-src and ip-dst queries like the script does."""
|
||||||
|
|
||||||
|
print(f"Testing MISP queries for {TEST_IP}")
|
||||||
|
print("=" * 60)
|
||||||
|
|
||||||
|
all_results = []
|
||||||
|
search_types = ["ip-src", "ip-dst"]
|
||||||
|
|
||||||
|
for search_type in search_types:
|
||||||
|
print(f"\n🔍 Searching for {search_type}...")
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
"returnFormat": "json",
|
||||||
|
"value": TEST_IP,
|
||||||
|
"type": search_type,
|
||||||
|
"enforceWarninglist": False,
|
||||||
|
"includeEventTags": True,
|
||||||
|
"includeContext": True,
|
||||||
|
"distribution": [0, 1, 2, 3, 5],
|
||||||
|
"includeEventUuid": True,
|
||||||
|
"includeCorrelations": True,
|
||||||
|
"includeDecayScore": False,
|
||||||
|
"includeFullModel": False,
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.post(
|
||||||
|
f"{MISP_URL}/attributes/restSearch/",
|
||||||
|
json=payload,
|
||||||
|
headers={"Authorization": MISP_API_KEY},
|
||||||
|
verify=False,
|
||||||
|
timeout=45,
|
||||||
|
)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
data = response.json()
|
||||||
|
attributes = data.get("response", {}).get("Attribute", [])
|
||||||
|
print(f" ✅ Found {len(attributes)} attributes")
|
||||||
|
|
||||||
|
for i, attr in enumerate(attributes):
|
||||||
|
event = attr.get("Event", {})
|
||||||
|
event_id = event.get("id")
|
||||||
|
event_info = event.get("info", "Unknown")
|
||||||
|
attr_type = attr.get("type")
|
||||||
|
print(f" [{i+1}] Event {event_id}: {event_info[:60]}... (type: {attr_type})")
|
||||||
|
|
||||||
|
all_results.extend(attributes)
|
||||||
|
else:
|
||||||
|
print(f" ❌ API returned status {response.status_code}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f" ❌ Error: {e}")
|
||||||
|
|
||||||
|
print(f"\n📊 COMBINED RESULTS:")
|
||||||
|
print(f" Total attributes: {len(all_results)}")
|
||||||
|
|
||||||
|
# Test deduplication logic (like the script does)
|
||||||
|
unique_events = {}
|
||||||
|
for res in all_results:
|
||||||
|
event_info = res.get("Event", {})
|
||||||
|
event_id = event_info.get("id")
|
||||||
|
event_desc = event_info.get("info", "Unknown")
|
||||||
|
|
||||||
|
if event_id and event_id not in unique_events:
|
||||||
|
unique_events[event_id] = {
|
||||||
|
'description': event_desc,
|
||||||
|
'url': f"{MISP_URL}/events/view/{event_id}"
|
||||||
|
}
|
||||||
|
|
||||||
|
unique_event_list = list(unique_events.values())
|
||||||
|
print(f" Unique events after dedup: {len(unique_event_list)}")
|
||||||
|
|
||||||
|
print(f"\n🎯 FINAL EVENT LIST:")
|
||||||
|
for i, event_data in enumerate(unique_event_list):
|
||||||
|
short_desc = event_data['description'][:50] + "..." if len(event_data['description']) > 50 else event_data['description']
|
||||||
|
print(f" [{i+1}] {short_desc}")
|
||||||
|
print(f" URL: {event_data['url']}")
|
||||||
|
|
||||||
|
# Test the message building logic
|
||||||
|
print(f"\n💬 SIMULATED MESSAGE:")
|
||||||
|
if len(unique_event_list) == 1:
|
||||||
|
event_data = unique_event_list[0]
|
||||||
|
short_desc = event_data['description'][:50] + "..." if len(event_data['description']) > 50 else event_data['description']
|
||||||
|
msg = f"MISP: Malicious IP | Event: {short_desc} | Link: {event_data['url']}"
|
||||||
|
elif len(unique_event_list) > 1:
|
||||||
|
msg = f"MISP: Malicious IP | {len(unique_event_list)} Events:"
|
||||||
|
for i, event_data in enumerate(unique_event_list[:2]):
|
||||||
|
short_desc = event_data['description'][:40] + "..." if len(event_data['description']) > 40 else event_data['description']
|
||||||
|
msg += f" [{i+1}] {short_desc} ({event_data['url']})"
|
||||||
|
if i < len(unique_event_list) - 1 and i < 1:
|
||||||
|
msg += " |"
|
||||||
|
|
||||||
|
if len(unique_event_list) > 2:
|
||||||
|
msg += f" | +{len(unique_event_list)-2} more events"
|
||||||
|
|
||||||
|
msg += f" | {len(all_results)} total correlations"
|
||||||
|
|
||||||
|
print(f" {msg}")
|
||||||
|
|
||||||
|
print(f"\n🔍 EVENT ID CHECK:")
|
||||||
|
event_ids = [str(event_info.get("Event", {}).get("id", "")) for event_info in all_results]
|
||||||
|
unique_ids = list(set(event_ids))
|
||||||
|
print(f" All event IDs found: {sorted(event_ids)}")
|
||||||
|
print(f" Unique event IDs: {sorted(unique_ids)}")
|
||||||
|
print(f" Event 5 present: {'5' in unique_ids}")
|
||||||
|
print(f" Event 4425 present: {'4425' in unique_ids}")
|
||||||
|
print(f" Event 4427 present: {'4427' in unique_ids}")
|
||||||
|
print(f" Event 4430 present: {'4430' in unique_ids}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
test_misp_queries()
|
Reference in New Issue
Block a user