extractors/redlinestealer/redlinestealer_config_extractor.py (50 lines of code) (raw):
# coding: "utf-8"
import argparse
import pathlib
import functools
import json
from nightmare.malware.redlinestealer import configuration
from nightmare import utils
def parse_arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser("RedLine Stealer configuration extractor")
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("-f", "--file", type=pathlib.Path, help="file")
group.add_argument("-d", "--directory", type=pathlib.Path, help=" directory")
parser.add_argument(
"-o",
"--outfile",
type=pathlib.Path,
required=True,
)
return parser.parse_args()
def extract_config(file: pathlib.Path) -> dict[str, str] | None:
"""
Extracts configuration from a RedLine Stealer sample.
:param file: The path to the RedLine Stealer sample.
:return: The configuration extracted from the file if successful.
None if extraction fails or encounters an exception.
"""
try:
return configuration.extract(file.read_bytes())
except RuntimeError as e:
print(e)
return None
def process_redlinestealer_file(file: pathlib.Path) -> dict[str, str] | None:
if not file.is_file():
return None
if not (config := extract_config(file)):
print(f"Failed to extract config from {file}")
return None
return config
def main() -> None:
args = parse_arguments()
outfile = args.outfile
configs = dict()
if args.file:
config = process_redlinestealer_file(args.file)
if config:
configs[args.file.as_posix()] = config
elif args.directory:
for filename, config in utils.map_files_directory(
args.directory, functools.partial(process_redlinestealer_file)
):
if config:
configs.update({filename.as_posix(): config})
if configs:
outfile.write_text(json.dumps(configs))
print("[+] Extracted configuration written to {}".format(outfile))
if __name__ == "__main__":
main()