Netlog
I. Introduction of netlog
-
Netlog는 TCP와 UDP의 트래픽을 모니터링할 수 있는 프로그램이다. 이 프로그램은
Texas A&M University 에서 개발한 네트웍 보완관련 툴로서 아래와 같은 4가지로
구성되어 있다. netlog 패키지는 SunOS 4.x와 SunOS 5.x(Solaris x)에서만
실행된다.
- netwatch
: 실시간 네트웍 모니터링을 하는 툴
- tcplogger
: 서브넷의 모든 TCP connections을 로그파일로 남기는 툴
- udplogger
: 서브넷의 모든 UDP sessions을 로그파일로 남기는 툴
- extract
: tcplogger와 udplogger로 만든 로그파일을 볼수있게 해주는 툴
I-I.Netlog에 사용된 특징
말그대로 netlog 패키지는 TCP/IP 커넥션이 일어나는 상황의 데이터그램 중에
인증되지 않은 사용자나 호스트로부터의 접속이 일어나거나, 특정 명령과 관계 된
접속이 일어날 경우 그 데이터그램을 분석하여 원하는 정보를 빼어내게 된다. 즉,
소스 IP어드레스와 해당 서비스면들을 모니터하게 되는 것이다. 즉, netwatch이든,
tcplogger이든, udplogger이든 모두 데이터그램으로부터 원하는 정보를 빼어낼 수
있게끔하는 루틴이 모두 필요하게 된다. 이 역할을 하는 루틴이 바로 pktfilt.c 에서 맡게 된다. 즉, 모든 프로그램이 위의
소스를 링크하여 적절한 스트럭쳐를 분석하게 된다. 소스레벨에서 궁금한 점이 있는
시스텀 관리자들은 아래의 파일들을 분석해보기 바란다.
$NETLOG_DIR/netwatch/pktfilt.c
$NETLOG_DIR/tcplogger/pktfilt.c
$NETLOG_DIR/udplogger/pktfilt.c
Netlog 도구의 pktfilt.c 은 telnet이나 ftp등의 TCP 패킷에서 userID와 passwd
부분에 해당하는 데이터는 필터링하지 못한다. 이를 보강한것이 sunsniffer등이다.
I-II.Netlog의 능력
Netlog패키지는 말 그대로 네트웍 상에서의 패키지의 전송을 모니터링하는 기능을
제공해 준다. 하지만, 막연히 데이터 패킷이 이리저리 옮겨다니는 현상만 있다면
그것은 시스템 관리자에게 아무런 도움을 주지 못하며, 엄청난 자원을 낭비하는
결과를 초래한다. 실제로 tcplogger프로그램을 약 10초간 돌렸을때 패킷을
모니터링한 파일은 약 5~10킬로바이트에 달한다. netlog가 꼭 필요하게 쓰이는
이유와 netlog도구가 등장하게 된 가장 큰 원인은 바로 'IP spoofing attack'
때문이다.즉, netlog패키지를 이용하여 'IP spoofing attack'과 'Hijacking
tool'이 이용되고 있는지 체크하기 위한 목적으로 개발 되었다.
IP spoofing이란 기존의 TCP/IP 프로토콜의 디자인 상의 문제점을 이용하여 타겟
호스트의 trusted호스트인 척 가장하여 타겟 호스트로의 침입을 성공시키는
침입방법 중의 하나이다.
I-III.Netlog의 양면성
Netlog패키지는 단순한 모니터링만 제공해 줄 뿐, 어떤 exploit한만한 대상이 되지
못한다. 즉 'ps -aux | grep netwatch'와 같은 수작업을 통하여 자신이 모니터되고
있는지 아닌지에 관한 정보만 intruder에게 제공해 줄 뿐이다. 예를 들어,
intruder가 kus.kaist.ac.kr에 계정을 갖고 있지만, IP spoofing을 통하여
attack을 시도하고자 할 경우, 'ps -aux | grep netwatch'등을 통하여
netwatch패키지가 동작중인지를 우선 알아본 다음 공격할 수 밖에 없는
것이다.
비록 netlog패키지를 이용하여 자신이 공격당할 우려는 없지만, netlog패키지의
신뢰도등을 자세히 살펴보고 신중한 분석이 필요하다고 판단된다. 왜냐하면,
netlog패키지는 말 그대로 Network log를 모니터할뿐이므로, 공격의 수단은 될 수
없지만, 굉장히 많은 로그파일을 남기므로 세밀히 분석해 보지 않는한 효과적으로
시스템을 방어할 수 없다. 예를 들어, netwatch를 이용하여 모니터하고있더라도,
smtp포트에 debug명령을 합법적인 사용자가 필요에 의하여 이를 사용하고 있을
수도 있지만, netwatch 프로그램이 이를 판별할 수는 없기 때문이다. netwatch의
결과를 통해 낯선 곳에서의 debug 명령 등이 나타난다면 이는 의심해 볼 수 있을
것이다.
하지만, network firewall의 신뢰도가 높아지고, 관리자들의 지식이 늘수록 IP
spoofing 과 같은 침입은 줄어들것으로 예상된다. 왜냐하면, IP spoofing의
원천적인 봉쇄 방법이 바로 filtering router의 설치를 이용한 firewall의
setup이기 때문이다. 그러나, TCP/IP 프로토콜 디자인이 변하지 않는 이상 IP
spoofing은 언제든지 일어날 수 있는 일이므로, 라우터 셋업(filtering
router)등의 과정을 거쳐 철저한 trusted 환경을 구축해야 할 것이다.
먼저 IP spoofing에 대한 지식이 있어야 netlog패키지의 중요성을 실감할 수 있을
것이다.
I-IV. Netlog의 결론
Netlog 패키지는 intruder로 부터 exploit될 만한 우려의 소지는 전혀없다.
하지만,웬만한 지식이 없는 시스템 관리자에게는 무용지물이나 다름이 없다. IP
spoofing등의 사전 지식을 필요로 하며 서브넷의 모든 커넥션을 로그파일에 남길
경우 자원의 낭비가 심할 수 있다.
Netlog 패키지의 방어용 소프트웨어로의 가장 최선의 전략은 무엇일까?
Netlog 패키지는 기본적으로 IP spoofing을 파악할 수 있다. 하지만, 앞서도
말했듯이 IP spoofing을 원천적으로 봉쇄할 수는 없다. IP spoofing attack이
시도되고 있다면, 즉시 시스템을 중단시키던지, 아니면 IP spoofing attack에
사용되는 TCP서비스를 찾아서 deamon을 죽이는 방법을 취해야 한다. Netlog는 또한
컴파일 시에 '$NETLOG_DIR/netwatch/monitors/lognames.h' 파일에 적절한 사용자
ID를 추가하여, 의심이 되는 사용자를 집중적으로 모니터할 수 있다. 기본적으로
lognames.h에 포함되어 있는 사용자들로는 'sybase, oracle, irc, bbs, anonymous,
info, ftp, guest, gopher'등이 있다.
이러한 lognames.h파일에 필요에 따라 사용자들을 추가하여 모니터하면 굉장히
유용한 기능을 발휘할 수 있다. 또한, '시간, 공격 서비스명, 공격시도 호스트,
타겟 호스트, 명령' 등으로 이루어진 출력물을 이용하여 분석력과 시스템 관리자의
자질을 기를 수 있다.
사용자 인터페이스의 개선과 help 기능의 추가를 통한 개량이 가능할 것으로
보인다. 또한 netlog패키지와 여러 관리 도구를 병합하여 시스템 파괴에 대한
증거를 잡아내는 유틸리티들을 만들 수 있을 것 같다.
II. Install netlog
-
netlog가 있는곳
ftp://net.tamu.edu/pub/security/TAMU/netlog-1.2.tar.gz
tcplogger와 udplogger는 SunOS 4.x Network Interface Tap (nit)를 사용하고,
또는 SunOS 5.x Data Link Provider Interface (DLPI)를 사용한다.
compile하기(README 읽어보세요 )
1) Makefile에서 SunOS 4.x 인지 SunOS 5.x (Solaris)인지 선택한다.
FLAGS=-DSUNOS4 (4.x)
FLAGS=-DSOLARIS (5.x)
RANLIB=ranlib (4.x)
RANLIB=echo (5.x)
LIBS=-lsocket -lnsl (5.x)
2) make라고 치면 된다.
3) 컴파일이 제대로 되었으면 $NETLOG_DIR/bin에 tcplogger, udplogger,
netwatch, extract이 있다.
4) $NETLOG_DIR/doc의 메뉴얼 페이지들을 /usr/man/man8 디렉토리로
복사한다.
III. use netlog tools
netlog패키지의 모든 툴들은 root만이 사용할 수 있다는 점을 명심하기
바란다.
- Netlog 패키지를 사용하여 외부로부터 자신의 도메인으로의 접속이 일어날
경우 'source IP'와 'destination IP'가 자신의 도메인에 해당하는 IP를 갖고
있다면 IP spoofing attack을 시도 하고 있는 경우이다. 즉, local domain이 아닌
외부에서 접속을 시도할 경우 적어도 데이터를 보내는 'source IP'는 같은 도메인이
아닌 외부의 도메인이 되어야 함에도 불구하고 자신이 속한 도메인 IP를 갖고
있다는 말은 여지없이 IP spoofing attack을 시도하고 있다고 밖에 볼 수 없다.
- 임의의 두 호스트의 로그파일을 조사하여 매치되지 않는 커넥션이 존재한다면,
IP spoofing의 가능성이 상당히 많다는 증거이다. 즉, 두 호스트간의 통신이
두절되었음을 뜻한다. IP spoofing을 위하여 과다한 패킷을 보내어 두 호스트간의
인증작업이 소실되었음을 뜻하기 때문에 의심의 여지가 있다는 말이 된다. (이 경우
문제될 수 있는 이유는 시스템의 부하가 심할 경우에 로그파일이 남지 ㅇ낳거나
패킷을 무시하는 경우가 생길 수 있기 때문에 IP spoofing을 단언할 수 없는
것이다.)
III-I. use netwatch
-
SYNONPSIS
netwatch [-u] [-i interface] [-f file] [-p] tcp_port_list
-
DESCRIPTION
netwatch는 ethernet network을 실시간 모니터링할 수 있게 한다.
-
OPTION
-i
TCP connection의 interface를 선택한다. 디폴트는 le0이다.
-f
출력할 화일 이름을 설정한다. 디폴트는 stdout이다.
-u
UDP패킷을 체크한다. 이것은 tftp, traffic, SunRPC traffic, FSP severs의
접속등을 체크한다. 만일 RPC traffic이 많을경우에는 사용하지
않는것이좋다.
-p
non-promiscuous모드로 실행한다.즉 서브넷의 모든 패킷을 검사하지 않고
자기 호스트로의 접속만을 모니터링한다.
- 크게 모니터할 수 있는 것들은 다음과 같다.
어떤 특정 계정의 login시도를 체크해준다.
rsh명령을 이용하여 타겟 호스트의 명령을 수행하는 과정을 체크한다.
smtp드라이버를 이용하여 타겟 호스트의 smtp포트로의 접속을 체크한다.
이외에 알 수 없는 프로토콜을 이용한 접속들을 체크한다.
- 여기서 'tcp_port_list'인수는 netwatch프로그램이 체크할 TCP서비스들을 설정해
두어야한다. telnet, ftp, rlogin, rsh, smtp등의 서비스들을 체크하며, telnet과
ftp의 경우 접속시도 호스트와 목적 호스트 모두에 관한 정보를 제공해 준다.
(이때, 각각의 TCP서비스들은 해당 포트에 항상 떠 있으므로, netwatch는 각각의
서비스들에 해당하는 포트만 스캔하게 된다. 모든 포트번호를 일일이 알 필요는
없으나, 해당하는 포트를 적어보면 다음과 같다.)
- TCP 서비스 사용하는 포트번호
telnet 23
smtp 25
rlogin 513
rsh 514
ftp 21
uucp 540
- rlogin
$NETLOG_DIR/netwatch/monitors/lognames.h파일에 설정된 사용자들에대한
rlogin접속에 관계된 자료들을 모니터한다. 간단한 lognames.h의 예를 들어 보기로
하자.
static char *names[] = {
"me", "lp", "bin", "daemon", "guest",
"demo", "sync", "uucp", "sys", "ftp",
"nobody", "news", "demos", "tutor",
"anonymous", "gopher", "netfind",
"info", "system", "user", "userp", "field",
"operator", "sybase", "oracle", "irc", "bbs",
"limx", "new", "chat", "super",
(char *)0
};
이곳에 해당하는 유저아이디를 설정하면 된다.
- rsh 마찬가지로 lognames.h파일에 설정된 사용자들의
shell을 리모트에서 사용하려할 때 모니터해 준다. 또한 'csh -bif'와 같은 접속도
모니터 한다.
참고: rsh hostname -l userID csh -bif를 이용하여 'tty'를 사용하지 않고
시스템을 이용할 수 있게 되므로, 자신을 감추려는 의도가 짙다. 때문에 이러한
사용자들을 통하여 시스템이 파괴당할 우려가 있으므로 netlog는 'csh -bif'와 같은
트웍 접속도 모니터 해준다.
- ftp FTP에 관련된 네트웍 트래픽을 체크한다. 즉,
anonymous FTP를 이용한 passwd파일이나 .rhosts파일 그리고 .forward파일의
전송등을 체크할 수 있다.
참고: ftp 서비스를 통하여 .rhosts 나 .forward 파일을 덮어쓰거나 하는
등의 작업을 통하여 시스템이 피해를 입을 수 있다. 때문에 netlog는 이러한 시도를
모니터 한다. 예를 들어, 우연찮게 'ftp>'프롬프트 상태로 연결된 터미널을
발견하였을 경우 .rhosts 파일의 내용을 '+ +'로 덮어쓴 후, 다음에 그 사용자로
rlogin 등의 접속을 할 수 있으므로 굉장히 주의해야 한다. 또한, anonymous ftp
셋업 상의 문제점의 경우도 굉장히 위험하다. 'anonymous ftp attack'에 관해서는
CERT advisory중 'CA93:10. anonymous FTP activity'를 참조하기 바란다.
- telnet 특정 사용자로의 telnet접속을
모니터한다.
- smtp 'smtp'드라이버를 이용하여 wiz, kill, debug
명령에 관계된 smtp접속을 모니터 한다.
참고: 가장 vulnarable한 sendmail버그를 이용한 침입에 쓰이는 명령어들이
바로 위의 wiz, kill, debug 명령들이다. 때문에 netlog는 이러한 시도를 모니터
해준다. sendmail에 관한 도큐먼트를 참조하기 바란다.
- EXAMPLE
아래는 sparcs.kaist.ac.kr에서 ara.kaist.ac.kr로 smtp접속을 행하여 debug명령을
수행하였을 경우를 보여준다.
아래는 sparcs에서 실행한것을 보여준다.
sparcs: ~ ]$ telnet ara smtp
Trying 143.248.8.5...
Connected to ara.kaist.ac.kr.
Escape character is '^]'.
220 ara.kaist.ac.kr ESMTP Sendmail 8.9.1a/8.9.1; Sun, 31 Jan 1999 00:03:06
+0900 (KST)
debug
500 Command unrecognized: "debug" sendmail bug가 패치되었음을
의미
quit
221 ara.kaist.ac.kr closing connection
Connection closed by foreign host.
sparcs: ~ ]$
아래는 ara에서 netwatch를 이용하여 실시간 모니터링한 결과를 보연둔다.
# ./netwatch telnet smtp telnet, smtp에 관한 모니터를 시작한다
Using interface le0
Added telnet
Added smtp
01/31/99 00:03:07 [smtp] sparcs.16914 ara cmd debug
모니터링의 결과는 (모니터된 날짜,시간, 접속서비스, 접속을 시도한 IP, Target
Host, 사용한 명령)으로 이루어 진다.
III-II. use tcplogger
- SYNONPSIS
tcplogger [-i if] [-a|-b] [-f file]
- DESCRIPTION
tcplogger는 네트웍의 TCP connection request를 log남기는
프로그램이다.tcplogger는 현제 SunOS 4.x/5.x 에서만 실행된다.
-
OPTIONS
-i
TCP connection을 받아들이는 인터페이스를 선택할 수 있다. 이것은
기본적으로 첫번째( le0 )를 사용한다.
-a
ASCII로 로그한 결과를 남긴다.
-b
extract를 사용하여 볼수 있도록 binary로 로그를 남긴다.
format형식은 다음과 같다.
struct timeval tm; /* Time of request */
u_long ipsrcaddr; /* IP source address */
u_long ipdstaddr; /* IP destination address */
u_long tcpseqno; /* TCP sequence number */
u_short tcpsrcport;/* TCP source port */
u_short tcpdstport;/* TCP destination port */
-f
실행한 결과를 출력할 파일을 지정한다. 파일은 appending된다. 만일
지정하지 않으면 기본적으로 stdout으로 지정된다.
-n
hostname이나 port name으로 출력하지 않고, decimal 이나 dotted decimal
포맷으로 출력한다.
-p
non-promiscuous 모드로 실행한다. 이것은 subnet의 모든 태킷을 로그로
남기지 않고 자신의 호스트에 관한 것만 로그남긴다.
-
BUGS
내트웍이 바쁘거나, 기계가 느리거나 하면 패킷이 드롭될수도 있다.
-
EXAMPLE
# tcplogger -a
12/20/98 00:33:09 890F9A beast.kaist.ac.kr 1208 -> alpha.kaist.ac.kr
nntp
12/20/98 00:33:15 969E9D3 143.248.8.66 2201 -> noah.kaist.ac.kr
telnet
12/20/98 00:33:17 11C636 143.248.184.144 1083 -> ara
telnet
12/20/98 00:33:21 B29B0A2 143.248.8.67 2571 -> 203.234.207.3
80
12/20/98 00:33:26 B29C34B 143.248.8.67 2572 -> 203.234.207.3
80
12/20/98 00:33:26 B29C353 143.248.8.67 2573 -> 203.234.207.3
80
12/20/98 00:33:26 B29C436 143.248.8.67 2574 -> 203.234.207.3
80
12/20/98 00:33:28 C5C45B6A 203.116.61.132 38270 -> sparcs
80
# tcplogger -b -f tcp.log
# extract -d tcp.log
12/20/98 00:34:32 999658DC smslab.kaist.ac.kr 1022 -> ara
login
III-III. use udplogger
-
SYNONPSIS
udplogger [-i if] [-a|-b] [-f file] [-n] [-t ###] [-p]
-
DESCRIPTION
udplogger가하는 일은 tpclogger가 하는일과 거의 비슷하다.
-
OPTIONS
-t udp session이 이루어 진후 얼마간 아무런 패킷이 전송되지 않을 경우
정지시키는 일을 한다. 기본적으로 300초로 세팅되어 있다.
나머지 option은 tcp와 거의 동일하다.
-
EXAMPLE
# udplogger -a
12/20/98 00:35:32 0 ohjaeho.kaist.ac.kr 138 -> 143.248.8.255
138
12/20/98 00:35:32 0 sparcs 1031 -> cosmos.kaist.ac.kr
domain
12/20/98 00:35:32 0 sparcs domain -> ara
3210
12/20/98 00:35:32 0 sparcs 1031 -> ns
domain
12/20/98 00:35:32 0 worak.kaist.ac.kr domain -> ara
3210
12/20/98 00:35:32 0 sparcs domain -> ara
3211
12/20/98 00:35:32 0 sparcs domain -> ara
3212
12/20/98 00:35:32 0 worak.kaist.ac.kr domain -> ara
3206
12/20/98 00:35:33 0 sparcs domain -> ara
3213
12/20/98 00:35:33 0 sparcs domain -> ara
3214
12/20/98 00:35:33 0 sparcs domain -> ara
3215
12/20/98 00:35:33 0 sparcs domain -> ara
3216
12/20/98 00:35:36 0 sparcs-gw.kaist.ac.kr route -> 143.248.8.255
route
III-IV. use extract
-
SYNOPSIS
extract [ -e program ] [ -E program ] [ -f program file ] [ -F program
file ] [ -d log file ] [ -o output file ] [ -a ] [ -b ] [ -n ] [-u ]
[ -t ] [ -h]
-
DESCRIPTION
extract는 tcplogger나 udplogger로 만든 binary로그 파일을 풀어주는
프로그램이다.
-
OPTIONS
-e program
-E program
-f program file
-F program file
-e, -f, -E, -F옵션은 모두다 파일을 선택하는 것이다. -e, -f 는
appended하고, -E, -F는 prepended한다.
-d log file
tcplogger, udplogger의 binary로그 파일을 선택한다. 기본적으로
stdin으로 세팅되어 있다.
-o output file
어떻게 출력할지 선택한다. stdout으로 세팅되어 있다.
-a
선택된 레코드를 ASCII로 쓴다. 이것은 디폴트이다.
-b
선택된 레코드를 binary로 쓴다. subsequent를 extract로 reprocessing하기
위해서 사용된다.
레코드의 포맷형식은 다음과 같다.
struct timeval tm; /* Time of request */
u_long ipsrcaddr; /* IP source address */
u_long ipdstaddr; /* IP destination address */
u_long tcpseqno; /* TCP sequence number */
u_short tcpsrcport;/* TCP source port */
u_short tcpdstport;/* TCP destination port */
-n
ASCII로 출력할때 IP address 나 포트넘버등을 찾지 않는다.이것은 꽤
빠르다.
-t
TCP 모드에서 extract가 작동하도록 한다. TCP mode가 디폴트이다.
-u
UDP 모드에서 extract가 작동하도록 한다.
-U
input buffering을 하지 않는다. 이것은 tcplogger, udplogger 등을
pipe를 이용해서 읽을수 있다.
-h
help message를 출력한다.
IV. link about netlog
V. Referance
- README
- netlog man page
- KUS Security Bulletin - How to Netlog, 박창민
Copyright
1998 anticj SPARCS all right reserved
LastUpDated at 1999.01.31