되는대로 살자

[System Hacking] 백도어 찾기와 숨기기 본문

2009~2014/Hacking_System

[System Hacking] 백도어 찾기와 숨기기

malu 2011. 7. 21. 17:05

(1) 백도어 찾아내기 

먼저 앞의 포스팅에서 setuid를 이용하여 어떻게 백도어를 만들었는지 잠시 흐름을 되짚어봅시다. 우선 루트 사용자 권한으로 빈 파일을 만들어 코딩을 하고 이를 gcc로 컴파일 한 뒤 , setuid 설정 및 접근 권한을 변경시켜 주었습니다. 여기서 우리는 백도어의 두가지 특성을 알 수 있습니다.
1.소유자가 root이다. 
-setuid 자체가 실행 시 그 파일의 소유자의 구너한을 잠시 얻게되는 모드이기 때문에 setuid 백도어 파일의 소유자는 root 일 수 밖에 없습니다. 

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

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

#find / -user root -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> <upl downl report>라는 내용이 출력되는 군요

권리자가 이 파일을 실행해보았을 때 이 내용이 뜨지 않는다면 이 파일이 위장한 백도어임을 의심할 수 있습니다. 따라서 백도어에 약간의 조자긍ㄹ 해줍니다. 
 backdoor 파일에 printf("usage: usernetctl <interface-config> <upldownlreport>\n"); 라인을 추가해줍니다. 이때 띄워쓰기는 ./usernetctl을 실행했을 때 보이는 것과 똑같이 해줘야겠죠! 
저장하고 나와서 컴파일을 하고 접근 권한을 바꿔줍니다.잘 되는것을 확인했으면 

이제 usernetctl파일에 backexec를 덮어씌웁시다. 
#mv backexec /usr/sbin/usernetctl

이 명령어를 수행하면 됩니다. 

cb /usr/sbin/으로 해당 디렉토리로 이동하여 
ls -l usernetctl로 파일을 확인해 봅니다. 

끝 ㅋㅋ