[HACKING] Bug Bounty를 위한 WASE(Web Audit Search Engine) 만들기 [1] - Elastic search와 ruby-rails

요즘들어 버그바운티에 대한 생각이 조금 깊어졌습니다. 일을 하는 것 이외에도 무언가 가치를 만들 수 있겠다라는 생각 때문이죠. (그냥 돈을 더 벌고싶다고 그래 =_=)

그러나 안타깝게도 시간은 항상 제한적이고, 저의 시간은 매우 모자랍니다. 그래서.. VAHA(http://vaha.hahwul.com )에 이어 버그바운티를 도와줄 수 있는 도구를 구축해보려 합니다.

핵심 로직이나 아이디어는 공개하지 않을 것 같지만 그래도 전반적인 내용은 공유드리면서, 비슷한 고민을 하시는 분들에게 조금이나마 도움이 되길 바라는 마음입니다.

그럼 출발해보죠.

Background

우선 취약점 스캐너나 자동으로 찾아주는 방법에 대해서는 안하기로 마음먹었습니다. 아무리 그래도 장인 정신.. 아니 실제도로 툴보단 사람입니다. 툴로 발견할 수 있는 사항이라면 이미 다 보고되었겠죠. 지금까지 그래왔듯이 개인의 능력으로 승부를 보고, 대신 이를 보조해주는 무언가를 만들려고 합니다. 우선은 어떤 것들이 필요할까 정리해보았습니다.

  • Burp suite의 로그는 종료로 휘발되거나, 저장한다 한들 잘 활용하지 않는다 (Burp에 많이 쌓인거 안좋아함)
  • 새로운 우회패턴에 대해 이전에 테스트한 페이지에 재 테스트를 하고싶다
  • 어떤 것이 나의 타겟인지 식별해야한다. (Burp 많이 쌓이면 아주 가독성이 안좋답니다)

이정도가 있을 것 같네요. 물론 더 있습니다만 노코멘트

이런 고민을 하다보니.. 예전에 개인적으로 해보고싶었던 PJT 와 연관되어 진행해보려고 합니다. 바로 Burp와 Elasticsearch(이하 ES)의 연동, 활용 부분인데요. 나름대로 쓸 수 있을 것 같아서 이런 구조로 그려보려 합니다.

구성

우선은 ES와 Burp의 연동, 그리고 rails를 통한 뷰어 환경 구축이 목표입니다. 키바나도 있고 ELK stack 써도 되는데 왜 rails 냐고 하면.. 움 그냥 제가 ruby 가 좋아서 그렇습니다.

직접 구현하고, 수정하고 필요한 부분은 만들어 쓰는게 더 좋을 것이란 판단입니다.

이런 형태의 그림이 되겠군요 :)

Elasticsearch 란?

사실 개념적인 부분만 잡고있던 ES입니다. 이참에 조금이라도 정리해보면 좋을까 내용 넣어보았습니다.

우선 ES는 분산형 RESTful 검색 및 분석 엔진입니다. 많은 양의 데이터를 가공하고 분석하여 좀 더 유의미한 결과를 뽑아내는게 목표이지요. 시각화도 굉장히 중요한 부분이구요.

ES를 알아가기 위해선 몇가지 개념을 익혀두는게 좋습니다. RDMS와 비교해서 보면 편안합니다.

index => database

type => table

document => row

field => column

Mapping => Schema

아래부터 올라가면서 보면 좋을 것 같은데,

Mapping은 RDB에선 Schema와 비슷한 개념입니다. 위의 인덱스, 도큐먼트 등의 규칙이 정의된다고 보시면 됩니다.

field는 column으로 보시면 좋습니다. ES 내에서는 JSON 포맷 내 각 프로퍼티 정도입니다. document는 row이며 filed의 묶음 정도로 보면 좋습니다. type은 rdb의 table의 대칭되며 field와 document를 포함합니다.

마지막으로 index 는 db라고 보시면 됩니다. 가장 큰 단위이지요.

Elasticsearch 설치하기

https://www.elastic.co/downloads/elasticsearch 에서 직접 다운로드 받아서 설치해주세요. 6.2.2(현재 최신) 기준으론 아래와 같습니다.

#> wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.2.deb #> dpkg -i elasticsearch-6.2.2.deb

elasticsearch rails 설치

rails랑 쉽게 붙이기 위해 elasticserach gem을 설치해줍니다.

#> gem install elasticsearch

우선 테스트를 해보면..

require 'elasticsearch'

def test()
client = Elasticsearch::Client.new log: true
client.cluster.health
client.search q: 'hwul'
end

test()

잘되네요.

이제 rails 관련 gem으로 올려봅시다.

#> gem install elasticsearch-rails #> gem install elasticsearch-model

elasticsearch-rails는 ror 문법으로 키바나 처럼 쉽게 웹 기반의 엔진 구축이 가능합니다.

require 'elasticsearch/model'

class Article < ActiveRecord::Base
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks
end

Article.import
@articles = Article.search('foobar').records

위에는 샘플코드인데, MVC 작성하는데 크게 복잡하진 않습니다. 내용은 아래 git 주소 참고해주세요.

https://github.com/elastic/elasticsearch-rails

이런식으로 제공해주는 template 적용도 가능합니다.

#> rails new searchapp –skip –skip-bundle –template https://raw.github.com/elastic/elasticsearch-rails/master/elasticsearch-rails/lib/rails/templates/01-basic.rb

#> rails new searchapp –skip –skip-bundle –template https://raw.github.com/elastic/elasticsearch-rails/master/elasticsearch-rails/lib/rails/templates/02-pretty.rb

다만 여기서 제공해주는 template 사용 시 하나 문제가 발생하는데요.

apply  https://raw.github.com/elastic/elasticsearch-rails/master/elasticsearch-rails/lib/rails/templates/01-basic.rb
https://raw.github.com/elastic/elasticsearch-rails/master/elasticsearch-rails/lib/rails/templates/01-basic.rb:39:in `apply': uninitialized constant #<Class:#<Rails::Generators::AppGenerator:0x00555fe6349c70>>::JSON (NameError)

요런 문제가 발생하는데.. 저만 나타나는 문제가 아니더군요. 설마 또 버전 관련 문제인지.. 아무튼 아래 이슈 참고해주세요.

https://github.com/elastic/elasticsearch-rails/issues/313

Reference

https://www.elastic.co/kr/products/elasticsearch https://github.com/elastic/elasticsearch-rails https://github.com/platanus/elastic-rails