moriarty-project 0.1.22__tar.gz → 0.1.24__tar.gz
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_project-0.1.22 → moriarty_project-0.1.24}/PKG-INFO +3 -3
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/README.md +2 -2
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/__init__.py +1 -1
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/app.py +4 -3
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/domain_cmd.py +5 -1
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/directory_fuzzer.py +25 -5
- moriarty_project-0.1.24/moriarty/modules/web_crawler.py +520 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/pyproject.toml +1 -1
- moriarty_project-0.1.24/test_crawl.py +105 -0
- moriarty_project-0.1.22/moriarty/modules/web_crawler.py +0 -163
- moriarty_project-0.1.22/moriarty/modules/wifippler/__init__.py +0 -92
- moriarty_project-0.1.22/moriarty/modules/wifippler/cli/__init__.py +0 -8
- moriarty_project-0.1.22/moriarty/modules/wifippler/cli/commands.py +0 -123
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/__init__.py +0 -94
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/attacks/__init__.py +0 -146
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/attacks/deauth.py +0 -262
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/attacks/handshake.py +0 -402
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/attacks/pmkid.py +0 -424
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/attacks/wep.py +0 -467
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/attacks/wpa.py +0 -446
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/attacks/wps.py +0 -474
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/models/__init__.py +0 -10
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/models/network.py +0 -240
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/scanner.py +0 -903
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/utils/__init__.py +0 -624
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/utils/exec.py +0 -182
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/utils/network.py +0 -262
- moriarty_project-0.1.22/moriarty/modules/wifippler/core/utils/system.py +0 -153
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/.gitignore +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/assets/img/moriarty-banner.png +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/adapters/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/agent/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/.gitkeep +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/douban.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/kakao.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/line.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/mixi.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/naver.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/qq.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/vk.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/wechat.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/weibo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/asia/xiaohongshu.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/behance.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/crunchbase.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/fiverr.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/freelancer.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/glassdoor.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/guru.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/indeed.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/monster.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/peopleperhour.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/toptal.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/upwork.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/business/ziprecruiter.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/content/buymeacoffee.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/content/gumroad.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/content/ko-fi.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/content/onlyfans.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/content/patreon.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/content/substack.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/creative/500px.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/creative/artstation.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/creative/deviantart.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/creative/flickr.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/creative/pexels.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/creative/unsplash.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/creative/vimeo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/binance.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/bitcointalk.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/coinbase.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/etherscan.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/foundation.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/kraken.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/mirror.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/niftygateway.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/opensea.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/rarible.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/crypto/superrare.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/bumble.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/grindr.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/happn.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/her.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/hinge.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/match.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/meetme.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/okcupid.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/pof.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating/tinder.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating-nsfw/adultfriendfinder.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dating-nsfw/ashley-madison.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/design/adobe-portfolio.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/design/carbonmade.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/design/cgsociety.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/design/coroflot.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/design/figma.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/design/sketch.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dev/bitbucket.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dev/codeforces.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dev/codepen.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dev/hackerone.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dev/hackthebox.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dev/huggingface.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dev/kaggle.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dev/leetcode.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dev/replit.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/dribbble.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/ecommerce/etsy.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/education/duolingo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/education/edx.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/education/khanacademy.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/education/lynda.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/education/memrise.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/education/pluralsight.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/education/skillshare.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/education/udacity.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/email/github_email.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/email/gravatar.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/badoo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/lovoo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/myspace.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/netlog.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/ok.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/skyrock.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/studivz.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/tuenti.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/viadeo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/europe/xing.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/fitness/fitbit.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/fitness/garmin.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/fitness/myfitnesspal.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/fitness/strava.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/fitness/zwift.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/food/allrecipes.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/food/tasty.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/food/yelp.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/food/zomato.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/4chan.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/8kun.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/9gag.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/discourse.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/disqus.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/hackernews.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/launchpad.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/phpbb.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/quora.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/serverfault.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/slashdot.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/stackexchange.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/superuser.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/vbulletin.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums/xenforo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums-nsfw/kiwifarms.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/forums-nsfw/lolcow.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/apextracker.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/battlenet.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/chess.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/discord-public.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/dotabuff.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/epicgames.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/faceit.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/fortnitetracker.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/gog.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/itch.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/kongregate.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/minecraft.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/opgg.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/origin.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/playstation.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/roblox.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gaming/xbox.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/github.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/gitlab.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/instagram.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/latam/fotolog.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/latam/orkut.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/latam/taringa.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/learning/coursera.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/learning/udemy.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/linkedin.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/marketplaces/depop.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/marketplaces/ebay.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/marketplaces/grailed.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/marketplaces/mercari.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/marketplaces/poshmark.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/marketplaces/reverb.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/marketplaces/vinted.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/medium.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/audiomack.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/bandcamp.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/beatport.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/deezer.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/discogs.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/genius.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/lastfm.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/mixcloud.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/reverbnation.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/soundcloud.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/spotify.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/music/tidal.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/adultwork.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/bongacams.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/cam4.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/chaturbate.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/clips4sale.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/extralunchmoney.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/fansly.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/fetlife.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/iw/n/nantclips.yaml" +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/justforfans.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/loyalfans.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/manyvids.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/myfreecams.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/niteflirt.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/pornhub.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/redtube.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/stripchat.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/xhamster.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/xvideos.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/nsfw/youporn.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/photography/eyeem.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/photography/fotki.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/photography/photobucket.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/photography/smugmug.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/photography/vsco.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/pinterest.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/podcasts/anchor.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/podcasts/castbox.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/podcasts/podbean.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/about.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/academia.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/angellist.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/calendly.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/issuu.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/mendeley.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/notion.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/orcid.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/producthunt.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/researchgate.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/scribd.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/slideshare.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/trello.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/professional/typeform.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/reddit.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/amino.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/ask-fm.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/babycenter.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/cafemom.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/care2.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/diaspora.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/ello.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/gaia.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/habbo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/imvu.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/lemmy.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/peertube.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/pixelfed.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/plurk.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/recroom.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/secondlife.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/vine-archive.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/vrchat.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/regional/weheartit.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/anilist.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/beacons.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/blogger.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/crunchyroll.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/discord.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/dreamwidth.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/facebook.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/goodreads.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/imdb.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/kitsu.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/letterboxd.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/linktree.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/livejournal.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/mastodon.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/minds.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/myanimelist.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/ravelry.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/snapchat.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/telegram.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/tiktok.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/trakt.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/wattpad.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/social/wordpress-com.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/sports/espn.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/sports/untappd.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/stackoverflow.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/steam.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/streaming/caffeine.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/streaming/dlive.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/streaming/trovo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/travel/airbnb.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/travel/booking.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/travel/couchsurfing.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/travel/tripadvisor.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/tumblr.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/twitch.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/twitter.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/modules/youtube.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2017-5638.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2018-7600.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2019-11510.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2019-19781.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2020-14882.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2020-14883.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2020-3452.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2020-5902.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2021-21972.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2021-21985.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2021-26084.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2021-41773.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2021-42013.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2021-44228.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2022-0185.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2022-1388.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2022-22954.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2022-22965.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2022-26134.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2023-22515.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2023-22527.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2023-23752.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2023-27350.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2023-2868.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2023-34362.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2023-3519.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/cves/CVE-2023-4966.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/default-logins/admin-weak.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/default-logins/wordpress-default.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/exposures/aws-credentials.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/exposures/backup-files.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/exposures/database-files.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/exposures/docker-exposed.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/exposures/env-exposed.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/exposures/git-exposed.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/exposures/phpinfo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/exposures/svn-exposed.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/fuzzing/api-endpoints.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/fuzzing/common-files.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/fuzzing/open-redirect-fuzz.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/fuzzing/xss-search-fuzz.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/git-config.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/misconfigurations/cors-misconfiguration.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/misconfigurations/debug-enabled.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/misconfigurations/directory-listing.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/misconfigurations/jwt-none-algo.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/misconfigurations/ssl-tls-weak.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/vulnerabilities/lfi-basic.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/vulnerabilities/open-redirect.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/vulnerabilities/rce-basic.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/vulnerabilities/sqli-error.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/vulnerabilities/ssrf-basic.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/vulnerabilities/xss-reflected.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/templates/vulnerabilities/xxe-basic.yaml +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/assets/wordlists/subdomains-1000.txt +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/async_utils.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/dns.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/email.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/email_investigate.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/intelligence.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/output.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/rdap.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/state.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/tls.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/user.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/cli/wifippler.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/core/cache_backend.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/core/config_manager.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/correlator/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/data/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/data/ioc/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/data/ioc/matcher.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/data/ioc/types.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/data/local_intelligence.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/data/signature_loaders/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/data/signature_loaders/base.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/data/signature_loaders/ioc_feed.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/data/signature_loaders/wappalyzer.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/dsl/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/dsl/loader.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/dsl/schema.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/export/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/intelligence/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/intelligence/__main__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/intelligence/config.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/intelligence/ioc.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/intelligence/signatures.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/intelligence/storage.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/interop/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/logging/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/logging/config.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/models/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/models/assertion.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/models/entity.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/models/evidence.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/models/relation.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/models/types.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/avatar_hash.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/dns_scan.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/domain_scanner.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/email_check.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/email_investigate.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/email_security.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/googlemaps_lookup.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/headless_executor.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/orchestrator.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/passive_recon.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/phone_extractor.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/pipeline_orchestrator.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/port_scanner.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/rdap.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/rdap_extended.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/stealth_mode.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/subdomain_discovery.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/technology_profiler.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/template_executor.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/template_scanner.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/tls_scan.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/tls_validator.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/vuln_scanner.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/waf_detector.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/modules/wayback_discovery.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/net/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/net/dns_cache.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/net/dns_client.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/net/rdap_client.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/net/smtp_client.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/net/tls_client.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/parsers/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/parsers/html_parser.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/tests/__init__.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/tests/test_email_service.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/tests/test_models.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/tests/test_orchestrator.py +0 -0
- {moriarty_project-0.1.22 → moriarty_project-0.1.24}/moriarty/tests/test_tls_client.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: moriarty-project
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.24
|
4
4
|
Summary: Client-side OSINT toolkit with forensic-grade evidence handling.
|
5
5
|
Project-URL: Homepage, https://github.com/DonatoReis/moriarty
|
6
6
|
Project-URL: Documentation, https://github.com/DonatoReis/moriarty#readme
|
@@ -98,7 +98,7 @@ Description-Content-Type: text/markdown
|
|
98
98
|
<!-- Badges -->
|
99
99
|
<p align="center">
|
100
100
|
<a href="https://pypi.org/project/moriarty-project/">
|
101
|
-
<img src="https://img.shields.io/badge/version-0.1.
|
101
|
+
<img src="https://img.shields.io/badge/version-0.1.24-blue" alt="Version 0.1.24">
|
102
102
|
</a>
|
103
103
|
<a href="https://www.python.org/downloads/">
|
104
104
|
<img src="https://img.shields.io/pypi/pyversions/moriarty-project?color=blue" alt="Python Versions">
|
@@ -152,7 +152,7 @@ Description-Content-Type: text/markdown
|
|
152
152
|
pipx install moriarty-project
|
153
153
|
|
154
154
|
# OU para instalar uma versão específica
|
155
|
-
# pipx install moriarty-project==0.1.
|
155
|
+
# pipx install moriarty-project==0.1.24
|
156
156
|
|
157
157
|
# Verificar a instalação
|
158
158
|
moriarty --help
|
@@ -19,7 +19,7 @@
|
|
19
19
|
<!-- Badges -->
|
20
20
|
<p align="center">
|
21
21
|
<a href="https://pypi.org/project/moriarty-project/">
|
22
|
-
<img src="https://img.shields.io/badge/version-0.1.
|
22
|
+
<img src="https://img.shields.io/badge/version-0.1.24-blue" alt="Version 0.1.24">
|
23
23
|
</a>
|
24
24
|
<a href="https://www.python.org/downloads/">
|
25
25
|
<img src="https://img.shields.io/pypi/pyversions/moriarty-project?color=blue" alt="Python Versions">
|
@@ -73,7 +73,7 @@
|
|
73
73
|
pipx install moriarty-project
|
74
74
|
|
75
75
|
# OU para instalar uma versão específica
|
76
|
-
# pipx install moriarty-project==0.1.
|
76
|
+
# pipx install moriarty-project==0.1.24
|
77
77
|
|
78
78
|
# Verificar a instalação
|
79
79
|
moriarty --help
|
@@ -8,7 +8,8 @@ from rich.console import Console
|
|
8
8
|
from rich.theme import Theme
|
9
9
|
|
10
10
|
from ..logging.config import LogStyle, configure_logging
|
11
|
-
from . import dns, email, rdap, tls, user, domain_cmd, intelligence
|
11
|
+
from . import dns, email, rdap, tls, user, domain_cmd, intelligence
|
12
|
+
# Temporariamente removido para testes: wifippler
|
12
13
|
from .state import CLIState, GlobalOptions
|
13
14
|
|
14
15
|
console = Console(theme=Theme({
|
@@ -117,7 +118,7 @@ app.add_typer(rdap.app, name="rdap", help="Consultas RDAP.")
|
|
117
118
|
app.add_typer(tls.app, name="tls", help="Inspeções TLS.")
|
118
119
|
app.add_typer(intelligence.app, name="intelligence", help="Inteligência de ameaças.")
|
119
120
|
app.add_typer(domain_cmd.app, name="domain", help="Análise de domínios.")
|
120
|
-
|
121
|
+
# Temporariamente removido: wifippler.app
|
121
122
|
app.add_typer(user.app, name="user", help="User/IP reconnaissance and scanning.")
|
122
123
|
|
123
124
|
# Registra os comandos de inteligência
|
@@ -129,7 +130,7 @@ if __name__ == "__main__":
|
|
129
130
|
|
130
131
|
|
131
132
|
def main() -> None: # Console script compatibility
|
132
|
-
|
133
|
+
app()
|
133
134
|
|
134
135
|
|
135
136
|
def check_pipx_installed() -> bool:
|
@@ -1,9 +1,13 @@
|
|
1
1
|
"""Comandos de scanning de domínios/IPs."""
|
2
|
+
|
3
|
+
import asyncio
|
2
4
|
import json
|
3
|
-
from typing import Optional
|
5
|
+
from typing import Optional, Dict, List
|
4
6
|
|
5
7
|
import typer
|
6
8
|
|
9
|
+
from moriarty.modules.web_crawler import WebCrawler
|
10
|
+
|
7
11
|
from moriarty.modules.port_scanner import PortScanner, PROFILES
|
8
12
|
from moriarty.modules.passive_recon import PassiveRecon
|
9
13
|
from rich.console import Console
|
@@ -160,10 +160,18 @@ class DirectoryFuzzer:
|
|
160
160
|
verify=False
|
161
161
|
) as client:
|
162
162
|
|
163
|
-
with Progress(
|
163
|
+
with Progress(
|
164
|
+
"[progress.description]{task.description}",
|
165
|
+
"•",
|
166
|
+
"[progress.percentage]{task.percentage:>3.0f}%",
|
167
|
+
"[dim]{task.fields[status]}",
|
168
|
+
refresh_per_second=10,
|
169
|
+
console=console
|
170
|
+
) as progress:
|
164
171
|
task_id = progress.add_task(
|
165
172
|
f"[cyan]Fuzzing {base_url.split('/')[-1] or 'root'}...",
|
166
|
-
total=len(urls_to_test)
|
173
|
+
total=len(urls_to_test),
|
174
|
+
status=""
|
167
175
|
)
|
168
176
|
|
169
177
|
tasks = [
|
@@ -197,7 +205,8 @@ class DirectoryFuzzer:
|
|
197
205
|
headers = self._get_headers()
|
198
206
|
response = await client.get(url, headers=headers)
|
199
207
|
|
200
|
-
|
208
|
+
# Atualiza o progresso
|
209
|
+
progress.update(task_id, advance=1, refresh=True)
|
201
210
|
|
202
211
|
# Filtra por status code
|
203
212
|
if response.status_code not in self.status_filter:
|
@@ -231,14 +240,25 @@ class DirectoryFuzzer:
|
|
231
240
|
elif url.endswith('/'):
|
232
241
|
self.found_dirs.add(url.rstrip('/'))
|
233
242
|
|
234
|
-
#
|
243
|
+
# Adiciona resultado à lista para exibição posterior
|
235
244
|
color = self._get_status_color(response.status_code)
|
236
|
-
|
245
|
+
result_str = (
|
237
246
|
f" [{color}]{response.status_code}[/{color}] "
|
238
247
|
f"[cyan]{url.replace(self.base_url, '')}[/cyan] "
|
239
248
|
f"[dim]({content_size} bytes)[/dim]"
|
240
249
|
)
|
241
250
|
|
251
|
+
# Atualiza a descrição da tarefa com o último resultado
|
252
|
+
progress.update(task_id, description=f"[cyan]Fuzzing {base_url.split('/')[-1] or 'root'}... {result_str}")
|
253
|
+
|
254
|
+
# Adiciona ao log estruturado
|
255
|
+
logger.info(
|
256
|
+
"fuzzer.found",
|
257
|
+
url=url,
|
258
|
+
status=response.status_code,
|
259
|
+
size=content_size
|
260
|
+
)
|
261
|
+
|
242
262
|
logger.info(
|
243
263
|
"fuzzer.found",
|
244
264
|
url=url,
|
@@ -0,0 +1,520 @@
|
|
1
|
+
"""Crawler HTTP avançado para enumeração de rotas e formulários com suporte a redirecionamentos e evasão de bloqueios."""
|
2
|
+
from __future__ import annotations
|
3
|
+
|
4
|
+
import asyncio
|
5
|
+
import random
|
6
|
+
import time
|
7
|
+
import ssl
|
8
|
+
import certifi
|
9
|
+
from dataclasses import dataclass, field
|
10
|
+
from typing import Dict, List, Optional, Set, Tuple, Any, TYPE_CHECKING
|
11
|
+
from urllib.parse import urlparse, urljoin
|
12
|
+
|
13
|
+
import httpx
|
14
|
+
from selectolax.parser import HTMLParser
|
15
|
+
import structlog
|
16
|
+
|
17
|
+
if TYPE_CHECKING: # pragma: no cover - apenas para type hints
|
18
|
+
from moriarty.modules.stealth_mode import StealthMode
|
19
|
+
|
20
|
+
logger = structlog.get_logger(__name__)
|
21
|
+
|
22
|
+
# Headers realistas de navegador
|
23
|
+
DEFAULT_HEADERS = {
|
24
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
25
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
26
|
+
"Accept-Language": "pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3",
|
27
|
+
"Accept-Encoding": "gzip, deflate, br",
|
28
|
+
"Connection": "keep-alive",
|
29
|
+
"Upgrade-Insecure-Requests": "1",
|
30
|
+
"Sec-Fetch-Dest": "document",
|
31
|
+
"Sec-Fetch-Mode": "navigate",
|
32
|
+
"Sec-Fetch-Site": "none",
|
33
|
+
"Sec-Fetch-User": "?1",
|
34
|
+
"Cache-Control": "max-age=0",
|
35
|
+
}
|
36
|
+
|
37
|
+
# Lista de user-agents para rotação
|
38
|
+
USER_AGENTS = [
|
39
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
40
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0",
|
41
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15",
|
42
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",
|
43
|
+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
44
|
+
]
|
45
|
+
|
46
|
+
# Lista de referrers para rotação
|
47
|
+
REFERRERS = [
|
48
|
+
"https://www.google.com/",
|
49
|
+
"https://www.bing.com/",
|
50
|
+
"https://www.yahoo.com/",
|
51
|
+
"https://duckduckgo.com/",
|
52
|
+
""
|
53
|
+
]
|
54
|
+
|
55
|
+
@dataclass
|
56
|
+
class CrawlPage:
|
57
|
+
"""Representa uma página web rastreada."""
|
58
|
+
url: str
|
59
|
+
status: int
|
60
|
+
title: Optional[str] = None
|
61
|
+
forms: List[Dict[str, Any]] = field(default_factory=list)
|
62
|
+
links: List[str] = field(default_factory=list)
|
63
|
+
redirect_chain: List[Tuple[str, int]] = field(default_factory=list)
|
64
|
+
error: Optional[str] = None
|
65
|
+
|
66
|
+
|
67
|
+
class WebCrawler:
|
68
|
+
"""Crawler avançado com suporte a redirecionamentos e evasão de bloqueios."""
|
69
|
+
|
70
|
+
def __init__(
|
71
|
+
self,
|
72
|
+
base_url: str,
|
73
|
+
max_pages: int = 100,
|
74
|
+
max_depth: int = 2,
|
75
|
+
concurrency: int = 5, # Reduzido para evitar sobrecarga
|
76
|
+
follow_subdomains: bool = False,
|
77
|
+
user_agent: Optional[str] = None,
|
78
|
+
stealth: Optional["StealthMode"] = None,
|
79
|
+
request_delay: Tuple[float, float] = (1.0, 3.0), # Atraso aleatório entre requisições (min, max)
|
80
|
+
timeout: float = 30.0, # Timeout para requisições
|
81
|
+
verify_ssl: bool = True, # Verificar certificados SSL
|
82
|
+
max_redirects: int = 5, # Número máximo de redirecionamentos
|
83
|
+
respect_robots: bool = True, # Respeitar robots.txt
|
84
|
+
):
|
85
|
+
self.base_url = base_url.rstrip("/")
|
86
|
+
self.max_pages = max_pages
|
87
|
+
self.max_depth = max_depth
|
88
|
+
self.concurrency = concurrency
|
89
|
+
self.follow_subdomains = follow_subdomains
|
90
|
+
|
91
|
+
# Configurações de requisição
|
92
|
+
self.request_delay = request_delay
|
93
|
+
self.timeout = timeout
|
94
|
+
self.max_redirects = max_redirects
|
95
|
+
self.verify_ssl = verify_ssl
|
96
|
+
self.respect_robots = respect_robots
|
97
|
+
|
98
|
+
# Configurações de stealth
|
99
|
+
self.stealth = stealth
|
100
|
+
self.user_agent = user_agent or random.choice(USER_AGENTS)
|
101
|
+
self.session_cookies: Dict[str, str] = {}
|
102
|
+
self.last_request_time: float = 0
|
103
|
+
|
104
|
+
# Configurações de domínio
|
105
|
+
self.parsed_base_url = self._parse_url(base_url)
|
106
|
+
self.base_domain = self._get_base_domain(self.parsed_base_url.hostname or '')
|
107
|
+
self.allowed_domains = {self.base_domain}
|
108
|
+
if follow_subdomains:
|
109
|
+
self.allowed_domains.add(f".{self.base_domain}")
|
110
|
+
|
111
|
+
# Estado do crawler
|
112
|
+
self.visited: Set[str] = set()
|
113
|
+
self.results: Dict[str, CrawlPage] = {}
|
114
|
+
self.robots_txt: Optional[Dict[str, Any]] = None
|
115
|
+
|
116
|
+
# Configuração do cliente HTTP
|
117
|
+
self.session: Optional[httpx.AsyncClient] = None
|
118
|
+
self.sem: Optional[asyncio.Semaphore] = None
|
119
|
+
|
120
|
+
async def _init_session(self) -> None:
|
121
|
+
"""Inicializa a sessão HTTP com configurações de segurança e performance."""
|
122
|
+
# Configuração SSL
|
123
|
+
ssl_context = ssl.create_default_context(cafile=certifi.where())
|
124
|
+
if not self.verify_ssl:
|
125
|
+
ssl_context.check_hostname = False
|
126
|
+
ssl_context.verify_mode = ssl.CERT_NONE
|
127
|
+
|
128
|
+
# Configuração do transporte HTTP
|
129
|
+
limits = httpx.Limits(
|
130
|
+
max_keepalive_connections=10,
|
131
|
+
max_connections=20,
|
132
|
+
keepalive_expiry=60.0
|
133
|
+
)
|
134
|
+
|
135
|
+
# Configuração do cliente HTTP
|
136
|
+
self.session = httpx.AsyncClient(
|
137
|
+
timeout=self.timeout,
|
138
|
+
follow_redirects=True,
|
139
|
+
max_redirects=self.max_redirects,
|
140
|
+
http_versions=["HTTP/1.1", "HTTP/2"],
|
141
|
+
limits=limits,
|
142
|
+
verify=ssl_context if self.verify_ssl else False,
|
143
|
+
headers=DEFAULT_HEADERS.copy(),
|
144
|
+
cookies=self.session_cookies
|
145
|
+
)
|
146
|
+
|
147
|
+
# Atualiza o user-agent
|
148
|
+
if self.user_agent:
|
149
|
+
self.session.headers["User-Agent"] = self.user_agent
|
150
|
+
|
151
|
+
# Adiciona headers adicionais de stealth
|
152
|
+
self.session.headers.update({
|
153
|
+
"Accept-Language": "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7",
|
154
|
+
"Accept-Encoding": "gzip, deflate, br",
|
155
|
+
"DNT": "1",
|
156
|
+
"Upgrade-Insecure-Requests": "1"
|
157
|
+
})
|
158
|
+
|
159
|
+
# Configura o semáforo para limitar concorrência
|
160
|
+
self.sem = asyncio.Semaphore(self.concurrency)
|
161
|
+
|
162
|
+
# Se necessário, verifica o robots.txt
|
163
|
+
if self.respect_robots:
|
164
|
+
await self._check_robots_txt()
|
165
|
+
|
166
|
+
async def _check_robots_txt(self) -> None:
|
167
|
+
"""Verifica o arquivo robots.txt e atualiza as regras de acesso."""
|
168
|
+
if not self.session:
|
169
|
+
return
|
170
|
+
|
171
|
+
robots_url = f"{self.parsed_base_url.scheme}://{self.parsed_base_url.netloc}/robots.txt"
|
172
|
+
try:
|
173
|
+
response = await self.session.get(robots_url)
|
174
|
+
if response.status_code == 200:
|
175
|
+
# Aqui você pode implementar um parser de robots.txt mais sofisticado
|
176
|
+
self.robots_txt = {"content": response.text}
|
177
|
+
logger.info("robots_txt_found", url=robots_url)
|
178
|
+
except Exception as e:
|
179
|
+
logger.warning("robots_txt_error", url=robots_url, error=str(e))
|
180
|
+
|
181
|
+
async def _random_delay(self) -> None:
|
182
|
+
"""Aguarda um tempo aleatório entre requisições para evitar bloqueios."""
|
183
|
+
if self.request_delay:
|
184
|
+
min_delay, max_delay = self.request_delay
|
185
|
+
delay = random.uniform(min_delay, max_delay)
|
186
|
+
elapsed = time.time() - self.last_request_time
|
187
|
+
if elapsed < delay:
|
188
|
+
await asyncio.sleep(delay - elapsed)
|
189
|
+
self.last_request_time = time.time()
|
190
|
+
|
191
|
+
async def crawl(self) -> Dict[str, CrawlPage]:
|
192
|
+
"""Inicia o processo de rastreamento do site.
|
193
|
+
|
194
|
+
Returns:
|
195
|
+
Dict[str, CrawlPage]: Dicionário com as páginas encontradas, onde a chave é a URL.
|
196
|
+
"""
|
197
|
+
# Inicializa a sessão HTTP
|
198
|
+
if not self.session:
|
199
|
+
await self._init_session()
|
200
|
+
|
201
|
+
# Inicializa a fila de URLs a serem processadas
|
202
|
+
queue: asyncio.Queue = asyncio.Queue()
|
203
|
+
initial_url = f"{self.parsed_base_url.scheme}://{self.parsed_base_url.netloc}"
|
204
|
+
await queue.put((initial_url, 0))
|
205
|
+
|
206
|
+
# Função worker para processar URLs em paralelo
|
207
|
+
async def worker() -> None:
|
208
|
+
while True:
|
209
|
+
try:
|
210
|
+
url, depth = queue.get_nowait()
|
211
|
+
except asyncio.QueueEmpty:
|
212
|
+
break
|
213
|
+
|
214
|
+
# Verifica os limites de páginas e profundidade
|
215
|
+
if len(self.results) >= self.max_pages or depth > self.max_depth:
|
216
|
+
continue
|
217
|
+
|
218
|
+
# Evita processar a mesma URL múltiplas vezes
|
219
|
+
if url in self.visited:
|
220
|
+
continue
|
221
|
+
|
222
|
+
# Aguarda um tempo aleatório entre requisições
|
223
|
+
await self._random_delay()
|
224
|
+
|
225
|
+
# Processa a URL
|
226
|
+
await self._fetch(url, depth, queue)
|
227
|
+
|
228
|
+
# Atualiza o contador de páginas processadas
|
229
|
+
queue.task_done()
|
230
|
+
|
231
|
+
# Inicia os workers
|
232
|
+
workers = [asyncio.create_task(worker()) for _ in range(self.concurrency)]
|
233
|
+
await asyncio.gather(*workers)
|
234
|
+
return self.results
|
235
|
+
|
236
|
+
def _parse_url(self, url: str) -> httpx.URL:
|
237
|
+
"""Parseia uma URL e retorna um objeto URL do httpx."""
|
238
|
+
try:
|
239
|
+
return httpx.URL(url)
|
240
|
+
except Exception as e:
|
241
|
+
logger.error("url_parse_error", url=url, error=str(e))
|
242
|
+
raise ValueError(f"URL inválida: {url}") from e
|
243
|
+
|
244
|
+
def _get_base_domain(self, hostname: str) -> str:
|
245
|
+
"""Extrai o domínio base de um hostname."""
|
246
|
+
if not hostname:
|
247
|
+
return ""
|
248
|
+
parts = hostname.split(".")
|
249
|
+
if len(parts) > 2:
|
250
|
+
return ".".join(parts[-2:])
|
251
|
+
return hostname
|
252
|
+
|
253
|
+
def _is_same_domain(self, url: str) -> bool:
|
254
|
+
"""Verifica se uma URL pertence ao mesmo domínio do alvo."""
|
255
|
+
try:
|
256
|
+
parsed = self._parse_url(url)
|
257
|
+
if not parsed.host:
|
258
|
+
return False
|
259
|
+
|
260
|
+
# Verifica se o domínio é o mesmo ou um subdomínio
|
261
|
+
if self.follow_subdomains:
|
262
|
+
return parsed.host.endswith(self.base_domain) or f".{parsed.host}".endswith(f".{self.base_domain}")
|
263
|
+
return parsed.host == self.parsed_base_url.host
|
264
|
+
except Exception:
|
265
|
+
return False
|
266
|
+
|
267
|
+
def _normalize_url(self, url: str, base_url: Optional[str] = None) -> str:
|
268
|
+
"""Normaliza uma URL, resolvendo URLs relativas e removendo fragmentos."""
|
269
|
+
try:
|
270
|
+
if not url:
|
271
|
+
return ""
|
272
|
+
|
273
|
+
# Remove fragmentos e espaços em branco
|
274
|
+
url = url.split("#")[0].strip()
|
275
|
+
if not url:
|
276
|
+
return ""
|
277
|
+
|
278
|
+
# Se for uma URL relativa, resolve em relação à base_url
|
279
|
+
if base_url and not url.startswith(('http://', 'https://')):
|
280
|
+
base = self._parse_url(base_url)
|
281
|
+
url = str(base.join(url))
|
282
|
+
|
283
|
+
# Parseia a URL para normalização
|
284
|
+
parsed = self._parse_url(url)
|
285
|
+
|
286
|
+
# Remove parâmetros de rastreamento comuns
|
287
|
+
if parsed.query:
|
288
|
+
query_params = []
|
289
|
+
for param in parsed.query.decode().split('&'):
|
290
|
+
if '=' in param and any(t in param.lower() for t in ['utm_', 'ref=', 'source=', 'fbclid=', 'gclid=']):
|
291
|
+
continue
|
292
|
+
query_params.append(param)
|
293
|
+
|
294
|
+
# Reconstrói a URL sem os parâmetros de rastreamento
|
295
|
+
if query_params:
|
296
|
+
parsed = parsed.copy_with(query='&'.join(query_params))
|
297
|
+
else:
|
298
|
+
parsed = parsed.copy_with(query=None)
|
299
|
+
|
300
|
+
# Remove barras finais desnecessárias
|
301
|
+
path = parsed.path.decode()
|
302
|
+
if path.endswith('/'):
|
303
|
+
path = path.rstrip('/') or '/'
|
304
|
+
parsed = parsed.copy_with(path=path)
|
305
|
+
|
306
|
+
return str(parsed)
|
307
|
+
|
308
|
+
except Exception as e:
|
309
|
+
logger.warning("url_normalize_error", url=url, error=str(e))
|
310
|
+
return url
|
311
|
+
|
312
|
+
def _build_headers(self, referer: Optional[str] = None) -> Dict[str, str]:
|
313
|
+
"""Constrói os headers para a requisição HTTP."""
|
314
|
+
headers = DEFAULT_HEADERS.copy()
|
315
|
+
|
316
|
+
# Rotaciona o User-Agent
|
317
|
+
headers["User-Agent"] = random.choice(USER_AGENTS)
|
318
|
+
|
319
|
+
# Adiciona o referer se fornecido
|
320
|
+
if referer:
|
321
|
+
headers["Referer"] = referer
|
322
|
+
else:
|
323
|
+
headers["Referer"] = random.choice(REFERRERS)
|
324
|
+
|
325
|
+
return headers
|
326
|
+
|
327
|
+
async def _stealth_delay(self) -> None:
|
328
|
+
"""Aplica um atraso aleatório para evitar detecção."""
|
329
|
+
if self.stealth and hasattr(self.stealth, 'get_delay'):
|
330
|
+
delay = self.stealth.get_delay()
|
331
|
+
if delay > 0:
|
332
|
+
await asyncio.sleep(delay)
|
333
|
+
|
334
|
+
async def _fetch(self, url: str, depth: int, queue: asyncio.Queue) -> None:
|
335
|
+
"""
|
336
|
+
Faz o fetch de uma URL e processa os links encontrados.
|
337
|
+
|
338
|
+
Args:
|
339
|
+
url: URL a ser acessada
|
340
|
+
depth: Profundidade atual do rastreamento
|
341
|
+
queue: Fila de URLs para processamento
|
342
|
+
"""
|
343
|
+
if not self.session:
|
344
|
+
logger.error("session_not_initialized")
|
345
|
+
return
|
346
|
+
|
347
|
+
# Marca a URL como visitada
|
348
|
+
self.visited.add(url)
|
349
|
+
|
350
|
+
try:
|
351
|
+
# Aplica atraso de stealth, se necessário
|
352
|
+
await self._stealth_delay()
|
353
|
+
|
354
|
+
# Prepara os headers para a requisição
|
355
|
+
headers = self._build_headers()
|
356
|
+
|
357
|
+
# Tenta fazer a requisição com tratamento de erros
|
358
|
+
try:
|
359
|
+
response = await self.session.get(
|
360
|
+
url,
|
361
|
+
headers=headers,
|
362
|
+
follow_redirects=True,
|
363
|
+
timeout=self.timeout
|
364
|
+
)
|
365
|
+
|
366
|
+
# Registra o tempo da última requisição
|
367
|
+
self.last_request_time = time.time()
|
368
|
+
|
369
|
+
except httpx.HTTPStatusError as e:
|
370
|
+
logger.warning("http_status_error", url=url, status_code=e.response.status_code)
|
371
|
+
self.results[url] = CrawlPage(
|
372
|
+
url=url,
|
373
|
+
status=e.response.status_code,
|
374
|
+
error=f"HTTP Error: {e.response.status_code}"
|
375
|
+
)
|
376
|
+
return
|
377
|
+
|
378
|
+
except httpx.RequestError as e:
|
379
|
+
logger.warning("request_error", url=url, error=str(e))
|
380
|
+
self.results[url] = CrawlPage(
|
381
|
+
url=url,
|
382
|
+
status=0,
|
383
|
+
error=f"Request Error: {str(e)}"
|
384
|
+
)
|
385
|
+
return
|
386
|
+
|
387
|
+
except Exception as e:
|
388
|
+
logger.error("unexpected_error", url=url, error=str(e))
|
389
|
+
self.results[url] = CrawlPage(
|
390
|
+
url=url,
|
391
|
+
status=0,
|
392
|
+
error=f"Unexpected Error: {str(e)}"
|
393
|
+
)
|
394
|
+
return
|
395
|
+
|
396
|
+
# Processa a resposta
|
397
|
+
await self._process_response(url, response, depth, queue)
|
398
|
+
|
399
|
+
except Exception as e:
|
400
|
+
logger.error("fetch_error", url=url, error=str(e))
|
401
|
+
self.results[url] = CrawlPage(
|
402
|
+
url=url,
|
403
|
+
status=0,
|
404
|
+
error=f"Processing Error: {str(e)}"
|
405
|
+
)
|
406
|
+
|
407
|
+
async def _process_response(self, url: str, response: httpx.Response, depth: int, queue: asyncio.Queue) -> None:
|
408
|
+
"""
|
409
|
+
Processa a resposta HTTP e extrai links para continuar o rastreamento.
|
410
|
+
|
411
|
+
Args:
|
412
|
+
url: URL que foi acessada
|
413
|
+
response: Resposta HTTP
|
414
|
+
depth: Profundidade atual do rastreamento
|
415
|
+
queue: Fila de URLs para processamento
|
416
|
+
"""
|
417
|
+
# Cria o objeto da página com os dados básicos
|
418
|
+
page = CrawlPage(
|
419
|
+
url=url,
|
420
|
+
status=response.status_code,
|
421
|
+
redirect_chain=[(str(r.url), r.status_code) for r in response.history]
|
422
|
+
)
|
423
|
+
|
424
|
+
# Se não for uma resposta de sucesso ou não for HTML, retorna
|
425
|
+
if response.status_code >= 400 or not response.headers.get("content-type", "").startswith("text"):
|
426
|
+
self.results[url] = page
|
427
|
+
return
|
428
|
+
|
429
|
+
try:
|
430
|
+
# Parseia o HTML
|
431
|
+
parser = HTMLParser(response.text)
|
432
|
+
|
433
|
+
# Extrai o título da página
|
434
|
+
title = parser.css_first("title")
|
435
|
+
if title and hasattr(title, 'text') and callable(title.text):
|
436
|
+
page.title = title.text(strip=True)
|
437
|
+
|
438
|
+
# Extrai os links da página
|
439
|
+
await self._extract_links(parser, url, depth, queue)
|
440
|
+
|
441
|
+
# Extrai os formulários da página
|
442
|
+
self._extract_forms(parser, page)
|
443
|
+
|
444
|
+
# Adiciona a página aos resultados
|
445
|
+
self.results[url] = page
|
446
|
+
|
447
|
+
except Exception as e:
|
448
|
+
logger.error("process_response_error", url=url, error=str(e))
|
449
|
+
page.error = f"Error processing response: {str(e)}"
|
450
|
+
self.results[url] = page
|
451
|
+
|
452
|
+
async def _extract_links(self, parser: HTMLParser, base_url: str, depth: int, queue: asyncio.Queue) -> None:
|
453
|
+
"""Extrai links do HTML e os adiciona à fila de processamento."""
|
454
|
+
for link in parser.css("a[href]"):
|
455
|
+
try:
|
456
|
+
href = link.attributes.get("href", "").strip()
|
457
|
+
if not href or href.startswith("#") or href.startswith("javascript:"):
|
458
|
+
continue
|
459
|
+
|
460
|
+
# Normaliza a URL
|
461
|
+
url = self._normalize_url(href, base_url)
|
462
|
+
if not url:
|
463
|
+
continue
|
464
|
+
|
465
|
+
# Verifica se a URL pertence ao mesmo domínio
|
466
|
+
if not self._is_same_domain(url):
|
467
|
+
continue
|
468
|
+
|
469
|
+
# Adiciona à fila se ainda não foi visitada
|
470
|
+
if url not in self.visited and url not in self.results:
|
471
|
+
queue.put_nowait((url, depth + 1))
|
472
|
+
|
473
|
+
except Exception as e:
|
474
|
+
logger.warning("link_extraction_error", href=href, error=str(e))
|
475
|
+
|
476
|
+
def _extract_forms(self, parser: HTMLParser, page: CrawlPage) -> None:
|
477
|
+
"""Extrai formulários do HTML."""
|
478
|
+
for form in parser.css("form"):
|
479
|
+
try:
|
480
|
+
form_data = {"method": form.attributes.get("method", "GET").upper()}
|
481
|
+
|
482
|
+
# Obtém a ação do formulário
|
483
|
+
action = form.attributes.get("action", "").strip()
|
484
|
+
if action:
|
485
|
+
form_data["action"] = self._normalize_url(action, page.url)
|
486
|
+
else:
|
487
|
+
form_data["action"] = page.url
|
488
|
+
|
489
|
+
# Extrai os campos do formulário
|
490
|
+
form_data["fields"] = []
|
491
|
+
for field in form.css("input, textarea, select"):
|
492
|
+
field_data = {
|
493
|
+
"name": field.attributes.get("name", ""),
|
494
|
+
"type": field.attributes.get("type", "text"),
|
495
|
+
"value": field.attributes.get("value", ""),
|
496
|
+
"required": "required" in field.attributes
|
497
|
+
}
|
498
|
+
form_data["fields"].append(field_data)
|
499
|
+
|
500
|
+
page.forms.append(form_data)
|
501
|
+
|
502
|
+
except Exception as e:
|
503
|
+
logger.warning("form_extraction_error", error=str(e))
|
504
|
+
|
505
|
+
async def close(self) -> None:
|
506
|
+
"""Fecha a sessão HTTP."""
|
507
|
+
if self.session:
|
508
|
+
await self.session.aclose()
|
509
|
+
self.session = None
|
510
|
+
|
511
|
+
async def __aenter__(self):
|
512
|
+
await self._init_session()
|
513
|
+
return self
|
514
|
+
|
515
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
516
|
+
await self.close()
|
517
|
+
|
518
|
+
|
519
|
+
# Para compatibilidade com código existente
|
520
|
+
__all__ = ["WebCrawler", "CrawlPage"]
|