[pwnable.kr] Toddler’s Bottle – shellshock
디렉터리에 bash 쉘도 있습니다. bash 쉘에 대한 충격적인 뉴스라고 하네요. 그래서 bash shellshock에 대해서 검색해봤습니다.
version을 보니 shellshock 취약점이 있었던 때의 bash인 것 같습니다.
일단 기본적인 것부터 얘기하도록 하겠습니다.
쉘에서 변수를 만들고 싶으면 x=1 이렇게 대입하고 echo $x 이렇게 출력해보면 됩니다. 하지만, 완벽하게 환경 변수에 올리고 싶으면 export x=1 해줘야 합니다.
그리고 환경 변수에 함수도 등록할 수 있습니다. 마찬가지로 hello() { echo hello; } 이렇게 만들고, export –f hello 로 등록해줄 수 있습니다.
하지만 export hello=’() { echo hello; }’ 이렇게 변수로 선언을 하고 subshell을 실행하면 ()로 시작한 변수의 { … } 부분이 함수로 인식되고, 그 뒤에 나오는 command까지 실행한다는 것입니다.
이렇게 변수였던 hello가 subshell을 실행하면,
변수는 사라지고 { … } 안에 있던 게 함수가 되어 나옵니다.
다시, 저 뒤에 다른 명령어를 붙이면?
저렇게 뒤에 있는 명령어가 실행이 됩니다.
문제에서도 활용할 수 있겠네요. flag를 읽으려면 shellshock_pwn의 gid가 필요합니다.
여기서 저 부분을 실행할 때, bash 자체의 취약점을 이용해서 업그레이드된 gid로 cat flag를 해준다면 flag를 읽을 수 있을 것입니다.
원리는 bash 쉘이 실행되고 환경 변수를 초기화할 때, () { 이런 모양으로 시작되는 변수가 있으면 그 부분을 parse_and_execute 합니다. 저 변수를 보고 catFlag() { echo a; }; /bin/cat flag를 parse해서 execute하는 것이죠. 그래서 flag가 출력되는 것입니다.
함수 만드는 것 자체가 쉘 스크립트 기반으로 하는 거라서, parse해서 실행하게 되면 child 쉘(sub 쉘)을 띄웠을 뿐인데, 저 코드가 실행되는 것입니다. (놀랍습니다…)
'System&Write up > Pwnable.kr' 카테고리의 다른 글
[pwnable.kr] Toddler's Bottle - coin1 (2) | 2017.12.31 |
---|---|
[pwnable.kr] Toddler's Bottle - cmd2 (0) | 2017.12.30 |
[pwnable.kr] Toddler's Bottle - mistake (0) | 2017.12.17 |
[pwnable.kr] Toddler's Bottle - cmd1 (0) | 2017.12.17 |
[pwnable.kr] Toddler's Bottle - lotto (1) | 2017.12.15 |