NAT 슬립스트리밍
NAT 슬립스트리밍은 공격자가 피해자의 NAT/방화벽을 우회하여(원격 임의 방화벽 포트 개방 제어) 모든 시스템에 바인딩된 모든 TCP/UDP 서비스에 원격으로 접근할 수 있도록 합니다. 피해자는 단지 웹사이트를 방문하기만 하면 됩니다.
v1 개발자: @SamyKamkar // https://samy.pl
v2 개발자: Samy Kamkar && (Ben Seri && Gregory Vishnipolsky of Armis).
여기에서 Ben & Gregory의 v2에 대한 훌륭한 기술 문서를 읽어보세요 이 문서는 v2 업데이트에 대해 깊이 다루며 많은 추가 세부 정보를 제공합니다.
v1 발표: 2020년 10월 31일 👻
v2 발표: 2021년 1월 26일
소스 코드: https://github.com/samyk/slipstream
애니메이션 버전 보기 - draw.io의 내 포크로 생성, 애니메이션에서 내보내기 가능한 엣지 컨텍스트 흐름 및 제어 지원
목차
요약
NAT 슬립스트리밍은 사용자의 브라우저를 NAT, 라우터, 방화벽에 내장된 애플리케이션 레벨 게이트웨이(ALG) 연결 추적 메커니즘과 결합하여 악용합니다. 이는 타이밍 공격 또는 WebRTC를 통한 내부 IP 추출, 자동화된 원격 MTU 및 IP 단편화 탐지, TCP 패킷 크기 조정, TURN 인증 오용, 정밀한 패킷 경계 제어, 브라우저 남용을 통한 프로토콜 혼동을 연쇄적으로 수행합니다. NAT 또는 방화벽이 대상 포트를 열기 때문에 브라우저 기반의 모든 포트 제한을 우회합니다.
이 공격은 HTTP 또는 다른 헤더를 포함하지 않고 일부 TCP 및 UDP 패킷의 데이터 부분을 임의로 제어할 수 있는 점을 이용합니다. 이 공격은 모든 주요 최신 (및 구형) 브라우저에서 이 새로운 패킷 주입 기술을 수행하며, 제가 2010년에 개발한 원래 NAT 핀 기술(DEFCON 18 + Black Hat 2010에서 발표)의 현대화된 버전입니다. 또한 로컬 IP 주소 발견을 위한 새로운 기술도 포함되어 있습니다.
이 공격은 NAT/방화벽이 ALG(애플리케이션 레벨 게이트웨이)를 지원해야 합니다. ALG는 SIP 및 H323 (VoIP 프로토콜), FTP, IRC DCC 등과 같이 여러 포트를 사용할 수 있는 프로토콜(제어 채널 + 데이터 채널)에 필수적입니다.
높은 수준에서 NAT 슬립스트리밍은 다음과 같이 작동합니다:
- 피해자가 악성 사이트(또는 악성 광고가 포함된 사이트)를 방문
- 먼저 브라우저에서 피해자의 내부 IP를 추출하여 서버로 전송해야 함
- WebRTC 데이터 채널을 통해 https로 내부 IP 추출 시도
- 일부 브라우저(Chrome)는 HTTPS를 통한 WebRTC에서만 로컬 IP를 공개하지만, 일부 공격은 HTTP가 필요하므로 먼저 HTTPS 버전의 공격 소프트웨어로 리디렉션하여 로컬 IP를 추출
- 그런 다음 내부 IP를 얻을 수 있었다면 URL에 포함된 HTTP 버전으로 리디렉션하여 다른 교차 출처 보호 메커니즘을 우회(제시된
.local mDNS/Bonjour 주소는 공격에 유용하지 않음)
- WebRTC가 내부 IP를 공개하지 않거나(Safari) WebRTC가 없는 경우(IE11 이하), 웹 기반 TCP 타이밍 공격 수행
- 모든 일반 게이트웨이(예:
192.168.0.1)에 대한 숨겨진 img 태그를 백그라운드에서 로드
img 태그에 onerror/onsuccess 이벤트 연결
- 게이트웨이에서 TCP RST가 반환되거나 SYN + HTTP 응답이 오면 유효한 서브넷을 감지
- 감지된 서브넷(/24)의 모든 IP에 대해 타이밍 공격을 다시 수행하여 onerror/onsuccess 발생 시간 측정
- 가장 빠른 응답이 내부 IP일 가능성이 높지만, 모든 응답을 피해자 내부 IP 후보로 간주하고 공격
- 숨겨진 폼과 비표준 포트에 바인딩된 공격자 "HTTP 서버"로의 자동 HTTP POST를 통해 대규모 TCP 비콘 전송하여 피해자 IP 스택의 TCP 세그멘테이션 및 최대 MTU 크기 강제 발견
- 브라우저에서 WebRTC TURN 인증 메커니즘을 통해 비표준 포트로 공격자 서버에 대규모 UDP 비콘 전송하여 TURN
username 필드에 데이터를 채워 IP 단편화 강제 수행
- TCP 세그멘테이션과 유사한 공격을 UDP에서 수행하여 IP 단편화가 발생하고 TCP 세그멘테이션과 다른 값을 제공
- 피해자 MTU 크기, IP 헤더 크기, IP 패킷 크기, TCP 헤더 크기, TCP 세그먼트 크기를 서버에서 감지하여 피해자 브라우저로 다시 전송, 이후 패킷 채우기에 사용
- (v1) 내부 IP를 포함하는 새 숨겨진 폼에서 "SIP 패킷" 생성, 애플리케이션 레벨 게이트웨이 연결 추적을 트리거
- TCP 포트 5060(SIP 포트)의 서버로 "HTTP POST" 시작, 제한된 브라우저 포트 회피
- POST 데이터는 정확한 TCP 세그먼트 크기/패킷 경계에 맞게 "채워지고", "SIP 패킷"이 추가되어 웹 폼을 통해 전송
- 피해자 IP 스택은 POST를 여러 TCP 패킷으로 분할하여 "SIP 패킷"(POST 데이터의 일부)이 HTTP 헤더 없이 자체 TCP 패킷에 남도록 함
- 브라우저가 multipart/form 경계 크기를 변경(Firefox)하거나 다른 이유로 패킷 크기가 변경되면 크기 변경이 클라이언트에 전달되고 클라이언트가 새 크기로 자동 재전송
- UDP 포트를 열 때는 SIP 패킷이 특별히 조작된
username 필드 내에서 TURN 프로토콜을 통해 전송되어 IP 단편화와 정밀한 경계 제어를 강제
- (v2) TCP 기반 STUN(v1 및 브라우저 포트 제한 패치 우회) 연결을 사용하는 "H.323 패킷" 생성, 내부 IP 포함하여 애플리케이션 레벨 게이트웨이 연결 추적을 트리거하지만 "호출 전달" 패킷에서 네트워크의 다른 호스트로 리디렉션 강제
- TCP 포트 1720(H.323 포트)의 서버로 "H.323 호출 전달" 시작, 제한된 브라우저 포트 회피. 포트가 차단되었음에도 불구하고 WebRTC STUN 기능을 사용하여 포트 우회 수행. 이 기능은 제한된 포트 목록을 준수하지 않음
username 필드는 정확한 TCP 세그먼트 크기/패킷 경계에 맞게 "채워지고", “H.323 패킷”이 추가되어 웹 폼을 통해 전송
- 피해자 IP 스택은 POST를 여러 TCP 패킷으로 분할하여 "H.323 패킷"(STUN 데이터의 일부)이 HTTP 헤더 없이 자체 TCP 패킷에 남도록 함
- 브라우저가 multipart/form 경계 크기를 변경(Firefox)하거나 다른 이유로 패킷 크기가 변경되면 크기 변경이 클라이언트에 전달되고 클라이언트가 새 크기로 자동 재전송
- 피해자 NAT는 SIP 포트의 적절한 SIP REGISTER 패킷 또는 적절한 H.323 호출 전달 패킷(HTTP 데이터 없음)을 확인하여 ALG가 패킷에 정의된 모든 TCP/UDP 포트를 네트워크의 모든 피해자 호스트로 열도록 트리거
- 피해자 NAT는 SIP 또는 H.323 패킷을 다시 작성하여 내부 IP를 공용 IP로 교체, 공격자에게 공격 성공을 암시
- (v2) H.323 호출 전달은 다른 IP로 직접 전달될 수 있으므로, 패킷은 피해자 네트워크의 다른 호스트의 내부 IP를 포함할 수 있으며, NAT가 네트워크의 모든 시스템으로 포트 포워딩하도록 트리거
- 피해자 NAT가 일반적으로 소스 포트를 다시 작성하더라도 ALG는 공격자가 선택한 포트로 포트 포워딩해야 합니다. 이는 NAT가 피해자 시스템(또는 네트워크의 다른 시스템, 전적으로 공격자가 결정)이 해당 포트를 열었다고 믿고 공격자가 도착하는 SIP/H.323 패킷에서 새 소스 포트를 보기 때문입니다.
- 이제 공격자는 피해자 NAT를 우회하고 네트워크의 모든 시스템의 모든 포트에 직접 연결하여 이전에 보호/숨겨진 서비스와 시스템에 접근할 수 있습니다.
- 조사할 사항...아마도 당신에 의해?
- 비악의적 사용: 이 기술은 기본적으로 브라우저에 시스템의 로컬 프로토콜과 통신할 수 있는 완전한 TCP 및 UDP 소켓 기능을 제공합니다. 연결은 다시 연결되는 클라우드 서버를 통해 추상화될 수 있지만 브라우저는 소켓인 것처럼 클라우드 서버와 통신하여 브라우저가 웹 친화적이지 않은 프로토콜과 통신할 수 있도록 더욱 강력하게 만듭니다.
- 가상 머신(VM)에서 공유 네트워킹(호스트를 공격으로부터 보호하기 위해 호스트를 통해 라우팅하여 네트워크에 직접 연결하지 못하게 함)을 사용하여 테스트하는 경우, 패킷이 나가면 포트가 열리는 곳은 VM이 아니라 상위 호스트 시스템입니다 ;)
- IP 단편화는 IP 데이터 섹션의 모든 데이터를 완전히 제어할 수 있게 하여, 오버플로된 패킷의 UDP 헤더(소스/대상 포트 포함)를 완전히 제어할 수 있습니다...이것이 무엇을 더 악용할 수 있을까요?

세부 사항
네트워크 주소 변환 (NAT)
우리는 여러 이유로 NAT(Network Address Translation)를 사용합니다. NAT의 가장 유용한 기능은 단일 공용 IP 주소를 여러 시스템에서 공유할 수 있게 한다는 점입니다. 이는 로컬 네트워크를 만들고 연결된 모든 시스템에 로컬 IP 주소를 제공하며, 해당 시스템 중 하나가 인터넷에 접속할 때 나가는 패킷을 다시 작성하여 공용 IP를 사용하도록 하여 응답이 NAT로 돌아오도록 하고, 반대로 대상 IP를 특정 클라이언트의 IP로 다시 작성합니다.
NAT의 책임은 동일한 주소/포트(google.com:443)에 대한 연결을 내부 호스트와 구분하는 것입니다. 결국 아웃바운드 포트, 대상 IP 및 소스 IP가 모두 동일해지기 때문입니다. 두 개의 다른 내부 피어가 동일한 소스 포트에서 연결을 시도하면 최신 NAT는 소스 포트 중 하나를 변경합니다(일부 네트워크는 모든 TCP/UDP 소스 포트에 대해 이 작업을 수행함).

연결 추적