강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

효과적인 p2p 프로그램 차단

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

효과적인 p2p 프로그램 차단

 

 

 

 

 

사무실 등에서 소리바다나 msn 메신저와 같은 p2p기반의 프로그램을 차단하여야 할 필요가 있을 때가 있다.

 

 

 

 

특히 최근 경향이 p2p프로그램의 사용이 급격히 증가하고 있고, 이로 인한 트래픽이 상승하고 있으며, 일부 p2p프로그램은 실행 시 많은 PPS(초당 패킷수)를 유발하여 네트워크의 성능에 직접적인 영향을 줄 수 있기 때문이다.

 

 

 

 

 

 

p2p프로그램은 크게 3가지 방법을 이용하여 차단 또는 허용이 가능하다.

 

전용 포트 번호를 제어

IP 대역으로 제어

Signature(문자열 등)를 이용한 제어

 

첫 번째는 해당 p2p 프로그램이 사용하는 전용 포트 번호를 제어하는 것이다.

 

 

 

 

이를테면 msn 메신저의 경우 1863, yahoo 메신저의 경우 5050, icq의 경우 5190번을 사용 하므로 이 포트를 차단하면 될 것이다.

 

 

 

 

그러나 msn과 같은 대부분의 프로그램은 해당 포트가 차단되었을 경우 80번이나 23번등 일반적으로 서비스를 위해 열려있는 다른 포트로 우회하여 접속되는 경우가 있는데, 이러한 경우에는 포트를 차단하는 것이 무의미하므로 p2p 프로그램이 사용하는 IP 대역을 차단하는 것이 더욱 효과적일 것이다.

 

 

 

 

주로 초기 접속을 위해 시도하는 인증 서버 등의 IP를 차단하면 유용한데, 이를테면 msn 메신저의 경우 64.4.13.0/24 대역, 소리바다의 경우 211.233.14.151이 그 예이다.(이 값은 수시로 변경될 수 있다.) 그러나 이 역시 확실한 방법은 될 수 없다.

 

 

 

 

왜냐하면, msn 등에서 제공하는 프록시 기능을 이용할 경우에는 프록시 서버로 우회하여 접속이 가능하기 때문이다.

 

 

 

 

 

이러한 경우 프록시 서버로 접속을 하지만 실제로는 프록시 서버를 경유하여 msn등의 서버로 접속이 된다.

 

 

 

 

 

08c57da913464799194b66fa5a3dca68_1694653351_455.png
 

[그림] NATEON의 환경설정 예

 

마지막 방법으로 가장 확실하다고 할 수 있는 패킷의 문자열(string)을 비교하여 필터링하는 방법이 있다.

 

 

 

 

이는 앞의 두 가지 방법이 불가능할 때 사용할 수 있는 방법인데, 바로 string patch를 하면 된다.

 

 

 

 

이 기능에 대한 자세한 내용은 아래 URL을 참고하면 된다.

 

http://www.netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html#ss3.18

 

이 방법을 이용하면 어떤 포트로 접속하거나 어떤 IP로 접속되거나 또는 프록시를 사용하든 관계없이 필터링 할 수 있는데, 각각의 응용 프로그램만이 사용하는 독특한 문자열(string)을 찾아 필터링 룰에 설정하면 된다.

 

 

 

 

 

그런데 문제는 이 독특한 문자열을 어떻게 찾아내는가 인데, 만약 Windows 응용 프로그램이라면 PC에 패킷 캡처 프로그램인 ethereal(http://www.ethereal.com/)등을 설치한 후 msn 메신저 등 p2p프로그램을 실행하여 프로그램이 어떻게 작동하는지 관련 데이터를 캡처하면 된다.

 

 

 

 

만약 유닉스 기반의 응용 프로그램이거나 패킷이 NAT나 브리지 방화벽을 통과한다면 방화벽에서 아래와 같은 옵션을 주어 캡처할 수 있을 것이다.

 

 

 

 

 

 

# tcpdump -l -i eth0 -w - src or dst port xxxx | strings

 

여러 문자열이 있겠지만 msn 메신저의 경우 패킷 캡처를 하면 중간에

“messenger.msn.com”으로 접속을 시도하는 것을 확인하였고, 이를 기준으로 리눅스 방화벽(NAT 또는 브리지 방화벽의 경우)에 아래와 같이 패킷 필터링 룰을 추가하면 될 것이다.

 

 

 

 

물론 이외에도 다른 문자열이 많이 존재할 수 있으므로 각자 설정하여 테스트해 보기 바란다.

 

 

 

 

참고로, msn 프로토콜에 대해 자세한 내용은 다음 URL을 참고하기 바란다.

http://www.hypothetic.org/docs/msn/index.php

* msn 차단예

 

$IPTABLES -A FORWARD -m string --string "messenger.msn.com" -j DROP

NAT나 브리지 방화벽을 사용한다면 위와 같은 방법으로 제어할 수 있는데, 만약 특정한 IP에 대해서만 msn의 사용을 제한하거나 허용하려면 다음과 같이 -s를 추가하여 설정하면 될 것이다.

 

 

 

 

 

 

$IPTABLES -A FORWARD -s 192.168.3.4 -m string --string "messenger.msn.com" -j DROP

추가적으로 다른 경우에도 응용할 수 있는데, 아래는 Nateon이라는 p2p 프로그램을 차단하는 예이다.

 

 

 

 

 

 

* NateOn 차단예

$IPTABLES -A FORWARD -p tcp -m string --string "AUTH 2 DES" -j DROP

$IPTABLES -A FORWARD -p tcp -m string --string "REQS 3 DES " -j DROP

 

더불어서 p2p 프로그램에서 특정 기능만 제한하도록 설정할 수도 있다.

 

 

 

 

아래의 경우 일반적인 1:1 채팅은 허용하되 파일 전송만 제한하는 설정 룰을 보여주고 있다.

 

* NateOn에서 파일 전송 제한

$IPTABLES -A FORWARD -p tcp -m string --string "FILE REQUEST%091%" -j DROP

$IPTABLES -A FORWARD -p tcp -m string --string "REQC NEW" -j DROP

 

NateOn의 경우 파일을 송신할 때와 수신할 때의 signature가 차이가 있어 위와 같이 두개의 룰을 설정하여야 한다.

 

 

 

 

반면 아래 msn의 경우 송신과 수신시 동일한 signature가 작동하여 아래와 같이 한 개의 룰만 설정하면 된다.(이는 버전에 따라 다소 차이가 있으므로 각자 테스트해 보기 바란다.)

* MSN에서 파일 전송 제한

$IPTABLES -A FORWARD -p tcp -m string --string "MSNSLP" -j DROP

 

 

아울러 daum이나 기타 포털에서 제공하는 웹메일(webmail) 프로그램에서, 일반적인 메일 전송은 허용하되 파일을 첨부하여 전송하는 것은 거부하고자 할 때의 룰 역시 설정할 수 있는데, 아래 예의 경우 192.168.1.0/24 대역에서 웹 메일을 통해 파일을 첨부한 메일 발송을 차단하는 예이다.

 

 

 

 

 

* 웹메일 파일전송 제한

 

$IPTABLES -A FORWARD -p tcp -s 192.168.1.0/24 -m string --string "multipart/form-data" -j DROP

 

만약 ftp 접속을 통한 파일 전송을 차단하고자 할 때는 어떻게 하여야 할까? ftp의 경우 21번만 차단하면 된다고 생각할 수 있지만 포트는 임의로 변경이 가능하기 때문에 이 역시 signature로 차단하여야 한다.

 

 

 

 

ftp의 경우 인증과정에서 독특한 문자열을 사용한다는 특징을 이용한다면 아래와 같이 설정할 수 있는데, 만약 특정한 유저나 서버에 대해서는 허용을 하고자 한다면 이 룰의 앞에 -s-d를 추가하면 될 것이다.

 

 

 

 

 

* ftp 접속 제한

 

$IPTABLES -A FORWARD -p tcp -m string --string "Password required for" -j DROP

 

마지막으로 특정한 IP에서만 웹 서버 접근을 허용하고자 할 때 웹 서버의 자체 접근통제 설정 대신 방화벽으로 차단하고자 할 때는 아래와 같이 응용할 수도 있다.

 

 

 

 

방화벽으로 설정할 경우 접근차단이 지원되지 않는 서버에 대해서도 통제가 가능하고 서버가 아닌 앞단의 방화벽에서 차단한다는 장점이 있다.

 

 

 

 

 

먼저 특정한 IP 대역에서의 웹 접속은 허용한다.

$IPTABLES -A FORWARD -p TCP -s 211.47.64.0/24 -d 211.47.65.4 --dport 80 -m string --string "secure.server.com" -j ACCEPT

 

이외 모든 웹 접속은 거부한다.

 

 

 

 

 

$IPTABLES -A FORWARD -p tcp -s 0/0 -d 211.47.65.4 --dport 80 -m string --string "secure.server.com" -j DROP

 

[참고]

이렇듯 강력한 기능의 string 매치 기능은 다른 룰보다 앞쪽에 설정하여야 기능을 제대로 활용할 수 있다.

 

이외 별도로 p2p 프로그램 제어에 대한 패치 프로그램을 이용할 수 있는데, 이에 대해서는 아래의 URL을 참고하기 바란다.

 

 

 

 

아래 두 프로그램 모두 응용프로그램 계층인 7계층에서의 프로그램 signature를 분석하여 필터링하는 방식이다.

 

 

 

 

 

http://sourceforge.net/projects/iptables-p2p

http://l7-filter.sourceforge.net/

 

그리고 앞에서 이더리얼(ethereal)에 대해 간단히 언급하였는데, 굳이 p2p 프로그램의 패킷 캡처를 하지 않더라도 이 프로그램의 활용도는 매우 높기 때문에 사용방법을 알아두는 것이 좋다.

 

 

 

 

여기에서는 간단하게 기능과 활용방법에 대해 알아보도록 하자.

방화벽에서 특정 프로그램에 대해 제어하려면, 해당 응용 프로그램이 어떻게 작동하는지 파악하기 위해서 응용 프로그램이 작동 중 일 때 직접 패킷을 캡처해 보는 것이 가장 효과적인 방법이다.

 

 

 

 

물론 정상적인 작동을 캡처하기 위해서는 방화벽에서 모든 패킷을 허용하도록 한후 실행하여야 할 것이다.

 

 

 

 

 

이러한 프로그램으로는 리눅스 기반에서 tcpdump(http://www.tcpdump.org/)를 사용하고, windows에서는 tcpdump와 비슷한 windump(http://windump.polito.it/)등의 프로그램을 사용할 수 있다.

 

 

 

 

참고로, tcpdump를 사용하려면 패킷 캡처 라이브러리인

libpcap(http://www.tcpdump.org/release/)이 설치되어 있어야 하고(대부분 기본적으로 설치되어 있다.) windump를 사용하려면 winpcap(http://winpcap.polito.it/)이 설치되어 있어야 하는데, 설치 방법은 매우 쉬우므로 해당 사이트를 참고하기 바란다.

 

 

 

 

 

 

그러나 tcpdumpwindump는 단순히 포트의 작동만 캡처할 수 있을 뿐, Layer 7(응용 프로그램 계층)에서 제공하는 패킷의 string등을 캡처할 수는 없으므로 전용 패킷 분석 프로그램을 사용하는 것이 좋은데, 일반적으로 Windows용으로 사용하는 대표적인 프로그램으로는 스니퍼(Sniffer)라는 상용 프로그램과 이더리얼(ethereal)이라는 오픈소스 프로그램이 있다.

 

 

 

 

이더리얼의 경우 자유롭게 이용이 가능하면서도 결코 상용에 뒤지지 않는 강력한 기능을 제공하므로 이 프로그램을 활용할 것을 권장한다.

 

 

 

 

이 프로그램을 이용하면 각종 Windows 기반의 응용 프로그램이 어떠한 원리로 작동하는지 분석하는데 효과적으로 활용할 수 있다.

 

 

 

 

 

 

 

08c57da913464799194b66fa5a3dca68_1694653383_5624.png
 

[그림] ethereal 홈페이지

 

이더리얼은 먼저 winpcap을 설치 후 http://www.ethereal.com/에서 다운로드 및 설치 가능하며, 실행하면 다음과 같은 화면이 보이게 된다.


08c57da913464799194b66fa5a3dca68_1694653400_5946.png
 

[그림] 이더리얼 실행화면

 

이더리얼은 많은 메뉴만큼 제공되는 기능도 많은데, 가장 대표적으로 사용할만한 메뉴로는 Capture->Start이다.

 

 

 

 

만약 아무런 필터 설정 없이 바로 start할 경우에는 자신의 IP 외에도 인터페이스를 지나가는 주위의 모든 패킷을 캡처하므로 애초에 의도하지 않았던 정보까지 캡처하게 되어 성능도 떨어지고, 가독성이 떨어지게 된다.

 

 

 

 

따라서 분석을 필요로 하는 패킷만 캡처하고자 할 경우에는 Filter 메뉴에서 설정하면 되는데, 필터 설정은 tcpdump등에서 제공하는 설정과 동일하며 사용할 수 있는 옵션은 다음과 같다.

 

- and/or/not

- host/net

- src/dst - tcp/udp/icmp

- less/greater

 

[참고]

여기에서의 필터 설정은 캡처하여 보기를 원하는 패킷만 살펴본다는 의미이며 방화벽에서 패킷을 드롭(drop)하는 의미의 필터링과는 다른 의미이다.

 

이를테면, 다음과 같은 쉬운 필터 설정이 가능할 것이다.

 

* tcp만 보고자 할 경우

tcp

 

* port 53번 패킷만 보고자 할 경우

port 53

 

* 192.168.1.3과 관련된 패킷만 보고자 할 경우

host 192.168.1.3

* 192.168.1.3 port 53번과 관련된 패킷만 보고자 할 경우

host 192.168.1.3 and port 53

 

이후 실행을 하면 다음과 같이 패킷이 캡처되는 것을 확인할 수 있는데, 결과화면은 크게 세 부분으로 나뉘어 각각 순차적으로 패킷이 캡처된 내용, 계층별로 좀 더 상세한 캡처 내용, 그리고 마지막으로 세 번째는 해당 패킷의 실제 데이터를 16진수와 디코딩 된 화면으로 볼 수 있다.

 

 

 

 

디코딩 된 화면을 잘 보다보면 인증 시 사용한 아이디/암호 등도 모두 평문 형태로 캡처된 것을 알 수 있다.

 

 

 

 

 

 

08c57da913464799194b66fa5a3dca68_1694653416_4637.png
 

[그림] 패킷캡처 실행 예

 

만약, msn과 같은 특정 응용 프로그램이 어떠한 포트로 작동하는지 모른다면 필터 부분에 host 192.168.3.4 (여기에서 192.168.3.4는 자신의 PC IP)와 같이 설정하면 될 것이다.

 

 

 

 

물론 이때 다른 응용 프로그램은 모두 꺼 놓아야 특정 응용 프로그램이 어떻게 작동하는지 캡처할 수 있을 것이다.

 

리눅스에서 유용하게 활용 가능한 패킷캡처 프로그램에 대해 살펴보도록 하자.

 

(1) tcpdump

tcpdump는 리눅스 등 유닉스 계열에서 제공되는 가장 대표적인 패킷캡처 프로그램으로 표준이라 할 만큼 매우 대중적으로 사용되는 유용한 도구이다.

 

 

 

 

많은 옵션 중 많은 패킷 캡처 프로그램에서 공통적으로 지원하는 중요한 옵션만 살펴보도록 하자.

 

# tcpdump -i eth1

별도의 옵션을 주지 않으면 tcpdump는 기본적으로 eth0 인터페이스의 트래픽을 모니터링한다.

 

 

 

 

따라서 eth0이 아닌 별도의 인터페이스를 통과하는 트래픽을 모니터링하려면 -i eth1과 같은 옵션을 주어야 한다.

 

 

 

 

 

 

# tcpdump port 80

특정 포트에 대한 트래픽(소스 또는 목적지에 관계없이)을 모니터링 하고자 할 때 사용할 수 있다.

 

 

 

 

만약 소스 또는 목적지 포트로 한정하여 모니터링하려면

‘tcpdump dst port 80’ 또는 ‘tcpdump src port 80’과 같이 사용하면 되나 흔히 소스목적지에 관계없이 사용이 가능한 port를 많이 사용한다.

 

 

 

 

 

 

# tcpdump host 211.47.66.50

특정 ip에 대한 트래픽(소스 목적지 관계없이)을 모니터링 하고자 할 때 사용할 수 있다.

 

 

 

 

마찬가지로 만약 소스나 목적지 IP에 대한 정보만을 보고자 한다면

‘tcpdump dst host 211.47.66.50' 또는 ‘tcpdump src host 211.47.66.50’과 같이 사용하면 되나 흔히 소스 목적지에 관계없이 사용이 가능한 host를 많이 사용한다.

 

 

 

 

 

 

# tcpdump port 80 -X

80번에 대한 트래픽을 hexascii로 함께 보여준다.

 

 

 

 

주로 패킷의 헤더정보 뿐만 아니라 상세한 내용을 보고자 할 때 사용한다.

 

 

 

 

 

 

# tcpdump host 211.47.66.50 and port 80

소스나 목적지 IPIP211.47.66.50이고, 소스나 목적지 포트가 80 http인 트래픽을 모니터링 하고자 할 때 사용한다.

 

 

 

 

여러 가지의 패킷필터가 있을 경우 위와 같이 and 또는 or를 사용할 수 있다.

 

 

 

 

 

# tcpdump port 80 and not host 1.1.1.1

소스나 목적지 포트가 80번인 트래픽 중에서 소스나 목적지 ip1.1.1.1이 아닌 트래픽을 모니터링 하고자 할 때 사용할 수 있다.

 

 

 

 

 

 

# tcpdump -i eth1 arp

eth1 인터페이스를 통과하는 arp 패킷을 보여준다.

 

 

 

 

 

 

# tcpdump -i eth1 -e

eth1 인터페이스를 통과하는 패킷에 대해 mac 정보도 함께 보여준다.

 

 

 

 

 

 

# tcpdump -i eth1 net 10.64.4.0 mask 255.255.255.0

eth1 인터페이스를 통과하는 패킷 중 소스나 목적지 ip 대역이 10.64.4.0/24 대역에 속하는 패킷을 보여준다.

 

 

 

 

 

# tcpdump -n

dump하는 패킷에 대해 ip나 포트번호 등에 대한 역질의(reverse lookup)를 하지 않는다.

 

 

 

 

 

(2) ngrep

다음으로 살펴볼 프로그램은 ngrep이라는 프로그램이다.

 

 

 

 

 

ngrepnetwork grep의 의미로서, 홈페이지

(http://www.packetfactory.net/projects/ngrep/) 또는 http://rpmfind.net/에서 rpm 버전으로 다운로드 가능하다.

 

 

 

 

ngreptcpdump와 비슷한 기능을 제공하지만 설치과정이 쉽고 바이너리 파일만 복사해서 바로 사용할 수 있을 만큼 가벼워서 모니터링 시 유용하게 사용 가능하다.

 

 

 

 

개인적으로는 tcpdump보다 이 프로그램을 더욱 많이 사용하고 있는데, 몇 가지 유용한 기능을 살펴보도록 하자.

# ngrep -qi -c 80 port 80

T 221.xxx.68.251:3414 -> 211.47.xx.xx:80 [AP]

GET /tt/site/skin/member/CONNECT_LIST/images/title_all.gif HTTP/1.1..

Accept: */*..Referer: http://www.server.com/tt/site/ttmember.c

gi?act=connect_list..Accept-Language: ko..Accept-Encoding: gzip, deflate..

If-Modified-Since: Tue, 21 Feb 2008 06:19:41 If-None-Match: "2a4043-77-

43fab0fd"..User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; M

axthon; i-NavFourF; InfoPath.1; .NET CLR 1.1.4322)..Host: www.server.com..

Connection: Keep-Alive..Cookie: WRITE=store_user_info=0&; X2VID=Z4402067

F93; oldserver=done; _home_server_public_html_tt_site_

SESSION_ID=ee641d3190188207f3320f075f1c2b10....

 

위의 경우 port 80번에 대한 패킷을 캡처한 것으로 패킷의 상세한 내용까지 보여주고 있는 것을 알 수 있다.

 

 

 

 

여기에서 -c 80은 출력되는 컬럼의 폭을 80자로 제한하여 가동성을 높이기 위한 설정이다.

 

 

 

 

 

 

# ngrep -qwi 'user|pass' port 110

T 211.47.xx.xx:2502 -> 211.47.xx.xx:110 [AP]

USER antihong..

T 211.47.xx.xx:110 -> 211.47.xx.xx:2502 [AP]

+OK User name accepted, password please..

T 211.47.xx.xx:4567 -> 211.47.xx.xx:110 [AP]

PASS sdlkjlfsdf.

 

이는 port 110번에 대한 패킷 중 대소문자에 관계없이(-i) ‘user’ 또는 ‘pass’ 라는 문자열이 보이는 패킷만을 보여주는 것으로, 특정한 문자열만을 캡처해서 보고자 할 때 유용하게 사용할 수 있다.

 

 

 

 

 

 

# ngrep -tW byline port 80

# T 2008/03/13 17:30:16.416882 222.xxx.xx.254:4767 -> 211.47.xx.xx:80 [AP]

GET /tt/site/skin/member/CONNECT_LIST/images/bt_profile.gif HTTP/1.1.

Accept: */*.

Referer: http://www.server.com/tt/site/ttmember.cgi?act=connect_list.

Accept-Language: ko.

Accept-Encoding: gzip, deflate.

If-Modified-Since: Tue, 21 Feb 2008 06:19:41 GMT.

If-None-Match: "2a403f-1eb-43fab0fd".

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; i-NavF;).

Host: www.server.com.

Connection: Keep-Alive.

Cookie: WRITE=store_user_info=0&; main_ttnews_276_no_popup=20060116;

_home_server_public_html_tt_site_SESSION_ID=9796a3f30d44736c7382e8a7ab42b6.

 

##

T 2006/03/13 17:30:16.418319 211.47.xx.xx:80 -> 222.235.xx.xxx:4767 [AP]

HTTP/1.1 304 Not Modified.

Date: Mon, 13 Mar 2008 08:30:16 GMT.

Server: Microsoft-IIS/5.0.

Connection: Keep-Alive, Keep-Alive.

Keep-Alive: timeout=15, max=99.

ETag: "2a403f-1eb-43fab0fd".

 

위와 같이 -t 옵션을 추가하면 패킷이 캡처되는 시간이 함께 보이고, -W byline을 추가하면 앞에서와 달리 캡처되는 내용들이 한 줄에 나열되지 않고 항목에 따라 여러 줄에 나누어 보여주므로 패킷을 분석하는데 편리하게 사용가능하다.

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,037 명
  • 현재 강좌수 :  35,803 개
  • 현재 접속자 :  124 명