이번 주말에는 틈틈히 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개를 만들어둔 상태입니다.
이런식으로 추가 정보를 사용자에게 받아서 스캐닝을 진행할 수 있습니다. 결과가 자동으로 Faraday에 들어온다는게 장점이죠 :D
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