Skip to content

Commit 504d307

Browse files
committed
Merge pull request #505 from mlodic/develop
added IntezerCommunity analyzer
1 parent e7aeb0f commit 504d307

File tree

5 files changed

+154
-0
lines changed

5 files changed

+154
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "IntezerCommunity",
3+
"version": "1.0",
4+
"author": "Matteo Lodi",
5+
"url": "https://github.com/TheHive-Project/Cortex-Analyzers",
6+
"license": "AGPL-v3",
7+
"description": "Analyze a possible malicious file with Intezer Analyzer",
8+
"dataTypeList": ["file"],
9+
"baseConfig": "IntezerCommunity",
10+
"command": "IntezerCommunity/intezer_community.py",
11+
"configurationItems": [
12+
{
13+
"name": "key",
14+
"description": "API key for Intezer",
15+
"type": "string",
16+
"multi": false,
17+
"required": true
18+
}
19+
],
20+
"config": {
21+
"check_tlp": true,
22+
"max_tlp": 2,
23+
"auto_extract": false
24+
}
25+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#!/usr/bin/env python3
2+
3+
import requests
4+
import time
5+
import os
6+
7+
from cortexutils.analyzer import Analyzer
8+
9+
10+
class IntezerCommunityAnalyzer(Analyzer):
11+
"""
12+
Intezer Community APIs: https://analyze.intezer.com/api/docs/documentation
13+
"""
14+
15+
def run(self):
16+
17+
try:
18+
19+
if self.data_type == 'file':
20+
api_key = self.get_param('config.key', None, 'Missing Intezer API key')
21+
filepath = self.get_param('file', None, 'File is missing')
22+
filename = self.get_param('filename', os.path.basename(filepath))
23+
24+
base_url = 'https://analyze.intezer.com/api/v2-0'
25+
# this should be done just once in a day, but we cannot do that with Cortex Analyzers
26+
response = requests.post(base_url + '/get-access-token', json={'api_key': api_key})
27+
response.raise_for_status()
28+
session = requests.session()
29+
session.headers['Authorization'] = session.headers['Authorization'] = 'Bearer %s' % response.json()[
30+
'result']
31+
32+
with open(filepath, 'rb') as file_to_upload:
33+
files = {'file': (filename, file_to_upload)}
34+
response = session.post(base_url + '/analyze', files=files)
35+
if response.status_code != 201:
36+
self.error('Error sending file to Intezer Analyzer\n{}'.format(response.text))
37+
38+
while response.status_code != 200:
39+
time.sleep(3)
40+
result_url = response.json()['result_url']
41+
response = session.get(base_url + result_url)
42+
response.raise_for_status()
43+
44+
report = response.json()
45+
self.report(report)
46+
47+
else:
48+
self.notSupported()
49+
50+
except requests.HTTPError as e:
51+
self.error(e)
52+
except Exception as e:
53+
self.unexpectedError(e)
54+
55+
def summary(self, raw):
56+
taxonomies = []
57+
namespace = 'IntezerCommunity'
58+
59+
if 'status' in raw and raw['status'] == 'succeeded':
60+
predicate = 'Analysis succeeded'
61+
else:
62+
predicate = 'Analysis failed'
63+
64+
level = 'info'
65+
value = 'no family'
66+
if 'result' in raw:
67+
if 'verdict' in raw['result']:
68+
level = raw['result']['verdict']
69+
if level == 'trusted':
70+
level = 'safe'
71+
if level not in ['info', 'safe', 'suspicious', 'malicious']:
72+
level = 'info'
73+
if 'family_name' in raw['result']:
74+
value = raw['result']['family_name']
75+
76+
taxonomies.append(self.build_taxonomy(level, namespace, predicate, value))
77+
78+
return {'taxonomies': taxonomies}
79+
80+
81+
if __name__ == '__main__':
82+
IntezerCommunityAnalyzer().run()
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
requests
2+
cortexutils
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<div class="panel panel-danger" ng-if="success && content.result">
2+
<div class="panel-heading">
3+
Intezer Analysis Results
4+
</div>
5+
<div class="panel-body">
6+
<dl class="dl-horizontal">
7+
<dt>Verdict</dt>
8+
<dd>{{content.result.verdict}}</dd>
9+
</dl>
10+
<dl class="dl-horizontal">
11+
<dt>Sub-verdict</dt>
12+
<dd>{{content.result.sub_verdict}}</dd>
13+
</dl>
14+
<dl class="dl-horizontal">
15+
<dt>Family</dt>
16+
<dd>{{content.result.family_name}}</dd>
17+
</dl>
18+
</div>
19+
</div>
20+
<div class="panel panel-success" ng-if="success && !content.result">
21+
<div class="panel-heading">
22+
Intezer Analysis Results
23+
</div>
24+
<div class="panel-body">
25+
<span>No result</span>
26+
</div>
27+
</div>
28+
29+
<!-- General error -->
30+
<div class="panel panel-danger" ng-if="!success">
31+
<div class="panel-heading">
32+
<strong>{{(artifact.data || artifact.attachment.name) | fang}}</strong>
33+
</div>
34+
<div class="panel-body">
35+
<dl class="dl-horizontal" ng-if="content.errorMessage">
36+
<dt><i class="fa fa-warning"></i> Intezer:</dt>
37+
<dd class="wrap">{{content.errorMessage}}</dd>
38+
</dl>
39+
</div>
40+
</div>
41+
42+
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<span class="label" ng-repeat="t in content.taxonomies" ng-class="{'info': 'label-info', 'safe': 'label-success', 'suspicious': 'label-warning', 'malicious':'label-danger'}[t.level]">
2+
{{t.namespace}}:{{t.predicate}}="{{t.value}}"
3+
</span>&nbsp;

0 commit comments

Comments
 (0)