반응형
소스 코드
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}
풀이
코드를 살펴 보면 setresuid를 설정하여 shellshock_pwn의 권한으로 다 설정한다. 그리고 마지막에 system 함수를 통해서 "shock_me" 라는 문자열을 출력한다.
우선 문제는 shellshock라는 취약점이 존재한다.
shellshock 취약점은 bash 버전의 환경변수와 함수 선언에서 나타나는 취약점이다.
환경 변수 선언
export test='hello'
보통 환경 변수를 선언할 때 이렇게 선언을 한다.
export test='() { echo "hello"; };'
이렇게 선언하고 /bin/bash
명령어를 이용해 bash를 실행하고 test를 실행하면 진짜 함수로 바뀐다.
이것은 bash에 버그로 인해 가능한 것이다.
위 사진이 버그로 인해 생기는 현상이다.
export test='() { echo "hello"; };pwn;id;'
이렇게 하게 되면 bash를 실행할 때 pwn와 id 명령어가 실행하게 된다.
이것이 가능한 이유는 코드에서 parse_and_execute() 함수가 전달된 문자열의 끝까지 처리하기 위해 반복(while)을 사용하는데, 함수 선언문 뒤에 명령어가 삽입된 것을 확인하고 반복문을 종료시키는 코드가 없기 때문에 발생하게 된다.
shellshock 프로그램에서 bash를 실행해주므로 export를 이용해 flag 파일을 열어주는 명령어를 환경변수에 선언해주면 flag 값을 출력해줄 것이다.
완료!!
반응형