
JavaScript beacons 및 C2로, 웹앱 서버나 데스크탑 소프트웨어에서 XSS payload 또는 post exploitation implants로 사용되어 사용자를 모니터링하고 지속성을 유지하기 위한 도구입니다. Browser extension, electron app, node/bun app implants가 포함됩니다.
주요 변경 사항은 프로젝트 공지사항에 문서화되어 있습니다:
https://github.com/hoodoer/JS-Tap/discussions/categories/announcements
JS-Tap에 대한 원본 블로그 게시물은 여기에서 읽을 수 있습니다:
https://trustedsec.com/blog/js-tap-weaponizing-javascript-for-red-teams
ShmooCon에서 JS-Tap 버전 1의 짧은 데모:
https://youtu.be/IDLMMiqV6ss?si=XunvnVarqSIjx_x0&t=19814
HackSpaceCon에서 JS-Tap 버전 2 데모 (C2 및 사후 침투 임플란트로 사용하는 방법 포함):
https://youtu.be/aWvNLJnqObQ?t=11719
자동 페이로드 생성기 데모 (가로챈 양식 제출과 JavaScript 네트워크 트래픽을 청사진으로 사용하여 맞춤 C2 페이로드 생성):
https://www.youtube.com/watch?v=cU915mxLfTo
CactusCon에서 v2 데모 (mimic 기능 포함):
https://youtu.be/O7-zxAmP13o?si=gchYwOJksutCCUPH
v3 비콘 베타 코드 데모:
https://youtu.be/-esrfSHqZeo
데이터베이스 마이그레이션 스크립트를 계획하지 않으며, 버전 번호 변경 시 종종 데이터베이스 스키마 변경이 수반됩니다 (변경 로그 확인). 버전 업데이트 시 jsTap.db 데이터베이스를 삭제하는 것이 좋습니다. JS-Tap 서버에 사용자 정의 페이로드가 있는 경우 데이터베이스 파일을 삭제하기 전에 반드시 내보내십시오.
JS-Tap은 레드 팀을 위한 JavaScript 기반 공격 툴킷입니다. 이는 XSS 또는 사후 침투 임플란트를 통해 웹 애플리케이션을 공격하는 일반적인 JavaScript 페이로드로 시작되었으며, 단일 C2 서버에 보고하는 브라우저 확장 프로그램 및 Electron 데스크톱 앱 임플란트를 포함하도록 성장했습니다.
이 페이로드는 대상 사용자가 공격 대상 애플리케이션에 인증되어 있을 필요가 없으며, 애플리케이션에 JavaScript를 주입할 방법을 찾는 것 외에 사전 지식이 필요하지 않습니다.
JS-Tap 페이로드는 애플리케이션 서버 자체를 공격하는 대신 애플리케이션의 클라이언트 측에 초점을 맞추고 클라이언트 측 코드를 집중적으로 계측합니다. C2 시스템은 맞춤 JavaScript 페이로드를 추가하여 JS-Tap 클라이언트에서 작업으로 실행할 수 있게 하여, 애플리케이션 서버를 직접 공격하는 수단을 제공합니다. 서버 공격으로의 전환을 더 빠르게 하기 위해, JS-Tap은 이제 맞춤 페이로드를 자동으로 생성하여 C2 시스템에 전달하는 "mimic" 기능을 포함합니다.
예제 DOM 비콘 페이로드는 payloads 디렉토리의 telemlib.js 파일에 포함되어 있습니다. 그러나 이 디렉토리의 모든 파일은 인증 없이 제공되므로, 동시에 다른 애플리케이션을 대상으로 여러 페이로드를 다른 구성으로 제공할 수 있습니다.
telemlib.js 파일을 원하는 파일 이름으로 복사하고 필요에 따라 구성을 수정하십시오. 이 파일은 난독화되지 않았습니다. 실제 작전에 사용하기 전에 엔드포인트 이름을 변경하고, 주석을 제거하며, 페이로드를 강력하게 난독화하는 것을 적극 고려하십시오. 기본적으로 애플리케이션은 다소 명백한 API 엔드포인트(예: /loot/screenshot)를 사용합니다. App Settings에서 트래픽 난독화를 켤 수 있습니다.
공개적으로 노출된 서버에서 사용하기 전에 아래 구성 섹션을 주의 깊게 검토하십시오.
JS-Tap은 동일한 서버에 연결하는 5가지 비콘/에이전트 유형이 있습니다:
| 비콘 유형 | 설명 | 전달 방식 |
|---|---|---|
| DOM 비콘 (telemlib.js) | 웹 페이지에 주입되는 JavaScript 페이로드입니다. DOM을 계측하고 사용자 활동, 스크린샷, 네트워크 호출을 캡처합니다. | XSS 취약점을 이용하거나 대상 애플리케이션의 JavaScript 파일에 직접 추가 (사후 침투). |
| BEX 비콘 | 브라우저 확장 프로그램 (Chrome MV3 / Firefox MV2)입니다. 모든 탐색 활동을 모니터링하고 쿠키 (httpOnly 포함), localStorage, sessionStorage, 요청 헤더를 캡처합니다. 명령에 따라 특정 도메인에 DOM 비콘을 주입할 수 있습니다. | 대상 브라우저에 설치 (사회 공학, 물리적 접근, 정책 푸시 등). |
| 사이드카 | 대상 OS에서 실행되는 네이티브 Go 바이너리입니다. 파일 시스템 탐색, 파일 읽기, 명령 실행을 제공합니다. | 네이티브 메시징을 통해 BEX 비콘과 함께 설치됩니다. 명령을 중계하려면 BEX 비콘이 필요합니다. |
| 아톰 비콘 | Electron 데스크톱 애플리케이션을 위한 이중 계층 임플란트입니다. 메인 프로세스 에이전트 (Node.js 런타임) + 모든 앱 창에 렌더러 페이로드를 주입합니다. 브라우저 수준 데이터 수집과 호스트 수준 OS 접근을 결합합니다 — 별도의 바이너리가 필요 없습니다. 브라우저 프록시 모드를 지원합니다. | atomize.py를 사용하여 대상 Electron 앱의 ASAR 아카이브 (또는 압축 해제된 앱 디렉토리)에 패치됩니다. |
| V8 비콘 | Node.js 및 Bun CLI 애플리케이션 (Gemini CLI, Claude Code 등)을 위한 JavaScript 에이전트입니다. 모든 HTTP/Fetch 네트워크 호출을 가로채고 키 입력을 캡처하며 파일 시스템 및 셸 접근을 제공합니다. 브라우저 프록시 모드를 지원합니다. 의존성이 없습니다. | 환경 변수 NODE_OPTIONS="--require" (Node.js) 또는 BUN_OPTIONS="--preload" (Bun)을 통해 주입됩니다. 앱 패치가 필요 없습니다. |
다섯 가지 유형 모두 동일한 JS-Tap 서버 포털에 보고하며, 여기서 전리품을 보고 C2 명령을 발행합니다.
포털에는 두 가지 세션 복제 도구도 포함되어 있습니다:
| 도구 | 기능 |
|---|---|
| 브라우저 프록시 | JS-Tap 서버에서 실행되는 MITM 프록시로, 운영자의 HTTP/HTTPS 트래픽을 WebSocket을 통해 피해자의 브라우저(Node.js 프로세스)로 라우팅합니다. 요청은 피해자의 네트워크 컨텍스트에서 가져오므로, 대상 사이트는 피해자의 IP와 TLS 지문을 보게 됩니다. 세션 티켓과 결합하여 피해자의 네트워크를 통한 인증 브라우징이 가능합니다. BEX, 아톰 및 V8 비콘에서 지원됩니다. 아래 브라우저 프록시를 참조하십시오. |
| JS-Tap Conductor | BEX 비콘이 캡처한 세션 데이터를 ("JS-Tap 티켓"으로) 가져와 로컬에서 재생하는 독립형 Firefox 확장 프로그램입니다 — 쿠키 설정, 헤더 주입, 스토리지 채우기, 사용자 에이전트 스푸핑을 수행하여 운영자가 피해자처럼 탐색할 수 있게 합니다. 아래 JS-Tap 티켓 및 JS-Tap Conductor를 참조하십시오. |
독립형 DOM 비콘: DOM 비콘 페이로드(telemlib.js)는 독립적으로 작동합니다. XSS를 통해 주입하거나 대상 앱의 JS 파일에 임플란트합니다. 스스로 JS-Tap 서버에 연결합니다.
드로퍼로서의 BEX 비콘: BEX 비콘은 탐색을 모니터링하고 수동 정보 수집 (쿠키, localStorage, sessionStorage, 요청 헤더, 탐색)을 수행합니다. JS-Tap 포털에서 비콘에 명령하여 특정 도메인에 DOM 비콘을 주입할 수 있습니다. BEX 비콘에 의해 생성된 DOM 비콘은 확장 프로그램의 captureVisibleTab API를 통해 고품질 스크린샷을 얻습니다 ("BEX-Assist" 모드).
OS 접근을 위한 사이드카: 설치된 경우, 사이드카 바이너리는 BEX 비콘에 기본 운영 체제에 대한 접근 권한을 부여합니다. 명령은 JS-Tap 포털에서 전송되고, 비콘의 암호화된 채널을 통해 네이티브 바이너리로 중계되며, 결과는 다시 전송됩니다. 이는 브라우저 확장 프로그램을 파일 시스템 접근 및 명령 실행을 위한 거점으로 변화시킵니다.
실시간 브라우징을 위한 브라우저 프록시: 운영자는 브라우저를 JS-Tap 프록시로 구성하고 모든 HTTP/HTTPS 트래픽이 실시간으로 피해자의 브라우저를 통해 라우팅됩니다. 프록시는 MITM TLS 종료를 수행하고 (자동 생성된 CA 사용) 운영자가 HTTPS 사이트를 탐색할 수 있게 합니다. 프록시는 "멍청한 파이프" 역할을 합니다 — 운영자의 브라우저가 보내는 것을 그대로 전달합니다. 인증 브라우징을 위해 세션 티켓과 결합하십시오: JS-Tap Conductor가 피해자의 쿠키, 헤더 및 사용자 에이전트를 운영자의 브라우저에 주입하고, MITM 프록시가 이를 비콘에 전달하며, 비콘은 피해자의 네트워크에서 가져옵니다. 이는 운영자에게 피해자의 IP 주소에서 인증된 세션을 제공합니다. BEX, 아톰 및 V8 비콘 모두 프록시 모드를 지원합니다.
Electron 앱을 위한 아톰 비콘: atomize.py 패처는 Electron 앱의 ASAR 아카이브를 수정하여 아톰 비콘 에이전트를 주입합니다. 실행 시 에이전트는 JS-Tap 서버에 등록하고 암호화된 C2 통신을 시작하며, 앱이 생성하는 모든 BrowserWindow에 자동으로 렌더러 페이로드를 주입합니다. 메인 프로세스 에이전트는 네이티브 OS 접근 (파일 시스템, 명령 실행)을 제공하는 반면, 렌더러 페이로드는 DOM 수준 데이터 (키 입력, 입력, 양식, 쿠키, 스토리지, 네트워크 호출)를 수집합니다. Electron 메인 프로세스 내에서 전체 Node.js 접근 권한으로 실행되므로 별도의 사이드카 바이너리가 필요하지 않습니다 — 파일 탐색, 파일 읽기 및 셸 명령이 내장되어 있습니다.
CLI 도구를 위한 V8 비콘: V8 비콘은 Node.js 및 Bun 기반 CLI 애플리케이션을 대상으로 합니다. 환경 변수(NODE_OPTIONS 또는 BUN_OPTIONS)를 설정하면 비콘이 앱 자체 코드보다 먼저 로드됩니다 — 대상 앱의 패치나 수정이 필요하지 않습니다. http.request, https.request, fetch 및 http2.connect를 몽키 패치하여 모든 네트워크 트래픽을 가로채고, 키 입력 캡처를 위해 process.stdin을 후킹하며, C2 채널을 통해 파일 탐색 및 셸 실행을 제공합니다. 자식 프로세스를 생성하는 CLI 도구 (예: Gemini CLI는 대화형 세션을 위해 자식을 생성)는 자동으로 처리됩니다 — 자식은 부모의 세션 키를 상속하고 포털에서 동일한 논리적 클라이언트를 공유합니다. 런타임 간 서브프로세스 필터링은 Bun 앱의 Node.js 유틸리티 서브프로세스가 별도의 클라이언트로 등록되는 것을 방지합니다.
앱별 공격을 위한 플러그인: Atom 비콘 및 V8 비콘 클라이언트는 런타임에 로드 가능한 플러그인을 지원합니다. 플러그인은 JS-Tap 포털에서 로드되는 JavaScript 모듈로, 특정 대상 애플리케이션(예: Mattermost 플러그인)에 대한 비콘의 기능을 확장합니다. 플러그인은 비콘의 Node.js API (fs, http, crypto, child_process), Electron API (Atom 비콘의 경우) 및 서버로 다시 데이터 유출 채널에 접근할 수 있습니다. 각 플러그인에는 대상 앱, 기능 및 운영자가 구성할 수 있는 설정을 선언하는 매니페스트(manifest.json)와 포털에 표시되는 선택적 UI 패널(ui.html)이 포함됩니다.
참고: XHR 및 Fetch API 호출 내용을 수신하는 기능은 트랩 모드에서 작동합니다. 임플란트 모드에서는 현재 Fetch API만 복사할 수 있습니다. 임플란트 모드에서는 양식 제출 가로채기가 때때로 누락될 수 있습니다.
browser.cookies.getAll()을 통해 httpOnly 포함, 메타데이터: httpOnly, secure, sameSite, path, domain, expiration)메인 프로세스 에이전트 (Node.js 런타임):
session.cookies API를 통한 모든 도메인의 모든 쿠키 (httpOnly 포함, 메타데이터 포함)webRequest.onBeforeSendHeaders를 통한 요청 헤더 (Authorization, x-api-key, Cookie, Set-Cookie)webRequest.onHeadersReceived를 통한 응답 헤더 (Set-Cookie, WWW-Authenticate, x-csrf-token, Location)desktopCapturer API를 통한 애플리케이션 창 스크린샷 (GPU 합성 출력 캡처)