
bbot v3.0.1
ํด์ปค๋ฅผ ์ํ ์ฌ๊ท์ ์ธํฐ๋ท ์ค์บ๋. ๐งก
BEEยทbot์ Spiderfoot์์ ์๊ฐ์ ๋ฐ์ ๋ค๋ชฉ์ ์ค์บ๋๋ก, Recon, ๋ฒ๊ทธ ๋ฐ์ดํฐ, ASM์ ์๋ํํ๋๋ก ์ค๊ณ๋์์ต๋๋ค!
https://github.com/blacklanternsecurity/bbot/assets/20261699/e539e89b-92ea-46fa-b893-9cde94eebf81
์ค์๊ฐ BBOT ์ค์บ - VivaGraphJS๋ก ์๊ฐํ
์ค์น
# ์์ ๋ฒ์
pipx install bbot
# ์ต์ ๊ฐ๋ฐ ๋ฒ์ (dev ๋ธ๋์น)
pipx install --pip-args '\--pre' bbot
๋ ๋ง์ ์ค์น ๋ฐฉ๋ฒ(์: Docker)์ ์์ํ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
2.x์์ ์ ๊ทธ๋ ์ด๋ํ์๋์? BBOT 3.0์ CLI, ํ๋ฆฌ์ , ๋ชจ๋, ์ด๋ฒคํธ ๋ฐ Python API์ ๋ํ ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ์ฌํญ์ ํฌํจํฉ๋๋ค. ์ ๊ทธ๋ ์ด๋ ์ ์ 2.x โ 3.0 ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋ (์์ค)๋ฅผ ํ์ธํ์ธ์.
์๋ ํ: BBOT์ DNS ๋ฆฌ์กธ๋ฒ(blastdns)๋
/etc/resolv.conf์ ์๋ ๋ฆฌ์กธ๋ฒ๋น ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์คํํฉ๋๋ค. ํํฐ๋ง๋์ง ์์ ๋ฆฌ์กธ๋ฒ๋ฅผ ๋ ์ถ๊ฐํ๋ฉด ์ค์บ ์๋๊ฐ ํฌ๊ฒ ํฅ์๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ํ resolv.conf ๋ฐ ํ๊ณผ ์๋ น์ ์ฐธ์กฐํ์ธ์.
์์ ๋ช ๋ น์ด
1) ์๋ธ๋๋ฉ์ธ ์ฐพ๊ธฐ
์๋ API ์์ค ๋ฐ ๋์๋ณ ์๋ธ๋๋ฉ์ธ ๋ณ์ด๋ฅผ ์ด์ฉํ ์ฌ๊ท์ DNS ๋ฌด์ฐจ๋ณ ๋์
# evilcorp.com์ ์๋ธ๋๋ฉ์ธ ์ฐพ๊ธฐ
bbot -t evilcorp.com -p subdomain-enum
# ์๋ ์์ค๋ง ์ฌ์ฉ
bbot -t evilcorp.com -p subdomain-enum -rf passive
subdomain-enum.yml
description: Enumerate subdomains via APIs, brute-force
flags:
# enable every module with the subdomain-enum flag
- subdomain-enum
output_modules:
# output unique subdomains to TXT file
- subdomains
config:
dns:
threads: 25
brute_threads: 1000
# put your API keys here
# modules:
# github:
# api_key: ""
# chaos:
# api_key: ""
# securitytrails:
# api_key: ""
BBOT๋ ๋ค๋ฅธ ๋๊ตฌ๋ณด๋ค ์ง์์ ์ผ๋ก 20-50% ๋ ๋ง์ ์๋ธ๋๋ฉ์ธ์ ์ฐพ์ต๋๋ค. ๋๋ฉ์ธ์ด ํด์๋ก ์ฐจ์ด๊ฐ ๋ ํฝ๋๋ค. ์ด๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ์ง ์์๋ณด๋ ค๋ฉด ์๋ ๋ฐฉ์์ ์ฐธ์กฐํ์ธ์.

2) ์น ์คํ์ด๋
# evilcorp.com์ ํฌ๋กค๋งํ์ฌ ์ด๋ฉ์ผ ๋ฑ ์์ง
bbot -t evilcorp.com -p spider
spider.yml
description: Recursive web spider
modules:
- http
blacklist:
# Prevent spider from invalidating sessions by logging out
- "RE:/.*(sign|log)[_-]?out"
config:
web:
# how many links to follow in a row
spider_distance: 2
# don't follow links whose directory depth is higher than 4
spider_depth: 4
# maximum number of links to follow per page
spider_links_per_page: 25
3) ์ด๋ฉ์ผ ์์ง๊ธฐ
# ๋ฌด๋ฃ API + ์คํฌ๋ํ์ผ๋ก ๋น ๋ฅธ ์ด๋ฉ์ผ ์์ง
bbot -t evilcorp.com -p email-enum
# ์ต๋ ์์ง๋์ ์ํด ์๋ธ๋๋ฉ์ธ ์ด๊ฑฐ + ์น ์คํ์ด๋์ ํจ๊ป ์ฌ์ฉ
bbot -t evilcorp.com -p email-enum subdomain-enum spider
email-enum.yml
description: Enumerate email addresses from APIs, web crawling, etc.
flags:
- email-enum
output_modules:
- emails
4) ์น ์ค์บ๋
# www.evilcorp.com์ ๋ํด ๊ฐ๋ฒผ์ด ์น ์ค์บ ์คํ
bbot -t www.evilcorp.com -p web
# www.evilcorp.com์ ๋ํด ๋ฌด๊ฑฐ์ด ์น ์ค์บ ์คํ
bbot -t www.evilcorp.com -p web-heavy
web.yml
description: Quick web scan
include:
- iis-shortnames
flags:
- web
web-heavy.yml
description: Aggressive web scan
include:
# include the web preset
- web
flags:
- web-heavy
5) ๋ชจ๋ ๊ฒ์ ํ ๋ฒ์
# ๋ชจ๋ ๊ฒ์ ํ ๋ฒ์
bbot -t evilcorp.com -p kitchen-sink
# ๋๋ต ๋ค์๊ณผ ๋์ผ:
bbot -t evilcorp.com -p subdomain-enum cloud-enum code-enum email-enum spider web paramminer webbrute web-screenshots
kitchen-sink.yml
description: Everything everywhere all at once
include:
- subdomain-enum
- cloud-enum
- code-enum
- email-enum
- spider
- web
- paramminer
- webbrute
- web-screenshots
- baddns-heavy
config:
modules:
dnsbrute:
recursive_mutations: true
dnscommonsrv:
recursive_mutations: true
webbrute:
avoid_wafs: False
wayback:
urls: True
parameters: True
archive: True
์๋ ๋ฐฉ์
์๋ ๊ทธ๋ํ๋ฅผ ํด๋ฆญํ์ฌ BBOT์ ๋ด๋ถ ์๋ ๋ฐฉ์์ ์ดํด๋ณด์ธ์.
์ถ๋ ฅ ๋ชจ๋
...๊ทธ ์ธ ๋ ๋ง์ ๊ธฐ๋ฅ!
BBOT๋ฅผ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ๊ธฐ
๋๊ธฐ
from bbot.scanner import Scanner
if __name__ == "__main__":
scan = Scanner("evilcorp.com", presets=["subdomain-enum"])
for event in scan.start():
print(event)
๋น๋๊ธฐ
from bbot.scanner import Scanner
async def main():
scan = Scanner("evilcorp.com", presets=["subdomain-enum"])
async for event in scan.async_start():
print(event.json())
if __name__ == "__main__":
import asyncio
asyncio.run(main())
๋ณด๊ธฐ: ์ด ์ฌ์ ํ Discord ๋ด
/scan ๋ช
๋ น์ด์ ์๋ตํ๋ BBOT Discord ๋ด์
๋๋ค. Discord ์๋ฒ์์ ํธ์ํ๊ฒ ์ธํฐ๋ท์ ์ค์บํ์ธ์!

๊ธฐ๋ฅ ๊ฐ์
- ๋ค์ค ๋์ ์ง์
- ์น ์คํฌ๋ฆฐ์ท
- ๊ณต๊ฒฉ์ ์ธ ์น ๋ชจ๋ ์ ํ๊ตฐ
- NLP ๊ธฐ๋ฐ ์๋ธ๋๋ฉ์ธ ๋ณ์ด
- Neo4j(๋ฐ ๊ธฐํ)๋ก์ ๊ธฐ๋ณธ ์ถ๋ ฅ
- Ansible์ ํตํ ์๋ ์ข ์์ฑ ์ค์น
- ์ฌ์ฉ์ ์ ์ YARA ๊ท์น์ผ๋ก ์ ์ฒด ๊ณต๊ฒฉ ํ๋ฉด ๊ฒ์
- Python API + ๊ฐ๋ฐ์ ๋ฌธ์
๋์
BBOT๋ -t๋ฅผ ํตํด ๋ฌด์ ํ์ ๋์์ ํ์ฉํฉ๋๋ค. ๋ช
๋ น์ค์ ์ง์ ์ง์ ํ๊ฑฐ๋ ํ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค(๋๋ ๋ ๋ค!):
bbot -t evilcorp.com evilcorp.org 1.2.3.0/24 -p subdomain-enum
๋์์ ๋ค์ ์ค ํ๋์ผ ์ ์์ต๋๋ค:
- DNS ์ด๋ฆ (
evilcorp.com) - IP ์ฃผ์ (
1.2.3.4) - IP ๋ฒ์ (
1.2.3.0/24) - ์ด๋ฆฐ TCP ํฌํธ (
192.168.0.1:80) - URL (
https://www.evilcorp.com) - ์ด๋ฉ์ผ ์ฃผ์ (
[email protected]) - ์กฐ์ง (
ORG:evilcorp) - ์ฌ์ฉ์ ์ด๋ฆ (
USER:bobsmith) - ํ์ผ ์์คํ
(
FILESYSTEM:/tmp/asdf) - ๋ชจ๋ฐ์ผ ์ฑ (
MOBILE_APP:https://play.google.com/store/apps/details?id=com.evilcorp.app)
์์ธํ ๋ด์ฉ์ ๋์์ ์ฐธ์กฐํ์ธ์. BBOT๊ฐ ๋ฒ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋ ค๋ฉด ๋ฒ์๋ฅผ ์ฐธ์กฐํ์ธ์.
API ํค
Amass๋ Subfinder์ ์ ์ฌํ๊ฒ, BBOT๋ SecurityTrails ๋ฑ ๋ค์ํ ํ์ฌ ์๋น์ค์ API ํค๋ฅผ ์ง์ํฉ๋๋ค.
ํ์ค ๋ฐฉ๋ฒ์ ~/.config/bbot/secrets.yml ์ API ํค๋ฅผ ์
๋ ฅํ๋ ๊ฒ์
๋๋ค. ์ฌ๋ฌ API ํค๊ฐ ํ์ฉ๋ฉ๋๋ค:
modules:
shodan_dns:
api_key: 4f41243847da693a4f356c0486114bc6
c99:
# multiple API keys
api_key:
- 21a270d5f59c9b05813a72bb41707266
- ea8f243d9885cf8ce9876a580224fd3c
- 5bc6ed268ab6488270e496d3183a1a27
virustotal:
api_key: dd5f0eee2e4a99b71a939bded450b246
securitytrails:
api_key: d9a05c3fd9a514497713c54b4455d0b0
์ํ๋ค๋ฉด ๋ช ๋ น์ค์์๋ ์ง์ ํ ์ ์์ต๋๋ค:
bbot -c modules.virustotal.api_key=dd5f0eee2e4a99b71a939bded450b246
์์ธํ ๋ด์ฉ์ ์ค์ ์ ์ฐธ์กฐํ์ธ์.
๋ชจ๋, ํ๋๊ทธ ๋ฑ์ ์ ์ฒด ๋ชฉ๋ก
- ๋ชจ๋ ์ ์ฒด ๋ชฉ๋ก
- ํ๋๊ทธ ์ ์ฒด ๋ชฉ๋ก
- ํ๋ฆฌ์
์ ์ฒด ๋ชฉ๋ก
- ๊ธ๋ก๋ฒ ์ค์ ์ต์ ์ ์ฒด ๋ชฉ๋ก
- ๋ชจ๋ ์ค์ ์ต์ ์ ์ฒด ๋ชฉ๋ก
๋ฌธ์
- ์ฌ์ฉ์ ๋งค๋ด์ผ
- ๊ธฐ์ด
- ์ค์บ
- ๋ชจ๋
- ๋ง์ด๊ทธ๋ ์ด์
- ๊ธฐํ
- ๊ฐ๋ฐ์ ๋งค๋ด์ผ
๊ธฐ์ฌ
์ต๊ณ ์ BBOT ๋ชจ๋ ์ค ์ผ๋ถ๋ ์ปค๋ฎค๋ํฐ์์ ์์ฑํ์ต๋๋ค. BBOT๋ ์ง์์ ์ผ๋ก ๊ฐ์ ๋๊ณ ์์ผ๋ฉฐ, ๋งค์ผ ๋ ๊ฐ๋ ฅํด์ง๊ณ ์์ต๋๋ค!
๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค. ์ฝ๋๋ฟ๋ง ์๋๋ผ ์์ด๋์ด๋ ํ์ํฉ๋๋ค! ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ์์ด๋์ด๊ฐ ์๋ค๋ฉด ํ ๋ก ์์ ์๋ ค์ฃผ์ธ์. ์ง์ ์ฐธ์ฌํ๊ณ ์ถ๋ค๋ฉด ๊ธฐ์ฌ๋ฅผ ์ฐธ์กฐํ์ธ์. ์ค์ ๋ฐฉ๋ฒ๊ณผ BBOT ๋ชจ๋ ์์ฑ์ ๋ํ ๊ฐ๋จํ ํํ ๋ฆฌ์ผ์ด ์์ต๋๋ค. ๋ํ ๊ด๋ฒ์ํ ๊ฐ๋ฐ์ ๋ฌธ์๋ ์ ๊ณต๋ฉ๋๋ค.
BBOT์ ๊ธฐ์ฌํด ์ฃผ์ ์ด ๋๋ผ์ด ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค! โค๏ธ
ํน๋ณํ ๊ฐ์ฌ๋๋ฆฝ๋๋ค:
- @TheTechromancer - BBOT ์ฐฝ์์
- @liquidsec - badsecrets ๋ฐ baddns๋ฅผ ํฌํจํ BBOT์ ์น ํดํน ๊ธฐ๋ฅ์ ๋ํ ๊ด๋ฒ์ํ ์์
- Steve Micallef (@smicallef) - Spiderfoot ์ฐฝ์์
- @kerrymilan - Neo4j ๋ฐ Ansible ์ ๋ฌธ์ฑ
- @domwhewell-sage - ๊ฐ๋ ฅํ ์ฝ๋ ์ฝํ ๋ชจ๋ ์ ํ๊ตฐ
- @aconite33 ๋ฐ @amiremami - ์ฒ ์ ํ ํ ์คํธ
- Aleksei Kornev (@alekseiko) - bbot Pypi ์ ์ฅ์ ์์ ๊ถ์ ๋ถ์ฌํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค <3

