[어설픈] 해커스쿨 FTZ level 5 문제풀이

2019. 1. 15. 21:06System Hacking/FTZ


안녕하세요!


오늘은 비교적 간단한 

FTZ level 5 문제풀이

해보도록 하겠습니다!


우선 비밀번호를 입력한 후!

어떤 파일들이 있는지 확인을 하고

hint를 보니


아래와 같이 뜨네요!

/usr/bin에 level5라는 프로그램이 있다

이 프로그램은 /tmp에 

level5.tmp

임시파일을 생성!



그래서 바로 cd(디렉토리 움직일 때) /usr/bin을 입력

그리고 여기 안에 level5라는 파일이 존재!


그래서 바로 level5 파일을 실행시켰습니다!

./level5 커맨드를 통해서요!


그러면 저희가 tmp 파일로 가면 

level5.tmp 파일이 생겨있겠지요?



근데 저도 처음에

tmp 폴더가 level 5에 있는 

tmp 폴더 인줄 알고

착각했네요!


/tmp는 root(루트) 바로 밑에 있는

tmp 폴더에요!


그래서 밑에 보시면 제가 pwd로 

현재 위치 확인해 가면서 cd ..(상위폴더로 이동하는 커맨드)  입력해서

결국 root까지 올라간 다음에

바로 밑에 있는 tmp로 갔습니다! 


그래서 /tmp 디렉토리로 도착한 이후에

level5.tmp 파일이 

잘 생성됐나? 확인했습니다!


근데 ls를 입력하니

mysql.sock 이라는 뜬금없는

파일밖에 없네요?


분명히 hint에서는 파일이 생긴다고 했는데..

뭐지?


(1) 파일이 안 생겼나(이건 문제오류니까 ㄴㄴ)

(2) 그러면 파일이 생겼다는건데(그러면 지워진거네)

뭐 임시파일이나 그런 거

혹은 만들어지고 지워지도록 설정한거네...





근데 이 문제를 풀 때,

여러가지 방법이 있는데요!


(1) race condition 

(2) 파일 덮어쓰고 덮어쓴 파일 삭제 못하게 하기


저는 2번의 경우로 풀도록 하겠습니다!


(1)의 풀이는 다른 분들이 더 상세하게

설명하셨지만 간단하게

어떤 개념인지만 짚고 넘어갈게요!


일단 race condition의 사전적 정의는

'한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 벌이는 형상'


좀 더 직관적으로 이해 가게 풀어서 설명하자면

(그냥 설명하려고 드는 예시에요)

맘에 드는 여자(한정된 자원)를 두고 여러 명의 남자(프로세스)가 경쟁하는 것


사전적 정의는 저렇고 

레이스 컨디션 공격이 가능한 상황은

아래와 같습니다!


(a)해당 프로그램에 root(여기서는 level6)권한의 setuid비트가 걸려있다

(b) 프로그램이 실행 도중 어떤파일을 생성한다

(c)그 생성되는 파일의 위치와 이름을 알 수 있다

(d) 파일이 생성되는 디렉토리에 쓰기 권한을 가지고 있다!

공격방법은 아래와 같아요!


1. 취약 프로그램이 만드는 임시파일을 파악

2. 그 임시파일과 같은 이름의 파일을 만듬

3. 같은 이름의 파일에 심볼릭 링크를 건다!

4. 원본 파일을 지우고 취약프로그램이 파일이 임시파일을 만들면

5. 이 내용을 심볼릭 링크를 통해 빼냄 or 조작


※심볼릭 링크란?

그냥 파일에 하나의 임무를 더 준다고 이해하세요!

무슨 임무를 주는데?

니가 한 일 다른 폴더에 한번 더해!


무슨말이냐면 a라는 파일에 abc라고 작성했는데

a라는 파일에 symbolic link을 걸고 다른 파일 b에 연결하면

b에도 abc라고 적히는 거에요!


그래서 이 문제에서 level5.tmp 파일을 symbolic link에 연결,

다른 파일에도 symbolic link 연결하면 다른파일도 똑같이 level5.tmp에

적히는 일 결과가 적혀요!


저는 근데 2번째 방법으로 풀게요!

원래 파일의 삭제는 그 파일의 주인이 할 수 있는 거잖아요?

내 파일이니까..


근데 level5.tmp는 level6가 만드는거죠? 

왜냐면 setuid 비트 걸려있으니까요

실행되면 level6 권한됨


근데 저희가 미리 level5.tmp 파일을 만들면

저희는 현재 level5의 권한으로

만드는 것이기에

원래처럼 쓰고 지우려고 해도,


"level6야 너가 어떻게 level5파일을 지워?"

"니 파일 아니잖아!"


이렇게 해서 저희는 그냥 level5.tmp 파일을

만들어 주기만 하면 됩니다!


저는 touch 명령어를 통해서 level5.tmp 파일을 만들었습니다

그리고 과연 내용이 덮어쓰여질지 확인하기위해

vi명령어 (내용 작성, 수정할 때)를 통해서

 



아래와 같이 will this be changed? 라고 적고

나올떄 esc 누르고 wq!입력하고 나왔습니다!




자 그래서 바로

level5 프로그램이 있는

/usr/bin으로 이동하고!


다시 ./level5 입력하고 실행시켰습니다!



그리고 다시 디렉토리 올라와서


/tmp로 들어가니 level5.tmp가 그대로 있네요!

과연 파일 안의 내용이 바뀌었나 확인해 볼까요?

cat 명령어로 cat level5.tmp해보니


원래는 will this be changed?에서

next password: what the hell로 나왔네요!


저는 이렇게 해서 결국

문제를 풀었네요!


고생하셨습니다!