moriarty-project 0.1.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- moriarty/__init__.py +5 -0
- moriarty/adapters/__init__.py +0 -0
- moriarty/agent/__init__.py +0 -0
- moriarty/assets/modules/.gitkeep +0 -0
- moriarty/assets/modules/asia/douban.yaml +19 -0
- moriarty/assets/modules/asia/kakao.yaml +19 -0
- moriarty/assets/modules/asia/line.yaml +19 -0
- moriarty/assets/modules/asia/mixi.yaml +19 -0
- moriarty/assets/modules/asia/naver.yaml +19 -0
- moriarty/assets/modules/asia/qq.yaml +19 -0
- moriarty/assets/modules/asia/vk.yaml +19 -0
- moriarty/assets/modules/asia/wechat.yaml +19 -0
- moriarty/assets/modules/asia/weibo.yaml +19 -0
- moriarty/assets/modules/asia/xiaohongshu.yaml +19 -0
- moriarty/assets/modules/behance.yaml +47 -0
- moriarty/assets/modules/business/crunchbase.yaml +27 -0
- moriarty/assets/modules/business/fiverr.yaml +32 -0
- moriarty/assets/modules/business/freelancer.yaml +27 -0
- moriarty/assets/modules/business/glassdoor.yaml +27 -0
- moriarty/assets/modules/business/guru.yaml +26 -0
- moriarty/assets/modules/business/indeed.yaml +25 -0
- moriarty/assets/modules/business/monster.yaml +25 -0
- moriarty/assets/modules/business/peopleperhour.yaml +26 -0
- moriarty/assets/modules/business/toptal.yaml +28 -0
- moriarty/assets/modules/business/upwork.yaml +27 -0
- moriarty/assets/modules/business/ziprecruiter.yaml +25 -0
- moriarty/assets/modules/content/buymeacoffee.yaml +27 -0
- moriarty/assets/modules/content/gumroad.yaml +27 -0
- moriarty/assets/modules/content/ko-fi.yaml +32 -0
- moriarty/assets/modules/content/onlyfans.yaml +27 -0
- moriarty/assets/modules/content/patreon.yaml +33 -0
- moriarty/assets/modules/content/substack.yaml +32 -0
- moriarty/assets/modules/creative/500px.yaml +31 -0
- moriarty/assets/modules/creative/artstation.yaml +33 -0
- moriarty/assets/modules/creative/deviantart.yaml +32 -0
- moriarty/assets/modules/creative/flickr.yaml +31 -0
- moriarty/assets/modules/creative/pexels.yaml +26 -0
- moriarty/assets/modules/creative/unsplash.yaml +26 -0
- moriarty/assets/modules/creative/vimeo.yaml +31 -0
- moriarty/assets/modules/crypto/binance.yaml +27 -0
- moriarty/assets/modules/crypto/bitcointalk.yaml +33 -0
- moriarty/assets/modules/crypto/coinbase.yaml +26 -0
- moriarty/assets/modules/crypto/etherscan.yaml +32 -0
- moriarty/assets/modules/crypto/foundation.yaml +28 -0
- moriarty/assets/modules/crypto/kraken.yaml +27 -0
- moriarty/assets/modules/crypto/mirror.yaml +27 -0
- moriarty/assets/modules/crypto/niftygateway.yaml +26 -0
- moriarty/assets/modules/crypto/opensea.yaml +32 -0
- moriarty/assets/modules/crypto/rarible.yaml +27 -0
- moriarty/assets/modules/crypto/superrare.yaml +29 -0
- moriarty/assets/modules/dating/bumble.yaml +25 -0
- moriarty/assets/modules/dating/grindr.yaml +27 -0
- moriarty/assets/modules/dating/happn.yaml +25 -0
- moriarty/assets/modules/dating/her.yaml +27 -0
- moriarty/assets/modules/dating/hinge.yaml +25 -0
- moriarty/assets/modules/dating/match.yaml +25 -0
- moriarty/assets/modules/dating/meetme.yaml +27 -0
- moriarty/assets/modules/dating/okcupid.yaml +25 -0
- moriarty/assets/modules/dating/pof.yaml +25 -0
- moriarty/assets/modules/dating/tinder.yaml +25 -0
- moriarty/assets/modules/dating-nsfw/adultfriendfinder.yaml +28 -0
- moriarty/assets/modules/dating-nsfw/ashley-madison.yaml +26 -0
- moriarty/assets/modules/design/adobe-portfolio.yaml +27 -0
- moriarty/assets/modules/design/carbonmade.yaml +27 -0
- moriarty/assets/modules/design/cgsociety.yaml +27 -0
- moriarty/assets/modules/design/coroflot.yaml +27 -0
- moriarty/assets/modules/design/figma.yaml +27 -0
- moriarty/assets/modules/design/sketch.yaml +26 -0
- moriarty/assets/modules/dev/bitbucket.yaml +35 -0
- moriarty/assets/modules/dev/codeforces.yaml +32 -0
- moriarty/assets/modules/dev/codepen.yaml +34 -0
- moriarty/assets/modules/dev/hackerone.yaml +32 -0
- moriarty/assets/modules/dev/hackthebox.yaml +27 -0
- moriarty/assets/modules/dev/huggingface.yaml +27 -0
- moriarty/assets/modules/dev/kaggle.yaml +32 -0
- moriarty/assets/modules/dev/leetcode.yaml +32 -0
- moriarty/assets/modules/dev/replit.yaml +31 -0
- moriarty/assets/modules/dribbble.yaml +53 -0
- moriarty/assets/modules/ecommerce/etsy.yaml +32 -0
- moriarty/assets/modules/education/duolingo.yaml +32 -0
- moriarty/assets/modules/education/edx.yaml +26 -0
- moriarty/assets/modules/education/khanacademy.yaml +26 -0
- moriarty/assets/modules/education/lynda.yaml +27 -0
- moriarty/assets/modules/education/memrise.yaml +27 -0
- moriarty/assets/modules/education/pluralsight.yaml +27 -0
- moriarty/assets/modules/education/skillshare.yaml +27 -0
- moriarty/assets/modules/education/udacity.yaml +27 -0
- moriarty/assets/modules/email/github_email.yaml +40 -0
- moriarty/assets/modules/email/gravatar.yaml +23 -0
- moriarty/assets/modules/europe/badoo.yaml +19 -0
- moriarty/assets/modules/europe/lovoo.yaml +19 -0
- moriarty/assets/modules/europe/myspace.yaml +19 -0
- moriarty/assets/modules/europe/netlog.yaml +19 -0
- moriarty/assets/modules/europe/ok.yaml +19 -0
- moriarty/assets/modules/europe/skyrock.yaml +19 -0
- moriarty/assets/modules/europe/studivz.yaml +19 -0
- moriarty/assets/modules/europe/tuenti.yaml +19 -0
- moriarty/assets/modules/europe/viadeo.yaml +19 -0
- moriarty/assets/modules/europe/xing.yaml +19 -0
- moriarty/assets/modules/fitness/fitbit.yaml +27 -0
- moriarty/assets/modules/fitness/garmin.yaml +27 -0
- moriarty/assets/modules/fitness/myfitnesspal.yaml +27 -0
- moriarty/assets/modules/fitness/strava.yaml +33 -0
- moriarty/assets/modules/fitness/zwift.yaml +28 -0
- moriarty/assets/modules/food/allrecipes.yaml +27 -0
- moriarty/assets/modules/food/tasty.yaml +27 -0
- moriarty/assets/modules/food/yelp.yaml +32 -0
- moriarty/assets/modules/food/zomato.yaml +28 -0
- moriarty/assets/modules/forums/4chan.yaml +26 -0
- moriarty/assets/modules/forums/8kun.yaml +26 -0
- moriarty/assets/modules/forums/9gag.yaml +26 -0
- moriarty/assets/modules/forums/discourse.yaml +26 -0
- moriarty/assets/modules/forums/disqus.yaml +31 -0
- moriarty/assets/modules/forums/hackernews.yaml +32 -0
- moriarty/assets/modules/forums/launchpad.yaml +27 -0
- moriarty/assets/modules/forums/phpbb.yaml +25 -0
- moriarty/assets/modules/forums/quora.yaml +32 -0
- moriarty/assets/modules/forums/serverfault.yaml +27 -0
- moriarty/assets/modules/forums/slashdot.yaml +28 -0
- moriarty/assets/modules/forums/stackexchange.yaml +32 -0
- moriarty/assets/modules/forums/superuser.yaml +27 -0
- moriarty/assets/modules/forums/vbulletin.yaml +25 -0
- moriarty/assets/modules/forums/xenforo.yaml +25 -0
- moriarty/assets/modules/forums-nsfw/kiwifarms.yaml +25 -0
- moriarty/assets/modules/forums-nsfw/lolcow.yaml +26 -0
- moriarty/assets/modules/gaming/apextracker.yaml +27 -0
- moriarty/assets/modules/gaming/battlenet.yaml +26 -0
- moriarty/assets/modules/gaming/chess.yaml +30 -0
- moriarty/assets/modules/gaming/discord-public.yaml +27 -0
- moriarty/assets/modules/gaming/dotabuff.yaml +32 -0
- moriarty/assets/modules/gaming/epicgames.yaml +25 -0
- moriarty/assets/modules/gaming/faceit.yaml +33 -0
- moriarty/assets/modules/gaming/fortnitetracker.yaml +32 -0
- moriarty/assets/modules/gaming/gog.yaml +26 -0
- moriarty/assets/modules/gaming/itch.yaml +32 -0
- moriarty/assets/modules/gaming/kongregate.yaml +25 -0
- moriarty/assets/modules/gaming/minecraft.yaml +31 -0
- moriarty/assets/modules/gaming/opgg.yaml +32 -0
- moriarty/assets/modules/gaming/origin.yaml +26 -0
- moriarty/assets/modules/gaming/playstation.yaml +30 -0
- moriarty/assets/modules/gaming/roblox.yaml +31 -0
- moriarty/assets/modules/gaming/xbox.yaml +25 -0
- moriarty/assets/modules/github.yaml +68 -0
- moriarty/assets/modules/gitlab.yaml +60 -0
- moriarty/assets/modules/instagram.yaml +48 -0
- moriarty/assets/modules/latam/fotolog.yaml +27 -0
- moriarty/assets/modules/latam/orkut.yaml +26 -0
- moriarty/assets/modules/latam/taringa.yaml +27 -0
- moriarty/assets/modules/learning/coursera.yaml +26 -0
- moriarty/assets/modules/learning/udemy.yaml +26 -0
- moriarty/assets/modules/linkedin.yaml +40 -0
- moriarty/assets/modules/marketplaces/depop.yaml +28 -0
- moriarty/assets/modules/marketplaces/ebay.yaml +32 -0
- moriarty/assets/modules/marketplaces/grailed.yaml +27 -0
- moriarty/assets/modules/marketplaces/mercari.yaml +26 -0
- moriarty/assets/modules/marketplaces/poshmark.yaml +27 -0
- moriarty/assets/modules/marketplaces/reverb.yaml +27 -0
- moriarty/assets/modules/marketplaces/vinted.yaml +28 -0
- moriarty/assets/modules/medium.yaml +44 -0
- moriarty/assets/modules/music/audiomack.yaml +26 -0
- moriarty/assets/modules/music/bandcamp.yaml +30 -0
- moriarty/assets/modules/music/beatport.yaml +28 -0
- moriarty/assets/modules/music/deezer.yaml +26 -0
- moriarty/assets/modules/music/discogs.yaml +32 -0
- moriarty/assets/modules/music/genius.yaml +26 -0
- moriarty/assets/modules/music/lastfm.yaml +30 -0
- moriarty/assets/modules/music/mixcloud.yaml +26 -0
- moriarty/assets/modules/music/reverbnation.yaml +31 -0
- moriarty/assets/modules/music/soundcloud.yaml +31 -0
- moriarty/assets/modules/music/spotify.yaml +26 -0
- moriarty/assets/modules/music/tidal.yaml +26 -0
- moriarty/assets/modules/nsfw/adultwork.yaml +27 -0
- moriarty/assets/modules/nsfw/bongacams.yaml +28 -0
- moriarty/assets/modules/nsfw/cam4.yaml +28 -0
- moriarty/assets/modules/nsfw/chaturbate.yaml +28 -0
- moriarty/assets/modules/nsfw/clips4sale.yaml +27 -0
- moriarty/assets/modules/nsfw/extralunchmoney.yaml +27 -0
- moriarty/assets/modules/nsfw/fansly.yaml +28 -0
- moriarty/assets/modules/nsfw/fetlife.yaml +28 -0
- moriarty/assets/modules/nsfw/iwantclips.yaml +27 -0
- moriarty/assets/modules/nsfw/justforfans.yaml +28 -0
- moriarty/assets/modules/nsfw/loyalfans.yaml +28 -0
- moriarty/assets/modules/nsfw/manyvids.yaml +27 -0
- moriarty/assets/modules/nsfw/myfreecams.yaml +28 -0
- moriarty/assets/modules/nsfw/niteflirt.yaml +26 -0
- moriarty/assets/modules/nsfw/pornhub.yaml +32 -0
- moriarty/assets/modules/nsfw/redtube.yaml +27 -0
- moriarty/assets/modules/nsfw/stripchat.yaml +28 -0
- moriarty/assets/modules/nsfw/xhamster.yaml +27 -0
- moriarty/assets/modules/nsfw/xvideos.yaml +27 -0
- moriarty/assets/modules/nsfw/youporn.yaml +27 -0
- moriarty/assets/modules/photography/eyeem.yaml +25 -0
- moriarty/assets/modules/photography/fotki.yaml +25 -0
- moriarty/assets/modules/photography/photobucket.yaml +26 -0
- moriarty/assets/modules/photography/smugmug.yaml +25 -0
- moriarty/assets/modules/photography/vsco.yaml +27 -0
- moriarty/assets/modules/pinterest.yaml +40 -0
- moriarty/assets/modules/podcasts/anchor.yaml +26 -0
- moriarty/assets/modules/podcasts/castbox.yaml +26 -0
- moriarty/assets/modules/podcasts/podbean.yaml +26 -0
- moriarty/assets/modules/professional/about.yaml +31 -0
- moriarty/assets/modules/professional/academia.yaml +27 -0
- moriarty/assets/modules/professional/angellist.yaml +27 -0
- moriarty/assets/modules/professional/calendly.yaml +26 -0
- moriarty/assets/modules/professional/issuu.yaml +27 -0
- moriarty/assets/modules/professional/mendeley.yaml +27 -0
- moriarty/assets/modules/professional/notion.yaml +27 -0
- moriarty/assets/modules/professional/orcid.yaml +27 -0
- moriarty/assets/modules/professional/producthunt.yaml +31 -0
- moriarty/assets/modules/professional/researchgate.yaml +32 -0
- moriarty/assets/modules/professional/scribd.yaml +27 -0
- moriarty/assets/modules/professional/slideshare.yaml +31 -0
- moriarty/assets/modules/professional/trello.yaml +26 -0
- moriarty/assets/modules/professional/typeform.yaml +27 -0
- moriarty/assets/modules/reddit.yaml +46 -0
- moriarty/assets/modules/regional/amino.yaml +27 -0
- moriarty/assets/modules/regional/ask-fm.yaml +32 -0
- moriarty/assets/modules/regional/babycenter.yaml +26 -0
- moriarty/assets/modules/regional/cafemom.yaml +27 -0
- moriarty/assets/modules/regional/care2.yaml +27 -0
- moriarty/assets/modules/regional/diaspora.yaml +26 -0
- moriarty/assets/modules/regional/ello.yaml +27 -0
- moriarty/assets/modules/regional/gaia.yaml +27 -0
- moriarty/assets/modules/regional/habbo.yaml +27 -0
- moriarty/assets/modules/regional/imvu.yaml +27 -0
- moriarty/assets/modules/regional/lemmy.yaml +27 -0
- moriarty/assets/modules/regional/peertube.yaml +26 -0
- moriarty/assets/modules/regional/pixelfed.yaml +27 -0
- moriarty/assets/modules/regional/plurk.yaml +26 -0
- moriarty/assets/modules/regional/recroom.yaml +27 -0
- moriarty/assets/modules/regional/secondlife.yaml +26 -0
- moriarty/assets/modules/regional/vine-archive.yaml +27 -0
- moriarty/assets/modules/regional/vrchat.yaml +27 -0
- moriarty/assets/modules/regional/weheartit.yaml +27 -0
- moriarty/assets/modules/social/anilist.yaml +27 -0
- moriarty/assets/modules/social/beacons.yaml +26 -0
- moriarty/assets/modules/social/blogger.yaml +27 -0
- moriarty/assets/modules/social/crunchyroll.yaml +27 -0
- moriarty/assets/modules/social/discord.yaml +27 -0
- moriarty/assets/modules/social/dreamwidth.yaml +26 -0
- moriarty/assets/modules/social/facebook.yaml +34 -0
- moriarty/assets/modules/social/goodreads.yaml +32 -0
- moriarty/assets/modules/social/imdb.yaml +27 -0
- moriarty/assets/modules/social/kitsu.yaml +27 -0
- moriarty/assets/modules/social/letterboxd.yaml +32 -0
- moriarty/assets/modules/social/linktree.yaml +26 -0
- moriarty/assets/modules/social/livejournal.yaml +27 -0
- moriarty/assets/modules/social/mastodon.yaml +30 -0
- moriarty/assets/modules/social/minds.yaml +25 -0
- moriarty/assets/modules/social/myanimelist.yaml +32 -0
- moriarty/assets/modules/social/ravelry.yaml +27 -0
- moriarty/assets/modules/social/snapchat.yaml +25 -0
- moriarty/assets/modules/social/telegram.yaml +35 -0
- moriarty/assets/modules/social/tiktok.yaml +35 -0
- moriarty/assets/modules/social/trakt.yaml +28 -0
- moriarty/assets/modules/social/wattpad.yaml +32 -0
- moriarty/assets/modules/social/wordpress-com.yaml +26 -0
- moriarty/assets/modules/sports/espn.yaml +26 -0
- moriarty/assets/modules/sports/untappd.yaml +32 -0
- moriarty/assets/modules/stackoverflow.yaml +47 -0
- moriarty/assets/modules/steam.yaml +47 -0
- moriarty/assets/modules/streaming/caffeine.yaml +25 -0
- moriarty/assets/modules/streaming/dlive.yaml +27 -0
- moriarty/assets/modules/streaming/trovo.yaml +25 -0
- moriarty/assets/modules/travel/airbnb.yaml +26 -0
- moriarty/assets/modules/travel/booking.yaml +26 -0
- moriarty/assets/modules/travel/couchsurfing.yaml +27 -0
- moriarty/assets/modules/travel/tripadvisor.yaml +32 -0
- moriarty/assets/modules/tumblr.yaml +40 -0
- moriarty/assets/modules/twitch.yaml +48 -0
- moriarty/assets/modules/twitter.yaml +39 -0
- moriarty/assets/modules/youtube.yaml +42 -0
- moriarty/assets/templates/cves/CVE-2017-5638.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2018-7600.yaml +30 -0
- moriarty/assets/templates/cves/CVE-2019-11510.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2019-19781.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2020-14882.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2020-14883.yaml +29 -0
- moriarty/assets/templates/cves/CVE-2020-3452.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2020-5902.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2021-21972.yaml +31 -0
- moriarty/assets/templates/cves/CVE-2021-21985.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2021-26084.yaml +30 -0
- moriarty/assets/templates/cves/CVE-2021-41773.yaml +25 -0
- moriarty/assets/templates/cves/CVE-2021-42013.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2021-44228.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2022-0185.yaml +21 -0
- moriarty/assets/templates/cves/CVE-2022-1388.yaml +36 -0
- moriarty/assets/templates/cves/CVE-2022-22954.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2022-22965.yaml +31 -0
- moriarty/assets/templates/cves/CVE-2022-26134.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-22515.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-22527.yaml +29 -0
- moriarty/assets/templates/cves/CVE-2023-23752.yaml +33 -0
- moriarty/assets/templates/cves/CVE-2023-27350.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-2868.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-34362.yaml +27 -0
- moriarty/assets/templates/cves/CVE-2023-3519.yaml +28 -0
- moriarty/assets/templates/cves/CVE-2023-4966.yaml +27 -0
- moriarty/assets/templates/default-logins/admin-weak.yaml +40 -0
- moriarty/assets/templates/default-logins/wordpress-default.yaml +38 -0
- moriarty/assets/templates/exposures/aws-credentials.yaml +35 -0
- moriarty/assets/templates/exposures/backup-files.yaml +36 -0
- moriarty/assets/templates/exposures/database-files.yaml +34 -0
- moriarty/assets/templates/exposures/docker-exposed.yaml +31 -0
- moriarty/assets/templates/exposures/env-exposed.yaml +41 -0
- moriarty/assets/templates/exposures/git-exposed.yaml +41 -0
- moriarty/assets/templates/exposures/phpinfo.yaml +36 -0
- moriarty/assets/templates/exposures/svn-exposed.yaml +28 -0
- moriarty/assets/templates/fuzzing/api-endpoints.yaml +39 -0
- moriarty/assets/templates/fuzzing/common-files.yaml +37 -0
- moriarty/assets/templates/fuzzing/open-redirect-fuzz.yaml +35 -0
- moriarty/assets/templates/fuzzing/xss-search-fuzz.yaml +29 -0
- moriarty/assets/templates/git-config.yaml +18 -0
- moriarty/assets/templates/misconfigurations/cors-misconfiguration.yaml +30 -0
- moriarty/assets/templates/misconfigurations/debug-enabled.yaml +29 -0
- moriarty/assets/templates/misconfigurations/directory-listing.yaml +33 -0
- moriarty/assets/templates/misconfigurations/jwt-none-algo.yaml +30 -0
- moriarty/assets/templates/misconfigurations/ssl-tls-weak.yaml +23 -0
- moriarty/assets/templates/vulnerabilities/lfi-basic.yaml +31 -0
- moriarty/assets/templates/vulnerabilities/open-redirect.yaml +31 -0
- moriarty/assets/templates/vulnerabilities/rce-basic.yaml +34 -0
- moriarty/assets/templates/vulnerabilities/sqli-error.yaml +39 -0
- moriarty/assets/templates/vulnerabilities/ssrf-basic.yaml +31 -0
- moriarty/assets/templates/vulnerabilities/xss-reflected.yaml +38 -0
- moriarty/assets/templates/vulnerabilities/xxe-basic.yaml +30 -0
- moriarty/assets/wordlists/subdomains-1000.txt +1063 -0
- moriarty/cli/__init__.py +3 -0
- moriarty/cli/app.py +120 -0
- moriarty/cli/async_utils.py +19 -0
- moriarty/cli/dns.py +83 -0
- moriarty/cli/domain_cmd.py +572 -0
- moriarty/cli/email.py +383 -0
- moriarty/cli/email_investigate.py +224 -0
- moriarty/cli/intelligence.py +329 -0
- moriarty/cli/output.py +62 -0
- moriarty/cli/rdap.py +94 -0
- moriarty/cli/state.py +38 -0
- moriarty/cli/tls.py +91 -0
- moriarty/cli/user.py +227 -0
- moriarty/core/cache_backend.py +223 -0
- moriarty/core/config_manager.py +303 -0
- moriarty/correlator/__init__.py +0 -0
- moriarty/data/__init__.py +81 -0
- moriarty/data/ioc/__init__.py +142 -0
- moriarty/data/ioc/matcher.py +254 -0
- moriarty/data/ioc/types.py +267 -0
- moriarty/data/local_intelligence.py +507 -0
- moriarty/data/signature_loaders/__init__.py +103 -0
- moriarty/data/signature_loaders/base.py +54 -0
- moriarty/data/signature_loaders/ioc_feed.py +356 -0
- moriarty/data/signature_loaders/wappalyzer.py +112 -0
- moriarty/dsl/__init__.py +0 -0
- moriarty/dsl/loader.py +99 -0
- moriarty/dsl/schema.py +47 -0
- moriarty/export/__init__.py +0 -0
- moriarty/intelligence/__init__.py +27 -0
- moriarty/intelligence/__main__.py +150 -0
- moriarty/intelligence/config.py +395 -0
- moriarty/intelligence/ioc.py +267 -0
- moriarty/intelligence/signatures.py +550 -0
- moriarty/intelligence/storage.py +501 -0
- moriarty/interop/__init__.py +0 -0
- moriarty/logging/__init__.py +0 -0
- moriarty/logging/config.py +47 -0
- moriarty/models/__init__.py +16 -0
- moriarty/models/assertion.py +24 -0
- moriarty/models/entity.py +22 -0
- moriarty/models/evidence.py +37 -0
- moriarty/models/relation.py +24 -0
- moriarty/models/types.py +28 -0
- moriarty/modules/__init__.py +0 -0
- moriarty/modules/avatar_hash.py +184 -0
- moriarty/modules/directory_fuzzer.py +322 -0
- moriarty/modules/dns_scan.py +40 -0
- moriarty/modules/domain_scanner.py +620 -0
- moriarty/modules/email_check.py +98 -0
- moriarty/modules/email_investigate.py +267 -0
- moriarty/modules/email_security.py +274 -0
- moriarty/modules/googlemaps_lookup.py +106 -0
- moriarty/modules/headless_executor.py +201 -0
- moriarty/modules/orchestrator.py +60 -0
- moriarty/modules/passive_recon.py +444 -0
- moriarty/modules/phone_extractor.py +151 -0
- moriarty/modules/pipeline_orchestrator.py +726 -0
- moriarty/modules/port_scanner.py +129 -0
- moriarty/modules/rdap.py +61 -0
- moriarty/modules/rdap_extended.py +188 -0
- moriarty/modules/stealth_mode.py +610 -0
- moriarty/modules/subdomain_discovery.py +595 -0
- moriarty/modules/technology_profiler.py +361 -0
- moriarty/modules/template_executor.py +239 -0
- moriarty/modules/template_scanner.py +1048 -0
- moriarty/modules/tls_scan.py +46 -0
- moriarty/modules/tls_validator.py +188 -0
- moriarty/modules/vuln_scanner.py +483 -0
- moriarty/modules/waf_detector.py +585 -0
- moriarty/modules/wayback_discovery.py +234 -0
- moriarty/modules/web_crawler.py +163 -0
- moriarty/net/__init__.py +0 -0
- moriarty/net/dns_cache.py +175 -0
- moriarty/net/dns_client.py +188 -0
- moriarty/net/rdap_client.py +52 -0
- moriarty/net/smtp_client.py +114 -0
- moriarty/net/tls_client.py +111 -0
- moriarty/parsers/__init__.py +0 -0
- moriarty/parsers/html_parser.py +136 -0
- moriarty/tests/__init__.py +0 -0
- moriarty/tests/test_email_service.py +17 -0
- moriarty/tests/test_models.py +46 -0
- moriarty/tests/test_orchestrator.py +30 -0
- moriarty/tests/test_tls_client.py +18 -0
- moriarty_project-0.1.6.dist-info/METADATA +388 -0
- moriarty_project-0.1.6.dist-info/RECORD +418 -0
- moriarty_project-0.1.6.dist-info/WHEEL +4 -0
- moriarty_project-0.1.6.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,550 @@
|
|
1
|
+
"""Módulo de gerenciamento de assinaturas de ameaças."""
|
2
|
+
|
3
|
+
import re
|
4
|
+
import json
|
5
|
+
import yaml
|
6
|
+
import logging
|
7
|
+
from pathlib import Path
|
8
|
+
from typing import Dict, List, Any, Optional, Union, Pattern, Type, TypeVar, Set
|
9
|
+
from datetime import datetime
|
10
|
+
from abc import ABC, abstractmethod
|
11
|
+
|
12
|
+
from .ioc import IOC, IOCType, ThreatType
|
13
|
+
from .storage import get_storage, StorageError
|
14
|
+
|
15
|
+
# Configuração de logging
|
16
|
+
logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
# Tipo genérico para documentação
|
19
|
+
T = TypeVar('T', bound='BaseSignature')
|
20
|
+
|
21
|
+
class SignatureError(Exception):
|
22
|
+
"""Exceção base para erros de assinatura."""
|
23
|
+
pass
|
24
|
+
|
25
|
+
class BaseSignature(ABC):
|
26
|
+
"""Classe base para assinaturas de ameaças."""
|
27
|
+
|
28
|
+
def __init__(self, name: str, signature_type: str, pattern: str,
|
29
|
+
description: str = None, threat_type: Union[str, ThreatType] = None,
|
30
|
+
source: str = None, confidence: int = 50,
|
31
|
+
metadata: Dict[str, Any] = None):
|
32
|
+
"""Inicializa uma assinatura.
|
33
|
+
|
34
|
+
Args:
|
35
|
+
name: Nome da assinatura.
|
36
|
+
signature_type: Tipo da assinatura (ex: 'yara', 'snort', 'regex').
|
37
|
+
pattern: Padrão da assinatura.
|
38
|
+
description: Descrição da assinatura.
|
39
|
+
threat_type: Tipo de ameaça associada.
|
40
|
+
source: Fonte da assinatura.
|
41
|
+
confidence: Nível de confiança (0-100).
|
42
|
+
metadata: Metadados adicionais.
|
43
|
+
"""
|
44
|
+
self.name = name
|
45
|
+
self.signature_type = signature_type.lower()
|
46
|
+
self.pattern = pattern
|
47
|
+
self.description = description or ""
|
48
|
+
self.threat_type = ThreatType(threat_type) if isinstance(threat_type, str) else (threat_type or ThreatType.UNKNOWN)
|
49
|
+
self.source = source or "unknown"
|
50
|
+
self.confidence = max(0, min(100, confidence)) # Garante que está entre 0 e 100
|
51
|
+
self.metadata = metadata or {}
|
52
|
+
self._compiled_pattern = None
|
53
|
+
|
54
|
+
def compile(self):
|
55
|
+
"""Compila o padrão da assinatura para uso posterior.
|
56
|
+
|
57
|
+
Returns:
|
58
|
+
O padrão compilado.
|
59
|
+
|
60
|
+
Raises:
|
61
|
+
SignatureError: Se houver um erro ao compilar o padrão.
|
62
|
+
"""
|
63
|
+
if self._compiled_pattern is None:
|
64
|
+
try:
|
65
|
+
self._compiled_pattern = self._compile_pattern()
|
66
|
+
except Exception as e:
|
67
|
+
raise SignatureError(f"Erro ao compilar assinatura '{self.name}': {e}")
|
68
|
+
return self._compiled_pattern
|
69
|
+
|
70
|
+
@abstractmethod
|
71
|
+
def _compile_pattern(self):
|
72
|
+
"""Método abstrato para compilar o padrão da assinatura."""
|
73
|
+
pass
|
74
|
+
|
75
|
+
@abstractmethod
|
76
|
+
def match(self, data: Any) -> bool:
|
77
|
+
"""Verifica se os dados correspondem à assinatura.
|
78
|
+
|
79
|
+
Args:
|
80
|
+
data: Dados a serem verificados.
|
81
|
+
|
82
|
+
Returns:
|
83
|
+
bool: True se houver correspondência, False caso contrário.
|
84
|
+
"""
|
85
|
+
pass
|
86
|
+
|
87
|
+
def to_dict(self) -> Dict[str, Any]:
|
88
|
+
"""Converte a assinatura para um dicionário."""
|
89
|
+
return {
|
90
|
+
'name': self.name,
|
91
|
+
'signature_type': self.signature_type,
|
92
|
+
'pattern': self.pattern,
|
93
|
+
'description': self.description,
|
94
|
+
'threat_type': self.threat_type.value,
|
95
|
+
'source': self.source,
|
96
|
+
'confidence': self.confidence,
|
97
|
+
'metadata': self.metadata
|
98
|
+
}
|
99
|
+
|
100
|
+
@classmethod
|
101
|
+
def from_dict(cls: Type[T], data: Dict[str, Any]) -> T:
|
102
|
+
"""Cria uma assinatura a partir de um dicionário."""
|
103
|
+
return cls(
|
104
|
+
name=data['name'],
|
105
|
+
signature_type=data['signature_type'],
|
106
|
+
pattern=data['pattern'],
|
107
|
+
description=data.get('description'),
|
108
|
+
threat_type=data.get('threat_type'),
|
109
|
+
source=data.get('source'),
|
110
|
+
confidence=data.get('confidence', 50),
|
111
|
+
metadata=data.get('metadata', {})
|
112
|
+
)
|
113
|
+
|
114
|
+
def __str__(self) -> str:
|
115
|
+
return f"{self.name} ({self.signature_type}): {self.pattern}"
|
116
|
+
|
117
|
+
class RegexSignature(BaseSignature):
|
118
|
+
"""Assinatura baseada em expressões regulares."""
|
119
|
+
|
120
|
+
def _compile_pattern(self) -> Pattern:
|
121
|
+
"""Compila a expressão regular."""
|
122
|
+
return re.compile(self.pattern, re.IGNORECASE | re.DOTALL)
|
123
|
+
|
124
|
+
def match(self, data: str) -> bool:
|
125
|
+
"""Verifica se a string corresponde ao padrão da assinatura."""
|
126
|
+
if not isinstance(data, str):
|
127
|
+
return False
|
128
|
+
|
129
|
+
try:
|
130
|
+
pattern = self.compile()
|
131
|
+
return bool(pattern.search(data))
|
132
|
+
except Exception as e:
|
133
|
+
logger.error(f"Erro ao verificar correspondência da assinatura {self.name}: {e}")
|
134
|
+
return False
|
135
|
+
|
136
|
+
class YaraSignature(BaseSignature):
|
137
|
+
"""Assinatura no formato YARA."""
|
138
|
+
|
139
|
+
def _compile_pattern(self) -> Any:
|
140
|
+
"""Compila a regra YARA."""
|
141
|
+
# Em uma implementação real, isso usaria o módulo yara
|
142
|
+
# Por enquanto, apenas retornamos o padrão como está
|
143
|
+
return self.pattern
|
144
|
+
|
145
|
+
def match(self, data: Any) -> bool:
|
146
|
+
"""Verifica se os dados correspondem à regra YARA."""
|
147
|
+
# Em uma implementação real, isso usaria o módulo yara para compilar e verificar
|
148
|
+
# Por enquanto, apenas verificamos se o padrão está contido nos dados
|
149
|
+
if not isinstance(data, (str, bytes)):
|
150
|
+
return False
|
151
|
+
|
152
|
+
try:
|
153
|
+
# Verificação básica de correspondência de string
|
154
|
+
return self.pattern in str(data)
|
155
|
+
except Exception as e:
|
156
|
+
logger.error(f"Erro ao verificar correspondência da assinatura YARA {self.name}: {e}")
|
157
|
+
return False
|
158
|
+
|
159
|
+
class SnortSignature(BaseSignature):
|
160
|
+
"""Assinatura no formato Snort."""
|
161
|
+
|
162
|
+
def _compile_pattern(self) -> Any:
|
163
|
+
"""Processa a regra Snort."""
|
164
|
+
# Em uma implementação real, isso processaria a regra Snort
|
165
|
+
# Por enquanto, apenas retornamos o padrão como está
|
166
|
+
return self.pattern
|
167
|
+
|
168
|
+
def match(self, data: Any) -> bool:
|
169
|
+
"""Verifica se os dados correspondem à regra Snort."""
|
170
|
+
# Em uma implementação real, isso usaria um analisador de regras Snort
|
171
|
+
# Por enquanto, apenas verificamos se o padrão está contido nos dados
|
172
|
+
if not isinstance(data, (str, bytes)):
|
173
|
+
return False
|
174
|
+
|
175
|
+
try:
|
176
|
+
# Extrai o conteúdo entre parênteses da regra Snort
|
177
|
+
content_match = re.search(r'content:"([^"]+)"', self.pattern)
|
178
|
+
if content_match:
|
179
|
+
content = content_match.group(1)
|
180
|
+
return content in str(data)
|
181
|
+
return False
|
182
|
+
except Exception as e:
|
183
|
+
logger.error(f"Erro ao verificar correspondência da assinatura Snort {self.name}: {e}")
|
184
|
+
return False
|
185
|
+
|
186
|
+
class SignatureManager:
|
187
|
+
"""Gerenciador de assinaturas de ameaças."""
|
188
|
+
|
189
|
+
def __init__(self, storage=None):
|
190
|
+
"""Inicializa o gerenciador de assinaturas.
|
191
|
+
|
192
|
+
Args:
|
193
|
+
storage: Instância de armazenamento para persistência (opcional).
|
194
|
+
"""
|
195
|
+
self.storage = storage or get_storage()
|
196
|
+
self.signatures: Dict[str, Dict[str, BaseSignature]] = {}
|
197
|
+
self.signature_classes = {
|
198
|
+
'regex': RegexSignature,
|
199
|
+
'yara': YaraSignature,
|
200
|
+
'snort': SnortSignature,
|
201
|
+
}
|
202
|
+
|
203
|
+
def register_signature_type(self, signature_type: str, signature_class: Type[BaseSignature]):
|
204
|
+
"""Registra um novo tipo de assinatura.
|
205
|
+
|
206
|
+
Args:
|
207
|
+
signature_type: Nome do tipo de assinatura.
|
208
|
+
signature_class: Classe que implementa a assinatura.
|
209
|
+
"""
|
210
|
+
if not issubclass(signature_class, BaseSignature):
|
211
|
+
raise TypeError(f"A classe de assinatura deve herdar de BaseSignature")
|
212
|
+
self.signature_classes[signature_type.lower()] = signature_class
|
213
|
+
|
214
|
+
def add_signature(self, signature: Union[BaseSignature, Dict[str, Any]],
|
215
|
+
signature_type: str = None) -> bool:
|
216
|
+
"""Adiciona uma assinatura ao gerenciador.
|
217
|
+
|
218
|
+
Args:
|
219
|
+
signature: Instância de BaseSignature ou dicionário com os dados da assinatura.
|
220
|
+
signature_type: Tipo da assinatura (opcional, se não for fornecida, será obtido da assinatura).
|
221
|
+
|
222
|
+
Returns:
|
223
|
+
bool: True se a assinatura foi adicionada, False se já existir.
|
224
|
+
|
225
|
+
Raises:
|
226
|
+
SignatureError: Se houver um erro ao adicionar a assinatura.
|
227
|
+
"""
|
228
|
+
if isinstance(signature, dict):
|
229
|
+
if signature_type is None:
|
230
|
+
signature_type = signature.get('signature_type')
|
231
|
+
if not signature_type:
|
232
|
+
raise SignatureError("Tipo de assinatura não especificado")
|
233
|
+
|
234
|
+
signature_cls = self.signature_classes.get(signature_type.lower())
|
235
|
+
if not signature_cls:
|
236
|
+
raise SignatureError(f"Tipo de assinatura não suportado: {signature_type}")
|
237
|
+
|
238
|
+
try:
|
239
|
+
signature = signature_cls.from_dict(signature)
|
240
|
+
except Exception as e:
|
241
|
+
raise SignatureError(f"Falha ao criar assinatura: {e}")
|
242
|
+
|
243
|
+
if not isinstance(signature, BaseSignature):
|
244
|
+
raise TypeError("A assinatura deve ser uma instância de BaseSignature ou um dicionário válido")
|
245
|
+
|
246
|
+
# Obtém o tipo da assinatura
|
247
|
+
sig_type = signature.signature_type.lower()
|
248
|
+
|
249
|
+
# Inicializa o dicionário para o tipo de assinatura, se necessário
|
250
|
+
if sig_type not in self.signatures:
|
251
|
+
self.signatures[sig_type] = {}
|
252
|
+
|
253
|
+
# Verifica se a assinatura já existe
|
254
|
+
if signature.name in self.signatures[sig_type]:
|
255
|
+
logger.warning(f"Assinatura '{signature.name}' do tipo '{sig_type}' já existe")
|
256
|
+
return False
|
257
|
+
|
258
|
+
# Compila a assinatura para verificar se é válida
|
259
|
+
try:
|
260
|
+
signature.compile()
|
261
|
+
except Exception as e:
|
262
|
+
raise SignatureError(f"Falha ao compilar assinatura '{signature.name}': {e}")
|
263
|
+
|
264
|
+
# Adiciona a assinatura ao gerenciador
|
265
|
+
self.signatures[sig_type][signature.name] = signature
|
266
|
+
logger.debug(f"Assinatura adicionada: {signature.name} ({sig_type})")
|
267
|
+
|
268
|
+
# Tenta salvar no armazenamento, se disponível
|
269
|
+
if self.storage:
|
270
|
+
try:
|
271
|
+
return self.storage.add_signature(
|
272
|
+
name=signature.name,
|
273
|
+
signature_type=sig_type,
|
274
|
+
pattern=signature.pattern,
|
275
|
+
description=signature.description,
|
276
|
+
threat_type=signature.threat_type.value,
|
277
|
+
source=signature.source,
|
278
|
+
confidence=signature.confidence,
|
279
|
+
metadata=signature.metadata
|
280
|
+
)
|
281
|
+
except Exception as e:
|
282
|
+
logger.error(f"Erro ao salvar assinatura no armazenamento: {e}")
|
283
|
+
|
284
|
+
return True
|
285
|
+
|
286
|
+
def load_from_file(self, file_path: Union[str, Path], signature_type: str = None) -> int:
|
287
|
+
"""Carrega assinaturas de um arquivo.
|
288
|
+
|
289
|
+
Args:
|
290
|
+
file_path: Caminho para o arquivo de assinaturas.
|
291
|
+
signature_type: Tipo das assinaturas (opcional, tenta detectar automaticamente).
|
292
|
+
|
293
|
+
Returns:
|
294
|
+
int: Número de assinaturas carregadas.
|
295
|
+
|
296
|
+
Raises:
|
297
|
+
SignatureError: Se houver um erro ao carregar as assinaturas.
|
298
|
+
"""
|
299
|
+
file_path = Path(file_path)
|
300
|
+
if not file_path.exists() or not file_path.is_file():
|
301
|
+
raise SignatureError(f"Arquivo não encontrado: {file_path}")
|
302
|
+
|
303
|
+
# Tenta detectar o tipo de assinatura com base na extensão do arquivo
|
304
|
+
if signature_type is None:
|
305
|
+
ext = file_path.suffix.lower()
|
306
|
+
if ext in ('.yar', '.yara'):
|
307
|
+
signature_type = 'yara'
|
308
|
+
elif ext in ('.rules', '.snort'):
|
309
|
+
signature_type = 'snort'
|
310
|
+
elif ext in ('.json', '.yaml', '.yml'):
|
311
|
+
# Para JSON/YAML, o tipo deve ser especificado
|
312
|
+
signature_type = 'regex' # Padrão
|
313
|
+
else:
|
314
|
+
signature_type = 'regex' # Padrão para arquivos de texto
|
315
|
+
|
316
|
+
# Carrega as assinaturas do arquivo
|
317
|
+
try:
|
318
|
+
if file_path.suffix.lower() in ('.json', '.yaml', '.yml'):
|
319
|
+
return self._load_from_structured_file(file_path, signature_type)
|
320
|
+
else:
|
321
|
+
return self._load_from_text_file(file_path, signature_type)
|
322
|
+
except Exception as e:
|
323
|
+
raise SignatureError(f"Erro ao carregar assinaturas de {file_path}: {e}")
|
324
|
+
|
325
|
+
def _load_from_structured_file(self, file_path: Path, signature_type: str) -> int:
|
326
|
+
"""Carrega assinaturas de um arquivo estruturado (JSON/YAML)."""
|
327
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
328
|
+
if file_path.suffix.lower() == '.json':
|
329
|
+
data = json.load(f)
|
330
|
+
else: # YAML
|
331
|
+
data = yaml.safe_load(f)
|
332
|
+
|
333
|
+
# Verifica se é uma lista de assinaturas ou um dicionário com uma lista 'signatures'
|
334
|
+
if isinstance(data, list):
|
335
|
+
signatures = data
|
336
|
+
elif isinstance(data, dict) and 'signatures' in data:
|
337
|
+
signatures = data['signatures']
|
338
|
+
else:
|
339
|
+
signatures = [data] # Assume que é um único objeto de assinatura
|
340
|
+
|
341
|
+
# Adiciona cada assinatura
|
342
|
+
count = 0
|
343
|
+
for sig_data in signatures:
|
344
|
+
if not isinstance(sig_data, dict):
|
345
|
+
logger.warning(f"Formato de assinatura inválido: {sig_data}")
|
346
|
+
continue
|
347
|
+
|
348
|
+
# Define o tipo de assinatura, se não estiver definido
|
349
|
+
if 'signature_type' not in sig_data and signature_type:
|
350
|
+
sig_data['signature_type'] = signature_type
|
351
|
+
|
352
|
+
try:
|
353
|
+
if self.add_signature(sig_data):
|
354
|
+
count += 1
|
355
|
+
except Exception as e:
|
356
|
+
logger.error(f"Falha ao adicionar assinatura: {e}")
|
357
|
+
|
358
|
+
logger.info(f"Carregadas {count} assinaturas de {file_path}")
|
359
|
+
return count
|
360
|
+
|
361
|
+
def _load_from_text_file(self, file_path: Path, signature_type: str) -> int:
|
362
|
+
"""Carrega assinaturas de um arquivo de texto."""
|
363
|
+
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
|
364
|
+
lines = f.read().splitlines()
|
365
|
+
|
366
|
+
count = 0
|
367
|
+
current_sig = None
|
368
|
+
|
369
|
+
for line in lines:
|
370
|
+
line = line.strip()
|
371
|
+
if not line or line.startswith('#'):
|
372
|
+
continue
|
373
|
+
|
374
|
+
# Tenta detectar o tipo de assinatura com base no conteúdo
|
375
|
+
if signature_type == 'auto':
|
376
|
+
if line.startswith('rule '):
|
377
|
+
sig_type = 'yara'
|
378
|
+
elif 'content:' in line and 'sid:' in line:
|
379
|
+
sig_type = 'snort'
|
380
|
+
else:
|
381
|
+
sig_type = 'regex'
|
382
|
+
else:
|
383
|
+
sig_type = signature_type
|
384
|
+
|
385
|
+
# Cria uma assinatura para cada linha
|
386
|
+
try:
|
387
|
+
sig_name = f"{file_path.stem}_{count}"
|
388
|
+
sig = {
|
389
|
+
'name': sig_name,
|
390
|
+
'signature_type': sig_type,
|
391
|
+
'pattern': line,
|
392
|
+
'source': str(file_path)
|
393
|
+
}
|
394
|
+
|
395
|
+
if self.add_signature(sig):
|
396
|
+
count += 1
|
397
|
+
except Exception as e:
|
398
|
+
logger.error(f"Falha ao adicionar assinatura da linha: {line[:50]}...: {e}")
|
399
|
+
|
400
|
+
logger.info(f"Carregadas {count} assinaturas de {file_path}")
|
401
|
+
return count
|
402
|
+
|
403
|
+
def load_from_directory(self, directory: Union[str, Path],
|
404
|
+
recursive: bool = True,
|
405
|
+
signature_type: str = None) -> int:
|
406
|
+
"""Carrega assinaturas de um diretório.
|
407
|
+
|
408
|
+
Args:
|
409
|
+
directory: Caminho para o diretório com arquivos de assinaturas.
|
410
|
+
recursive: Se deve carregar de subdiretórios também.
|
411
|
+
signature_type: Tipo das assinaturas (opcional, tenta detectar automaticamente).
|
412
|
+
|
413
|
+
Returns:
|
414
|
+
int: Número total de assinaturas carregadas.
|
415
|
+
"""
|
416
|
+
directory = Path(directory)
|
417
|
+
if not directory.exists() or not directory.is_dir():
|
418
|
+
raise SignatureError(f"Diretório não encontrado: {directory}")
|
419
|
+
|
420
|
+
count = 0
|
421
|
+
|
422
|
+
# Extensões de arquivo suportadas
|
423
|
+
extensions = ['.json', '.yaml', '.yml', '.yar', '.yara', '.rules', '.snort', '.txt']
|
424
|
+
|
425
|
+
# Função para processar um arquivo
|
426
|
+
def process_file(file_path: Path):
|
427
|
+
nonlocal count
|
428
|
+
try:
|
429
|
+
count += self.load_from_file(file_path, signature_type)
|
430
|
+
except Exception as e:
|
431
|
+
logger.error(f"Erro ao carregar assinaturas de {file_path}: {e}")
|
432
|
+
|
433
|
+
# Processa os arquivos no diretório
|
434
|
+
for ext in extensions:
|
435
|
+
pattern = f"*{ext}"
|
436
|
+
for file_path in directory.glob(pattern):
|
437
|
+
if file_path.is_file():
|
438
|
+
process_file(file_path)
|
439
|
+
|
440
|
+
# Processa recursivamente os subdiretórios, se solicitado
|
441
|
+
if recursive:
|
442
|
+
for subdir in directory.iterdir():
|
443
|
+
if subdir.is_dir():
|
444
|
+
count += self.load_from_directory(subdir, recursive, signature_type)
|
445
|
+
|
446
|
+
logger.info(f"Total de {count} assinaturas carregadas de {directory}")
|
447
|
+
return count
|
448
|
+
|
449
|
+
def match(self, data: Any, signature_type: str = None) -> List[Dict[str, Any]]:
|
450
|
+
"""Verifica se os dados correspondem a alguma assinatura.
|
451
|
+
|
452
|
+
Args:
|
453
|
+
data: Dados a serem verificados.
|
454
|
+
signature_type: Tipo de assinatura para verificar (opcional, verifica todos os tipos).
|
455
|
+
|
456
|
+
Returns:
|
457
|
+
Lista de dicionários com informações sobre as assinaturas que corresponderam.
|
458
|
+
"""
|
459
|
+
matches = []
|
460
|
+
|
461
|
+
# Determina quais tipos de assinatura verificar
|
462
|
+
if signature_type:
|
463
|
+
signature_types = [signature_type.lower()]
|
464
|
+
else:
|
465
|
+
signature_types = list(self.signatures.keys())
|
466
|
+
|
467
|
+
# Verifica cada tipo de assinatura
|
468
|
+
for sig_type in signature_types:
|
469
|
+
if sig_type not in self.signatures:
|
470
|
+
continue
|
471
|
+
|
472
|
+
# Verifica cada assinatura do tipo
|
473
|
+
for name, signature in self.signatures[sig_type].items():
|
474
|
+
try:
|
475
|
+
if signature.match(data):
|
476
|
+
matches.append({
|
477
|
+
'name': name,
|
478
|
+
'signature_type': sig_type,
|
479
|
+
'threat_type': signature.threat_type.value,
|
480
|
+
'confidence': signature.confidence,
|
481
|
+
'source': signature.source,
|
482
|
+
'description': signature.description,
|
483
|
+
'metadata': signature.metadata
|
484
|
+
})
|
485
|
+
except Exception as e:
|
486
|
+
logger.error(f"Erro ao verificar assinatura {name}: {e}")
|
487
|
+
|
488
|
+
# Ordena por confiança (maior primeiro) e depois por nome
|
489
|
+
matches.sort(key=lambda x: (-x['confidence'], x['name']))
|
490
|
+
return matches
|
491
|
+
|
492
|
+
def get_signatures(self, signature_type: str = None) -> List[Dict[str, Any]]:
|
493
|
+
"""Obtém todas as assinaturas ou de um tipo específico.
|
494
|
+
|
495
|
+
Args:
|
496
|
+
signature_type: Tipo de assinatura (opcional, retorna todos os tipos se None).
|
497
|
+
|
498
|
+
Returns:
|
499
|
+
Lista de dicionários com informações sobre as assinaturas.
|
500
|
+
"""
|
501
|
+
result = []
|
502
|
+
|
503
|
+
if signature_type:
|
504
|
+
signature_types = [signature_type.lower()]
|
505
|
+
else:
|
506
|
+
signature_types = list(self.signatures.keys())
|
507
|
+
|
508
|
+
for sig_type in signature_types:
|
509
|
+
if sig_type in self.signatures:
|
510
|
+
for name, signature in self.signatures[sig_type].items():
|
511
|
+
result.append({
|
512
|
+
'name': name,
|
513
|
+
'signature_type': sig_type,
|
514
|
+
'threat_type': signature.threat_type.value,
|
515
|
+
'confidence': signature.confidence,
|
516
|
+
'source': signature.source,
|
517
|
+
'description': signature.description,
|
518
|
+
'pattern': signature.pattern,
|
519
|
+
'metadata': signature.metadata
|
520
|
+
})
|
521
|
+
|
522
|
+
return result
|
523
|
+
|
524
|
+
def clear(self, signature_type: str = None):
|
525
|
+
"""Remove todas as assinaturas ou de um tipo específico.
|
526
|
+
|
527
|
+
Args:
|
528
|
+
signature_type: Tipo de assinatura a ser removido (opcional, remove todas se None).
|
529
|
+
"""
|
530
|
+
if signature_type:
|
531
|
+
if signature_type in self.signatures:
|
532
|
+
count = len(self.signatures[signature_type])
|
533
|
+
del self.signatures[signature_type]
|
534
|
+
logger.info(f"Removidas {count} assinaturas do tipo '{signature_type}'")
|
535
|
+
else:
|
536
|
+
count = sum(len(sigs) for sigs in self.signatures.values())
|
537
|
+
self.signatures.clear()
|
538
|
+
logger.info(f"Removidas todas as {count} assinaturas")
|
539
|
+
|
540
|
+
# Instância global para uso em todo o módulo
|
541
|
+
signature_manager = SignatureManager()
|
542
|
+
|
543
|
+
def get_signature_manager() -> SignatureManager:
|
544
|
+
"""Obtém a instância global do gerenciador de assinaturas."""
|
545
|
+
return signature_manager
|
546
|
+
|
547
|
+
def set_signature_manager(manager: SignatureManager):
|
548
|
+
"""Define a instância global do gerenciador de assinaturas."""
|
549
|
+
global signature_manager
|
550
|
+
signature_manager = manager
|