[Faraday#2] Dispatcher를 이용한 Scanning CI

이번 주말에는 틈틈히 Faraday 관련해서 계속 테스트해보고 있었습니다. 그 중 faraday_agent_dispatcher 라는 기능이 눈에 들어왔는데요, 이 기능은 faraday 서버에 여러 agent 붙여서 미리 지정 해둔 포맷 그리고 사용자가 전달해준 데이터 따라 스캐닝을 진행하고 결과를 faraday에 반영하는 기능입니다.

그럼 세팅부터 사용까지 알아보도록 하죠.

Installation

faraday와 sub 도구들은 모두 python 기반이라 pip로 설치가 가능합니다.

pip3 install faraday_agent_dispatcher

Usage

Usage: faraday-dispatcher [OPTIONS] COMMAND [ARGS]...
Options:
  -v, --version  Show the version and exit.
  -h, --help     Show this message and exit.
Commands:
  config-wizard  faraday-dispatcher config_wizard
  run            faraday-dispatcher run

Initialize

faraday_agent_dispatcher 를 설치하게 되면 시스템에 faraday-dispatcher 라는 명령이 생깁니다. 이를 통해서 스캔 환경을 미리 세팅하고 agent를 구동할 수 있습니다.

먼저 config 부터 진행해보면, config-wizard 옵션을 주어 실행하면 아래와 같이 어떤 정보를 추가/수정/삭제 할지 물어봅니다.

faraday-dispatcher config-wizard
Do you want to edit the [A]gent or the [E]xecutors? Do you want to [Q]uit? (A, E, Q) [Q]:

이는 각각 크게 Agent와 Executor를 설정할 수 있게 나뉘어져 있으며 각각 의미는 아래에서 이야기드리겠습니다.

Agent

Agent는 faraday와 직접 연결될 agent를 의미합니다.

Executor

실제 스캐닝 등 작업을 진행할 명령, 도구 정도로 생각하시면 좋을 것 같습니다.

An executor is a script that prints out single-line JSON data to stdout. Remember that if you print any other data to stdout, the dispatcher will trigger an error. If you want to print debugging or logging information you should use stderr for that.

그래서 executor는 미리 지정된 Application 들, 그리고 Custom application을 등록하여 새로운 도구들도 연동하여 사용할 수 있습니다.

Official executors

  • Arachni
  • Burp
  • CrackMapExec
  • Nessus
  • Nikto
  • Nmap
  • Nuclei
  • Openvas
  • Report processor
  • Sublist3r
  • W3af
  • Wpscan
  • Zap

Development executors

  • basic_example.py
  • brainfuck.sh
  • executor_shodan.py
  • heroku_discovery_agent.py
  • prowlerSample.py
  • responder.py
  • rumble.py

Agent 실행

executor 설정을 모두 완료하면 run 옵션을 통해 agent를 실행할 수 있습니다. 이 때 token 정보가 필요한데, token 정보는 Faraday 웹에서 agent 부분(http://frozen.hahwul.com:5985/#/admin/agents) 에서 확인할 수 있습니다.

faraday-dispatcher run --token 296291

dispatcher를 실행하면 http://localhost:5985/#/admin/agents 에 agent 정보가 나타납니다.

Scanning with agent

이제 Execute를 눌러보면 아까 dispatcher config-wizard에서 만든 executor가 노출됩니다. 저는 nuclei랑 nmap 2개를 만들어둔 상태입니다.

솔직히 nuclei는 지원해서 좀 놀랬습니다.

이런식으로 추가 정보를 사용자에게 받아서 스캐닝을 진행할 수 있습니다. 결과가 자동으로 Faraday에 들어온다는게 장점이죠 :D

Executor 마다 사용자에게 요구하는 정보가 다릅니다.

실행 정보는 바로 Faraday에 위와 같이 들어오며 결과도 완료되면 포함됩니다.

dispatcher.yaml

config wizard로 설정한 정보는 ~/.faraday/config/dispatcher.yaml 경로에 yml 포맷으로 저장됩니다.

agent:
  agent_name: zap
  executors:
    Nmap:
      max_size: 65536
      params:
        HOST_TIMEOUT:
          base: integer
          mandatory: false
          type: integer
        OPTION_PN:
          base: boolean
          mandatory: false
          type: boolean
        OPTION_SC:
          base: boolean
          mandatory: false
          type: boolean
        OPTION_SV:
          base: boolean
          mandatory: false
          type: boolean
        PORT_LIST:
          base: string
          mandatory: false
          type: range
        SCRIPT_TIMEOUT:
          base: integer
          mandatory: false
          type: integer
        TARGET:
          base: string
          mandatory: true
          type: string
        TOP_PORTS:
          base: list
          mandatory: false
          type: list
      repo_executor: nmap.py
      varenvs: {}
    Nuclei:
      max_size: 65536
      params:
        NUCLEI_EXCLUDE:
          base: string
          mandatory: false
          type: string
        NUCLEI_TARGET:
          base: string
          mandatory: true
          type: string
      repo_executor: nuclei.py
      varenvs:
        NUCLEI_TEMPLATES: /home/devi/tools/nuclei-templates
server:
  api_port: '5985'
  host: localhost
  ssl: 'False'
  ssl_cert: ''
  websocket_port: '9000'
  workspaces:
  - testzzz
tokens:
  agent: HmhV0mg60qQI4BdIWS2fIaNCsea4KOQkFQvlt2VPbVKMY9pAgiICQDS6xrU3jkxg

Conclusion

Faraday가 제가 생각한거 보다 지원 범위가 넓어서, 좀 더 테스트해보고 괜찮다면 조금 적극적으로 사용해볼 예정입니다. 아마 snippet 같은 것들도 좀 만들어놔야 할 것 같으니, 가능하면 Cullinun에 위키로 추가해두려고 합니다. 추가되면 댓글 추가해둘게요 :D