4 điểm bởi GN⁺ 2023-08-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • arpchat là một công cụ được tạo thành ứng dụng chat bằng cách sử dụng ARP, vốn được máy tính dùng để tìm địa chỉ MAC của các máy tính khác trong cùng một mạng
  • Đây là một dự án được khởi xướng từ nhu cầu muốn trò chuyện với bạn bè trong mạng có bật cô lập máy khách
  • Nó triển khai một giao thức truyền tải đa dụng đơn giản trên nền ARP để có thể gửi các tin nhắn dài tới hàng chục nghìn ký tự, đồng thời cũng dùng một chút nén
  • Có hệ thống presence discovery và heartbeat để cập nhật danh sách người dùng đang trực tuyến, kèm thông báo khi tham gia và rời đi
  • Có thể tải binary cài đặt từ releases page
    • Trên Windows, có thể cần npcap, và khi cài đặt cần chọn Install Npcap in WinPcap API-compatible Mode
    • Trên Linux, có thể cần cấp quyền mạng bằng sudo setcap CAP_NET_RAW+ep /path/to/arpchat
  • Chạy binary trong terminal; nếu tin nhắn đã gửi xuất hiện trên chính màn hình của mình thì có thể xem là đang hoạt động bình thường
  • Việc build đã được thử nghiệm trên Rust unstable mới nhất, và bản build cho Windows cần WinPcap Developer's Pack cùng bước đặt biến môi trường LIB trỏ tới thư mục WpdPack/Lib/x64/

1 bình luận

 
GN⁺ 2023-08-11
Ý kiến trên Hacker News
  • Tôi là người tạo ra cái này. Hôm nay tôi cũng làm một thứ khác được đăng lên HN (https://news.ycombinator.com/item?id=37062422), nên thấy ArpChat cũng được đưa lên cùng lúc thì khá thú vị. Có lẽ ai đó đã xem hồ sơ của tôi
    Đây thật sự là một dự án rất vui, và tôi đã học được rất nhiều về networking
    Cách đây không lâu tôi cũng có dịp dùng thử nó trong một môi trường hoàn toàn offline, khá vui. Tuy nhiên sau đó tôi phát hiện một lỗi lớn, lỗi này đang gây độ trễ khủng khiếp. Tôi đã sửa rồi nhưng vẫn chưa kịp tải bản build mới lên, nên nếu định thử trong môi trường thực tế thì tốt hơn là tự build từ source. Nhân tiện cho vui tôi cũng thêm màu cho tên người dùng và thời gian tin nhắn. Tôi hứa sẽ sớm đăng bản phát hành mới
    Nếu quan tâm, tôi cũng có một bài viết khoảng 1 năm trước về cách ArpChat hoạt động: https://kognise.dev/writing/arp

    • Tôi cứ vừa đọc vừa cười suốt. ArpChat rất có thể sẽ khiến quản trị viên mạng lên cơn đau tim, nhưng ý tưởng thì thật sự tuyệt. Tôi cũng thuộc kiểu người từng đọc sách về mô hình OSI cho vui nên rất đồng cảm
      Mong bạn tiếp tục nghịch code. Nó cũng hơi giống những gì justine tunney thể hiện trong các tác phẩm như https://justine.lol/ape.html: đào sâu vào một lĩnh vực chỉ một số ít người thật sự hiểu, chẳng hạn các chi tiết của định dạng binary compiler, rồi đặt những câu hỏi điên rồ kiểu “liệu có thể buộc mọi định dạng binary vào một meta-format duy nhất để nó thật sự chạy được trên tất cả không?”, và rồi tạo ra thứ thật sự hoạt động
    • Banner ở cuối README thật sự vừa buồn cười vừa đẹp. Làm rất hay
    • Bạn có kỳ vọng nó chạy được trên Linux không?
      # sudo getcap ./arpchat
      ./arpchat cap_net_raw=ep
      Tôi nhận được “error getting channel, might be missing permissions”
      Bổ sung: lỗi này đến từ arpchat, không phải từ cấu hình setcap
  • Đây đúng là thứ tôi muốn. Nghịch ở tầng liên kết dữ liệu cơ đấy
    Với những ai không biết Address Resolution Protocol (ARP) là gì, nói rất đại khái thì nó là mắt xích còn thiếu nối địa chỉ MAC (thứ Ethernet dùng) với địa chỉ IP (thứ Internet dùng). Khi bảng định tuyến IP mà bạn có thể xem bằng route quyết định gói tin sẽ được gửi tiếp tới địa chỉ IP nào, thì ARP cache mà bạn có thể xem bằng arp sẽ quyết định địa chỉ MAC tương ứng với IP đó. Thông thường đó là địa chỉ IP cục bộ của router
    Ngày nay, chỉ cần biết ARP tồn tại thôi cũng đã hơi giống một thứ kiến thức bí truyền không chuyên, còn người anh em phía IPv6 của nó là Neighbor Discovery Protocol thì còn hơn thế. Trong các triển khai hiện đại dựa trên cloud, dù bạn không thường trực tiếp đụng tới nó, việc biết nó tồn tại sẽ giúp bạn có cái nhìn bao quát về toàn bộ network stack hoàn chỉnh hơn nhiều

    • Tôi khó đồng ý rằng ARP là kiến thức khó hiểu/bí truyền. Với người làm networking, hiểu hoặc ít nhất biết về ARP vẫn gần như là điều bắt buộc. arping rất hữu ích khi muốn kiểm tra một thiết bị trong cùng đoạn mạng có đang bật nhưng không phản hồi ICMP ping hay không
      Nếu xem dump từ tcpdump hoặc Wireshark thì sớm muộn gì bạn cũng chắc chắn gặp nó. Dù vậy, với kỹ sư phần mềm, vì cloud và mạng truyền thống khác nhau khá nhiều, họ có thể gặp nó trước khi debug mạng gia đình hơn là ứng dụng
    • Ngày nay có lẽ 802.11 còn phổ biến hơn. Dù vậy, khi host cần lấy IP, ARP vẫn có thể được dùng trên bất kỳ giao thức tầng liên kết dữ liệu nào: https://en.wikipedia.org/wiki/Data_link_layer
    • Nếu ARP thật sự đang trở nên xa lạ thì đáng tiếc. Thật khó tưởng tượng có thể nói là hiểu cách mạng IP hoạt động mà lại không có chút quen thuộc tối thiểu nào với ARP
    • Cũng có thể hardcode mục ARP của một máy tính khác trong mạng có địa chỉ IP tĩnh
  • Việc lạm dụng chuyện ARP có thể chứa payload tùy ý thì thú vị, nhưng nói lại từ góc nhìn nhập môn networking, điểm cốt lõi mà tác giả dựa vào chỉ là sự thật đơn giản rằng switch sẽ flood các gói hướng tới ff:ff:ff:ff:ff:ff ra toàn bộ broadcast domain
    Ngay cả khi không có quyền superuser hay quyền raw packet, nếu gửi gói tin tới địa chỉ broadcast L3 thì thường nó cũng sẽ bị flood ở L2, nên có thể tạo ra cách lan truyền tin nhắn tương tự. Nói cách khác, ping vào địa chỉ broadcast là một trò vui
    Không có lợi thế đặc biệt nào khi dùng ARP. Ngoài ra, nhiều switch hiện đại có tính năng giám sát gói ARP, nên nếu đẩy một lượng lớn lưu lượng ARP giả thì thật sự có thể gây tác động xấu. Dù vậy đây vẫn là một việc thú vị, gợi tôi nhớ những trò nghịch tôi từng làm hồi đang học. Cá nhân tôi có lẽ sẽ lạm dụng ICMP cho mục đích này, và đó cũng có thể là hướng phát triển trong tương lai. Xin vỗ tay cho một dự án thú vị

    • Nó cũng đang dùng một nguyên tắc nhập môn networking quan trọng khác: rốt cuộc tất cả đều là các con số
      ARP, DNS, HTTP, TLS một mặt đúng là những giao thức mà chúng ta nghĩ tới, nhưng đồng thời tất cả cũng chỉ là các con số. ARP truy cập vào cùng không gian số như HTTP. Không phải chỉ UDP mới dùng byte 11 bit, cũng không có lệnh CPU đặc biệt nào chỉ DNS mới dùng được. Cuối cùng tất cả đều là số. Sau cùng, bạn có thể đẩy những con số mình muốn lên đường truyền, và phần còn lại của thế giới sẽ nhận những con số đó rồi tiếp tục làm việc của nó
    • Một trong những cuộc tấn công DDoS khuếch đại đầu tiên tôi thấy là vào thập niên 1990: giả mạo địa chỉ host nạn nhân làm nguồn, rồi gửi ping tới địa chỉ broadcast của một mạng campus ngây thơ
      Ngày nay nó không nên còn hoạt động, nhưng hồi đó các triển khai TCP/IP ngây thơ, nói cách khác là rất nhiều trong số chúng, sẵn sàng tham gia
    • Ý bạn là https://hpbn.co/ à?
  • Tôi thích lạm dụng các giao thức được tích hợp sẵn trong hầu hết hệ điều hành. Vì không tìm được hệ thống nhắn tin GUI/CLI đa nền tảng không cần cài phần mềm client riêng, tôi từng tạo một chia sẻ Samba giả ngớ ngẩn để có thể xem tin nhắn trong Finder.app/Explorer.exe/Gnome/KDE
    Trên mạng cục bộ, gọi netcat cũng không ổn lắm, còn nếu muốn broadcast thì mỗi hệ điều hành lại có khác biệt về flag. Cách làm là xem tin nhắn trên chia sẻ Samba trong trình duyệt tệp, nhấp vào đó rồi sửa tên tệp để cập nhật một “bảng tin” 3 dòng
    https://github.com/jedahan/samba-haiku/blob/master/index.js
    Cái này vốn cũng là bản triển khai lại từ một thứ dùng Wi-Fi SSID để tạo haiku captive portal
    https://github.com/jedahan/haiku-wifi

  • Có thể thú vị hơn dự đoán. Tôi từng dùng VLAN với phần cứng của các nhà cung cấp lớn để tách mạng, và phát hiện rằng trong hầu hết trường hợp VLAN vẫn hoạt động nhưng lưu lượng ARP lại bị rò rỉ
    Các máy lẽ ra phải gửi mọi lưu lượng qua router, nhưng đôi khi chúng thấy các phản hồi ARP mà đáng ra không được thấy và kết luận rằng có thể đến trực tiếp máy khác. Kết quả là khá đau đầu vì không thể gửi lưu lượng cho đến khi mục ARP cache hết hạn. Nhà cung cấp quá lớn nên không quan tâm, và cũng không tỏ ra hứng thú sửa lỗi
    Trong một số tình huống nhất định, ứng dụng chat này có thể xuyên qua VLAN

    • Cũng thú vị vì lý do đó. Nếu có thể gửi và nhận thông điệp ARP chứa payload tùy ý, việc khắc phục sự cố VLAN hoặc kiểm tra kết nối L2 khác chắc chắn sẽ dễ hơn
    • Theo những gì tôi đã thử nghiệm, nó có thể xuyên qua khá nhiều thứ
  • Vợ, các con và tôi phần lớn làm việc hoặc học ở nhà nên thường ở các phòng riêng. Để nhắn cho nhau khi cần, chúng tôi dùng BeeBEEP. Không cần server và có cả client Linux lẫn Windows, đó là yếu tố quyết định
    Nó hoạt động khá tốt, nhưng đôi khi phải khởi động lại sau khi laptop thức dậy từ chế độ ngủ để thấy lại những người khác trên LAN. Và việc không thể mở ngay cửa sổ nhắn tin cho một người cụ thể từ biểu tượng khay gần như là phàn nàn duy nhất của tôi. Cũng có thể copy rồi dán ảnh mèo hài hước, và có cả các tính năng tôi không dùng như truyền tệp. Đây không phải quảng cáo trả tiền, chỉ là tôi luyên thuyên hơi dài thôi
    https://www.beebeep.net/

    • Tôi nghĩ vẻ đẹp của dự án này không nằm ở bản thân việc nhắn tin, mà ở chỗ lạm dụng giao thức mạng cấp thấp để vượt ra ngoài những thứ như cách ly client
  • Hồi trung học tôi từng làm chuyện này bằng net send rồi bị mắng

    • Tôi tìm ra trò đó và chỉ cho vài người bạn, nhưng bí mật chẳng giữ được lâu. Chẳng mấy chốc một nhóm lớn hơn, thậm chí không phải bạn tôi, đã dùng nó để gian lận trong giờ học ở phòng máy. Việc gian lận lộ liễu cũng khó chịu, và tôi cũng hơi bực vì những người mình không thích lắm lại hưởng lợi từ thứ tôi phát hiện
      Vì vậy tôi giả mạo tên người dùng của quản trị viên hệ thống (trên Win9x thì không khó), rồi gửi một thông báo cảnh cáo nghiêm khắc. Thấy các tin nhắn đột ngột dừng hết, chắc họ đã khá hoảng
    • write gửi lời hỏi thăm
      https://en.wikipedia.org/wiki/Write_(Unix)
    • Tôi nhớ net send phải được kết nối với domain, nên có lẽ nó không dùng ARP
    • Nếu trình phân tích mạng bị sai hoặc không quan tâm đến các gói ARP kỳ lạ, có lẽ nhắn tin qua ARP sẽ khó bị phát hiện
    • Đã từng có thời như vậy. Ở đại học, chúng tôi vô tình, à không, cố ý gửi tin nhắn tới toàn bộ domain, và các giáo viên IT lập tức nhìn ngay về phía đám học sinh cá biệt chúng tôi
  • Rất tuyệt. Tuy nhiên TCP/IP không tuân theo mô hình OSI, nên khó áp dụng nguyên xi các phân biệt tinh tế của OSI
    Về mặt thực tế, ARP có thể được định nghĩa là tầng 2.5 theo mô hình TCP/IP của Stevens, nên gọi là 2.5 có vẻ hợp lý nhất. Và frame ARP không được định tuyến, nên rõ ràng không phải L3

  • Vào thời IPv4 NAT gần như là chuẩn mặc định — thật ra bây giờ vẫn vậy, nhưng ngày nay còn có IPv6 và CGNAT — tôi từng làm một thứ gọi là NATChat
    Về cơ bản, nó tạo phòng chat dựa trên địa chỉ IPv4 công cộng, để bạn có thể chat với bất kỳ ai trong cùng mạng. Dùng với những người khác ở văn phòng thì khá ổn. Mà văn phòng cũng là thứ từng tồn tại vào thời đó

  • Cũng có một bản tương tự viết bằng C++: https://github.com/gbonacini/arpchatcpp