Major Study./System hacking

디지털 포렌식 - 공개도구를 이용한 분석

sosal 2010. 11. 23. 23:44
반응형
/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

고객으로부터 web server 게시판으로 upload가 되지 않는다는 항의가 접수 되었다.
해당하는 서비스는 당신이 관리하는 솔라리스 시스템의 /var 파티션과 관련이 있다.

문제의 시스템을 살펴 본 결과, 해당 파티션의 사용 가능한 공간
(available disk space)이 0 이었고, 여유 공간이 전혀 없는 상태였다.

그런데, 특이한 점은 해당 파티션 내에 문제를 발생시킬만한 크기의 파일을 찾을 수 없었다.

모든 상황을 고려해 볼때, 모종의 프로세스가 unlink된 어떤 파일에 대고
dummy data를 계속적으로 write하고 있을 가능성이 높은 것으로 생각된다.
해당 프로세스를 찾아 죽이고, 문제가 되는 파일을 탐지하라.

-----

문제의 목적은, dummy data를 계속적으로 write하여 파티션의 공간을 모두 잡아먹는
프로세스를 찾아 (DOS 공격?) 죽이고, 문제가 되는 파일을 찾아내는 것입니다.
해당 서비스가 /var 위치에 파티션 되어있으므로, 그 위치에서 동작하는 프로세스 들이
어떤 파일들을 사용하고 있는가? 를 보면 된다.

lsof는 List of File의 약자로,
프로세스에서 어떤 파일이 사용되고 있는지, 어떤 소켓이 열려있는지 확인할 수 있다.

lsof -i // 모든 internet, network file들을 확인
lsof -i@165.246.xx.xxx // 현재 서버가 ip와 연결되어있는 파일, 또는 소켓들을 확인
lsof -u "user_id" // 사용자가 사용하고있는 파일들을 확인해준다.
lsof -p "pid" // 특정 프로세스가 사용하고있는 파일확인
lsof "file_name" // 특정 파일을 엑세스한 프로세스, 사용자 확인
lsof "path_dir" // 특정 위치에 있는 모든 파일, 혹은 프로세스가 사용하는 파일 확인

lsof 명령어를 통해 /var 파티션 위에 올라와있는 모든 파일(혹은 프로세스) 들이
사용하고있는 파일들을 살펴보자.

그러나 lsof 명령어가 실행이 안된다. 아마 PATH 환경변수에 lsof 명령어가 있는
디렉토리 위치가 추가가 되어있지 않은듯 하므로, 직접 위치를 찾아
절대경로를 이용하여 실행하도록 하자.




lsof 명령어를 사용하여 /var 파티션에서 돌아가는 파일(프로세스)들이
어떤 파일을 사용하고있는지 확인하자.



pid 46번 vfsadmd.6 이란 녀석이 분명 어떤 파일을 열고 있는데, 파일명이 없다.
unlink된 파일에다가 지속적인 데이타를 write 한다고 했는데, 아마 이 프로세스인것을 예측할 수 있다.

일단 이 프로세스에 대해서 더욱 자세히 알기위해 pid 46번이라는 프로세스를 다시 lsof로 확인해보자.
(pid는 물론 바뀔 수 있으므로, vfsadmd.6 이 가지는 pid를 정확하게 확인해주세요)



vfsadmd.5 라는 이름의 의심스러운 프로세스 바이너리 위치를 찾았다.
/usr/bin/vfsadmd.5 라는 녀석인데,
보통 파일 시스템콜을 사용하여 파일 디스크립터를 만들 때
open("Path_of_binary", O_CREAT.... ..  . .  . .  )
등을 사용한다. 따라서 저 바이너리 속에 문자열로 의심되는 아스키값을 뽑아내면
저녀석이 write하고있는 파일의 위치를 알아낼 수 있다.
(strings 명령어)



이를 통해 vfsadmd.5 라는 녀석이 어떤 파일에다가 write 를 하고있는지 알게되었으므로,
프로세스를 종료시키고, 문제가 되는 파일(즉 /dev/dummy.log)을 답으로 인증하면
문제는 풀리게 된다.





이 문제의 다른 풀이를 보니, 출제자의 의도대로 푼건 아니지만
굉장히 좋은 아이디어로 푼 풀이과정이 있다. (실무에선 도움이 되지 않을듯..)



/var 파티션에 오픈되어있는 파일을 찾기 위해서 문제를 시작하기 전의 프로세스 목록과
문제를 시작한 후의 프로세스 목록을 비교하여, 문제가 원하는 프로세스를 찾아내는 방법이다 --;
위치까지 적나라하게 들어나니, 이렇게 풀면 금방 풀 수 있겠다.

수고하셨습니다.