Search Results for 'Hacking'


9 posts related to 'Hacking'

  1. 2006/09/08 원격 로그 서버 만들기 완벽 가이드 (12)
  2. 2006/09/08 ARP와 네트워크 보안 (11)
  3. 2006/09/08 chkconfig 사용법 (11)
  4. 2006/09/08 rootkit (12)
  5. 2006/09/08 시스템 공격점검을 통한 보안 개선 방안 (9)
  6. 2006/09/08 최신 웹 해킹에 대응하는 방법 (11)
  7. 2006/09/08 Ethernet 보안 + DHCP 등등 (12)
  8. 2006/09/08 전산망 해킹 침해사고시 어떻게 처리하나 (12)
  9. 2006/09/08 웹해킹 모음. (11)
출처 블로그 > 불행한 바보
원본 http://blog.naver.com/deepinheart/20000824189
원격 로그 서버 만들기 완벽 가이드

좀 오래된 문서이기는 하나 괜찮은 문서 같아서 올려 봅니다.
좀 오랫된 문서라서 설치 설명에 사용되는 명령어나 패키지들의 버전이 낮지만 설정하는데에는 크게 문제가 되지 않을 겁니다.
이문서를 토대로 혹 최신 버전에서 설치를 하시는 분들은 성공기/체험기나 제가 메일을 주시면 해당 성공기를 올려 드리도록 하겠습니다.

원격 로그 서버 만들기 완벽 가이드
(Complete Reference Guide to Creating a Remote Log Server)

번역 : 이국현 (errai@hitel.net)
영문원문링크:http://www.linuxsecurity.com/feature_stories/remote_logserver-1.html
한글원문링크:http://www.linuxlab.co.kr/docs/01-01-1.htm

이 문서는 Eric Hines에 의해 쓰여진 것으로, 원격 로그서버를 만들기 위한 자세한 설명과 설정방법등을 다룰 것이다.

소개(INTRODUCTOIN)
우선 본 문서에서 언급하고 있는 유틸리티들의 README 화일들에 대해서 열심히 공부해 볼 것을 권한다. 그리고 문서를 읽다 보면 나오는 단어 중 SERVER는 원격 머신(CLIENTS)들로부터 log를 받도록 설정되어진 컴퓨터이고, CLIENT는 원격 로그 서버(REMOTE LOG SERVER)에게 log를 보내도록 설정 되어진 컴퓨터임을 나타낸다.

A. 원격 로그 서버란 무엇인가?(WHAT IS A REMOTE LOG SERVER)
원격 로그서버는 다른 시스템들의 log들을 저장할 하드 드라이브 공간을 제공하도록 미리 설정되어진 시스템일 뿐 그 이상도 이하도 아니다.
이 시스템은 완벽한 보안으로 차단되어 있어야만 한다. 모든 RPC 데몬들이나 다른 기타 서비스들도 암호화되지 않고서는 절대 접근이 허락되지 않는다. 데이타들은 오직 UDP/Port 514 번을 통해서만 전송이 허락된다.
로그서버에 대한 자세한 설정 및 설치등에 대해서 하나씩 하나씩 접근해 보기로 하자.
([역자주] : UDP port 514번은 syslog가 사용하고 있다)

B. SYSLOGD
syslogd의 재 컴파일(Recompiling syslogd)

여러분 컴퓨터에서 원격으로 로그를 남기는 능력을 작동시키기 위해서 첫번째로 할 일은 syslogd의 재 컴파일이다. 이것은 보안상의 이유로써 syslog.conf 화일이 아닌 다른 화일을 읽도록 하기 위함이다. 자세한 내용은 나중에 다루겠다.

NOTES : 이 아이디어는 Lance Spitzner가 쓴 "To Build a Honeypot"이란 whitepaper를 통해 얻게 되었다. 보안 공동체를 위해 공헌을 한 Lance에게 감사의 말을 전한다.
이 뛰어난 아이디어는 침입자가 이 시스템에는 원격 로그를 남기는 기능이 없다고 착각하게 만드는 것이다. 이전에 사용한 /etc/syslog.conf 화일을 남겨놓음으로써 예기치 못한 크래커를 속이는데 도움을 줄 것이다.

STEP 1 : 새로운 버젼으로 컴파일하기 (COMPILING OUR NEW VERSION)
우선 여러분의 운영체제에는 기본적으로 syslogd가 설치되어 있을 것이고 소스코드는 함께 들어있지 않을 것이다. 여러분은 우선 RedHat 이나 Joey's FTP site(syslogd의 개발자)를 통해 소스 코드를 다운로드 받아야 한다. 여러분의 배포판에서 소스 코드를 제공하지 않는다면 오픈 소스 정책에 위반되는 것이다. 그러므로 아래의 링크에서 소스를 다운받길 원하지 않는다면 여러분의 OS vender에서 소스코드를 얻기 바란다. 

SITE 1:ftp://ftp.infodrom.north.de/pub/people/joey/sysklogd/
혹은
SITE 2:ftp://ftp.sourceforge.net/pub/mirrors/redhat/redhat/redhat-6.2/SRPMS/SRPMS/sysklogd-1.3.31-16.src.rpm

만약 RedHat계열의 사용자일 때 rpm-iv-vsysklogd-1.3.31-16.src.rpm 라고 실행한다면 /usr/src/redhat/SOURCES/sysklogd-1.3-31 에 인스톨 될 것이다.

STEP 2 : 기본 설정 화일 위치 변경하기(CHANGING THE DEFAULT CONFIG FILE LOCATION)
여기는 재미있는 부분이다. 이것은 침입자가 여러분의 log화일이 local에 저장된다고 생각하게끔 속인다. 우리는 syslogd가 다른 설정 화일을 읽도록 재컴파일을 할 것이다. 기본으로 설정되어있는 옛 화일은 침입자가 원격 로그가 기록되는지 cat 등을 실행해서 /etc/syslog.conf를 들여다 보았을 때 속일 수 있을 것이다. 재컴파일해서 새로운 바이너리를 얻더라도 옛 설정화일은 남겨놓도록 하자.

기본 설정인 /etc/syslog.conf 를 고친다.

[ehines@myhost sysklogd-1.3-31]$ cd /usr/src/redhat/SOURCES/sysklogd-1.3-31
[ehines@myhost sysklogd-1.3-31]$ vi syslogd.c

syslog.conf 부분을 찾는다.
#define _PATH_LOGCONF   "/etc/syslog.conf"

이제 여러분이 원하는데로 설정 값을 고치면 된다. 여러분은 /etc/.sys/CORE.conf 같이 독창적으로 설정하기 바란다.
새로운 syslogd 바이너리가 생겼다면 이전 것 위에 덮어쓴다.
(대부분은 /sbin/syslogd)이 부분을 실행하기 전에 옛날 버젼은 백업 해두자. 관리자라면 이미 알고 있겠지만, 그렇죠?  :)

NOTES : 간단하게 예전 syslogd를 가지고 (-f 설정화일)형식으로 실행하지 않은 이유는, 침입자가 ps 등으로 프로세스 리스트를 볼 경우 뒤에 붙은 옵션들이 다 보여서 설정화일을 무엇으로 바꾸었는지 다 알게 될 것이다.
그러므로 이와 같은 형식으로 하는게 좋다. 필자는 /etc/syslog.conf 파일을 교묘하게 놔두고, 재컴파일을 통해 설정화일을 바꾸는 것을 추천한다.
그리고 위치만 변경하고 이름은 그대로 두는 것은 위험하다.
간단하게 find / -name "syslog.conf" 로 찾아낼 수 있다.

STEP 3 : 진짜 syslog 설정화일 고치기(MODIFY THE (REAL) SYSLOG CONFIG FILE)
예를 들어, 다음의 syslog.conf 는 모든 메세지를 원격 호스트로 포워딩 하는 것이다.

# 간단하게 모든 메세지를 원격 호스트로 포워딩.
*.*            @hostname

# 모든 커널 메세지를 원격 호스트로 포워딩.
kern.*         @hostname

# 로컬에도 기록하면서 원격으로도 기록을 남김 (실패할 경우 대비)
kern.crit                    @finlandia
kern.crit                    /dev/console

기타등등 여러분이 원하는데로 모든 로그화일을 설정한다.

C. THE CLIENT ( REMOTE LOG SERVER )
클라이언트 서버(혹은 모든 원격 로그들을 수용하는 컴퓨터)는 원격 로그를 남기기 위해서 syslogd에 -r 스위치를 줘서 실행시켜야 한다.  그리고 /etc/services화일에 syslog 514/udp 가 적혀져 있어야 한다.

D. 원격 로그 서버 차단하기(LOCKING DOWN THE REMOTE LOG SERVER)
모든 로그들을 받아들이는 컴퓨터는 완벽하게 외부와 차단되어 있어야 한다.

1. 모든 서비스 종료시키기 (Turn off(ALL SERVICES))

이 컴퓨터는 오직 로그 서버일 뿐이므로 다른 서비스들을 실행시킬 필요가 없다. 다음과 같이 실행한다.

[root@myhost /etc]# cd /etc
[root@myhost /etc]# vi inetd.conf

1) 모든 INETD 서비스 종료시키기 (TURN OFF ALL INETD SERVICES)

여러분은 이 화일에서 '#' 를 추가시킴으로써 주석으로 처리를 할 것이
다. 아래의 모든 서비스들을 주석처리하기 바란다.

a. echo
b. discard
c. daytime
d. chargen
e. time
f. ftp
g. telnet
h. shell
i. login
j. exec
k. comsat
l. talk
m. ntalk
n. dtalk
o. pop-2
p. pop-3
q. imap
r. uucp
s. tftp
t. bootps
u. finger
v. cfinger
w. systat
x. netstat
y. auth
z. linuxconf
zz. swat

2) 모든 RPC 서비스 종료시키기 (DISABLE ALL RPC SERVICES)

[root@myhost /etc]# cd /etc/rc.d

디렉토리를 살펴보면 대문자 "S"로 시작하는 화일들이 보일 것이다. 이것은 시스템이 부팅할 때 시작되는 서비스들이다. 여러분은 mv 명령어를 이용해서 소문자 s로 바꿔주면 된다. 예를 들어 mv S11portmap s11portmap 이라고 해주면 부트 타임때 portmapper 를 시작하지 않게 된다.

아마도 nfslock, apmd, netfs, identd, autofs, portmap, atd, pcmcia 와 isdn, sendmail, gpm, httpd, vmware, xfs,linuxconf, local 같은 서비스들을 꺼주면 될 것이다. rc0.d 에서부터 rc6.d 까지 다 종료시켜 주어야 한다.

2. 계정 삭제(DISABLE ACCOUNTS)

[root@myhost /etc]# vi /etc/passwd

여러분의 패스워드 화일에서 사용하지 않는 계정을 삭제해야 한다. 필자는 /bin/noshell(http://www.
cerias.purdue.edu/coast/archive/data/categ50.html)라는 툴을 다운받을 것을 제안한다.
이것은 계정을 추가하거나 삭제할 때 관리자에게 유용한 프로그램이다.

3. SSH의 설치 (INSTALL SSH)

telnet을 사용하면 sniffing 당할 위험이 있다. 하지만 우리에겐 GNU 오픈소스 공동체의 산물인 OpenSSH이 있다. 자 이제 OpenSSH를 설치해보자.

1) OPENSSH 다운로드 받기 (DOWNLOADING OPENSSH)

여러분의 웹브라우져로 www.openssh.com에 접속한다. 이문서가 쓰여질 때 최신버젼은 version 2.1.1로 SSH1과 SSH2 프로토콜을 둘 다 지원한다. 소스를 다운받고 다음과 같이 한다.

[root@myhost ]# gzip -d openssh-2.1.1p2.tar.gz
[root@myhost ]# tar -xvf openssh-2.1.1p2.tar

모든 사항을 똑같이 할 수는 없을 것이다. 계속 진행하기 전에 INSTALL 화일을 꼭 읽어보기 바란다. 필자는 여러분 각각 시스템이 요구하는 사항까지 이야기 해 줄 수 없다. 이것은 단지 필자의 인스톨을 여러분이 지켜보는 것 일 뿐이다.
우선 Zlib와 OpenSSL을 인스톨을 해야 한다. 

Zlib: http://www.freesoftware.com/pub/infozip/zlib/
OpenSSL 0.9.5a or greater:
http://www.openssl.org/

RPM버젼의 OpenSSL은
http://violet.ibs.com.au/openssh/files/support

GNUmake가 설치되어 있다면 다음과 같이 하면 설치가 될 것이다.

[root@myhost ]# ./configure && make && make install

만약 PAM을 사용한다면 /etc/pam.d/sshd 과 같은 PAM control file도 필요로 할 것이다. 일반적으로는 conrtib/sshd.pam.generic 에 포함하고 있다. 사용하기 전에 여러분의 시스템에 맞게 편집해야 할 것이다. 만약 레
드햇 리눅스 6.2를 사용한다면 contrib/redhat/sshd.pam 이 더 유용할 것이다.
필자는 configure 할 때 --without-pam으로 PAM 지원을 끄는 것을 좋아한다. 만약 발견된다면 PAM은 자동적으로 스위치가 켜질 것이다.
--without-pam 옵션은 대신에 RSA 인증을 사용할 경우에 사용된다.

[root@myhost ]# tar -xvf zlib.tar
[root@myhost ]# cd zlib-1.1.3
[root@myhost zlib-1.1.3]# ./configure && make && make install

설치도중에러가 발생한다면 미안하지만 README 화일을 읽기 바란다. 필자는 에러가 발생하면 README 화일들에서 error에 관련된 사항을 찾아보곤 한다.

OpenSSL을 인스톨 하기 위해서는 다음과 같은 것이 필요하다.
    *  Perl 5
    *  an ANSI C compiler
    *  a supported Unix operating system

[root@myhost ]# tar -xvf openssl-0.9.5a.tar
[root@myhost ]# ./config && make && make test && make install

이제 OpenSSH를 설치한다.

[root@myhost ]# cd openssh-2.1.1p2
[root@myhost ]# ./configure --without-PAM && make && make install

성공적으로 OpenSSH를 컴파일 했다면 다음과 같은 메세지를 보게 된다.
Key generation complete.
Your identification has been saved in /usr/local/etc/ssh _host_key.
Your public key has been saved in /usr/local/etc/ssh _host_key.pub.
The key fingerprint is:
d5:74:83:d0:3f:c4:b4:d6:c5:39:1d:94:ee:9b:a8:61 root
@soc1.priv.nuasis.com
Generating DSA parameter and key.
Your identification has been saved in /usr/local/etc/ssh
_host_dsa_key.
Your public key has been saved in /usr/local/etc/ssh
_host_dsa_key.pub.
The key fingerprint is:
ed:58:65:b9:8b:fe:05:81:c2:8c:06:c9:cb:ac:bb:e6 root
@soc1.priv.nuasis.com

2) OPENSSH의 설정 (CONFIGURING OPENSSH)

기본적으로 설정되어진 것을 사용하더라도 나중에 변경할 때를 대비해서라도 ssh config화일을 봐두자. 설정화일
은 /usr/local/etc/ssh_config, /usr/local/etc/sshd _config 가 있다.
설치가 끝난 후에는 host key와 DSA key가 생성될 것이다.

여러분은 SSH 배포판의 문서를 참조해서 설정을 하기 바란다.

4. 방화벽 (THE FIREWALL)

패킷 필터링은 여러분의 시스템에 어떤 취약점이 발견되지 전까지는 필요하지 않을 것이다. syslog port(514/udp)를 필터링 하는 이유는 syslog server가 쓰레기 값을 전송했을 때 멈출 수 없기 때문이다. 그러나 더 중요한 것은 udp값이 쉽게 spoof될 수 있게 때문이다.
이것은 적어도 여러분이 여러 대의 컴퓨터에서 모든 로그가 하나의 인터페이스로 들어올 때 여러분이 외부로부터 들어오는 모든 것을 안전하게 필터링 하게 해준다.

아래는 리눅스 머신에서 ipchains를 이용한 쉘 스크립트이다.

#!/bin/sh

PATH=/usr/sbin:/sbin:/bin:/usr/sbin

LOCAL_INTERFACE="192.168.1.1/32"
# put your real IP address
LOCAL_NETWORK="192.168.1.0/24"
# put your  local net IP address/mask here
SSH_PERMITTED="192.168.1.2/32 192.168.2.3/32"
# who allowed to ssh
SYSLOG_PERMITTED="192.168.1.5/32 192.168.5.2/32"
# who allowed to log syslog messages

# deny everything
ipchains -P input DENY
ipchains -P output DENY
ipchains -P forward DENY
ipchains -F

#permit ssh
for ipaddr in $SSH_PERMITTED;
do
ipchains -A input -p tcp -s $ipaddr -d 0/0 22 -i $LOCAL_INTERFACE -j
ACCEPT
done

# permit outgoing tcp
ipchains -A output -p tcp -i $LOCAL_INTERFACE -j ACCEPT
ipchains -A input -p tcp ! -y -i $LOCAL_INTERFACE -j ACCEPT

# permit syslog
for ipaddr in $SYSLOG_PERMITTED;
do
ipchains -A input -p udp -s $ipaddr -d $LOCAL_INTERFACE 514 -i \
$LOCAL_INTERFACE -j ACCEPT
done
# if you would like to log all the other connection
#attempts, uncommend these...
#ipchains -A input -p tcp -i $LOCAL_INTERFACE -l -j DENY
#ipchains -A input -p udp -i $LOCAL_INTERFACE -l -j DENY
#ipchains -A input -p icmp -i $LOCAL_INTERFACE -l -j DENY

만약 IP filter 패키지를 이용한다면 대체로 다음과 같을 것이다.
# close everything on local interface
# block in all on le0 from any to any

# pass secureshell
pass in on le0 proto tcp from 192.168.1.2/32 to 192.168.1.1/32 port= 22
pass out on le0 proto tcp from 192.168.1.2/32 to 192.168.1.1/32 port = 22

# or you can replace these two rules with
#pass in on le0 proto tcp from 192.168.1.2/32 to
#192.168.1.1/32 port = 22 keep state
#pass SYSLOG
pass in on le0 proto udp from 192.168.1.2/32 to 192.168.1.1/32 port = 514

5. LOG REPORTING

아무리 좋은 원격 로그 서버를 만들어놔도 여러분이 직접 모니터링 할 수 없으면 무용지물이다. 필자는 다음과 같은 유틸리티를 추천한다.
  *   Logcheck - www.psionic.com
  *   Swatch - www.swatch.org

아래는 간단한 쉘 스크립트(Mr. Bill Pennington)이다. 이것은 매 일/시간/분 로그화일들을 지정된 이름과 장소에 보관한다.

#!/bin/bash
#Simple script to rotate the log files on a daily basis
#Bill Pennington 1/19/2000

#Set the date variable
date=`date +%m-%d-%Y`

#Rename the messages file
mv /var/log/messages /var/log/messages.$date
#HUP the syslog daemon so it writes to a new file
killall -HUP syslogd

#Compress the file
/bin/gzip /var/log/messages.$date
#Rename the secure file
mv /var/log/secure /var/log/secure.$date

#HUP the syslog daemon so it writes to a new file
killall -HUP syslogd

#Compress the file
/bin/gzip /var/log/secure.$date

#Rename mail file
mv /var/log/maillog /var/log/maillog.$date

#HUP the syslog daemon so it writes to a new file
killall -HUP syslogd

#Compress the file
/bin/gzip /var/log/maillog.$date

#Then scp them somewhere

6. 시간 (TIME)

서버는 언제나 정확한 시간과 날짜를 가지고 있어야 한다.  xntpd를 설치한 후에 "ntpdate timeservername"이란 명령을 하루에 적어도 한번정도 실행시켜 줘야 한다.
필자는 하루에 두 번 씩 이 작업을 시킨다. 물론 여러분이 가진 모든 서버에 해야 한다.

7. 다른 SYSLOG 장치 (OTHER SYSLOG DEVICES)

여기에 syslog가 기록하는 것을 설정할 수 있는 CISCO와 같은 다른 장치들이 있다. 여러분의 네트워크와 서버에서 정확한 값을 얻기 위해서는 syslog에서 기록하는 것을 위해 여러분의 모든 장치를 설정해야 한다.

Cisco
모든 Cisco 장치들은 syslog를 지원한다. 아래에 몇 가지 예제가 있지만 직접 여러분의 Cisco 문서를 확인해보기 바란다.

Routers
    In config mode...

    logging <server ip address or name>
    logging facility <facility> defaults to LOCAL7

Pix Firewall
    In config mode... logging host <ip address of syslog server>
logging facility
    <facility> defaults to LOCAL4 logging trap <level> from
    emergencies to debug , be carefull with debug you will get a
ton of traffic!

Switches
    In config mode...

    set logging server enable
    set logging server <ip address of log server>
    set logging session enable
    set logging level all 1 default

Windows NT
여러분은 NT server로 syslog server로 특정작업을 포워딩 시킬 수 있다.
이와 관련된 여러 개의 shareware /freeware  패키지가 있다.
http://www.bhs.com 에서 syslog를 검색해보라.

E. RESOURCES
   * Swatch - http://www.stanford.edu/~atkins/swatch/
   * OpenSSH - http://www.openssh.com
   * LogCheck - http://www.psionic.com/abacus/logcheck/
   * xntp and list of public NTP servers -
http://www.eecis.udel.edu/~ntp/
   * Cisco - http://www.cisco.com
   * Windows NT software - http://www.bhs.com
   * Robert Graham's sniffing FAQ (hints to build `receive-only
device'
      http://www.robertgraham.com/pubs/sniffing-faq.html
   * IP Filter - TCP/IP filtering package:
http://coombs.anu.edu.au/~avalon/

F. 역자 주

개인적으로 판단해서 꼭 필요하지 않다고 하는 내용은 삭제 또는 변경하였습니다. 필자(Eric Hines)가 언급한 번역되지 않은 내용은 원문을 참조하시기 바랍니다. :)

2006/09/08 23:32 2006/09/08 23:32

ARP와 네트워크 보안

Hacking 2006/09/08 22:43
출처 블로그 > ♡ 나의 라임 오렌지 나무 ♡━˚
원본 http://blog.naver.com/joan7636/120012356815

네트워크 통신의 비밀 ARP
웹브라우저를 띄운 후 아무 생각없이 접속하는 도메인 예 이지만 실제로 이 ( :www.tt.co.kr)
도메인 네임은 내부적으로 에 의해 주소로 바뀌어 로 접속이 되는 것이다 과연 DNS IP IP .
그것이 다인가 그렇지 않다 실제로 요청은 다시 라는 프로토콜에 의해 주 ? . IP ARP MAC
소라는 하드웨어 주소로 변경된 후 접속이 되는 것이다 이 과정은 그리 복잡하지는 않지만 .
이 과정을 제대로 이해하지 않고서는 네트워크 보안 을 이야기 할 수 없을 정도로 많은 것 “ ”
들을 놓치게 된다 실제로 를 이용한 해킹은 그리 낯선 방법도 어려운 방법도 아니다 . ARP .
이번 호에서는 많은 사람들이 그 중요성을 놓치고 있는 구간에서의 통신 프로토콜인 LAN
와 이와 관련하여 숨겨져 있는 재미있는 사실들에 대해 알아보도록 하자 ARP .
오늘과내일 넷센터 홍석범(antihong@tt.co.kr)
과 WAN LAN
흔히들 일상적인 네트워크 구간을 크게 구간과 WAN(Wide Area Network) LAN(Local
구간으로 나눈다 흔히 이러한 과 구간을 나누는 장비로는 게이 Area Network) . WAN LAN
트웨이 역할을 하는 라우터가 담당하는데 혹시 라우터라는 장비를 보신 분들도 있을지 모 ,
르겠지만 라우터라는 장비를 보면 적게는 두 개에서 많게는 몇 십개까지의 많은 인터페이스
랜카드 로 이루어져 있는 것을 볼 수 있을 것이다 이 인터페이스들은 담당하는 역할에 따 ( ) .
라 구간을 담당하는 시리얼 인터페이스와 구간을 담당하는 이더넷 WAN (Serial) LAN
인터페이스로 나눌 수 있다 따라서 흔히들 구간을 시리얼 구간 (Ethernet) . WAN , LAN
구간을 이더넷 구간이라 부르기도 한다 구간에서는 라우터와 라우터간에 서로 약속 . WAN
한 라우팅 프로토콜을 이용해 통신을 하게 되는데 이를테면 전세계적으로 간에 연동시 ,( ISP
에는 라는 프로토콜을 이용하여 연동한다 이에 대해서는 홈페이지등 라우팅 BGP . CISCO
관련 서적을 참고하기 바란다 그렇다면 구간에서는 어떤 프로토콜을 이용하여 서로 .) LAN
통신하게 될까 그렇다 바로 이다 ? . ARP . “ ”
ARP
는 의 약자로서 마치 가 도메인 주소를 주소 ARP Address Resolution Protocol DNS IP
로 바꾸어주는 것처럼 주소를 주소로 변환해 주는 프로토 IP MAC(Media Access Control)
콜이다 그렇다면 주소는 또 무엇인가 주소는 각 이더넷 카드마다 유일한 하드 . MAC ? MAC
웨어 주소로서 이 정보는 리눅스의 경우 로 윈도우즈의 경우 로 확 ifconfig , ipconfig /all
인할 수 있다.
는 일반 유저들에게는 그리 친숙하지 않은 단어이지만 이 프로토콜은 로컬 네트워크의 ARP
매우 중요한 규약이며 를 이해하여야만이 네트워크의 보안을 설명할 수 있을 정도로 ARP
반드시 숙지하여야 할 중요한 프로토콜이다.
와 DNS ARP
를 쉽게 이해하기 위해 아래 그림과 같이 자신의 에서 인터넷을 접속하는 경로를 생 ARP PC
각해 보자 자신의 에서 브라우저를 실행하여 을 입력한 후 엔터를 치면 . PC www.tt.co.kr
해당 도메인의 웹 페이지가 접속이 된다 너무 당연한 것 같은 이 절차는 실제로 어떠한 경 .
로를 통해 접속이 되는 것일까 다소 지루할 지 모르겠지만 전체 네트워크를 이해하기 위해 ?
처음 과정부터 거슬러 올라가 보도록 하자.
자신의 브라우저에서 도메인명을 입력하면 이 요구는 제일 먼저 자신의 에서 설정한 PC
서버 이 서버를 편의상 라 하자 로 가게 된다 서버는 DNS ( DNS Client DNS .) . Client DNS
의 요구 도메인을 주소로 변환 를 받아 자신 스스로가 위임 권 www.tt.co.kr Resolving ( IP )
한이 있는지 즉 자신의 파일에 질의한 도메인이 정의되어 있는지 여부를 ( , /etc/named.conf )
확인하여 없을 경우에는 질의한 도메인에 대한 캐싱이 있는지 여부를 확인하고 있을 경우 ,
바로 해당 정보를 넘겨주지만 없을 경우에는 소위 서버라는 최상위 서버에 질의 root DNS
를 하게 된다 일반적으로 웹 접속시 이라고 입력하지만 실제로 엄격히 . http://www.tt.co.kr
이야기한다면 와 같이 주소의 제일 끝에 을 붙이는 것이 맞는 것이 http://www.tt.co.kr. .
다 여기에서 주소 제일 끝에 있는 을 서버로 부른다 서버는 전 세계적으로 . . root . root 13
개가 있으며 만약 서버에 장애가 생기면 전 세계의 인터넷은 마비가 되고 말 것이다 root .
여하튼 질의를 받은 서버는 질의한 도메인의 주소가 인 것을 보고 을 관장하는 root .kr .kr
서버는 한국 전산원의 서버라는 답을 해 주고 이 답을 받은 서버는 DNS DNS Client DNS
한국 전산원의 서버에 다시 을 질의하게 된다 이 질의를 받은 한국 전 DNS www.tt.co.kr .
산원의 서버는 질의한 도메인이 인 것을 보고 이번에는 을 관장하는 DNS .co.kr co.kr
서버에 다시 질의하라고 응답하고 이 응답을 받은 서버는 다시 을 DNS , Client DNS co.kr
관장하는 서버에 을 질의하게 된다 이 질의를 받은 서버는 DNS www.tt.co.kr . DNS
을 보고 이 도메인을 관장하는 서버는 이라는 것을 알려주게 되고 tt.co.kr DNS ns1.tt.co.kr
이 응답을 받은 서버는 최종적으로 에게 을 질의하여 Client DNS ns1.tt.co.kr www.tt.co.kr
이라는 주소를 알게 되어 이 주소를 요청한 에게 알려주게 된다 211.47.65.1 IP PC .
참고로 이와 같이 서버부터 시작해서 위임 권한이 있는 각 서버로 내려오면서 root DNS
반복적인 질의를 하는 방법을 이라 한다 recursion .
그림 의 예 < 1> DNS recursion
서버로부터 주소를 받은 는 자신의 라우팅 정보에 따라 이 요구를 에 Client DNS IP PC PC
설정되어 있는 게이트웨이 즉 라우터로 넘긴다 이 요청을 받은 라우터는 라우터 자신의 , .
라우팅 프로토콜에 따라 가장 최적화된 비용이 적은 여러 라우터를 경유하여 접속하려는 ( )
서버가 위치한 최종 라우터까지 다다르게 된다 이 경로는 자신의 윈도우즈 의 경우 도 . PC
스 프럼프트에서 목적지 나 리눅스등의 유닉스 계열의 서버일 경우 tracert -d “ ”
목적지 로 확인할 수 있다 "traceroute -n " .
내부 네트워크에서의 통신원리
이제 해당 서버가 있는 라우터에서부터는 구간이므로 앞에서 이야기한대로 가 LAN ARP
작동하게 된다 이 부분을 아래와 같이 간단히 도식화하였고 라우터 하단에는 아래와 같이 .
각각의 주소에 해당하는 주소가 각각 IP MAC 192.168.1.1(AA:AA), 192.168.1.2(BB:BB),
인 시스템이 있다고 약식으로 가정하였다 192.168.1.3(CC:CC) .
그림 내부 네트워크 구성도 < 2>
만약 라우터를 통해 접속하려는 요구가 서버인 이라면 여기에서부터 가 A 211.47.65.1 ARP
작동하게 된다 그런데 구간에서는 서버의 주소를 알아야 통신을 할 수 있는데 . , LAN MAC ,
라우터는 의 주소를 아직 모르기 때문에 라우터에서는 밑단의 네트워크에 211.47.65.1 MAC
대해 인 서버는 주소를 알려 달라는 패킷 이 패킷에는 라 211.47.65.1 MAC Broadcasting (
우터의 소스 주소와 소스 정보를 포함하고 있다 을 보내게 된다 이 패킷은 라우터 IP MAC .) .
하단의 모든 서버들이 받게 되며 이 패킷의 목적지 가 자신이 아닌 나 서버는 이 요 IP B C
청에 대해 응답하지 않으며 이 요청을 받은 서버 가 는 자신의 주소 A (IP 211.47.65.1) MAC
를 적은 패킷을 라우터에게 즉 요청을 한 라우터에게만 로 응답하게 된다 이 Unicast( , arp ) .
렇게 해서 라우터와 서버는 서로의 정보를 알게 되었으므로 드디어 통신을 할 수 A MAC
있게 되었다 아래는 실제 로컬 랜상의 가 실시간으로 하고 있음을 . arp broadcasting
로 캡처한 예이다 아래에서 보는 것처럼 요청 은 tcpdump . arp (arp who-has)
을 하지만 응답 은 즉 를 요청한 에게만 응답 Broadcasting arp (arp reply) Unicast( arp IP )
하는 것을 알 수 있다 참고로 아래 그림에서 를 하는 패킷이 하나가 아니라 몇 . arp reply
개 있는 것은 이 시스템의 환경이 이기 때문이다 이에 대해서는 아래에서 다시 설 dummy .
명하기로 한다.
그림 를 로 잡은 모습 < 3> arp broadcast tcpdump
와 ARP CACHE Gratuitous ARP
그런데 이렇게 한 번 접속할 때마다 매번 을 하고 를 해야 한다면 , arp broadcasting reply
그만큼 불필요한 프로세스가 발생하게 되고 많은 오버헤드가 유발될 것이다 따라서 라우터 .
및 서버등 각 장비에서는 와 를 한 후에는 이 정보를 바로 폐기하지 않 arp broadcast reply
고 일정 시간동안 캐시를 하게 된다 기종과 계열에 따라 다소의 차이는 있지만 많은 데이 .
터의 교환이 있는 라우터는 통상 시간 서버는 초 동안 캐시를 하게 된다 리눅스의 경 4 , 60 .
우 현재 시스템에서의 캐시는 아래와 같이 확인 결과 초로 설정되었다는 것을 알 수 있 60
으며 튜닝 으로 이 값을 적절히 조절할 Soft Kernel (sysctl -w kernel_parameter=value)
수 있다.
# sysctl -a|grep gc_stale_time
net.ipv4.neigh.eth0.gc_stale_time = 60
net.ipv4.neigh.lo.gc_stale_time = 60
net.ipv4.neigh.default.gc_stale_time = 60
현재 리눅스 시스템의 캐시정보는 아래와 같이 를 입력하면 된다 arp arp -a .
그림 캐시 정보 확인 < 4> arp
아래와 같이 라우터에서도 를 캐시하고 있는 것을 확인할 수 있다 arp .
그림 라우터의 캐시 < 5 > arp
여기에서 주의할 점은 는 내부 에서만 의미가 있으므로 라우터를 벗어난 , arp LAN WAN
구간에서는 의미가 없으며 구간에서도 브로드 캐스팅 도메인 영역에서만 의미가 있다 LAN
는 것이다 따라서 캐시는 해당 서버에 접근하는 모든 클라이언트나 서버에 대해서 캐 . arp
시하는 것이 아니라 로 되어 있을 경우 해당 영역 위의 경우 C Class netmask (
대역 만 캐시하는 것을 볼 수 있다 가끔 여러분의 서버나 의 이더넷 카드 211.47.65.0 ) . PC
를 변경하였을 때 바로 인식이 되지 않고 빠르면 몇 분 길게는 몇 시간까지 기다린 후에야 ,
네트워크가 다시 작동하는 것을 경험해 보았을 것이다 이를테면 이더넷 카드를 기존의 .
에서 계열로 바꾸었고 커널에서도 잘 인식이 되었다 모듈도도 해 보 RealTek 8139 3com , .
고 커널에 정적으로 포함시켜 보기도 하고 분명 시스템에서는 정상적으로 이더넷 카드를 ,
인식하고 설정도 전혀 문제가 없는데 네트워크가 작동하지 않는 경우가 있다 왜 그럴까 , . ?
이제 여러분은 이 이유를 알 수 있을 것이다 그렇다 바로 캐시 때문이다 앞에서 라우 . . arp .
터는 평균 시간정도 를 캐시한다고 말했다 따라서 이더넷 카드를 변경했다면 해당하 4 arp .
는 에 대한 주소가 변경되었는데 라우터에서는 이전의 정보를 캐시하고 있는 것 IP MAC ,
이다 즉 의 주소를 이 아닌 이전의 으로 인식하고 있는 . , 211.47.65.1 MAC 3com RealTek
것이다 따라서 외부에서 라우터를 통해 로 접속 요구가 들어왔을 때 라우터는 . 211.47.65.1
이전의 정보인 주소를 가지고 있는 서버를 찾는데 이미 은 AA:AA MAC , 211.47.65.1
의 주소인 로 변경되었고 기존의 주소는 존재하지 않기 3com MAC HH:HH AA:AA MAC
때문에 접속할 수 없게 되는 것이다 만약 이더넷 카드를 변경 후 바로 네트워크가 되었다 .
면 다행히 캐시가 작동하지 않았거나 캐시 시간이 짧았기 때문이었을 것이다 그런데 arp .
캐시 때문에 캐시가 업데이트 될 때까지 무작정 기다리기만 해야 한다면 너무 불합리 arp
하지 않은가 당장 서비스도 중지없이 해야 하는데 말이다 ? .
이를 위해서는 라는 것을 사용하면 된다 는 로컬 랜상의 Gratuitous arp . gratuitous arp
캐시 정보를 업데이트하는 로서 이를 실행하면 모든 캐시 정보를 바로 업데이트 arp arp
할 수 있다 리눅스에서는 라는 실행파일을 이용하면 되며 이 실행 파일은 클러 . send_arp
스터링 패키지인 라는 패키지에 포함되어 있다 piranha .
사용 방법은 인데 만약 send_arp src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr ,
디렉토리에 실행 파일이 있고 의 정보를 기존의 /usr/sbin send_arp 211.47.65.1 MAC
에서 로 변경하여 이 정보를 업데이트하려면 아래와 같이 실행하면 될 것이 AA:AA HH:HH
다.
# /usr/sbin/send_arp 211.47.65.1 HHHH 211.47.65.255 ffffffffffff
위와 같이 실행하면 즉 대역의 서버중 에 대한 211.47.65.255 211.47.65.0 211.47.65.1
캐시를 가지고 있는 모든 서버에 대해 의 주소는 로 업데이 arp 211.47.65.1 MAC HH:HH
트하라고 브로드 캐스트하는 것이다 이를 실행하면 라우터를 포함하여 모든 네트워크 장비 .
가 캐시를 업데이트하며 네트워크가 다시 작동하는 것을 확인할 수 있을 것이다 참고 arp .
로 자신의 정보는 아래와 같이 를 실행하면 확인할 수 있다 MAC ifconfig .
그림 주소의 확인 < 6> MAC
실제로 를 이용하면 한 서버가 다운시 다른 서버가 대신 서비스하는 클러스 gratuitous arp
터링의 용도로도 사용되며 매우 유용한 프로그램이라 할 수 있다 이외 와 관련하여 . ARP
라는 것도 있는데 이는 가 기존의 캐시를 다른 정보로 업데이 Unarp , Gratuitous arp arp
트하는 것이라면 는 기존의 캐시가 있는 시스템이 있다면 단지 캐시를 삭제 Unarp arp arp
만 하는 것이다 따라서 접속할 때마다 가 변하는 등의 의 경우는 접속을 끊 . IP ADSL DHCP
을 때 를 하고 를 할당받아 네트워크를 시작할 때에는 Unarp Broadcasting , IP Gratuitous
를 실행하면 캐시로 인하여 접속이 되지 않는 문제는 해결이 될 것이다 arp arp .
이렇듯 는 매우 유용하지만 다른 한편으로 악용될 경우에는 쉽게 다른 시스 gratuitous arp
템을 무력화시킬 수 있는 무서운 공격 프로그램이 될 수 도 있다는 점을 양지하기 바란다.
와 허브 Switch Dummy
이번에는 로컬구간에서의 통신에 대해 알아보도록 하자.
많은 사람들은 네트워크의 보안을 위해 더미 허브대신 스위치를 사용하라고 권장한다 LAN .
과연 그런가 실제로 스위치는 애초에 디자인시 보안을 고려했기 보다는 를 ? Performance
염두해 두고 개발된 것인데 어떻게 하다보니 우연히 더미 허브에 비해 보안에 좋 , (Dummy)
은 것 뿐이지 반드시 그러한 것은 아니다 그럼 여기서 잠깐 더미허브와 스위치의 차이에 . ,
대해 알아보도록 하자 더미 허브와 스위치는 일반적으로 차선의 개념과 연관지어 생각하면 .
쉽다.
그림 의 개념 < 7> Switch
스위치의 경우 위와 같이 이 차선이면 도 차선인 개념이다 반면에 더미 허브 input 4 output 4 .
는 은 차선이지만 은 차선인 개념이므로 당연히 에서 병목현상이 발 input 4 output 1 output
생할 수밖에 없게 된다 이때 병목 현상으로 인하여 동시에 에 도달하려면 필연적으 . output
로 충돌 이 생기게 되어 결국 속도 저하가 발생하게 된다 리눅스에서 특정 인터 collision( ) .(
페이스의 여부는 로 확인할 수 있다 그런데 이러한 속도 저하보다는 collision ifconfig .) ,
좀 더 중요한 차이점이 있다 즉 스위치는 지정된 로 패킷을 바로 포워딩해 주지만 더미 . , IP
허브는 모든 패킷을 모든 포트에 한다는 것이다 그럼 여기에서 각각 더미허브 broadcast .
및 스위치 환경에서 데이터가 통신하는 경로에 대해 다시 생각해 보자.
# Dummy
더미 환경에서 서버와 서버가 과 같은 통신을 한다면 서버에 (dummy) A C telnet TCP , A
서는 제일 먼저 을 하게 된다 이때 이 요청은 이므로 ARP Broadcasting . Broadcasting B,
모두에게 전달된다 이중 서버는 목적지 가 자신의 가 아니므로 이 요청에 C . B ARP IP IP
응답하지 않고 서버는 목적지가 자신의 이므로 이 요청에 대하여 요청을 한 서버에 C IP A
게 를 한다 그러나 환경에서는 모든 패킷이 하므로 서 ARP reply . dummy broadcast B
버에서도 서버의 응답을 캡처할 수 있다 이는 위의 그림에서 확인하였 C unicast .( tcpdump
다 와 간에 와 를 한 후에는 통신을 하려고 하므로 본격적 .) A C ARP broadcast reply TCP
인 데이터 교환을 하기 전에 과정을 선행하게 된다 TCP 3 Way handshake .
그림 < 8> TCP 3 way handshake
과정은 위 그림에서와 같이 서버와 클라이언트간에 위 가지 절차 tcp 3 way handshake 3
를 거친 후에야 연결이 성립되어 데이터가 교환된다는 것을 익히 알고 있을 것이다 그런 .
데 에서는 위 뿐만이 아니라 이후의 모든 데이터 , dummy 3 way handshake Connection
교환 역시 하게 된다 아래에서는 서버에서 서 broadcast . 211.47.65.106 www35.tt.co.kr
버로 접속시 반응하는 패킷을 서버에서 로 잡은 예이다 telnet www35.tt.co.kr tcpdump .
에서 보는 것처럼 먼저 통신이 되어 서버의 정보를 교환한 후에야 비로 tcpdump arp MAC
서 가 이루어지는 것을 확인할 수 있을 것이다 만약 한번 시도를 한 3 way handshake .
후에는 캐시가 있으므로 캐시가 있는 상태에서 재시도를 하면 요청과 절차 arp arp reply
가 없이 바로 가 이루어지는 것을 그림 에서 확인해 볼 수 있다 3 way handshake < 10> .
그림 가 없을때의 < 9> arp cache tcpdump
그림 가 있을때의 < 10> arp cache tcpdump
# switch
환경에서 서버와 서버가 과 같은 통신을 한다면 서버에서는 switch A C telnet TCP A C
서버의 주소를 알기 위해 먼저 을 한다 이때 이 요청은 MAC ARP Broadcasting .
이므로 모두에게 전달된다 이중 서버는 목적지 가 자신이 아 Broadcasting B, C . B ARP IP
니므로 이 요청에 응답하지 않고 서버는 목적지가 자신의 이므로 이 요청에 대하여 , C IP
요청을 한 서버에 를 한다 여기까지는 스위치나 환경이 동일하다 그 A ARP reply . dummy .
러나 환경에서는 이외의 모든 패킷이 하지 않으므로 switch arp broadcast broadcast B
서버에서는 서버의 응답을 캡처할 수 없다 와 간에 와 C unicast . A C ARP broadcast
를 한 후에는 통신을 하려고 하므로 본격적인 데이터 교환을 하기 전에 reply TCP TCP 3
과정을 거치게 된다 와 간에 서로의 정보를 교환한 후에는 서 Way handshake . A C MAC
로의 주소를 알기 때문에 뿐만이 아니라 이후의 모든 MAC 3 way handshake connection
데이터 교환 역시 하지 않고 와 간에만 통신을 하게 되며 에서는 와 broadcast A C B A C
간의 통신을 엿볼 수 없게 된다.
즉 환경에서는 요청과 응답 , dummy (1) arp
(2) tcp 3 way handshake
데이터 교환 (3)
이 모든 과정이 되어 에서도 와 간의 통신을 엿볼 수 있으나 broadcasting B A C
환경에서는 요청만이 하며 switch (1) arp broadcasting
응답 (2) arp
(3) tcp 3 way handshake
데이터 교환 모두 와 간에 로 작동하기 때문에 (4) A C unicast
에서는 와 간의 통신을 엿볼 수 없게 된다 B A C .
여기에서 처럼 자신을 출발지 또는 목적지로 하지 않은 와 간의 통신을 엿보는 일 B A C (?)
련의 행위을 스니핑 한다고 한다 (Sniffing) .
스니핑(Sniffing)
그렇다면 스니핑은 어떻게 가능한가?
크게 두 가지 이유로 가능하다 첫 번째는 위에서 본 것처럼 환경에서는 모든 패킷 . dummy
을 하여 직접적인 통신과는 관계없는 다른 나 서버에서도 다른 시스템의 패 broadcast PC
킷을 캡처할 수 있다는 특성을 이용한 것이고 두 번째는 인터넷의 표준 프로토콜로 사용중 ,
인 의 전송 방식이 암호화하지 않은 평문 를 사용한다는 점을 이용한 것 TCP/IP Plain text( )
이다 그렇다고 해서 방식으로 한다고 바로 모든 패킷을 스니핑 . Plain text broadcasting
할 수 있는 것은 아니다 왜냐하면 기본적으로 목적지 가 자신의 가 아닌 패킷은 이더 . IP IP
넷에서 패킷을 드롭 하는 특성이 있기 때문이다 이처럼 스니핑을 하려면 자신의 목적 (drop) .
지가 아닌 패킷도 받아들여야 하는데 그렇게 하려면 인터페이스가 또는 , promiscuous (
모드로 작동하도록 설정하여야 한다 모드는 우리말로 무차별 모드 라 promisc) . promisc “ ”
고도 하는데 모드로 설정되면 이더넷에서 패킷을 드롭하지 않고 모든 패킷을 다 , promisc
받아들이게 되어 스니핑이 가능하게 된다 리눅스에서 인터페이스가 모드인지 여 . promisc
부를 알 수 있는 명령어는 앞에서 본 것처럼 라는 명령어로 확인 가능하다 이때 ifconfig .
아래와 같이 라는 문자열이 보이면 인터페이스는 모드로 되어 있는 것 PROMISC promisc
인데 모드를 수동으로 설정하려면 , promisc
와 같이 하면 되고 설정을 해제하려면 # ifconfig eth0 promisc ,
로 실행하면 된다 # ifconfig eth0 -promisc .
그림 설정 여부 확인 < 11> promisc
특별한 이유가 없다면 평상시에는 모드로 설정되어 있을 필요가 거의 없으므로 만 promisc
약 자신의 시스템이 모드로 설정되어 있다면 스니핑 여부를 주의깊게 검토해 보아 promisc
야 할 것이다 그러나 시스템에 따라 자동으로 로 설정하는 경우도 있으니 . promisc
로 설정되어 있다고 해서 반드시 스니핑이 작동하고 있는 것은 아니라는 것을 참고 promisc
하기 바란다.
스니핑에 대한 대책
그렇다면 이에 대한 대책은 무엇인가 가지 정도의 방법을 대안으로 제시할 수 있겠다 ? 3 .
첫 번째는 로 전송되는 대신 암호화 전송 프로토콜을 사용하는 것이다 , Plain text TCP/IP .
이의 대표적인 예가 대신 대신 웹서버 등을 사용하는 것이 그 telnet SSH, http https(SSL )
예이다 여기서 잠깐 에 대해 이야기하고자 한다 적지 않은 사람들이 보안 웹서 . SSL . SSL
버를 설치하면 마치 방화벽처럼 모든 보안에 완벽해 지는 것으로 오해하는 경우가 있는데,
은 번 포트를 사용하는 프로토콜 역시 에 속하므로 평문으로 전송되어 SSL 80 http TCP/IP
스니핑 될 수 있기 때문에 기존의 대신 암호화 전송 프로토콜인 을 사용하는 것 http SSL
뿐이지 다른 것은 아닌 것이다 아마도 보안 웹서버라는 이름 때문에 다소 혼동하는 것이 .
아닌가 한다.
두 번째는 앞에서 본 것처럼 을 하는 대신 스위치를 사용하는 것이다 broadcasting dummy .
세 번째는 기업간 통신시 암호화된 통신을 하는 가상 사설망인 VPN(Virtual Provate
을 사용하는 것이다 Network) .
이 중 가장 근본적인 방법은 첫번째로 제시한 암호화 전송 프로토콜을 사용하는 것이다.
여기에서 잠깐 두 번째 방법으로 제시한 대신 스위치에 대해 알아보도록 하자 앞 dummy .
에서 본 대로 스위치를 사용할 경우 초기 요청시에만 하고 이후 arp broadcast broadcast
에는 모두 로 통신하므로 상대적으로 스니핑에 안전하다는 것을 이해했을 것이다 unicast .
하지만 과연 스위치를 사용한다면 스니핑에 안전할까 답은 결코 그렇지 않다 이다 왜냐 ? . . “ ”
하면 쉽지는 않지만 스위칭 환경에서도 스니핑을 할 수 있는 방법이 있기 때문이다 바로 .
의 특성을 이용하여 아래와 같은 몇 가지 방법이 가능하다 arp .
스위치 환경에서도 가능한 스니핑 기법
(1) MAC Flooding
스위치에서는 각각의 포트에 해당하는 물리적인 주소를 기억하고 있는데 이 메모리에 MAC
는 어느 정도의 한계치가 있다 이러한 스위치의 특성을 이용하여 위조된 을 지속적으 . MAC
로 발생시켜 스위치의 테이블을 시키는 방법으로 정보가 되면 스 ARP Flood MAC Flood
위치는 마치 처럼 모든 포트에 하게 된다 보안적인 용어로 이러한 것을 dummy broadcast .
이라 한다 fail open . “ “
(2) ARP Spoofing
은 스니핑하고자 하는 서버인 것처럼 을 위조한 패킷을 하여 ARP Spoofing MAC Broadcast
트래픽을 포워딩하는 것을 말하는데 앞의 그림 와 같은 스위치 환경에서 서버가 와 , 2 B A C
서버간의 통신을 스니핑 할 수 있는 방법으로 아래와 같이 의 원리만 알면 아주 쉽게 ARP
스니핑 할 수 있다 서버에서 서버에게 의 주소가 가 아니라 . B A 211.47.65.3 MAC CC:CC
서버의 주소인 라는 패킷을 발송하고 서버에는 의 주 B MAC BB:BB , C 211.47.65.1 MAC
소가 가 아니라 서버의 주소인 라는 패킷을 발송하는 것이다 그렇 AA:AA B MAC BB:BB .
게 되면 서버와 서버는 이 정보를 의심없이 받아들여 정보를 갱신한 후 와 간 통신 A C A C
시 모든 패킷은 서버로 보내지게 되며 서버는 모든 패킷을 받은 후 원래의 서버로 포 B B
워딩만 해 주면 되는 것이다 이때 서버의 로 설정되어 있어야 원 . B net.ipv4.ip_forward=1
래의 서버로 패킷을 포워딩하게 되며 와 서버는 정상적인 데이터 전송이 되므로 패킷이 A C
를 거쳐간다는 사실을 알 수 없게 되는 것이다 B .
(3) ARP Redirect
역시 과 비슷한 방법인데 자신이 마치 인 것처럼 ARP Redirect ARP Spoofing , Gateway
위조된 을 하여 모든 트래픽이 자신을 통과하게 하는 방법이다 즉 와 MAC Broadcast . , A C
서버에게 주소인 의 주소가 라우터의 주소인 Gateway 211.47.65.254 MAC MAC RR:RR
이 아니라 서버의 주소인 라는 패킷을 하는 것이다 그렇게 되 B MAC BB:BB broadcast .
면 로컬 랜상에 있는 서버들은 이 정보를 아무런 의심없이 받아들여 캐시 정보를 갱신한 후
게이트웨이로 보내는 모든 패킷을 가 아니라 서버인 로 보내게 211.47.65.254 B 211.47.65.2
되며 서버는 모든 패킷을 받은 후 원래의 게이트웨이인 로 포워딩만 해 , B 211.47.65.254
주면 되는 것이다 이때 서버의 로 설정되어 있어야 원래의 게이 . B net.ipv4.ip_forward=1
트웨이로 패킷을 포워딩하게 되며 와 서버는 정상적인 데이터 전송이 되므로 패킷이 A C B
를 거쳐간다는 사실을 알 수 없게 되는 것이다.
(4) MAC Duplicating
만약 서버에서 서버의 트래픽을 스니핑하고 싶다면 서버에서 서버의 주소와 B A B A MAC
같은 정보로 설정을 하는 방법이 바로 이다 를 이용하면 이 MAC MAC Duplicating . ifconfig
는 어렵지 않게 설정할 수 있는데 이를테면 의 주소가 인 , eth0 MAC 00:50:8B:9A:1B:1B
경우 이를 와 같이 설정하고자 한다면 먼저 으 AA:AA:AA:AA:AA:AA ifconfig eth0 down
로 인터페이스를 다운시킨 후 와 eth0 ifconfig eth0 hw ether AA;AA:AA:AA:AA:AA up
같이 실행하면 인터페이스의 정보를 변경할 수 있다 이러할 경우 스위치를 혼 eth0 MAC .
란시켜 두 포트 모두 같은 주소를 가진 것처럼 인식하게 되며 스위치는 서버로 보 MAC A
낼 트래픽을 와 모두에게 발송하게 되는 것이다 데이터는 두 포트 모두에게 보내어지 A B .
므로 서버에서는 포워딩을 설정할 필요가 없다 B IP .
실제로 위와 같이 스위치 환경에서 스니핑하는 것은 그리 어렵지 않으며
나 등과 같은 관련 툴을 이용하면 어 hunt dsniff(http://www.monkey.org/~dugsong/dsniff/)
렵지 않게 구현할 수 있다.
스니핑 차단하기
이제 스위치 환경도 결코 스니핑에 안전하지 않다는 사실을 알았을 것이다 그렇다면 스위 .
치 또는 환경에서 어떻게 보안을 강화할 수 있을까 아래의 몇 가지 방법을 대안으 dummy ?
로 제시할 수 있다.
(1) IP Flitering
스위치에서 제공하는 기능을 사용함으로써 각각의 포트에서 오가는 트래픽을 IP Filtering
필터링 할 수 있다 그러나 이 기능을 제공하는 스위치에서만 가능하며 매번 포트가 바뀔 .
때마다 수작업으로 설정해 주어야 하므로 많은 수고가 따르게 된다.
(2) Port security
만약 스위치에서 기능을 지원할 경우 나 을 예방 Port security MAC Flood MAC Spoofing
할 수 있는 방법으로 각각의 포트에 물리적인 주소를 정적 으로 설정하는 것이 MAC (Static)
다 각종 기반의 스니핑에 가장 확실한 방법이라 할 수 있지만 과연 이렇게 하는 곳이 . ARP
얼마나 될까는 의문이다.
원격지 서버의 스니핑 모니터링 프로그램
특정 서버에서 스니핑이 작동하고 있는지 리눅스의 경우 를 실행시 가 설 ifconfig PROMISC
정 되었는지 여부로 확인할 수 있다고 하였다 그런데 관리하는 서버가 여러 대라면 매번 . ,
로그인하여 로 설정 여부를 확인하겠는가 거기다가 만약 실행 ifconfig PROMISC ? ifconfig
파일 자체가 변조되어 결과를 신뢰할 수 없다면 이는 아무런 의미가 없게 되는 ifconfig ?
것이다 이를 위해 원격에서도 특정 서버의 스니핑 작동여부를 체크할 수 있는 과 . Sentinel
라는 프로그램을 소개하고자 한다 을 설치하려면 미리 패킷 캡처 라 AntiSniff . Sentinel
이브러리인 과 가 설치되어야 하는데 각각 Libnet 1.0 libpcap ,
와 (http://www.packetfactory.net/Projects/libnet) (ftp://ftp.ee.lbl.gov/libpcap-0.4.tar.Z)
에서 다운로드 받아 압축 해제 후 압축이 풀린 디렉토리에서 ./configure; make ; make
로 설치하면 된다 그리고 은 install . Sentinel
에서 다운로드 할 수 있으며 다운로드후 http://www.packetfactory.net/Projects/sentinel/
압축 해제를 하고 압축이 풀린 디렉토리에서 로 컴파일하여 설치하면 된다 현재 make all .
이 원격지 시스템에서 스니핑 여부를 감지하는 방법은 가지가 있는데 이 방법은 Sentinel 3 ,
각각 등이다 참고로 이 방법은 를 이용한 방 DNS test, Etherping test, ARP test . ARP
법이므로 같은 네트워크 세그먼트에 속해 있어야만 탐지의 의미가 있다는 점을 양지하기 바
란다.
먼저 각각의 방법이 가능한 원리에 대해 간단히 살펴보면 우선 의 경우 목적지 , DNS test
서버에 위조된 연결 요청을 보내어 일반적인 스니핑 프로그램이 요청한 시스템의 주소 , IP
를 역리졸브 한다는 특징을 이용하여 트래픽을 감시하여 스니 (Inverse DNS lookup) DNS
핑 여부를 감지하는 방법이다 는 목적지에 패킷을 보낼 때 목적지의 . Etherping test ping
는 맞지만 목적지의 주소는 존재하지 않는 정보로 위조하여 IP MAC Icmp Echo Packet
을 보내어 응답이 오는지 여부를 감시하는 방법으로 대부분의 정상적인 시스템에서는 존재
하지 않는 정보이기 때문에 패킷에 대해 응답하지 않지만 가 설정된 MAC promisc mode
시스템에서는 이와 관계없이 응답을 한다는 특징을 이용하여 감시하는 방법이다 마찬가지 .
로 역시 는 목적지의 로 설정하지만 목적지의 주소를 다르게 하여 ARP test IP IP MAC
대신 요구를 보내는 방법으로 모드가 아닌 경우에는 패킷이 목적지까 icmp ARP Promisc
지 갈 수 없으므로 목적지에서는 응답하지 않지만 모드인 경우에는 모든 패킷을 Promisc
받아들이므로 결국 응답한다는 특징을 이용하여 스니핑 여부를 감시하는 방법이다 각각의 .
방식에 대한 실행 예는 아래와 같다.
테스트 ./sentinel -a -t 211.47.65.4 # ARP
테스트 ./sentinel -d -f 1.1.1.1 -t 211.47.65.4 # DNS
테스트 ./sentinel -e -t 211.47.65.4 # Etherping
개의 테스트를 동시에 수행 ./sentinel -t 211.47.65.4 -f 1.1.1.1 -d -a e # 3 –
위와 같이 실행시
Results: 211.47.65.4 tested positive to etherping test.
와 같이 탐지 결과가 가 나오면 모드로 설정되었다는 의미이므로 해당 positive Promisc
인터페이스의 여부를 조사하여야 한다 그런데 한 시스템에 대해 각각의 테스트 PROMISC . ,
를 동시에 실행했을 때 결과가 각기 다르게 나오는 경우가 있는데 이는 리눅스의 커널 버 ,
전에 따라 종종 발생하는 현상으로 세 가지 방법중에 어느 하나라도 라는 결과가 positive
나온다면 반드시 스니핑 작동 여부를 확인하기 바란다.
아울러 의 경우 에서 다운로드 Antisniff http://www.securitysoftwaretech.com/antisniff/
가능하며 리눅스 버전과 윈도우 버전의 프로그램도 사용할 수 있는데 테스트 하는 원리는 ,
위의 과 비슷하며 추가적으로 라는 재미있는 방법이 있는데 이 방 Sentinel Latency test ,
법은 스니핑이 작동시 모드로 설정되어 있을 경우에는 로컬 네트워크상의 모든 트 promisc
래픽을 받아들이느라 시스템의 로드가 전반적으로 높아진다는 점을 이용해 불필요한 쓰레기
트래픽을 전송하여 시스템의 응답 시간이 길어지는지 여부를 조회하는 방법으로 아직까지는
신뢰할 수는 없는 방법이며 계속적으로 개선중인 기능이다 100% .
윈도우 버전의 의 경우 모니터링하고자 하는 대역을 지정하여 한꺼번에 검사 Antisniff IP
가 가능하고 검사 결과에 대해 각종 통계도 볼 수 있으며 얼마의 주기로 테스트를 할 것 , ,
인지를 시간대별 날짜별 주별로 정할 수 있는 예약 기능 및 검사 결과가 변경시 메일로 , ,
발송하거나 음악이 나오게 하는 등의 알람 기능도 있어 편리하게 사용이 가능하다.
아울러 와 관련된 프로그램으로 작지만 강력한 프로그램인 라는 프로그램을 arp ARPWatch
소개하고자 한다 앞에서 를 실행하였을때 실시간으로 주소와 . tcpdump -e arp IP MAC “ ”
정보가 되는 것을 확인하였을 것이다 broadcast . 이 프로그램은 이러한 ARP 트래픽을 실시
간으로 모니터링하여 MAC 주소와 IP 간의 매칭을 감시하는 프로그램으로서 만약 현재
의 ARP 정보가 데이터베이스에 저장되어 있는 정보와 다르 ARP 거나 새로운 MAC 주소가
추가/확인시에는 해당하는 내용을 지정된 관리자에게 메일로 통보하게 된다 프 . arpwatch
로그램을 이용하면 MAC 주소나 ARP를 이용하는 공격에 대한 대응 및 네트워크 관리에
매우 유용하다.
암호화 전송 프로토콜 사용하기
앞에서 가 얼마나 취약한지 그리고 이를 위한 대책이 어떤 것이 있는지 알아보았 TCP/IP
다 물론 의 취약점을 개선하기 위해 등 새로운 개발이 가시화되고 있지만 현 . TCP/IP ipv6
재의 상태에서 가장 확실한 방법은 암호화 전송 프로토콜을 사용하는 것에는 모두 동의할
것이다 이는 대신 를 대신 를 사용한다고 말했었다 그렇다면 . telnet ssh , http https . ftp,
등 다른 프로토콜은 어떻게 할 것인가 만약 만 사용한다면 그냥 를 smtp, pop3 ? telnet ssh
사용하기만 하면 되겠지만 한 서버에서 과 등을 함께 사용한다면 어느 하 telnet ftp, pop3
나의 서비스만 암호화하는 것은 그리 큰 의미가 없다 어차피 자체가 취약한 것이 . TCP/IP
므로 암호화 전송 프로토콜을 사용하려면 모든 서비스에 대해 암호화 전송 프로토콜을 사용
해야 하기 때문이다 그래서 이를 위해 기존 기반의 서비스에 암호화 전송 프로토 . TCP/IP
콜을 사용하려면 아래와 같은 두 가지 방법이 가능하다.
를 이용한 암호화 (1) sslwrap
의 포트전송 기능을 이용한 암호화 (2) SSH
를 이용한 암호화 (1) sslwrap
는 나 등의 서비스를 감싸 을 이용하여 모든 sslwrap pop3 imap, smtp TCP TSL/SSL
데이터 전송을 암호화하는 간단한 유닉스 서비스로서 기존의 서비스를 다시 설치할 TCP
필요없이 어렵지 않게 사용이 가능하다 를 이용하려면 이나 를 설 . sslwrap openssl ssleay
치하여야 하는데 여기에서는 을 사용하는 방법을 알아보도록 하자 , openssl .
먼저 에 접속하여 최신의 을 다운로드하여 설치할 서버에 http://www.openssl.org/ openssl
업로드한다.
또는 설치할 서버에서 직접 lynx http://www.openssl.org/source/openssl-0.9.6b.tar.gz “ ”
나 로 다운로드 받아도 된 wget http://www.openssl.org/source/openssl-0.9.6b.tar.gz “ ”
다 다운로드 후 압축 해제하여 압축이 풀린 디렉토리에서 아래와 같이 실행하여 컴파일하 .
여 설치를 한다.
[root@www ~/openssl-0.9.6b]# ./config ; make; make test; make install
이번에는 을 설치할 차례이다 sslwrap .
역시 나 "lynx http://www.rickk.com/sslwrap/sslwrap.tar.gz"
으로 다운로드한 후 압축 해제하여 "wget http://www.rickk.com/sslwrap/sslwrap.tar.gz"
만 실행하여 컴파일하면 된다 컴파일후 생성된 파일을 디렉토리 make . sslwrap /usr/sbin/
레 복사한다 혹 컴파일이 잘 안되는 경우에는 에서 자신의 버전에 맞 . http://rpmfind.net/
는 적당한 파일을 다운로드하여 설치해도 된다 rpm .
이번에는 인증서를 생성할 차례이다 물론 베리사인이나 등 공인된 . Thawte CA(Certificate
Authority) 기관에서 일정정도 비용을 지불하고 를 생성후 인증서를 구입하는 방법도 , CSR
있지만 여기에서는 자기 자신이 사인한 인증서를 발급하는 방법에 대해 알아보도록 하자.
인증서를 발급하는 명령어는 아래와 같다.
# openssl req -new -x509 -nodes -out /usr/local/include/sslwrap.pem -keyout
/usr/local/include/sslwrap.pem -days 365
이 명령어를 한줄에 이어서 입력하기 바란다 아래는 위와 같이 실행시 보이는 화면이다 . .
Using configuration from /usr/share/ssl/openssl.cnf
Generating a 1024 bit RSA private key
.....++++++
..++++++
writing new private key to '/usr/local/include/sslwrap.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Today & Tomorrow
Organizational Unit Name (eg, section) []:Net-Center
Common Name (eg, your name or your server's hostname) []:test1.tt.co.kr
Email Address []:antihong@tt.co.kr
위에서 굵게 표시된 부분은 각자의 상황에 맞게 적절히 입력하여야 하는 내용이다.
각각에 대해 잠깐 알아보도록 하자.
Country Name (2 letter code) [AU]:KR
국가 이름을 코드로 입력한다 한국은 이라 입력한다 --> . KR .
State or Province Name (full name) [Some-State]:
주는 존재하지 않으므로 적당히 입력하거나 그냥 엔터를 입력한다 --> .
Locality Name (eg, city) []:Seoul
--> 도시이름을 입력한다.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Today & Tomorrow
회사나 조직 기관의 이름을 입력한다 --> , .
Organizational Unit Name (eg, section) []:Net-Center
부서이름을 적절히 입력한다 --> .
Common Name (eg, your name or your server's hostname) []:test1.tt.co.kr
인증서가 설치되는 서버의 받는 메일서버 주소를 입력한다 --> .
만약 여기에서처럼 에 대해 암호화 프로토콜을 사용하려면 이 주소는 아 pop3, smtp
웃룩 익스프레스등의 메일 프로그램에서 보내는 메일서버 또는 받는 메일서버로
입력할 주소이다 등과 같이 자신의 이름을 입력하지 않도록 . Kildong, Hong
주의하기 바란다.
Email Address []:antihong@tt.co.kr
자신의 주소를 입력한다 --> e-mail .
이제 인증서 생성을 끝났으므로 를 나 에 설정할 차례이다 sslwrap inetd xinetd .
먼저 파일을 열어 /etc/services
pop3s 995/tcp
smtps 465/tcp
와 같이 설정되어 있는지 확인하고 없으면 위와 같이 추가한다.
그리고 의 경우 설정 파일에 아래와 같이 추가한다 xinetd xinetd.conf .
service smpts
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = nobody
server = /usr/sbin/sslwrap
server_args = -cert /usr/local/include/sslwrap.pem -quiet -port 25
log_on_failure += USERID
}
service pop3s
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = nobody
server = /usr/sbin/sslwrap
server_args = -cert /usr/local/include/sslwrap.pem -quiet -port 110
log_on_failure += USERID
}
의 경우라면 서비스에 대해 파일에 아래와 같이 설정할 수 있다 inetd pop3s inetd.conf .
pop3s stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/sslwrap
-cert /usr/local/include/sslwrap.pem -port 110
이와 같은 방식으로 다른 서비스도 아래와 같이 설정할 수 있다.
https stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/sslwrap
-cert /usr/local/include/sslwrap.pem -port 80
imaps stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/sslwrap
-cert /usr/local/include/sslwrap.pem -port 143
telnets stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/sslwrap
-cert /usr/local/include/sslwrap.pem -port 23
위와 같이 설정 후 또는 를 재시작하면 변경한 내용이 적용될 것이다 inetd xinetd .
설정한 포트가 열렸는지 아래와 같이 확인한다.
# telnet localhost pop3s
# tenlet localhost smtps
이제 서버에서의 설정은 끝났으므로 메일 클라이언트 프로그램에서 설정할 차례이다.
메일 프로그램에서 받는메일서버 보내는메일서버 를 위에서 설정한 서버이름으 (pop3), (smtp)
로 입력하고 고급 탭에서 보내는 메일서버와 받는 메일서버에 아래 그림과 같이 보안연결 , “
필요 를 선택하면 와 번 포트가 설정되는 것을 확인할 수 있다 (SSL) 465 995 . ”
그림 아웃룩 익스프레스 설정 < >
이제 드디어 모든 설정이 끝났다 메일 송수신이 되는지 테스트해 보기 바란다 그런데 메 . . ,
일 프로그램에서 보내고 받기를 클릭하면 아래와 같이 처음 프로그램을 시작할 때마다 경고
메시지가 뜨게 되어 여간 불편하지 않을 수 없다.
그림 공인된 인증서가 아닌 경우 경고 화면 < >
이는 공인된 인증서가 아니라 자기 자신이 사인한 인증서를 발급하였기 때문이며 이러한 경
우에는 다음과 같이 추가적인 작업을 해주면 이 메시지가 나타나지 않도록 할 수 있다.
먼저 인증서 파일인 파일을 열면 /usr/local/include/sslwrap.pem
로 시작해서 -----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE
로 끝나는 부분과 로 시작해서 KEY----- , -----BEGIN CERTIFICATE-----
로 끝나는 부분이 있는데 이 중에서 -----END CERTIFICATE----- , "-----BEGIN
부분만 복사해서 등의 클라이 CERTIFICATE ...... END CERTIFICATE-----" Windows
언트 에 라는 파일로 복사를 한다 그리고 이 파일에서 오른쪽 마우스를 클릭 PC server.crt .
하면 인증서 설치 라는 메뉴가 보이는데 여기에서 인증서 설치 를 실행한다 이후 나오 , . “ ” “ ”
는 화면에서 모두 다음 다음 을 선택 후 마침을 선택하면 에서의 설치가 완료된 --> PC “ “ ” “
다 다음부터는 자체적으로 사인한 인증서를 사용하더라도 경고 화면이 나오지 않는 것을 .
확인할 수 있을 것이다 그럼 실제로 를 사용할 때 실제로 암호화가 되어 스니핑 할 . . pop3s
수 없는지 실제로 테스트해 보도록 하자 각종 리눅스 스니퍼 프로그램을 이용해도 되지만 .
여기에서는 를 이용해 테스트 해 보았다 tcpdump .
먼저 아래와 같이 서버에서 설정하여 연결을 캡처할 수 있도록 준비하고 로 메일을 pop3
받아보도록 하자.
# tcpdump -x host 211.1.1.1 > pop3.txt
이번에는 암호화 전송 프로토콜인 로 패킷을 캡쳐할 수 있도록 준비하고 로 pop3s pop3s
받아보도록 하자.
# tcpdump -x host 211.1.1.1 > pop3s.txt
이 명령어는 메일 클라이언트 프로그램을 실행하는 로부터의 패킷을 진수로 211.1.1.1 16
캡처하여 각각 와 라는 파일로 저장을 한다는 의미이다 이후 캡처한 데 pop3.txt pop3s.txt .
이터를 진수로 표기하는 아스키 코드표로 해석을 하면 된다 진수로 표기하는 아스키 16 . 16
표는 를 참고하기 바란다 http://www.asciitable.com/ .
또는 아래처럼 진수를 아스키로 변환해 주는 프로그램을 이용해서 변환할 수도 16 trans.pl
있다.
#!/usr/bin/perl
while(<>){
s/ //g;
s/([a-fA-F0-9][a-fA-F0-9])/pack("c",hex($1))/eg;
print $_;
}
위와 같이 작성 후 또는 를 하면 아래와 같이 덤프받은 데 perl trans.pl pop3.txt pop3s.txt
이터를 아스키로 변환할 수 있다 물론 아래처럼 깨끗하게 변환은 되지 않지만 파 . pop3.txt
일의 내용을 읽을 수 있다는 것을 확인할 수 있을 것이다 반면에 파일을 변환해 . pop3s.txt
보면 암호화가 되어 거의 어떤 문자인지 알아볼 수 없다는 것을 알 수 있을 것이다.
를 스니핑한 예 # pop3
+OK POP3 test1.tt.co.kr v2001.77 server ready
user user1
+OK User name accepted, password please
pass dkssud
+OK Mailbox open, 2 messages
를 스니핑한 예 #pop3s
E[u@@??Aj
?@.? D57? 霑
뿔 P a?u?8?? ?
ᇹ ? 4?Ti 欠夫
EFv@@??Aj
?@.? w57? 霑
를 이용한 방법에 대해서는 를 참고하기 sslwrap http://www.quiltaholic.com/rickk/sslwrap/
바란다.
의 포트 포워딩 기능을 이용한 암호화 (2) SSH
클라이언트와 서버 연결 구간에는 암호화 통신을 한다는 것을 알고 있다 이 특성을 활 ssh .
용하여 에서 제공하는 포트 포워딩 기능을 이용하면 암호화가 제공되지 않는 프로토콜 ssh
도 쉽게 암호화 전송할 수 있다 쉽게 이야기하면 에서 기존의 서비스를 캡슐로 싸서 . ssh
서비스한다고 생각해도 된다.
포트 포워딩 기능을 이용해 클라이언트와 서버 사이에 암호화를 위한 터널을 구성 ssh ssh
할 수 있는데 이를 구성하기 위한 방법은 로컬포트 포워딩 과 원격포트 포워딩 두 가지 , “ “ ” “
방법이 있다 두 방법 모두 거의 유사한 방법이므로 여기에서는 로컬포트 포워딩 방법에 대 .
해 알아보도록 하자.
클라이언트와 서버간에는 암호화 전송이 되기 때문에 일단 연결을 할 기존의 ssh ssh tcp
서버외에 연결을 할 클라이언트로 사용할 추가적인 한 대의 서버가 더 필요하다 ssh .
아래와 같이 두 대의 서버가 있다고 하자.
서버는 클라이언트 연결을 하여 클라이언트의 연결을 받아 를 이용하여 forward ssh ssh
연결을 포워딩 할 서버이고 서버가 포워딩을 받아 실제로 서비스를 제공할 서 TCP www
버이다.
그림 포트 포워딩서버 구성도 < > ssh
위와 같은 환경에서 하여야 할 일은 먼저 암호화를 할 포트에 대해 터널을 구성하는 ssh
것이다 이는 클라이언트 즉 서버에서 다음과 같은 형식으로 연결을 하면 된 . ( forward) ssh
다.
로컬포트 원격호스트 원격포트 서버호스트 ssh -L : : :SSH
위와 같은 환경에서는 원격 호스트와 서버 호스트가 같으므로 서버에서 단지 SSH forward
와 같이 접속을 하면 된다 아래는 실제 접속 예이다 ssh -L 10110:www:110:www . .
[root@forward /root]# ssh -L 10110:www:110 www
root@www's password:xxxxxx 암호 입력 <---
[root@www /root]#
이 상태에서 와 서버에서 각각 을 해 보면 forward www netstat
서버의 경우 forward
0 *:10110 *:* LISTEN
foirward:47883 www:22 ESTABLISHED
와 같이 번 포트가 리슨하고 있으며 서버에 번 포트로 접속해 있는 상 10110 www 22 ssh
황을 발견할 수 있을 것이다.
그리고 서버의 경우 아래와 같이 서버의 연결이 성립되어 있는 것을 확 www forward ssh
인할 수 있다.
www:22 forward:47883 ESTABLISHED
이 상태에서 외부에서 서버에 연결을 하려면 바로 서버에 번으로 연 www pop3d www 110
결하는 것이 아니라 서버에 번으로 접속을 하면 된다 아래와 같이 forward 10110 .
서버에 번 포트로 접속을 하면 서버가 아니라 서버의 번 forward 10110 forward www 110
포트가 반응하는 것을 확인할 수 있다.
# telnet forward 10110
Trying 211.1.1.2...
Connected to forward.
Escape character is '^]'.
+OK POP3 www v2001.75 server ready
실제로 아웃룩 익스프레스등 메일 프로그램에서도 받는 메일 서버 에 기존의 대 (pop3) www
신 로 입력하고 고급 탭에서도 아래와 같이 기존의 번 포트 대신에 forward 110 10110 “ ”
을 입력한다 그리고 이와 같은 의 포트 포워딩 방식으로 나 서비스도 . ssh smtp telnet, ftp
암호화 전송할 수 있는데 만약 서비스에 대해 기존의 번 대신 와 같이 포워 , smtp 25 10125
딩 하였을 경우에는 아래와 같이 포트를 변경하여 설정하면 된다.
그림 포트 포워딩시 설정예 < > .
이 상태에서 앞에서 했던 방법으로 를 이용하여 스니핑을 해서 포트 포워딩된 패 tcpdump
킷을 캡처해 보면 암호화 전송이 되고 있는 것을 확인할 수 있을 것이다.
마치면서
가 디자인 될 당시에는 네트워크는 그리 복잡하지 않았고 상호간에 신뢰할 수 있었 TCP/IP
기 때문에 그다지 보안을 고려하지 않아 는 그 자체적으로 매우 많은 보안적인 결함 TCP/IP
을 가지고 있다 앞에서 밝힌 것 외에도 다른 많은 보안적 결함이 있으며 이를 이용한 많은 .
공격들이 인터넷상에 존재한다 이 글을 계기로 늘 사용하고 있는 프로토콜이 그 . TCP/IP
자체로 얼마나 보안적인 취약점을 안고 있는지 알 수 있는 계기가 되었기를 바라며 아울러
실제적인 방법이나 기법보다는 그 작동 원리에 대해 조금이나마 알게 되었기를 바란다.
이외 더 많은 정보에 대해서는 아래의 사이트가 도움이 될 것이다.
참고사이트 :
http://packetstorm.decepticons.org/sniffers/
http://www.linuxsecurity.com/resource_files/network_security/sniffing-faq.html
http://www.robertgraham.com/pubs/network-intrusion-detection.html
http://www.certcc.or.kr/paper/tr2000/2000-07/tr2000-07.htm
http://www.ietf.org/rfc/rfc0826.txt?number=826






▶ 원문: http://www.tt.co.kr/~antihong/documents/arp_sniffing.pdf


◆ 가우리정보센터 (GBC)

2006/09/08 22:43 2006/09/08 22:43

chkconfig 사용법

Hacking 2006/09/08 22:37
리눅스 보안관련 문서 #5 - chkconfig 사용법(부팅시 수행되는 서비스)

1. 본 메뉴얼은 www.besthan.net 웹호스팅에서 서비스를 제공받은 고객님께 제공되는 메뉴얼 입니다.
이 메뉴얼은 저희 홈페이지에서 다시 보실수 있습니다.

2. 본 메뉴얼은 리눅스 서버 호스팅에서 필요한 부분만 요약한 메뉴얼 입니다.

3. 메뉴얼에 설명된 내용중 궁금하시거나, 설명이 잘못되었거나, 이상한 부분은 메일주시기 바랍니다.

자신의 서버를 부팅할 경우 어떤 데몬이 살아있고, 어떤 데몬이 죽어있고, 어떤 데몬을 사용할 수 있는가를
아는것이 해킹을 막을 수 있는 가장 유용한 방법입니다.

chkconfig를 이용하여, 데몬중에 반드시 있어야할 데몬을 남겨두고는 전부 죽이는게 해킹을 방지할 수 있는 지름길
입니다.

#chkconfig --list (/sbin 밑에 위치)
#chkconfig --help (참고)
#chkconfig --level 3 sendmail off (사용방법예)

#chkconfig --list (하면 나오는것들)
xfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
anacron 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
apmd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
arpwatch 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
atd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
keytable 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
gpm 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
inet 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
netfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
network 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
random 0:끔 1:켬 2:켬 3:켬 4:켬 5:켬 6:끔
ipchains 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
pcmcia 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
kdcrotate 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
kudzu 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
linuxconf 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
lpd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
nfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
nfslock 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
identd 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
portmap 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rstatd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rusersd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rwalld 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rwhod 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
sendmail 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
syslog 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
snmpd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
crond 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
ypbind 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
yppasswdd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
ypserv 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
proftpd 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
named 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔

이중 켜야할것은 보통 9개정도밖에 안됩니다.
3번레벨을 기준으로, keytable,inet, network,random,kudzu,sendmail,syslog, crond,proftpd 나머지는 off
시켜주는것이 바람직합니다. (자기의 환경에 맞춰서 설정해주시기 바랍니다.)
2006/09/08 22:37 2006/09/08 22:37

rootkit

Hacking 2006/09/08 22:36
출처 블로그 > silverdory의 블로그
원본 http://blog.naver.com/silverdory/20007147439
ADMIN "Safe Machine, Safe Admin" Sat. 2004/11/06
MainIntroductionDocsLinksBoardQandA

rootkit

작성 : 김경애, drizzle@snags.snu.ac.kr

날짜 : 1999년 11월 2일

내용 : rootkit의 특징과 진단 방법에 대해 설명합니다.


차례

  1. rootkit에 대한 설명
  2. rootkit의 특징
  3. rootkit의 진단
  4. 대응 방향

1.rootkit에 대한 설명 /

다른 시스템에 침입하기 위한 프로그램 등이 다양하지만, linux 와 solaris에 설치 가능한 것 중에 rootkit이란 패키지가 있습니다. 원격으로 슈퍼 유저 로그인이 가능할 뿐만 아니라 침입했다는 사실을 숨기는 기능까지 있기 때문에 매우 위험합니다. 98년 12월에 나온 linux rootkit IV가 최신 버젼이며, 이는 다양한 툴들을 제공합니다.그 전의 버젼들은 이에 포함되어 있으므로 생략하기로 하고 이를 기준으로 살펴보기로 합니다.

  • 일반 유저를 슈퍼유저로 만들어주는 chfn, chsh, passwd 등
  • eggdrop 등을 자동으로 돌려주는 crontab의 기능
  • 침입 흔적을 숨겨주는 ls, find, du, ps, pidof, top 등
  • 네트웍 연결을 숨겨주는 ifconfig, netstat, inetd, syslogd, tcpd 등
  • backdoor 기능을 하는 login, rshd 등
  • wtmp, utmp 등을 수정하는 wted, 그리고 lastlog 까지 지우는 z2 등

    이처럼 rootkit은 로그가 남지 않게 하면서 network으로 슈퍼유저 로그인이 가능하며, 위와 같은 파일들을 새로 설치한다 하더라도 fix라는 기능으로 그 파일의 modified time을 바꾸지 않기 때문에 rootkit이라는 사실을 잘 찾아낼 수 없습니다.

    2.rootkit의 특징 /

    rootkit은 가장 기본적인 명령들 - ls, find, ps, ifconfig, netstat 등- 의 파일을 다른 특수 파일들을 참고 하게 하여 특정 사실들을 보이지 않게 하는 용도로 많이 사용됩니다. 기본적으로 컴파일을 하면, 주로 참고하는 파일이 /dev 아래에 만들어지며, sda69*로 시작되는 파일이나, pty*로 시작되는 파일이 default로 설치되는 것으로 보입니다.

    login
    rootkit 패스워드를 알고 있는 어떤 계정도 로그인이 가능합니다. 슈퍼유저로 로그인을 막고 있다 하더라도 "rewt"로 로그인하면 가능합니다. last, w 명령으로 보이지 않고, log도 남지 않습니다.

    ls
    특정 파일이나 디렉토리 등을 보이지 않게 할 수 있습니다. 이는 rootkit 컴파일시 rootkit.h의 설정 파일에서 참고 파일을 지정할 수 있고, default는 /dev/ptyr로 되어 있습니다.

    # more /pytr    chattr    tcp.log    .s    s    ssynk    ptycron    /dev/ptycron    ptyp    /dev/ptyp    ptyq    /dev/ptyq    ptys    /dev/ptys    ptyr    /dev/ptyr
    이처럼 하면, /dev/pty[pqtr] 등의 파일이 보이지 않습니다.

    netstat
    특정 IP address 나 domain name, port 등을 보이지 않게 합니다. 사용 형식은, 다음과 같습니다.

      default data file: /dev/ptyq       type 0: hide uid       type 1: hide local address       type 2: hide remote address       type 3: hide local port       type 4: hide remote port       type 5: hide UNIX socket path
    예를 들어,
    # more /dev/ptyq     0 500                1 128.31            2 128.31.39.20     3 8000            4 6667           5 .term/socket
    uid 가 500인 사용자, 128.31.X.X으로부터(from) 접속, 128.31.39.20으로의(to) 접속, port 8000으로 접속해오거나, port 6667로 다른 호스트에 접속한 것에 대한 내용을 모두 다 숨깁니다. 뿐만 아니라 .term/socket path를 포함한 UNIX socket에 대한 것을 숨기게 합니다.

    ps
    특정 프로세스에 대한 정보를 숨깁니다. default로는 /dev/ptyp의 설정 파일을 참고