curl-impersonate: Build curl khusus yang dapat meniru browser utama
(github.com/lwthiker)- curl-impersonate adalah build curl yang dimodifikasi agar melakukan TLS dan HTTP handshake sehingga tampak seperti Chrome, Edge, Safari, atau Firefox, dan dapat digunakan sebagai tool CLI maupun library pengganti
libcurl - Client Hello dan pengaturan HTTP/2 pada client serta library HTTP biasa sangat berbeda dari browser sungguhan, sehingga sebagian layanan web mengidentifikasi client melalui TLS/HTTP handshake dan menyajikan konten yang berbeda
- Implementasinya terdiri dari penggunaan NSS untuk Firefox dan BoringSSL untuk keluarga Chrome, perubahan ekstensi TLS, opsi SSL, dan pengaturan HTTP/2, serta penerapan flag non-default seperti
--ciphers,--curves, dan header - Target yang didukung adalah Chrome 99~116, Android Chrome 99, Edge 99·101, Firefox 91 ESR~117, dan Safari 15.3·15.5; setiap target menyediakan wrapper script dan target name
- Di command line, jalankan
curl_chrome116; untuk integrasi library, dapat diterapkan ke aplikasi yang sudah memakailibcurlmelaluicurl_easy_impersonate()atauLD_PRELOADdanCURL_IMPERSONATEdi Linux
Masalah yang diselesaikan curl-impersonate
- curl-impersonate adalah proyek yang membangun curl secara khusus agar dapat meniru empat browser utama: Chrome, Edge, Safari, dan Firefox
- Dapat melakukan TLS dan HTTP handshake secara identik dengan browser sungguhan
- Ada dua cara penggunaan
- Tool command line yang mirip curl biasa
- Library yang dapat diintegrasikan sebagai pengganti
libcurlyang sudah ada
Mengapa ini diperlukan
- Saat HTTP client terhubung ke situs web TLS, ia terlebih dahulu melakukan TLS handshake
- Pesan pertama dalam TLS handshake adalah Client Hello, dan Client Hello yang dibuat oleh kebanyakan HTTP client serta library sangat berbeda dari browser sungguhan
- Jika server menggunakan HTTP/2, selain TLS handshake juga dilakukan HTTP/2 handshake, tempat berbagai pengaturan dipertukarkan
- Pengaturan HTTP/2 pada kebanyakan HTTP client dan library juga berbeda dari browser sungguhan
- Sebagian layanan web memanfaatkan perbedaan ini untuk mengidentifikasi client yang terhubung dan menyajikan konten berbeda untuk tiap client
- Metode ini disebut TLS fingerprinting dan HTTP/2 fingerprinting
- README menyatakan bahwa penggunaan luas metode ini membuat web menjadi kurang terbuka, kurang privat, dan lebih membatasi client web tertentu
Cara kerjanya
curldipatch cukup banyak agar tampak seperti browser- Perubahan utamanya adalah sebagai berikut
- Versi Firefox mengompilasi curl dengan NSS, library TLS yang digunakan Firefox, alih-alih OpenSSL
- Versi Chrome dikompilasi dengan BoringSSL, library TLS milik Google
- Mengubah cara curl mengatur berbagai ekstensi TLS dan opsi SSL
- Menambahkan dukungan untuk ekstensi TLS baru
- Mengubah pengaturan yang digunakan untuk koneksi HTTP/2
- Menjalankan curl dengan flag non-default seperti
--ciphers,--curves, dan beberapa header-H
- Hasilnya, dari sudut pandang jaringan, curl terlihat identik dengan browser sungguhan
- Penjelasan teknis lengkap ada di part a, part b
Browser yang didukung dan nama target
- Daftar browser yang didukung juga tersedia di
browsers.json - Target dukungan keluarga Chrome
- Chrome 99, 100, 101, 104, 107, 110, 116 on Windows 10
- Chrome 99 on Android 12
- Edge 99, 101 on Windows 10
- Safari 15.3 on MacOS Big Sur
- Safari 15.5 on MacOS Monterey
- Target dukungan Firefox
- Firefox 91 ESR, 95, 98, 100, 102, 109, 117 on Windows 10
- Setiap target yang didukung memiliki target name dan wrapper script
- Contoh: target
chrome116dijalankan dengan wrapper scriptcurl_chrome116 - Contoh: target
ff117dijalankan dengan wrapper scriptcurl_ff117
- Contoh: target
Penggunaan dasar
- Untuk tiap browser yang didukung, tersedia wrapper script yang menjalankan
curl-impersonatedengan header dan flag yang diperlukan - Contoh eksekusi
curl_chrome116 https://www.wikipedia.org - Jika flag command line ditambahkan, flag tersebut diteruskan ke curl
- Sebagian flag dapat mengubah TLS signature curl sehingga dapat terdeteksi
- Wrapper script menggunakan set HTTP header bawaan
- Untuk mengubah header, wrapper script dapat dimodifikasi sesuai tujuan
- Opsi lebih lanjut tersedia dalam penggunaan lanjutan
libcurl-impersonatesebagai library
Instalasi dan metode distribusi
- Karena alasan teknis,
curl-impersonatememiliki dua versi- Versi chrome: digunakan untuk meniru Chrome, Edge, dan Safari
- Versi firefox: digunakan untuk meniru Firefox
- Binary pra-kompilasi untuk Linux dan macOS Intel tersedia di GitHub releases
- Sebelum menggunakan binary pra-kompilasi, NSS dan sertifikat CA perlu dipasang
- Ubuntu:
sudo apt install libnss3 nss-plugin-pem ca-certificates - Red Hat/Fedora/CentOS:
yum install nss nss-pem ca-certificates - Archlinux:
pacman -S nss ca-certificates - macOS:
brew install nss ca-certificates
- Ubuntu:
- Sistem juga memerlukan zlib
- zlib hampir selalu tersedia, tetapi mungkin tidak ada pada beberapa sistem minimal
- Binary Linux pra-kompilasi dibangun untuk sistem Ubuntu
- Jika terjadi error verifikasi sertifikat di distribusi lain, lokasi sertifikat CA mungkin perlu diberitahukan ke curl
curl_chrome116 https://www.wikipedia.org --cacert /etc/ssl/certs/ca-bundle.crt - Untuk build dari source, lihat INSTALL.md
Docker dan paket
- Image Docker berbasis Alpine Linux dan Debian tersedia di Docker Hub
- Image Docker menyertakan binary dan semua wrapper script
- Contoh
# Firefox version, Alpine Linux docker pull lwthiker/curl-impersonate:0.6-ff docker run --rm lwthiker/curl-impersonate:0.6-ff curl_ff109 https://www.wikipedia.org # Chrome version, Alpine Linux docker pull lwthiker/curl-impersonate:0.6-chrome docker run --rm lwthiker/curl-impersonate:0.6-chrome curl_chrome110 https://www.wikipedia.org - Pengguna Archlinux dapat menggunakan paket AUR
- Paket pra-kompilasi: curl-impersonate-bin, libcurl-impersonate-bin
- Paket build dari source: curl-impersonate-chrome, curl-impersonate-firefox
- Formula Homebrew tidak resmi untuk Mac tersedia khusus Chrome
brew tap shakacode/brew brew install curl-impersonate
Penggunaan lanjutan libcurl-impersonate
libcurl-impersonate.soadalah libcurl yang dikompilasi dengan perubahan yang sama seperticurl-impersonatecommand line- Ada fungsi API tambahan
CURLcode curl_easy_impersonate(struct Curl_easy *data, const char * target, int default_headers); - Jika dipanggil dengan target name seperti
chrome116, opsi dan header yang sebelumnya diatur oleh wrapper script akan diatur secara internal - Jika
default_headersbernilai 0, daftar HTTP header bawaan tidak diatur- Pengguna harus menyediakan header sendiri dengan opsi libcurl biasa
CURLOPT_HTTPHEADER
- Pengguna harus menyediakan header sendiri dengan opsi libcurl biasa
curl_easy_impersonate()mengatur beberapa opsi libcurlCURLOPT_HTTP_VERSIONCURLOPT_SSLVERSION,CURLOPT_SSL_CIPHER_LIST,CURLOPT_SSL_EC_CURVES,CURLOPT_SSL_ENABLE_NPN,CURLOPT_SSL_ENABLE_ALPN- Opsi nonstandar untuk proyek,
CURLOPT_HTTPBASEHEADER - Opsi HTTP/2 nonstandar untuk proyek,
CURLOPT_HTTP2_PSEUDO_HEADERS_ORDER,CURLOPT_HTTP2_NO_SERVER_PUSH - Opsi TLS nonstandar untuk proyek,
CURLOPT_SSL_ENABLE_ALPS,CURLOPT_SSL_SIG_HASH_ALGS,CURLOPT_SSL_CERT_COMPRESSION,CURLOPT_SSL_ENABLE_TICKET - Opsi TLS nonstandar untuk proyek,
CURLOPT_SSL_PERMUTE_EXTENSIONS
- Jika kemudian
curl_easy_setopt()dipanggil untuk salah satu opsi di atas, nilai yang diatur olehcurl_easy_impersonate()akan ditimpa
Menerapkannya ke aplikasi libcurl yang sudah ada
- Jika aplikasi sudah menggunakan
libcurl, di Linux library yang ada dapat diganti saat runtime denganLD_PRELOAD - Terapkan peniruan otomatis dengan mengatur environment variable
CURL_IMPERSONATELD_PRELOAD=/path/to/libcurl-impersonate.so CURL_IMPERSONATE=chrome116 my_app CURL_IMPERSONATEmemiliki dua efek- Saat curl handle baru dibuat dengan
curl_easy_init(),curl_easy_impersonate()otomatis dipanggil - Setelah
curl_easy_reset(),curl_easy_impersonate()juga otomatis dipanggil
- Saat curl handle baru dibuat dengan
- Jika perlu mengontrol HTTP header secara presisi, nonaktifkan daftar header bawaan dengan
CURL_IMPERSONATE_HEADERS=nodan atur sendiriLD_PRELOAD=/path/to/libcurl-impersonate.so CURL_IMPERSONATE=chrome116 CURL_IMPERSONATE_HEADERS=no my_app - Metode
LD_PRELOADtidak bekerja pada curl itu sendiri- Karena tool curl menimpa pengaturan TLS
- Untuk curl, gunakan wrapper script
Struktur repositori dan kontribusi
- Repositori memiliki dua folder utama
- Contoh direktori Firefox mencakup file berikut
- Dockerfile: digunakan untuk membangun
curl-impersonatebeserta semua dependensi - curl_ff91esr, curl_ff95, curl_ff98: wrapper script untuk menjalankan dengan flag yang benar
- curl-impersonate.patch: patch utama yang membuat curl menggunakan ekstensi TLS seperti Firefox, sekaligus membuatnya dikompilasi statis dengan libnghttp2 dan libnss
- Dockerfile: digunakan untuk membangun
- tests/signatures adalah database YAML untuk signature browser yang diketahui dapat ditiru
- Patch curl sebenarnya dipertahankan di repositori terpisah yang di-fork dari upstream curl
- Perubahan Firefox ada di branch impersonate-firefox
- Perubahan Chrome ada di branch impersonate-chrome
1 komentar
Opini Hacker News
Ada fork yang aktif dipelihara dengan cukup banyak peningkatan dibandingkan versi asli: https://github.com/lexiforest/curl-impersonate
Ada juga binding untuk pengguna Python: https://github.com/lexiforest/curl_cffi
Ironisnya, request itu mungkin akan membebani server lebih ringan daripada browser tersertifikasi, dan saya jadi bertanya-tanya apakah ini distopia yang dulu diperingatkan pada era 90-an. Saya penasaran apakah ada yang bisa menyebutkan di sini nama satu perusahaan yang menciptakan situasi ini sambil memosisikan diri sebagai kontributor baik bagi komunitas open source/hacker
Semoga ke depannya Ladybird makin kuat. Saat ini untuk networking mereka memakai cURL resmi, tetapi pendekatan ini bisa menemui hambatan
Misalnya, setahu saya cURL masih punya beberapa keterbatasan dan belum bisa menangani WebSocket di atas h2. Sebaliknya, jika ada engine browser yang berkembang, traffic normal juga akan memiliki fingerprint yang sama dengan cURL bawaan, sehingga jalur fingerprinting ini mungkin bisa hilang
Ini juga menjadi ajang uji yang bagus untuk melihat fitur apa saja yang masih kurang di cURL berdasarkan workflow browser sungguhan
Dalam beberapa bulan terakhir, tingkat fingerprinting dan “penyalahgunaan” perilaku yang ditentukan implementasi meningkat tajam, dan tampaknya mungkin merupakan upaya untuk mematikan engine browser lain. Pemain lama sama sekali tidak suka kompetisi
Pihak lawan mencoba membungkusnya sebagai “DDoS oleh bot AI”, tetapi saya bertanya-tanya seberapa banyak dari itu sebenarnya ulah mereka sendiri
Saya suka curl ini, tetapi khawatir ketika suatu komponen mengambil peran sebagai trik untuk “mengejar ketertinggalan”, beban “kompatibilitas” yang sulit dipelihara akan menumpuk
Idealnya kita cukup bisa berkata, “halo, saya curl, izinkan saya masuk”
Tentu masalahnya ada pada server yang terlalu ketat soal aturan berpakaian, dan masalah itu sendiri muncul karena para penipu masuk dengan menyamar, jadi ini berputar seperti ayam dan telur
[0] https://cybershow.uk/episodes.php?id=39
Selain itu, fakta bahwa ia dirancang ulang dengan C++ yang terbukti tidak aman adalah risiko keamanan besar
Apakah mereka juga mengatur
IP_TTLagar cocok dengan nilai TTL platform yang ingin ditiru?Kalau tidak, fingerprinting sampai tingkat IP juga bisa dilakukan sampai batas tertentu. Jika nilai TTL pada lapisan IP kurang dari 64, jelas itu bukan berjalan di Windows modern, atau Windows modern yang TTL bawaannya diubah. Sebab TTL default paket pada Windows modern dimulai dari 128, sementara sebagian besar platform lain dimulai dari 64
Platform lain juga tidak bermasalah berkomunikasi di internet, jadi paket IP dari Windows modern akan selalu terlihat di sisi remote dengan TTL 64 atau lebih, mungkin sedikit di atas 64. Memang fingerprinting lapisan IP sulit, tetapi bukan tidak mungkin
https://en.wikipedia.org/wiki/TCP/IP_stack_fingerprinting
Tunggu, kalau TLS handshake terlihat berbeda, bukankah traffic yang mengaku sebagai browser web tetapi sebenarnya skrip Python/PHP bisa difilter di level nginx?
Misalnya kasus yang memakai user agent Chrome tetapi bukan browser sungguhan. Sebagian besar traffic bot jahat mungkin termasuk ini, jadi bagus kalau bisa langsung diblokir
Cara kerjanya dijelaskan rinci di https://github.com/FoxIO-LLC/ja4/blob/main/technical_details..., dan ada juga modul Nginx: https://github.com/FoxIO-LLC/ja4-nginx-module
Jika saat ini tidak benar-benar sedang diserang, jangan gunakan allowlist fingerprint TLS
Alat yang keren, tetapi seharusnya tidak penting apakah klien itu browser atau bukan. Rasanya pahit bahwa di dunia nyata alat seperti ini diperlukan
Saya menambahkan ekstensi user agent di Chrome, mengubahnya menjadi IE, lalu mencoba lagi dan berhasil; semua fungsi situsnya juga berjalan normal. Jadi rasanya pahit sekaligus menyebalkan. Mungkin instansi pemerintah itu membuat situs webnya 25 tahun lalu lalu tidak pernah memperbaruinya lagi
Gatekeeping semacam ini juga terasa pahit bagi saya. Sejauh yang saya pahami, browser atau user agent kustom buatan sendiri tidak akan pernah bekerja di situs-situs semacam Cloudflare sampai mereka punya cukup pengaruh, uang, jumlah pengguna, atau semacamnya untuk meyakinkan pihak tersebut
Alat ini cukup bagus dipakai dalam pekerjaan red team dengan menggabungkan skrip bash kecil dan GNU parallel
Berguna saat memetakan endpoint HTTPS dalam rentang alamat yang sudah ditentukan, yang karena berbagai alasan hanya merespons browser sungguhan atau baru merespons jika konfigurasi SNI cocok. Opsi curl biasa seperti
-Huntuk menyamarkan header juga tetap bisa dipakaiTulisan Show HN saat itu: https://news.ycombinator.com/item?id=30378562
Setiap kali hal seperti ini muncul di sini, perasaan saya selalu campur aduk. Di satu sisi, menyenangkan mengetahui masih ada sedikit jiwa pembangkangan dan kemandirian di antara orang-orang
Di sisi lain, seperti proyek-proyek lain yang diperlakukan seolah “kebebasan itu tidak stabil”, jika menarik perhatian yang tidak diinginkan, situasinya bisa menjadi lebih buruk bagi orang-orang yang bergantung padanya. Menulis browser itu sulit, dan para pemain dominan yang sudah ada terus membuatnya makin sulit
Saya tidak melihat ini sebagai soal jiwa pembangkangan. Software yang dapat diidentifikasi lewat fingerprint menggerogoti perlindungan privasi dan keberagaman software
Saya agak merindukan masa-masa sederhana ketika situs web mengizinkan bot jika mereka tidak keberatan, dan memblokir user agent jika mereka tidak suka
Kalau hanya tiga patch dan shell wrapper, Daniel mungkin tertarik untuk ikut coding. Secara pribadi, saya rasa ini memang harus masuk ke curl mainline