Easy PC


리눅스 산책

시스템 관리자에게 보내는 편지
리눅스 시스템의 해킹

글 | 오태호 ohhara@postech.edu

최근 들어서 해커들에 의한 시스템 침입 사고가 급속히 늘고 있다. 특히 리눅스를 대상으로 한 해킹이 급속도로 증가하고 있는 추세다. 내부 구조가 완전히 공개되어 있는 리눅스는 많은 사람에 의해 조직적으로 만들어져서 다른 운영체제에 비해 속도도 빠르고 견고하며, 버그도 상대적으로 적다. 하지만 역으로 누구나 내부 구조를 분석할 수 있기 때문에 실력 있는 이들이 운영체제를 분석해 버그를 찾아낼 가능성이 다른 운영체제에 비해서 높은 것도 사실이다. 여기서는 리눅스를 관리하는 관리자가 이런 해커들로부터의 공격을 어떻게 하면 효과적으로 막을 수 있는지에 대해 살펴보도록 한다.참고로, 이 글에서는 원래 컴퓨터 마니아를 뜻하는 '해커(hacker)'라는 용어의 범위를 시스템을 파괴하는 '크래커(cracker)'까지 포함한 의미로 사용하겠다. 현재는 크래커도 모두 편의상 해커라고 부르는 경우가 많기 때문이다.

무시무시한 해커들이 등장하는 영화를 본 일반인들은 해커가 다른 이의 시스템에 접근하는 이유를 대부분 '상대 기업이나 상대 국가에서 극비 자료를 가져오기 위해서'라고 상상하기 십상일 것이다. 물론 이런 행동은 바람직하지 않지만, 영화 속의 해커는 고민과 연구 끝에 결국 해킹에 성공하고야 말고, 이 모든 과정이 멋있고 근사하게 묘사되고 있다. 이러한 이유로 혈기 넘치는 많은 젊은이들이 해커를 동경하며 스스로 해커가 되고 싶어한다. 언론에서도 이러한 분위기에 편승하여 어떤 이가 해킹을 하다가 붙잡혔을 경우 천재적인 실력을 지닌 아까운 인재가 한 순간의 판단 착오로 감옥에 가게 되었다는 식으로 영웅 만들기에 급급하다. 이렇게 실력을 인정(?)받은 해커들이 감옥에서 나오자마자 수많은 대기업이나 정부에서 서로 '모셔가려는' 모습을 보는 것도 낯설지 않다.
하지만 해커의 모습은 이렇듯 일반인들이 상상하는 것과는 전혀 다른 경우가 대부분이다. 지금 활동하고 있는 해커들 중에 앞에서 열거했듯이 사람들의 부러움을 받을 만한 모습을 지닌 이는 전체의 10%도 되지 않을 것이다. 해커들 대부분은 다음과 같은 생활을 한다.

현재 대부분의 해커들의 모습이 바로 이렇다. 해커란 상당한 지식과 전문성을 지닌 사람으로 생각하기 쉽지만, 이러한 수준의 행동 정도는 인터넷을 사용할 줄만 안다면 중·고등학생이라거나 해킹에 대한 사전 지식이 전혀 없더라도 쉽게 할 수 있다. 그리고 해커의 대다수는 이러한 어린 학생들인 것이 사실이다. 검거되는 대부분의 해커가 10대이거나 20대 초반의 젊은 사람이라는 점이 이를 반증한다. 또한 이런 해커들은 보통 자신이 어떤 원리로 상대방의 서버 관리자 권한을 획득할 수 있었는지에 대해 제대로 알고 있지 못한 경우가 많다.

운영체제에 새로운 버그가 발견되지 않았는지 보안 사이트를 뒤지고 돌아다닌다.

보안상 중요한 버그가 발견되면 그에 대한 공격 코드를 누군가가 만들어놓지 않았을까 생각하며 그 공격 코드를 찾아 인터넷을 헤매고 돌아다닌다. 만약 지금까지 알려지지 않은 버그를 이용한 공격 코드가 발견되면 뛸 듯이 좋아한다.

이렇게 모은 수많은 공격 코드를 이용해 IP 주소 0.0.0.0부터 255.255.255.255 중에서 적당한 범위를 지정하고 차례차례 공격을 시도한다.

공격을 통해 시스템 접근에 성공하게 되면, 해당 서버에 침입한 후 또다시 적당한 범위를 지정하여 공격을 반복한다. 이런 식으로 하루에 수십 대에서 수백 대의 서버를 공격하고, 결국 해킹에 성공해 관리자(root) 권한을 획득한다. 획득한 서버의 관리자 권한은 나중에 자신의 위치를 속이기 위한 경유지로 쓰거나 불법 자료(상용 프로그램 따위)를 교환하는 장소로 사용한다.

인터넷 채팅인 irc에서 채팅을 하다가 자신에게 기분 나쁜 소리를 하는 이들을 만나게 되었을 경우 상대방한테 서비스 거부 공격(Denial of Service)을 가할 때도 해킹한 서버를 사용한다. 물론 이렇게 해서 확보한 서버들은 자신의 해킹 실력 과시용으로도 사용된다. "나는 하루에 수백 대의 서버를 해킹하는 천재 해커다."라는 말을 남기면서….

해킹에 성공한 후 해커들이 하는 행동은?

리눅스에서의 해킹에 대해 좀더 자세히 살펴보도록 하자. 우선 해커가 해킹에 성공한 후 침입한 시스템에서 하는 행동은 일반적으로 다음과 같다.

① rootkit을 설치한다 해킹에 성공한 후 해커들이 설치하는 트로이 목마 프로그램들을 흔히 rootkit이라 부른다. rootkit에 포함되어 있는 프로그램으로는 login, ps, pstree, top, ls, dir, vdir, chfn, chsh, du, ifconfig, in.rshd, netstat, syslogd, tcpd 등과 같은 시스템 프로그램들이 있다. 이런 프로그램들을 원래 있던 프로그램과 바꿔치기 해서 관리자가 시스템을 점검해도 별 이상이나 변화가 없는 것처럼 위장하게 만드는 것이다. 예를 들어, ls를 바꿔치기 해서 ls를 실행시켜도 해커가 만든 파일이 보이지 않도록 하며, ps를 바꿔치기 해서 ps를 실행시켜도 해커가 실행한 프로그램이 보이지 않게 할 수 있다. netstat를 바꿔치기 하면 외부에서 네트워크로 연결한 해커의 모습을 보이지 않게 할 수 있다. 또한 login 프로그램도 바꿔치기 해서 패스워드 파일(/etc/passwd)에는 없지만 root 권한을 가진 아이디로 로그인할 수 있도록 해놓을 수 있다. 문제는 이와 같은 프로그램들이 인터넷에 널리 퍼져 있어서 초보들도 손쉽게 사용할 수 있다는 점이다. 필자의 경험을 예로 들자면, /bin/login 프로그램을 strings를 사용해 분석해 보았지만 숨겨놓은 백도어(backdoor) 아이디와 비밀번호를 찾지 못했다. 하지만 objdump를 사용하여 disassemble로 숨겨놓은 아이디와 비밀번호를 찾을 수 있었다.

② 다른 해커는 들어오지 못하게 막는다 일단 시스템을 완전히 접수했다면, 다른 해커가 자신과 같은 방법으로 관리자 권한을 획득하는 것을 막기 위해 해당 서버에 있는 모든 버그를 패치해 놓는다. 대단한 독점욕이라 아니 할 수 없다.

③ eggdrop, bnc 등 irc 관련 프로그램을 설치한다 관리자들은 누군가가 자신의 서버에 침입해서 eggdrop과 bnc와 같은 프로그램을 설치해 놓은 것을 보고 이러한 프로그램들을 해킹 프로그램인 것으로 짐작하여 겁을 먹는 경우가 있다. 하지만 이들은 그리 위험한 프로그램은 아니다. eggdrop은 irc에서 가장 많이 사용되는 irc bot 프로그램이고, bnc는 irc에서 자신의 위치를 숨기기 위해 사용되는 irc proxy이다.

④ scan류의 프로그램을 설치해서 실행시킨다 mscan이나 sscan과 같은 여러 가지 보안 버그를 알려주는 프로그램을 설치해 광범위하게 스캔(scan, 대상 서버에서 어떠한 보안 버그가 있는지 분석해서 정리해 주는 행위)을 해서 기록한다. 예를 들어 .ac.kr에 있는 모든 서버를 대상으로 스캔을 한다. 이와 같은 일을 해커가 하게 되면, 시간이 조금 흐른 후에 스캔을 당한 서버 관리자의 항의가 올 것이다. 침입을 당한 컴퓨터에서는 영문도 모른 채 엄청난 항의를 받게 된다. 최근 mscan이나 sscan과 같은 프로그램으로 국내 서버에 대한 공격이 아주 유행하고 있다. 이러한 프로그램의 사용법 예제로 .ac.kr의 모든 서버를 대상으로 스캔을 하는 방법이 나와 있기 때문이다. 이로 인해 국내의 많은 대학 서버들이 피해를 보았다.

⑤ 서비스 거부(Denial of Service) 공격 프로그램을 설치한다 자신에게 기분 나쁜 소리를 하는 사람의 머신을 사용 불능 상태에 빠뜨리기 위해 서비스 거부 공격 프로그램을 설치해 놓고 필요할 때 사용한다. 서비스 거부 공격 기법은 상상하기 힘들 정도로 다양하다. 상대 서버에 순간적으로 패킷을 엄청나게 많이 보내서 네트워크 사용이 불가능하게 만들기도 하고, 서버 운영체제의 구조적인 버그를 이용해 서버를 다운시키기도 한다. 이런 류의 프로그램은 인터넷에서 쉽게 찾을 수 있다.

⑥ chattr 명령어를 사용해서 파일의 변경을 불가능하게 만든다 리눅스에는 ext2 파일 시스템을 직접 건드리는 chattr라는 명령어가 있다. 이 명령어를 사용하면 특정 파일에 대해 관리자라 할지라도 지우거나 변경하지 못하게 만들 수 있다. 이 프로그램을 사용해 자신이 설치한 프로그램들을 관리자가 건드리지 못하게 만든 다음 chattr 명령어를 삭제한다. 리눅스 시스템에 대해 잘 모르는 관리자의 경우 root 계정으로도 변경할 수 없는 파일이 있다는 사실에 당황하게 마련이고, 속수무책으로 해커에게 당하게 된다.

어딘가 어설픈 초보 해커들

최근 일고 있는 리눅스와 해킹에 대한 관심으로 수많은 초보 해커들이 등장하고 있다. 이들 초보 해커들은 나름대로 실력과 철학을 가진 이전 해커들과 구별되는 몇 가지 특징을 가지고 있다. 여러분들 스스로 해커라 자부하지만 다음에 해당하지는 않는지?

① 접속 기록을 지우지 않는다 외부에서 시스템에 접속한 기록은 모두 로그 파일로 남게 마련이고, 이는 추적의 열쇠가 되는 중요한 근거인데도 로그 파일을 지우지 않는다. 행여 지운다 하더라도 인터넷에 있는 공개 프로그램을 단순히 사용하는 수준이기 때문에 관리자가 해킹 사고가 나기 전에 약간의 조작만 해준다면 기록을 모두 살릴 수 있다.

② history를 지우지 않는다 셸에서 실행한 여러 가지 명령어는 접속한 계정의 홈 디렉터리에 history 파일로 남게 되는데, 이것도 지우지 않는 경우를 흔히 볼 수 있다.

③ 관리자에게 들키는 것을 겁내지 않는다 관리자가 해커를 발견해서 talk(유닉스의 터미널에서 사용할 수 있는 1:1 채팅 프로그램)를 요청하면 이를 받아주기도 하고, 한술 더 떠 "자신에게 서버를 관리할 권한을 주면 안전하게 해주겠다."는 말도 서슴지 않고 한다. 뿐만 아니라 해커가 공격한 흔적을 관리자가 발견해서 연결을 강제로 끊어도(이 때 해커는 관리자에게 자신이 들켰음을 알게 됨) 해커는 계속 연결을 시도한다. 자기가 하고 있는 일이 일종의 범죄임을 전혀 인식하지 못하는 것이다. 무식하면 용감하다?

④ 전혀 잡히지 않는다는 확신을 가지고 있다 해커는 일반적으로 전화선을 사용한다. 전화선을 사용하게 되면 추적이 힘든 것이 사실이고, 이 때문에 해커는 아무런 거리낌없이 자신은 잡히지 않는다는 확신을 가지고 행동한다. 그러나 세상에 완벽한 범죄란 없다.

⑤ 리눅스에 대해 전혀 모르는 경우가 많다 이러한 초보 해커들이 운 좋게 시스템에 접근하더라도 하는 행동을 가만히 살펴보면 리눅스 시스템에 대해 아는 게 전혀 없다고 느껴지는 경우가 많이 있다. 심지어 리눅스에서 도스 명령어를 실행하려는 경우도 많이 볼 수 있다.

리눅스 시스템의 보안을 위해 신경 써야 할 것들

앞에서 소개한 종류의 초보 해커를 비롯한 대부분의 해커들은 관리자가 약간만 주의를 기울이면 어렵지 않게 막을 수 있다. 아래 열거한 모든 사항을 다 해주면 좋겠지만, 그렇게 하기가 힘들다면 ①∼③번 정도는 반드시 해주도록 한다.

① 데몬은 필요한 것만 띄우고 나머지는 모두 죽인다 최근 버전의 리눅스는 linuxconf 명령어를 사용해 사용하고자 하는 데몬만 쉽게 띄울 수 있도록 되어 있다. linuxconf가 설치되어 있지 않다면 다음과 같은 방법으로 원하는 데몬의 동작 여부를 결정한다. 예를 들어, nfs 데몬을 실행시키고 싶다면 '/etc/rc.d/init.d/nfs start'와 같이 하고, 죽이고 싶으면 '/etc/rc.d/init.d/nfs stop'처럼 하면 된다. 부팅시 nfs 데몬을 실행시키고 싶지 않다면 'chmod a-x /etc/rc.d/init.d/nfs'와 같이 실행시키면 된다. 필자의 경우 안전을 요하는 서버를 세팅할 때는 inetd(인터넷 데몬)도 죽여서 telnet, ftp 등도 사용할 수 없게 만든다.

② 리눅스에 대한 버그 패치가 새롭게 발표되면 즉시 받아서 설치한다 참고로, 가장 많이 사용하는 레드햇 리눅스의 버그 패치는 레드햇사의 홈페이지 'http://www.redhat.com/corp/support/errata/index.html'에서 구할 수 있으며, 설치는 'rpm -Uvh packagename.rpm'과 같은 형식으로 간단히 설치할 수 있다.

③ tcpwrapper와 같은 프로그램을 사용해 접근할 수 있는 대상을 최대한 줄인다 tcpwrapper를 사용하면 inetd를 통해서 접근하는 데몬에 한해 접근을 제한할 수 있다. 이와 같이 하면 보안성을 다소 높일 수 있다. 하지만 모든 데몬이 inetd를 통하는 것은 아니기 때문에 완전히 안심할 수는 없다는 것을 명심하자. tcpwrapper를 사용할 때는 모든 데몬에 대한 접근을 막고 필요한 것만 하나하나 여는 것이 안전하다. 우선 root 계정으로 로그인해 '/etc/hosts.deny' 파일을 다음과 같이 설정하면 모든 데몬에 대한 접근을 막을 수 있다. 이렇게 해놓으면 누군가가 데몬에 접근하다가 tcpwrapper에 의해 거부되면 상대방 서버에 finger를 해서 접근을 시도한 사람의 정보를 알아낸 후, 그 결과를 root에게 E-mail로 보낸다. '/etc/hosts.deny' 파일이 접근 제한에 대한 설정을 하는 것이라면 '/etc/hosts.allow' 파일을 통해서는 원하는 데몬에 대해 원하는 곳(IP 주소 입력)에서만 접근할 수 있도록 설정할 수 있다.

④ 방화벽 프로그램을 사용해 패킷을 걸러낸다 ipfwadm(kernel 2.0.x), ipchains(kernel 2.2.x)와 같은 방화벽(firewall) 프로그램을 사용하면 패킷이 오갈 때 이를 어떻게 처리할 것인지에 대해 자세히 설정할 수 있다. 하지만 이를 설정할 때는 네트워크 프로토콜에 대한 심도 있는 이해가 요구되므로 사전 지식이 필요하며, 신중히 사용해야 된다. 만약에 141.223. 영역에 있는 IP하고만 TCP 연결을 하고 나머지 모든 곳은 거부하고 싶으면 아래와 같이 하면 된다. 필자의 loghost를 ipchains로 패킷 필터링을 했더니 외부에서는 이 loghost가 존재하는지도 확인할 수 없었다.

⑤ sniff 방지를 위해 스위칭 허브를 사용한다 네트워크 환경에서 사용되는 일반적인 허브는 broadcasting(데이터 패킷을 연결된 모든 서버에 전달하는 것)을 한다. 그래서 근처의 한 서버가 해커에 의해 해킹을 당하면 근처의 모든 서버에 송수신되는 모든 데이터를 볼 수가 있다(이런 행동을 흔히 sniff라 부른다). 하지만 스위칭 허브를 사용하면 근처의 다른 서버의 데이터는 볼 수가 없게 되므로 보안성을 다소 높일 수 있다.

⑥ 중요한 데이터를 교환할 때는 암호화한다 ssh(secure shell), pgp(pretty good privacy)와 같은 프로그램을 사용해서 중요한 데이터는 암호화를 한 후에 송수신하도록 한다. 인터넷에서는 빠른 데이터 교환을 위해 기본적으로 암호화를 전혀 하지 않는다. 이로 인해 데이터를 중간에 가로채는 사고가 흔히 발생하기 때문에 보호가 필요한 중요한 데이터에 대해서는 암호화를 하는 것이 필수적이다.

다음으로 해킹을 당했을 때를 대비해 주기적으로 해주어야 할 것들에 대해 살펴보자. 앞의 사항과 마찬가지로 모두 다 해주면 좋겠지만, 여의치 않을 경우 ①번은 반드시 해주도록 한다.

① 백업을 생활화한다 백업의 중요성은 아무리 강조해도 지나치지 않다. 해커가 자신의 컴퓨터에 침입해서 자료를 파괴할 것이 걱정된다면, 백업을 '여러 곳에, 자주' 하면 된다. 또한 해커가 침입해서 순간적으로나마 관리자 권한을 획득한 흔적이 발견되었다면, 즉시 최근 백업해 둔 파일로 시스템을 복구해야 안전하다. 어느 곳에 어떤 뒷문(backdoor)을 숨겨놓았을지 알 수 없기 때문이다. 만약에 최근에 백업해 둔 파일이 없어 눈에 보이는 문제만 해결하고 넘어간다면, 나중에 다시 그 해커가 들어올 가능성이 얼마든지 있다.

② loghost를 별도로 지정한다 시스템에 대한 내용을 기록하는 syslogd는 일반적으로 자신의 호스트에서 발생하는 여러 가지 문제에 대한 것만 기록하도록 되어 있다. 하지만 이렇게 했을 경우, 만약에 해당 호스트가 해킹을 당해서 기록 파일이 해커에 의해 조작되어 버리면 이 기록은 믿을 수가 없게 된다. 이러한 이유로 기록 파일을 저장하는 서버(이를 loghost라 한다)를 하나 따로 만들고, 그 쪽에 기록을 보내는 것이 좋다. loghost를 설정하는 방법은 다음과 같다. syslogd를 실행시킬 때 -r 옵션을 주면 외부 호스트로부터의 기록도 받을 수 있도록 syslogd가 실행되어 loghost를 만들 수 있게 된다. loghost에 기록을 보내려면 해당 서버의 '/etc/syslog.conf' 파일 안에 다음과 같은 내용을 추가하고 'killall -HUP syslogd' 명령을 실행시켜 주면 된다(141.223.123.45은 loghost의 IP이다). 필자의 경우는 loghost를 여러 곳에 지정하여 자신의 접근 기록을 지우기 위해서는 여러 곳을 해킹해야만 하도록 만들어놓았다.

③ loghost의 내용을 주기적으로 프린트해서 안전한 장소에 보관한다 loghost는 당연히 해커의 침입이 거의 불가능할 정도로 안전하게 관리하는 것이 좋다. 만약에 loghost도 해킹당할 우려가 있다면, loghost의 기록을 주기적으로 프린트해서 안전한 장소에 따로 보관하도록 한다.

보안에 대한 자신감은 금물!

해커들로부터 반감을 살 만한 일은 하지 않는 것이 좋다. 보안에 대한 쓸데없는 자신감 등이 이에 해당할 것이다. 뛰어난 해커 몇 명이 특정 서버를 목표로 여러 가지 방법을 동원해 해킹을 시도한다면 살아남을 수 있는 서버는 거의 없다 해도 무방하다. 보안 버그 패치를 1주일에 한 번씩 하기 때문에 안전하다고 말하는 사람도 있지만, 보안 버그가 발표되고 1주일 안에 공격 코드를 만들어서 공격하면 해킹에 성공할 수 있기 때문에 완벽한 방법은 아니다. 또한 알려진 모든 버그를 빠른 속도로 패치한다고 하더라도, 지금까지 알려지지 않은 버그를 찾아서 공격해 들어올 경우에는 속수무책으로 당할 수밖에 없다.

해킹을 통해 서버의 내용을 바꾸는 것이 불가능하다고 하더라도, 목표 서버에 과부하를 줘서 서비스가 불가능하게 만드는 것은 얼마든지 가능한 일이다. 이러한 이유에서 고급 해커들로부터 공격을 받지 않으려면 해커들로부터 반감을 살 만한 행동을 되도록 하지 않는 것이 좋다. 필자 역시 해커를 뒤쫓다가 해커로부터 역공을 당해서 고생했던 쓰라린 경험을 가지고 있다.
마지막으로 해커가 되고자 하는 이들에게 당부할 것이 있다. 인터넷이 발달하고 해킹 도구가 발달하면서 해커가 되고자 하는 사람이 많아졌다. 컴퓨터에 대해서 아무것도 몰라도 조금만 공부하면 해커가 될 수 있을 정도다. 윈도의 백오리피스와 같은 도구들은 누구나 쉽게 사용할 수 있지 않은가? 이렇듯 아무것도 모르면서 상대방 시스템의 자료를 훔치고 파괴하는 것은 꼬마들도 할 수 있는 일이다. 이렇게 해커가 된다는 것이 쉬운 일인데, 그러한 평범한 해커가 되려는 것이 과연 의미 있는 일일까? 전혀 의미가 없다고 확언한다.

만약에 그래도 해커가 되고 싶다면, 해커란 말의 원래 의미를 살려 진정한 해커가 되어보자. 운영체제나 네트워크, 컴퓨터 시스템의 구조를 꼼꼼히 살펴보고, 구조적인 문제나 개선점은 없는지 끊임없이 연구하고 고민하는 그런 모습 말이다. 만약 문제가 있을 때는 세상에 알리고, 또 스스로 고쳐나가는 이야말로 진정 해커라 불릴 자격이 있을 것이다.

해커즈 랩 : 국내의 보안 기술 전문 업체인 시큐어소프트사에서 만든 해커들의 자유 지대로, 해커들의 두뇌 체육관이라는 별명을 가지고 있다. 음지에서 범죄자 취급을 받고 있는 해커들의 전문적인 컴퓨터 사용 기술을 양지로 끌어내 국가 경쟁력을 배가하자는 취지로 만들어진 해커즈 랩의 URL은 http://www.hackerslab.com 이며, 현재 13단계의 해킹 코스가 마련되어 있는 해커 자유 지대 서비스를 하고 있다.

백오리피스 : 지난해 7월 처음 공개된 '백 오리피스(Back Orifice)'는 윈도 운영체제를 사용하고 있는 시스템의 뒷구멍을 공략하는 해킹 도구이다. 'cDc(Cult of Dead Cow, 죽은 소 숭배)'라는 해커 그룹이 개발한 백 오리피스는 마이크로소프트 '백 오피스(Back Office)'의 패러디로 얼마전 백 오리피스 2000 버전이 발표되었다.

브로드캐스트 : 네트워크에 연결된 모든 호스트에 전달되는 신호를 일컫는 말로, C 클래스를 사용하고 있는 도메인(예. AAA.BBB.CCC.0)에서는 IP 주소 AAA.BBB.CCC.255가 브로드캐스팅을 위해 사용된다.

 

▶ 목차로