3 คะแนน โดย GN⁺ 2025-04-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

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 ความคิดเห็น

 
GN⁺ 2025-04-04
ความคิดเห็นจาก Hacker News
  • ขอชื่นชมโค้ดเดอร์และผู้เผยแพร่ กำลังมีส่วนร่วมกับโปรเจ็กต์เบราว์เซอร์ที่ใช้ OpenSSL และเคยคิดว่าคงต้องวิเคราะห์เองผ่าน WireShark ตอนนี้มีข้อมูลให้อ้างอิงมากมายแล้ว หากการใช้งาน OpenSSL ที่พบบ่อยที่สุดคือ Python ตัวเลือก spoofing TLS ของ Firefox ก็เป็นสิ่งจำเป็นในยุค Cloudflare

    • มีฟอร์กของโปรเจ็กต์นี้ที่พัฒนาต่อยอดจากต้นฉบับและมีการดูแลอย่างแข็งขัน: curl-impersonate
    • ยังมี Python binding ของฟอร์กนี้สำหรับคนที่ใช้ Python: curl_cffi
  • หวังว่าในอนาคต 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 อยู่ :)

  • คิดถึงยุคเรียบง่ายที่เว็บไซต์แค่ยอมให้บอตเข้าได้หรือบล็อกมันเท่านั้น