July 07, 2019

Nebula level19 write up

In this write up, some hints related to this challenge only will be mentioned.

여기서는 챌린지와과 관련된 몇 가지 힌트만이 언급됩니다.

Level19

About
There is a flaw in the below program in how it operates.

관련 사항.
아래의 프로그램은 실행 간 결함이 발생한다.

To do this level, log in as the level19 account with the password level19. Files for this level can be found in /home/flag19.

level19(pw: level19) 계정을 이용한다. 관련 파일은 /home/flag19에 있다.

Source code.    소스코드.
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>

int main(int argc, char **argv, char **envp)
{
  pid_t pid;
  char buf[256];
  struct stat statbuf;

  /* Get the parent's /proc entry, so we can verify its user id */

  snprintf(buf, sizeof(buf)-1, "/proc/%d", getppid());

  /* stat() it */

  if(stat(buf, &statbuf) == -1) {
      printf("Unable to check parent process\n");
      exit(EXIT_FAILURE);
  }

  /* check the owner id */

  if(statbuf.st_uid == 0) {
      /* If root started us, it is ok to start the shell */

      execve("/bin/sh", argv, envp);
      err(1, "Unable to execve");
  }

  printf("You are unauthorized to run this program\n");
}

It is inappropriate to indirectly check the permission of the current process through the PPID.

PPID를 통하여 현재 프로세스의 권한을 간접적으로 점검하는 것은 부적절하다.

In older versions of Linux (Ubuntu 6.1 to 14.0) systems, the orphan process's parent process is designated with "init" process(PID: 1, root account permissions).

구 버전의 리눅스(Ubuntu 6.1~14.0) 시스템에서는 고아(orphan) 프로세스는 부모 프로세스로 "init" 프로세스(PID: 1, root 계정 권한)가 지정된다.

level19@nebula:/tmp$ ./exploit
I am 3155 → Parent. 부모
You are unauthorized to run this program → Bypass failed parent. 우회에 실패한 부모
level19@nebula:/tmp$ I am 0 → Child. 자식
[Child] Waiting...(ppid: 1) → Orphaned child. 고아가 된 자식
[Child] Execute shell(ppid: 1) → Child trying to bypass. 우회를 시도하는 자식
You have successfully executed getflag on a target account