4 คะแนน โดย GN⁺ 2023-08-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • arpchat เป็นเครื่องมือที่นำ ARP ซึ่งคอมพิวเตอร์ใช้ค้นหา MAC address ของเครื่องอื่นในเครือข่ายเดียวกัน มาสร้างเป็นแอปแชต
  • โปรเจกต์นี้มีแรงบันดาลใจจากสถานการณ์ที่อยากแชตกับเพื่อน ๆ ในเครือข่ายที่มีการแยกไคลเอนต์
  • มีการพัฒนาโปรโตคอลขนส่งอเนกประสงค์แบบเรียบง่ายบน ARP ทำให้ส่งข้อความยาวได้หลายหมื่นตัวอักษร และยังใช้การบีบอัดเล็กน้อยด้วย
  • มีระบบ presence discovery และ heartbeat สำหรับอัปเดตรายชื่อผู้ใช้ออนไลน์ พร้อมการแจ้งเตือนเมื่อมีคนเข้าและออก
  • สามารถดาวน์โหลดไบนารีสำหรับติดตั้งได้จาก releases page
    • บน Windows อาจต้องใช้ npcap และระหว่างติดตั้งต้องเลือก Install Npcap in WinPcap API-compatible Mode
    • บน Linux อาจต้องให้สิทธิ์เครือข่ายด้วย sudo setcap CAP_NET_RAW+ep /path/to/arpchat
  • เรียกใช้ไบนารีจากเทอร์มินัล และหากข้อความที่ส่งแสดงบนหน้าจอของตัวเองก็ถือว่าทำงานได้ปกติ
  • การบิลด์ได้รับการทดสอบบน Rust รุ่น unstable ล่าสุด และการบิลด์บน Windows ต้องใช้ WinPcap Developer's Pack พร้อมตั้งค่า environment variable LIB ให้ชี้ไปที่โฟลเดอร์ WpdPack/Lib/x64/

1 ความคิดเห็น

 
GN⁺ 2023-08-11
ความคิดเห็นจาก Hacker News
  • ผมเป็นคนทำสิ่งนี้เอง วันนี้ผมทำอีกอย่างที่เอาไปลง HN ด้วย(https://news.ycombinator.com/item?id=37062422) พอเห็นว่า ArpChat ก็ถูกเอาขึ้นมาด้วยเหมือนกันเลยค่อนข้างทึ่ง น่าจะมีใครไปดูโปรไฟล์ของผม
    เป็นโปรเจกต์ที่สนุกมากจริง ๆ และได้เรียนรู้เรื่อง networking เยอะมาก
    ไม่นานมานี้มีโอกาสได้ลองใช้จริงในสภาพแวดล้อมที่ออฟไลน์สนิทด้วย ก็สนุกดี แต่หลังจากนั้นพบ bug ใหญ่ ซึ่ง bug นี้ทำให้เกิด latency มหาศาล แก้แล้วแต่ยังไม่ได้อัปโหลด build artifact ใหม่ ดังนั้นถ้าคิดจะทดสอบในสภาพแวดล้อมจริง แนะนำให้ build จาก source เองจะดีกว่า ผมยังเพิ่มสีชื่อผู้ใช้กับเวลาในข้อความเพื่อความสนุกด้วย สัญญาว่าจะปล่อย release ใหม่เร็ว ๆ นี้
    ถ้าสนใจ ผมมีบทความที่เขียนไว้เมื่อประมาณ 1 ปีก่อนเกี่ยวกับวิธีทำงานของ ArpChat ด้วย: https://kognise.dev/writing/arp

    • อ่านไปเรื่อย ๆ แล้วก็ยิ้มไม่หยุด ArpChat น่าจะทำให้ผู้ดูแลเครือข่ายหัวใจวายได้ง่าย ๆ แต่ไอเดียเองนั้นเจ๋งมาก ผมก็เป็นพวกที่อ่านหนังสือเรื่อง OSI layers เล่น ๆ เหมือนกัน เลยเข้าใจความรู้สึก
      ขอให้เล่นกับโค้ดต่อไปนะ มันคล้าย ๆ กับสิ่งที่ justine tunney แสดงไว้ในงานอย่าง https://justine.lol/ape.html อยู่บ้าง คือการขุดลึกเข้าไปในพื้นที่ที่มีคนส่วนน้อยเท่านั้นที่เข้าใจจริง ๆ เช่นรายละเอียดของรูปแบบ binary ของ compiler แล้วตั้งคำถามบ้า ๆ อย่าง “เราผูกรูปแบบ binary ทั้งหมดเข้าเป็น meta-format เดียว แล้วทำให้มันรันได้จริงบนทั้งหมดไม่ได้หรือ?” จากนั้นก็สร้างสิ่งที่ใช้งานได้จริงออกมา
    • banner ด้านล่างของ README ตลกและสวยจริง ๆ งานเจ๋งมาก
    • คาดว่าจะทำงานบน Linux ด้วยไหม?
      # sudo getcap ./arpchat
      ./arpchat cap_net_raw=ep
      ได้ข้อความ “error getting channel, might be missing permissions”
      เพิ่มเติม: error นี้มาจาก arpchat ไม่ใช่การตั้งค่า setcap
  • นี่แหละสิ่งที่ต้องการเลย เล่นกับ data link layer งั้นเหรอ
    สำหรับคนที่ไม่รู้ว่า Address Resolution Protocol (ARP) คืออะไร ถ้าพูดแบบคร่าวมาก ๆ มันคือ missing link ที่เชื่อม MAC address (สิ่งที่ Ethernet ใช้) กับ IP address (สิ่งที่อินเทอร์เน็ตใช้) เมื่อ IP routing table ที่ดูได้ด้วย route ตัดสินใจว่า packet ควรถูกส่งต่อไปยัง IP address ใด ARP cache ที่ดูได้ด้วย arp ก็จะตัดสินว่า MAC address ที่สอดคล้องกับ IP นั้นคืออะไร โดยปกติจะเป็น local IP address ของ router
    ทุกวันนี้ แค่รู้ว่า ARP มีอยู่ก็ถูกมองว่าเป็นความรู้ลี้ลับแบบไม่ค่อยเฉพาะทางไปบ้างแล้ว และพี่น้องฝั่ง IPv6 อย่าง Neighbor Discovery Protocol ก็ยิ่งกว่านั้นอีก แม้ในการ deploy สมัยใหม่บน cloud จะไม่ค่อยต้องไปจับโดยตรงบ่อยนัก แต่การรู้ว่ามันมีอยู่จะทำให้มุมมองแบบภาพรวมของ network stack ครบถ้วนขึ้นมาก

    • ผมไม่ค่อยเห็นด้วยว่า ARP เป็นความรู้ลึกลับ สำหรับคนทำ networking การเข้าใจหรืออย่างน้อยรู้จัก ARP ยังแทบจะเป็นสิ่งจำเป็นอยู่ arping มีประโยชน์มากเวลาตรวจสอบว่าอุปกรณ์ใน segment เครือข่ายเดียวกันเปิดอยู่แต่ไม่ตอบสนองต่อ ICMP ping หรือไม่
      ถ้าดู dump จาก tcpdump หรือ Wireshark ไม่นานก็ต้องเจอมันแน่นอน เพียงแต่สำหรับ software engineer แล้ว cloud กับ network แบบดั้งเดิมต่างกันมาก จึงอาจได้เจอมันตอน debug เครือข่ายที่บ้านก่อนมากกว่าใน application
    • ทุกวันนี้น่าจะเป็น 802.11 มากกว่า ถึงอย่างนั้น เมื่อ host ต้องได้ IP ก็อาจใช้ ARP ได้ใน data link layer protocol ใด ๆ: https://en.wikipedia.org/wiki/Data_link_layer
    • ถ้า ARP กำลังกลายเป็นเรื่องไม่คุ้นเคยจริง ๆ ก็น่าเสียดายมาก ยากจะจินตนาการว่าคนที่บอกว่าเข้าใจว่า IP network ทำงานอย่างไร จะไม่มีความคุ้นเคยขั้นต่ำกับ ARP เลย
    • คุณยัง hardcode ARP entry ของคอมพิวเตอร์เครื่องอื่นในเครือข่ายที่มี static IP address ได้ด้วย
  • การนำข้อเท็จจริงที่ว่า ARP ใส่ arbitrary payload ได้มาใช้ในทางที่ผิดนั้นสนุกดี แต่ถ้าพูดใหม่จากมุมมองพื้นฐาน networking สิ่งสำคัญที่ผู้เขียนพึ่งพาคือข้อเท็จจริงง่าย ๆ ว่า switch จะ flood packet ที่มุ่งไปยัง ff:ff:ff:ff:ff:ff ไปทั่ว broadcast domain
    แม้ไม่มีสิทธิ์ superuser หรือสิทธิ์ raw packet ถ้าส่ง packet ไปยัง L3 broadcast address โดยปกติมันก็จะถูก flood ที่ L2 ดังนั้นจึงสร้างการกระจายข้อความคล้าย ๆ กันได้ กล่าวคือการ ping ไปยัง broadcast address นั้นสนุก
    การใช้ ARP ไม่มีข้อได้เปรียบพิเศษ อีกทั้ง switch รุ่นใหม่จำนวนมากมีฟีเจอร์เฝ้าดู ARP packet ดังนั้นถ้าปล่อย traffic ARP ปลอมจำนวนมาก อาจมีผลเสียจริงได้ ถึงอย่างนั้นก็เป็นงานที่สนุก และทำให้นึกถึงของเล่นที่ผมทำสมัยเรียน ส่วนตัวแล้วผมคงจะนำ ICMP มาใช้ในทางที่ผิดเพื่อจุดประสงค์นี้ และอาจเป็นทิศทางพัฒนาต่อไปก็ได้ ขอปรบมือให้โปรเจกต์สนุก ๆ นี้

    • ยังใช้หลักการพื้นฐานด้าน networking ที่สำคัญอีกอย่างด้วย: สุดท้ายแล้ว ทุกอย่างคือเลข
      ARP, DNS, HTTP, TLS ในด้านหนึ่งก็คือ protocol เหล่านั้นตามที่เรานึกถึง แต่ในขณะเดียวกันทั้งหมดก็เป็นแค่ตัวเลข ARP ก็เข้าถึงพื้นที่ตัวเลขแบบเดียวกับ HTTP ไม่ใช่ว่า UDP เท่านั้นที่ใช้ byte 11-bit และก็ไม่มีคำสั่ง CPU พิเศษที่ใช้ได้เฉพาะ DNS สุดท้ายแล้วทุกอย่างคือเลข ท้ายที่สุดคุณสามารถดันตัวเลขที่ต้องการเข้าไปในสายได้ และโลกที่เหลือก็รับตัวเลขนั้นไปแล้วทำสิ่งที่แต่ละฝ่ายทำอยู่เท่านั้น
    • หนึ่งในการโจมตี DDoS แบบ amplification ที่ผมเห็นครั้งแรก ๆ เกิดขึ้นในยุค 1990 โดย spoof address ของ host เหยื่อให้เป็น source แล้วส่ง ping ไปยัง broadcast address ของเครือข่ายมหาวิทยาลัยที่ไร้เดียงสา
      ทุกวันนี้มันไม่ควรจะทำงานแล้ว แต่ในตอนนั้น TCP/IP implementation ที่ไร้เดียงสา หรือพูดอีกอย่างคือส่วนใหญ่ เต็มใจเข้าร่วมอย่างยิ่ง
    • หมายถึง https://hpbn.co/ ใช่ไหม?
  • ชอบเอาโปรโตคอลที่ติดมากับระบบปฏิบัติการส่วนใหญ่มาใช้ในทางที่ผิด เคยหา GUI/CLI messaging system แบบข้ามแพลตฟอร์มที่ไม่ต้องติดตั้งซอฟต์แวร์ไคลเอนต์เพิ่มไม่ได้ เลยเคยทำ Samba share ปลอม ๆ แบบงี่เง่าเพื่อให้ดูข้อความได้จาก Finder.app/Explorer.exe/Gnome/KDE
    ในเครือข่ายโลคัล แม้แต่การเรียก netcat ก็ยังไม่ค่อยได้ผล และถ้าจะ broadcast ก็มีความต่างของ flag ตามแต่ละระบบปฏิบัติการ วิธีคือดูข้อความใน Samba share จาก file browser แล้วคลิก จากนั้นแก้ชื่อไฟล์เพื่ออัปเดต “กระดานประกาศ” 3 บรรทัด
    https://github.com/jedahan/samba-haiku/blob/master/index.js
    อันนี้เดิมทีก็เป็นการทำใหม่จากสิ่งที่เคยใช้ Wi-Fi SSID เพื่อทำ captive portal haiku
    https://github.com/jedahan/haiku-wifi

  • อาจสนุกกว่าที่คิด เคยแยกเครือข่ายด้วย VLAN บนฮาร์ดแวร์ของ vendor รายใหญ่ แล้วพบว่าในกรณีส่วนใหญ่ VLAN ทำงานอยู่ แต่ทราฟฟิก ARP กลับรั่วออกมา
    เครื่องต่าง ๆ ควรต้องส่งทราฟฟิกทั้งหมดผ่านเราเตอร์ แต่บางครั้งพอเห็น ARP response ที่ไม่ควรเห็น ก็สรุปว่าเข้าถึงเครื่องอื่นได้โดยตรง ผลคือส่งทราฟฟิกไม่ได้จนกว่า entry ใน ARP cache จะหมดอายุ ปวดหัวมาก vendor ใหญ่เกินกว่าจะสนใจ และก็ไม่แสดงความสนใจจะแก้บั๊กด้วย
    ในบางสถานการณ์ แอปแชตนี้อาจทะลุ VLAN ได้

    • น่าสนใจด้วยเหตุผลเดียวกัน ถ้าส่งและรับ ARP message ที่มี payload ใด ๆ ได้ การแก้ปัญหา VLAN หรือการตรวจสอบการเชื่อมต่อ L2 แบบอื่น ๆ น่าจะง่ายขึ้นแน่นอน
    • จากที่ผมทดสอบมา มันทะลุอะไรได้ค่อนข้างเยอะ
  • ภรรยา ลูก ๆ และผม ส่วนใหญ่ทำงานหรือเรียนจากบ้าน จึงมักอยู่กันคนละห้อง พออยากส่งข้อความหากันเวลาจำเป็นก็ใช้ BeeBEEP ตัวตัดสินใจคือไม่ต้องมีเซิร์ฟเวอร์ และมีทั้งไคลเอนต์ Linux กับ Windows
    มันทำงานได้ค่อนข้างดี แต่บางครั้งหลังแล็ปท็อปตื่นจากโหมดประหยัดพลังงาน ต้องรีสตาร์ตถึงจะเห็นคนอื่น ๆ ใน LAN อีกครั้ง และข้อบ่นแทบจะอย่างเดียวคือเปิดหน้าต่างแชตถึงคนที่ต้องการโดยตรงจากไอคอนใน tray ไม่ได้ จะคัดลอกแปะรูปแมวตลก ๆ ก็ได้ และยังมีฟีเจอร์อย่างการส่งไฟล์ที่ผมไม่ได้ใช้ด้วย ไม่ใช่โฆษณาแบบรับเงิน แค่พูดยาวไปเอง
    https://www.beebeep.net/

    • ผมมองว่าความสวยงามของโปรเจกต์นี้ไม่ได้อยู่ที่ messaging เอง แต่อยู่ที่การใช้โปรโตคอลเครือข่ายระดับต่ำในทางที่ผิดเพื่อเด้งออกนอกกรอบอย่าง client isolation
  • ตอนมัธยมเคยทำแบบนี้ด้วย net send แล้วโดนดุ

    • ผมหาทริกนั้นเจอแล้วเอาไปโชว์เพื่อนสองสามคน แต่ความลับอยู่ได้ไม่นาน ไม่นานกลุ่มคนที่ใหญ่กว่านั้น ซึ่งไม่ใช่เพื่อนผมด้วยซ้ำ ก็เอาไปใช้โกงในคาบห้องคอมพิวเตอร์ การโกงแบบโจ่งแจ้งก็น่ารำคาญอยู่แล้ว และยังรู้สึกหงุดหงิดนิดหน่อยที่คนที่ผมไม่ได้ชอบเป็นพิเศษได้ประโยชน์จากสิ่งที่ผมค้นพบ
      เลย spoof ชื่อผู้ใช้ของผู้ดูแลระบบ (บน Win9x ไม่ได้ยากนัก) แล้วส่งข้อความเตือนเข้ม ๆ ไป ดูจากที่จู่ ๆ ข้อความทั้งหมดหยุดลง คงตกใจกันไม่น้อย
    • write ฝากทักทายมา
      https://en.wikipedia.org/wiki/Write_(Unix)
    • จำได้ว่า net send ต้องเชื่อมต่อกับโดเมนอยู่ ดังนั้นคงไม่ได้ใช้ ARP
    • ถ้า network analyzer ผิดพลาดหรือไม่สนใจแพ็กเก็ต ARP แปลก ๆ ARP messaging ก็น่าจะตรวจจับได้ยาก
    • เคยมีช่วงเวลาแบบนั้น ตอนมหาวิทยาลัย เราเผลอ—ไม่สิ ตั้งใจ—ส่งข้อความไปทั้งโดเมน แล้วครู IT ก็หันมามองพวกตัวปัญหาอย่างเราทันที
  • เจ๋งมาก แต่ TCP/IP ไม่ได้ทำตาม OSI model ดังนั้นจึงเอาการแบ่งแยกละเอียด ๆ ของ OSI มาใช้ตรง ๆ ได้ยาก
    ในทางปฏิบัติ ARP น่าจะนิยามได้ว่าเป็น เลเยอร์ 2.5 ตาม TCP/IP model ของ Stevens ดังนั้นการเรียกมันว่า 2.5 ดูสมเหตุสมผลที่สุด และ ARP frame ไม่ถูก route อยู่แล้ว จึงชัดเจนว่าไม่ใช่ L3

  • ในยุคที่ IPv4 NAT แทบเป็นมาตรฐานโดยพฤตินัย ซึ่งตอนนี้ก็ยังใช่อยู่ แต่ต่างจากยุคปัจจุบันที่มีทั้ง IPv6 และ CGNAT ด้วย ผมเคยทำสิ่งที่ชื่อว่า NATChat
    โดยพื้นฐานคือสร้างห้องแชตตาม public IPv4 address เพื่อให้แชตกับใครก็ได้ในเครือข่ายเดียวกัน ใช้กับคนอื่น ๆ ในออฟฟิศได้ค่อนข้างดี ออฟฟิศนี่ก็เป็นสิ่งที่มีอยู่จริงในสมัยนั้นด้วย

  • มีของคล้ายกันที่เขียนด้วย C++ ด้วย: https://github.com/gbonacini/arpchatcpp