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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
cuddlephish — 침투 테스터를 위한 무기화된 Browser-in-the-Middle (BitM) | Kitploit
도구/GitHubGitHub/fkasler/cuddlephish
Phishing ToolsWeb Application ExploitationPhishingPenetration TestingSocial EngineeringRed Teaming
GitHubfkasler/cuddlephish

cuddlephish

침투 테스터를 위한 무기화된 Browser-in-the-Middle (BitM)

저장소 보기
673806512일 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CuddlePhish

phishy

무기화된 다중 사용자 브라우저-인-더-미들(BitM) 도구로, 침투 테스터를 위한 것입니다. 이 공격은 많은 고가치 웹 애플리케이션에서 다중 요소 인증을 우회하는 데 사용될 수 있습니다. 세션 토큰을 사용하지 않는 애플리케이션에서도 작동하므로, 전통적인 토큰 탈취 공격으로는 악용할 수 없습니다. 이는 사회 공학 도구이며 대상 서비스의 기술적 결함을 악용하지 않습니다.

빠른 시작

이 도구는 특수 웹 서버입니다. Debian 11 (Bullseye) Linux 서버에서 실행되도록 설계되었으며, 관리 기능을 보호하기 위해 공인 IP 정보에 의존합니다. 상당한 난관을 겪지 않고 로컬에서 테스트할 수 있다고 기대하지 마세요.

경고: Chromium은 ARM을 지원하지 않습니다. ARM Chromium 바이너리를 강제로 사용하는 것이 기술적으로 가능하지만, puppeteer-extra의 모든 추가 기능/보호 기능을 잃게 됩니다.

이 예제 설정은 Caddy를 사용하여 TLS, SNI를 처리하고 각 요청에 'X-Real-IP'와 같은 몇 가지 사용자 지정 헤더를 추가합니다. Cuddlephish와 함께 Caddy를 사용할 필요는 없으며, Nginx, Apache 등을 사용하여 동일한 리버스 프록시를 설정할 수 있습니다. 개인적으로 Docker로 설치하기 쉽고 대부분의 도메인 등록기관에 대해 Letsencrypt 인증서를 관리하는 플러그인이 있기 때문에 Caddy를 선호합니다. 예제 Caddyfile은 Gandi용 설정 방법을 보여줍니다. 등록기관의 문서를 확인하세요.

Install Docker, Node, XVFB, and some other dependencies:

git clone https://github.com/fkasler/cuddlephish
cd cuddlephish
sudo bash install_deps.sh

그런 다음 Docker를 사용하여 등록기관용 와일드카드 인증서 플러그인이 포함된 Caddy를 빌드할 수 있습니다. 예제는 Gandi용입니다. 문서는 여기에서, DNS 제공자 모듈 목록은 여기에서 확인하세요. 빌드 전에 등록기관에 맞게 Dockerfile을 수정할 수 있습니다:

sudo docker build -t caddy .

이제 Caddyfile을 수정하여 도메인과 Gandi(또는 다른 등록기관) API 키를 변경하고 Caddy를 시작하세요. screen 또는 tmux 창에서 시작하여 잠시 후 Node 서버를 다른 창에서 실행할 수 있도록 권장합니다:

sudo docker run -p 80:80 -p 443:443 -p 2019:2019 -v $PWD/Caddyfile:/etc/caddy/Caddyfile --network=host caddy:latest

Caddy가 80 및 443 포트에서 트래픽을 처리하고 있으므로, 마침내 도구를 실행할 수 있습니다! Node 종속성을 설치합니다:

npm install

약간의 구성 조정: 중요 단계: 예제 config.json을 수정하여 관리자 액세스를 위한 승인된 공인 IP를 추가하세요. 이 IP 화이트리스트가 "/admin" 웹 인터페이스에 대한 액세스를 결정합니다. 또한 기본 소켓 키를 더 안전한 것으로 변경해야 합니다.

도구는 기본적으로 로그인을 대상으로 하도록 설정되어 있지 않으므로 직접 추가해야 합니다. 이 단계를 쉽게 만들어 주는 'add_target.js' 스크립트가 있습니다. 스크립트를 실행하고 프롬프트가 나타나면 대상 로그인 포털의 URL을 붙여넣기 하세요:

node add_target.js

이렇게 하면 서비스 이름, 탭 제목, 파비콘을 가져와 'targets.json'에 항목을 추가합니다. 이 스크립트를 여러 번 실행하면 새 대상이 추가됩니다. 스크립트는 최상위 도메인을 제외한 도메인을 기반으로 각 서비스 이름을 지정합니다. 따라서 'https://www.example.com/login.php'의 경우 대상을 지정할 때 서비스는 'example'이 됩니다.

실행하세요!

node index.js example

몇 초 후, 첫 번째 자동화된 Chrome 인스턴스가 웹소켓을 통해 연결되면 콘솔에 메시지가 표시됩니다. 이제 피싱 사이트 방문자는 대상 로그인 페이지처럼 보이지만 실제로는 자동화된 브라우저 인스턴스의 비디오 피드인 화면을 보게 됩니다. 또한 브라우저 인스턴스와 상호 작용하여 로그인할 수 있습니다.

config.json에서 관리자 IP를 올바르게 구성했다면 특별한 '/admin' 웹 인터페이스를 볼 수 있어 사용자 추적, 키 로그 보기, 로그인된 브라우저 인스턴스 제어 인수, 쿠키 탈취, 불필요한 브라우저 인스턴스 삭제 등을 할 수 있습니다.

참고: 피해자가 발생하기 전까지는 관리자 페이지에 아무것도 표시되지 않습니다. 피해자가 생기면 해당 브라우저 인스턴스가 관리자 UI에 나타납니다.

문제 해결 ("빈 페이지만 보입니다")

몇몇 사람들이 "빈 흰 페이지"에 대한 이슈를 제기했는데, 이는 자체적인 문제라기보다는 여러 가능한 문제들의 증상입니다. 모호한 증상 이름으로 이슈를 열지 말아 주세요. 대신 사용자 측에서 빈 페이지가 보인다면 먼저 다음 사항을 확인하세요.

  • 대상 서비스의 탭 제목에 특수 문자가 없는지 확인하세요. "--auto-select-desktop-capture-source"를 사용하여 자동화된 브라우저가 어떤 탭을 스트리밍할지 지정합니다. 이 옵션은 특수 문자가 있는 제목에서는 실패합니다. 하지만 전체 탭 제목이 일치할 필요는 없으며, 고유한 일치를 위한 충분한 부분 문자열만 있으면 됩니다.
  • 마찬가지로, 대상 서비스가 자동화된 브라우저에 302 또는 유사한 리디렉션을 보내고 피해자에게 WebRTC 브로드캐스트를 시작하기 전에 탭 제목이 변경되면 "--auto-select-desktop-capture-source"가 실패합니다. add_target.js가 이 정보를 어떻게 가져오는지 살펴보고 index.js에서 console.log() 문과 함께 복제하여 WebRTC 협상 전에 제목이 변경되었는지 확인할 수 있습니다.
  • cuddlephish HTML이 로드되고 있는지, 프론트엔드 개발자 콘솔에 명백한 JavaScript 오류가 없는지 확인하세요. 예제 Caddy 구성에는 curl과 같은 사용자 에이전트 문자열에 대한 기본 차단이 있습니다. 최소한 탭 제목과 파비콘이 스푸핑되고 있는지 확인해야 합니다.
  • 서버에서 예제 STUN 서비스 및 포트(stun.l.google.com:19302)와 상호 작용할 수 있는지 확인하세요.
  • 작업 중인 네트워크가 STUN을 허용하는지 확인하세요. STUN은 "full-cone NAT", "(Address)-restricted-cone NAT", "Port-restricted cone NAT"에서만 작동합니다. "Symmetric NAT"에서는 작동하지 않습니다.
  • 테스트 피해자 브라우저에서 예제 STUN 서비스 및 포트(stun.l.google.com:19302)와 상호 작용할 수 있는지 확인하세요. https://icetest.info/를 사용해 보세요.
  • 네트워크가 예제 STUN 서버에 도달할 수 없으면 도달 가능한 서버로 변경하세요. 네트워크가 STUN을 허용하지 않는 경우, cuddlephish 및 broadcast HTML 페이지에 TURN 서버에 대한 예제 구성이 있습니다. 직접 TURN 서버를 설정하거나 비용을 지불해야 합니다. 참고: TURN 서버는 피싱 피해자를 브라우저 인스턴스에 연결할 가능성이 가장 높습니다.

높은 수준에서 프론트엔드에 빈 페이지만 보인다면 "Start WebRTC" > "Select Tab to Broadcast" > "Negotiate ICE with Victim's Browser" > "Stream Video"의 데이터 흐름 체인 중 어딘가에서 문제가 발생한 것입니다. 위의 문제 해결 단계는 이 과정을 따라 데이터를 추적하는 데 도움을 주기 위한 것입니다. 제대로 작동하는 경우 서버에서 다음과 유사한 로그 스트림이 표시됩니다:

troubleshoot

이 정보가 문제 해결에 도움이 되길 바라며, 항상 그렇듯이 문제를 일관되게 재현할 수 있는 충분한 정보는 추가 조사를 위해 이슈를 제출하기 위한 전제 조건입니다.

관리자 기능

페이로드 보내기:

JavaScript를 통해 피해자 시스템에 페이로드를 다운로드하도록 수동으로 트리거합니다. 각 대상은 테스트 페이로드로 'payload.txt'로 시작합니다. targets.json에서 파일 위치를 변경하여 사용자 정의 페이로드를 보내면 됩니다.

사용자 내보내기:

피해자에게 window.location 변경을 보내 실제 로그인 포털로 이동시킵니다. 이는 단순히 재인증을 강제받는 것처럼 보이게 하여 사용자가 당신이 컨트롤을 잡는 것을 보지 못하게 합니다. 코드를 수정하면 이 일반적인 기술로 다른 멋진 일을 할 수 있습니다 ;)

인수:

관리자 포털에서 직접 브라우저 인스턴스를 제어할 수 있습니다. 인스턴스 제어를 중지하려면 ESCAPE 키를 누르세요. 참고: 이렇게 하면 피싱 피해자가 컨트롤을 잃게 되며, 먼저 내보내지 않으면 당신의 움직임을 볼 수 있습니다. 경고했습니다.

제어권 반환:

자동화된 브라우저 인스턴스의 제어권을 수동으로 사용자에게 다시 줄 수 있습니다. 이는 IT를 사칭하는 일부 사회 공학 시나리오에서 유용할 수 있습니다. 사용자에게 도움 세션을 시작한다고 말하고, 제어권을 잡아 대상 서비스로 이동한 후, 제어권을 반환하여 로그인하게 하고, 다시 제어권을 잡는 등의 작업을 할 수 있습니다.

쿠키 가져오기:

브라우저 인스턴스에서 모든 쿠키 및 로컬 스토리지 항목을 추출하여 JSON 파일로 다운로드합니다. 이 자격 증명 자료를 로컬 시스템에서 실행 중인 브라우저 인스턴스에 주입하려면 프로젝트에 'stealer.js'라는 스크립트가 있습니다. 이 스크립트는 서버가 아닌 사용자 시스템에서 실행하도록 설계되었으므로 사용하려면 시스템에 프로젝트의 Node 구성 요소를 설치해야 합니다.

node stealer.js ~/Downloads/cuddle_asdf1234.json

인스턴스 제거:

필요하지 않은 브라우저 인스턴스를 종료합니다. 때로는 사용자가 완전히 로그인해 주지 않거나, WebRTC 연결이 실패하거나, 세션이 사용하기 전에 시간 초과될 수 있습니다. 이러한 경우 이 버튼을 사용하여 관리자 포털을 통해 불필요한 브라우저 인스턴스를 정리할 수 있습니다.

키 로그 및 사용자 데이터에 대한 참고 사항:

각 브라우저는 고유한 무작위 "browser id"와 프로젝트의 "user_data" 폴더에 해당하는 사용자 데이터 디렉토리와 함께 생성됩니다. 'stealer.js'가 작동하지 않는 경우 해당 인스턴스의 사용자 데이터도 복제해야 할 수 있습니다. 이는 "이 브라우저 기억" 기능이 구현된 방식에 따라 해당 기능을 대상으로 하는 경우 유용할 수 있습니다.

각 사용자 데이터 디렉토리에는 피해자 사용자의 전체 키 로그가 포함된 keylog.txt도 있습니다. 관리자 포털의 일반 키 로그는 백스페이스 등을 처리하려고 시도하는 반면, 이 keylog.txt에는 기록된 모든 키 입력이 포함됩니다.

Phishmonger 통합

예제 pm.json:

{
  "tacking_id": "id",
  "logging_endpoint": "https://www.phishmongerserver.com/create_event",
  "admin_cookie": "admin_cookie=s3cret",
  "post_url_search": "ppsecure"
}

내부 동작 방식

이 도구는 피싱 사이트 방문자를 피싱 서버에서 실행 중인 자동화된 Chrome 브라우저와 연결하여 작동합니다. 공격자가 제어하는 Chrome 인스턴스의 비디오 피드가 WebRTC를 통해 피싱 피해자에게 스트리밍되며, 사용자가 제공한 모든 마우스 움직임과 키보드 입력은 피해자의 브라우저에서 연결된 Chrome 인스턴스로 전달됩니다. 서버는 웹소켓을 사용하여 피해자를 추적하고, 브라우저와 연결하며, WebRTC 비디오 피드를 중개하고, 사용자 입력을 중간에서 가로챕니다. 새로운 방문자가 올 때마다 서버는 새 Chrome 인스턴스를 생성합니다. 각 Chrome 인스턴스를 제어하기 위해 Chrome Devtools Protocol(CDP)을 사용하므로, 사용자가 로그인한 후 "Storage.getCookie"와 같은 API를 사용하여 대상 사이트의 세션 쿠키를 추출할 수 있습니다. 또한 언제든지 개입하여 각 Chrome 인스턴스를 직접 제어할 수 있으며, 이는 처음에 피해자에게 원격 제어를 제공하는 데 사용한 동일한 방법을 활용합니다.

Node 서버는 다음을 수행합니다:

  • xvfb 인스턴스를 가상 화면으로 사용하여 새 브라우저("빈 피시볼")를 시작하고 탭을 대상 로그인 페이지로 이동시킵니다
  • 자동화된 브라우저의 새 탭에서 WebRTC 설정 스크립트가 포함된 사용자 정의 웹페이지 broadcast.html을 로드합니다
  • 브라우저가 웹소켓을 통해 연결을 확인합니다
  • 피해자가 사이트를 방문하고 웹소켓을 통해 연결을 확인합니다
  • 피해자를 브라우저와 연결하고, 웹소켓을 통해 WebRTC 비디오 스트림을 중개하며, 다음 피해자를 위해 새 브라우저를 생성합니다
  • 브라우저는 무작위 ID로 추적되어 관리자가 브라우저 인스턴스를 "인수"하거나 인스턴스에서 자격 증명 자료를 추출할 수 있도록 합니다

Q&A

왜 이런 위험한 것을 공개하려 합니까? (일명 블랙햇에서 발표할 때마다 어머니가 하시는 질문)

제가 알기로 이 기술은 수년 동안 이론화되고 심지어 무기화되어 왔습니다(추신 참조). 따라서 위협 행위자는 이 기술을 활용할 수 있고 이미 한동안 그랬을 수 있지만, 공격적 보안 전문가들은 이 기술을 쉽게 재현할 수 있는 방법이 없었고 그 존재조차 모를 수 있습니다. 이 도구를 공개하는 의도는 침투 테스터와 레드 팀이 운영에서 BitM을 사용하여 잠재적 영향을 시연하고 네트워크 방어자가 실제 위협에 대비할 수 있도록 돕는 것입니다.

도구 다운로드