Sniff ซ็อกเก็ตโดเมน UNIX


9

ฉันรู้ว่ากระบวนการบางอย่างกำลังเขียนไปยังซ็อกเก็ตโดเมน unix ( /var/run/asterisk/asterisk.ctl) แต่ฉันไม่รู้จัก pid ของผู้ส่ง ฉันจะรู้ได้อย่างไรว่าใครเขียนถึงซ็อกเก็ต ฉันได้ลองกับ:

sudo lsof /var/run/asterisk/asterisk.ctl

แต่มันเป็นเพียงรายชื่อเจ้าของซ็อกเก็ต ฉันต้องการทราบว่าใครกำลังเขียน / อ่านซ็อกเก็ตนี้และฉันต้องการดมกลิ่นข้อมูล เป็นไปได้ไหม

คำตอบ:


4

คำตอบสั้น ๆ ไม่ใช่และไม่ง่าย

บน Linux นั้นใช้/proc/net/unixเพื่อดึงข้อมูลเกี่ยวกับซ็อกเก็ตโดเมน UNIX อินเตอร์เฟสนี้แสดงรายการซ็อกเก็ตที่ถูกผูกไว้ทั้งหมด แต่ไม่ได้ติดตามจุดสิ้นสุด ดังนั้นคุณสามารถดูว่ามีซ็อกเก็ตใดอยู่บ้าง แต่คุณไม่สามารถเห็นสิ่งที่เชื่อมต่อกับซ็อกเก็ตได้ บางแห่งข้อมูลนี้ถูกติดตามจะต้องถูกติดตามมิฉะนั้นการเชื่อมต่อซ็อกเก็ตจะไม่ทำงาน ฉันยังไม่พบกลไกใด ๆ ในการดึงข้อมูลการเชื่อมต่อ

คำถามการดมกลิ่นน่าสนใจกว่าเล็กน้อย แต่ก็ไม่ทำให้ผิดหวัง สิ่งที่ฉันหมายถึงโดย "ไม่ง่าย" คือไม่มีเบ็ดใด ๆ ที่จะแอบเข้าไปและรับข้อมูลนั้น อะนาล็อกที่ใกล้เคียงที่สุดคือการใช้ tcpdump หรือ Wireshark ซึ่งทั้งสองอย่างใช้ libpcap เพื่อทำการยกของหนัก ในขณะที่เครือข่าย (AF_INET) และโดเมน UNIX (AF_UNIX) ถูกสร้างขึ้นโดยใช้การsocket()เรียกใช้ฟังก์ชั่นทั้งใช้connect()ในการเชื่อมต่อใช้งานread()และwrite()ประมวลผลข้อมูลพวกเขาถูกจัดการโดยระบบย่อยเคอร์เนลที่แตกต่างกัน สิ่งนี้มีผลข้างเคียงที่โชคร้ายที่ libpcap ไม่ได้ออกแบบมาเพื่อทำงานกับซ็อกเก็ตโดเมน UNIX

มีปัญหาสลัวน้อยกว่าเล็กน้อย recv(2)ลองดูที่หน้าคนสำหรับ นี่คือการเรียกระบบระดับต่ำกว่าที่read()ใช้ มีธงที่มีอยู่สำหรับเรียกว่าrecv() MSG_PEEKสิ่งนี้จะช่วยให้คุณดมกลิ่นการรับส่งข้อมูลผ่านซ็อกเก็ตโดเมน UNIX นั่นคือด้านสว่างด้านมืดคือที่สุดของความรู้ของฉันไม่มีแอปพลิเคชันปัจจุบันที่ออกแบบมาเพื่อทำสิ่งนี้ ดังนั้นคุณกำลังดูความพยายามในการพัฒนา

ผมต้องการมีเป็นคำตอบที่ดีที่เรียบง่ายของ F'YEAH ทั้งชิ้นส่วนของคำถามของคุณ


11

ใช่คุณสามารถทำได้ เพียงคุณมี systemtap

พิจารณาหนึ่งในสคริปต์ systemtap ตัวอย่างที่จะพิมพ์ PID และชื่อกระบวนการของโปรแกรมใด ๆ ที่อ่านหรือเขียน inode ที่ระบุ (และซ็อกเก็ตโดเมน Unix ของคุณเป็นเพียงสิ่งนั้น)

คุณสามารถปรับเปลี่ยนสคริปต์นี้เล็กน้อยเพื่อพิมพ์ข้อมูลจริงที่กำลังอ่าน / เขียน; ฉันจะปล่อยให้ทำเช่นนี้เป็นแบบฝึกหัดให้ผู้อ่าน


4

ฉันรู้ว่านี่ไม่ใช่การตอบคำถามหลัก แต่ฉันลงเอยด้วยการค้นหาการสื่อสารที่น่าเบื่อบนซ็อกเก็ต ฉันตัดสินใจที่จะโพสต์สำหรับคนอื่น ๆ เช่นฉัน นี่คือวิธีที่ฉันทำ:

$> sudo socat -t100 -x -v UNIX-LISTEN: /var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT: /var/run/php5-fpm.sock

คุณสามารถลบ -x และปล่อยให้ -v สำหรับการสื่อสาร ascii หวังว่าจะช่วยใครซักคน


ทำงานได้อย่างสมบูรณ์แบบ
JSmyth

-1

socat -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

ไม่มีการทำซ้ำของเอาต์พุตไม่มีเอาต์พุตแบบวนซ้ำ ข้อผิดพลาดของความคิดเห็นก่อนหน้า ".sock.socat"


2
แม้ว่าอาจเป็นคำสั่งที่มีประโยชน์โปรดเพิ่มคำอธิบาย / ความกระจ่าง (และความแตกต่างจากคำตอบนี้เป็นอย่างไร)
HBruijn

ฉันขอโทษ. ไม่มีการทำซ้ำของเอาต์พุตไม่มีเอาต์พุตแบบวนซ้ำ ข้อผิดพลาดของความคิดเห็นก่อนหน้า ".sock.socat"
srvf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.