Curl-impersonate: บิลด์พิเศษของ curl ที่สามารถปลอมตัวเป็นเบราว์เซอร์หลักได้
(github.com/lwthiker)curl-impersonate
บิลด์พิเศษของ curl ที่สามารถปลอมตัวเป็นเบราว์เซอร์บางตัวได้ โดยสามารถปลอมตัวเป็น Chrome, Edge, Safari และ Firefox ได้ curl-impersonate สามารถทำ TLS และ HTTP handshake ได้เหมือนกับเบราว์เซอร์จริงทุกประการ ใช้เป็นเครื่องมือบรรทัดคำสั่งหรือผนวกรวมเป็นไลบรารีก็ได้
ทำไมจึงจำเป็น?
- เมื่อ HTTP client สื่อสารกับเว็บไซต์ที่ใช้ TLS ขั้นตอนแรกคือการทำ TLS handshake โดยข้อความแรกในกระบวนการนี้เรียกว่า Client Hello
- ข้อความ Client Hello ที่สร้างโดย HTTP client และไลบรารีส่วนใหญ่แตกต่างจากของเบราว์เซอร์จริงอย่างมาก
- หากเซิร์ฟเวอร์ใช้ HTTP/2 นอกจาก TLS handshake แล้ว ยังต้องมี HTTP/2 handshake ด้วย และค่าการตั้งค่าที่แลกเปลี่ยนกันในขั้นตอนนี้ก็แตกต่างจากของเบราว์เซอร์จริง
- ด้วยเหตุนี้ บริการเว็บบางแห่งจึงระบุตัวตนของ client ผ่าน TLS และ HTTP handshake และส่งมอบคอนเทนต์ที่แตกต่างกันให้กับ client ประเภทอื่น
- วิธีนี้เป็นที่รู้จักกันในชื่อ TLS fingerprinting และ HTTP/2 fingerprinting ซึ่งทำให้เว็บเปิดกว้างน้อยลง เป็นส่วนตัวน้อยลง และมีข้อจำกัดต่อเว็บ client บางประเภทมากขึ้น
curlที่ถูกแก้ไขในที่เก็บนี้ทำให้ TLS และ HTTP handshake ดู เหมือนกับ ของเบราว์เซอร์จริงทุกประการ
ทำงานอย่างไร?
- มีการปรับแก้
curlอย่างมากเพื่อให้ดูเหมือนเบราว์เซอร์ - คอมไพล์
curlด้วย nss ซึ่งเป็นไลบรารี TLS ที่ Firefox ใช้ และเวอร์ชัน Chrome จะคอมไพล์ด้วย BoringSSL ซึ่งเป็นไลบรารี TLS ของ Google - ปรับวิธีกำหนดค่า TLS extension และตัวเลือก SSL หลายรายการ
- เพิ่มการรองรับ TLS extension ใหม่
- เปลี่ยนการตั้งค่าของ
curlสำหรับการเชื่อมต่อ HTTP/2 - รัน
curlด้วยแฟล็กที่ไม่ใช่ค่าเริ่มต้น เช่น--ciphers,--curvesและเฮดเดอร์-Hบางรายการ
เบราว์เซอร์ที่รองรับ
- สามารถปลอมตัวเป็น Chrome, Edge, Firefox และ Safari ได้หลายเวอร์ชัน
- มี wrapper script สำหรับแต่ละเบราว์เซอร์เพื่อใช้รัน
curl-impersonate
การใช้งานพื้นฐาน
- สำหรับแต่ละเบราว์เซอร์ที่รองรับ จะมี wrapper script สำหรับรัน
curl-impersonateพร้อมเฮดเดอร์และแฟล็กที่จำเป็น - ตัวอย่าง:
curl_chrome116 https://www.wikipedia.org
เอกสาร
- เอกสารเพิ่มเติมอยู่ในไดเรกทอรี docs/
การติดตั้ง
curl-impersonateมีอยู่สองเวอร์ชันด้วยเหตุผลทางเทคนิค คือเวอร์ชัน chrome สำหรับปลอมตัวเป็น Chrome, Edge และ Safari และเวอร์ชัน firefox สำหรับปลอมตัวเป็น Firefox- มีไบนารีที่คอมไพล์ไว้ล่วงหน้าสำหรับ Linux และ macOS ให้ในหน้า GitHub Releases
การใช้งานขั้นสูง
libcurl-impersonate
libcurl-impersonate.soคือ libcurl ที่คอมไพล์ด้วยการปรับแก้แบบเดียวกับcurl-impersonateเวอร์ชันบรรทัดคำสั่ง- มีฟังก์ชัน API เพิ่มเติมชื่อ
curl_easy_impersonate
การใช้ตัวแปรสภาพแวดล้อม CURL_IMPERSONATE
- ในแอปพลิเคชันที่ใช้
libcurlอยู่แล้ว สามารถใช้LD_PRELOADเพื่อแทนที่ไลบรารีเดิมขณะรันไทม์ได้ - สามารถตั้งค่าตัวแปรสภาพแวดล้อม
CURL_IMPERSONATEเพื่อให้ตั้งค่าตัวเลือกทั้งหมดโดยอัตโนมัติได้
การมีส่วนร่วม
- สามารถตรวจสอบ issue ที่เปิดอยู่และมีส่วนร่วมได้โดยเปิด pull request ที่รวมการเปลี่ยนแปลงของคุณ
ผู้สนับสนุน
- มีผู้สนับสนุนที่ช่วยให้โปรเจกต์นี้ถูกเปิดเผยและดูแลต่อเนื่อง หากต้องการเป็นผู้สนับสนุน สามารถติดต่อโดยตรงได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ขอชื่นชมโค้ดเดอร์และผู้เผยแพร่ กำลังมีส่วนร่วมกับโปรเจ็กต์เบราว์เซอร์ที่ใช้ OpenSSL และเคยคิดว่าคงต้องวิเคราะห์เองผ่าน WireShark ตอนนี้มีข้อมูลให้อ้างอิงมากมายแล้ว หากการใช้งาน OpenSSL ที่พบบ่อยที่สุดคือ Python ตัวเลือก spoofing TLS ของ Firefox ก็เป็นสิ่งจำเป็นในยุค Cloudflare
หวังว่าในอนาคต Ladybird จะได้รับความสนใจ ปัจจุบันใช้ cURL สำหรับระบบเครือข่ายอยู่ cURL อาจยังมีข้อจำกัดบางอย่าง (เช่น ไม่สามารถจัดการ WebSockets บน h2 ได้) แต่เมื่อมีเอนจินเบราว์เซอร์ใหม่เกิดขึ้น ทราฟฟิกที่ถูกต้องตามปกติก็อาจมีลายนิ้วมือแบบเดียวกับ cURL มาตรฐานได้
สงสัยว่าได้ตั้งค่า IP_TTL ให้สอดคล้องกับแพลตฟอร์มหรือไม่ ถ้ายังไม่ได้ตั้ง ก็อาจทิ้งลายนิ้วมือไว้ในชั้น IP ได้ในระดับหนึ่ง หากค่า TTL ในชั้น IP ต่ำกว่า 64 นั่นบ่งชี้ว่าไม่ได้รันบน Windows รุ่นใหม่ หรือกำลังรันบนอุปกรณ์ Windows รุ่นใหม่ที่มีการเปลี่ยนค่า TTL เริ่มต้น แพ็กเก็ต TTL ของ Windows รุ่นใหม่เริ่มต้นที่ 128 โดยปริยาย ขณะที่แพลตฟอร์มอื่นส่วนใหญ่เริ่มที่ 64 แพลตฟอร์มอื่นไม่มีปัญหากับการสื่อสารผ่านอินเทอร์เน็ต ดังนั้นแพ็กเก็ต IP จาก Windows รุ่นใหม่จึงมักถูกมองเห็นจากระยะไกลด้วยค่า TTL ตั้งแต่ 64 ขึ้นไปเสมอ
ถ้า TLS handshake มีลักษณะแตกต่างกัน สงสัยว่าจะทำตัวกรองในระดับ nginx ที่คัดกรองทราฟฟิกที่อ้างว่าเป็นเว็บเบราว์เซอร์ได้หรือไม่ (เช่น Chrome user agent) เพราะนี่เป็นสัดส่วนใหญ่ของทราฟฟิกบอตที่เป็นอันตราย และอยากบล็อกมัน
มักรู้สึกสองจิตสองใจกับการที่เรื่องแบบนี้มาโผล่ที่นี่เสมอ ด้านหนึ่งก็ดีที่ทำให้คนรู้ว่าความเป็นอิสระและจิตวิญญาณขบถยังคงอยู่ แต่อีกด้านหนึ่ง หากมันดึงความสนใจที่ไม่พึงประสงค์แบบโปรเจ็กต์ "Freedom is unstable" ก็อาจทำให้แย่ลงสำหรับคนที่พึ่งพามันอยู่ การเขียนเบราว์เซอร์เป็นเรื่องยาก และผู้เล่นรายเดิมก็ยังทำให้มันยากขึ้นเรื่อย ๆ
เครื่องมือนี้มีประโยชน์มากเมื่อใช้ร่วมกับ bash script เล็ก ๆ และ gnu parallel เพื่อแมป HTTPS endpoint ในงาน red team ใช้มันกับแอดเดรสในขอบเขตที่ตอบสนองเฉพาะเบราว์เซอร์ที่เหมาะสมเท่านั้น และยังใช้สวิตช์ curl ทั่วไปอย่าง
-Hสำหรับ spoofing header ได้ด้วยตอน Show HN ลิงก์
ตอนนี้กำลังรอเวอร์ชัน MCP อยู่ :)
คิดถึงยุคเรียบง่ายที่เว็บไซต์แค่ยอมให้บอตเข้าได้หรือบล็อกมันเท่านั้น