시스템보안(지식창고)

Setuid를 이용한 백도어 만들기(3)- 백도어 찾아내기와 백도어 숨기기

컴공 2013. 2. 15. 22:09
반응형

이번에는 백도어를 찾는 방법과, 또 숨기는 방법대해 포스팅하겠습니다.

(1) 백도어 찾아내기

먼저 앞의 두 포스팅에서 setuid를 이용하여 어떻게 백도어를 만들었는지 잠시 흐름을 되짚어봅시다.

우선 루트사용자 권한으로 빈 파일을 만들어 코딩을 하고 이를 gcc로 컴파일한뒤, setuid 설정 및 접근권한을 변경시켜 주었습니다.

여기서 우리는 백도어의 두가지 특성을 알 수 있습니다.

1. 소유자가 root이다.

- setuid 자체가 실행 시 그 파일의 소유자의 권한을 잠시 얻게되는 모드이기 때문에 setuid 백도어 파일의 소유자는 root일 수 밖에 없습니다.

2. 접근권한이 4000이상이다.

- chmod로 파일을 setuid로 설정할 시 백도어 파일의 접근권한 세자리 숫자( ex: 755) 앞에 4가 붙기때문에 접근권한이 4000이상임을 알 수 있습니다.

이 두가지 명백한 사실을 이용하여 백도어를 찾아냅니다.

명령어는? 물론 find죠!

#find / -user root -perm +4000 를 입력합니다.

이전 실습을 통해 제가 만들었던 백도어들이 검색되는 것을 보실 수 있습니다.

다시 말하지만 root 소유(-user root) 이면서 접근권한이 4000 이상(-perm +4000)인 파일들을 검색하여 백도어를 찾아내는 것입니다.

백도어를 발견했다면 이를 지워줘야겠죠. /backdoor 는 누가 봐도 명백히 백도어이므로 지워줍니다.

#rm -rf /backdoor

만약 find 해서 나온 setuid 파일들을 모조리 지워주고 싶다면 다음 명령어를 사용합니다.

#find / -user root -perm +4000 -exec rm {} \;

이 명령어를 사용하면 시스템 상의 중요한 설정파일들이 날라갈 수 있으므로 사용하지 않는 것을 추천합니다.

리눅스 OS에는 원래부터 깔려있는 root 소유의 setuid 파일들이 몇 개 있습니다.

이 파일들 중 몇 개는 시스템 전체에 중요한 영향을 끼치기 때문에 관리자가 함부로 지울 수 없습니다. 때문에 시스템 보안 관리자는 백도어를 찾기 위해 기존의 setuid 파일들 외에 추가로 생성된 setuid 파일들, 또는 기존의 setuid 파일로 위장한 백도어 파일들을 조사해야 합니다.

(2) 백도어 숨기기

찾아내는 방법이 있다면 이를 피해 숨기는 방법도 나오기 마련입니다.

눈치가 빠르신 분은 벌써 알아차리셨겠지만 백도어를 숨기는 가장 쉬운 길은 백도어가 마치 시스템 상의 중요한 setuid 파일인 것처럼 위장하는 것입니다.

우선 시스템에 있는 root 소유의 setuid파일들 중에, 기능이 없어져도 큰 티가 안나는 파일을 찾아냅니다. 그 뒤 관리자가 이 파일이 백도어로 변경되었는지 확인해 볼 때 출력되는 내용을, 백도어에서도 그대로 출력되게 만듭니다. 끝으로 그 파일을 지우고 백도어를 그 파일로 위장하여 집어넣는다면, 쉽게 찾을 수 없는 백도어가 만들어지게 되는 것입니다.

#find / -user root -perm +4000 을 입력하였을 때 검색된 파일들 중 하나인

/usr/sbin 디렉토리의 usernetctl 파일을 바꿔치기의 희생양(?)으로 삼았습니다.

usernetctl을 단순히 실행시켰을 때 출력되는 내용을 확인합니다.

./usernetctl 을 통해 파일을 실행시켜보니

usage: usernetctl <interface-config> <up| down| report>라는 내용이 출력되는 군요.

관리자가 이 파일을 실행해보았을 때 이 내용이 뜨지 않는다면 이 파일이 위장한 백도어임을 의심할 수 있습니다. 따라서 백도어에 약간의 조작을 해줍니다.

백도어는 Setuid를 이용한 백도어 만들기(2) 에서 만들었던 backexec를 이용하겠습니다.

먼저 backexec.c가 있는 디렉토리에 가셔서

#vi backexec.c 명령어로 파일 편집 모드로 들어갑니다. 그리고 마지막에 보기와 같은 코드를 추가해 줍니다.

위 그림처럼 마지막에

printf("usage: usernetctl <interface-config> <up|down|report>\n");

라인을 추가해줍니다.

이때 띄어쓰기는 ./usernetctl을 실행했을 때 보이는 것과 똑같이 해줘야하겠죠!

저장하고 나와서(:wq!) 컴파일을 하고 접근권한을 바꿔줍니다.

#gcc -o backexec backexec.c

#chmod 4755 backexec.c

한번 잘 실행되는지 확인해봅시다.

#./backexec

잘 되는군요!

이제 usernetctl 파일에 backexec를 덮어 씌웁시다.

#mv backexec /usr/sbin/usernetctl

이 명령어를 수행하면 backexec 파일은 사라지면서 usernetctl 대신 그 자리에 나타납니다.

cd /usr/sbin/ 으로 해당 디렉토리로 이동하여

ls -l usernetctl 로 파일을 확인해봅니다.

위 그림에서 보시는 대로 백도어가 usernetctl이란 이름으로 재탄생했습니다. 관리자가 ./usernetctl로 이 파일을 확인할 때, 본래 usernetctl 이 출력하던 메세지를 출력하게 되어 눈속임을 할 수 있겟죠.

backexec를 컴파일 하기 전 원본인 backexec.c는 지우고,

이제 일반사용자로 접속하여 백도어를 실행해봅시다.

그림과 같이 ./usernetctl 로 그냥 파일을 실행시켰을때는 단순히 메시지만 출력하던 것이, 본래 backexec 의 이용방법대로 뒤에 ""를 붙여 안에 원하는 명령어를 입력하니 root 권한으로 명령을 수행하는 것을 볼 수 있습니다.

오늘 포스팅한 백도어 찾는 방법과 숨기는 방법은 백도어를 다룸에 있어 기본이 되는 개념들이니, 여러번 보셔서 확실히 익혀두는 것이 도움이 되리라 생각합니다.

Setuid를 이용한 백도어 포스팅이 끝났습니다. 학교에서 배운 내용을 정리하여 포스팅하니 머리에도 오래 남고, 무엇보다 유용한 지식들을 다른 사람과 공유할 수 있어서 뿌듯합니다. 그럼 오늘도 즐거운 하루 되세요!

반응형