Conti Ransomware malware leak WITH LOCKER
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

239 lines
11 KiB

НАЗНАЧЕНИЕ ПРОЕКТА
Автоматизация тестирования файлов на детекты антивирусов (АВ в дальнейшем), и правильность работы клиента.
Подразумевается работа в следующем окружении:
* ОС: Windows 10 с последними обновлениями
* АВ: Windows Defender (встроенный АВ 10-ки). Интересует только этот АВ!
* есть криптопанель - это сайт, на котором лежат образцы для тестирования. С ним идет связь через обычные веб-запросы.
* есть админка - это сайт, с которым связывается клиент при запуске, и пишет туда логи своей работы.
СЦЕНАРИЙ РУЧНОГО ТЕСТИРОВАНИЯ
1. Подготовка виртуальной машины
2. Загрузка архива с файлом из криптопанели на рабочий стол виртуальной машины
3. Проверка сработки АВ на архив
4. Распаковка архива
5. Проверка сработки АВ на распакованный файл(ы)
6. Запуск распакованного файла
7. Проверка сработки АВ на запущенный файл
8. Ожидание в течение заданного времени
9. Проверка создания любого из каталогов (в дальнейшем обозначаем его как %dir%):
%appdata%\vcmsd\
default user\%appdata%\vcmcsd
(см. параметр №8 в разделе ВАРИАНТЫ РЕАЛИЗАЦИИ - проверка идет по этому списку)
10. Получение client ID из файла %dir%\FAQ
11. Подключение к админке
12. Ожидание в течение заданного времени
13. Поиск отстука программы по полученному client ID
Отстук представляет из себя несколько событий:
13.1. появление СВЕЖЕЙ записи с таким client ID в админке
(факт непустого ответа от API админки, и наличие в нем записи вида
2018-08-30 10:45:58.323278 1 3 online
)
13.2. появление записи о запуске модуля system info (наличие в ответе от API админки записи вида
2018-08-30 10:47:59.642231 systeminfo start 0 63
)
13.3. появление записи о запуске модуля injectDll (наличие в ответе от API админки записи вида
injectDll 2018-08-30 11:20:26.490341 start Success
)
14. Проверка сработки АВ после отстука
При ЛЮБОМ ДЕТЕКТЕ дальнейшая проверка должна остановиться. Все последующие тесты должны получить статус SKIPPED.
SKIPPED фактически означает провал теста, но мы заводим отдельный статус, для различения с простым провалом.
В криптопанель должно быть отправлено уведомление о провале (имя образца, список тестов с результатами).
АВТОТЕСТЫ
Автотест представляет из себя подпрограмму, проверяющую одно простое условие и возвращающую TRUE/FALSE о выполнении этого условия.
Список автотестов для данного сценария:
1. archive_static_detect - был ли детект АВ на шаге 3
2. unarchived_static_detect - был ли детект АВ на шаге 5
3. proactive_detect - был ли детект АВ на шаге 7
4. client_installed - проинсталлировался ли клиент (шаг 10)
5. client_knocked - отстучал ли клиент в админку (шаг 13.1)
6. client_sysinfo_loaded - отстучал ли клиент в админку шаг 13.2
7. client_inject_loaded - отстучал ли клиент в админку шаг 13.3
8. client_modules_detect - был ли детект АВ на шаге 14
ВАРИАНТЫ РЕАЛИЗАЦИИ
Предлагается реализовать автотесты на Powershell по возможности v2.0. Выбор версии обусловлен тем, что v2.0 есть на всех ОС начиная с Windows 7.
Обращение к криптопанели предполагается через API (пока что не готово). Обязательным параметром при работе через API
будет сетевое имя компьютера.
API АДМИНКИ
https://185.64.105.33/du8ASnIODJjksdb89fsibndg7s6giosulDSGsdgsyb78s87dgdsgszklj8zgh8dsgisgsdg/clientID_suffix
Здесь clientID_suffix - это часть строки из файла FAQ после точки.
Например, если в файле C:/users/user/AppData/Roaming/vsmcd/FAQ содержится строка DESKTOP-4KGAGIP_W10014393.701EBF802F2CB023A6C24D34D9F31071
то clientID_suffix - это строка 701EBF802F2CB023A6C24D34D9F31071
Запрос следует отправлять через HTTP POST
В запросе могут быть следующие поля:
- pass: пароль. Значение всегда фиксировано - строка f779f60d4868063d462c3f99656a8a6d
- timeout: глубина времени поиска отстука, в минутах. Параметр необязательный, значение на сервере по умолчанию - 15 минут.
Рекомендуется задавать время, равное "сейчас" - "начало времени проверки отстука".
Например
- проверка отстука началась в 13:02
- ...
- в 13:07 мы делаем проверку отстука, вычисляем значение timeout, которое необходимо задать в запросе: 13:07-13:02 == 5.
Сервер отвечает, что данных нет (отстука не было)
- в 13:08 мы вновь делаем проверку отстука, вычисляем значение timeout, которое необходимо задать в запросе: 13:08-13:02 == 6.
Сервер отвечает, что данных нет (отстука не было)
- в 13:09 мы вновь делаем проверку отстука, вычисляем значение timeout, которое необходимо задать в запросе: 13:09-13:02 == 7.
Сервер отдает данные, свидетельствующие о том, что отстук был. Мы завершаем тест со статусом "успех".
Наличие параметра timeout обусловлено тем, что автотесты на одной и той же машине могут проходить часто (каждые 15-20 минут).
При этом у машины может быть один и тот же clientID. Если не отфильтровывать данные по времени, то сервер может отдать
данные об отстуке от предыдущего теста (к примеру, мы тестили 20 минут назад на этой же машине, и сервер отдал нам данные
об отстуке с предыдущего теста -- это неправильно; ожидаемый нами результат - для текущего теста отстука не было).
API КРИПТОПАНЕЛИ
Криптопанель предоставляет API со следующими операциями:
1. дай мне следующий по приоритету файл в очереди для проверки на машине с именем %MACHINE%
HTTP POST /some-random-and-long-api-prefix/getfile
параметры:
pass: захардкоженый пароль - общий для всего API. Строка.
machine: доменное имя компьютера. Строка. Это имя берется непосредственно из свойств компьютера в ОС.
Ответ: json следующего вида:
{
"file_id": 32, // идентификатор файла в БД
"file": "TVqQAAMAAAAEAAAA//8AA" // тело файла в кодировке base64
}
Начиная с момента отдачи файла, данная машина помечается в БД как проверяюшая данный файл.
Повторные запросы с этой же машины на выдачу расцениваются как валидные --
это означает сетевой сбой при приеме файла на предыдущем запросе.
2. возьми результаты проверки файла на машине %MACHINE%
HTTP POST /some-random-and-long-api-prefix/setresult
параметры:
pass: захардкоженый пароль - общий для всего API. Строка.
machine: доменное имя компьютера. Строка.
status: 0|1. Число. Возможно только два значения - обозначающие "ok" и "failed" соответственно. Означает общий результат тестирования.
log: лог тестирования. Длинная строка (будем считать, до 64к, но в теории может быть и больше) в кодировке base64.
file_id: число. Идентификатор файла, полученный в предыдущем запросе.
Система смотрит, какой файл проверялся на данной машине, и проставляет ему соответствующий статус.
ЕСЛИ файл на данной машине НЕ проверялся, либо время начала проверки слишком давнее (больше 24 часов), данный запрос следует игнорировать
как невалидный.
НАСТРОЙКА СКРИПТА
Скрипт должен быть легко конфигурируем человеком, не знающим PowerShell. Для этого в заголовок скрипта
должны быть вынесены следующие параметры (список не исключительный - туда можно выносить и другие параметры по необходимости):
1. URL криптопанели для скачки архива
2. Логин криптопанели
3. Пароль криптопанели
4. URL админки
5. Логин админки
6. Пароль админки
7. Периодичность проверки результата теста, в секундах (sleep_every)
8. Список имен папок для проверки успеха инсталляции
ЛИБО URL в криптопанели, откуда взять их список
9. Таймаут ожидания от завершения загрузки архива до результата статического детекта 1 (в секундах) (1 минута)
10. Таймаут ожидания от распаковки архива до результата статического детекта 2 (в секундах) (1 минута)
11. Таймаут ожидания от запуска клиента до результата проактивного детекта (в секундах) (5 минут)
12. Таймаут ожидания от запуска клиента до проверки создания рабочих каталогов клиента (в секундах) (5 минуты)
13. Таймаут ожидания от запуска клиента до проверки отстука клиента в админку (в секундах) (15 минут)
(вероятно тут будет несколько таймаутов, по числу под-шагов 13.1, 13.2 итд - на усмотрение программиста)
модуль sysInfo - 10 минут
модуль injectDll - 5 минут
14. Таймаут ожидания от отстука клиента в админку, до результата проактивного детекта (шаги 13-14) (в секундах) (2 минуты)
По поводу таймаутов -- суть в том, что каждое событие мы ждем определенное кол-во времени. Если за это время мы события (минут)
не дождались, то мы принимаем решение о результате теста.
Вот на каждое событие у нас должен быть таймаут, даже если он не упомянут в ТЗ.
Алгоритм всех тестов следующий (C-style псевдокод):
bool result = false;
time_t started = time(NULL);
while(time(NULL) - started < test_timeout) {
if(test condition) {
result = true;
break;
}
sleep(sleep_every);
}
time_t end = time(NULL);
То, есть, мы вертимся в цикле, просыпаясь каждые sleep_every секунд, пока не настанет ожидаемое условие (например, детект, или отстук).
Если за test_timeout условие не настало, мы завершаем проверку и публикуем результат теста.
Для детектов, логика инверсная
true это НЕУДАЧА теста (детект был :-(
false это УСПЕХ теста (детекта не было)
Детекты Windows Defender предлагается проверять по логам в Event Viewer\Applications and Services Logs\Microsoft\Windows\Windows Defender
Это можно сделать коммандлетом (см. https://letitknow.wordpress.com/2012/09/02/powershell-and-the-applications-and-services-logs/):
Get-WinEvent "Microsoft-Windows-Windows Defender/Operational"
РЕЗУЛЬТАТЫ ТЕСТОВ
1. Вывод на экран результатов тестов с метками времени начала и завершения теста:
2018-08-14 00:01:02 archive_static_detect started
2018-08-14 00:01:12 archive_static_detect: OK
2018-08-14 00:01:22 unarchived_static_detect started
2018-08-14 00:01:32 unarchived_static_detect: OK
2018-08-14 00:01:42 proactive_detect started
2018-08-14 00:01:52 proactive_detect: FAILED!
2018-08-14 00:02:02 client_installed started
2018-08-14 00:01:12 client_installed: SKIPPED
2018-08-14 00:01:22 client_knocked started
2018-08-14 00:01:32 client_knocked: SKIPPED
2018-08-14 00:01:32 client_sysinfo_loaded started
2018-08-14 00:01:32 client_sysinfo_loaded: SKIPPED
2018-08-14 00:01:32 client_inject_loaded started
2018-08-14 00:01:32 client_inject_loaded: SKIPPED
2018-08-14 00:01:32 client_modules_detect started
2018-08-14 00:01:32 client_modules_detect: SKIPPED
2. Скрипт должен возвращать в ОС значение, равное количеству проваленных тестов.
3. Скрипт должен выдавать в криптопанель результат тестов (полный лог и общий статус успех/неудача)
АВТООБНОВЛЕНИЕ СКРИПТА
Полная автоматизация тестов возможна только с автоматизацией подготовки виртуальной машины к тесту.
Подготовка к тесту включает в себя:
- обновление Windows всеми последними изменениями (это делается раз в сутки с самого начала работы, и это нельзя автоматизировать)
- автообновление скрипта автотеста. Скрипт постоянно будет обновляться, т.к. будут меняться рабочие каталоги тестируемого бинарника.
Автообновление скрипта автотеста предлагается делать через API GitLab.
Для этого требуется 2 HTTP запроса:
- для авторизации в GitLab
- для закачки скрипта.
Подробный скрипт логина на Unix shell приведен здесь:
https://stackoverflow.com/questions/47948887/login-to-gitlab-using-curl
Соответственно, должны быть добавлены следующие конфигурационные параметры скрипта:
- URL web-интерфейса GitLab
- учетные данные GitLab
- URI к исходнику скрипта на GitLab.