티스토리 뷰




[pwnable.kr] Toddler's Bottle - shellshock (1 pt) write-up



폰케알 shellshock문제 입니다.


먼저 shellshock취약점에 대해서 알아볼까요?:)


shellshock취약점은 친구들과 발표를 준비한 적이 있어서 나름 연구를 많이 했는데요!


먼저 shellshock 취약점은 2014년 9월 24일 발견된 취약점이고, cve-2014-6271로 등록되어 있습니다.


shellshock취약점은 bash shell에서 임의의 환경변수에 특정 코드를 삽입하여 실행할 수 있는 취약점입니다.


bash shell은 서버 os인 유닉스 및 리눅스에서 많은 역할을 하고 있다는 점에서 매우 위험한 취약점이였습니다.


공격자는 해당 취약점을 이용해 악의적인 명령이 포함된 환경변수를 사용하여 악의적인 행위를 수행 할 수 있습니다.


대략 이 취약점은 40년 정도 존재해 왔다고 합니다.


참고로 지금은 패치가 되어있고, 이 취약점은 bash 4.3이하 버전에서 발생한다고 합니다.

먼저 Shell shock의 원리를 설명하기 전, 환경 변수를 정의 할 때, 환경 변수에 변수와 함수를 정의 할 수 있는데요, 먼저 asdf라는 문자열을 환경변수 x에 등록을 하고 x를 실행하면 함수가 아니기 때문에 실행되지 않습니다.



그래서 printenv 값을 보면 asdf라는 문자열이 나오는 것을 확인할 수 있습니다.



그 다음은 환경 변수에 함수를 정의하는 방법인데요. 먼저 리눅스 쉘 상에서 함수를 정의 할 때 이러한 문법을 사용하여 정의 합니다.


그리고 export –funtion옵션과 함께 환경변수에 등록을 하고 그 환경변수를 호출하면 함수 안에 있는 내용인 echo asdf가 실행되어 asdf가 출력됩니다.




Shellshock의 원리인데요. 먼저 Bash의 환경 변수에 함수처럼 보이는 변수를 정의합니다. 함수처럼 보이는 변수란 함수문법으로 시작되는 내용을 적어서 정의해줍니다. (일종의 속임수)



현재는 printenv명령으로 환경변수의 값을 보면 그냥 문자열의 형태로 나와있습니다.



하지만, bash subshell을 열면 Bash가 시작되면서 등록된 환경 변수를 읽어오게 됩니다. 다시 printenv명령을 이용해 환경 변수를 보면 함수처럼 보이는 변수가 진짜 함수로 정의 되어있는 것을 볼 수 있습니다.



여기서 Bash는 () {(함수 문법으로)로 시작하는 변수를 보고 함수라고 판단한다는 것을 알 수 있습니다. 아까의 환경변수 X를 실행하면 함수 안에 있던 echo hello가 실행되어 출력 되는 것을 확인 할 수 있습니다.




하지만 여기서 뒤에 명령어를 더 추가하였을 때 취약점이 존재합니다, 함수처럼 보이는 환경변수에 세미콜론과 명령어들을 추가해주고 bash subshell을 실행하면 함수로 정의되면서 뒤에 있는 명령들까지 실행 되는 shell shock 취약점이 존재합니다.



이제 shellshock 취약점에 대해서 공부를 했으니 문제를 풀어보겠습니다.

다시 서버로 돌아와 ls명령어로 확인해보니 4개의 파일이 있습니다.


먼저 코드를 보겠습니다.



bash subshell을 열어주네요 ! 여기서 shellshock취약점이 발생합니다.


setresuid가 걸려있어 프로그램이 실행되는 동안에는 root권한을 가지고 있는데요, 이 때 shellshock 취약점을 이용해서 sh이라는 명령을 실행해서 쉘을 따면 될 것 같습니다.


이러한 환경변수를 등록해줬습니다.


플래그가 나옵니다.


프로그램을 실행하면서 bash subshell을 실행하게 되고, 함수처럼보이는 변수가 함수로 정의되며 세미콜론 뒤에 있는 명령인 sh이 실행되면서 root권한을 얻게 됩니다.


따라서 flag파일을 확인할 수 있습니다.


이 문제는 shellshock 취약점에 대해서 정확히 이해 하면 되는 쉬운 문제였습니다 ㅎ!


제가 공부한 내용이지만 틀린 내용이 있을 수 있으니, 이상이 있으면 댓글을 달아주시면 감사하겠습니다!!










Comments