'Write_UP'에 해당되는 글 24건

  1. 2017.11.01 2017 Whitehat Contest - Winner of Life
  2. 2017.06.13 [strpr] PHP Sandbox
  3. 2017.06.12 [stypr] tofukimchi
  4. 2017.02.11 2017 Codegate - 2D Life Write up + 출제후기 (11)
  5. 2016.05.31 [S.T] obfuscatorv1
  6. 2016.05.31 [S.T] Let's start
  7. 2016.05.17 [S.T] PHP Traps (1)
  8. 2016.04.26 [wechall] yourself
  9. 2016.04.26 [wechall] htmlspecialchars
  10. 2016.03.21 [stypr] PHP Trick

유명한 대회의 2회차 출제이기도 하고, codegate와 같은 국제적인 대회가 아니라는 점을 토대로 이번엔 저번 출제보다 한결 편한 마음으로 출제 할수 있었습니다. 하나 고민되는건 문제를 만들때마다 아이디어를 어떻게 합쳐 낼 것인가, 이 아이디어를 어떻게 자연스럽게 전달 할 것인가에 대한 부분은 아직 출제 기술의 부족으로 여전히 힘든 부분이었지만, 점차 나아지리라 생각합니다.

이번 문제의 중점은 SQL injection 보다 자신에게 필요한 정보가 무엇인지 주어진 정보를 토대로 판별하는 능력이 있는가? 에 대한 물음이 더 컸다고 봅니다. 모든 문제가 그렇듯, 출제자의 의도를 파악하면 그 문제를 어떻게 접근해야 할지 길이 보입니다. 이번문제에서 왜 phpinfo를 제공했었는가, leak.tar에 들어있는 정보는 나에게 뭘 이야기 하려고 하는것인지에 대한 답을 찾았다면, 남은건 SQL injection의 필터링만 남아 있었을 뿐인, 어떻게 보면 단순한 문제였습니다.

자신이 원하는 정보를 걸러내고 획득할수 있다는 점은 웹 뿐만 아니라, 시스템, 포렌식 등에서도 중요한 요소라고 생각합니다. 또한, 팀 단위의 CTF다 보니 자신이 모르는 부분은 팀원에게 의지하는 것도 상당히 중요하다고 생각합니다. 팀을 이끄는, 흔히 말하는 캐리력 있는 포지션도 상당히 멋지다고 생각합니다. 다만, 그런 인재는 주변에 상당히 적고, 대부분은 이름이 난 사람들이죠. 그런 사람들이 없는 팀은 자기가 맡은 분야별 문제를 풀면서 모르는 것이 있으면 검색만 하다가 CTF가 끝나버리는 그런 경우도 저는 상당히 많이 겪었고, 많이 봐 왔습니다. 순수하게 한 분야의 지식만을 문제로 내는 것은 이러한 비극을 계속 되풀이하는 과정이라고 생각하였고, 출제를 할 기회가 오면 이러한 것은 꼭 막아보고 싶었습니다.

물론, codegate의 문제출제는 그런의미에서 보면 실패작이라고 생각합니다. 저희 부모님 생명연장에 큰 도움을 준 2DLIFE 문제나, 본선에 출전하신 분들은 풀어보셨을 Eagle-jump 문제 등이 그러하죠. 그런 문제를 통해서 얻을수 있는건 팀원간의 결속력이 아닌, 특정공격에 대한 더 깊은 호기심, geek한 발상, 욕 실력 정도라고 생각합니다. 순수하게 자신이 웹 분야를 잘하고 공격기법을 많이 알면 풀수 있는.. 그런 문제였습니다.

그래서 이번 문제에서는 조금 더 나아가서, 정보를 토대로 원하는 환경을 구축할수 있는가? 에 대한 질문을 던져보기로 했습니다. 웹 분야를 하고있는 여러분께서 과연 팀원과 얼마나 의사소통을 하시는지, 혹은 다른분야에 대한 관심을 가지셨는지에 대한 출제자의 설문조사 정도로 생각해 주시면 감사하겠습니다.


Write-up의 간단한 요약은 다음과 같습니다.

1. leak.tar를 통해 cron으로 돌고있는 php파일을 파악하고 mysql의 variable 세팅을 통해 /var/www/html 의 file privilege가 있다는것을 파악한다.

2. 시행착오를 통한 blind sql injection을 시도한다. (strcmp를 통한)

3. file 유출에 성공하고 이를 토대로 random generator 소스를 가져와서 환경을 구축한 후

4. 번호를 추출하여 입력


아마, 2번에 있어서 많은 시행착오가 있을것이라 생각됩니다. 본선에 낼수 없었던 이유중 하나기도 합니다.

예선에서의 많은 고통을 감내하고 본선에 진출하신분들, 축하드립니다. 본선에서 문제로 찾아뵙겟습니다.

prob1_POC.py

WinnerOfLife WriteUp.pdf


Posted by Maid:: IzayoiSakuya

댓글을 달아 주세요

[strpr] PHP Sandbox

2017.06.13 10:06

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[stypr] tofukimchi

2017.06.12 21:22

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

-출제후기-


문제를 내보는게 어떻겠냐는 처음 제의에 많이 망설였습니다.

코드게이트가 작은 대회도 아니고 제 실력으로 전세계의 짱짱한 해킹팀들을 테스트 하는 문제를 낸다는게 상당히 부담스럽고

코딩실수나 문제 설계 오류로 인해서 많은 팀들의 눈쌀을 찌푸리게 하진 않을까, 제의 해준 회사에 누가 되지는 않을까. 하고 말이죠


"팀당 한두시간 버틸 난이도로 내주세요" 라고 들으니 더더욱 부담이 컸습니다.
하지만 다른 웹문제 출제도 될테니.. 하고 아이디어를 찾기 시작하다가 평소에 생각해둔, 구현해보고 싶은것을 짜보기로 했습니다.

그게 이번 문제의 첫 단계로 지정된 oracle padding attack이었습니다.


이전에 출제됬던 codegate문제의 oracle padding attack과 크고작은 워게임의 oracle padding attack을 보면서 느낀점이

문제 유형이 하나의 블럭에 대해서만 암/복호화를 하는 유형으로 거의 고정되어 있다는걸 느꼈습니다.

이 부분에서 조금의 고민을 했죠. 왜 하나의 블럭만 암/복호화 하는지.


oracle padding attack 을 이해하기 위해서는 하나의 블럭만 암/복호화 해도 상관없다고 생각합니다만,

공격의 기본이 되는 CBC와 같은 원리에 대해서는 다소 도움이 되지 않을것이라 생각했습니다. 그래서 이것을 2개이상의 블럭이 나오도록

암호화 해보는건 어떨까? 라는게 첫 아이디어 였습니다.


하지만 세계급 대회인 만큼 하나의 아이디어로 문제를 내기엔 역부족이라 생각하였습니다. 그래서 복호화 된 평문을 기준으로 새로운

인증과정이 있으면 어떨까? 하는 생각이 났습니다

일반적인 로그인 과정을 보면 ID와 PW를 입력하듯이, 이 평문에는 그러한 정보가 있고 이 정보를 토대로 로그인을 하는 그런 문제를 만드는것이

어떨까? 하는 생각이 났습니다.


처음엔 단순한 sql injection을 넣을까? 하는 생각을 하다가 조금은 특별한 구문을 채용하기로 했습니다.

해당 구문은 특정상황에서 column name을 몰라도 해당 테이블의 정보유출이 가능한 구문으로, real world에선 거의 쓰일 일이 없지만,

여러분의 학문적인 흥미를 유발하기에 충분할 것이라 생각하고, 문제 풀이과정에 있는 도전자 분들에게는 상당히 많은 스트레스를 유발할수 있지만

문제를 풀어냈을때 쾌감과 함께 얻어가는 지식이 있을것이라 생각했습니다.


이 부분은 제가 BoB 과정에 있으면서 들은 조언중  '문제를 만들때는 항상 전달하고자 하는것이 있어야 한다.' 라는 모토와 부합한다고 생각했습니다.

그리하여, 한국시간 19시 50분 경, LC/BC 팀이 처음으로 이 문제를 풀어내고 IRC 닉네임 vos 라는 해커에게서 "정말 좋은 첼린지 였어!" 라는 말을 들었을때

출제하길 정말 잘했다 라는 생각이 들더군요. 


그 이후 몇몇팀이 풀기 시작하고 대학부에서도 한 팀이 풀어냈습니다. 물론, 질문은 대회가 끝나기 10분 전까지도 왔습니다만.. 그만큼 제 문제에 대해

많은 고민을 해 주신게 아닌가 하고 생각하니 그 동안 고생한 것에 대한 보람이 느껴졌습니다.


한편으로는 역시 padbuster와 같은 tool의 사용을 막기 위해서 조금 더 신경썼어야 했다, 문제를 좀더 어렵게 냈어야 했다 등등 마음속에서 다소의 아쉬움도 있었지만 그것들은 단순히 문제로 도전자를 괴롭히기 위한 하나의 심술에 지나지 않는다는 생각을 했습니다. 이 문제로 난 충분히 이야기 하고싶은것을 전달했고, 이에 대해 많은 분들께서 얻어가는게 있다면 이 문제, 코드게이트에서의 2D Life는 성공적인 문제라고 스스로 생각합니다.


대회도중, 대회가 끝나고도 이 문제에 대해 guessing 문제 라고 말씀하시는 분들이 있는걸 보면 아직 제 문제 출제 실력이 역시 미숙하다는것을 느낍니다. 가능한 자연스럽게 유도하는 문제가 되었어야 헀지만 그렇지 못한점, 이 후기를 통해 사과의 말씀 드리고 싶습니다.


첨부한 문서는 출제된 2D life 문제에 해당하는 제가 쓴 Write up 입니다. 어떻게 보면 제작자가 원하는 방향이라고 볼수도 있겠죠.

주변 지인에게서 받은 풀이방법들도 대부분 제가 의도한 구문들이 적혀있어서 다른 Writeup과 큰 차이는 없을수 있지만.. 



2D Life Write up_off the recode.pdf


Posted by Maid:: IzayoiSakuya

댓글을 달아 주세요

  1. 2017.12.31 23:36  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Maid:: IzayoiSakuya 2018.01.12 16:58 신고  댓글주소  수정/삭제

      비밀댓글이라 이제 봤네요. 평소에 로그인안하고 공개댓글만 보다보니..
      해당 툴의 사용법이라면 --help 와 같은 명령어를 통해서도 충분히 얻을수 있지만

      http://www.hackingarticles.in/hack-padding-oracle-lab/
      이 사이트의 문서가 도움이 될수 있겠네요.
      원리만 아신다면 직접 짜보시는게 더 도움이 될겁니다.

  2. aadf 2018.01.30 15:38  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 궁금한게 있어서 여쭈어 봅니다. 코드게이트 2017년 write up을 보면서 궁금했던점이 쿠키값을 보고 오라클 패딩 공격을 해야겠다는 발상을 할 수 있는 지를 잘 모르겠어요. secret 페이지 까지 들어가서 spy로 로그인을 하는 것 까지는 따라 가겠는데, 물론 로그인이 된다면 의심할 만한 것중 쿠키값이 있다는 것은 알겠지만 그 쿠키값을 오라클 패딩어택을 사용해야 한다는 것 까지는 힘들어서요. 또한 제가 서칭 해 보아도 잘 모르겠어서 그런데 오라클 패딩공격을 할 수 있는 유형이 따로 있는지요? 귀찮으시겠지만 혹시 답변 가능하시면 부탁드릴게요,,,

    • Maid:: IzayoiSakuya 2018.01.31 09:09 신고  댓글주소  수정/삭제

      CTF에 대한 전반적인 감이라고 해야할까..
      아무래도 웹은 입력값을 넣고 그 입력값을 토대로 추측할수 밖에 없으니까요

      Base64에 사용되지 않은 | 라는 문자열이 무언가를 구분하기 위한 delim으로 사용됐다는것을 알면 앞부분과 뒷부분을 바꿔봐야겠다는 생각이 들수 있고, "Error has occur from decrypt.." 라는 에러메세지를 토대로 무언가 복호화 하고 있다는 것을 알 수 있죠.

      그 복호화의 실패가 나의 쿠키변조에서 일어났다는걸 알게 된다면, oracle padding과 연관지을수 있습니다.

    • Maid:: IzayoiSakuya 2018.01.31 09:13 신고  댓글주소  수정/삭제

      이건 CTF와 같이 힌트가 주어지는 경우에 추측할수 있는것들이고, 일반적인 모의해킹 상황은 조금 다릅니다.
      쿠키로 제공하지 않고 GET으로 이해할수 없는 값을 보낸다거나, Hidden value로 보낼수도 있겠죠.
      오라클 패딩어택의 기본요건은 아시다시피 복호화 실패등에 대한 에러를 공격자가 인지할수 있는 환경에서 가능합니다.
      좀더 자세한 설명은 아래 링크를 첨부해 드릴게요
      http://linkc.tistory.com/164
      http://bperhaps.tistory.com/3

  3. 상감자 2018.02.01 13:29 신고  댓글주소  수정/삭제  댓글쓰기

    답변 감사합니다. 그런데 오라클패딩기법을 사용하기 위해서 전제 되어야하는 조건을 알수있나요? 복호화 실패와 성공이 꼭 표시 되어야지 만이 쓸 수 있는 공격 기법인가요?

    • Maid:: IzayoiSakuya 2018.02.01 14:14 신고  댓글주소  수정/삭제

      제가 아는 지식선 상에서는
      1. CBC모드를 사용할것
      2. 패딩규칙이 일반적일 것
      3. 복호화의 결과가 올바르지 않다는 에러를 공격자가 인지 할수 있을것.
      이렇게 3가지입니다.

      CBC는.. 블럭암호를 만들때 사용하는 하나의 방법이고..

      패딩규칙에 여러가지가 있는걸로 아는데, 여기서 사용된것은 남은 byte만큼의 숫자로 패딩하는 규칙을 사용했던걸로 기억합니다.(PKCS7 패딩) 이외에 여러가지 패딩규칙이 있습니다.

      마지막으로 공격자가 인지할수 있을것은 꼭 에러문뿐 아니라 응답시간에 차이가 있다던지, 페이지가 다르게 출력된다던지(redirect 계열) 등등 여러가지 꼽을수 있겠네요.

      비단 웹 뿐만아니라 암호학에 관련된 부분이기 때문에 같은 알고리즘을 적용한 시스템,서비스 등도 공격당할 수 있습니다.

  4. 상감자 2018.02.01 14:19 신고  댓글주소  수정/삭제  댓글쓰기

    친절하게 답변해주셔서 정말 감사합니다.

  5. 상감자 2018.02.02 16:00 신고  댓글주소  수정/삭제  댓글쓰기

    근데 padbuster에 암호화된 문장을 넣을 때에는 %7c(|)뒤에 문자열만 넣나요 아니면 전체 문자열을 다 넣나요?
    혹시 가능하다면 padbuster에 치는 문장을 다 올려 주시거나 알려주실수는 없나요?

    • Maid:: IzayoiSakuya 2018.02.05 10:03 신고  댓글주소  수정/삭제

      패드버스터는 안쓴지 오래되서..
      아마 넣으신 암호문이 있는지 확인하는 방향으로 툴이 돌아갈거예요

      윗 댓글에 달려있듯이 아래 링크 참조하시면 응용해보실수 있겠네요
      http://www.hackingarticles.in/hack-padding-oracle-lab/

  6. 상감자 2018.02.07 09:29 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다

[S.T] obfuscatorv1

2016.05.31 15:30

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[S.T] Let's start

2016.05.31 09:57

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[S.T] PHP Traps

2016.05.17 09:19

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[wechall] yourself

2016.04.26 19:37

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[wechall] htmlspecialchars

2016.04.26 19:22

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[stypr] PHP Trick

2016.03.21 18:36

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.