설명하기가 조금 어렵지만 strace
소켓이 열리는 PID를 입력할 때 어떤 통신도 볼 수 없다는 것을 알았습니다. 소켓 파일 한가운데에 앉아서 통신을 관찰하려면 어떻게 해야 합니까?
답변1
소켓은 통신에 사용되는 커널 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 및 기타 저수준 커널 추적/디버깅 시스템
- 가운데 사람을 삽입합니다.
socat
MITM의 경우 예를 들어 X11과 같은 연결 지향 Unix 도메인 소켓을 사용할 수 있습니다 .
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을 사용하여 어딘가로 이동할 수 있지만 상당한 작업이 필요합니다.