shellshock(CVE-2014-6271)
shellshock란 bash에서 일어나는 버그이다. 2014.Septmber.24에 공개 되었고, 많은 인터넷 서비스에 적용이 가능하다. chazelas는 우연히 bash실행시 의도하지 않은 명령어들이 실행되는 것을 발견했다.
shellshock는 환경변수의 변수와 함수를 이해해야한다.
$export명령어를 사용하면 환경변수를 설정할 수 있다.
$export -f 를 사용하면 환경함수를 설정할 수 있다.
그런데 $export ex='() { echo A; }; pwd' 이런식으로 변수설정하듯이 함수를 선언하는게 가능하다. 문제는 pwd와 같은 중괄호 이후에 나오는 명령어들이 bash사용시 자동으로 실행된다. 따라서 환경변수를 이용한 CVE로 보면 된다.
reference
https://operatingsystems.tistory.com/entry/Shellshock-CVE20146271
shellshock에 관련된 한글 자료이다.
write up
#include <stdio.h> int main(){ setresuid(getegid(), getegid(), getegid()); setresgid(getegid(), getegid(), getegid()); system("/home/shellshock/bash -c 'echo shock_me'"); return 0; }
코드는 아주 간결하다.
디렉터리 목록을 보면 shellshock바이너리에 setgid가 걸려 있다. 따라서 실행시 shellshock_pwn권한을 가지게 된다. 따라서 system()의 인자를 'cat flag'로 바꾸면 끝 인줄 알았다.
따라서 gdb를 이용하여 개 뻘짓을 진행했다.
그래서 결국 바꾸어 냈다.
그러나 권한이 없단다.
알고보니 코드에 존재하는 setresuid, setresgid가 프로세스의 uid와 gid를 건드는 놈이란다. 그래서 getegid함수를 모두 조작하여 shellshock_pwn(1020)의 id값으로 모두 조작했다. 그러나 역시나 Permission denied가 떴다. 결국 이걸론 풀 수 없다는 결론에 다다랐다.
그래서 shellshock를 검색해 보기로 하고 이것이 CVE라는 것을 알게 되었다. 따라서 shellshock의 원리를 확인하고 환경변수를 조작해 보기로 했다.
따라서 환경변수에 변수를 함수처럼 설정한다. 그리고 뒤에 pwd라는 명령어를 넣고 shellshock바이너리를 실행한다.
결과적으로 bash가 실행되며 /home/shellshock라는 출력이 나왔다. 따라서 pwd가 아닌 cat flag를 넣어보기로 한다.
그러나 cat을 찾을 수 없다며 실행을 못한다. pwd는 되는데 cat flag는 안된다. 왜 안되는지를 모르겠다. shellshock를 설명해 주신 장인은 bash -c를 이용하면 좋다는 이야기를 하길래 내 맘대로 bash -c를 사용해 보았다.
결론적으로 flag를 찾을 수 있었다.