Skip to content

Commit 1457575

Browse files
committed
new: [functionality] flowintel + multiple entry
1 parent b5c459c commit 1457575

File tree

15 files changed

+314
-215
lines changed

15 files changed

+314
-215
lines changed

website/app/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def create_app():
3737
app.register_blueprint(home_blueprint, url_prefix="/")
3838
app.register_blueprint(history_blueprint, url_prefix="/")
3939
app.register_blueprint(account_blueprint, url_prefix="/")
40+
csrf.exempt(home_blueprint)
4041

4142
return app
4243

website/app/db_class/db.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def to_json(self):
3838
"id": self.id,
3939
"uuid": self.uuid,
4040
"modules": json.loads(self.modules_list),
41-
"query_enter": self.query_enter,
41+
"query_enter": json.loads(self.query_enter),
4242
"input_query": self.input_query,
4343
"config_module": json.loads(self.config_module),
4444
"result": json.loads(self.result),
@@ -51,7 +51,7 @@ def history_json(self):
5151
json_dict = {
5252
"uuid": self.uuid,
5353
"modules": json.loads(self.modules_list),
54-
"query": self.query_enter,
54+
"query": json.loads(self.query_enter),
5555
"input": self.input_query,
5656
"query_date": self.query_date.strftime('%Y-%m-%d %H:%M')
5757
}

website/app/history/history_core.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ def util_remove_node_session(node_uuid, parent, parent_path):
146146
child = parent["children"][i]
147147
if child["uuid"] == node_uuid:
148148
del parent_path["children"][i]
149-
return
150-
elif child["children"]:
149+
return True
150+
elif "children" in child and child["children"]:
151151
return util_remove_node_session(node_uuid, child, parent_path["children"][i])
152152

153153
def remove_node_session(node_uuid):
@@ -160,7 +160,9 @@ def remove_node_session(node_uuid):
160160
loc = i
161161
break
162162
elif q_value["children"]:
163-
return util_remove_node_session(node_uuid, q_value, sess[keys_list[i]])
163+
if util_remove_node_session(node_uuid, q_value, sess[keys_list[i]]):
164+
loc = i
165+
break
164166
if loc:
165167
del sess[keys_list[i]]
166168

website/app/home.py

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import ast
12
import json
2-
from flask import Blueprint, render_template, request, jsonify, session as sess
3+
from flask import Blueprint, redirect, render_template, request, jsonify, session as sess
34
from flask_login import current_user
45
from . import session_class as SessionModel
56
from . import home_core as HomeModel
6-
from .utils.utils import admin_user_active
7+
from .utils.utils import admin_user_active, FLOWINTEL_URL
78

89
home_blueprint = Blueprint(
910
'home',
@@ -13,18 +14,35 @@
1314
)
1415

1516

16-
@home_blueprint.route("/")
17+
@home_blueprint.route("/", methods=["GET", "POST"])
1718
def home():
19+
try:
20+
del sess["query"]
21+
except:
22+
pass
1823
sess["admin_user"] = bool(admin_user_active())
1924
if "query" in request.args:
20-
return render_template("home.html", query=request.args.get("query"))
25+
sess["query"] = ast.literal_eval(request.args.get("query"))
26+
if "query" in request.form:
27+
sess["query"] = json.loads(request.form.get("query"))
2128
return render_template("home.html")
2229

30+
@home_blueprint.route("/get_query", methods=['GET', 'POST'])
31+
def get_query():
32+
"""Get result from flowintel"""
33+
if "query" in sess:
34+
return {"query": sess.get("query")}
35+
return {"message": "No query"}
36+
2337
@home_blueprint.route("/home/<sid>", methods=["GET", "POST"])
2438
def home_query(sid):
39+
try:
40+
del sess["query"]
41+
except:
42+
pass
2543
sess["admin_user"] = admin_user_active()
2644
if "query" in request.args:
27-
query = request.args.get("query")
45+
sess["query"] = [request.args.get("query")]
2846
return render_template("home.html", query=query, sid=sid)
2947
return render_template("404.html")
3048

@@ -33,21 +51,28 @@ def query(sid):
3351
sess["admin_user"] = admin_user_active()
3452
session = HomeModel.get_session(sid)
3553
flag=False
54+
modules_list = []
3655
if session:
3756
flag = True
38-
query_loc = session.query_enter
57+
query_loc = json.loads(session.query_enter)
58+
modules_list = json.loads(session.modules_list)
3959
else:
4060
for s in SessionModel.sessions:
4161
if s.uuid == sid:
4262
flag = True
4363
query_loc = s.query
4464
session=s
65+
modules_list = session.modules_list
66+
query_str = ", ".join(query_loc)
67+
if len(query_str) > 40:
68+
query_str = query_str[0:40] + "..."
4569
if flag:
4670
return render_template("query.html",
4771
query=query_loc,
72+
query_str=query_str,
4873
sid=sid,
4974
input_query=session.input_query,
50-
modules=json.loads(session.modules_list),
75+
modules=modules_list,
5176
query_date=session.query_date.strftime('%Y-%m-%d %H:%M'))
5277
return render_template("404.html")
5378

@@ -60,18 +85,20 @@ def get_query_info(sid):
6085
flag=False
6186
if session:
6287
flag = True
63-
query_loc = session.query_enter
88+
query_loc = json.loads(session.query_enter)
89+
modules_list = json.loads(session.modules_list)
6490
else:
6591
for s in SessionModel.sessions:
6692
if s.uuid == sid:
6793
flag = True
6894
query_loc = s.query
95+
modules_list = s.modules_list
6996
session=s
7097
if flag:
7198
loc_dict = {
7299
"query": query_loc,
73100
"input_query": session.input_query,
74-
"modules": json.loads(session.modules_list),
101+
"modules": modules_list,
75102
"query_date": session.query_date.strftime('%Y-%m-%d %H:%M')
76103
}
77104
return loc_dict
@@ -227,3 +254,9 @@ def change_status():
227254
return {'message': 'Something went wrong', 'toast_class': "danger-subtle"}, 400
228255
return {'message': 'Need to pass "module_id"', 'toast_class': "warning-subtle"}, 400
229256
return {'message': 'Permission denied', 'toast_class': "danger-subtle"}, 403
257+
258+
259+
@home_blueprint.route("/flowintel_url")
260+
def flowintel_url():
261+
"""send result to flowintel-cm"""
262+
return {"url": f"{FLOWINTEL_URL}/analyzer/recieve_result"}, 200

website/app/home_core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def create_new_session_tree(current_session, parent_id):
163163
loc_json = {
164164
"uuid": loc_session.uuid,
165165
"modules": json.loads(loc_session.modules_list),
166-
"query": loc_session.query_enter,
166+
"query": json.loads(loc_session.query_enter),
167167
"input": loc_session.input_query,
168168
"query_date": loc_session.query_date.strftime('%Y-%m-%d %H:%M'),
169169
"config": json.loads(loc_session.config_module),

website/app/session_class.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,12 @@ def config_module_setter(self, request_json, query_as_same, parent_id):
6464

6565
def start(self):
6666
"""Start all worker"""
67-
for i in range(len(self.modules_list)):
68-
#need the index and the url in each queue item.
69-
self.jobs.put((i, self.modules_list[i]))
67+
cp = 0
68+
for i in self.query:
69+
for j in self.modules_list:
70+
self.jobs.put((cp, i, j))
71+
cp += 1
72+
#need the index and the url in each queue item.
7073
for _ in range(self.thread_count):
7174
worker = Thread(target=self.process)
7275
worker.daemon = True
@@ -111,44 +114,44 @@ def process(self):
111114

112115
modules = query_get_module()
113116
loc_query = {}
117+
self.result[work[1]] = dict()
114118
# If Misp format
115119
for module in modules:
116-
if module["name"] == work[1]:
120+
if module["name"] == work[2]:
117121
if "format" in module["mispattributes"]:
118122
loc_query = {
119123
"type": self.input_query,
120-
"value": self.query,
124+
"value": work[1],
121125
"uuid": str(uuid.uuid4())
122126
}
123127
break
124128

125129
loc_config = {}
126-
if work[1] in self.config_module:
127-
loc_config = self.config_module[work[1]]
130+
if work[2] in self.config_module:
131+
loc_config = self.config_module[work[2]]
128132

129133
if loc_query:
130-
send_to = {"module": work[1], "attribute": loc_query, "config": loc_config}
134+
send_to = {"module": work[2], "attribute": loc_query, "config": loc_config}
131135
else:
132-
send_to = {"module": work[1], self.input_query: self.query, "config": loc_config}
136+
send_to = {"module": work[2], self.input_query: work[1], "config": loc_config}
133137
res = query_post_query(send_to)
134138

135139
## Sort attr in object by ui-priority
136-
if "results" in res:
137-
if "Object" in res["results"]:
138-
for obj in res["results"]["Object"]:
139-
loc_obj = get_object(obj["name"])
140-
if loc_obj:
141-
for attr in obj["Attribute"]:
142-
attr["ui-priority"] = loc_obj["attributes"][attr["object_relation"]]["ui-priority"]
143-
144-
# After adding 'ui-priority'
145-
obj["Attribute"].sort(key=lambda x: x["ui-priority"], reverse=True)
140+
if res:
141+
if "results" in res:
142+
if "Object" in res["results"]:
143+
for obj in res["results"]["Object"]:
144+
loc_obj = get_object(obj["name"])
145+
if loc_obj:
146+
for attr in obj["Attribute"]:
147+
attr["ui-priority"] = loc_obj["attributes"][attr["object_relation"]]["ui-priority"]
148+
149+
# After adding 'ui-priority'
150+
obj["Attribute"].sort(key=lambda x: x["ui-priority"], reverse=True)
146151

147-
148-
# print(res)
149-
if "error" in res:
152+
if res and "error" in res:
150153
self.nb_errors += 1
151-
self.result[work[1]] = res
154+
self.result[work[1]][work[2]] = res
152155

153156
self.jobs.task_done()
154157
return True
@@ -161,7 +164,7 @@ def save_info(self):
161164
s = Session_db(
162165
uuid=str(self.uuid),
163166
modules_list=json.dumps(self.modules_list),
164-
query_enter=self.query,
167+
query_enter=json.dumps(self.query),
165168
input_query=self.input_query,
166169
config_module=json.dumps(self.config_module),
167170
result=json.dumps(self.result),

website/app/static/js/history/history_tree_query.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default {
66
},
77

88
template: `
9-
<li><a :href="'/query/'+history.uuid" :title="'Attribute: \\n' +history.input+ '\\n\\nModules: \\n' + history.modules">[[history.query]]</a></li>
9+
<li v-if="history.query"><a :href="'/query/'+history.uuid" :title="'Attribute: \\n' +history.input+ '\\n\\nModules: \\n' + history.modules">[[history.query.join(", ")]]</a></li>
1010
<ul>
1111
<template v-for="child in history.children">
1212
<history_view :history="child"></history_view>

website/app/static/js/history/history_view.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export default {
4848
4949
<ul class="list-group list-group-horizontal" style="padding-top: 5px;">
5050
<li class="list-group-item">
51-
<h5>[[history.query]]</h5>
51+
<h5>[[history.query.join(", ")]]</h5>
5252
</li>
5353
<li class="list-group-item">
5454
<h5 style="color: brown"><u>Input Attributes</u></h5>
@@ -69,7 +69,7 @@ export default {
6969
<div class="collapse" :id="'collapse'+history.uuid" style="width: 70%; margin-left: 30px">
7070
<div class="card card-body">
7171
<div class="d-flex w-100 justify-content-between">
72-
<h5 class="mb-1">[[history.query]]</h5>
72+
<h5 class="mb-1">[[history.query.join(", ")]]</h5>
7373
<small><i>[[history.uuid]]</i></small>
7474
</div>
7575
<p class="mb-1" style="color: green;"><u>Input Attribute</u>:</p>

website/app/static/js/mispParser.js

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ function parseMispObject(misp_object, query_url, functionToCall){
1010
if(query_url){
1111
$query=$("<a>").attr("href", query_url+v.value).text("query").css("margin-left", "10px")
1212
}
13-
// `_${functionToCall.name}('${v.value}')` refer to 'window._query_as_same = query_as_same' in my vue file
14-
$query_same = $("<button>").attr({"onclick": `_${functionToCall.name}('${v.value}')`,
15-
"title": "Query this value with the same attribute and modules as the main query",
16-
"class": "btn btn-link"
17-
})
18-
.text("query as same")
19-
.css({"margin-left": "10px", "padding": "0", "--bs-btn-border-width": "0"})
13+
if(functionToCall){
14+
// `_${functionToCall.name}('${v.value}')` refer to 'window._query_as_same = query_as_same' in my vue file
15+
$query_same = $("<button>").attr({"onclick": `_${functionToCall.name}('${v.value}')`,
16+
"title": "Query this value with the same attribute and modules as the main query",
17+
"class": "btn btn-link"
18+
})
19+
.text("query as same")
20+
.css({"margin-left": "10px", "padding": "0", "--bs-btn-border-width": "0"})
21+
}
2022
}
2123

2224
$container.append(
@@ -74,12 +76,14 @@ function parseMispAttr(misp_attr, misp_types, key, query_url, query_as_same){
7476
$query=$("<a>").attr("href", query_url+misp_attr).text("query").css("margin-left", "10px")
7577
}
7678
// `_${functionToCall.name}('${misp_attr}')` refer to 'window._query_as_same = query_as_same' in my vue file
77-
$query_same = $("<button>").attr({"onclick": `_${query_as_same.name}('${misp_attr}')`,
78-
"title": "Query this value with the same attribute and modules as the main query",
79-
"class": "btn btn-link"
80-
})
81-
.text("query as same")
82-
.css({"margin-left": "10px", "padding": "0", "--bs-btn-border-width": "0"})
79+
if(query_as_same){
80+
$query_same = $("<button>").attr({"onclick": `_${query_as_same.name}('${misp_attr}')`,
81+
"title": "Query this value with the same attribute and modules as the main query",
82+
"class": "btn btn-link"
83+
})
84+
.text("query as same")
85+
.css({"margin-left": "10px", "padding": "0", "--bs-btn-border-width": "0"})
86+
}
8387
}
8488

8589

website/app/templates/history.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ <h1 id="top">History</h1>
3030
<div class="list-group" style="margin-bottom: 20px;">
3131
<a :href="'/query/'+h.uuid" class="list-group-item list-group-item-action">
3232
<div class="d-flex w-100 justify-content-between">
33-
<h5 class="mb-1">[[h.query]]</h5>
33+
<h5 class="mb-1">[[h.query.join(", ")]]</h5>
3434
<small><i>[[h.uuid]]</i></small>
3535
</div>
3636
<p class="mb-1" style="color: green;"><u>Input Attribute</u>:</p>

website/app/templates/history_session.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ <h4># [[key + 1]]</h4>
2424
<a style="text-decoration: none; color: black;" data-bs-toggle="collapse" :href="'#collapse'+his.uuid" role="button" aria-expanded="false" :aria-controls="'collapse'+his.uuid">
2525
<ul class="list-group list-group-horizontal">
2626
<li class="list-group-item">
27-
<h4>[[his.query]]</h4>
27+
<h4>[[his.query.join(", ")]]</h4>
2828
</li>
2929
<li class="list-group-item">
3030
<h5 style="color: brown"><u>Input Attributes</u></h5>
@@ -45,7 +45,7 @@ <h5 style="color: brown"><u>Modules</u></h5>
4545
<div class="collapse" :id="'collapse'+his.uuid" style="width: 70%; margin-left:30px">
4646
<div class="card card-body">
4747
<div class="d-flex w-100 justify-content-between">
48-
<h5 class="mb-1">[[his.query]]</h5>
48+
<h5 class="mb-1">[[his.query.join(", ")]]</h5>
4949
<small><i>[[his.uuid]]</i></small>
5050
</div>
5151
<p class="mb-1" style="color: green;"><u>Input Attribute</u>:</p>

0 commit comments

Comments
 (0)