Nebula Level03
일정한 시간 마다 특정 작업을 실행시키는 데몬. 사용할 수 있는 시간 단위는 분, 시간, 일, 월, 요일이 있다.
자세한 설명(http://blog.naver.com/PostView.nhn?blogId=ekdns7184&logNo=120186813926&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true , http://byseob.blogspot.kr/2010/08/crontab%ED%81%AC%EB%A1%A0%ED%83%AD-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95.html )
2. 쉘 스크립트
쉘이나 명령줄 인터프리터에서 돌아가도록 자겅 되었거나 한 운영체제를위해 쓰인 스크립트.수행하는 일반 기능으로는 파일 이용, 프로그램 실행, 문자열 출력 등이 있다. (참고-위키 백과)
자세한 설명(https://egaoneko.github.io/os/2015/05/24/linux-starter-guide-8.html)
About
flag03 디렉토리 안에 있는 파일에 crongtab이 있으니 주의 깊게 봐라.
일단 힌트는 이게 끝이다. 먼저 로그인을 하고 들어가 flag03을 확인했다.
안에 있는 파일은 2개다. 하나는 writable.d라는 디렉토리와 writable.sh라는 쉘 스크립트. 먼저 writable.d라는 쉘 스크립트를 cat명령어를 통해 확인했다.
쉘 스크립트는 처음이라 완벽하게 이해하지 못해서 구글링의 도움을 많이 받았다.
for i in /home/flag03/writable.d/* ; do
→writable.d의 하위 파일을 변수 i 에 집어 넣는다.
ulimit -t 5; bash -x "$i"
→ulimit라는 명령어는 프로세스의 자원 한도를 설정하는 명령어다. -t라는 명령어는 할당 받을 수 있는 명령어의 시간을 의마한다. 여기서는 5초로 설정돼있다.
bash 쉘을 통해 변수 i에 넣었던 하위 파일들(쉘 스크립트)을 실행시킨다.
rm -f "$i"
→rm 을 통해 아까 실행시킨 파일을 제거한다. -f는 확인 없이 무조건 삭제를 시키는 옵션이다
따라서 writable.sh라는 쉘 스크립트는 in /home/flag03/writable.d의 모든 하위 파일을 실행하고 배정된 5초가 지난 이후에 실행시켰던 하위파일을 제거한다.
이제 writable.d라는 디렉토리로 이동해서 하위 파일을 확인해 보니 아무것도 존재하지 않았다.
✍해결 방법
/bin/bash를 실행기킬 수 있는 c언어 파일을 만든다. → 쉘 스크립트로 c파일을 컴파일 시켜주는 파일을 만든다. → 이 쉘 스크립트를 writable.d의 하위파일로 옮긴다.
먼저 flag03의 id 를 확인한다.

id 사용자
→사용자가 사용하는 id를 확인할 수 있다.
flag03의 uid가 996인것을 확인했다. 이를 사용해 c언어 파일을 만들어 보자.

파일의 이름은 SLevel03.c로 했다.
setresuid를 통해 real user ID, effective user ID, saved set-user-ID를 flag03의 id로 바꾼다.
system을 통해 /bin/bash를 실행하게 한다.

이제 writable.d 의 하위로 들어갈 쉘 스크립트를 만든다. 이름은 compileLevel03 이다.
gcc를 통해 컴파일 해준다. 컴파일 위기를 잘 설정해야 하는데 .c파일과 실행파일의 위치가 다르니 주의해야 한다. 현제 .c파일과 쉘 스크립트 모두 /tmp에 있기 때문다. chmod를 통해 컴파일을 통해 생긴 SLevel03 실행파일을 setUID를 가지도록 만들어준다.

이제 /tmp에 있던 compileLevel03(쉐 스크립트 파일) 을 writable.d 하위파일이 되도록 cp명령어를 통해 복사해 준다.

복사한 직후 writable.d 에는 compileLevel03이라는 쉘 스크립트가 존재하는 걸 확인한다. 하지만 시간이 지나 ls 를 다시 사용하면 사라진 걸 확인할 수 있다.

writable.sh를 통해 compileLevel03이 실행됐기 때문에 flag03디렉토리로 이동해서 확인해 보면 SLevel03이라는 실행파일이 생긴것과 이 파일이 setUID를 가졌다는 걸 확인한다.
SLevel03을 실행하고 getflag 명령어를 입력하면 성공!
참고:
http://infosecguide.tistory.com/98
https://www.joinc.co.kr/w/man/1/ulimit
http://webdir.tistory.com/140
❆기본 지식
1. crontab일정한 시간 마다 특정 작업을 실행시키는 데몬. 사용할 수 있는 시간 단위는 분, 시간, 일, 월, 요일이 있다.
자세한 설명(http://blog.naver.com/PostView.nhn?blogId=ekdns7184&logNo=120186813926&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true , http://byseob.blogspot.kr/2010/08/crontab%ED%81%AC%EB%A1%A0%ED%83%AD-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95.html )
2. 쉘 스크립트
쉘이나 명령줄 인터프리터에서 돌아가도록 자겅 되었거나 한 운영체제를위해 쓰인 스크립트.수행하는 일반 기능으로는 파일 이용, 프로그램 실행, 문자열 출력 등이 있다. (참고-위키 백과)
자세한 설명(https://egaoneko.github.io/os/2015/05/24/linux-starter-guide-8.html)
❆풀이
About
flag03 디렉토리 안에 있는 파일에 crongtab이 있으니 주의 깊게 봐라.
일단 힌트는 이게 끝이다. 먼저 로그인을 하고 들어가 flag03을 확인했다.
안에 있는 파일은 2개다. 하나는 writable.d라는 디렉토리와 writable.sh라는 쉘 스크립트. 먼저 writable.d라는 쉘 스크립트를 cat명령어를 통해 확인했다.
쉘 스크립트는 처음이라 완벽하게 이해하지 못해서 구글링의 도움을 많이 받았다.
for i in /home/flag03/writable.d/* ; do
→writable.d의 하위 파일을 변수 i 에 집어 넣는다.
ulimit -t 5; bash -x "$i"
→ulimit라는 명령어는 프로세스의 자원 한도를 설정하는 명령어다. -t라는 명령어는 할당 받을 수 있는 명령어의 시간을 의마한다. 여기서는 5초로 설정돼있다.
bash 쉘을 통해 변수 i에 넣었던 하위 파일들(쉘 스크립트)을 실행시킨다.
rm -f "$i"
→rm 을 통해 아까 실행시킨 파일을 제거한다. -f는 확인 없이 무조건 삭제를 시키는 옵션이다
따라서 writable.sh라는 쉘 스크립트는 in /home/flag03/writable.d의 모든 하위 파일을 실행하고 배정된 5초가 지난 이후에 실행시켰던 하위파일을 제거한다.
이제 writable.d라는 디렉토리로 이동해서 하위 파일을 확인해 보니 아무것도 존재하지 않았다.
✍해결 방법
/bin/bash를 실행기킬 수 있는 c언어 파일을 만든다. → 쉘 스크립트로 c파일을 컴파일 시켜주는 파일을 만든다. → 이 쉘 스크립트를 writable.d의 하위파일로 옮긴다.
먼저 flag03의 id 를 확인한다.
id 사용자
→사용자가 사용하는 id를 확인할 수 있다.
flag03의 uid가 996인것을 확인했다. 이를 사용해 c언어 파일을 만들어 보자.
파일의 이름은 SLevel03.c로 했다.
setresuid를 통해 real user ID, effective user ID, saved set-user-ID를 flag03의 id로 바꾼다.
system을 통해 /bin/bash를 실행하게 한다.
이제 writable.d 의 하위로 들어갈 쉘 스크립트를 만든다. 이름은 compileLevel03 이다.
gcc를 통해 컴파일 해준다. 컴파일 위기를 잘 설정해야 하는데 .c파일과 실행파일의 위치가 다르니 주의해야 한다. 현제 .c파일과 쉘 스크립트 모두 /tmp에 있기 때문다. chmod를 통해 컴파일을 통해 생긴 SLevel03 실행파일을 setUID를 가지도록 만들어준다.
이제 /tmp에 있던 compileLevel03(쉐 스크립트 파일) 을 writable.d 하위파일이 되도록 cp명령어를 통해 복사해 준다.
복사한 직후 writable.d 에는 compileLevel03이라는 쉘 스크립트가 존재하는 걸 확인한다. 하지만 시간이 지나 ls 를 다시 사용하면 사라진 걸 확인할 수 있다.
writable.sh를 통해 compileLevel03이 실행됐기 때문에 flag03디렉토리로 이동해서 확인해 보면 SLevel03이라는 실행파일이 생긴것과 이 파일이 setUID를 가졌다는 걸 확인한다.
SLevel03을 실행하고 getflag 명령어를 입력하면 성공!
참고:
http://infosecguide.tistory.com/98
https://www.joinc.co.kr/w/man/1/ulimit
http://webdir.tistory.com/140
댓글
댓글 쓰기