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

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

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)

저장소 보기
673804개월 전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:

root@kitploit:~
git clone https://github.com/fkasler/cuddlephish
cd cuddlephish
sudo bash install_deps.sh

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

root@kitploit:~
sudo docker build -t caddy .

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

root@kitploit:~
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 종속성을 설치합니다:

root@kitploit:~
npm install

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

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

root@kitploit:~
node add_target.js

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

실행하세요!

root@kitploit:~
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 구성 요소를 설치해야 합니다.

root@kitploit:~
node stealer.js ~/Downloads/cuddle_asdf1234.json

인스턴스 제거:

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

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

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

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

Phishmonger 통합

예제 pm.json:

root@kitploit:~
{
  "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을 사용하여 잠재적 영향을 시연하고 네트워크 방어자가 실제 위협에 대비할 수 있도록 돕는 것입니다.

이 유형의 공격에서 내 서비스를 어떻게 방어합니까?

먼저, 이 공격은 사용자를 악성 웹사이트로 유도하는 사회 공학에 의존한다는 점을 이해하세요. 도메인 화이트리스트는 이러한 유형의 사회 공학 및 기타 유형을 방지하는 데 큰 도움이 됩니다. 웹 서비스에 대한 자격 증명 데이터(비밀번호, OTP, SMS, PhoneFactor, 푸시 알림 등)의 100%를 사용자가 관리하도록 의존한다면 이 공격에 취약할 수 있습니다. 따라서 이 공격을 저지하기 위해 사용자가 관리하지 않는 자격 증명 데이터를 활용해야 합니다. 예를 들어, 클라이언트 TLS 인증서를 클라이언트 장치에 발급하고 실제 웹 서비스에만 유효하도록 할 수 있습니다. 인증서는 브라우저와 운영 체제에서 관리되며, 공격자의 서버가 피해자의 TLS 인증서 사본을 얻을 방법은 없습니다. 또 다른 옵션은 YubiKey와 같은 하드웨어와 함께 U2F 또는 FIDO2를 사용하여 필요한 자격 증명 데이터의 일부를 관리하는 것입니다. 해커의 웹사이트가 피해자 컴퓨터에 연결된 YubiKey와 상호 작용할 방법은 없습니다.

Caddy에는 Docker를 사용하면서 Node 서버에는 사용하지 않는 이유는 무엇인가요?

아직 Docker 전문가가 아닙니다. 간단한 Docker화된 설정을 만들 수 있다면 풀 리퀘스트를 보내주시면 감사하겠습니다.

바보 같은 이름은 왜 붙였나요?

주변 환경에 녹아들 수 있는 대단한 해양 생물인 Cuttlefish(갑오징어)와 사회 공학이 필요한 피싱(Phishing)을 합친 말장난이며, 독특하고 장난기 가득하며 바보 같게 보이도록 의도적으로 철자를 틀렸습니다. 이 재미있는 도구 이름이 펜테스트 보고서의 중요 위험 발견 사항과 함께 언급될 것이라고 생각하면 기쁩니다.

감사의 말

이 기술과 구현을 독자적으로 생각해냈지만, 이후 몇몇 다른 연구자들이 저보다 먼저 발견했다는 것을 알게 되었습니다. 그들은 각각 웹 기반 VNC 클라이언트를 사용하여 유사한 결과를 얻는 접근 방식을 취했습니다. 이는 직관적인 접근 방식이며 브라우저뿐만 아니라 다른 소프트웨어(아마도 브라우저 내 VPN?)에 대한 MitM 공격을 수행하는 데 적용할 수 있을 수 있습니다. 꼭 확인해 볼 가치가 있습니다:

Franco Tommasi, Christian Catalano & Ivan Taurino https://link.springer.com/article/10.1007/s10207-021-00548-5

@mrd0x https://mrd0x.com/bypass-2fa-using-novnc/

또한:

WebRTC 개념 증명 초기 단계를 도와준 Daniel Aaron @majordmg에게 감사드립니다.

관리자 인터페이스를 수정하고 스타일을 지정해주고 멋진 새 로고를 만들어준 RJ Stallkamp @Z3rO-C00L에게 큰 감사를 드립니다.

도구 다운로드