본문 바로가기
WebBook/윈도우 구조

시스템 프로세스(Windows Startup Process) - 보안 관리자 Lsass.exe

by 올엠 2022. 3. 5.
반응형

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)에서 확인할 수 있다.

Lsass 에서 제공되는 인증 패기지

사용자 로그인 처리는 Winlogon이 사용자 상호 작용 역활을 담당하며, Winlogon에서 로드한 자격 증명 제공자로부터 LsaLogonUser API를 통해 사용자 이름과 패스워드(기타 다른 인증 토큰) 등 로그온 정보를 LSA가 전달 받게 된다. 그리고 해당 내용을 네트워크 계층과 응용 계층 사이에 위치한 SSPI(Security Support Provider Interface)로 전달된다. 이는 Lsass에서 제공하는 함수인 LsaLookup-AuthenticationPackage를 이용해 서로 다른 프로토콜간 통일화한 것으로, 이를 통해 적절한 인증 패키지를 선택하게 된다.

SSPI 계층 구조

이후 윈도우는 커버로스(Kerberos) MSV1_0라는 두 가지 표준 인증 패키지를 이용하여 로그인을 진행하게 된다. 하나는 Active Directory, 즉 도메인(Domain) 환경인 경우로 Netlogon을 이용하여 보안 통신 프로토콜인 커버로스를 통해서 인증을 진행하게 된다.

그외 로컬 환경인 경우로 NTLM을 통해 인증을 진행한다(도메인 인증 실패시에도 로컬 인증을 시도한다). 아래 그림은 LSA의 처리 흐름을 설명한 그림으로, 사용자 로그인 및 프로그램 인증 진행시 각 도메인 환경과 로컬 환경에서 어떻게 자격 증명이 처리되는지 한눈에 확인할 수 있도록 동작 흐름을 간략하게 그림으로 표시하였다.

LSA 처리 흐름

위와 같은 로그인 처리가 성공하면 Lsass는 사용자의 보안 프로파일을 담고 있는 접근 토큰 객체을 생성하기 위해 커널에 위치한 SRM(Security Reference Monitor)의 함수 NTCreateToken을 호출한다. 그럼 각 보안 구성 항목별 역할에 대해 정리해 보자.

SRM(Security Reference Monitor)

%Systemroot%\System32\ntoskrnl.exe에 포함된 커널 Executive 구성요소로, 보안 컨텍스트를 기술하기 위한 접근 토큰의 데이터 구조를 정의하고, 각 객체들에 대한 보안 접근 검사를 수행한다.

아래 그림은 SRM의 처리 흐름을 표현한것이다.

SRM 처리 흐름

SRM의 커널 내 실처리 함수는 SeAccessCheck로서 각 오브젝트별로 가지고 있는 보안 디스크립터(SECURITY_DESCRIPTOR)를 이용해 현재 요청하는 요청 토큰과 비교하여 처리하게 된다.

SRM을 통해 처리되는 보안 구성 요소들은 로그온, 보안 로그, 보안 정책, 유저 계정 등이 있으며, 아래와 같이 SRM과 연결되어 권한에 대해 이상이 없는지 확인한다.

NT 보안 구성요소들의 관계

그럼 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 정보를 엿볼수 있다.

로컬 시스템 권한으로 확인한 SECURITY/SAM 레지스트리

 

반응형