지금까지도 CVE-2019-0708와 같이 RDS로 인한 취약점이 발견되고있다. 이와 관련해 참조하는 레지스트리의 정보를 정리해 보았다.
Terminal Services(이하 '터미널 서비스')를 위한 옵션, 세션, 유저, 클라이언트의 설정들은 레지스트리상에서 각기 다른곳에서 찾게된다. 관리자툴과 그룹정책은 자주 레지스트리 값들을 바꾸게된다. 이 챕터를 통해서 터미널 서비스 레지스트리의 경로와 값을 알아보자. 현재 Remote Desktop Service(이하 'RDS')라 불리우며 Remote Desktop Protocol(이하 'RDP')을 사용하고 있다.
시작하기 앞서 터미널 서비스에 필요한 글로벌 설정의 필수 레지스트리들을 알아보자. HKEY_LOCAL_MACHINES(이하 'HKLM') 루트에 속해있다.
SYSTEM\CurrentControlSet 과 SYSTEM\ControlSet00n 에서 필수 레지스트리를 발견할수 있다. ControlSet001 과 ControlSet002의 하위키는 Windows Server가 동작하기위한 컨트롤 정보를 포함하고 있다. 원본 하나와 사본으로 이루어져있다. 시스템이 부팅되면 시스템은 어느정보를 원본으로할지 결정하고 HKLM\SYSTEM\Select 경로 아래 결과를 저장한다. 마지막으로 성공적으로 실행된 세트의 컨트롤 정보는 HKLM\SYSTEM\CurrentControlSet에 저장이된다. 3개 세트의 컨트롤 정보는 대부분 동일하지만 오직 1개만 유효하며 시스템에 의해 사용된다.
ControlSet001은 시스템에서 사용하는 유효한 컨트롤 정보를 가지고 있다고 가정하자. 물론 ControlSet002도 될수있다.
HKLM\SYSTEM\ControlSet001HKLM\SYSTEM\ControlSet001\Control\Terminal Server 디렉토리에서 사용자가 일반설정을 할수있다. 다음은 터미널서버 레지스트리의 키값에대한 설명이다.
표. HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server의 내용
Value |
데이터 타입 / 기본값 |
설명 |
DeleteTempDirsOnExit |
DWORD: 0x1 |
유저가 로그오프시 임시 세션 디렉터리를 삭제한다. 0 과 1값을 가진다. 해당 값을 변경해서 서버에서 나갈때 임시 디렉토리를 삭제할수 있다. 터미널 서비스 에서 설정할수 있다. |
fAllowToGetHelp |
DWORD: 0x0 |
이 컴퓨터의 원격지원의 적용여부를 지정한다. 0과 1값을 가진다. 일반적으로 제어판의 시스템 속성에서 원격 탭에서 설정된다. |
fDenyTSConnections |
DWORD: 0x0 |
터미널 서비스로의 연결을 허용여부를 지정한다. 0과 1의 값으로 구성된다. |
FirstCountMsgQPeeks-SleepBadApp |
DWORD: 0xF |
응용 프로그램에 대한 호환설 플래그의 기본값이다. ( 호환성 플래그 참조) |
fSingleSessionPerUser |
DWORD: 0x1 |
서버 자원을 절약하거나 세션 복구를 용이하게 하기 위해 각 사용자를 하나의 세션으로 제한할 수 있다. 가능한 값은 0 또는 1이다. 터미널 서비스 구성에서 각 사용자를 하나의 세션 서버로 제한 설정을 사용하여 이 값을 변경하십시오. |
fWritableTSCCPermTab |
DWORD: 0x1 |
터미널 서비스 구성 RDP 연결 설정에서 사용 권한 탭의 쓰기 보호. 허용 가능한 값은 0 또는 1이다. |
IdleWinStationPoolCount |
DWORD: 0x0 |
백그라운드에서 시작된 세션은 새로운 사용자에게 할당된다. 이 설정의 기본값은 0이다. 응용 프로그램 서버의 경우 다른 값을 선택할 수 있으므로 새 사용자 세션의 로그인 시간이 단축될 수 있다. |
MsgQBadAppSleep-TimeInMillisec |
DWORD: 0x1 |
응용 프로그램에 대한 호환성 플래그의 기본값. (이 장 뒷부분의 "호환성 플래그" 섹션을 참조하십시오.) |
NthCountMsgQPeeksSleepBadApp |
DWORD: 0x5 |
응용 프로그램에 대한 호환성 플래그의 기본값. (이 장 뒷부분의 "호환성 플래그" 섹션을 참조하십시오.) |
PerSessionTempDir |
DWORD: 0x1 |
각 사용자 세션은 자체 임시 디렉토리를 수신한다. 이 설정에 대해 가능한 값은 0 또는 1이다. 터미널 서비스 구성의 세션별 디렉터리 서버 설정을 사용하여 이 값을 변경하십시오. |
ProductVersion |
SZ: 5.2 |
터미널 서버의 버전 정보 |
SessionDirectoryActive |
DWORD: 0x0 |
이 서버의 세션 디렉터리가 활성 상태인지 여부를 표시한다. 또는 1의 값을 가진다 |
SessionDirectoryCLSID |
SZ |
Class ID, needed by the session directory. |
SessionDirectoryExCLSID |
SZ |
세션 디렉토리에 필요한 클래스 ID. |
SessionDirectoryExposeServerIP |
DWORD: 0x1 |
서버의 IP 주소가 활성화된 세션 디렉토리에 노출되는지 여부를 나타낸다. 이 설정에 대해 가능한 값은 0 또는 1이다. |
TSAdvertise |
DWORD: 0x1 |
서버가 자신을 터미널 서버로 광고하는지 여부를 나타낸다. 가능한 값은 0 또는 1이다. |
TSAppCompat |
DWORD: 0x1 |
시스템이 응용 프로그램 호환성 모드에서 실행 중인지 여부를 표시한다. 가능한 값은 0 또는 1이다. |
TSEnabled |
DWORD: 0x1 |
기본 터미널 서비스 기능을 사용할 수 있는지 여부를 표시한다. 가능한 값은 0 또는 1이다. |
TSUserEnabled |
DWORD: 0x0 |
사용자가 터미널 서버에 로그온할 수 있는지 여부를 나타낸다. 가능한 값은 0 또는 1이다. |
로그와 유저 세션 설정
RDP 프로토콜과 유저세션의 설정에 관해서 몇개의 키는 몇개의 하이브에서 존재할지 모르기 때문에 자세히 설명될 필요가 있다. 모든 키를 설명할수 없기에 간략히 필요한 부분만 설명하겠다. 다음과같은 경로에서 주요 정보를 얻을수 있다.
-
HKLM\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd
-
HKLM\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd\Tds\tcp
-
HKLM\SYSTEM\ControlSet001\Control\Terminal Server\WinStation\Console
-
HKLM\SYSTEM\ControlSet001\Control\Terminal Server\WinStation\Console\RDP
-
HKLM\SYSTEM\ControlSet001\Control\Terminal Server \WinStation\RDP-Tcp.
표 2 . HKLM\SYSTEM\ControlSet001HKLM\SYSTEM\ControlSet001\Control\Terminal Server 레지스트리 하이브에서 가장 중요한 서브키 내용
Subkeys |
설명 |
AddIns |
클립보드 및 클라이언트 포트 리디렉션 구성(리디렉션) |
AuthorizedApplications |
터미널 서버에서 실행할 수 있는 응용 프로그램 목록을 구성하는 옵션 |
ClusterSettings |
세션디렉토리 설정 |
DefaultUserConfiguration |
모든 기본 터미널 서비스 구성 설정(예: 자동 로그온 데이터, 시간 제한, 초기 프로그램 등) |
Dos |
키보드 이벤트 쿼리 관련 DOS 셸 조정 |
KeyboardTypeMapping |
비정상적인 바로 가기 또는 특수 하드웨어에 대한 키보드 드라이버 조정 |
SysProcs |
시스템 컨텍스트(0) 또는 사용자 컨텍스트(1)에서 실행되는 시스템 프로그램 목록 |
Utilities |
특정 프롬프트 명령 조정: Change logon, Change port, Change user, Change winsta, Query appserver, Query process, Query session, Query user, Query winsta, Reset session, and Reset winsta |
VIDEO |
그래픽 리디렉션에 대한 장치 경로 |
Wds |
TCP/IP 로그 설정 구성(예: 지연, 버퍼 속성, 포트 번호, 서비스 이름 등) |
WinStations |
각 연결 유형 및 콘솔 세션에 대한 특정 구성 |
표 3 . HKLM\SYSTEM\ControlSet001HKLM\SYSTEM\ControlSet001\Control\Terminal Server \Wds 의 플로그 목록과 \WinStations 데이터 타입
Value Names (DWORD) | 설명 |
fAutoClientDrives |
로그온시 드라이브로 연결 |
fDisableEncryption |
암호화 사용안함 |
fDisableExe |
연결 시 프로그램 시작 사용 안 함. |
fEnableWinStation |
원격 사용자 세션 사용 |
fForceClientLptDef |
클라이언트 메인 프린터 사용을 기본값으로 설정 |
fInheritAutoClient |
다른 원격지에서 연결이 끊어지면 터미널 서버의 연결리셋을 상속한다. |
fInheritAutoLogon |
다른 원격지에서 자동 로그인을 위한 클라이언트의 로그인 정보를 사용하기위해 터미널 서버설정을 상속한다. |
fInheritInitialProgram |
터미널 서버에서 연결이 끊긴 세션이 다른 소스에서 종료되는 최대 시간을 상속 |
fInheritMaxDisconnectionTime |
터미널 서버에서 연결이 끊긴 세션이 다른 소스에서 종료되는 최대 시간을 상속하십시오. |
fInheritMaxIdleTime |
터미널 서버에서 다른 소스의 사용자 세션에 대한 최대 유휴 시간을 상속 |
fInheritMaxSessionTime |
터미널 서버에서 다른 소스의 최대 세션 시간을 상속한다. |
fInheritReconnectSame |
다른 소스의 동일한 클라이언트에서만 새 연결을 만들 수 있는지 여부를 터미널 서버의 설정을 상속 |
fInheritResetBroken |
세션 제한에 도달한 후 또는 다른 소스에서 분리한 후 세션이 종료되는지 여부에 관계없이 터미널 서버의 설정을 상속한다. 이 플래그를 설정하지 않으면 세션의 연결이 끊어진다. |
fInheritSecurity |
터미널 서버의 보안 설정을 상속 |
fInheritShadow |
다른 소스의 원격 제어를 위해 터미널 서버의 설정을 상속한다. |
fLogonDisabled |
이 플래그를 선택하면 로그온이 비활성화된다. |
fPromptForPassword |
암호 입력을 의무화한다. |
fReconnectSame |
이전과 같은 클라이언트에서만 다시 연결할 수 있다. 이 값은 fInheritReconnectSame 플래그를 설정한 경우에만 유효하다. |
fResetBroken |
세션 제한에 도달하거나 연결이 끊어지면 세션이 종료된다. 이 플래그가 설정되지 않으면 세션이 단순히 연결 해제된다. 이 값은 fInheritResetBroken 플래그를 설정한 경우에만 유효하다. |
fUseDefaultGina |
사용자를 인증하려면 항상 기본 윈도우즈 구성 요소를 사용 |
표 4. HKLM\SYSTEM\ControlSet001HKLM\SYSTEM\ControlSet001\Control\Terminal Server\Wds에서 REG_DWORD의 중요한 키와 \WinStations 데이터 타입
Value Name | 설명 |
InputBufferLength |
RDP 연결 인풋 버퍼 길이 설정(단위 Bytes 기본 2048) |
MaxConnectionTime |
최대 세션 시간(초) 이 값은 fInheritMaxSession을 설정한 경우에만 유효함시간 플래그를 0으로 설정 |
MaxDisconnectionTime |
연결이 끊긴 세션이 종료된 후 최대 시간(초) 이 값은 fInheritMaxDisconnection을 설정한 경우에만 유효함시간 플래그를 0으로 설정 |
MaxIdleTime |
사용자 세션의 최대 유휴 시간(초) 이 값은 fInheritMaxIdleTime 플래그를 0으로 설정한 경우에만 유효하다. |
MinEncryptionLevel |
암호화 레벨의 최소값을 설정한다. |
OutBufDelay |
RDP 연결에 대한 출력 버퍼가 비워질 때까지의 최대 대기 시간(밀리초) |
OutBufLength |
RDP 연결의 출력 버퍼 길이(바이트). |
PortNumber |
RDP 프로토콜의 포트번호 지정 ( 기본 3398) |
Shadow |
원격 컨트롤 설정 . fInheritShadow flag 를 0으로해야 적용됨 |
표 6 . HKLM\SYSTEM\ControlSet001HKLM\SYSTEM\ControlSet001\Control\Terminal Server\Wds 에서 REG_SZ의 중요키와 \WinStations 데이터타입
Value Names (SZ) | Description |
Domain |
사용자 세션 로그온 시 기본 도메인 이름을 설정하십시오. |
InitialProgram |
사용자가 로그온할 때 시작되는 초기 프로그램. 이 값은 fInherit를 설정한 경우에만 유효하다.InitialProgram 플래그. |
NWLogonServer |
NetWare logon server 설정 |
Password |
사용자 세션에 로그온할 때 기본 암호를 설정하십시오. 비밀번호는 암호화되어 여기에 저장된다. |
UserName |
사용자 세션에 로그온할 기본 사용자 이름을 설정하십시오. |
WorkDirectory |
응용 프로그램의 사용자 로그온 및 초기 시작 시 설정된 작업 디렉터리 |
중요정보를 위주로 재구성 해보았다. 주요정보통신기반시설 기술적 취약점 분석 가이드의 Windows 서버 1. 계정관리 > 1.18 원격터미널 접속 가능한 사용자 그룹 제한 내용과 관련이 있다.
참고 Registry Keys for Terminal Services