1. 문제
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}
getegid() 함수로 현 process의 effective group id를 얻고, 이를 인자로 하여 setresuid, setresgid 함수를 호출한다. 이를 통해 프로세스의 "real U(G)ID", "effective U(G)ID", "saved set-user(group)-ID"를 변경한다.
그리고 subshell을 띄워 echo shock_me를 출력한다.
2. 접근방법
- CVE-2014-6271 ⇒ shellshock
14년도에 나온 취약점으로 bash 쉘에서 환경변수에 다음과 같이
환경변수에 값을 등록시킬수 있다. 함수 역시 등록할수 있는데
다음과 같이 함수를 작성하고, export -f 명령어로 환경변수에 등록하면 쉘에서 함수명만 쳐도 설정한 내용이 출력된다. 여기서 취약점이 생기는데,
만약 expo'() { echo hello;}; echo fucking' 이렇게 환경변수로 함수를 주게되면,
env 명령어로 확인했을때 작성한 명령어가 세팅되고, ./bash 로 서브 쉘을 띄울때 쉘이 초기화가 되면서 환경변수에 등록된 값을 그대로 가져와서 띄우게 된다. 함수 뒤에 ;으로 구분을 한뒤, 뒤에 삽입한 명령어가 그대로 쉘 커맨드로 입력되어 fucking
단어가 출력되는것을 볼수 있다.
자세한 설명은 아래에서 공부하면 좋을듯
3. 풀이
결론은 환경변수에 함수를 등록하면서 뒤에 커맨드를 넣어주고, shellshock함수를 호출하게 되면,
서브 쉘이 호출되면서 shell prompt를 출력하기 전에 환경변수들을 한번 싹 초기화 해주는데, 이때 아까 넣어놨던 커맨드가 실행되는 취약점이라고 한다.
따라서
export ttt='() { echo hello;}; /bin/cat flag' 를 주고 shellshock을 실행시키면
⇒ system("/home/shellshock/bash -c 'echo shock_me'");
요부분에서 서브쉘이 실행되고 환경변수가 초기화되는 중에 /bin/cat flag가 실행될 것이다.
4. 몰랐던 개념
- CVE-2014-6271
'워게임 > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] md5 calculator (0) | 2020.09.23 |
---|---|
[pwnable.kr] brainfuck (0) | 2020.09.23 |
[pwnble.kr] leg (0) | 2020.09.06 |
[pwnable.kr] mistake (0) | 2020.09.06 |
[pwnable.kr] input (0) | 2020.09.06 |