Spotify 코드 크래킹 및 그것으로 퀘스트 만들기

16042 단어 securityapi
잠 못 이루는 어느 긴 밤, 나와 내 친구( )는 Spotify 코드에 대해 토론했습니다. 휴대폰의 Spotify 앱으로 스캔할 수 있는 바코드는 다음과 같습니다.



#np: Think Twice의 Firefly(Spotify가 없지만 그게 요점이 아닌 경우 Soundcloud에서도 사용 가능)

이러한 코드를 생성하기 위한 a dedicated website이 있으며 위 이미지의 URL은 다음과 같습니다. https://scannables.scdn.co/uri/plain/png/000000/white/640/spotify:track:1er51HCEBhIAtoEemKuC3M . 훨씬 쉽게 분석할 수 있는 SVG도 얻을 수 있습니다.

<rect x="100.00" y="44.50" width="6.71" height="11.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="112.42" y="23.50" width="6.71" height="53.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="124.84" y="37.50" width="6.71" height="25.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="137.27" y="23.50" width="6.71" height="53.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="149.69" y="34.00" width="6.71" height="32.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="162.11" y="41.00" width="6.71" height="18.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="174.53" y="23.50" width="6.71" height="53.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="186.96" y="44.50" width="6.71" height="11.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="199.38" y="34.00" width="6.71" height="32.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="211.80" y="41.00" width="6.71" height="18.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="224.22" y="27.00" width="6.71" height="46.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="236.64" y="20.00" width="6.71" height="60.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="249.07" y="37.50" width="6.71" height="25.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="261.49" y="44.50" width="6.71" height="11.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="273.91" y="37.50" width="6.71" height="25.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="286.33" y="37.50" width="6.71" height="25.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="298.76" y="23.50" width="6.71" height="53.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="311.18" y="41.00" width="6.71" height="18.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="323.60" y="20.00" width="6.71" height="60.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="336.02" y="37.50" width="6.71" height="25.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="348.44" y="30.50" width="6.71" height="39.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="360.87" y="27.00" width="6.71" height="46.00" rx="3.36" ry="3.36" fill="#ffffff"/>
<rect x="373.29" y="44.50" width="6.71" height="11.00" rx="3.36" ry="3.36" fill="#ffffff"/>

여기에서 각 막대에 대해 높이 11, 18, 25, 32, 39, 46, 53 및 60픽셀의 8가지 변형이 있음을 알 수 있습니다. 우리는 첫 번째 막대와 마지막 막대가 항상 11픽셀(스캐너를 보정하기 위해 로고 크기와 함께 사용됨)이라는 사실을 확인했습니다. 따라서 21개의 막대 × 막대당 3비트 = 바코드당 63비트의 정보가 남습니다. Spotify 트랙 ID보다 어떤 종류의 조회 테이블을 사용해야 합니다.

이 시점에서 우리는 실제 인코딩에 대한 자세한 내용과 함께 Spotify의 특허(US , EU )를 만났습니다(예: 바의 높이가 하나 떨어져 있을 때 발생할 수 있는 오류를 줄이는 그레이 코드가 사용됨).

그러나 잠시만요, 유효하지 않은 데이터에 대한 바코드를 얻으려고 하면 어떻게 될까요?

그래서 우리는:
  • 빈 문자열이 작동하지 않았습니다.
  • 임의의 단어가 작동하지 않음,
  • https://dev.to/도 작동하지 않았지만
  • spotify:track:helloDEV 작동합니다!



  • 이것은 확실히 의미있는 곳으로 이어지지는 않지만 기술적으로 올바른 Spotify 코드입니다.

    Spotify 페이지를 열지는 않지만 적어도 코드 데이터베이스(이전의 looktype, 기억하시나요?)를 쿼리해야 합니다. 그래서 내 친구는 리버스 프록시를 통해 Spotify를 실행하고 유효하지 않은 코드 중 하나를 스캔하려고 시도했습니다.



    그것은 효과가 있었다! 따라서 이러한 코드는 무엇이든 사용할 수 있지만 Spotify는 언제든지 코드를 취소할 수 있으므로 주의하세요.

    보너스 포인트를 위해 추가 정보가 포함된 작업 바로드(즉, 실제 트랙을 가리킴)를 얻으려고 했습니다. 내 추측으로는 spotify:something:something 문자열이 URI라고 하면 URI로 구문 분석되고 여기에 쿼리 문자열을 추가할 수 있다는 것입니다. 분명히 ?hello=dev를 추가하면 쿼리 문자열이 scannables.scdn.co 서버로 전송되고 원래 코드만 반환되지만 URL 인코딩 매개변수도 도움이 되지 않았습니다. 그러나 이상하게도 이중 URL 인코딩 후:
    https://scannables.scdn.co/uri/plain/png/000000/white/640/spotify:track:1er51HCEBhIAtoEemKuC3M%253Fhello=dev
    



    그것은 효과가 있었다! 앱으로 스캔하고 트랙을 얻을 수 있으며 트래픽을 보면 내부에 비밀 메시지가 표시됩니다.

    이로 인해 우리는 두 개의 미니 퀘스트를 만들게 되었습니다. 지역 DEFCON 채팅(37517)에 하나를 게시했습니다.
    그녀의 전보 채널에. 우리의 수수께끼는 단 42분 만에 풀렸는데, 정말 인상적이었습니다.

    실용적인 의미



    이러한 방식으로 Spotify에 쓰레기를 저장하는 것은 실제로 실용적이지 않은 2⁶³ HTTP 쿼리를 전송해야 하기 때문에 Spotify 코드 오버플로를 유발할 가능성이 없습니다(게다가 Spotify는 언제든지 코드를 취소할 수 있으므로 그렇게 시도하더라도 코드는 어쨌든 곧 지워질 것입니다).

    이론상으로는 비공식 스캐너를 작성하여 이러한 내장된 메시지를 읽게 할 수 있지만(예: 임의의 HTTP 링크에 대한 Spotify 코드를 만들기 위해) QR과 같은 보다 개방적이고 독립적인 시스템으로 이미 해결되었습니다(멋지게 보이진 않지만). .

    제 생각에는 이것은 시스템 보안 및 데이터 인코딩의 연습으로만 유용하지만 여전히 가지고 놀기에 재미있는 일이었습니다!


    Habr(러시아어)에 있는 님의 게시물을 기반으로 합니다.

    좋은 웹페이지 즐겨찾기