ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pwnkr] Shellshock Write-up
    표튜터와 함께하는 Pwnable/Pwnable.kr Write-up 2019. 4. 1. 23:31

    이번 문제는 Shellshock 문제이다.



    감이오지 않아서 우선 힌트를 보았다.


    그리고 코드를 보았다.

    코드를 보았더니 그냥 문득 들었던 생각은 FTZ문제들이 떠올랐다. 

    뭔가 FTZ 초반에 나왔던 연속적인 명령어 실행이나

     어떠한 실행파일이 실행시에 지니는 권한을 이용하는

     문제같다는 느낌이 들었다.



    해볼 것도 없었지만 shellshock 실행파일을 실행시켜보았더니

    shock_me라는 문자열이 출력되었다.


    뭔가 내가 모르는 어떠한 취약점을 이용한 공격이라는 생각이 들었고

    shellshock를 검색해보았다. 그랬더니 역시나 shellshock bash shell 취약점이

    존재한다는 것을 알게 되었다. 그래서 이 취약점을 공부해보았다.


    이 취약점은 bash shell에서 임의의 환경변수에 특정 코드를 삽입하여

    실행할 수 있는 취약점이다. CVE-2014-6271이며 유닉스나

    리눅스에서의 bash 4.3.46이전 버전에서 발생한다.



    기본적으로 알아야하는 내용은 바로 환경 변수에 변수와 함수를

    정의할 수 있다는 것을 알아야한다. 방법은 간단하다.


    < 환경변수에 정의한 변수 >

    이런식으로 입력해주면 환경변수에 변수 A를 등록할 수 있다.

    단순한 변수이기 때문에 실행이 되지는 않는다.



    이번에는 함수를 등록해보도록 하겠다.

    A라는 함수를 정의하고 export에서 -f 옵션을 주게되면 해당함수를

    환경변수에 등록할 수 있다. 이렇게 등록된 함수는 실행이 가능하다.

    이것을 기반으로 바로 shellshock 취약점을 일으킬 수 있다.


    위에서 했던 것처럼 환경변수에 변수 b를 정의해준다. 하지만 이 때 주목할 점은

    변수가 함수처럼 생겼다는 것이다. 함수처럼 생겨먹은 형태로 변수를 정의해준다.

    printenv 명령어로 확인한 결과 함수형태의 문자열이 출력되었다.



    하지만 이때 Child로 생성된 bash shell(subshell)이 실행되면 등록되어있는

    환경변수를 읽어오고 bash shell에서 "() { }" 형태의 함수 문법으로 정의된 변수는

    함수라고 판단하게된다. 그러므로 우리가 위에서 등록한 b가 함수로 판단되어진다.


    그러므로 child로 생성된 bash shell(subshell)을 실행시킬 경우 함수로 판단되고

    해당 변수를 실행하게되면 함수로 판단했기 때문에 실행이 된다.



    이 때 우리는 이 함수로 판단되어지는 형태 뒤에 우리가 실행하고 싶은

    명령어를 더 붙여줌으로써 공격을 할 수 있게 되는 것이다. 그렇게 되면

    정의된 변수가 실행되면서 뒤에 있는 명령어들이 실행되는 것이다!!!

    하지만 bash shell을 실행시킬 경우 뒤에 붙인 명령어만 실행되어 결과가 출력된다.

    그리고 함수로 판단된 변수를 입력해야지 함수의 내용이 출력된다.


    그 이유는 무엇일까??

    확실하지는 않지만 처음엔 변수형태인 test를 subshell 실행 시 해당 변수를 그저 함수로만

    판단하고 뒤에는 명령어가 있기 때문에 실행이 되는 것 같다. 그 이후에 다시 함수를 호출하면

    함수로 판단되었기 때문에 실행이 된다. 이렇게 판단하게된 이유는 위의 사진처럼 뒤에

    명령어를 붙이지 않고 subshell을 실행시킨다고해서 함수가 실행되지는 않았기 때문이다.

    ( 혹시... 정확하게 아시는분 댓글 좀 남겨주세요 ㅠ )



    이제 공격을 해보도록 하자!!

    다음과 같이 환경변수에 함수같은 변수를 등록해주는데 뒤에

    우리가 보고싶은 flag에 출력에 대한 cat 명령어를 붙여주었다.

    하지만 우리는 권한이 없어서 "/bin/cat"이 실행되더라도 볼 수가 없다.


    < shellshock.c >

    그러나 shellshork의 코드를 보니 권한설정(shellshock_pwnd으로 권한상승)을 해준 뒤

    system함수로 bash를 실행시킨다. 그러므로 함수와 flag를 보는 명령어로 구성된 변수를

     환경변수에 변수로 등록시킨 뒤 shellshock을 실행시키면 child로 생성된 bash shell이

    실행되면서 환경변수에 등록된 변수를 함수로 판단하여 실행시킬 것이다.


    setresuid( )함수 : 각각의 인자가 real UID, effective UID, saved set-user-ID를 변경함

    setresgid( )함수 : 각각의 인자가 real GID, effective GID, saved set-group-ID를 변경함

    geteuid( )함수 : 호출 프로세스의 유효 사용자의 ID를 반환함

    getegid( )함수 : 호출 프로세스의 유효 그룹 ID를 반환함



    '( ) { < 함수 Body >; }; < 공격 코드 >'

    ( 띄어쓰기 주의하자!! )


     FLAG를 볼 수 있었다!!


    !! 참고로 export대신 env를 사용해도 공격이 가능하다 !!








    반응형

    '표튜터와 함께하는 Pwnable > Pwnable.kr Write-up' 카테고리의 다른 글

    [Pwnkr] Lotto Write-up  (0) 2019.04.03
    [Pwnkr] Leg Write-up  (0) 2019.04.02
    [Pwnkr] Mistake Write-up  (0) 2019.04.01
    [Pwnkr] Random Write-up  (0) 2019.04.01
    [Pwnkr] Passcode Write-up  (0) 2019.03.31

    댓글

Designed by Tistory.