level00
SetUID 권한이 설정된 flag00이라는 파일 찾기
$find / -perm -4000 -name flag00
-4000 : 4000권한이 전부 포함된것
/4000 or +4000 : 4000권한중 하나라도 포함된것
find명령어는 파일을 찾은 후 파일의 권한 ex)4640 을 추출하고 -perm 로 전달한 값과 bit and 연산을 수행한다.
-perm -0700이라면 비트앤드 연산해서 나온 값이 전달한 값(0700)과 동일하다면 출력한다.
-perm /0700이라면 비트앤드 연산해서 나온 값이 0000이 아니라면 출력한다.
퍼미션은 8진수 타입이다.
level01
euid : Effective UID. 프로그램이 실행중인 현재 상태에서의 uid. setUID가 설정된 프로그램을 실행시켰다면 파일의 UID권한을 말한다.
ruid : Real UID. 프로램을 실행시킨 유저의 uid.
suid : Saved SetUID. 프로그램 실행 중 euid 를 ruid로 덮어씌우게 되는 경우가 있는데 euid 소실을 방지하기 위해 저장해뒀다고 보면 된다. 말그대로 저장된 SetUID(euid) 이다.
setresuid 를 사용해서 프로그램내에서 변경하지 않는 한 resuid는 정의대로 동작한다.
소스코드를 보면
gid = getegid();
uid = geteuid();
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
system("/usr/bin/env echo and now what?");
이렇게 되어있다.
*취약한 파일에 SETUID가 설정되어 있다.
*echo 명령어를 상대경로로 사용하고 있다.
리눅스에선 명령어만 입력시 PATH에 등록된 경로의 좌측부터 탐색해서 가장 먼저 발견되는 경로의 명령어를 실행하게 된다.
env 명령어는 환경변수를 출력하는 명령어이며 인자값을 주게되면 환경변수에 설정된대로 인자로 받은 명령어를 입력하겠다는 의미이다. (env가 아닌 따로 세팅한 변수를 참조할 수 있기 때문에)
env echo test : 환경변수에 설정된대로 echo 명령어를 실행하여 test를 출력한다.
echo 는 bin에 있으며 환경변수에 맞춰 동작하고 현재 계정으로는 /home/level01에만 파일을 만들수 있기 때문에
PATH=.:$PATH 또는 PATH=/home/level01:$PATH를 지정한 후
level01에 echo라는 이름으로 /bin/sh를 실행하는 파일을 생성한다.
그리고 flag01 파일을 실행시키면 flag01의 user권한인 flag01계정의 권한으로 echo명령을 실행시키며 환경변수에 의해 현재경로인 /home/level01의 echo를 실행시키게 된다.
어떻게보면 flag01 의 euid로 설정된 파일을 실행시켜 flag01의 env가 실행되어야 하는게 아닌가 싶은데,
권한과 환경의 문제는 별개의 문제이기 때문에 level01의 환경변수를 세팅한 후 level01의 환경변수를 사용한것이다.
flag01 쉘에서 env 명령어를 사용해도 PATH에 환경변수가 그대로 설정되어있는걸 확인할 수 있다.
level02
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);
*취약한 파일에 SETUID가 설정되어 있다.
*외부 데이터를 가져다 시스템함수의 인자로 사용할 때 (getenv) 검증 작업이 없다.
asprintf는 1번째 인자에 뒤의 포맷 형식으로 출력(저장)한다는 뜻이다.
getenv("USER")는 말그대로 환경변수 중 USER 변수의 값을 가져와라 라는 명령어이다.
-> buffer에 "/bin/echo $USER is cool"을 넣고 밑에서 system함수로 실행 시키기 때문에 $USER 환경변수에 username이 입력되고, echo명령어로 '$USER is cool' 이라는 문자열을 출력시키는 프로그램이다.
USER=";/bin/bash;echo" 이렇게 값을 넣으면
buffer에는 "/bin/echo ;/bin/bash;echo is cool" 이라는 문자열이 저장되고
system함수에서 그대로 실행하면 3개의 명령어가 순차적으로 실행되며 /bin/bash가 실행된다.
첫번째 명령이 끝나야 다음 명령어가 실행되기 때문에
/bin/bash로 얻은 쉘을 exit로 종료하게되면 echo is cool이 실행된다.
'리버싱 > 리눅스' 카테고리의 다른 글
드림핵 System Exploitation Fundamental (2) : Memory Corruption (0) | 2020.02.05 |
---|---|
DIMICTF 2019 : ezshellcode (쉘코드) (0) | 2020.02.05 |
드림핵 System Exploitation Fundamental (1) : 개요 (0) | 2020.02.04 |
DIMICTF 2019 : ezheap (UAF 취약점) (0) | 2019.12.11 |
nebula : level03 ~ (0) | 2019.10.23 |