IT 그리고 정보보안/Knowledge base

윈도우 LSA, SRM

plummmm 2021. 4. 13. 06:59
반응형

 

 

Local Security Authority Subsystem Service의 약자로 LSA라고도 부른다.

단어 그대로 보안관리자이다.

%Systemroot%\System32\Lsass.exe 에서 실행되는 프로세스로,

시스템 보안정책, 사용자 인증, 이벤트 로그에 보안 감사 메세지 전달 등

윈도우 전반적인 보안 관련 작업을 처리하는 프로세스이다.

 

서비스 관리는 %Systemroot%\System32\Lsasrv.dll 에서 구현된다.

LSA 관련 설정은 아래 그림에 보이는 경로에서 설정함.

 

LSA 기능 중 사용자 인증 과정은 Winlogon에서 로드한 자격 증명 제공자로 부터 LsaLogonUser API를 통해 사용자 이름 과 패스워드 등

로그온 정보를 LSA가 받게된다. 그리고 이 내용이 네트워크 계층과 응용 계층 사이에 위치한 SSPI(Security Support Provider Interface)

로 전달된다. 이는 Lsass에서 제공하는 함수 LsaLookup-AuthenticationPagkage를 이용해 서로 다른 프로토콜 간에 통일화 한것으로

이를 통해 적절한 인증 패키지를 선택한다. 그림을 보자.

인증 패키지를 선택하고 윈도우는 케르베로스(Kerberos)와 MSV1_0 라는 두가지 표준 인증 패키지를 이용하여 로그인을 진행한다.

첫번째는 Active Directory 즉, 도메인 환경에서는 Netlogon을 이용하여 보안 통신 프로토콜인 케르베로스을 통하여 인증한다.

두번째 로컬 환경인 경우에는 NTLM을 통해 인증한다. ( 도메인 인증 실패시에도 로컬 인증 시도함.)

 

그럼 LSA 처리흐름에 대한 그림을 보며 자세히 알아보자.

 

LSA는 이와 같은 과정을 거치고 성공하면 커널에 위치한 SRM (Security Reference Monitor)의 NTCreateToken 함수를 호출하여

사용자의 보안 프로파일을 담고있는 접근 토큰 객체를 생성한다.

 

그라먼.. SRM에 대해 또 알아봐야 겠지예.. 봅시다.

C:\System32\ntoskrnl.exe 에 포함되어 있는 커널 Executive 구성요소로,

보안 컨텍스트를 기술하기 위한 접근 토큰의 데이터 구조를 정의하고, 각 객체들에 대한 보안 접근 검사를 수행한다.

SRM의 커널 내 실처리 함수는 SeAccessCheck로,

각 오브젝트 별로 가지고 있는 보안 디스크립터( Security Descriptor)를 이용해 현재 요청하는 토큰과

비교하여 처리한다.

SRM을 통해 처리되는 보안 구성 요소들은 로그온, 보안 로그, 보안 정책, 유저 계정 등이 있고

아래 그림과 같이 확인한다 참고.

너무 복잡한걸 한번에 집어넣은 것 같다.. 정리를 한번 하고 가야되지 않나 싶은데..

일단 Windbg를 이용하여 SRM 동작 과정을 확인해 보고 난 다음 간략하게 설명하겠음.

 

 

1. !object 명령을 이용하여 오브젝트 헤더 값이 지정된 주소를 확인한다.

   kd> !object \ErrorLogPort

 

2. _Object_HEADER 구조체를 이용해 SecurityDescriptor가 위치한 주소값을 확인한다.

   kd> dt nt!_Object_HEADER [object header 주소]

   (dt: 주소를 특정 데이터형으로 변환해서 표시)

 

    SecurityDescriptor는 아까 말했듯이, 각 객체들 마다 가지고 있다. 객체 헤더로 접근을 하였고, 

    그 객체의 SecurityDescriptor값을 보는 과정임.

 

3. !sd 명령을 이용하여 보안 디스크립터의 권한 내용을 살펴본다. 위에서 -6을 하는데,

   OBJECT_HEADER에 지난 오프셋값을 포함하고 있어서 빼주어야 설정값을 확인할 수 있다.

   kd> !sd [보안 디스크립터 주소] -6

 

 

4. seAccessCheck에 브레이크 포인트를 걸고 값을 확인한다.

   kd> bp nt!SeAccessCheck

   kd> g

 

  실제 SRM의 처리 함수가 SeAccessCheck 라고 했었다. 여기 브레이크포인트 걸고 값 확인 하는 것이다.

  브레이크 포인트 걸고 운영체제를 다시 실행하면 그 지점에서 정지하겠지??

  그 상태에서 호출 스텍을 확인하는 k 명령과 파라미터를 보여주는 b 명령을 입력하여 전달하는 인자를 확인한다.

  첫 번째 인자인 e1b50018은 접근 하고자하는 개체 정보, 즉 SecurityDescriptor이다.

  두 번째 인자인 b22f2c30은 접근 요청한 프로세스의 토큰 정보가 있는 SECURITY_SUBJECT_CONTEXT 구조체이다.

 

  먼저 SecurityDescriptor 값 부터 확인해보자.

 

5. !sd 명령에 옵션 1을 추가하면 SID로 식별을 하여 알려준다. 이를 통해 개체의 소유자와 설정된 권한 정보를 알 수 있다. 다음으로 SECURITY_SUBJECT_CONTEXT 구조체를 한번 디다보자.

 

 

6. kd> dt_SECURITY_SUBJECT_CONTEXT [ SeAccessCheck의 두번째 인자 주소값] 

   을 입력하면 접근 요청한 프로세스의 기본적인 정보를 알 수 있다. 여기서 토큰 주소값을 슉 뽑아내어

   토큰이 어떠한 권한을 가지고 있는지 확인하기 위해 

   kd> !token [ 뽑아낸 토큰 주소]

   명령을 입력하면 권한확인이 가능하다.

 

정리 하자면, 

1. LSA 처리 과정을 거쳐 로그인에 성공하면, SRM이 사용자 보안 인증 프로파일이 담긴 토큰을 뽑아낸다.

2. SRM의 SeAccessCheck함수가 오브젝트 별로 갖고 있는  SecurityDescriptor 를 이용해 요청하는 토큰과 비교한다.

 

그리고 추가로 비교하는 동안 보안 구성 요소들이 로그온, 보안 로그, 보안 정책 등의 작업을 뚝딱뚝딱

 

 

출처 : 리버싱 윈도우 - 로드북

반응형