강제 인증 (Authentication Coercion)
배경
Remote Procedure Call (RPC)는 원격 서버에 있는 함수(RPC call)를 클라이언트가 원격으로 실행시키는 프로세스간 통신(Inter-process communication)이다. 웹 서버/클라이언트와 HTTP를 이용한 API라는 개념조차 희미 했던 1980년대 시절, 분산환경에서 원격 서버에 클라이언트가 접속해 뭔가를 하기 위해서는 이 RPC라는 것을 사용했다. 윈도우 액티브 디렉토리와 윈도우 운영체제에서는 아직도 RPC가 자주 쓰인다.
워낙 오래전에 만들어진 기술이다 보니 윈도우 RPC 함수들 중에서는 사용자 인증이나 액세스 제한을 검증하지 않은 RPC들도 있다. 예를 들어 같은 네트워크 안에만 있다면 어떤 사용자 이름/비밀번호도 없이 실행되는 RPC 함수들도 있다.
강제 인증
특정 RPC 함수는 서버로 하여금 RPC 함수를 실행시킨 서버 (공격자 서버) 에게 NTLM 인증을 하도록 한다. 이때 서버의 도메인 머신 계정과 Net-NTLM 해시화된 비밀번호가 같이 NTLM 인증 트래픽 속에 들어간다. RPC 함수를 악용해 공격자 서버에게 피해자 서버가 "강제로 인증" 하도록 하는 공격을 "강제 인증 (Authentication Coercion)" 이라고 부른다.
위는 RPC 기반의 강제 인증 공격 중 하나인 Printerbug/Print Spooler Attack 을 나타낸 다이어그램이다.
공격자는 취약한 RPC 함수 중 하나인
RpcRemoteFindFirstPrinterChangeNotificationEx
를 서버에서 실행하고 있다. 이 함수는 타겟 서버에서 프린터와 관련된 변화가 일어날 시 클라이언트에게 알려주는 함수다.서버가 클라이언트가 RPC 함수를 실행했다는 것을 인지한다.
RpcRemoteFindFirstPrinterChangeNotificationEx
함수가 제대로 실행되려면 서버에서 클라이언트로 인증하고 접근 한 뒤, 클라이언트에게 알림 설정을 해줘야한다. 이 설정을 하기 위해 서버는 스스로 (하지만 사실상 클라이언트가 함수를 실행했으니 "강제"로) 공격자 클라이언트에게 서버 머신 계정 + Net-NTLMv1/v2 해시가 포함된 사용자 인증 패킷을 보낸다.공격자는 이 머신 계정의 사용자 인증 패킷을 Responder 와 같은 툴로 받는다.
이후 이 머신 계정 이름 + Net-NTLMv1/v2 해시를 가지고 릴레이 공격, 다운그레이드 공격, RBCD 공격 등의 다양한 공격을 진행한다.
강제 인증으로 공격자 호스트에게 돌아온 Net-NTLM 인증 트래픽은 NTLM 릴레이 공격이나 RBCD 공격에 사용된다.
주의점
강제 인증을 실행할 때 주의해야 할 점은 바로 공격자 서버에게 전송되고 나중에는 릴레이 공격에 쓰이는 NTLM 인증 트래픽이 바로 피해자 서버의 도메인 머신 계정이라는 것이다.
예를 들어 도메인 컨트롤러에게 위 프린터버그 강제 인증을 사용했다면, 공격자에게 돌아오는 인증 트래픽은 DC01$
와 같은 도메인 머신 계정의 인증 트래픽이다. NTLM 릴레이 페이지에서 봤던 것처럼 릴레이 공격으로 다른 호스트의 SAM을 덤프하는 것은 불가능 하다. 도메인 머신 계정들은 다른 호스트들의 로컬 관리자 권한이 없기 때문이다.
도메인 머신 계정들은 대체로 유저 계정들에 비해 갖고 있는 권한이 많이 없다. 물론 시스템 관리자들이 어떻게 권한을 관리 했는지에 따라 천차만별이다. 예를 들어 강제 인증이 가능한 도메인 머신 계정이 도메인 컨트롤러의 로컬 관리자 권한을 갖고 있는 끔찍한 경우도 존재할 수도 있다. 이런 경우에는 도메인 머신 계정에게 강제인증 -> 릴레이 -> 도메인 컨트롤러의 SAM 덤프 -> SAM 안의 로컬 관리자 (도메인 컨트롤러의 로컬 관리자 계정 == 도메인 어드민 계정) --> 도메인 어드민 획득 - 도 가능하다.
이외 가장 많이 마주치는 쓸만한 권한은 도메인 컨트롤러 (Domain Controller) 의 DCSync 권한 정도다. 도메인 컨트롤러 A 에게 강제 인증 -> 릴레이 -> 도메인 컨트롤러 B 에게 전달 -> DCSync -> 도메인 장악 - 의 시나리오다.
강제 인증 종류
RPC 기반의 강제 인증들은 많지만, 가장 자주 쓰이는 종류들은 다음과 같다
(MS-PAR - PrintNightmare)
Last updated