์—…๋ฐ์ดํŠธ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
New releaseJul 21, 2026

bbot v3.0.1

ํ•ด์ปค๋ฅผ ์œ„ํ•œ ์žฌ๊ท€์  ์ธํ„ฐ๋„ท ์Šค์บ๋„ˆ. ๐Ÿงก

๊ณต์œ 

bbot_banner

Python Version License PyPi Downloads Ruff Tests Codecov Discord

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% ๋” ๋งŽ์€ ์„œ๋ธŒ๋„๋ฉ”์ธ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ์ด ํด์ˆ˜๋ก ์ฐจ์ด๊ฐ€ ๋” ํฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ์ง€ ์•Œ์•„๋ณด๋ ค๋ฉด ์ž‘๋™ ๋ฐฉ์‹์„ ์ฐธ์กฐํ•˜์„ธ์š”.

subdomain-stats-ebay

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์˜ ๋‚ด๋ถ€ ์ž‘๋™ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด์„ธ์š”.

image

์ถœ๋ ฅ ๋ชจ๋“ˆ

...๊ทธ ์™ธ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ!

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 ์„œ๋ฒ„์—์„œ ํŽธ์•ˆํ•˜๊ฒŒ ์ธํ„ฐ๋„ท์„ ์Šค์บ”ํ•˜์„ธ์š”!

bbot-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

์นดํ…Œ๊ณ ๋ฆฌ