특정 Port를 점유하는 process 확인

Operation System 2008. 11. 2. 17:57
홍석범 | 오늘과내일 운영관리팀 차장

외부에서 포트스캔 등을 통해 확인해 보면, http(80)나 ftp(21) 외에 본인도 모르는 포트가 사용중인 경우가 있다. 이를테면 tcp 5000번 포트가 열려있는 것을 확인하고 텔넷으로 접속할 경우 접속까지도 가능한 경우도 있다. 이같은 경우 이 포트를 점유하고 있는 프로세스가 무엇인지 알아볼 필요가 있다.


윈도우 시스템의 경우 전통적으로 fport.exe라는 프로그램을 이용하지만, 커맨드 방식이고 몇 가지 불편한 점이 있어 최근에는 GUI 방식이면서 프로세스 삭제 등도 제공되는 cports라는 프로그램이 자주 이용되고 있다. 이 프로그램은 www.nirsoft.net/utils/cports.html 에서 자유롭게 다운받을 수 있으며, [화면 2]와 같이 현재의 프로세스와 연결상태, 특정 포트를 사용하는 프로세스 정보 등을 직관적으로 알 수 있게 보여준다. 또한 특정 프로세스의 상태도 보여주고, 오른쪽 마우스를 클릭하면 직접 프로세스를 죽일 수도 있다.

 

 

반면 리눅스의 경우 다소 번거로운 것이 사실인데, fuser나 netstat 명령을 이용하면 확인할 수 있다. 이 명령어들은 대부분의 시스템에서 기본적으로 이용할 수 있는데, 혹 명령어가 실행되지 않으면 해당 패키지를 찾아 설치하면 된다.

 

* fuser
fuser는 특정한 파일이나 파일 시스템을 사용하고 있는 프로세스의 pid를 보여주는 명령어 로 "fuser -n tcp 10101"과 같이 실행하면 10101번 포트를 사용 중인 프로세스 id를 보여준다. 물론 udp 포트일 경우에는 "fuser -n udp 53"과 같이 사용하면 된다.


이때 프로세스 id가 570번이라는 것을 확인했다면 pid 570번을 사용하는 프로세스를 확인해야 하는데, 이는 "ps aux"로 확인하거나 "ls -la /proc/570/"의 결과 중 "exe->"가 가리키는 부분을 확인하면 된다.

 

"exe->"가 가리키는 경로는 현재 실행 파일을 의미하며, "cmd->"는 실행 파일이 참조하는 파일이나 디렉토리의 경로를 알려준다. 만약 "exe -> /home/user1/hacking/hacking*"이라고 표시돼 있으면, 이 경로에 있는 파일이 10101번 포트를 바인딩하고 있는 프로세스라는 것을 확인할 수 있다.


그런데, 가끔 백도어 포트 등을 점검하다 보면 "ls -la /proc/pid"와 같이 확인했을 때 "exe -> /home/user1/hacking/hacking (deleted)"와 같이 보이는 경우가 있다.

실제로 "/home/user1/hacking/" 디렉토리에 가서 확인해 보면 hacking이라는 파일이 없는데, 프로세스에는 떠 있게 된다. 이는 공격자가 hacking이라는 백도어 파일을 실행해 커널 메모리에 올린 후에는 해당 파일을 삭제해, 백도어로서 작동은 하지만(이미 커널 메모리에 올라가 있으므로) 흔적은 남기지 않기 위한 방법으로 많이 사용되는 방법이다.

 

이같은 경우 파일은 삭제됐어도 메모리에는 남아있기 때문에 "cp /proc/pid/exe /root/test" 라고 실행하면 삭제된 원본 파일을 "/root/test" 라는 파일로 복구할 수 있다.

 

* netstat
간단히 사용할 수 있는 다른 명령어로서 다음과 같이 터미널 상에서 netstat을 실행해 보는 방법도 있다. netstat는 많은 옵션을 제공하고 있는데, 현재 시스템에서 특정 포트를 점유해 소켓 데몬 형태로 대기 중인 서비스에 대한 사항은 listen의 의미인 -l 옵션을 주면된다. 더불어서 -p 옵션을 주면 해당 포트를 사용 중인 프로그램 이름도 확인할 수 있다.

 

 

[화면 3]의 경우를 보면 좌측에 현재 열려있는 포트를 알 수 있으며, 우측에 있는 정보를 보면 해당 포트가 어떤 PID(Process ID)며 어떤 프로그램인지 확인할 수 있다. 만약 포트 2265/tcp을 점유하고 있는 프로세스 정보를 알고자 한다면 pid가 587이고 프로그램 이름이 osirisd인 것을 알 수 있는데, 좀 더 상세히 알고자 한다면 앞에서 살펴본 바와 같이 "ls -la /proc/pid"를 실행하면 된다.


그리고, 만약 특정 프로세스가 정상적인 것이 아니라면 "kill -9 570"(570은 pid) 또는 "killall -9 -ev hacking"(hacking은 ps auxc 실행 시 보이는 프로세스 이름)으로 해당 프로세스를 강제로 죽이면 포트도 닫힌다.


Posted by 불량소금
,