Lsass.exe(이하 Lsass)는 Local Security Authority Subsystem Service의 약자로, 줄여서 LSA(Local Security Authority)라고도 하며, 사용 인증과 관련하여 밀접한 관련이 있다. %Systemroot%\System32\Lsass.exe에서 실행되는 유저 모드 프로세스로서, 시스템의 보안 정책, 사용자 인증, 이벤트 로그에 보안 감사 메시지 전달 등, 윈도우의 전반적인 보안 처리를 담당하며, 이러한 서비스 관리는 Lsasrv.dll(%Systemroot%\System32\lsasrv.dll)을 이용해 구현된다. 그리고 LSA 관련 설정은 아래 레지스트리(HKLM\SYSTEM\CurrentControlSet\Control\Lsa)에서 확인할 수 있다.
사용자 로그인 처리는 Winlogon이 사용자 상호 작용 역활을 담당하며, Winlogon에서 로드한 자격 증명 제공자로부터 LsaLogonUser API를 통해 사용자 이름과 패스워드(기타 다른 인증 토큰) 등 로그온 정보를 LSA가 전달 받게 된다. 그리고 해당 내용을 네트워크 계층과 응용 계층 사이에 위치한 SSPI(Security Support Provider Interface)로 전달된다. 이는 Lsass에서 제공하는 함수인 LsaLookup-AuthenticationPackage를 이용해 서로 다른 프로토콜간 통일화한 것으로, 이를 통해 적절한 인증 패키지를 선택하게 된다.
이후 윈도우는 커버로스(Kerberos)와 MSV1_0라는 두 가지 표준 인증 패키지를 이용하여 로그인을 진행하게 된다. 하나는 Active Directory, 즉 도메인(Domain) 환경인 경우로 Netlogon을 이용하여 보안 통신 프로토콜인 커버로스를 통해서 인증을 진행하게 된다.
그외 로컬 환경인 경우로 NTLM을 통해 인증을 진행한다(도메인 인증 실패시에도 로컬 인증을 시도한다). 아래 그림은 LSA의 처리 흐름을 설명한 그림으로, 사용자 로그인 및 프로그램 인증 진행시 각 도메인 환경과 로컬 환경에서 어떻게 자격 증명이 처리되는지 한눈에 확인할 수 있도록 동작 흐름을 간략하게 그림으로 표시하였다.
위와 같은 로그인 처리가 성공하면 Lsass는 사용자의 보안 프로파일을 담고 있는 접근 토큰 객체을 생성하기 위해 커널에 위치한 SRM(Security Reference Monitor)의 함수 NTCreateToken을 호출한다. 그럼 각 보안 구성 항목별 역할에 대해 정리해 보자.
SRM(Security Reference Monitor)
%Systemroot%\System32\ntoskrnl.exe에 포함된 커널 Executive 구성요소로, 보안 컨텍스트를 기술하기 위한 접근 토큰의 데이터 구조를 정의하고, 각 객체들에 대한 보안 접근 검사를 수행한다.
아래 그림은 SRM의 처리 흐름을 표현한것이다.
SRM의 커널 내 실처리 함수는 SeAccessCheck로서 각 오브젝트별로 가지고 있는 보안 디스크립터(SECURITY_DESCRIPTOR)를 이용해 현재 요청하는 요청 토큰과 비교하여 처리하게 된다.
SRM을 통해 처리되는 보안 구성 요소들은 로그온, 보안 로그, 보안 정책, 유저 계정 등이 있으며, 아래와 같이 SRM과 연결되어 권한에 대해 이상이 없는지 확인한다.
그럼 Windbg를 이용해 SRM 동작을 확인해 보도록 하자.
// !handle 혹은 !object 명령을 이용하여, Objectheader값이 저장된 주소를 확인하자.
0: kd> !object \ErrorLogPort
Object: e16bd830 Type: (823ea470) Port
ObjectHeader: e16bd818 (old version)
HandleCount: 1 PointerCount: 6
Directory Object: e10003f0 Name: ErrorLogPort
// _OBJECT_HEADER 구조체를 이용해 SecurityDescriptor가 위치한 주소값을 확인할 수 있다.
0: kd> dt nt!_OBJECT_HEADER e16bd818
+0x000 PointerCount : 0n6
+0x004 HandleCount : 0n1
+0x004 NextToFree : 0x00000001 Void
+0x008 Type : 0x823ea470 _OBJECT_TYPE
+0x00c NameInfoOffset : 0x10 ''
+0x00d HandleInfoOffset : 0 ''
+0x00e QuotaInfoOffset : 0 ''
+0x00f Flags : 0x20 ' '
+0x010 ObjectCreateInfo : 0x8056b700 _OBJECT_CREATE_INFORMATION
+0x010 QuotaBlockCharged : 0x8056b700 Void
+0x014 SecurityDescriptor : 0xe1672326 Void
+0x018 Body : _QUAD
// 이제 !sd 명령을 이용해 SecurityDescriptor의 권한 내용을 살펴 보는데, OBJECT_HEADER의0xe1672326값은 지난 오프셋 값을 포함하고 있어, -6을 해주어야 한다. 그러면 해당 오프젝트의 보안 설정값을 확인할 수 있다.
0: kd> !sd 0xe1672326-6
->Revision: 0x1
->Sbz1 : 0x0
->Control : 0x8004
SE_DACL_PRESENT
SE_SELF_RELATIVE
->Owner : S-1-5-32-544
->Group : S-1-5-18
->Dacl :
->Dacl : ->AclRevision: 0x2
->Dacl : ->Sbz1 : 0x0
->Dacl : ->AclSize : 0x44
->Dacl : ->AceCount : 0x2
->Dacl : ->Sbz2 : 0x0
->Dacl : ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[0]: ->AceFlags: 0x0
->Dacl : ->Ace[0]: ->AceSize: 0x14
->Dacl : ->Ace[0]: ->Mask : 0x001f0001
->Dacl : ->Ace[0]: ->SID: S-1-5-18
->Dacl : ->Ace[1]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[1]: ->AceFlags: 0x0
->Dacl : ->Ace[1]: ->AceSize: 0x18
->Dacl : ->Ace[1]: ->Mask : 0x00020001
->Dacl : ->Ace[1]: ->SID: S-1-5-32-544
->Sacl : is NULL
// 그럼 이제 실제 SeAccessCheck에 브레이크 포인트를 설정하고 값을 확인해 보도록 하자.
0: kd> bp nt!SeAccessCheck
0: kd> g
Breakpoint 0 hit
nt!SeAccessCheck:
8056e2c7 8bff mov edi,edi
// 브레이크 포인트에서 운영체제가 멈추면, 호출 스택을 확인할 수 있는 k 명령에 파라미터를 보여주는 b 옵션을 추가하여 SeAccessCheck에서 사용한 파라미터를 확인하자.
0: kd> kb
ChildEBP RetAddr Args to Child
f81839fc 8057b11a e1002268 81c0b164 00000001 nt!SeAccessCheck
f8183b04 8056f03b 822ee900 00000000 81c0b148 nt!IopParseDevice+0x2d1
// SeAccessCheck은 3개의 인자를 함께 전달하는데, e1002268는 접근하고자 하는 개체 정보, 즉 SECURITY DESCRIPTOR이다. 이를 통해 보안 설정 내용를 확인해 보도록 하자. 옵션 1을 추가하면, SID로 식별하여 알려준다. 이를 통해 개체의 소유자와 설정된 권한 정보를 볼 수 있다.
0: kd> !sd e1002268 1
->Revision: 0x1
->Sbz1 : 0x0
->Control : 0x8004
SE_DACL_PRESENT
SE_SELF_RELATIVE
->Owner : S-1-5-32-544 (Alias: BUILTIN\Administrators)
->Group : S-1-5-18 (Well Known Group: NT AUTHORITY\SYSTEM)
->Dacl :
->Dacl : ->AclRevision: 0x2
->Dacl : ->Sbz1 : 0x0
->Dacl : ->AclSize : 0x5c
->Dacl : ->AceCount : 0x4
->Dacl : ->Sbz2 : 0x0
->Dacl : ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[0]: ->AceFlags: 0x0
->Dacl : ->Ace[0]: ->AceSize: 0x14
->Dacl : ->Ace[0]: ->Mask : 0x001200a0
->Dacl : ->Ace[0]: ->SID: S-1-1-0 (Well Known Group: localhost\Everyone)
->Dacl : ->Ace[1]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[1]: ->AceFlags: 0x0
->Dacl : ->Ace[1]: ->AceSize: 0x14
->Dacl : ->Ace[1]: ->Mask : 0x001f01ff Mask : 0x001f01ff는 전체 권한을 뜻한다.
->Dacl : ->Ace[1]: ->SID: S-1-5-18 (Well Known Group: NT AUTHORITY\SYSTEM)
->Dacl : ->Ace[2]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[2]: ->AceFlags: 0x0
->Dacl : ->Ace[2]: ->AceSize: 0x18
->Dacl : ->Ace[2]: ->Mask : 0x001f01ff
->Dacl : ->Ace[2]: ->SID: S-1-5-32-544 (Alias: BUILTIN\Administrators)
->Dacl : ->Ace[3]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[3]: ->AceFlags: 0x0
->Dacl : ->Ace[3]: ->AceSize: 0x14
->Dacl : ->Ace[3]: ->Mask : 0x001200a0
->Dacl : ->Ace[3]: ->SID: S-1-5-12 (Well Known Group: NT AUTHORITY\RESTRICTED)
->Sacl : is NULL
// 그럼 이제 81c0b164를 확인해 보자. 81c0b164는 SECURITY_SUBJECT_CONTEXT 구조체로서, 접근을 요청한 프로세스의 토큰 정보를 알수 있다.
0: kd> dt _SECURITY_SUBJECT_CONTEXT 81c0b164
ntdll!_SECURITY_SUBJECT_CONTEXT
+0x000 ClientToken : (null)
+0x004 ImpersonationLevel : 0 ( SecurityAnonymous )
+0x008 PrimaryToken : 0xe1db1030 Void
+0x00c ProcessAuditId : 0x00000450 Void
// !token 명령을 통해 해당 토큰이 가지고 있는 권한을 확인하자. S-1-5-32-544는 윈도우 기본 생성 그룹으로서 Administrators를 뜻하므로 정상적으로 오브젝트에 접근할 수 있음을 확인할 수 있다.
0: kd> !token 0xe1db1030
_TOKEN e1db1030
TS Session ID: 0
User: S-1-5-18
Groups:
00 S-1-5-32-544
Attributes - Default Enabled Owner
01 S-1-1-0
Attributes - Mandatory Default Enabled
02 S-1-5-11
Attributes - Mandatory Default Enabled
Primary Group: S-1-5-18
Privs:
00 0x000000007 SeTcbPrivilege Attributes - Enabled Default
01 0x000000002 SeCreateTokenPrivilege Attributes -
02 0x000000009 SeTakeOwnershipPrivilege Attributes -
03 0x00000000f SeCreatePagefilePrivilege Attributes - Enabled Default
04 0x000000004 SeLockMemoryPrivilege Attributes - Enabled Default
05 0x000000003 SeAssignPrimaryTokenPrivilege Attributes -
06 0x000000005 SeIncreaseQuotaPrivilege Attributes -
07 0x00000000e SeIncreaseBasePriorityPrivilege Attributes - Enabled Default
08 0x000000010 SeCreatePermanentPrivilege Attributes - Enabled Default
09 0x000000014 SeDebugPrivilege Attributes - Enabled Default
10 0x000000015 SeAuditPrivilege Attributes - Enabled Default
11 0x000000008 SeSecurityPrivilege Attributes -
12 0x000000016 SeSystemEnvironmentPrivilege Attributes -
13 0x000000017 SeChangeNotifyPrivilege Attributes - Enabled Default
14 0x000000011 SeBackupPrivilege Attributes -
15 0x000000012 SeRestorePrivilege Attributes -
16 0x000000013 SeShutdownPrivilege Attributes -
17 0x00000000a SeLoadDriverPrivilege Attributes -
18 0x00000000d SeProfileSingleProcessPrivilege Attributes - Enabled Default
19 0x00000000c SeSystemtimePrivilege Attributes -
20 0x000000019 SeUndockPrivilege Attributes -
21 0x00000001c SeManageVolumePrivilege Attributes -
22 0x00000001d SeImpersonatePrivilege Attributes - Enabled Default
23 0x00000001e SeCreateGlobalPrivilege Attributes - Enabled Default
Authentication ID: (0,3e7)
Impersonation Level: Anonymous
TokenType: Primary
Source: *SYSTEM* TokenFlags: 0x89 ( Token in use )
Token ID: 116e8 ParentToken ID: 0
Modified ID: (0, 1490f)
RestrictedSidCount: 0 RestrictedSids: 00000000
LSA Security Policy Database
보안 정책을 저장하는 저장소로서 윈도우는 로컬 시스템의 보안 정책 데이터베이스와 계정 정보를 레지스트리 HKEY_LOCAL_MACHINE의 SAM과 SECURITY에 저장한다.
이 안에는, 로그인 방식과 도메 인리스트, 시스템 접근 권한, 보안 감사 수행에 대한 내용이 들어 있으며, 캐시된 도메인 로그온과 윈도우 서비스 사용자 계정 로그인을 위해 사용된 로그온 정보 같은 기밀 내용 등도 저장된다(이러한 키들은 보안이 필요하므로 로컬 시스템 계정 이외의 어떠한 접근도 차단하여, 이 키의 내용은 일반적으로는 확 할 수 없다).
아래 Psexec 도구을 이용해 Psexec –s –I –d c:\windows\regedit.exe 명령을 실행하면 로컬 시스템 계정으로 Regedit을 실행하여 기본적으로 보이지 않는 레지스트리 정보인 SAM과 SECURITY 정보를 엿볼수 있다.
'WebBook > 윈도우 구조' 카테고리의 다른 글
윈도우 - 서비스 계정 (0) | 2022.03.23 |
---|---|
시스템 프로세스(Windows Startup Process) - 서비스 관리자 Services.exe (0) | 2022.03.14 |
시스템 프로세스(Windows Startup Process) - 로그인 관리자 Winlogon.exe (0) | 2022.03.03 |
시스템 프로세스(Windows Startup Process) - 서브시스템(Subsystem) (0) | 2022.02.21 |
시스템 시작, 커널 생성 (0) | 2022.02.13 |