[Research] 버그헌팅 튜토리얼 Part 1

안녕하세요 L0ch입니다! 오늘은 특별한 글을 가져와봤어요 ㅋㅋㅋ 바로 대학교 동아리 대-선배님의 버그헌팅에 대한 꿀팁이 담겨있는 글입니다!

때는 2018년.. 아직 새내기 티를 벗어나지 못한 저에게

윈도우 취약점 찾아볼래?

라며 올려주신 글입니다 ㅎㅎ.. 버그헌팅에 대한 소개부터, 대상 선정-분석-익스플로잇 까지 버그헌팅 뉴비도 이해할 수 있도록 친절하게 설명이 되어 있어 도움이 많이 되었죠. (그땐 몰랐지 앞으로 윈도우로 고통받게 될지…..)

여튼 그래서 허락을 구하고 올리게 되었으며 시리즈가 긴 만큼 나누어서 올릴 예정입니다. 게시를 허락해주신 선배님께 다시 한번 감사의 말씀을 드리며 시작하겠습니다!


서론

음 버그헌팅 튜토리얼이라는 거창한 제목을 해도 될지 모르겠지만 ㅋㅋㅋ 제가 찾았던 취약점을 예시로 버그헌팅 과정에 대해서 얘기해 보고자 합니다.

뭐 대단한 게 아니라 그냥 제가 어떻게 취약점을 찾았고 익스플로잇을 어떻게 했는지 정도? 키사 보고서 쓰는 팁도 좀 써보려고 하다가 그냥 보고서는 최대한 자세히 많이 쓰는 게 답인 거 같아 이 부분은 빼고 얘기할 거 같네요 ㅋㅋ

최근에는 공유기랑 뭐 IOT가 대세여서 주변에 이렇게 윈도우 프로그램 버그 헌팅하시는 분들을 많이 봤지만 윈도우 프로그램 버그헌팅을 시작하시려는 분들께 도움이 되었으면 합니다 ㅎㅎ (그래도 공유기가 개꿀임 ㅠㅠ)

이 글은 읽으시는 분들이 기본적으로 해킹에 대한 기본지식이 있다는 전제 하에 쓰겠습니다. 워게임도 풀어보고 리버싱 좀 할 수 있고 정도….? 그리고 버그헌팅을 아예 안 해보신 분들? 애매하지만… 그래도 최대한 쉽게 자세하게 쓰려고 노력해볼게요.

※ 글 읽을 때 주의사항 ※

  1. 이 글은 제 경험을 바탕으로 쓰는 것이기 때문에 혹시 더 좋은 방법이나 아이디어 있으신 분은 댓글을 달아주시면 감사하겠습니다.
  2. 이 글의 흐름은 제 의식의 흐름과 같습니다. 중간에 이야기가 딴 데로 새거나 오타가 있거나 아니면 개소리를 하거나….
  3. 최대한 제가 했던 방법들을 모두 써낼 것이기 때문에 실패하는 과정도 쓸 생각입니다. 그렇기 때문에 처음 볼 때부터 직접 하면서 따라가기보다는 한 번 쓱 보고 따라 해 보시는 걸 추천드립니다
  4. 제가 문과도 아니거니와 학창 시절의 절반 이상을 중궈에서 보냈기 때문에 한쿸말이 쵸금 부족합니데스.

뭐 암튼 시작하겠습니당 ㅋㅋ

목차

part 1

  1. 버그헌팅이란?
  2. 버그 바운티
  3. 취약점을 찾기 전에
  4. 취약점을 찾는 방법
  5. 타깃 선정
  6. 시드 파일

To be Continued…

  1. 버그 바운티 - KMPlayer
  2. From Crash to Exploit
  3. 잡담

버그헌팅이란?

소프트웨어나 웹 서비스 등의 취약점을 제보해 금전적인 보상, 해커의 명예 획득 등 이득을 노리는 일련의 행위입니다. 뭐 그러니까 결국 취약점을 신나게 찾고 돈도 받고 크래딧도 받고 ㄱㅇㄷ

국내의 경우 주의해야 할 점은 서비스 중인 웹 사이트 혹은 서버에 대한 공격은 불법이므로 웹 버그헌팅은 좀 힘들겠네요 ㅠㅠ 하지만 제가 알기로는 네이버는 가능한 걸로 알고 있습니다.

버그 바운티

해커들이 제보한 취약점에 대한 보상을 해주는 제도입니다.

1) 각 회사별 버그 바운티

외국 같은 경우에는 각 회사(다는 아니지만)마다 버그 바운티를 운영하고 있습니다. 다들 잘 아시겠지만 대표적으로 구글, 페이스북, 애플 등등 웬만한 아는 기업들은 다 버그 바운티를 운영하고 있습니다. 물론 자사의 프로그램의 대해서만 운영하고 있죠. 하지만 각자 운영 룰은 조금씩 다릅니다.

예를 들어 어디는 자사 프로그램의 크래시만 받는 곳도 있지만 어디는 풀 익스까지 있어야지만 보상을 해주는… 아니면 크래딧만 주고 리워드는 없는…. 뭐 그런 거는 각 회사의 홈페이지에서 확인을 하시면 됩니다.

https://www.bugcrowd.com/bug-bounty-list/

위 링크를 들어가시면 버그 바운티를 운영하고 있는 회사들의 리스트와 운영 방식이 간단하게 정리되어 있습니다. 관심 있으신 분들은 참고하시면 될 거 같아요.

2) 제로디움, ZDI, 해커원 등

타 회사의 취약점도 제보받는 버그 바운티입니다. 보상이 쌘 걸로 유명하죠. 제로디움의 보상금액을 한번 볼까요?

출처 : 제로디움

그냥 봐도 상당히 세죠?? ㅎㄷㄷ

기본적으로 $10,000 면 지금 환율로 계산해보면 천만 원이 넘네요;;; 하지만 그만큼 쉬운 타깃은 하나도 없네요 ㅠㅠ 그리고 기본적으로 다들 풀 익스를 해서 보내야 하기 때문에 더더욱 힘듭니다.

해커원 같은 경우는 제로디움과 ZDI 와는 다르게 웹 서비스에 대해서만 버그 바운티를 진행하고 있습니다. 국내에서 웹 버그 바운티를 못해서 아쉬운 분들은 해커원 버그 바운티를 시도해보는 것이 좋을 듯합니다 ㅎㅎ

3) KISA S/W 신규 취약점 포상 신고제

전 세계적으로 유일하게 국가기관이 운영하고 있는 버그 바운티 프로그램입니다.(라고 발표에서 들었던 게 생각이 나네요) 그리고 국내에서 몇 없는 버그 바운티 중 하나이기도 하죠 ㅋㅋ

키사를 제외하고 삼성이나 다른 몇몇 회사에서도 버그 바운티를 운영하고 있지만 대상이 제한적인 걸로 기억합니다. 저는 개인적으로 키사에서 운영하는 버그 바운티가 제일 괜찮은 거 같네요.(애용하고 있습니다 ㅎㅎ 많이 제보하지는 않았지만…)

https://www.krcert.or.kr/consult/software/vulnerability.do?orgSiteUrl=https://www.krcert.or.kr

위 링크에 들어가서 신고서 양식을 다운로드해 양식대로 작성하고 제보하시면 됩니다. 쉽죠?

2016년에는 eip만 바꿔서 제보를 해도 포상을 줬던 거 같은데 최근에는 꼭 풀 익스를 해야지만 포상을 준다고 하네요 ㅠㅠ

취약점을 찾기 전에

취약점을 찾기 전에 먼저 알아둬야 할 것들에 대해서 먼저 얘기해볼게요

  1. 모든 취약점은 untrust input으로부터 발생합니다. 무슨 취약점이든 간에 사용자가 컨트롤할 수 있고 프로그램에 전달되는 데이터의 조작에 의해서 버그가 발생합니다.
  2. 모든 버그가 익스 가능한 것이 아닙니다. 예를 들어 오버플로우가 발생했어도 미티게이션 때문에 익스를 못 할 수도 있고 아니면 eip 컨트롤할 수 있는 부분이 없어서 익스를 못할 수도 있습니다. → 실제 경험임. 오버 플로우 했는데 익스 못함…(사실 더 보기 귀찮아서 안 봄)
  3. 남이 이미 찾아서 제보를 했을 수도 있기 때문에 업데이트가 나오면 바로바로 확인해야 합니다. 익스하고 있는데 다른 사람이 먼저 제보해서 업데이트한 걸 모르고 있다가 시간만 날리면 억울하자나요 ㅠㅠ (자기 꺼는 패치 안될 거라 생각하지 마세요… 패치당하면 삶의 의욕이 사라집니다… ㅠㅠ)
  4. 국내 프로그램에는 외국 유명 프로그램보다는 취약점이 많은 편입니다.(아 물론 진짜 보안에 신경 쓴 프로그램을 제외하고요. 한글 같이….? ㅠㅠ 보안모듈 올라가고 나서는 익스 하기 힘들다고 하네요) 취약점을 찾을 때 가장 불안한 것이 “취약점이 없으면 어쩌지?”인데 보통 프로그램들이 옛날 모듈을 쓰거나 처음 설계할 때 보안에 신경 쓰지 않은 프로그램들이 있어서 취약점을 찾기에는 어렵지 않습니다. (아마도…?)

그럼 취약점을 찾기 위해서는 무엇이 필요할까요?

  1. 리버싱 : 취약점이 어디 있는지 그리고 프로그램이 어떻게 돌아가는지 확인하기 위해서는 리버싱에 익숙해져 있어야 합니다. 리버싱을 잘할수록 취약점을 더 빠르게 찾겠죠.
  2. 익스플로잇 : 이거는 취약점을 찾고 eip를 잡고 나서의 문제인데 사실 국내 프로그램을 익스 할 때에는 corelan의 windows exploitation tutorial만 읽어도 충분합니다.(대부분은? 저도 모든 프로그램을 해본 게 아니라 장담은 못하겠네요)
  3. 개발 능력 : 가장 중요하다고 생각하는 부분입니다. 개발 능력이 있으면 리버싱하는 데에도 도움이 되고 프로그램 구조를 좀 더 정확히 빨리 파악할 수 있다고 하네요. 저는 개발을 못해서 이렇게 해킹을 못하나 봅니다 ㅜㅠ 개발은 또 언제 공부하지…

취약점을 찾는 방법

취약점을 찾는 방법은 여러 가지가 있습니다.

  1. 소스코드 오디팅
  2. 손 퍼징
  3. 퍼징

일단 소스코드 오디팅의 경우 소스코드가 있어야겠죠?? 소스코드를 보면서 분석하고 취약점을 탐색하는 방법을 말합니다. 국내 프로그램에는 거의 사용하지 못하는 방법이네요 ㅠㅠ 음 헥스레이 보면서 하는 것도 해당 사항이 되려나요? 뭐 그냥 코드를 보고 분석하는 것을 두루두루 말하는 거라고 보면 되겠네요.

손퍼징 같은 경우 제가 처음 버그헌팅을 하면서 많이 사용했던 방법인데요. 그냥 노가다입니다. Untrust input을 직접 손으로 넣거나 수정해가면서 테스트하는 방법입니다.

Untrust input 이 파일일 때 파일 포맷에 대해서 알아가면서 직접 수정해가면서 테스트를 해보면 뭔가 이 위치는 무슨 역할이라는 느낌이 좀 옵니다. (아마? 디버깅도 같이 하면서 좀 많이 삽질해야 하긴 하지만). 물론 이것도 파일 포맷이 단순할 경우이기는 하지만요. 예를 들어서 문서 포맷인 경우에 파일에 문자열이 존재하고 앞에 숫자가 있으면 이게 대충 뒤에 있는 문자열의 폰트 정보이거나 문자열의 길이라는 것을 바로 보고 알거나 몇 번의 테스트를 통해서 알 수 있죠. 이렇게 하나하나 삽질을 해가면서 파일 포맷에 대한 이해를 높일 수 있습니다.

처음에는 자기가 파일에 대한 추측을 할 수 있고 인풋을 정확하게 알고 있기 때문에 디버깅하기에는 비교적 편하다는 장점이 있습니다. 하지만 직접 조작을 해야 하기 때문에 시간이 많이 들고 모든 포맷을 알 수 있는 것도 아닙니다. 특히 파일이 압축되어 있는 상태라면 더더욱 이게 뭘 하는지 알 수가 없습니다. 사실 스크립트 퍼징 할 때 더 많이 쓰는 방법입니다 ㅋㅋㅋ

따라서 어차피 그냥 뮤테이션을 할거 보통 퍼저를 사용해서 퍼징을 합니다. 퍼저에서는 주어진 시드 파일을 임의로 조작하여 테스트를 진행해줍니다. 그리고 크래시가 발생하면 원본 파일과 크래시 파일 그리고 크래시 정보를 저장하죠. 저도 퍼징을 많이 사용하고 있습니다.

퍼저를 직접 짜도 되지만 공개된 무료 퍼저가 많습니다!!! ㅎㅎ 개이득 BFF, Peach, AFL 또 그리고… 뭐 있었더라… ㅋㅋㅋ 기억이 잘 안 나는데 뭐 암튼 ㅋㅋㅋㅋ 저는 BFF를 자주 사용합니다. BFF는 아래 링크를 들어가면 다운로드할 수 있습니다.

https://www.cert.org/vulnerability-analysis/tools/bff.cfm

원래 이름은 FOE 였는데 업데이트되면서 BFF로 이름이 바뀌었네요 ㅋㅋ 참고로 놀란 게 원래 FOE가 윈도우만 지원했었는데 업데이트되면서 맥이랑 리눅스도 지원하게 됐네요!! 간단하게 맥에서 몇 개 돌려봤는데 뭔가 더 많이 터지는 이 느낌적인 느낌… 나중에 맥 애플리케이션 익스플로잇도 해봐야겠네요 ㅋㅋㅋ

암튼 BFF 등 퍼저의 사용법은 간단하게 검색만 해도 많이 나오니 스킵하도록 하겠습니다 ㅋㅋ

타깃 선정

타깃을 선정하는 건 매우 중요합니다!! 왜냐!!! 포상 금액이 달라지니까요!!! 그럼 명예의 전당 순위가 변동이 별로 안되니까요!!!!(뭐 딱히 상관은 없지만) 암튼 타깃을 선정하기 전에 버그 헌팅을 하는 목적을 정해야 합니다.

  1. 난 돈을 벌고 싶다!!!! or 제로데이 맛이라도 보고 싶어요 ㅠㅠ 하나만 찾아보고 싶어요 ㅠㅠㅠ
    • 그럼 쉽고 익스 하기 쉬운 거 하시면 됩니다. 리얼루 그냥 날로 먹으면서 돈 많이 받을 수 있는 프로그램 좀 있어요 ㅋㅋ 하지만 여기에서는 실제 벤더 이름은 까지 않는 걸로… 잘 찾아보시면 은근히 많습니다. 모든 모듈에 Rebase, ASLR 안 걸려 있는 프로그램도 봤어요 ㅋㅋㅋㅋㅋㅋㅋㅋ
  2. 난 지식과 명예를 얻겠다!!!
    • CVE가 나올만한 프로그램을 대상으로 하시면 됩니다. 브라우저라던가 커널이라던가…. (아 근데 왜 요새 주변에 윈도우 커널 하는 사람이 많아진 느낌이지 내가 시작하려고 하니까 주변에서 다하네 다들 윈도우 커널 하지 마셈)
  3. 그럼 나머진 뭐냐!!!!
    • 그냥 하시면 됩니다……. 심심해서 하는 거예요…….;;;

장난이고 ㅋㅋㅋ 음 그래서 타깃을 내가 아는 프로그램으로만 할 것이냐?? ㄴㄴ 그건 아니죠

http://software.naver.com/main.nhn

네이버에서 이렇게 소프트웨어 자료실을 운영하고 있습니다. 보급도나 이런 건 정확한 수치로는 안 나와 있지만 추측은 가능하죠 ㅋㅋ 인기 많은 게 사람들이 많이 쓰는 거겠죠?? 네이버뿐만 아니라 다음이나 다른 사이트에서도 비슷한 것들이 있으니 이런 사이트에서 찾으시면 될 거 같습니다.

시드 파일

퍼저에서 양질의 결과를 나오게 하기 위해서는 양질의 시드 파일을 넣는 것도 매우 중요합니다 ㅋㅋㅋ

먼저 타깃 프로그램의 어떤 부분을 퍼징 할 것인지 정해야 합니다. 미디어 플레이어의 경우, 음악이나 동영상의 포맷만 결정하면 되긴 하지만(그렇다고는 하지만 버전이나 압축 방식, 운영방식 등등의 차이로 기능의 차이가 좀 있습니다. 그렇기 때문에 같은 포맷이더라도 샘플이 많을수록 좋죠), 워드나 한글 같이 기능이 많은 프로그램들은 구체적으로 어떤 기능에 대해서 퍼징을 진행할지를 결정해야 합니다. 이렇게 안 하고 그냥 막 만들면 리버싱 할 때 필요 없는 부분 리버싱 하느라 시간 낭비하기 일쑤입니다 ㅠㅠ 따라서 먼저 프로그램을 써보면서 어떤 기능이 있는지 파악하고 괜찮겠다 싶은 기능들을 정리해서 하나하나에 대한 시드 파일을 따로 제작하는 게 제일 좋습니다.

제일 좋은 방법은 직접 시드 파일을 제작하는 것입니다. 직접 제작하면 안에 데이터를 원하는 데로 조작할 수 있고 타깃이 명확하기 때문에 리버싱 할 때 편리함이 있습니다. 직접 시드 파일을 만드는 거는 뒤에서 또 얘기하도록 하겠습니다.

직접 만들기 애매하거나 귀찮을 경우에는 구글 검색으로 다운로드하면 됩니다. Filetype으로 원하는 포맷 찾아서 다양한 시드 파일을 다운로드할 수 있습니다.


Part 2에서는 실제로 제보했던 미디어 플레이어 KMPlayer의 취약점이 발생하는 파일 포맷에 대해 분석하는 글로 돌아오겠습니다!