社区
安全技术/病毒
帖子详情
关于ACE和DACL
wenjiu5
2002-10-21 07:38:26
最近看到了一些文章上提到了ACE、DACL等一些术语,我查了一些资料,但这些资料上的讲解非常少。请问这些术语是什么意思,在哪里(或哪本书)上有关于该术语的详细解释,在程序中怎样使用?谢谢!
...全文
88
回复
打赏
收藏
关于ACE和DACL
最近看到了一些文章上提到了ACE、DACL等一些术语,我查了一些资料,但这些资料上的讲解非常少。请问这些术语是什么意思,在哪里(或哪本书)上有关于该术语的详细解释,在程序中怎样使用?谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
藏经阁-An-
ACE
-Up-The-Sleeve-Designing-Active-Directory-D
ACL
-Backdoo
藏经阁-An-
ACE
-Up-The-Sleeve-Designing-Active-Directory-D
ACL
-Backdoors.pdf
WindowsD
ACL
EnumProject:枚举和分析Windows D
ACL
的工具集合
Windows D
ACL
枚举项目 枚举和分析Windows D
ACL
的工具集合 NCC Group Plc作为开源发布-http: 由nccgroup dot com的ollie dot whitehouse开发,由Ollie Whitehouse开发 根据AGPL发布,请参阅许可以获取更多信息 Windows D
ACL
和
ACE
概述 阅读-http: 工具#1:过程权限 特征 作为该项目的一部分发布的第一个工具。 将枚举: 进程及其运行的完整性级别和用户。 可选:与流程对象关联的D
ACL
。 可选:进程的线程以及与之关联的D
ACL
。 可选:进程加载的模块 可选:从输出中排除未映射的SID 该工具将自动标记任何可疑的D
ACL
。 命令行选项 命令行采用以下选项: -p进程权限 -m模块 -t线程和权限 -o [PID] -x从警报中排除未映射的SID 典型用法 典型用法是在
Sharpmad:Powermad的C#版本
夏普 C#版本的Powermad 尚未完成,尚未经过全面测试。 它还缺少以下内容: 调用DNS更新 取得KerberosAESKey 临时自述文件 ADIDNS模块 Sharpmad.exe ADIDNS -Action new -Node test 行动 描述 Add
ACE
将
ACE
添加到节点。 禁用 逻辑删除一个节点。 GetD
ACL
获取节点或区域D
ACL
。 GetOwner 获取节点所有者。 GetAttribute 获取节点属性值。 GetTombsone 获取节点逻辑删除状态。 GetZone 获取区域分区位置。 新的 添加一个节点。 GetAttribute 设置节点属性值。 设置所有者 设置节点所有者。 消除 删除节点。 改名 重命名节点。 删除
ACE
从节点删除
ACE
。 MachineAccountQuota模块 Sharpm
Delphi 创建高权限进程
program Project1; //{$APPTYPE CONSOLE} uses windows, SysUtils, tlhelp32, accctrl,
acl
api; procedure SetPrivilege; var OldTokenPrivileges, TokenPrivileges: TTokenPrivileges; ReturnLength: dword; hToken: THandle; Luid: int64; begin OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken); LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid); TokenPrivileges.Privileges[0].luid := Luid; TokenPrivileges.PrivilegeCount := 1; TokenPrivileges.Privileges[0].Attributes := 0; AdjustTokenPrivileges(hToken, False, TokenPrivileges, SizeOf(TTokenPrivileges), OldTokenPrivileges, ReturnLength); OldTokenPrivileges.Privileges[0].luid := Luid; OldTokenPrivileges.PrivilegeCount := 1; OldTokenPrivileges.Privileges[0].Attributes := TokenPrivileges.Privileges[0].Attributes or SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, False, OldTokenPrivileges, ReturnLength, PTokenPrivileges(nil)^, ReturnLength); end; function GetProcessID(EXE_Name: PChar): THandle; var s: string; ok: Bool; ProcessListHandle: THandle; ProcessStruct: TProcessEntry32; begin Result := 0; //获得进程列表句柄 ProcessListHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); try ProcessStruct.dwSize := SizeOf(ProcessStruct); //获得第一个进程句柄 ok := Process32First(ProcessListHandle, ProcessStruct); while ok do begin s := ExtractFileName(ProcessStruct.szExeFile);//获取进程的可执行文件名称 if AnsiCompareText(Trim(s), EXE_Name)=0 then//如果是HL程序名,表示找到游戏进程。 begin Result := ProcessStruct.th32ProcessID;//保留游戏进程句柄 break; end; ok := Process32Next(ProcessListHandle, ProcessStruct);//获取下一个进程信息。 end; finally CloseHandle(ProcessListHandle);//关闭进程列表句柄 end; end; ///////////////////////////////////////////////////////////////// Function CreateSystemProcess(szProcessName: LPTSTR): BOOL; Var hProcess: THANDLE; hToken, hNewToken: THANDLE; dwPid: DWORD; pOldD
Acl
: P
ACL
; pNewD
Acl
: P
ACL
; bD
Acl
: BOOL; bDefD
Acl
: BOOL; dwRet: DWORD; pS
acl
: P
ACL
; pSidOwner: PSID; pSidPrimary: PSID; dw
Acl
Size: DWORD; dwS
acl
Size: DWORD; dwSidOwnLen: DWORD; dwSidPrimLen: DWORD; dwSDLen: DWORD; ea: EXPLICIT_ACCESS; pOrigSd: PSECURITY_DESCRIPTOR; pNewSd: PSECURITY_DESCRIPTOR; si: STARTUPINFO; pi: PROCESS_INFORMATION; bError: BOOL; Label Cleanup; begin pOldD
Acl
:= nil; pNewD
Acl
:= nil; pS
acl
:= nil; pSidOwner:= nil; pSidPrimary:= nil; dw
Acl
Size:= 0; dwS
acl
Size:= 0; dwSidOwnLen:= 0; dwSidPrimLen:= 0; pOrigSd:= nil; pNewSd:= nil; SetPrivilege; // 选择 WINLOGON 进程 dwPid := GetProcessId('WINLOGON.EXE'); If dwPid = High(Cardinal) Then begin bError := TRUE; Goto Cleanup; end; hProcess := OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwPid); If hProcess = 0 Then begin bError := TRUE; Goto Cleanup; end; If not OpenProcessToken(hProcess,READ_CONTROL or WRITE_DAC,hToken) Then begin bError := TRUE; Goto Cleanup; end; // 设置
ACE
具有所有访问权限 ZeroMemory(@ea, Sizeof(EXPLICIT_ACCESS)); BuildExplicitAccessWithName(@ea, 'Everyone', TOKEN_ALL_ACCESS, GRANT_ACCESS, 0); If not GetKernelObjectSecurity(hToken, D
ACL
_SECURITY_INFORMATION, pOrigSd, 0, dwSDLen) Then begin {第一次调用给出的参数肯定返回这个错误,这样做的目的是 为了得到原安全描述符 pOrigSd 的长度} // HEAP_ZERO_MEMORY = 8;HEAP_GENERATE_EXCEPTIONS = &H4 If GetLastError = ERROR_INSUFFICIENT_BUFFER Then begin pOrigSd := HeapAlloc(GetProcessHeap(), $00000008, dwSDLen); If pOrigSd = nil Then begin bError := TRUE; Goto Cleanup; end; // 再次调用才正确得到安全描述符 pOrigSd If not GetKernelObjectSecurity(hToken, D
ACL
_SECURITY_INFORMATION, pOrigSd, dwSDLen, dwSDLen) Then begin bError := TRUE; Goto Cleanup; end; end Else begin bError := TRUE; Goto Cleanup; end; end;//GetKernelObjectSecurity() // 得到原安全描述符的访问控制列表
ACL
If not GetSecurityDescriptorD
acl
(pOrigSd,bD
Acl
,pOldD
Acl
,bDefD
Acl
) Then begin bError := TRUE; goto Cleanup; end; // 生成新
ACE
权限的访问控制列表
ACL
dwRet := SetEntriesIn
Acl
(1,@ea,pOldD
Acl
,pNewD
Acl
); If dwRet ERROR_SUCCESS Then begin pNewD
Acl
:= nil; bError := TRUE; goto Cleanup; end; If not MakeAbsoluteSD(pOrigSd, pNewSd, dwSDLen, pOldD
Acl
^, dw
Acl
Size, pS
acl
^, dwS
acl
Size, pSidOwner, dwSidOwnLen, pSidPrimary, dwSidPrimLen) Then begin {第一次调用给出的参数肯定返回这个错误,这样做的目的是 为了创建新的安全描述符 pNewSd 而得到各项的长度} If GetLastError = ERROR_INSUFFICIENT_BUFFER Then begin pOldD
Acl
:= HeapAlloc(GetProcessHeap(), $00000008, dw
Acl
Size); pS
acl
:= HeapAlloc(GetProcessHeap(), $00000008, dwS
acl
Size); pSidOwner := HeapAlloc(GetProcessHeap(), $00000008, dwSidOwnLen); pSidPrimary := HeapAlloc(GetProcessHeap(), $00000008, dwSidPrimLen); pNewSd := HeapAlloc(GetProcessHeap(), $00000008, dwSDLen); If (pOldD
Acl
= nil) or (pS
acl
= nil) or (pSidOwner = nil) or (pSidPrimary = nil) or (pNewSd = nil) Then begin bError := TRUE; goto Cleanup; end; {再次调用才可以成功创建新的安全描述符 pNewSd 但新的安全描述符仍然是原访问控制列表
ACL
} If not MakeAbsoluteSD(pOrigSd, pNewSd, dwSDLen, pOldD
Acl
^, dw
Acl
Size, pS
acl
^, dwS
acl
Size, pSidOwner, dwSidOwnLen, pSidPrimary, dwSidPrimLen) Then begin bError := TRUE; goto Cleanup; end; end Else begin bError := TRUE; goto Cleanup; end; end; {将具有所有访问权限的访问控制列表 pNewD
Acl
加入到新的 安全描述符 pNewSd 中} If not SetSecurityDescriptorD
acl
(pNewSd,bD
Acl
,pNewD
Acl
,bDefD
Acl
) Then begin bError := TRUE; goto Cleanup; end; // 将新的安全描述符加到 TOKEN 中 If not SetKernelObjectSecurity(hToken,D
ACL
_SECURITY_INFORMATION,pNewSd) Then begin bError := TRUE; goto Cleanup; end; // 再次打开 WINLOGON 进程的 TOKEN,这时已经具有所有访问权限 If not OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,hToken) Then begin bError := TRUE; goto Cleanup; end; // 复制一份具有相同访问权限的 TOKEN If not DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, nil, SecurityImpersonation, TokenPrimary, hNewToken) Then begin bError := TRUE; goto Cleanup; end; ZeroMemory(@si,Sizeof(STARTUPINFO)); si.cb := Sizeof(STARTUPINFO); {不虚拟登陆用户的话,创建新进程会提示 1314 客户没有所需的特权错误} ImpersonateLoggedOnUser(hNewToken); {我们仅仅是需要建立高权限进程,不用切换用户 所以也无需设置相关桌面,有了新 TOKEN 足够} // 利用具有所有权限的 TOKEN,创建高权限进程 If not CreateProcessAsUser(hNewToken, nil, szProcessName, nil, nil, FALSE, 0, nil, nil, si, pi) Then begin bError := TRUE; goto Cleanup; end; bError := FALSE; Cleanup: If pOrigSd = nil Then HeapFree(GetProcessHeap(),0,pOrigSd); If pNewSd = nil Then HeapFree(GetProcessHeap(),0,pNewSd); If pSidPrimary = nil Then HeapFree(GetProcessHeap(),0,pSidPrimary); If pSidOwner = nil Then HeapFree(GetProcessHeap(),0,pSidOwner); If pS
acl
= nil Then HeapFree(GetProcessHeap(),0,pS
acl
); If pOldD
Acl
= nil Then HeapFree(GetProcessHeap(),0,pOldD
Acl
); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); CloseHandle(hToken); CloseHandle(hNewToken); //CloseHandle(hProcess); If bError Then Result := FALSE Else Result := True; end; begin CreateSystemProcess('test.exe'); { TODO -oUser -cConsole Main : Insert code here } end.
关于:Windows 中的
ACL
,D
ACL
,S
ACL
和
ACE
关于:Windows 中的
ACL
,D
ACL
,S
ACL
和
ACE
安全技术/病毒
9,506
社区成员
28,984
社区内容
发帖
与我相关
我的任务
安全技术/病毒
Windows专区 安全技术/病毒
复制链接
扫一扫
分享
社区描述
Windows专区 安全技术/病毒
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章