2P by GN⁺ 1일전 | ★ favorite | 댓글 1개

curl-impersonate

특정 브라우저를 모방할 수 있는 curl의 특별한 빌드로, Chrome, Edge, Safari, Firefox를 모방할 수 있음. curl-impersonate는 실제 브라우저와 동일한 TLS 및 HTTP 핸드셰이크를 수행할 수 있음. 명령줄 도구로 사용하거나 라이브러리로 통합 가능함.

왜 필요한가?

  • HTTP 클라이언트가 TLS 웹사이트와 통신할 때, 첫 번째로 TLS 핸드셰이크를 수행함. 이때의 첫 메시지를 Client Hello라고 부름.
  • 대부분의 HTTP 클라이언트와 라이브러리가 생성하는 Client Hello 메시지는 실제 브라우저와 크게 다름.
  • 서버가 HTTP/2를 사용할 경우, TLS 핸드셰이크 외에도 HTTP/2 핸드셰이크가 필요하며, 이때 교환되는 설정도 실제 브라우저와 다름.
  • 이러한 이유로, 일부 웹 서비스는 TLS 및 HTTP 핸드셰이크를 통해 클라이언트를 식별하고, 다른 클라이언트에 대해 다른 콘텐츠를 제공함.
  • 이러한 방법은 TLS 핑거프린팅 및 HTTP/2 핑거프린팅으로 알려져 있으며, 웹을 덜 개방적이고 덜 개인적이며 특정 웹 클라이언트에 대해 더 제한적으로 만듦.
  • 이 저장소의 수정된 curl은 TLS 및 HTTP 핸드셰이크가 실제 브라우저와 정확히 동일하게 보이게 함.

어떻게 작동하는가?

  • curl을 브라우저처럼 보이도록 상당히 수정함.
  • Firefox가 사용하는 TLS 라이브러리인 nss로 curl을 컴파일하고, Chrome 버전은 Google's TLS 라이브러리인 BoringSSL로 컴파일함.
  • 다양한 TLS 확장 및 SSL 옵션을 구성하는 방법을 수정함.
  • 새로운 TLS 확장 지원 추가.
  • HTTP/2 연결에 대한 curl의 설정 변경.
  • --ciphers, --curves 및 일부 -H 헤더와 같은 비기본 플래그로 curl 실행.

지원되는 브라우저

  • 다양한 버전의 Chrome, Edge, Firefox, Safari를 모방할 수 있음.
  • 각 브라우저에 대한 래퍼 스크립트가 제공되어 curl-impersonate를 실행함.

기본 사용법

  • 지원되는 각 브라우저에 대해 필요한 헤더와 플래그로 curl-impersonate를 실행하는 래퍼 스크립트가 있음.
  • 예: curl_chrome116 https://www.wikipedia.org

문서

  • 추가 문서는 docs/ 디렉토리에 있음.

설치

  • curl-impersonate는 기술적 이유로 두 가지 버전이 있음. Chrome, Edge, Safari를 모방하는 chrome 버전과 Firefox를 모방하는 firefox 버전이 있음.
  • Linux 및 macOS용 사전 컴파일된 바이너리는 GitHub 릴리스 페이지에서 제공됨.

고급 사용법

libcurl-impersonate

  • libcurl-impersonate.so는 명령줄 curl-impersonate와 동일한 변경 사항으로 컴파일된 libcurl임.
  • 추가 API 함수 curl_easy_impersonate를 제공함.

CURL_IMPERSONATE 환경 변수 사용

  • 이미 libcurl을 사용하는 애플리케이션에서 LD_PRELOAD를 사용하여 기존 라이브러리를 런타임에 대체 가능함.
  • CURL_IMPERSONATE 환경 변수를 설정하여 모든 옵션을 자동으로 설정 가능함.

기여

  • 오픈 이슈를 확인하고, 변경 사항을 포함한 풀 리퀘스트를 열어 기여 가능함.

스폰서

  • 프로젝트를 오픈하고 유지하는 데 도움을 주는 스폰서가 있음. 스폰서가 되고 싶다면 직접 연락 가능함.
Hacker News 의견
  • 코더와 게시자에게 찬사를 보냄. OpenSSL을 사용하는 브라우저 프로젝트에 참여 중이며, WireShark를 통해 직접 분석해야 할 것이라 생각했음. 이제는 참고할 많은 자료가 생겼음. OpenSSL의 가장 일반적인 사용이 Python이라면, Cloudflare 시대에 Firefox TLS 스푸핑 옵션은 필수적임.

    • 이 프로젝트의 포크 중 원본보다 개선된 것이 있으며, 적극적으로 유지 관리되고 있음: curl-impersonate
    • Python을 사용하는 사람들을 위한 포크의 Python 바인딩도 있음: curl_cffi
  • Ladybird가 미래에 주목받기를 바람. 현재 네트워킹에 cURL을 사용 중임. cURL은 아직 몇 가지 제한이 있을 수 있음 (예: WebSockets를 h2에서 처리할 수 없음). 그러나 새로운 브라우저 엔진이 등장하면 합법적인 트래픽이 기본 cURL과 동일한 지문을 가질 수 있음.

  • IP_TTL 값을 플랫폼에 맞춰 설정했는지 궁금함. 설정하지 않았다면, IP 계층에서 어느 정도 지문을 남길 수 있음. IP 계층의 TTL 값이 64 미만이면, 이는 최신 Windows에서 실행되지 않거나 기본 TTL이 변경된 최신 Windows 기기에서 실행 중임을 나타냄. 최신 Windows의 패킷 TTL은 기본적으로 128에서 시작하며, 대부분의 다른 플랫폼은 64에서 시작함. 다른 플랫폼은 인터넷 통신에 문제가 없으므로, 최신 Windows의 IP 패킷은 항상 64 이상의 TTL로 원격에서 보임.

  • TLS 핸드셰이크가 다르게 보인다면, 웹 브라우저(예: Chrome 사용자 에이전트)라고 주장하는 트래픽을 필터링할 수 있는 nginx 수준의 필터가 가능한지 궁금함. 이는 악성 봇 트래픽의 대부분을 차지하며, 이를 차단하고 싶음.

  • 이러한 내용이 여기에 나타나는 것에 대해 항상 양가감정을 가짐. 한편으로는 사람들에게 독립성과 반항심이 여전히 살아있음을 알리는 것이 좋음. 그러나 "자유는 불안정" 프로젝트처럼 원치 않는 주목을 끌면 의존하는 사람들에게 더 나빠질 수 있음. 브라우저를 작성하는 것은 어렵고, 기존 업체들은 계속해서 더 어렵게 만듦.

  • 이 도구는 작은 bash 스크립트와 gnu parallel과 결합하여 red team 작업에서 https 엔드포인트를 매핑하는 데 매우 유용함. 적절한 브라우저에만 응답하는 범위 내 주소에서 사용함. 헤더 스푸핑을 위한 -H 같은 일반적인 curl 스위치를 사용할 수 있음.

  • Showhn 당시 링크

  • 이제 MCP 버전을 기다리고 있음 :)

  • 웹사이트가 봇을 허용하거나 차단하는 간단한 시절이 그리움.