
브라우저에서 DNS를 통해 데이터를 은밀히 유출
Browsertunnel은 DNS 프로토콜을 사용하여 브라우저에서 데이터를 유출(exfiltrate)하는 도구입니다. dns-prefetch라는 기능을 악용하여 작동하는데, 이 기능은 지정된 도메인에 대해 백그라운드에서 DNS 조회를 수행하여 웹사이트의 지연 시간을 줄이기 위한 것입니다. DNS 트래픽은 브라우저의 디버깅 도구에 나타나지 않으며, 페이지의 콘텐츠 보안 정책(CSP)에 의해 차단되지 않고, 기업 방화벽이나 프록시에서 검사되지 않는 경우가 많아, 제한된 환경에서 데이터를 밀반출(smuggling)하기에 이상적인 매체입니다.
오래된 기법입니다. DNS 터널링 자체는 90년대로 거슬러 올라가며, Patrick Vananti는 2016년에 dns-prefetch를 이 용도로 사용하는 방법을 작성했습니다. 하지만 제가 알기로 browsertunnel은 이 기법을 실제로 시연하는 최초의 오픈 소스, 프로덕션 준비가 완료된 클라이언트/서버입니다. dns-prefetch는 클라이언트 JavaScript에 어떤 데이터도 반환하지 않으므로, browsertunnel을 통한 통신은 단방향(uni-directional)입니다. 또한 일부 브라우저는 기본적으로 dns-prefetch를 비활성화하며, 그런 경우 browsertunnel은 조용히 실패합니다.
이 프로젝트는 두 부분으로 구성됩니다:
html/ 폴더에 있는 작은 JavaScript 라이브러리는 클라이언트 측에서 메시지를 인코딩하고 전송합니다.Browsertunnel은 문자열을 서브도메인에 인코딩하여 DNS를 통해 임의의 문자열을 전송할 수 있습니다. 브라우저가 해당 도메인을 재귀적으로 해석하려고 시도할 때, 이 서브도메인이 browsertunnel 서버로 전달됩니다.
하나의 도메인(253바이트)에 맞지 않는 더 긴 메시지는 자동으로 여러 쿼리로 분할되며, 서버에서 이를 재조립하고 디코딩합니다.
먼저, DNS 레코드를 설정하여 서브도메인을 서버에 위임합니다. 예를 들어, 서버 IP가 192.0.2.123이고 서브도메인 t1.example.com을 통해 터널링하려면 DNS 구성은 다음과 같습니다:
t1 IN NS t1ns.example.com.
t1ns IN A 192.0.2.123
서버에서 go get을 사용하여 browsertunnel을 설치합니다. 또는 로컬 머신에서 browsertunnel을 컴파일한 후 바이너리를 서버로 복사합니다.
go get github.com/veggiedefender/browsertunnel
다음으로, 터널링할 서브도메인을 지정하여 browsertunnel을 실행합니다.
browsertunnel t1.example.com
전체 사용법은 browsertunnel -help를 실행하세요:
$ browsertunnel -help
Usage of browsertunnel:
-deletionInterval int
seconds in between checks for expired messages (default 5)
-expiration int
seconds an incomplete message is retained before it is deleted (default 60)
-maxMessageSize int
maximum encoded size (in bytes) of a message (default 5000)
-port int
port to run on (default 53)
이러한 매개변수에 대한 더 자세한 설명과 근거는 godoc을 참조하시기 바랍니다.
마지막으로, 터널을 테스트해보세요! 제 데모 페이지 여기를 사용하거나 이 저장소를 클론하여 로컬에서 html/index.html을 로드할 수 있습니다. 모든 것이 정상 작동하면 stdout에 메시지가 기록되는 것을 확인할 수 있어야 합니다.
이 프로젝트를 실제 환경에 적용하려면 필요에 따라 코드를 포크(fork)하고 수정하는 것이 좋습니다. 몇 가지 아이디어: