티스토리 뷰

http://tt.co.kr/~antihong/system_monitor.doc


ngrep은 tcpdump와 더불어 네트워크를 sniff하는 도구이다.

하지만 tcpdump는 packet의 경로와 특성만을 sniffer 하는 반면 ngrep은 특정 포트로 접속한 IP가 어떤 파일을 보고 있는지



어떤 data를 전달하는지도 sniffer 할수 있는 강력한 도구이다.

보안은 항상 양면성을 가지고 있듯이 이것도 잘쓰면 자신이 관리하는 서버를 지키는 도구가 되지만, 악용되면, 다른 사람의 정보를



유출할수 있는 악성 도구가 되므로 주의해서 사용하기 바란다.

이것은 tcpdump와 마찬가지로 패킷을 캡춰하는 libpcap 라이브러리가 필요하므로, 설치전에 미리 libpcap을 install 해야 한다.

libpcap의 최신 버전은 http://www.tcpdump.org/release/ 이곳에서 다운받을수 있다.

ngrep을 rpm패키지를 만들때 /usr/bin/ngrep 으로 실행파일이 들어가도록  rpm을 만들었으므로 자동으로 패스에 잡힐것이다.

ngrep 간단한 사용법은 다음과 같다.



--------------------------------------------------------------------------------

ngrep -qd eth0 port 80


위 명령줄은 포트 80으로 접속하는 패킷을 캡춰하며, webport이므로 어떤 웹페이지를 보고있는지 확인한다

ngrep -qd eth0 'HTTP' port 80


위와 같으나 ,' HTTP'문자가 들어간 라인만을 캡춰한다.

여기에는 not을 사용함으로써 그 반대의 경우를 캡춰할수 있다.




--------------------------------------------------------------------------------



다음은 ngrep의 README 의 일부이다.

==========
Usage:

  ngrep <-hXViwqpevxlDtT> <-IO pcap_dump> <-n num> <-d dev> <-A num>
                          <-s snaplen> <-S limitlen> <match expression>
                          <bpf filter>

  -h  is help/usage
  -X  is interpret match expression as hexadecimal
  -V  is version information
  -i  is ignore case
  -w  is word-regex (expression must match as a word)
  -q  is be quiet
  -p  is don't go into promiscuous mode
  -e  is show empty packets
  -v  is invert match
  -x  is print in alternate hexdump format
  -l  is make stdout line buffered
  -D  is replay pcap_dumps with their recorded time intervals
  -t  is print timestamp every time a packet is matched
  -T  is print delta timestamp every time a packet is matched
  -s  is set the bpf caplen
  -S  is set the limitlen on matched packets
  -O  is dump matched packets in pcap format to pcap_dump
  -I  is read packet stream from pcap format file pcap_dump
  -n  is look at only num packets
  -d  is use a device different from the default (pcap)
  -A  is dump num packets after a match

  <match expression>   is either an extended regular expression or a
                       hexadecimal string.  see the man page for more
                       information.

  <bpf filter>         is any bpf filter statement.
===========



1. 패킷캡처

아래는 스팸 프로그램을 이용하여 스팸 발송시 ngrep 으로 패킷을 캡처한 것입니다.
여기에서 221.139.50.6(하나로통신) 은 스팸을 발송하는 IP 이며 xxxxx.co.kr 은 technote 가 설치된
도메인입니다. 아래에서 보는 바와 같이 메일 발송시 frommail=asdgagg@xxxxx.co.kr  로 설정하여
마치 xxxxx.co.kr 에서 발송한 것처럼 위조하더군요..


T 221.139.50.6:4122 -> 211.47.66.44:80 [AP]
POST /technote/main.cgi HTTP/1.1..Accept: */*..Content-Type: application/x-www-form-urlencoded..
User-Agent: Nimo Software HTTP Retriever 1.0..Host: xxxxx.co.kr..Content-Length: 5574..
Cache-Control: no-cache..Cookie: koX8iT3Dda=-FREE_BOARD-....

T 221.139.50.6:4122 -> 211.47.66.44:80 [A]
command=guest_email&htmltype=1&tomail=kkkyong@hanmail.net&frommail=asdgagg@xxxxx.co.kr&
title=%B3%AA+%C0%CC%BB%DA%C1%F6%3F%B9%FE%C0%B8%B8%E9+%B4%F5+%C0%CC%BB%
DA%B4%D9%2A%5E%5E%2A&comment=%3Chtml%3E+%3Chead%3E+%3Ctitle%3EUntitled+Document
%3C%2Ftitle%3E+%3Cmeta+http%2Dequiv%3D%22Content%2DType%22+content%3D%22text%2Fhtm
이하 생략 ...



2. 접속차단  및 대응방법

그렇다면 이에 대해 어떻게 대응할 수 있을까요? 다음과 같은 방법이 있을 것입니다.

(1) technote 의 취약성을 패치한다.
  좋은 방법이지만 앞에서 언급한대로 한계가 있습니다.
  따라서 아래의 방법과 함께 사용하는 것이 좋을 것 같습니다.

(2) IP 나 IP 대역을 차단한다.
저희의 경우 221.139.50.5, 221.139.50.7, 221.139.50.25,221.139.50.29 에서 저희 모든 IP 대역에 대해
며칠동안 지속적으로 발송 시도를 하여 아예 라우터에서 IP 를 차단해 버렸습니다.
다른 IDC 에 있는 서버에서도 위 IP 에 대한 로그가 남는 것으로 보아 악성스패머 같습니다.
(혹 하나로통신 관계자분이 계시면 적절한 조처 부탁드립니다.)
IP 차단 방법은 ACL 을 이용하거나 Blackhole filtering(Null routing) 을 사용하는 방법이 있는데,
저는 간편하게 아래와 같이 후자의 방법을 이용하였습니다.

# ip route 221.139.50.5 255.255.255.255 Null0
# ip route 221.139.50.7 255.255.255.255 Null0
# ip route 221.139.50.25 255.255.255.255 Null0
# ip route 221.139.50.29 255.255.255.255 Null0


이러한 경우 221.139.50.x 의 목적지 IP 를 Null0 인터페이스로 설정하는 것이므로
위 IP 를 소스로 한 SYN 패킷이 서버까지는 전달되어도 서버에서 응답한 SYN/ACK 가
라우터를 통과하지 못하고 Null0 인터페이스로 버려지므로 서버에서는 SYN/ACK 발송후
ACK를 받지 못하여 마치 SYN Flooding 을 당하는 것처럼 보이게 됩니다.

tcp        0      0 211.47.66.44:80         221.139.50.5:3514       SYN_RECV
tcp        0      0 211.47.66.44:80         221.139.50.5:2483       SYN_RECV


(3) 각 웹서버에서 제어 설정을 한다.

위와 같이 특정한 ip 에서 지속적으로 스팸을 발송하는 경우도 있지만 대부분 ip 가 검출되지 않도록
외국의 open 된 proxy 서버를 경유하여 발송하는 경우도 많이 있습니다. 이러한 경우
매 접속시마다 proxy 의 ip 를 자동으로 바꾸어가면서 접속하기 때문에 해당 ip 를 차단하는 것이
무의미할 때도 있습니다. 이러한 경우는 아래와 같은 방법을 이용할 수 있습니다.

위 패킷캡처 부분에서 주목해야 할 부분은  바로 "User-Agent" 부분입니다. 즉,

User-Agent: Nimo Software HTTP Retriever 1.0

와 같이 보이게 되는데, 즉 스팸 발송시 사용하는 프로그램의 이름 및 버전이
"Nimo Software HTTP Retriever 1.0" 이라는 것을 알 수 있습니다.
위 프로그램이 어떤 것인지는 모르겠지만 여러 IP 에서 자주 보이는 것으로 보아
자동화된 고속의 스팸 발송 프로그램인 것 같습니다.
따라서 아파치에서 제공하는 BrowserMatch 지시자를 이용하여 httpd.conf 에
다음과 같이 차단 설정할 수 있습니다.

BrowserMatch "Nimo Software HTTP Retriever 1.0" no_spam


<Directory />
  Options ExecCGI SymLinksIfOwnerMatch
  AllowOverride All
  Order allow,deny
  Allow from all
  Deny from env=no_spam
</Directory>

이는 BrowserMatch 지시어를 이용하여 UA 가 "Nimo Software HTTP Retriever 1.0" 을  
no_spam 이라는 환경변수에 정의하고, 모든 디렉토리이하에서 환경변수가 no_spam 인 경우
접속을 deny 한다는 의미입니다.

아래는 위와 같이 설정후에 관련 로그이며 중간부터 서버 응답이 기존의 200(OK)에서
403(Forbidden) 으로 바뀐 것을 알 수 있습니다.

221.139.50.29 - - "POST /technote/main.cgi HTTP/1.1" 200 1380 "-" "Nimo Software HTTP Retriever 1.0"
221.139.50.7 - -  "POST /technote/main.cgi HTTP/1.1" 200 3577 "-" "Nimo Software HTTP Retriever 1.0"
221.139.50.25 - - "POST /technote/main.cgi HTTP/1.1" 200 1377 "-" "Nimo Software HTTP Retriever 1.0"
221.139.50.29 - - "POST /technote/main.cgi HTTP/1.1" 200 1375 "-" "Nimo Software HTTP Retriever 1.0"
221.139.50.25 - - "POST /technote/main.cgi HTTP/1.1" 403 294 "-" "Nimo Software HTTP Retriever 1.0"
221.139.50.25 - - "POST /technote/main.cgi HTTP/1.1" 403 294 "-" "Nimo Software HTTP Retriever 1.0"
221.139.50.7 - -  "POST /technote/main.cgi HTTP/1.1" 403 294 "-" "Nimo Software HTTP Retriever 1.0"
221.139.50.5 - -  "POST /technote/main.cgi HTTP/1.1" 403 294 "-" "Nimo Software HTTP Retriever 1.0"
221.139.50.29 - - "POST /technote/main.cgi HTTP/1.1" 403 294 "-" "Nimo Software HTTP Retriever 1.0"


참고하시기 바랍니다

감사합니다.

---------------------------------------------------------------------------------------------------------------------



ngrep은 패킷 내용을 스니퍼처럼 보여주는 툴이다. grep의 네트웍용이라 생각하면 쉬울 것이다.
ngrep이 설치된 서버가 더미허브에 연결되어 있을 경우 내부 네트웍의 모든 패킷을 볼 수도 있다.

1. ngrep 사용

* ngrep 홈 : http://ngrep.sourceforge.net/

80포트를 보기위해서는 다음과 같이 하면 된다.


# ngrep -t port 80
interface: eth0 (192.168.xxx.0/255.255.255.0)
filter: ip and ( port 80 )
####
T 2003/11/07 12:46:32.005250 192.168.xxx.xxx:35898 -> 218.xxx.xx.xx:80 [AP]
  GET /news/ HTTP/1.1..Host: coffeenix.net..User-Agent: Mozilla/5.0 (X11; U; Linux i686;
   en-US; rv:1.5) Gecko/20031007 Firebird/0.7..Accept: text/xml,application/xml,applicat
  ion/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/
... 중략 ...
  ........ ...., ........ - ........ .... LINUX/UNIX ....
... 생략 ...


-t : 시간도 함께 표시
-x : 16진수와 함께 표시
-d device : 디바이스를 지정할 때
-i : 대소문자를 무시한다.

사용 예)

* 특정 IP로 오가는 패킷중 80포트는 재외
  # ngrep -v -qt host IP and not port 80
* Codered 패킷을 볼 때
  # ngrep -iqt 'default.ida' port 80
* 특정 호스트로 오고가는 메일, FTP, 텔넷 작업 확인
  # ngrep -qx host IP and port 25 or port 110 or port 21 or port 23
* 오라클 리스너로 가는 패킷 확인 (프로그램에서 던져지는 SQL문 확인시 유용)
  # ngrep -qx dst port 1521

2. 한글 표시하려면

그러나 ngrep은 영문자와 숫자 이외는 모두 점(.)으로 표시한다.
2001년 소인이 만든 conv.pl 을 이용하면 한글도 표시할 수 있다.
주의할 것은 웹을 통해 파일을 전송한다든지 할 경우, 이상한 문자들이 화면에 가득찰 것이다.
파일 전송이 빈번히 이뤄지는 포트를 제외하고 사용해야한다.


#!/usr/bin/perl
#
# ngrep 한글 표시용
#
# Made by Jinho Hwangbo
# 2001.9.24

# T 211.xxx.xx.xxx:1886 -> 205.xxx.xxx.xxx:80 [AP]
#  47 45 54 20 2f 69 6d 61    67 65 2f 39 33 30 35 32    GET /image/93052

while ( $P= ) {
        if ( $P =~ /^\s+(.+)/ ) {
                $P_HEX = substr($P,0,54);
                @HEX   = split(' ',$P_HEX);

                for ( $c = 0; $c <= $#HEX; $c++ ) {

                      # 32, 0x20 = Spacebar
                      if ( hex($HEX[$c]) < 32 &&
                           $HEX[$c] ne "0d" && $HEX[$c] ne "0a" &&
                           $HEX[$c] ne "08" && $HEX[$c] ne "1b" ) {
                           $HEX[$c] = '20';
                      }
                }

                $P_HEX = "@HEX";
                $P_HEX =~ s/\s//g;
                $P_CONV= pack ("H*", $P_HEX);
                printf("%s",$P_CONV);
        }
}

* 다운로드용 : http://coffeenix.net/truefeel/files/conv.pl.txt

사용 방법은 -x 옵션을 반드시 붙이고 사용하면 된다.


# ngrep -qx dst port 1521 | ./conv.pl


3. 악용하지 말자

ngrep은 악용할 경우 패스워드는 물론 모든 송수신하는 메일 내용과 메신저로 하는 대화 내용까지도
볼 수 있다. (NIDS설치하면 이런건 쉽게 확인 가능하지만.)
관리자의 도덕성과 관련된 부분이니 이런 용도로는 사용하지 말기를 바란다.
오직 관리 목적, 프로토콜 분석, 네트웍 프로그래밍할 때 송수신되는 패킷이 정상적인지 확인하는
용도로 사용해야한다.

'네트워크 > ' 카테고리의 다른 글

네트워크 모니터링  (0) 2008.06.22
네트워크 분석을 위한 명령줄 도구  (0) 2008.06.22
RFC 2068 - Hypertext Transfer Protocol - HTTP/1.1  (0) 2008.06.22
국가별 IP 사용대역  (0) 2008.06.22
두개의 라인 사용시  (0) 2008.06.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크