ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [pwnable.kr][Toddler's Bottle] 10. shellshock
    Wargame/pwnable.kr 2019. 8. 4. 05:14

    Toddler's Bottle - shellshock

     

    먼저 해당 계정으로 들어가서 파일을 확인해보았다.

    ls -l

    flag, shellshock 파일 외에 bash가 존재했다.

     

    일단 shellshock.c 부터 먼저 확인해보았다.

    cat shellshock.c

    setresuid는 프로세스의 Real UID, Effective UID, Saved Set-User-ID를 변경하는 함수로, 여기서는 getegid()로 설정된 것으로 보아 현재 호출된 프로세스의 UID로 설정된다. setresgid는 setresuid와 마찬가지 방법으로 gid를 설정한다.

    uid와 gid를 모두 설정한 후에 system 함수로 bash를 실행한다. 

    flag와 shellshock의 권한이 같으므로, shellshock를 실행하는 도중에 flag를 실행하면 flag를 읽을 수 있을 것이다.

     

    shellshock는 2014년에 발견된 bash 취약점으로, bash 쉘에서 임의의 환경변수에 특정 코드를 삽입하여 실행 및 공격할 수 있는 취약점이다.

     

    shellshock 취약점은 아래 명령어를 통해 확인할 수 있다.

     

    env x='() { :;}; echo vulnerable' bash -c "echo test"

     

    env x = (함수명) {수행할 코드}; (①) 부분은 함수를 x라는 환경변수에 등록하는 명령어이다. 따라서 이 명령어만 수행된 상태에서 bash 쉘을 열면, bash가 등록되어 있던 환경변수 x를 읽어오면서, bash가 실행되기 전에는 문자열로만 등록되어 있던 () { :;}가 진짜 함수로 인식된다.

    그러나 env x='() { :;}; (①) 뒤에 echo vulnerable' bash -c "echo test"과 같은 명령어가 추가된 상태로 bash가 실행되면, 원래는 무시되어야 할 세미콜론(;) 뒷부분이 모두 함수로 정의되어버리면서 뒤에 있는 명령어들까지(②, ③) 실행된다.

    따라서 위와 같이 명령어를 입력했을 때 ②, ③ 명령어가 실행되는 것으로 보아, ./bash는 shellshock 취약점이 존재한다.

     

    이러한 점을 이용하여, 아래와 같은 명령어를 실행한다면 env x='() { :;}; /bin/cat flag' 부분이 모두 함수로 인식될 것이고, 이 상태에서 bash 쉘을 실행시키는 코드가 포함된 shellshock 파일을 실행한다면 권한이 변경되어 flag를 읽을 수 있게 될 것이다.

     

    env x='() { :;}; /bin/cat flag' ./shellshock

     

    (※ cat ./flag처럼 상대경로로 명령어를 입력하면 flag가 나타나지 않으니 주의한다.)

     

     

     

    [참고 자료]

    shellshock

    https://blog.naver.com/renucs/220144713558

    https://blog.hyomin.xyz/42

Designed by Tistory.