[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