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

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

有点难以解释,但我注意到当straceing 使套接字打开的 PID 时,我看不到任何通信。我怎样才能坐在套接字文件的中间来观察通信?

答案1

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

作为内核 API,与套接字的任何交互都是通过系统调用(socketbindconnectlistenacceptsendmsgsendrecv... 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

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

答案2

您不能“跟踪套接字”,strace 适用于进程,因此您可以跟踪与套接字通信的所有进程,但您不能使用 strace 来查看涉及套接字的所有通信。你可能如果 dtrace 或 systemtap 在您的操作系统上可用,则可以使用 dtrace 或 systemtap 到达某处,但这需要相当多的工作。

相关内容