Nebula Level02
https://exploit-exercises.com/nebula/level02/
버퍼(buffer)는 메모리 사용량을 확인할 떄 나온다. free라는 명령어를 쓰면 현재 메모리 사용량을 확인 할 수 있는데 그 중 buffer가 존재한다. 이는 데이타를 잠시 저장해 두는 용도로 사용하는데 예를 들어 만약 파일에서 데이터를 사용해야하는 경우가 오면 리눅스는 바로 메모리를 할당해주기 보다는 버퍼에 맡겨둔다.
2.cache
캐시(cache)는 버퍼와 마찬가지로 free라는 명령어를 사용했을 때 볼 수 있다. 캐시는 버퍼와 비슷하게 잠시 저장해 놓는 용도로 사용하지만 저장하는 건 다르다. 파일이 실행됐던 장면을 저장해 놓는데 이는 후에 다시 사용될 프로그램을 보다 빠르게 진행시키기 위해서다.
3.쉘 변수
특정 쉘에서만 실행 가능한 변수다.
4.환경 변수
쉘 변수와 다르게 모든 쉘에서 사용 가능한 변수다. 일반적으로 가장 많이 볼 수 있는 변수는 PATH이다. USER는 사용자의 이름을 담고있는 환경변수다.
Source code
#include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <stdio.h> int main(int argc, char **argv, char **envp) { char *buffer; gid_t gid; uid_t uid; gid = getegid(); uid = geteuid(); setresgid(gid, gid, gid); setresuid(uid, uid, uid); buffer = NULL; asprintf(&buffer, "/bin/echo %s is cool", getenv("USER")); printf("about to call system(\"%s\")\n", buffer); system(buffer); }
--> 소스 코드 설명
buffer라는 하나의 포인터를 만든다.
asprintf(*pointer, 문자열,...)의 형식으로 사용된다. 문자열이 포인터가 가르키는 곳으로 들어가게 된다. 여기서는 buffer가 가르키고 있는 포인터에 "/bin/echo %s is cool"이라는 문자열이 들어가는데 물론 %s에는 getenv("USER")가 들어간다.
getenv(환경변수)는 환경변수의 값을 반환해주는 함수이다. 여기선 환경변수 USER의 값을 반환한다.
printf를 통해 ""안에 있는 문자열이 출력된다.
system 함수를 통해 buffer에 담긴 문자열이 실행된다.
✨
system 을 실행할때 buffer 안에 있는 문자열 실행
<--buffer 안에 들어있는 문자열은 "/bin/echo getenv("USER") is cool" 이다.
<--"USER"의 환경변수 값을 이용하면 이를 system으로 실행시킬 수 있다.
먼저 현재 USER의 값을 알아보자.
현재 USER는 사용자의 이름인 level2를 가지고 있다.
flag02라는 프로그램을 실제 실행하면 다음과 같은 화면이 나온다.
printf문으로 about to call system("/bin/echo level02 is cool")이 출력된다.
system함수가 /bin/echo level02 is cool을 실행시켜 level02 is cool 이 출력된다.
USER의 값이 여러개 라면 가장 앞에 있는 값은 level02라고 쓰인 대신 출력되는 역활을 하고 그 뒤에 붙어있는 명령어들은 system함수에 의해 실행될 것이다. 명령어를 여러개 쓰고 싶을 때는 ;를 사용하면 된다.
참고:
http://mkil.tistory.com/402
https://blog.asamaru.net/2016/01/19/centos-emptying-the-buffers-cache/
http://webterror.net/?p=1791
http://akaseon.tistory.com/50
http://infosecguide.tistory.com/92?category=652621
https://exploit-exercises.com/nebula/level02/
**배경 지식(문제 해결을 위한 지식과 그 외 내용도 포함)
1.buffer버퍼(buffer)는 메모리 사용량을 확인할 떄 나온다. free라는 명령어를 쓰면 현재 메모리 사용량을 확인 할 수 있는데 그 중 buffer가 존재한다. 이는 데이타를 잠시 저장해 두는 용도로 사용하는데 예를 들어 만약 파일에서 데이터를 사용해야하는 경우가 오면 리눅스는 바로 메모리를 할당해주기 보다는 버퍼에 맡겨둔다.
2.cache
캐시(cache)는 버퍼와 마찬가지로 free라는 명령어를 사용했을 때 볼 수 있다. 캐시는 버퍼와 비슷하게 잠시 저장해 놓는 용도로 사용하지만 저장하는 건 다르다. 파일이 실행됐던 장면을 저장해 놓는데 이는 후에 다시 사용될 프로그램을 보다 빠르게 진행시키기 위해서다.
3.쉘 변수
특정 쉘에서만 실행 가능한 변수다.
4.환경 변수
쉘 변수와 다르게 모든 쉘에서 사용 가능한 변수다. 일반적으로 가장 많이 볼 수 있는 변수는 PATH이다. USER는 사용자의 이름을 담고있는 환경변수다.
**풀이
About
이 프로그램은 임의로 실행될 수 있는 프로그램을 허용하는 취약점을 가지고 있다.
Source code
#include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <stdio.h> int main(int argc, char **argv, char **envp) { char *buffer; gid_t gid; uid_t uid; gid = getegid(); uid = geteuid(); setresgid(gid, gid, gid); setresuid(uid, uid, uid); buffer = NULL; asprintf(&buffer, "/bin/echo %s is cool", getenv("USER")); printf("about to call system(\"%s\")\n", buffer); system(buffer); }
--> 소스 코드 설명
buffer라는 하나의 포인터를 만든다.
asprintf(*pointer, 문자열,...)의 형식으로 사용된다. 문자열이 포인터가 가르키는 곳으로 들어가게 된다. 여기서는 buffer가 가르키고 있는 포인터에 "/bin/echo %s is cool"이라는 문자열이 들어가는데 물론 %s에는 getenv("USER")가 들어간다.
getenv(환경변수)는 환경변수의 값을 반환해주는 함수이다. 여기선 환경변수 USER의 값을 반환한다.
printf를 통해 ""안에 있는 문자열이 출력된다.
system 함수를 통해 buffer에 담긴 문자열이 실행된다.
✨
system 을 실행할때 buffer 안에 있는 문자열 실행
<--buffer 안에 들어있는 문자열은 "/bin/echo getenv("USER") is cool" 이다.
<--"USER"의 환경변수 값을 이용하면 이를 system으로 실행시킬 수 있다.
먼저 현재 USER의 값을 알아보자.
현재 USER는 사용자의 이름인 level2를 가지고 있다.
flag02라는 프로그램을 실제 실행하면 다음과 같은 화면이 나온다.
printf문으로 about to call system("/bin/echo level02 is cool")이 출력된다.
system함수가 /bin/echo level02 is cool을 실행시켜 level02 is cool 이 출력된다.
USER의 값이 여러개 라면 가장 앞에 있는 값은 level02라고 쓰인 대신 출력되는 역활을 하고 그 뒤에 붙어있는 명령어들은 system함수에 의해 실행될 것이다. 명령어를 여러개 쓰고 싶을 때는 ;를 사용하면 된다.
**실행
about에 나와있는 계정으로 로그인을 한다. 소스 코드가 있는 디렉토리로 이동해 flag02를 실행시켜 어떤 모양으로 출력되는지 확인했다.
USER의 값을 확인한 이후 USER를 dummy;getflag라고 변경했다. 앞에 있는 dummy는 어떤 문자여도 상관 없으나 여기서는 쓰레기 값이기 때문에 dummy를 사용했다. ;를 사용해 뒤에 getflag하는 명령어를 이었다. 사용한 명령어는 export로 환경변수를 변경할 때 사용한다.
export -->환경변수 리스트를 출력한다.
export 환경변수='값' -->환경변수 값을 변경한다.
export $환경변수:변수값 -->변수값을 추가한다.
다시 flag02를 실행한다. USER의 값이 변경됐기 때문에 getflag가 실행된다.
참고:
http://mkil.tistory.com/402
https://blog.asamaru.net/2016/01/19/centos-emptying-the-buffers-cache/
http://webterror.net/?p=1791
http://akaseon.tistory.com/50
http://infosecguide.tistory.com/92?category=652621
댓글
댓글 쓰기