윈도우 보안 관리자 Lsass.exe(Local Security Authority Subsystem Service) – SRM(Security Reference Monitor), LSA(Local Security Authority)

Local Security Authority Subsystem Service의 약자로, 줄여서 LSA(Local Security Authority)라고도 하며, 사용 인증과 관련하여 밀접한 관련이 있다. %Systemroot%\System32\Lsass.exe로 실행되는 유저모드 프로세스로써, 로컬 시스템 보안 정책, 사용자 인증, 이벤트 로그로 보안 감사 메시지 전달등, 윈도우의 전반적인 보안처리를 담당한다. 이러한 서비스 관리는 아래 Lsasrv.dll(%Systemroot%\System32\lsasrv.dll)에서 구현된다.

그리고 LSA 관련 설정은 아래 레지스트리 위치 에서 확인 할 수 있다.

[그림]LSASS에서 제공되는 인증 패기지

사용자 로그인 처리중 Winlogon이 사용자 상호 작용 역활을 담당하며, Winlogon에서 로드한 자격 증명 제공자부터 Winlogon이 LsaLogonUser API를 통해 사용자 이름과 패스워드(기타 다른 인증 토큰)등그온 정보를 전달 받게 된다, 해당 내용을 SSPI(Security

Support Provider Interface)가 받아서, 윈도우는 아래 그림와 같이 서로 다른 프로그램간 통일화 할 수 있는 LSASS에서 사용하는 함수인 LsaLookup-AuthenticationPackage를 이용해 적절한 인증 패키지를 선택하게 된다.

[그림] SSPI 계층 구조

이후 윈도우는 Kerberos와 MSV1_0의 두 가지 표준 인증 패키지를 대화식 로그인 용도로 사용하게 되는데, Active Directory, 즉 도메인(Domain) 환경인 경우 Netlogon을 이용하여 Kerberos를 통해서 인증을 진행하게 된다.

도메인 인증이 실패하면, Workgroup 환경을 제공하는 NTLM을 통해 인증을 진행하게 된다.

아래는 로그인 화면에서 로그인 진행시 각 도메인 환경과 로컬 환경에서의 동작 흐름을 간략하게 그림으로 표시하였다.

사용자 인증을 수행하는데, 아래 그림은 LSA의 처리 흐름을 설명한 그림으로, 어떻게 자격 증명이 처리되는지 한눈에 확인 할 수 있다.

[그림]LSA 처리 흐름 출처: MSDN

이렇게 로그인이 성공하면 LSASS는 사용자의 보안 프로파일을 담고 있는 접근 토큰 객체을 생성하기 위해 커널의 Executive에 위치한 SRM(Security Reference Monitor)의 함수 NTCreateToken을 호출한다.

각 보안 구성 항목별 역할에 대해 간단히 정리해 보자.

SRM(Security Reference Monitor)

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

[그림]SRM 처리 흐름

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

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

윈도우 보안 관리자 Lsass.exe(Local Security Authority Subsystem Service) – SRM(Security Reference Monitor), LSA(Local Security Authority)

[그림] 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

// e1002268를 접근하고자 하는 오브젝트의 SecurityDescriptor를 확인하자 옵션 1을 추가하면, SID를 식별하여 알려준다. 현제 오브젝트의 소유자와 설정된 권한 정보를 볼수 있다.

Mask : 0x001f01ff는 전체 권한을 뜻한다.

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

->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

[내용]SRM의 SeAccessCheck 함수 동작 이해

LSA Security Policy Database

레지스트리 HKEY_LOCAL_MACHINE에 로컬 시스템의 보안 정책 데이터 베이스 저장 한다.

설정 내용은, 로그인 방식과 도메인리스트, 시스템 접근 권한, 보안 감사 수행에 대한 내용이 들어 있으며, 캐시된 도메인 로그온과 윈도우 서비스 사용자 계정 로그인을 위해 사용된 로그온 정보 같은 기밀 내용등도 저장된다. (*이러한 키들은 보안이 필요하므로 로컬 시스템 계정 이외 어떠한 접근도 차단하여, 이 키의 내용은 일반적으로는 확인 할 수 없다.)

아래 Psexec 툴을 이용해 로컬 시스템 계정으로 Regedit를 실행해 해당 정보를 엿볼수 있다.

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

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.