Level 03
Level 03의 문제를 보자.
소스코드는 없고, crontab 파일이 있다고 알려주고 있다. 소스코드가 따로 없으니 문제에서 알려준 대로 /home/flag03 디렉토리로 들어가보자.
writable.d라는 이름의 디렉토리와 writable.sh라는 파일이 있다. 우선 writable.d 디렉토리에 있는 파일/디렉토리를 보려고 했는데 아무것도 없었다. (처음에 다른 디렉토리는 .d가 안 붙어 있는데 왜 이 디렉토리에는 붙어있지 이러면서 엄청난 삽질을 하고 있었지만,, 알고보니 그냥 문제 만든 사람이 디렉토리 이름을 저렇게 한 것 뿐이었다..) 밑에 있는 writable 쉘스크립트 (sh 확장자가 붙어있는 것을 보고 shell script 라는 것을 알게 되었다)를 열어보았다.
#!/bin/sh for i in /home/flag03/writable.d/*; do // /home/flag03/writable.d 경로 안에 있는 모든 파일에 대하여 수행한다. (ulimit -t 5; bash -x "$i") // 5초라는 제한 시간을 두고 파일들을 하나씩 수행하는데, rm -f "$i" // 5초가 지나면 파일을 수행하고 삭제해버린다. | cs |
쉘스크립트는 다음과 같이 해석될 수 있는데, 5초의 제한시간을 둔 것을 보니 이 파일이 crontab 파일임을 짐작할 수 있었다. 하지만, 중요한 것은 저 /home/flag03/writable.d라는 경로 안에 아무런 파일도 존재하지 않는다는 것이었다. 저 경로 안에 어떤 파일을 넣고, 그 파일을 수행하는데 5초 이상 걸려 삭제되더라도 그 파일을 실행시켜 flag03의 권한을 얻어야겠다는 생각이 들었다.
우선 flag03의 id가 '996'이라는 것을 찾아내고, 임시저장 파일인 /tmp 경로에 getflag.c라는 이름의 c 파일을 vim으로 만들어놓았다. 아래는 c 파일의 내용이다.
#include <stdio.h> int main(void){ setresuid(996, 996, 996); // user의 id를 996, 즉 flag03의 id로 변경한다. system("/bin/bash"); // 이후 /bin/bash를 실행한다. } | cs |
이후, 쉘 상에서 바로 수행할 수 있도록 /home/flag03 디렉토리 안에 이 c 파일을 컴파일한 flag라는 실행파일을 만들고, 그 flag라는 파일에는 SetUID 권한을 걸어놓는 쉘스크립트를 만들었다. SetUID를 걸어놔야 /bin/bash를 실행할 수 있을테니까. 그리고 이 쉘 스크립트가 writable.sh에 의해 실행될 수 있도록 writable.d라는 디렉토리에 flag라는 이름으로 복사했다. ls -al로 writable.d에 있는 파일들을 살펴보니 방금 내가 복사해 놓은 flag 파일이 있었고, 다시 한 번 ls -al 명령을 입력했을 때도 flag 파일이 그대로 있었다. 몇 분이 지난 후 다시 디렉토리를 살펴보았더니 flag 파일이 사라져있었다. writable.sh에 의해서 파일이 삭제된 것인데, 이는 다시 말해서 flag라는 쉘 스크립트가 실행되었고, 그 쉘 스크립트는 flag라는 실행파일을 만들도록 했으니 /home/flag03 안에 실행파일이 생겼을 것이라는 말이다.
/home/flag03 경로에서 ls -al 명령을 입력했더니 예상대로 flag 파일이 생성되어있었다. flag를 실행하자 flag03 id로 변경해놓은 대로 flag03으로 id가 옮겨져갔고, ("/bin/bash"를 수행하도록 했기 때문에) 바로 getflag를 입력했더니 flag를 얻었다는 내용이 떴다.
'SISS > Nebula Exploit' 카테고리의 다른 글
Nebula Level 05 (0) | 2018.04.07 |
---|---|
Nebula Level 04 (0) | 2018.04.07 |
Nebula Level 02 (0) | 2018.04.01 |
Nebula Level 01 (0) | 2018.04.01 |
Nebula Level 00 (0) | 2018.03.19 |