LEVEL 01
There is a vulnerability in the below program that allows arbitrary programs to be executed, can you find it?
To do this level, log in as the level01 account with the password level01. Files for this level can be found in /home/flag01.
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)
{
gid_t gid;
uid_t uid;
gid = getegid();
uid = geteuid();
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
system("/usr/bin/env echo and now what?");
}
문제 파일 디렉토리 /home/flag01로 이동하면 파일이 flag01이라는 실행파일이 있다. user는 flag01, group은 level01로 설정되어있다. 그리고 setuid가 설정되어있다.
gid = getegid();
uid = geteuid();
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
위 소스코드를 보면 getegid와 geteuid를 각각 변수에 저장하는데 getuid와 geteuid의 차이점은 e=effective, 즉 현재 프로그램이 사용하고 있는 권한을 뜻한다. 따라서 setuid가 설정되있으므로 uid에는 flag01의 uid가 들어가고 gid는 setgid가 설정되어있지 않으므로 level01의 gid가 들어간다.
setresuid는 여기서 res는 Real Uid, Effective Uid, Saved Set Uid 3가지를 의미하는데 각각 flag01의 uid를 저장한다. 보통 프로그램은 Effective Uid권한으로 프로그램을 실행하지만 Effective Uid가 아닌 Real Uid를 사용하는 프로그램들도 종종 있기 때문에 통일성을 위해 setresgid 같은 코드를 사용한다고 한다.
다음으로 system("/usr/bin/env echo and now what?") 코드를 보면 /usr/bin/env에 저장된 환경변수에서 뒤 명령어를 echo를 실행한다. 따라서 환경변수를 수정할 수 있으면 쉘 탈취가 가능하다.
위 그림과 같이 echo라는 파일에 쉘 스크립트를 작성합니다. 생성 위치는 flag01에는 권한이 없으므로 level01 디렉토리에 생성하고 실행 권한을 줍니다.
다음으로 echo파일을 만든 /home/level01 디렉토리를 환경변수에 등록합니다. PATH=/home/level01:$PATH 명령을 입력하면 $PATH 중에 가장 앞에 등록되는데 왼쪽에 있을수록 우선순위가 높으므로 가장 높은 우선순위를 부여한다.
flag01파일을 실행하면 계정이 flag01로 변경되고 플래그를 획득할 수 있습니다.
'시스템 해킹 > CTF' 카테고리의 다른 글
보호기법 정리 (0) | 2021.08.20 |
---|---|
[Nebula] Level 03 (0) | 2021.08.19 |
[Nebula] Level 02 (0) | 2021.08.19 |
[Nebula] Level 00 (0) | 2021.08.11 |
[DIMI CTF] ezheap (0) | 2021.03.26 |
댓글