Microsoft Defender ATP

Microsoft Defender ATP

xmind

减少攻击面

| 规则名称 | GUID | 文件 & 文件夹排除 | 支持的最低操作系统 |
| ---- | ---- |---- | ---- |
| 阻止来自电子邮件客户端和 Web 邮件的可执行内容 | BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550 | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止所有 Office 应用程序创建子进程 | D4F940AB-401B-4EFC-AADC-AD5F3C50688A | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止 Office 应用程序创建可执行内容 | 3B576869-A4EC-4529-8536-B80A7769E899 | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止 Office 应用程序将代码注入其他进程 | 75668C1F-73B5-4CF0-BB93-3ECF5CB7CC84 | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止 JavaScript 或 VBScript 启动下载的可执行内容 | D3E037E1-3EB8-44C8-A917-57927947596D | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止执行可能混淆的脚本 | 5BEB7EFE-FD9A-4556-801D-275E5FFC04CC | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止 Office 宏的 Win32 API 调用 | 92E97FA1-2EDF-4476-BDD6-9DD0B4DDDC7B | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止可执行文件,除非它们满足流行、年龄或受信任的列表条件 | 01443614-cd74-433a-b99e-2ecdc07bfc25 | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 对勒索软件使用高级防护 | c1db55ab-c21a-4637-bb3f-a12568109d35 | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止从 Windows 本地安全颁发机构子系统中盗取凭据 ( # A0) | 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2 | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止从 PSExec 和 WMI 命令发起的进程创建 | d1e49aac-8f56-4280-b9ba-993a6d77406c | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止从 USB 运行的不受信任和未签名的进程 | b2b3f03d-6a65-4f7b-a9c7-1c7ef74a9ba4 | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止 Office 通信应用程序创建子进程 | 26190899-1602-49e8-8b27-eb1d0a1ce869 | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 阻止 Adobe Reader 创建子流程 | 7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c | 支持 | Windows 10 版本 1709 (RS3、内部版本 16299) 或更高版本 |
| 通过 WMI 事件订阅阻止持久性 | e6db77e5-3df2-4cf1-b95a-636979351e5b | 不支持 | Windows 10 版本 1903 (内部版本 18362) 或更高版本 |

Exploit Protection (漏洞利用保护)

  1. 任意代码保护(ACG) Arbitrary Code Guard
    https://www.anquanke.com/post/id/145884

  2. 阻止远程图像(Block remote images) 通过发送待远程图片的邮件,根据服务器图片的访问情况,确认邮件查阅

  3. 阻止不受信任的字体(Block untrusted fonts)

  4. 数据执行保护(DEP) DEP 的主要优点是可以帮助防止数据页执行代码

  5. 导出地址筛选(EAF)

  6. 强制ASLR Address Space Load Randomization

  7. Null 页安全缓解

  8. 随机内存分配(由下而上 ASLR)

  9. 模拟执行 (SimExec)

  10. 验证 API 调用 (CallerCheck)

  11. 验证异常链 (SEHOP)

  12. 验证堆栈完整性 (StackPivot)

  13. 证书信任(可配置的证书固定) 企业版证书

  14. 堆喷射分配

  15. 阻止低完整性图像

  16. 代码完整性防护

  17. 禁用扩展点

  18. 禁用win32k系统调用

  19. 不允许子进程

  20. 导入地址筛选(IAF)

  21. 验证处理使用情况

  22. 验证堆完整性

  23. 验证映像依赖项完整性

高低权限进程消息通信

测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void ChangeFilter(m_hWnd, WM_NOTEPAPER_SHOWTIP, MSGFLT_ALLOW);

DWORD CMainWindow::ChangeFilter(HWND hwnd, UINT uMsg, DWORD dwMsgFlt)
{
BOOL fSuccess = FALSE;
DWORD dwMsgFltInfo = MSGFLTINFO_NONE;
CHANGEFILTERSTRUCT ChangeFilterStruct;

ChangeFilterStruct.cbSize = sizeof(CHANGEFILTERSTRUCT);
fSuccess = ChangeWindowMessageFilterEx(hwnd, uMsg, dwMsgFlt, &ChangeFilterStruct);
dwMsgFltInfo = ChangeFilterStruct.ExtStatus;

if (!fSuccess) {
wprintf(L"\nChangeWindowMessageFilterEx failed with %lu", GetLastError());
dwMsgFltInfo = -1;
}

return dwMsgFltInfo;
}

window安全相关

整理于 http://www.cppblog.com/weiym/archive/2013/08/25/202751.html?opt=admin

xmind

判断是否管理员权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Windows API IsUserAnAdmin()
BOOL Am_I_In_Admin_Group(BOOL bCheckAdminMode /*= FALSE*/)
{
BOOL fAdmin;
HANDLE hThread;
TOKEN_GROUPS *ptg = NULL;
DWORD cbTokenGroups;
DWORD dwGroup;
PSID psidAdmin;
SID_IDENTIFIER_AUTHORITY SystemSidAuthority= SECURITY_NT_AUTHORITY;
if ( !OpenThreadToken ( GetCurrentThread(), TOKEN_QUERY, FALSE, &hThread))
{
if ( GetLastError() == ERROR_NO_TOKEN)
{
if (! OpenProcessToken ( GetCurrentProcess(), TOKEN_QUERY,
&hThread))
return ( FALSE);
}
else
return ( FALSE);
}
if ( GetTokenInformation ( hThread, TokenGroups, NULL, 0, &cbTokenGroups))
return ( FALSE);
if ( GetLastError() != ERROR_INSUFFICIENT_BUFFER)
return ( FALSE);
if ( ! ( ptg= (TOKEN_GROUPS*)_alloca ( cbTokenGroups)))
return ( FALSE);
if ( !GetTokenInformation ( hThread, TokenGroups, ptg, cbTokenGroups,
&cbTokenGroups) )
return ( FALSE);
if ( ! AllocateAndInitializeSid ( &SystemSidAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, &psidAdmin) )
return ( FALSE);
fAdmin= FALSE;
for ( dwGroup= 0; dwGroup < ptg->GroupCount; dwGroup++)
{
if ( EqualSid ( ptg->Groups[dwGroup].Sid, psidAdmin))
{
if(bCheckAdminMode)
{
if((ptg->Groups[dwGroup].Attributes) & SE_GROUP_ENABLED)
{
fAdmin = TRUE;
}
}
else
{
fAdmin = TRUE;
}
break;
}
}
FreeSid ( psidAdmin);
return ( fAdmin);
}

提权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//注意只有原来是Disable的权限才可以提成Enable, 如果原来就没有这个权限, 是提不上去的。

BOOL EnablePrivilege(HANDLE hToken, LPCTSTR lpszPrivilegeName)
{
TOKEN_PRIVILEGES tkp = {0};
BOOL bRet = LookupPrivilegeValue( NULL, lpszPrivilegeName, &tkp.Privileges[0].Luid );
if(!bRet) return FALSE;

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bRet = AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL );

return bRet;
}

如何判断用户的进程完整性级别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void CIntegrityLevel::Print(std::wostream& os) const
{
SID* pSid = (SID*)m_pIntegrity->Label.Sid;
DWORD rid = pSid->SubAuthority[0];

LPCTSTR lpszIntegrity = L"Unknown";
switch (rid)
{
case SECURITY_MANDATORY_UNTRUSTED_RID:
{
lpszIntegrity = L"Untrusted";
break;
}
case SECURITY_MANDATORY_LOW_RID:
{
lpszIntegrity = L"Low";
break;
}
case SECURITY_MANDATORY_MEDIUM_RID:
{
lpszIntegrity = L"Medium";
break;
}

case SECURITY_MANDATORY_MEDIUM_PLUS_RID:
{
lpszIntegrity = L"Medium +";
break;
}
case SECURITY_MANDATORY_HIGH_RID:
{
lpszIntegrity = L"High";
break;
}
case SECURITY_MANDATORY_SYSTEM_RID:
{
lpszIntegrity = L"System";
break;
}
default:
{
lpszIntegrity = L"XXXXX";
}
}

os << L"Integrity: " << lpszIntegrity << endl;
}

如何指定程序默认启动运行的级别?

在VC里配置Manifest文件.

  • asInvoker:默认选项,新的进程将简单地继承其父进程的访问令牌

  • highestAvailable:应用程序会选择该用户允许范围内尽可能高的权限。对于标准用户来说,该选项与asInvoker一样,而对于管理员来说,这就意味着请求Admin令牌。

  • requireAdministrator:应用程序需要Admin令牌。运行该程序时,标准用户将要输入管理员的用户名和密码,而管理员则要在弹出的确认对话框中进行确认。

  • AAA

程序员口头禅

  • 这个不是我做的
  • 这个做不了
  • 在我的电脑上是好的
  • 换个浏览器试试
  • 之前代码我没动过
  • 这个可以做,就是要很多时间
  • 这个操作用户不会这样干
  • 这坨代码太臭了
  • 下个版本做
  • 需求没有说清楚
  • 这个不支持
  • 原本是好的吗?
  • 你会不会操作(测)?
  • 啥都没改,自动好了

欢迎补充~

windows安全(1)

1.用户权限

管理员Administrator账户 Administrators组
权限:

标准用户(受限用户) user组

来宾用户 guest组

密码存在sam数据库

2.sid

查看Sid
whoami /user

SID 组 用途
s-1-1-0 everyone
s-1-2-0 local
s-1-3-0 Creator owner
s-1-3-1 Creator Group

3.ACL 访问控制列表(Access Control Lists)

登录给一个安全访问令牌(SAT) TOKEN 包含sid信息、

每个对象都有Acl ACL包含了sid的信息

DACL 是安全对象(securable object)的一个属性

SACL 是系统中的一个列表,用来记录指定用户(组)、指定类型的访问的访问结果,并记录。

4.ACE 访问控制项 (Access Control ITEM)

5.没有UAC文件系统和注册表虚拟化技术

6.应用程序清单文件

1、RunAsInvoker
2、RunAsHighest
3、RunAsAdmin

7.组域

开发最佳实践

  1. 最小特权原则 currentuser (CAN-2003-0352)
  2. 避免缓冲区溢出 writing solid code
  3. 加密 DPAPI
  4. 安全相关的编译链接选项开启
  5. 剔除被取缔API 和加密算法
    https://docs.microsoft.com/en-us/previous-versions/bb288454(v=msdn.10)?redirectedfrom=MSDN危险API列表 SDL检查 开启,vs工具会提示
  6. 不使用异常
    __try {}
    __except{} 不用
  7. EncodePointer DecodePointer 对指针处理
  8. 使用新版编译器
  9. 静态分析工具消除警告
  10. 使用x64程序
  11. SAL注解:用SAL注解所有C++字符串缓冲区
安全编译选项
  1. /GS 控制堆栈检查调用 (体积增大)https://docs.microsoft.com/zh-cn/cpp/build/reference/gs-control-stack-checking-calls?view=vs-2019

  2. /SafeSEH
    设计SafeSEH保护机制的目的,以为了防止那种攻击者通过覆盖堆栈上的异常处理函数句柄,从而控制程序执行流程的攻击。
    Windwos XP SP2

    1
    2
    dumpbin  __except_handler4   IMAGE_LOAD_CONFIG_DIRECTORY
    #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
  3. /DynamicBase 地址随机化 PE IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 操作系统必须开启ALSR功能,不然无效

  4. /NXCOMPAT PE头部
    DEP 数据执行保护 DEP,就是禁止应用程序和服务在非可执行的内存区(non-executable memory)上执行指令。
    DEP 分为软件DEP 和硬件DEP 硬件DEP 需要CPU提供支持

  5. /guard:cf 控制流防护编译选项和链接选项都要开启

Console 工程设置

c++ 控制台

1
2
3
4
5
6
7
SetConsoleOutputCP (65001);
CONSOLE_FONT_INFOEX info = { 0 }; // 以下设置字体来支持中文显示。
info.cbSize = sizeof(info);
info.dwFontSize.Y = 16; // leave X as zero
info.FontWeight = FW_NORMAL;
wcscpy(info.FaceName, L"Consolas");
SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), NULL, &info);

copy from vlpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
namespace UI
{
namespace Console
{
class Console
{
public:
/// <summary>Write to the command line window.</summary>
/// <param name="string">Content to write.</param>
/// <param name="length">Size of the content in wchar_t. The zero terminator is not
/// included.</param>
static void Write(const wchar_t* string, int length);

/// <summary>Write to the command line window.</summary>
/// <param name="string">Content to write.</param>
static void Write(const wchar_t* string);

/// <summary>Write to the command line window.</summary>
/// <param name="string">Content to write.</param>
static void Write(const std::wstring& string);

/// <summary>Write to the command line window with a CRLF.</summary>
/// <param name="string">Content to write.</param>
static void WriteLine(const std::wstring& string);

/// <summary>Read from the command line window.</summary>
/// <returns>The whole line read from the command line window.</returns>
static std::wstring Read();

static void SetColor(bool red, bool green, bool blue, bool light);
static void SetTitle(const std::wstring& string);
};
} // namespace console
} // namespace UI

botan 编译

密码学

“C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat”

python configure.py –cc=msvc –msvc-runtime=MT –disable-shared-library –cpu=x86_32 –cc-bin=”‘C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe’”

–list-modules

利用标准c++流读文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void do(){
std::string tmppath = "aa.zip";
std::ifstream is(tmppath.c_str(), std::ios_base::binary, _SH_DENYRW);

std::streampos current_pos1 = is.tellg();//记录下当前位置
is.seekg(0, std::ios::end);//移动到文件尾
std::streampos nSize = is.tellg();
is.seekg(current_pos1);
std::cout << nSize << std::endl;

is.clear();
is.seekg(0);

std::string fileContent;
std::copy(std::istream_iterator<unsigned char>(is), std::istream_iterator<unsigned char>(), std::back_inserter(fileContent));
std::cout << fileContent.size() << std::endl;

is.clear();
is.seekg(0);

std::string fileContent2;
std::copy(std::istreambuf_iterator<char>(is), std::istreambuf_iterator<char>(), std::back_inserter(fileContent2));
std::cout << fileContent2.size() << std::endl;

is.clear();
is.seekg(0);
std::vector<char> vecCHAR;
std::copy(std::istream_iterator<char>(is), std::istream_iterator<char>(), std::back_inserter(vecCHAR));
std::cout << vecCHAR.size() << std::endl;
return 0;

}

  • © 2020-2021 一潭清泓
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信