From 8737307b115fcf7070a5913bb4eb1d2b9a6837e1 Mon Sep 17 00:00:00 2001
From: Alexandre Dulaunoy
Date: Tue, 6 Sep 2022 14:31:37 +0200
Subject: [PATCH] Deployed 2c218d2 with MkDocs version: 1.3.1
---
404.html | 4 +-
contribute/index.html | 453 +++++++++++++++-------------
expansion/index.html | 38 ++-
expansion/logos/hyas.png | Bin 0 -> 3219 bytes
export_mod/index.html | 4 +-
export_mod/logos/hyas.png | Bin 0 -> 3219 bytes
import_mod/index.html | 4 +-
import_mod/logos/hyas.png | Bin 0 -> 3219 bytes
index.html | 4 +-
install/index.html | 476 ++++++++++++++++++++----------
license/index.html | 4 +-
logos/hyas.png | Bin 0 -> 3219 bytes
logos/misp-modules-full-small.png | Bin 0 -> 10835 bytes
logos/misp-modules-full.png | Bin 0 -> 151790 bytes
logos/misp-modules-full.svg | 125 ++++++++
logos/misp-modules-small.png | Bin 0 -> 8015 bytes
logos/misp-modules.svg | 114 +++++++
search/search_index.json | 2 +-
sitemap.xml | 14 +-
sitemap.xml.gz | Bin 253 -> 253 bytes
20 files changed, 872 insertions(+), 370 deletions(-)
create mode 100644 expansion/logos/hyas.png
create mode 100644 export_mod/logos/hyas.png
create mode 100644 import_mod/logos/hyas.png
create mode 100644 logos/hyas.png
create mode 100644 logos/misp-modules-full-small.png
create mode 100644 logos/misp-modules-full.png
create mode 100644 logos/misp-modules-full.svg
create mode 100644 logos/misp-modules-small.png
create mode 100644 logos/misp-modules.svg
diff --git a/404.html b/404.html
index 28105c4..31931f5 100644
--- a/404.html
+++ b/404.html
@@ -13,7 +13,7 @@
-
+
@@ -430,7 +430,7 @@
Create your module in misp_modules/modules/expansion/, misp_modules/modules/export_mod/, or misp_modules/modules/import_mod/. The module should have at minimum three functions: Don't forget to return an error key and value if an error is raised to propagate it to the MISP user-interface. Your module's script name should also be added in the ~python
+...
+ # Checking for required value
+ if not request.get('ip-src'):
+ # Return an error message
+ return {'error': "A source IP is required"}
+...
+~ The function that returns a dict of the supported attributes (input and output) by your expansion module. ~python
+mispattributes = {'input': ['link', 'url'],
+ 'output': ['attachment', 'malware-sample']} def introspection():
+ return mispattributes
+~ The function that returns a dict with the version and the associated meta-data including potential configurations required of the module. If your module requires additional configuration (to be exposed via the MISP user-interface), you can define those in the moduleconfig value returned by the version function. ~python moduleconfig = ["apikey", "event_limit"] def version():
+ moduleinfo['config'] = moduleconfig
+ return moduleinfo
+~ When you do this a config array is added to the meta-data output containing all the potential configuration values: ~
+"meta": {
+ "description": "PassiveTotal expansion service to expand values with multiple Passive DNS sources",
+ "config": [
+ "username",
+ "password"
],
- "module-type": [
- "expansion",
- "hover"
- ],
-
-...
-Contribute
-
How to add your own MISP modules?¶
@@ -652,95 +690,98 @@
__all__
list of <module type folder>/__init__.py
in order for it to be loaded....
- # Checking for required value
- if not request.get('ip-src'):
- # Return an error message
- return {'error': "A source IP is required"}
-...
-
introspection¶
mispattributes = {'input': ['link', 'url'],
- 'output': ['attachment', 'malware-sample']}
-
-def introspection():
- return mispattributes
-
version¶
Additional Configuration Values¶
# config fields that your code expects from the site admin
-moduleconfig = ["apikey", "event_limit"]
-
-def version():
- moduleinfo['config'] = moduleconfig
- return moduleinfo
-
config fields that your code expects from the site admin¶
+"meta": {
- "description": "PassiveTotal expansion service to expand values with multiple Passive DNS sources",
- "config": [
- "username",
- "password"
+
... +~
If you want to use the configuration values set in the web interface they are stored in the key config
in the JSON object passed to the handler.
def handler(q=False):
+~
+def handler(q=False):
+# Check if we were given a configuration
+config = q.get("config", {})
- # Check if we were given a configuration
- config = q.get("config", {})
-
- # Find out if there is a username field
- username = config.get("username", None)
+# Find out if there is a username field
+username = config.get("username", None)
+
+~
handler¶
The function which accepts a JSON document to expand the values and return a dictionary of the expanded values.
-def handler(q=False):
- "Fully functional rot-13 encoder"
- if q is False:
- return False
- request = json.loads(q)
- src = request.get('ip-src')
- if src is None:
- # Return an error message
- return {'error': "A source IP is required"}
- else:
- return {'results':
- codecs.encode(src, "rot-13")}
-
+~python
+def handler(q=False):
+ "Fully functional rot-13 encoder"
+ if q is False:
+ return False
+ request = json.loads(q)
+ src = request.get('ip-src')
+ if src is None:
+ # Return an error message
+ return {'error': "A source IP is required"}
+ else:
+ return {'results':
+ codecs.encode(src, "rot-13")}
+~
export module¶
For an export module, the request["data"]
object corresponds to a list of events (dictionaries) to handle.
Iterating over events attributes is performed using their Attribute
key.
-...
-for event in request["data"]:
- for attribute in event["Attribute"]:
- # do stuff w/ attribute['type'], attribute['value'], ...
-...
-
-### Returning Binary Data
-
-If you want to return a file or other data you need to add a data attribute.
-
-~~~python
-{"results": {"values": "filename.txt",
- "types": "attachment",
- "data" : base64.b64encode(<ByteIO>) # base64 encode your data first
- "comment": "This is an attachment"}}
-
+~python
+...
+for event in request["data"]:
+ for attribute in event["Attribute"]:
+ # do stuff w/ attribute['type'], attribute['value'], ...
+...
+Returning Binary Data¶
+If you want to return a file or other data you need to add a data attribute.
+~python
+{"results": {"values": "filename.txt",
+ "types": "attachment",
+ "data" : base64.b64encode() # base64 encode your data first
+ "comment": "This is an attachment"}}
+~
If the binary file is malware you can use 'malware-sample' as the type. If you do this the malware sample will be automatically zipped and password protected ('infected') after being uploaded.
-{"results": {"values": "filename.txt",
- "types": "malware-sample",
- "data" : base64.b64encode(<ByteIO>) # base64 encode your data first
- "comment": "This is an attachment"}}
-
+~python
+{"results": {"values": "filename.txt",
+ "types": "malware-sample",
+ "data" : base64.b64encode() # base64 encode your data first
+ "comment": "This is an attachment"}}
+~
To learn more about how data attributes are processed you can read the processing code here.
Module type¶
A MISP module can be of four types:
@@ -753,117 +794,122 @@
module-type is an array where the list of supported types can be added.
Testing your modules?¶
MISP uses the modules function to discover the available MISP modules and their supported MISP attributes:
-% curl -s http://127.0.0.1:6666/modules | jq .
+~
+% curl -s http://127.0.0.1:6666/modules | jq .
[
{
- "name": "passivetotal",
- "type": "expansion",
- "mispattributes": {
- "input": [
- "hostname",
- "domain",
- "ip-src",
- "ip-dst"
+ "name": "passivetotal",
+ "type": "expansion",
+ "mispattributes": {
+ "input": [
+ "hostname",
+ "domain",
+ "ip-src",
+ "ip-dst"
],
- "output": [
- "ip-src",
- "ip-dst",
- "hostname",
- "domain"
+ "output": [
+ "ip-src",
+ "ip-dst",
+ "hostname",
+ "domain"
]
},
- "meta": {
- "description": "PassiveTotal expansion service to expand values with multiple Passive DNS sources",
- "config": [
- "username",
- "password"
+ "meta": {
+ "description": "PassiveTotal expansion service to expand values with multiple Passive DNS sources",
+ "config": [
+ "username",
+ "password"
],
- "author": "Alexandre Dulaunoy",
- "version": "0.1"
+ "author": "Alexandre Dulaunoy",
+ "version": "0.1"
}
},
{
- "name": "sourcecache",
- "type": "expansion",
- "mispattributes": {
- "input": [
- "link"
+ "name": "sourcecache",
+ "type": "expansion",
+ "mispattributes": {
+ "input": [
+ "link"
],
- "output": [
- "link"
+ "output": [
+ "link"
]
},
- "meta": {
- "description": "Module to cache web pages of analysis reports, OSINT sources. The module returns a link of the cached page.",
- "author": "Alexandre Dulaunoy",
- "version": "0.1"
+ "meta": {
+ "description": "Module to cache web pages of analysis reports, OSINT sources. The module returns a link of the cached page.",
+ "author": "Alexandre Dulaunoy",
+ "version": "0.1"
}
},
{
- "name": "dns",
- "type": "expansion",
- "mispattributes": {
- "input": [
- "hostname",
- "domain"
+ "name": "dns",
+ "type": "expansion",
+ "mispattributes": {
+ "input": [
+ "hostname",
+ "domain"
],
- "output": [
- "ip-src",
- "ip-dst"
+ "output": [
+ "ip-src",
+ "ip-dst"
]
},
- "meta": {
- "description": "Simple DNS expansion service to resolve IP address from MISP attributes",
- "author": "Alexandre Dulaunoy",
- "version": "0.1"
+ "meta": {
+ "description": "Simple DNS expansion service to resolve IP address from MISP attributes",
+ "author": "Alexandre Dulaunoy",
+ "version": "0.1"
}
}
-]
-
+]
+~
The MISP module service returns the available modules in a JSON array containing each module name along with their supported input attributes.
Based on this information, a query can be built in a JSON format and saved as body.json:
-{
- "hostname": "www.foo.be",
- "module": "dns"
-}
-
+~json
+{
+ "hostname": "www.foo.be",
+ "module": "dns"
+}
+~
Then you can POST this JSON format query towards the MISP object server:
-curl -s http://127.0.0.1:6666/query -H "Content-Type: application/json" --data @body.json -X POST
-
+~bash
+curl -s http://127.0.0.1:6666/query -H "Content-Type: application/json" --data @body.json -X POST
+~
The module should output the following JSON:
-{
- "results": [
- {
- "types": [
- "ip-src",
- "ip-dst"
- ],
- "values": [
- "188.65.217.78"
- ]
- }
- ]
-}
-
+~json
+{
+ "results": [
+ {
+ "types": [
+ "ip-src",
+ "ip-dst"
+ ],
+ "values": [
+ "188.65.217.78"
+ ]
+ }
+ ]
+}
+~
It is also possible to restrict the category options of the resolved attributes by passing a list of categories along (optional):
-{
- "results": [
- {
- "types": [
- "ip-src",
- "ip-dst"
- ],
- "values": [
- "188.65.217.78"
- ],
- "categories": [
- "Network activity",
- "Payload delivery"
- ]
- }
- ]
-}
-
+~json
+{
+ "results": [
+ {
+ "types": [
+ "ip-src",
+ "ip-dst"
+ ],
+ "values": [
+ "188.65.217.78"
+ ],
+ "categories": [
+ "Network activity",
+ "Payload delivery"
+ ]
+ }
+ ]
+}
+~
For both the type and the category lists, the first item in the list will be the default setting on the interface.
Enable your module in the web interface¶
For a module to be activated in the MISP web interface it must be enabled in the "Plugin Settings.
@@ -873,15 +919,17 @@
- Find the name of your plugin's "enabled" value in the Setting Column.
"Plugin.[MODULE NAME]_enabled"
- Double click on its "Value" column
-Priority Setting Value Description Error Message
+~
+Priority Setting Value Description Error Message
Recommended Plugin.Import_ocr_enabled false Enable or disable the ocr module. Value not set.
-
+~
- Use the drop-down to set the enabled value to 'true'
-Priority Setting Value Description Error Message
+~
+Priority Setting Value Description Error Message
Recommended Plugin.Import_ocr_enabled true Enable or disable the ocr module. Value not set.
-
+~
Set any other required settings for your module¶
In this same menu set any other plugin settings that are required for testing.
Documentation¶
@@ -906,26 +954,31 @@ Recommended Plugin.Import_ocr_enabled true Enable or disable the ocr
SSH into the machine (Login info on training page)
Go into the misp-modules directory
-cd /usr/local/src/misp-modules
-
+~bash
+cd /usr/local/src/misp-modules
+~
Set the git repo to your fork and checkout your development branch. If you SSH'ed in as the misp user you will have to use sudo.
-sudo git remote set-url origin https://github.com/YourRepo/misp-modules.git
+~bash
+sudo git remote set-url origin https://github.com/YourRepo/misp-modules.git
sudo git pull
sudo git checkout MyModBranch
-
+~
Remove the contents of the build directory and re-install misp-modules.
-sudo rm -fr build/*
-sudo pip3 install --upgrade .
-
+~python
+sudo rm -fr build/*
+sudo pip3 install --upgrade .
+~
SSH in with a different terminal and run misp-modules
with debugging enabled.
-sudo killall misp-modules
-misp-modules -d
-
+~python
+sudo killall misp-modules
+misp-modules -d
+~
In your original terminal you can now run your tests manually and see any errors that arrive
-cd tests/
-curl -s http://127.0.0.1:6666/query -H "Content-Type: application/json" --data @MY_TEST_FILE.json -X POST
-cd ../
-
+~bash
+cd tests/
+curl -s http://127.0.0.1:6666/query -H "Content-Type: application/json" --data @MY_TEST_FILE.json -X POST
+cd ../
+~
@@ -1017,7 +1070,7 @@ curl -s http://127.0.0.1:6666/query -H "Content-Type: appl
-
+
diff --git a/expansion/index.html b/expansion/index.html
index 5346ea7..2a29023 100644
--- a/expansion/index.html
+++ b/expansion/index.html
@@ -15,7 +15,7 @@
-
+
@@ -517,6 +517,13 @@
html_to_markdown
+
+
+
+
+ hyasinsight
+
+
@@ -1292,6 +1299,13 @@
html_to_markdown
+
+
+
+
+ hyasinsight
+
+
@@ -2304,6 +2318,26 @@ Markdown content converted from the HTML fetched from the url.
The markdownify python library
+hyasinsight¶
+
+HYAS Insight integration to MISP provides direct, high volume access to HYAS Insight data. It enables investigators and analysts to understand and defend against cyber adversaries and their infrastructure.
+- features:
+
+This Module takes the IP Address, Domain, URL, Email, Phone Number, MD5, SHA1, Sha256, SHA512 MISP Attributes as input to query the HYAS Insight API.
+The results of the HYAS Insight API are than are then returned and parsed into Hyas Insight Objects.
+An API key is required to submit queries to the HYAS Insight API.
+
+- input:
+A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), Email Address(email, email-src, email-dst, target-email, whois-registrant-email), Phone Number(phone-number, whois-registrant-phone), MDS(md5, x509-fingerprint-md5, ja3-fingerprint-md5, hassh-md5, hasshserver-md5), SHA1(sha1, x509-fingerprint-sha1), SHA256(sha256, x509-fingerprint-sha256), SHA512(sha512)
+- output:
+Hyas Insight objects, resulting from the query on the HYAS Insight API.
+- references:
+https://www.hyas.com/hyas-insight/
+- requirements:
+A HYAS Insight API Key.
+
+
+
intel471¶
- descrption:
@@ -3475,7 +3509,7 @@ MISP attributes and objects fetched from the Yeti instances.
-
+
diff --git a/expansion/logos/hyas.png b/expansion/logos/hyas.png
new file mode 100644
index 0000000000000000000000000000000000000000..42acf22f590ec113c0fb09e7691780a20e3f1544
GIT binary patch
literal 3219
zcmbtXc{r4N8y;D+rYRwf!6DQv#_ZY0E|NVmjG1@LoXpY~Ym1`Lt|%c1EhkHo>{G;MP;s7WMIB)|gr6lf$XgdIwZG}ZpDOBBslw-MUV?-2ezQ|-S@
z`8c~mNgN&k#ln#=DiVo;;s|gfEEdyT!P-I1!-+tGWGQ72q+$0h%q3!-9TK4w3l}1AjFK
zjYAcg;QrJiQgLVuo)Q!UGsaM9Fggv5f#ET9EQ}Upgu-BvM#d-%Mf-=Ei2ExQ|A!hv
zWEinp{eN`B&n;1ltxkXSwrKI|b^vVAmEehb-=ob74+6;yIaphIM0QVRtn~m#Kpq=|
zdF#${6Lc&RyTT7tY>Pc*7m#0=!zc}VeJj8EhG%NwzK$yYSK&3qQ)SiNIaaI>-EuJB
z`!c_K=Jk==rsuf(SRWp4v~Xr6~Wi#
zW$;}mWm&O-g9BWMm{Pj*GaLl1)ZG!Q=bUt=?IW&TOmPII7Lw987Eb1hIjqmr>k6$V
zzpFrdz8$QRJhilmKl#Ra&`HHTyt=xss?2cvsxRGL<^pFZ)~P@hvVA&aLvbD`qF5
z`WHS6Q9~&k!TX;@T
zhF-TL+s&?r=tp~|)?HP>Qg~)+(P48|R<;3O<|@wvTdKG%R~&qsxjcimxB$DW*sX&j?c9f5v@GB*ZJqKlTJ}q}wC
z-Z0HHceCA^cl&N&{=s_u?off+%F?mVqLu4^oNtP_zn~E%!NtIfk
znb~{igJ1j7M(KD$D(sSG3@T=U;K(-^wbRXYR~~J;7)3rGf7!Y>spP?8eo+D>iTCY~
zk+P0==*-94GR>7TF~-yLYcgzeqxfl~37Y=TW&QBx^h34y-Fr+~^tQ$rrB7Uw*CEqWdbU(WFr&(E!)iDiJ;2lbBJ@&bR)uo^YVzFB6P-SLNX;t^Kc#k`j)V;p-Z>yEUz8;vE0$euYg!dx{}{&D%5Q|JOXQpLo53Irn{%{
zTwnW1kd4Vz@CA&*A=MdScYW5mqb|;K8dz@5SG*7!U(?9Hl4iaO_4|e%Py6H(WpyVV
zb4nHHsehKvalA50?=1U{(GpDx7nLG&1I1cy87>%P-CjfbXj7}Q^*0$3NsELpLlP#9
z&UZcAGbPZ()E-zzJW*8Fz3Gz<6+1$b4oO32q&=$)+y?s=FraiG@h$_nt{n8vnRkbo`kI+5ej@Dr?3LIrpvtQ26Z>r5bO@73<
zG*<5^@w_O^!k*&u=e(h>cO~mhclQ{qXXt8=V#SBldxjD+kFu4X-Fy}`Os~S*dsyio
z>1|(nR=!TPA*ST|Xk{HTN<-2`d~?m+$?a8(Yy_ng~b#w>Am1hYyRvzsp%p7E0
z^eVh$r0ItJz;zKUO~_6?p_i22jGt1y{-SDt-NHgwxeIohEBv
z>t&X6`nL+jgElhAQ#f{{Jh5`5FiGv@dE+-UAU9Ge44Fm6te?26TxdclZNDS8*?v|`@`k1o#aJ%sM0X2j)`i%5|oZrW7e+2BcAQ@c$I%9nA
z(}ew@>Xwx`#mj`HY3(+PICX`z^T$If>CxDo>hOzAf`iKXUmP@L_b2#jypnI69mmA6
zUj}M;k_$!8lo!!hUjn8h!2Tz$LdZVR+Dw@cGz6{
z+WqE?)CbRYE3J+WOLuth#^nz-XrORg)F6zBay>xt-95a+Fn;sio=NmO)Uu=
zos%7|d4^w9;$gn_Bo3?k@PIg*uQX5*7jGp~V-XAD9r_d9H2To*iNOV$-$%gx(Q-Z!
z>gBO3LyVB*guGy{llA1rH6mB})o%t*?Z+*Z+}^!bqFb_t<^zR{%hspKp7Oz48Z?u&
zfYO|tT>6{6@D$VkjK^Htq5^Z$lwM3P*uy5@t>#P#E~d9-YCb>zri!>C$s!)IUEyg3
zxA1AWvW6x(dAjD<%EWSvSM1Cg>1T0co0S$;t}odg5d#_5zBa-~mOHNgCOFu*Sl_V<
GjQuY#UXp$Q
literal 0
HcmV?d00001
diff --git a/export_mod/index.html b/export_mod/index.html
index e649e43..f52cbf4 100644
--- a/export_mod/index.html
+++ b/export_mod/index.html
@@ -15,7 +15,7 @@
-
+
@@ -946,7 +946,7 @@ vt_graph_api, the python library to query the VirusTotal graph API
-
+
diff --git a/export_mod/logos/hyas.png b/export_mod/logos/hyas.png
new file mode 100644
index 0000000000000000000000000000000000000000..42acf22f590ec113c0fb09e7691780a20e3f1544
GIT binary patch
literal 3219
zcmbtXc{r4N8y;D+rYRwf!6DQv#_ZY0E|NVmjG1@LoXpY~Ym1`Lt|%c1EhkHo>{G;MP;s7WMIB)|gr6lf$XgdIwZG}ZpDOBBslw-MUV?-2ezQ|-S@
z`8c~mNgN&k#ln#=DiVo;;s|gfEEdyT!P-I1!-+tGWGQ72q+$0h%q3!-9TK4w3l}1AjFK
zjYAcg;QrJiQgLVuo)Q!UGsaM9Fggv5f#ET9EQ}Upgu-BvM#d-%Mf-=Ei2ExQ|A!hv
zWEinp{eN`B&n;1ltxkXSwrKI|b^vVAmEehb-=ob74+6;yIaphIM0QVRtn~m#Kpq=|
zdF#${6Lc&RyTT7tY>Pc*7m#0=!zc}VeJj8EhG%NwzK$yYSK&3qQ)SiNIaaI>-EuJB
z`!c_K=Jk==rsuf(SRWp4v~Xr6~Wi#
zW$;}mWm&O-g9BWMm{Pj*GaLl1)ZG!Q=bUt=?IW&TOmPII7Lw987Eb1hIjqmr>k6$V
zzpFrdz8$QRJhilmKl#Ra&`HHTyt=xss?2cvsxRGL<^pFZ)~P@hvVA&aLvbD`qF5
z`WHS6Q9~&k!TX;@T
zhF-TL+s&?r=tp~|)?HP>Qg~)+(P48|R<;3O<|@wvTdKG%R~&qsxjcimxB$DW*sX&j?c9f5v@GB*ZJqKlTJ}q}wC
z-Z0HHceCA^cl&N&{=s_u?off+%F?mVqLu4^oNtP_zn~E%!NtIfk
znb~{igJ1j7M(KD$D(sSG3@T=U;K(-^wbRXYR~~J;7)3rGf7!Y>spP?8eo+D>iTCY~
zk+P0==*-94GR>7TF~-yLYcgzeqxfl~37Y=TW&QBx^h34y-Fr+~^tQ$rrB7Uw*CEqWdbU(WFr&(E!)iDiJ;2lbBJ@&bR)uo^YVzFB6P-SLNX;t^Kc#k`j)V;p-Z>yEUz8;vE0$euYg!dx{}{&D%5Q|JOXQpLo53Irn{%{
zTwnW1kd4Vz@CA&*A=MdScYW5mqb|;K8dz@5SG*7!U(?9Hl4iaO_4|e%Py6H(WpyVV
zb4nHHsehKvalA50?=1U{(GpDx7nLG&1I1cy87>%P-CjfbXj7}Q^*0$3NsELpLlP#9
z&UZcAGbPZ()E-zzJW*8Fz3Gz<6+1$b4oO32q&=$)+y?s=FraiG@h$_nt{n8vnRkbo`kI+5ej@Dr?3LIrpvtQ26Z>r5bO@73<
zG*<5^@w_O^!k*&u=e(h>cO~mhclQ{qXXt8=V#SBldxjD+kFu4X-Fy}`Os~S*dsyio
z>1|(nR=!TPA*ST|Xk{HTN<-2`d~?m+$?a8(Yy_ng~b#w>Am1hYyRvzsp%p7E0
z^eVh$r0ItJz;zKUO~_6?p_i22jGt1y{-SDt-NHgwxeIohEBv
z>t&X6`nL+jgElhAQ#f{{Jh5`5FiGv@dE+-UAU9Ge44Fm6te?26TxdclZNDS8*?v|`@`k1o#aJ%sM0X2j)`i%5|oZrW7e+2BcAQ@c$I%9nA
z(}ew@>Xwx`#mj`HY3(+PICX`z^T$If>CxDo>hOzAf`iKXUmP@L_b2#jypnI69mmA6
zUj}M;k_$!8lo!!hUjn8h!2Tz$LdZVR+Dw@cGz6{
z+WqE?)CbRYE3J+WOLuth#^nz-XrORg)F6zBay>xt-95a+Fn;sio=NmO)Uu=
zos%7|d4^w9;$gn_Bo3?k@PIg*uQX5*7jGp~V-XAD9r_d9H2To*iNOV$-$%gx(Q-Z!
z>gBO3LyVB*guGy{llA1rH6mB})o%t*?Z+*Z+}^!bqFb_t<^zR{%hspKp7Oz48Z?u&
zfYO|tT>6{6@D$VkjK^Htq5^Z$lwM3P*uy5@t>#P#E~d9-YCb>zri!>C$s!)IUEyg3
zxA1AWvW6x(dAjD<%EWSvSM1Cg>1T0co0S$;t}odg5d#_5zBa-~mOHNgCOFu*Sl_V<
GjQuY#UXp$Q
literal 0
HcmV?d00001
diff --git a/import_mod/index.html b/import_mod/index.html
index c2553e6..1511b4d 100644
--- a/import_mod/index.html
+++ b/import_mod/index.html
@@ -15,7 +15,7 @@
-
+
@@ -877,7 +877,7 @@ vmray_rest_api
-
+
diff --git a/import_mod/logos/hyas.png b/import_mod/logos/hyas.png
new file mode 100644
index 0000000000000000000000000000000000000000..42acf22f590ec113c0fb09e7691780a20e3f1544
GIT binary patch
literal 3219
zcmbtXc{r4N8y;D+rYRwf!6DQv#_ZY0E|NVmjG1@LoXpY~Ym1`Lt|%c1EhkHo>{G;MP;s7WMIB)|gr6lf$XgdIwZG}ZpDOBBslw-MUV?-2ezQ|-S@
z`8c~mNgN&k#ln#=DiVo;;s|gfEEdyT!P-I1!-+tGWGQ72q+$0h%q3!-9TK4w3l}1AjFK
zjYAcg;QrJiQgLVuo)Q!UGsaM9Fggv5f#ET9EQ}Upgu-BvM#d-%Mf-=Ei2ExQ|A!hv
zWEinp{eN`B&n;1ltxkXSwrKI|b^vVAmEehb-=ob74+6;yIaphIM0QVRtn~m#Kpq=|
zdF#${6Lc&RyTT7tY>Pc*7m#0=!zc}VeJj8EhG%NwzK$yYSK&3qQ)SiNIaaI>-EuJB
z`!c_K=Jk==rsuf(SRWp4v~Xr6~Wi#
zW$;}mWm&O-g9BWMm{Pj*GaLl1)ZG!Q=bUt=?IW&TOmPII7Lw987Eb1hIjqmr>k6$V
zzpFrdz8$QRJhilmKl#Ra&`HHTyt=xss?2cvsxRGL<^pFZ)~P@hvVA&aLvbD`qF5
z`WHS6Q9~&k!TX;@T
zhF-TL+s&?r=tp~|)?HP>Qg~)+(P48|R<;3O<|@wvTdKG%R~&qsxjcimxB$DW*sX&j?c9f5v@GB*ZJqKlTJ}q}wC
z-Z0HHceCA^cl&N&{=s_u?off+%F?mVqLu4^oNtP_zn~E%!NtIfk
znb~{igJ1j7M(KD$D(sSG3@T=U;K(-^wbRXYR~~J;7)3rGf7!Y>spP?8eo+D>iTCY~
zk+P0==*-94GR>7TF~-yLYcgzeqxfl~37Y=TW&QBx^h34y-Fr+~^tQ$rrB7Uw*CEqWdbU(WFr&(E!)iDiJ;2lbBJ@&bR)uo^YVzFB6P-SLNX;t^Kc#k`j)V;p-Z>yEUz8;vE0$euYg!dx{}{&D%5Q|JOXQpLo53Irn{%{
zTwnW1kd4Vz@CA&*A=MdScYW5mqb|;K8dz@5SG*7!U(?9Hl4iaO_4|e%Py6H(WpyVV
zb4nHHsehKvalA50?=1U{(GpDx7nLG&1I1cy87>%P-CjfbXj7}Q^*0$3NsELpLlP#9
z&UZcAGbPZ()E-zzJW*8Fz3Gz<6+1$b4oO32q&=$)+y?s=FraiG@h$_nt{n8vnRkbo`kI+5ej@Dr?3LIrpvtQ26Z>r5bO@73<
zG*<5^@w_O^!k*&u=e(h>cO~mhclQ{qXXt8=V#SBldxjD+kFu4X-Fy}`Os~S*dsyio
z>1|(nR=!TPA*ST|Xk{HTN<-2`d~?m+$?a8(Yy_ng~b#w>Am1hYyRvzsp%p7E0
z^eVh$r0ItJz;zKUO~_6?p_i22jGt1y{-SDt-NHgwxeIohEBv
z>t&X6`nL+jgElhAQ#f{{Jh5`5FiGv@dE+-UAU9Ge44Fm6te?26TxdclZNDS8*?v|`@`k1o#aJ%sM0X2j)`i%5|oZrW7e+2BcAQ@c$I%9nA
z(}ew@>Xwx`#mj`HY3(+PICX`z^T$If>CxDo>hOzAf`iKXUmP@L_b2#jypnI69mmA6
zUj}M;k_$!8lo!!hUjn8h!2Tz$LdZVR+Dw@cGz6{
z+WqE?)CbRYE3J+WOLuth#^nz-XrORg)F6zBay>xt-95a+Fn;sio=NmO)Uu=
zos%7|d4^w9;$gn_Bo3?k@PIg*uQX5*7jGp~V-XAD9r_d9H2To*iNOV$-$%gx(Q-Z!
z>gBO3LyVB*guGy{llA1rH6mB})o%t*?Z+*Z+}^!bqFb_t<^zR{%hspKp7Oz48Z?u&
zfYO|tT>6{6@D$VkjK^Htq5^Z$lwM3P*uy5@t>#P#E~d9-YCb>zri!>C$s!)IUEyg3
zxA1AWvW6x(dAjD<%EWSvSM1Cg>1T0co0S$;t}odg5d#_5zBa-~mOHNgCOFu*Sl_V<
GjQuY#UXp$Q
literal 0
HcmV?d00001
diff --git a/index.html b/index.html
index ea5a7eb..dcdb336 100644
--- a/index.html
+++ b/index.html
@@ -15,7 +15,7 @@
-
+
@@ -722,7 +722,7 @@ For further information please see Contribute.
-
+
diff --git a/install/index.html b/install/index.html
index 8737f01..a9dc8d4 100644
--- a/install/index.html
+++ b/install/index.html
@@ -15,7 +15,7 @@
-
+
@@ -337,13 +337,77 @@
-
- How to install and start MISP modules on RHEL-based distributions ?
+
+ BEGIN with virtualenv:
+
+ END with virtualenv
+
+
+
+
+
+
+ Ideally you add your user to the staff group and make /usr/local/src group writeable, below follows an example with user misp
+
+
+
+
+
+
+ Install gtcaca/faup
+
+
+
+
+
+
+ BEGIN with virtualenv:
+
+
+
+
+
+
+ END with virtualenv
+
+
+
+
+
+
+ BEGIN without virtualenv:
+
+
+
+
+
+
+ END without virtualenv
+
+
+
+
+
+
+ Start misp-modules as a service
+
+
+
@@ -378,10 +440,37 @@
+
+ Start Redis
+
+
+
+
+
+
+ Start MISP-modules
+
+
+
+
@@ -487,13 +576,77 @@
-
- How to install and start MISP modules on RHEL-based distributions ?
+
+ BEGIN with virtualenv:
+
+ END with virtualenv
+
+
+
+
+
+
+ Ideally you add your user to the staff group and make /usr/local/src group writeable, below follows an example with user misp
+
+
+
+
+
+
+ Install gtcaca/faup
+
+
+
+
+
+
+ BEGIN with virtualenv:
+
+
+
+
+
+
+ END with virtualenv
+
+
+
+
+
+
+ BEGIN without virtualenv:
+
+
+
+
+
+
+ END without virtualenv
+
+
+
+
+
+
+ Start misp-modules as a service
+
+
+
@@ -528,10 +679,37 @@
+
+ Start Redis
+
+
+
+
+
+
+ Start MISP-modules
+
+
+
+
@@ -547,173 +725,171 @@
- Install Guides
-
How to install and start MISP modules (in a Python virtualenv)?¶
-SUDO_WWW="sudo -u www-data"
-
-sudo apt-get install -y \
- git \
- libpq5 \
- libjpeg-dev \
- tesseract-ocr \
- libpoppler-cpp-dev \
- imagemagick virtualenv \
- libopencv-dev \
- zbar-tools \
- libzbar0 \
- libzbar-dev \
- libfuzzy-dev \
- libcaca-dev
-
-# BEGIN with virtualenv:
-$SUDO_WWW virtualenv -p python3 /var/www/MISP/venv
-# END with virtualenv
-
-cd /usr/local/src/
-# Ideally you add your user to the staff group and make /usr/local/src group writeable, below follows an example with user misp
-sudo adduser misp staff
-sudo chmod 2775 /usr/local/src
+~~bash
+SUDO_WWW="sudo -u www-data"
+sudo apt-get install -y \
+ git \
+ libpq5 \
+ libjpeg-dev \
+ tesseract-ocr \
+ libpoppler-cpp-dev \
+ imagemagick virtualenv \
+ libopencv-dev \
+ zbar-tools \
+ libzbar0 \
+ libzbar-dev \
+ libfuzzy-dev \
+ libcaca-dev
+BEGIN with virtualenv:¶
+$SUDO_WWW virtualenv -p python3 /var/www/MISP/venv
+END with virtualenv¶
+cd /usr/local/src/
+Ideally you add your user to the staff group and make /usr/local/src group writeable, below follows an example with user misp¶
+sudo adduser misp staff
+sudo chmod 2775 /usr/local/src
sudo chown root:staff /usr/local/src
-git clone https://github.com/MISP/misp-modules.git
+git clone https://github.com/MISP/misp-modules.git
git clone git://github.com/stricaud/faup.git faup
-git clone git://github.com/stricaud/gtcaca.git gtcaca
-
-# Install gtcaca/faup
-cd gtcaca
+git clone git://github.com/stricaud/gtcaca.git gtcaca
+Install gtcaca/faup¶
+cd gtcaca
mkdir -p build
-cd build
-cmake .. && make
+cd build
+cmake .. && make
sudo make install
-cd ../../faup
+cd ../../faup
mkdir -p build
-cd build
-cmake .. && make
+cd build
+cmake .. && make
sudo make install
-sudo ldconfig
-
-cd ../../misp-modules
-
-# BEGIN with virtualenv:
-$SUDO_WWW /var/www/MISP/venv/bin/pip install -I -r REQUIREMENTS
-$SUDO_WWW /var/www/MISP/venv/bin/pip install .
-# END with virtualenv
-
-# BEGIN without virtualenv:
-sudo pip install -I -r REQUIREMENTS
-sudo pip install .
-# END without virtualenv
-
-# Start misp-modules as a service
-sudo cp etc/systemd/system/misp-modules.service /etc/systemd/system/
+sudo ldconfig
+cd ../../misp-modules
+BEGIN with virtualenv:¶
+$SUDO_WWW /var/www/MISP/venv/bin/pip install -I -r REQUIREMENTS
+$SUDO_WWW /var/www/MISP/venv/bin/pip install .
+END with virtualenv¶
+BEGIN without virtualenv:¶
+sudo pip install -I -r REQUIREMENTS
+sudo pip install .
+END without virtualenv¶
+Start misp-modules as a service¶
+sudo cp etc/systemd/system/misp-modules.service /etc/systemd/system/
sudo systemctl daemon-reload
-sudo systemctl enable --now misp-modules
-/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 -s & #to start the modules
-
+sudo systemctl enable --now misp-modules
+/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 -s & #to start the modules
+~~
How to install and start MISP modules on RHEL-based distributions ?¶
As of this writing, the official RHEL repositories only contain Ruby 2.0.0 and Ruby 2.1 or higher is required. As such, this guide installs Ruby 2.2 from the SCL repository.
-SUDO_WWW="sudo -u apache"
-sudo yum install \
- rh-ruby22 \
- openjpeg-devel \
- rubygem-rouge \
- rubygem-asciidoctor \
- zbar-devel \
- opencv-devel \
- gcc-c++ \
- pkgconfig \
- poppler-cpp-devel \
- python-devel \
+~~bash
+SUDO_WWW="sudo -u apache"
+sudo yum install \
+ rh-ruby22 \
+ openjpeg-devel \
+ rubygem-rouge \
+ rubygem-asciidoctor \
+ zbar-devel \
+ opencv-devel \
+ gcc-c++ \
+ pkgconfig \
+ poppler-cpp-devel \
+ python-devel \
redhat-rpm-config
-cd /usr/local/src/
-sudo git clone https://github.com/MISP/misp-modules.git
-cd misp-modules
-$SUDO_WWW /usr/bin/scl enable rh-python36 "virtualenv -p python3 /var/www/MISP/venv"
-$SUDO_WWW /var/www/MISP/venv/bin/pip install -U -I -r REQUIREMENTS
-$SUDO_WWW /var/www/MISP/venv/bin/pip install -U .
-
+cd /usr/local/src/
+sudo git clone https://github.com/MISP/misp-modules.git
+cd misp-modules
+$SUDO_WWW /usr/bin/scl enable rh-python36 "virtualenv -p python3 /var/www/MISP/venv"
+$SUDO_WWW /var/www/MISP/venv/bin/pip install -U -I -r REQUIREMENTS
+$SUDO_WWW /var/www/MISP/venv/bin/pip install -U .
+~~
Create the service file /etc/systemd/system/misp-modules.service :
-echo "[Unit]
-Description=MISP's modules
-After=misp-workers.service
-
-[Service]
-Type=simple
-User=apache
-Group=apache
-ExecStart=/usr/bin/scl enable rh-python36 rh-ruby22 '/var/www/MISP/venv/bin/misp-modules –l 127.0.0.1 –s'
-Restart=always
-RestartSec=10
-
-[Install]
-WantedBy=multi-user.target" | sudo tee /etc/systemd/system/misp-modules.service
-
+~~bash
+echo "[Unit]
+Description=MISP's modules
+After=misp-workers.service
+[Service]
+Type=simple
+User=apache
+Group=apache
+ExecStart=/usr/bin/scl enable rh-python36 rh-ruby22 '/var/www/MISP/venv/bin/misp-modules –l 127.0.0.1 –s'
+Restart=always
+RestartSec=10
+[Install]
+WantedBy=multi-user.target" | sudo tee /etc/systemd/system/misp-modules.service
+~~
The After=misp-workers.service must be changed or removed if you have not created a misp-workers service. Then, enable the misp-modules service and start it:
-systemctl daemon-reload
-systemctl enable --now misp-modules
-
+~~bash
+systemctl daemon-reload
+systemctl enable --now misp-modules
+~~
How to use an MISP modules Docker container¶
Docker build¶
-docker build -t misp-modules \
- --build-arg BUILD_DATE=$(date -u +"%Y-%m-%d") \
+~~bash
+docker build -t misp-modules \
+ --build-arg BUILD_DATE=$(date -u +"%Y-%m-%d") \
docker/
-
+~~
Docker run¶
-# Start Redis
-docker run --rm -d --name=misp-redis redis:alpine
-# Start MISP-modules
-docker run \
- --rm -d --name=misp-modules \
- -e REDIS_BACKEND=misp-redis \
- -e REDIS_PORT="6379" \
- -e REDIS_PW="" \
- -e REDIS_DATABASE="245" \
- -e MISP_MODULES_DEBUG="false" \
+~~bash
+Start Redis¶
+docker run --rm -d --name=misp-redis redis:alpine
+Start MISP-modules¶
+docker run \
+ --rm -d --name=misp-modules \
+ -e REDIS_BACKEND=misp-redis \
+ -e REDIS_PORT="6379" \
+ -e REDIS_PW="" \
+ -e REDIS_DATABASE="245" \
+ -e MISP_MODULES_DEBUG="false" \
dcso/misp-dockerized-misp-modules
-
+~~
Docker-compose¶
-services:
+~~yml
+services:
misp-modules:
- # https://hub.docker.com/r/dcso/misp-dockerized-misp-modules
- image: dcso/misp-dockerized-misp-modules:3
+ # https://hub.docker.com/r/dcso/misp-dockerized-misp-modules
+ image: dcso/misp-dockerized-misp-modules:3
+# Local image:
+#image: misp-modules
+#build:
+# context: docker/
- # Local image:
- #image: misp-modules
- #build:
- # context: docker/
-
- environment:
- # Redis
- REDIS_BACKEND: misp-redis
- REDIS_PORT: "6379"
- REDIS_DATABASE: "245"
- # System PROXY (OPTIONAL)
- http_proxy:
- https_proxy:
- no_proxy: 0.0.0.0
- # Timezone (OPTIONAL)
- TZ: Europe/Berlin
- # MISP-Modules (OPTIONAL)
- MISP_MODULES_DEBUG: "false"
- # Logging options (OPTIONAL)
- LOG_SYSLOG_ENABLED: "no"
- misp-redis:
- # https://hub.docker.com/_/redis or alternative https://hub.docker.com/r/dcso/misp-dockerized-redis/
- image: redis:alpine
+environment:
+ # Redis
+ REDIS_BACKEND: misp-redis
+ REDIS_PORT: "6379"
+ REDIS_DATABASE: "245"
+ # System PROXY (OPTIONAL)
+ http_proxy:
+ https_proxy:
+ no_proxy: 0.0.0.0
+ # Timezone (OPTIONAL)
+ TZ: Europe/Berlin
+ # MISP-Modules (OPTIONAL)
+ MISP_MODULES_DEBUG: "false"
+ # Logging options (OPTIONAL)
+ LOG_SYSLOG_ENABLED: "no"
+
+misp-redis:
+ # https://hub.docker.com/_/redis or alternative https://hub.docker.com/r/dcso/misp-dockerized-redis/
+ image: redis:alpine
+~~
Install misp-module on an offline instance.¶
First, you need to grab all necessary packages for example like this :
Use pip wheel to create an archive
-
mkdir misp-modules-offline
+~
+mkdir misp-modules-offline
pip3 wheel -r REQUIREMENTS shodan --wheel-dir=./misp-modules-offline
tar -cjvf misp-module-bundeled.tar.bz2 ./misp-modules-offline/*
-
+~
On offline machine :
-mkdir misp-modules-bundle
+~
+mkdir misp-modules-bundle
tar xvf misp-module-bundeled.tar.bz2 -C misp-modules-bundle
cd misp-modules-bundle
ls -1|while read line; do sudo pip3 install --force-reinstall --ignore-installed --upgrade --no-index --no-deps ${line};done
-
+~
Next you can follow standard install procedure.
@@ -806,7 +982,7 @@ Next you can follow standard install procedure.
-
+
diff --git a/license/index.html b/license/index.html
index 5a01369..139ba54 100644
--- a/license/index.html
+++ b/license/index.html
@@ -15,7 +15,7 @@
-
+
@@ -1078,7 +1078,7 @@ For more information on this, and how to apply and follow the GNU AGPL, see
-
+
diff --git a/logos/hyas.png b/logos/hyas.png
new file mode 100644
index 0000000000000000000000000000000000000000..42acf22f590ec113c0fb09e7691780a20e3f1544
GIT binary patch
literal 3219
zcmbtXc{r4N8y;D+rYRwf!6DQv#_ZY0E|NVmjG1@LoXpY~Ym1`Lt|%c1EhkHo>{G;MP;s7WMIB)|gr6lf$XgdIwZG}ZpDOBBslw-MUV?-2ezQ|-S@
z`8c~mNgN&k#ln#=DiVo;;s|gfEEdyT!P-I1!-+tGWGQ72q+$0h%q3!-9TK4w3l}1AjFK
zjYAcg;QrJiQgLVuo)Q!UGsaM9Fggv5f#ET9EQ}Upgu-BvM#d-%Mf-=Ei2ExQ|A!hv
zWEinp{eN`B&n;1ltxkXSwrKI|b^vVAmEehb-=ob74+6;yIaphIM0QVRtn~m#Kpq=|
zdF#${6Lc&RyTT7tY>Pc*7m#0=!zc}VeJj8EhG%NwzK$yYSK&3qQ)SiNIaaI>-EuJB
z`!c_K=Jk==rsuf(SRWp4v~Xr6~Wi#
zW$;}mWm&O-g9BWMm{Pj*GaLl1)ZG!Q=bUt=?IW&TOmPII7Lw987Eb1hIjqmr>k6$V
zzpFrdz8$QRJhilmKl#Ra&`HHTyt=xss?2cvsxRGL<^pFZ)~P@hvVA&aLvbD`qF5
z`WHS6Q9~&k!TX;@T
zhF-TL+s&?r=tp~|)?HP>Qg~)+(P48|R<;3O<|@wvTdKG%R~&qsxjcimxB$DW*sX&j?c9f5v@GB*ZJqKlTJ}q}wC
z-Z0HHceCA^cl&N&{=s_u?off+%F?mVqLu4^oNtP_zn~E%!NtIfk
znb~{igJ1j7M(KD$D(sSG3@T=U;K(-^wbRXYR~~J;7)3rGf7!Y>spP?8eo+D>iTCY~
zk+P0==*-94GR>7TF~-yLYcgzeqxfl~37Y=TW&QBx^h34y-Fr+~^tQ$rrB7Uw*CEqWdbU(WFr&(E!)iDiJ;2lbBJ@&bR)uo^YVzFB6P-SLNX;t^Kc#k`j)V;p-Z>yEUz8;vE0$euYg!dx{}{&D%5Q|JOXQpLo53Irn{%{
zTwnW1kd4Vz@CA&*A=MdScYW5mqb|;K8dz@5SG*7!U(?9Hl4iaO_4|e%Py6H(WpyVV
zb4nHHsehKvalA50?=1U{(GpDx7nLG&1I1cy87>%P-CjfbXj7}Q^*0$3NsELpLlP#9
z&UZcAGbPZ()E-zzJW*8Fz3Gz<6+1$b4oO32q&=$)+y?s=FraiG@h$_nt{n8vnRkbo`kI+5ej@Dr?3LIrpvtQ26Z>r5bO@73<
zG*<5^@w_O^!k*&u=e(h>cO~mhclQ{qXXt8=V#SBldxjD+kFu4X-Fy}`Os~S*dsyio
z>1|(nR=!TPA*ST|Xk{HTN<-2`d~?m+$?a8(Yy_ng~b#w>Am1hYyRvzsp%p7E0
z^eVh$r0ItJz;zKUO~_6?p_i22jGt1y{-SDt-NHgwxeIohEBv
z>t&X6`nL+jgElhAQ#f{{Jh5`5FiGv@dE+-UAU9Ge44Fm6te?26TxdclZNDS8*?v|`@`k1o#aJ%sM0X2j)`i%5|oZrW7e+2BcAQ@c$I%9nA
z(}ew@>Xwx`#mj`HY3(+PICX`z^T$If>CxDo>hOzAf`iKXUmP@L_b2#jypnI69mmA6
zUj}M;k_$!8lo!!hUjn8h!2Tz$LdZVR+Dw@cGz6{
z+WqE?)CbRYE3J+WOLuth#^nz-XrORg)F6zBay>xt-95a+Fn;sio=NmO)Uu=
zos%7|d4^w9;$gn_Bo3?k@PIg*uQX5*7jGp~V-XAD9r_d9H2To*iNOV$-$%gx(Q-Z!
z>gBO3LyVB*guGy{llA1rH6mB})o%t*?Z+*Z+}^!bqFb_t<^zR{%hspKp7Oz48Z?u&
zfYO|tT>6{6@D$VkjK^Htq5^Z$lwM3P*uy5@t>#P#E~d9-YCb>zri!>C$s!)IUEyg3
zxA1AWvW6x(dAjD<%EWSvSM1Cg>1T0co0S$;t}odg5d#_5zBa-~mOHNgCOFu*Sl_V<
GjQuY#UXp$Q
literal 0
HcmV?d00001
diff --git a/logos/misp-modules-full-small.png b/logos/misp-modules-full-small.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbbc084c73089f2da3e8ded28b1e31c443565f70
GIT binary patch
literal 10835
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
literal 0
HcmV?d00001
diff --git a/logos/misp-modules-full.png b/logos/misp-modules-full.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b432e323a642e76f1296635fc0fc6c45425ac46
GIT binary patch
literal 151790
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