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

bbot v3.0.2

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

๊ณต์œ 

bbot_banner

Python Version License PyPi Downloads Ruff Tests Codecov Discord

BEEยทbot์€ Spiderfoot์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ๋‹ค๋ชฉ์  ์Šค์บ๋„ˆ๋กœ, Recon(๋ฆฌ์ฝ˜), Bug Bounties(๋ฒ„๊ทธ ๋ฐ”์šดํ‹ฐ), ASM์„ ์ž๋™ํ™”ํ•˜๋„๋ก ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

https://github.com/blacklanternsecurity/bbot/assets/20261699/e539e89b-92ea-46fa-b893-9cde94eebf81

VivaGraphJS๋กœ ์‹œ๊ฐํ™”ํ•œ ์‹ค์‹œ๊ฐ„ BBOT ์Šค์บ”

์„ค์น˜

# stable version
pipx install bbot

# bleeding edge (dev branch)
pipx install --pip-args '\--pre' bbot

Docker๋ฅผ ํฌํ•จํ•œ ๋” ๋งŽ์€ ์„ค์น˜ ๋ฐฉ๋ฒ•์€ Getting Started๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”

2.x์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์‹œ๋‚˜์š”? BBOT 3.0์—๋Š” CLI, ํ”„๋ฆฌ์…‹, ๋ชจ๋“ˆ, ์ด๋ฒคํŠธ ๋ฐ Python API์— ๋Œ€ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ ์ „์— 2.x โ†’ 3.0 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ(์†Œ์Šค)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์†๋„ ํŒ: BBOT์˜ DNS ๋ฆฌ์กธ๋ฒ„(blastdns)๋Š” /etc/resolv.conf์˜ ๋ฆฌ์กธ๋ฒ„๋งˆ๋‹ค ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง๋˜์ง€ ์•Š์€ ๋ฆฌ์กธ๋ฒ„๋ฅผ ๋” ์ถ”๊ฐ€ํ•˜๋ฉด ์Šค์บ” ์†๋„๊ฐ€ ํฌ๊ฒŒ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒ˜ํ”Œ resolv.conf์™€ ํŒ๊ณผ ์š”๋ น์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ์ œ ๋ช…๋ น์–ด

1) ์„œ๋ธŒ๋„๋ฉ”์ธ ํŒŒ์ธ๋”

ํŒจ์‹œ๋ธŒ API ์†Œ์Šค์™€ ํƒ€๊ฒŸ๋ณ„ ์„œ๋ธŒ๋„๋ฉ”์ธ ๋ณ€ํ˜•์„ ์ด์šฉํ•œ ์žฌ๊ท€์  DNS ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…(brute-force).

# find subdomains of evilcorp.com
bbot -t evilcorp.com -p subdomain-enum

# passive sources only
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) ์›น ์ŠคํŒŒ์ด๋”

# crawl evilcorp.com, extracting emails and other goodies
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) ์ด๋ฉ”์ผ ์ˆ˜์ง‘๊ธฐ

# quick email enum with free APIs + scraping
bbot -t evilcorp.com -p email-enum

# pair with subdomain enum + web spider for maximum yield
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) ์›น ์Šค์บ๋„ˆ

# run a light web scan against www.evilcorp.com
bbot -t www.evilcorp.com -p web

# run a heavy web scan against 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) ๋ชจ๋“  ๊ฒƒ์„ ํ•œ๊บผ๋ฒˆ์—

# everything everywhere all at once
bbot -t evilcorp.com -p kitchen-sink

# roughly equivalent to:
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

์ถœ๋ ฅ ๋ชจ๋“ˆ

...๊ทธ๋ฆฌ๊ณ  ๋” ๋ณด๊ธฐ!

Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์„œ์˜ BBOT

๋™๊ธฐ(Synchronous)

from bbot.scanner import Scanner

if __name__ == "__main__":
    scan = Scanner("evilcorp.com", presets=["subdomain-enum"])
    for event in scan.start():
        print(event)

๋น„๋™๊ธฐ(Asynchronous)

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())
๋ณด๊ธฐ: ์ด ์‚ฌ์•…ํ•œ ๋””์Šค์ฝ”๋“œ ๋ด‡

/scan ๋ช…๋ น์— ์‘๋‹ตํ•˜๋Š” BBOT ๋””์Šค์ฝ”๋“œ ๋ด‡์ž…๋‹ˆ๋‹ค. ๋””์Šค์ฝ”๋“œ ์„œ๋ฒ„์—์„œ ํŽธ์•ˆํ•˜๊ฒŒ ์ธํ„ฐ๋„ท์„ ์Šค์บ”ํ•˜์„ธ์š”!

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์ด ๋ฒ”์œ„(scope)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ๋ฒ”์œ„๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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์€ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‚˜๋‚ ์ด ๋” ๊ฐ•๋ ฅํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•„์ด๋””์–ด๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด Discussions์—์„œ ์•Œ๋ ค์ฃผ์„ธ์š”. ์ง์ ‘ ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ธฐ์—ฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์—ฌ๊ธฐ์—์„œ BBOT ๋ชจ๋“ˆ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค์ • ์ง€์นจ๊ณผ ๊ฐ„๋‹จํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐฉ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ž ๋ฌธ์„œ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

BBOT์— ๊ธฐ์—ฌํ•ด ์ฃผ์‹  ๋†€๋ผ์šด ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! โค๏ธ

ํŠน๋ณ„ํžˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค:

  • BBOT์„ ๋งŒ๋“  @TheTechromancer
  • badsecrets์™€ baddns๋ฅผ ํฌํ•จํ•œ BBOT์˜ ์›น ํ•ดํ‚น ๊ธฐ๋Šฅ์— ๋งŽ์€ ์ž‘์—…์„ ๊ธฐ์—ฌํ•œ @liquidsec
  • Spiderfoot์„ ๋งŒ๋“  Steve Micallef (@smicallef)
  • Neo4j์™€ Ansible ์ „๋ฌธ ์ง€์‹์„ ์ œ๊ณตํ•œ @kerrymilan
  • ๋ฉ‹์ง„ ์ฝ”๋“œ ์ˆ˜์ง‘ ๊ณ„์—ด ๋ชจ๋“ˆ์„ ๋งŒ๋“  @domwhewell-sage
  • ์ฒ ์ €ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ @aconite33์™€ @amiremami
  • bbot Pypi ์ €์žฅ์†Œ์˜ ์†Œ์œ ๊ถŒ์„ ์–‘๋„ํ•ด ์ฃผ์‹  Aleksei Kornev (@alekseiko) <3

์นดํ…Œ๊ณ ๋ฆฌ