如何“跟踪”一个unix域套接字?

8 socket strace linux-kernel

有点难以解释,但我注意到在strace打开套接字的 PID时我看不到任何通信。如何坐在套接字文件的中间观看通信?

Sté*_*las 12

套接字是用于通信的内核 API。使用套接字 API,您可以通过 TCP/IP 连接、SCTP 关联、UDP 数据报在两个端点之间交换数据,或者使用 Unix 域套接字在两个进程(数据报或连接)之间交换数据...

作为内核 API,与套接字的任何交互都是通过系统调用 ( socket, bind, connect, listen, accept, sendmsg, send, recv, write/read...)。

所以通常情况下,strace将能够跟踪那些因为strace跟踪系统调用。唯一strace无法追踪的通信机制是共享内存上的 IPC(因为在内存中读取/写入内容显然不涉及系统调用)。

更可能的是,在你的情况下,它是别的东西。我敢打赌,该应用程序是多线程的,而且您没有找到正确的线程。或者可能是应用程序是 setuid/setgid 而不是以超级用户身份启动。

如果你想追踪通过 Unix 域套接字交换的内容,选项是:

  • strace和其他ptrace调试器(跟踪服务器或客户端)
  • 审计系统 ( auditd/ auditctl),再次跟踪系统调用
  • 使用一个LD_PRELOAD技巧来包装与套接字交互的系统调用
  • 检测应用程序的代码以在那里添加日志记录。
  • 如前所述,systemtap 和其他低级内核跟踪/调试系统
  • 在中间插入一个人。

例如,对于 MITM,您可以使用socat. 这里是面向连接的 Unix 域套接字,如 X11:

socat -x unix-listen:/tmp/.X11-unix/X42,fork unix:/tmp/.X11-unix/X0
DISPLAY=:42 xlogo
Run Code Online (Sandbox Code Playgroud)

然后,您会看到xlogo与 X 服务器交换的 X11 流量。