Analysis
bash? 와 관련있다고 하는데 Olday 취약점인가?
#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를 통해 set uid가 걸려있던 shellshock 바이너리의 권한을 shellshock_pwn으로 수정한다.
그러고보니 shellshock를 bomb lab에서 했는데. 그 때에는 웹을 통해서 공격했었다.
이 문제에서는 쉘을 그대로 공격하는 것으로 원리를 알아가야겠다.
ShellShock (CVE-2014-6271)
shellshock는 2014년에 발견된 bash쉘의 취약점이다.
bash는 unix 및 시스템에서 널리 사용되는 쉘 중 하나로 이 취약점을 이용하면 RCE (Remote Code Execution)이 가능하다.
이 취약점은 환경변수를 처리하는 방식에서 발생한다. bash에서는 특별한 형식의 환경변수를 통해 함수를 정의할 수 있도록 용했다.
asdf가 echo hihi가 된다.
그러나 이러한 환경 변수를 처리할 때, 함수 정의 다음에 오는 추가 명령어도 실행하도록 했다.
여기서
와 같이 입력한다.
그러면 다음 bash를 실행시킬 때 환경변수를 읽어오는 과정에서, 이를 함수로 읽어온다.
asdf를 test 함수로 인식하여 asdf를 하면 echo test한다.
위는 추가 명령어를 실행하는 예시이다.
함수 정의 이후, 세미콜론을 이용하여 원하는 명령어를 command injection가능하다. 취약한 bash를 실행시켰는데, ls를 자동으로 실행한 모습.
문제 바이너리에서는 취약한 bash를 실행시킨다.
우리는 이를 이용하면 환경변수만을 이용하여 flag를 읽을 수 있을 것이다.
Solution
함수 정의 뒤에 flag를 읽어들일 명령어를 삽입한다.