엄마! bash에 대한 충격적인 소식이 있어!! 이미 알고있을거라고 장담하지만 그냥 확실히 하자ㅎㅎ:) 오..뭔지는 모르겠지만 나도 알고있는 거면 좋겠다... 하지만 난 bash에 대해서 아는게 없으니까... 아마 모르고있겠지... 일단 저 서버에 접속해보자..!
shellshock파일 이외에 bash라는 파일도 있는게 눈에 띄인다.
일단 shellshock.c파일을 확인해보자.
1 2 3 4 5 6 7 8 | #include <stdio.h> int main(){ setresuid(getegid(), getegid(), getegid()); setresgid(getegid(), getegid(), getegid()); system("/home/shellshock/bash -c 'echo shock_me'"); return 0; } | cs |
음 일단 코드길이는 매우 짧다. 그래도 한줄씩 분석해보자.
첫줄의 setresuid함수는 인자로 들어간 3개의 값으로 프로세스의 real UID, effective UID, saved set-user-ID를 각각 바꾸어주는 함수이다.
인자로 들어간 함수중에서 getegid()함수는 호출프로세스의 유효 그룹 ID를 반환하는 함수이다.
두번째 줄의 setresgid는 인자로 들어간 3개의 값으로 프로세스의 real GID, effective GID, saved set-group-ID를 각각 바꾸어주는 함수이다.
여기까지 해도 잘 모르겠으니까 구글에 shellshock를 검색해보니까 바로 연관검색어로 shellshock취약점 shellshock bash등 많이 나와서 bash취약점에 대해 공부해봤다.
요약해서 말하자면 shellshock취약점은 bash shell에서 임의의 환경변수에 특정 코드를 삽입하여서 실행할 수 있는 취약점이다. 이 취약점은 bash버전 4.3이하에서 발생하는 취약점이라고 한다.
리눅스상에서는
func() {echo hello;}
이런식으로 함수를 정의할 수 있다.
그 후에 -f 옵션을 통해서 합수를 등록해준다. 그 후에 그 환경변수를 호출하면 아래와 같이 함수가 실행된다.
이를 이용해서 shellshock취약점이 일어나게 되는데
bash 환경 변수에 함수처럼 보이는 변수를 정의한다.
export x = '() { echo hello~; }'
이런식으로 함수 문법으로 시작되는 문자열을 적어 넣는다.
이런식으로 환경변수 값을 보면 문자열 형태로 들어가 있는 것을 알 수 있다.
그런데 bash subshell을 열면 bash가 시작되면서 등록된 환경변수를 다시 읽어오게 된다. 그렇게 되면 함수인척 하고 문자열로 저장된 환경변수가 진짜 함수로 정의되게 된다.
여기까지만 보면 아무 문제가 없는 것 같지만 변수를 정의할때 뒤에 명령어도 실행시킬 수가 있기 때문에 취약점이 발생한다.
export x = '() { echo hello~; };pwd;id'
와 같이 변수를 정의하면 bash가 실행되면서 환경변수가 함수로 정의되고 뒤에 있는 명령어까지 실행되게 된다.
이제 플래그를 읽어와보자.
bash의 버전부터 확인해보면
당연하게도 4.2.25버전으로 패치되기 전 버전인 것을 확인할 수 있었다.
아까 봤던 코드를 생각해보면 setresuid와 setreguid함수를 통해 권한을 상승시키고 그 상태에서 bash shell을 실행시켜주는 코드라는 것을 알 수 있다.
그러면
export pay='() { echo hello!; }; /bin/cat flag'
로 변수를 정의시켜주고 shellshock를 실행시키면 바로 flag를 읽어올 것이다!! 해보자~!~!
성공이다!!~!
'pwnable > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] blackjack (0) | 2019.06.26 |
---|---|
[pwnable.kr] coin1 (0) | 2019.06.25 |
[pwnable.kr] mistake (0) | 2019.02.24 |
[pwnable.kr] leg (0) | 2019.02.20 |
[pwnable.kr] input (0) | 2019.02.18 |