한동안 괜찮아 보이던 서버에 약간 프로세스 부하가 생기는 것 같아 프로세스 실행 목록을 보니 www-data 계정에서 perl 스크립트를 실행하는 것이 포착됐다.
도대체 이 프로세스가 무슨 작업을 하는 걸까? 궁금함에 프로세스가 수행중인 내용이 무엇인지 확인하는 방법이 없나 검색해봤다.
목적에 딱 맞는지는 모르겠으나 strace 명령으로 해당 프로세스가 대략적으로 무슨 짓을 하는지 파악할 수 있는 것 같았다.
우선 ps 명령을 이용해 perl 스크립트가 뭘 수행중인지 먼저 확인했다.
위 명령을 사용하면 ps 출력 결과에서 command 부분이 짤리지 않고 모두 출력되어 나온다. 위 명령으로 확인한 실행중인 내용은 다음과 같았다.
tmp 디렉토리에서 특정 스크립트를 실행중이었는데 tmp 디렉토리를 확인해보니 redrv라는 건 없었다. 아마도 스크립트를 실행하면서 해당 파일은 지우게 한 것 아닌가 추정된다.
본격적으로 strace 명령으로 뭔 내용이 동작 중인가 확인해봤다. 명령은 다음과 같다.
process ID 22138이 위에서 확인했던 perl 스크립트 프로세스다. 위 명령 결과 다음과 같은 동작 내용들이 확인 됐다.
- 11:46:39 fcntl(31, F_SETFL, O_RDWR|O_NONBLOCK) = 0
- 11:46:39 select(32, NULL, [4 5 8 9 11 14 20 22 23 24 25 29 30 31], NULL, {tv_sec=0, tv_usec=0}) = 3 (out [9 14 31], left {tv_sec=0, tv_usec=0})
- 11:46:39 getpeername(31, 0x55def75dac40, [256]) = -1 ENOTCONN (Transport endpoint is not connected)
- 11:46:39 sendto(31, "\nP\1\0\0\1\0\0\0\0\0\0\4mta6\3am0\10yahoodns\3net\0\0\1\0\1", 39, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.164.181.2")}, 16) = 39
- 11:46:39 write(14, "EHLO localhost\r\n", 16) = 16
- 11:46:39 write(9, "EHLO localhost\r\n", 16) = 16
- 11:46:39 select(32, [6 7 9 10 12 13 14 15 16 17 18 19 21 26 27 28 31], NULL, NULL, {tv_sec=0, tv_usec=0}) = 1 (in [17], left {tv_sec=0, tv_usec=0})
- 11:46:39 read(17, "220 mtaproxy503.free.mail.ne1.yahoo.com ESMTP ready\r\n", 16384) = 53
- 11:46:39 select(0, NULL, NULL, NULL, {tv_sec=0, tv_usec=10000}) = 0 (Timeout)
- 11:46:39 socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) = 32
- 11:46:39 ioctl(32, TCGETS, 0x7ffe1c622340) = -1 ENOTTY (Inappropriate ioctl for device)
- 11:46:39 lseek(32, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
- 11:46:39 ioctl(32, TCGETS, 0x7ffe1c622340) = -1 ENOTTY (Inappropriate ioctl for device)
- 11:46:39 lseek(32, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
- 11:46:39 fcntl(32, F_SETFD, FD_CLOEXEC) = 0
- 11:46:39 fcntl(32, F_GETFL) = 0x2 (flags O_RDWR)
- 11:46:39 fcntl(32, F_SETFL, O_RDWR|O_NONBLOCK) = 0
- 11:46:39 select(40, NULL, [4 5 8 11 17 20 22 23 24 25 29 30 32], NULL, {tv_sec=0, tv_usec=0}) = 3 (out [17 20 32], left {tv_sec=0, tv_usec=0})
- 11:46:39 getpeername(32, 0x55def75dac40, [256]) = -1 ENOTCONN (Transport endpoint is not connected)
- 11:46:39 sendto(32, "\344;\1\0\0\1\0\0\0\0\0\0\4mta6\3am0\10yahoodns\3net\0\0\1\0\1", 39, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.169.232.6")}, 16) = 39
- 11:46:39 getpeername(20, {sa_family=AF_INET, sin_port=htons(25), sin_addr=inet_addr("67.195.204.77")}, [256->16]) = 0
- 11:46:39 write(17, "EHLO localhost\r\n", 16) = 16
- 11:46:39 select(40, [6 7 9 10 12 13 14 15 16 17 18 19 20 21 26 27 28 31 32], NULL, NULL, {tv_sec=0, tv_usec=0}) = 1 (in [18], left {tv_sec=0, tv_usec=0})
- 11:46:39 read(18, "220 mtaproxy108.free.mail.gq1.yahoo.com ESMTP ready\r\n", 16384) = 53
- 11:46:39 select(0, NULL, NULL, NULL, {tv_sec=0, tv_usec=10000}) = 0 (Timeout)
정확히는 모르겠으나 느낌상 내 서버가 스팸 메일을 뿌리는 역할로 사용된 것 같다. 어제 저녁에 서버를 reboot하고 해당 프로세스들이 없는 걸 확인했는데 오전 부터 다시 실행된 흔적이 보였다. 아직 어떤 경로로 해당 프로세스가 실행됐는지 확인을 못한 상태다. 현재는 wordpress 플러그인들 중 security 플러그인이 있어서 해당 플러그인 실행중인 상태다.