
원격 데스크톱 서비스용 범용 동적 가상 채널 커넥터
터미널 서비스(또는 원격 데스크톱 서비스)는 더 깊이 파고들고자 하는 사람들에게 많은 숨겨진 기능을 제공합니다. 이러한 서비스 중 하나가 동적 가상 채널(Dynamic Virtual Channel)로, 방화벽에 새 소켓, 연결 또는 포트를 열지 않고도 열린 RDP 연결을 통해 통신할 수 있게 해줍니다. 이 채널은 활성 네트워크 장치로부터 데이터를 숨기거나, 방화벽을 우회하거나, 네트워크를 통해 디바이스 드라이버를 구현하거나, 침투 테스터가 데이터를 전송하는 데 도움을 주는 데 사용할 수 있습니다. 가능성은 무궁무진합니다.
이 프로젝트가 만들어진 진짜 이유는 XFLTReaT입니다. 이것은 분리된 네트워크를 통해 "VPN"을 구축하는 데 사용될 수 있으며, 결국 방화벽 변경을 요청하지 않고 점프 박스를 통한 테스트를 가능하게 합니다. 요컨대 침투 테스터의 삶을 더 쉽게 만들어 줍니다.
RDP 서버에 연결할 때 사용하는 클라이언트 컴퓨터에 플러그인(.dll)을 설치해야 합니다. RDP 서버에서는 프로젝트의 나머지 절반인 .exe를 사용해야 하며, .exe가 플러그인과 서버 실행 파일 사이의 채널을 생성합니다. 더 자세한 내용을 알고 싶다면 아래로 스크롤하세요.
Windows 전용입니다. 동적 가상 채널은 Windows Server 2008 및 Windows Vista SP1에서 도입되었습니다. 이 및 그보다 최신 버전이면 문제없이 사용할 수 있습니다.
전체 프로젝트를 가져와 직접 컴파일하거나 릴리스 섹션에서 컴파일된 바이너리를 사용할 수 있습니다. 모든 경우에 올바른 바이너리를 사용하는 것이 중요하며, 해당 아키텍처에 맞는 올바른 바이너리를 선택하세요(클라이언트가 32비트이고 서버가 64비트라면 32비트 dll과 64비트 exe를 선택하세요).
.dll은 클라이언트 컴퓨터의 아무 디렉터리에나 배치해야 합니다(장기간 사용하려면 %SYSROOT%\system32\ 또는 %SYSROOT%\SysWoW64\에 넣을 수 있습니다). 그런 다음 관리자 권한(일명 Administrator)으로 다음 명령을 사용하여 설치합니다:
regsvr32.exe UDVC-Plugin.dll
사용자가 관리자가 아닌 경우에도 사용자 계정 아래에 레지스트리 설정을 가져와야 합니다. 이를 위해 UDVC-Plugin.reg 파일을 사용하세요.
제거하려면 다음을 실행하세요:
regsvr32.exe /u UDVC-Plugin.dll
이제부터 RDP 서버에 연결할 때마다 이 플러그인이 로드되어 레지스트리에 지정된 대로 자동으로 구성됩니다(아래 참조).
.exe는 RDP 서버에 배치하고 아무 사용자로나 실행하면 됩니다.
현재 양쪽 모두 세 가지 모드를 지원합니다:
이 모드를 활성화하면 정의된 포트와 인터페이스(IP 주소)에서 리스너가 설정됩니다.
이 모드에서는 정의된 IP 주소와 포트의 리스너로 연결을 시도합니다.
이 모드는 지정된 이름으로 Named Pipe를 설정합니다. 예를 들어, 이 모드는 다른 도구가 RDP를 통해 IPC 통신을 수행하는 데 사용할 수 있습니다. 불행히도 Named Pipe는 디스크에 기록되므로 소켓 모드에 비해 느린 것으로 간주됩니다. 대역폭이 중요하다면 소켓 모드를 사용하세요.
클라이언트와 서버 바이너리 모두 동일한 방식으로 동작하며 동일한 옵션으로 구성할 수 있습니다.
서버 바이너리는 명령줄에서 옵션을 읽습니다.
PS C:\Users\UDVC\> .\UDVC-Server.exe -h
Universal Dynamic Virtual Channel server application
Usage: C:\Users\UDVC\UDVC-Server.exe [-s | -c [-p port [-h ip]] | -m [-n name]] [-0 | -1 | -2 | -3]
Socket server mode -s (default) OR
Socket client mode -c:
-p port port to bind the listener (default: 31337)
-i ip ip to bind the listener (default: 127.0.0.1)
Named pipe mode -m:
-n name name of the named pipe (by default: "\\.\pipe\UDVC_{RDP SESSION NUMBER}")
Data transfer priority parameters:
-0 real time (WTS_CHANNEL_OPTION_DYNAMIC_PRI_REAL)
-1 high priority (WTS_CHANNEL_OPTION_DYNAMIC_PRI_HIGH) - default
-2 medium priority (WTS_CHANNEL_OPTION_DYNAMIC_PRI_MED)
-3 low priority (WTS_CHANNEL_OPTION_DYNAMIC_PRI_LOW)
클라이언트 .dll은 레지스트리에서 모든 옵션을 읽으며, 값은 다음 키에서 찾을 수 있습니다:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Terminal Server Client\Default\AddIns\UDVC-Plugin
모듈이 활성화될 때마다 연결이 이루어지기 전에 알림 경고가 표시됩니다. 다음과 같습니다:

이 경고는 사용자가 플러그인이 로드되었고 어떤 설정으로 로드되었는지 알 수 있게 해줍니다.
리스너, 연결 또는 named pipe는 서버 실행 파일이 플러그인 dll에 연결할 수 있을 때만 생성됩니다. 구성에 따라 다르지만, 기본적으로 가상 채널 연결이 이루어지면(플러그인이 제대로 로드되고 서버 바이너리가 실행된 경우) 양쪽 엔드포인트에서 localhost:31337을 수신합니다. 이 포트에 연결하여 소켓을 통해 데이터를 보내면 반대쪽에 나타납니다.
이 도구를 사용할 수 있는 몇 가지 사용 사례를 보여드리겠습니다.
매우 기본적인 포트 포워딩. Segregated 1 머신은 tcp/80에서 HTTP 서비스를 실행 중입니다. 해당 네트워크는 192.168.0.0/24 네트워크에서 라우팅되지 않으므로, 이중 홈 점프 박스(dual homed jump box)를 사용해야 접근할 수 있습니다. 클라이언트 측에서 0.0.0.0:31337에 리슨 모드가 구성되고, 서버 바이너리는 웹 서버에 연결을 만들기 위해 connect 모드 설정으로 실행되었습니다. RDP 클라이언트의 사용자는 브라우저를 사용하여 http://127.0.0.1:31337을 열어 http://10.13.37.2:80의 콘텐츠에 접근할 수 있습니다.

파일을 전송하기 위한 약간 더 고급 시나리오입니다. 두 엔드포인트 모두 0.0.0.0:31337에서 리슨하도록 구성되어 있습니다. 먼저 Hacking box가 RDP 클라이언트에 연결하여 입력을 기다립니다. 그런 다음 Segregated 2 머신이 점프 박스에 연결하고 전체 파일을 읽어 소켓으로 전송합니다.

추가로 Named Pipe도 사용할 수 있습니다. 이 경우 RDP 클라이언트와 점프 박스 양쪽 모두 Named Pipe를 생성하고(hIPC-client 및 hIPC-server), 다른 머신이 이 파이프에 연결할 수 있습니다. 파이프에 기록된 모든 내용은 반대쪽 끝에 나타납니다. 위의 리슨 모드 예제와 크게 다르지 않으며, TCP 소켓 대신 Named Pipe를 사용한다는 점만 다릅니다.

플러그인이 로드되지 않거나 실행 파일이 예를 들어 VCRUNTIME140.DLL과 같은 일부 DLL 누락으로 실행되지 않는 경우, Visual C++ Redistributable for Visual Studio 2015 패키지를 설치하는 것이 좋습니다.