clhostmap 1.0.0__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.
@@ -0,0 +1,80 @@
1
+ Metadata-Version: 2.4
2
+ Name: clhostmap
3
+ Version: 1.0.0
4
+ Summary: Tool to check if other people have tried impersonating your company/website.
5
+ Project-URL: Repository, https://github.com/SphericalFlower52811/clhostmap
6
+ Keywords: osint,brand-protection,typosquatting,phishing-recon,subdomain-scanner,cybersecurity-tools
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: curl_cffi
10
+ Requires-Dist: tldextract>=5.1.0
11
+ Requires-Dist: colorama>=0.4.6
12
+
13
+ # ClHostMap: A tool to check if your website has been impersonated.
14
+
15
+ ## What is ClHostMap?
16
+
17
+ ClHostMap is a tool that checks many cloud providers, and many TLDs for whether your website has been registered by other people.
18
+
19
+ ## Why use ClHostMap?
20
+
21
+ People often impersonate brands or companies by hosting it on a different TLD like `.net` instead of `.com`, or hosting a website with the same brand name but using a cloud hosting platform so that it is free, like using `.vercel.app` or `.pages.dev` because `.com` is registered.
22
+
23
+ Additionally, if your original company is hosted on a cloud provider for free instead of `.com`, other people can register a domain on `.com` and impersonate you.
24
+
25
+ ClHostMap allows you to input your brand name, and the tool automatically checks many TLDs and host providers. Check the features for more details.
26
+
27
+ ## Features
28
+
29
+ Features of ClHostMap include:
30
+
31
+ - Using a hash to check every TLD and host provider, as some host providers return a 200 OK response code but on the frontend say it is fake. This ensures no false positives will be captured.
32
+ - With 954 different TLDs in total and 66 cloud providers, the tool checks a total of 1020 different places an impersonated version of your website can be hosted.
33
+ - Asynchronous function so that it runs hundreds of checks all at once.
34
+
35
+ ### All Arguments
36
+
37
+ | Flag / Argument | Short | Default | Description |
38
+ | :-------------------- | :---------------------- | :------ | :----------------------------------------------------------------------------------------------------------------------------------- |
39
+ | `site` | _None_ | _None_ | URL or brand name to verify. |
40
+ | `--show-unregistered` | `-su` | `False` | Display unregistered domains as well. |
41
+ | `--show_status` | `-ss` | `False` | Provide status codes/errors for every domain checked (forces -su). |
42
+ | `--self-registered` | <code>&#8209;sr</code> | _None_ | Domains that you yourself have registered, so that those domains will be ignored. Use comma-separated values or path to a text file. |
43
+ | `--only-results` | <code>&#8209;or</code> | `False` | Only print the result |
44
+ | `--concurrent-req` | <code>&#8209;ccr</code> | `100` | Maximum number of async requests, default 100. |
45
+
46
+ ## Installation and Usage
47
+
48
+ ### Installation
49
+
50
+ To install on MacOS/Linux:
51
+
52
+ ```bash
53
+ python3 -m pip install clhostmap
54
+ ```
55
+
56
+ To install on Windows:
57
+
58
+ ```
59
+ py -m pip install clhostmap
60
+ ```
61
+
62
+ ### Usage
63
+
64
+ Run default scan:
65
+
66
+ ```
67
+ clhostmap example.com
68
+ ```
69
+
70
+ Run scan with 240 concurrent requests and to see status codes:
71
+
72
+ ```
73
+ clhostmap example.com -ss -ccr 240
74
+ ```
75
+
76
+ ## Upcoming additions
77
+
78
+ New features include:
79
+
80
+ - Adding a flag to check for typosquatted versions of your website on every TLD and cloud provider, using multiple typosquatting algorithms.
@@ -0,0 +1,68 @@
1
+ # ClHostMap: A tool to check if your website has been impersonated.
2
+
3
+ ## What is ClHostMap?
4
+
5
+ ClHostMap is a tool that checks many cloud providers, and many TLDs for whether your website has been registered by other people.
6
+
7
+ ## Why use ClHostMap?
8
+
9
+ People often impersonate brands or companies by hosting it on a different TLD like `.net` instead of `.com`, or hosting a website with the same brand name but using a cloud hosting platform so that it is free, like using `.vercel.app` or `.pages.dev` because `.com` is registered.
10
+
11
+ Additionally, if your original company is hosted on a cloud provider for free instead of `.com`, other people can register a domain on `.com` and impersonate you.
12
+
13
+ ClHostMap allows you to input your brand name, and the tool automatically checks many TLDs and host providers. Check the features for more details.
14
+
15
+ ## Features
16
+
17
+ Features of ClHostMap include:
18
+
19
+ - Using a hash to check every TLD and host provider, as some host providers return a 200 OK response code but on the frontend say it is fake. This ensures no false positives will be captured.
20
+ - With 954 different TLDs in total and 66 cloud providers, the tool checks a total of 1020 different places an impersonated version of your website can be hosted.
21
+ - Asynchronous function so that it runs hundreds of checks all at once.
22
+
23
+ ### All Arguments
24
+
25
+ | Flag / Argument | Short | Default | Description |
26
+ | :-------------------- | :---------------------- | :------ | :----------------------------------------------------------------------------------------------------------------------------------- |
27
+ | `site` | _None_ | _None_ | URL or brand name to verify. |
28
+ | `--show-unregistered` | `-su` | `False` | Display unregistered domains as well. |
29
+ | `--show_status` | `-ss` | `False` | Provide status codes/errors for every domain checked (forces -su). |
30
+ | `--self-registered` | <code>&#8209;sr</code> | _None_ | Domains that you yourself have registered, so that those domains will be ignored. Use comma-separated values or path to a text file. |
31
+ | `--only-results` | <code>&#8209;or</code> | `False` | Only print the result |
32
+ | `--concurrent-req` | <code>&#8209;ccr</code> | `100` | Maximum number of async requests, default 100. |
33
+
34
+ ## Installation and Usage
35
+
36
+ ### Installation
37
+
38
+ To install on MacOS/Linux:
39
+
40
+ ```bash
41
+ python3 -m pip install clhostmap
42
+ ```
43
+
44
+ To install on Windows:
45
+
46
+ ```
47
+ py -m pip install clhostmap
48
+ ```
49
+
50
+ ### Usage
51
+
52
+ Run default scan:
53
+
54
+ ```
55
+ clhostmap example.com
56
+ ```
57
+
58
+ Run scan with 240 concurrent requests and to see status codes:
59
+
60
+ ```
61
+ clhostmap example.com -ss -ccr 240
62
+ ```
63
+
64
+ ## Upcoming additions
65
+
66
+ New features include:
67
+
68
+ - Adding a flag to check for typosquatted versions of your website on every TLD and cloud provider, using multiple typosquatting algorithms.
@@ -0,0 +1,80 @@
1
+ Metadata-Version: 2.4
2
+ Name: clhostmap
3
+ Version: 1.0.0
4
+ Summary: Tool to check if other people have tried impersonating your company/website.
5
+ Project-URL: Repository, https://github.com/SphericalFlower52811/clhostmap
6
+ Keywords: osint,brand-protection,typosquatting,phishing-recon,subdomain-scanner,cybersecurity-tools
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: curl_cffi
10
+ Requires-Dist: tldextract>=5.1.0
11
+ Requires-Dist: colorama>=0.4.6
12
+
13
+ # ClHostMap: A tool to check if your website has been impersonated.
14
+
15
+ ## What is ClHostMap?
16
+
17
+ ClHostMap is a tool that checks many cloud providers, and many TLDs for whether your website has been registered by other people.
18
+
19
+ ## Why use ClHostMap?
20
+
21
+ People often impersonate brands or companies by hosting it on a different TLD like `.net` instead of `.com`, or hosting a website with the same brand name but using a cloud hosting platform so that it is free, like using `.vercel.app` or `.pages.dev` because `.com` is registered.
22
+
23
+ Additionally, if your original company is hosted on a cloud provider for free instead of `.com`, other people can register a domain on `.com` and impersonate you.
24
+
25
+ ClHostMap allows you to input your brand name, and the tool automatically checks many TLDs and host providers. Check the features for more details.
26
+
27
+ ## Features
28
+
29
+ Features of ClHostMap include:
30
+
31
+ - Using a hash to check every TLD and host provider, as some host providers return a 200 OK response code but on the frontend say it is fake. This ensures no false positives will be captured.
32
+ - With 954 different TLDs in total and 66 cloud providers, the tool checks a total of 1020 different places an impersonated version of your website can be hosted.
33
+ - Asynchronous function so that it runs hundreds of checks all at once.
34
+
35
+ ### All Arguments
36
+
37
+ | Flag / Argument | Short | Default | Description |
38
+ | :-------------------- | :---------------------- | :------ | :----------------------------------------------------------------------------------------------------------------------------------- |
39
+ | `site` | _None_ | _None_ | URL or brand name to verify. |
40
+ | `--show-unregistered` | `-su` | `False` | Display unregistered domains as well. |
41
+ | `--show_status` | `-ss` | `False` | Provide status codes/errors for every domain checked (forces -su). |
42
+ | `--self-registered` | <code>&#8209;sr</code> | _None_ | Domains that you yourself have registered, so that those domains will be ignored. Use comma-separated values or path to a text file. |
43
+ | `--only-results` | <code>&#8209;or</code> | `False` | Only print the result |
44
+ | `--concurrent-req` | <code>&#8209;ccr</code> | `100` | Maximum number of async requests, default 100. |
45
+
46
+ ## Installation and Usage
47
+
48
+ ### Installation
49
+
50
+ To install on MacOS/Linux:
51
+
52
+ ```bash
53
+ python3 -m pip install clhostmap
54
+ ```
55
+
56
+ To install on Windows:
57
+
58
+ ```
59
+ py -m pip install clhostmap
60
+ ```
61
+
62
+ ### Usage
63
+
64
+ Run default scan:
65
+
66
+ ```
67
+ clhostmap example.com
68
+ ```
69
+
70
+ Run scan with 240 concurrent requests and to see status codes:
71
+
72
+ ```
73
+ clhostmap example.com -ss -ccr 240
74
+ ```
75
+
76
+ ## Upcoming additions
77
+
78
+ New features include:
79
+
80
+ - Adding a flag to check for typosquatted versions of your website on every TLD and cloud provider, using multiple typosquatting algorithms.
@@ -0,0 +1,11 @@
1
+ README.md
2
+ pyproject.toml
3
+ clhostmap.egg-info/PKG-INFO
4
+ clhostmap.egg-info/SOURCES.txt
5
+ clhostmap.egg-info/dependency_links.txt
6
+ clhostmap.egg-info/entry_points.txt
7
+ clhostmap.egg-info/requires.txt
8
+ clhostmap.egg-info/top_level.txt
9
+ clhostmapcode/__init__.py
10
+ clhostmapcode/hostlist.py
11
+ clhostmapcode/main.py
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ clhostmap = clhostmapcode.main:chtrack
@@ -0,0 +1,3 @@
1
+ curl_cffi
2
+ tldextract>=5.1.0
3
+ colorama>=0.4.6
@@ -0,0 +1 @@
1
+ clhostmapcode
File without changes
@@ -0,0 +1,145 @@
1
+ host_suffixes = [".vercel.app", ".netlify.app", ".pages.dev", ".github.io",
2
+ ".gitlab.io", ".stormkit.io", ".surge.sh", ".amplifyapp.com",
3
+ ".herokuapp.com", ".railway.app", ".onrender.com", ".fly.dev",
4
+ ".zeabur.app", ".koyeb.app", ".cleverapps.io", ".scw.cloud",
5
+ ".up.railway.app", ".alwaysdata.net", ".qovery.app", ".northflank.app",
6
+ ".porter.run", ".back4app.io", ".cyclic.app", ".choreoapps.dev",
7
+ ".pythonanywhere.com", ".streamlit.app", ".hf.space", ".gradio.live",
8
+ ".anvil.app", ".modal.run", ".wasmer.app", ".supabase.co", ".web.app",
9
+ ".firebaseapp.com", ".supabase.com", ".appwriteapp.com", ".parseapp.com",
10
+ ".wixsite.com", ".weebly.com", ".webflow.io", ".squarespace.com",
11
+ ".wordpress.com", ".ghost.io", ".framer.app", ".framer.website",
12
+ ".bubbleapps.io", ".carrd.co", ".pantheonsite.io", ".shopifypreview.com",
13
+ ".myshopify.com", ".rhcloud.com", ".oraclecloud.com", ".fleek.co", ".ipfs.dweb.link",
14
+ ".repl.co", ".replit.app", ".glitch.me", ".codeanywhere.com", ".js.org", ".is-a.dev",
15
+ ".is-a.software", ".thedev.id", ".dedyn.io", ".eu.org", ".ngrok-free.app", ".loca.lt"]
16
+ country_tlds = [".ac", ".ad", ".ae", ".af", ".ag", ".ai", ".al", ".am", ".ao", ".aq",
17
+ ".ar", ".as", ".at", ".au", ".aw", ".ax", ".az", ".ba", ".bb", ".bd",
18
+ ".be", ".bf", ".bg", ".bh", ".bi", ".bj", ".bl", ".bm", ".bn", ".bo",
19
+ ".bq", ".br", ".bs", ".bt", ".bv", ".bw", ".by", ".bz", ".ca", ".cc",
20
+ ".cd", ".cf", ".cg", ".ch", ".ci", ".ck", ".cl", ".cm", ".cn", ".co",
21
+ ".cr", ".cu", ".cv", ".cw", ".cx", ".cy", ".cz", ".de", ".dj", ".dk",
22
+ ".dm", ".do", ".dz", ".ec", ".ee", ".eg", ".eh", ".er", ".es", ".et",
23
+ ".eu", ".fi", ".fj", ".fk", ".fm", ".fo", ".fr", ".ga", ".gd", ".ge",
24
+ ".gf", ".gg", ".gh", ".gi", ".gl", ".gm", ".gn", ".gp", ".gq", ".gr",
25
+ ".gs", ".gt", ".gu", ".gw", ".gy", ".hk", ".hm", ".hn", ".hr", ".ht",
26
+ ".hu", ".id", ".ie", ".il", ".im", ".in", ".io", ".iq", ".ir", ".is",
27
+ ".it", ".je", ".jm", ".jo", ".jp", ".ke", ".kh", ".ki", ".km", ".kn",
28
+ ".kp", ".kr", ".kw", ".ky", ".kz", ".la", ".lb", ".lc", ".li", ".lk",
29
+ ".lr", ".ls", ".lt", ".lu", ".lv", ".ly", ".ma", ".mc", ".md", ".me",
30
+ ".mf", ".mg", ".mh", ".mk", ".ml", ".mm", ".mn", ".mo", ".mp", ".mq",
31
+ ".mr", ".ms", ".mt", ".mu", ".mv", ".mw", ".mx", ".my", ".mz", ".na",
32
+ ".nc", ".ne", ".nf", ".ng", ".ni", ".nl", ".no", ".np", ".nr", ".nu",
33
+ ".nz", ".om", ".pa", ".pe", ".pf", ".pg", ".ph", ".pk", ".pl", ".pm",
34
+ ".pn", ".pr", ".ps", ".pt", ".pw", ".py", ".qa", ".re", ".ro", ".rs",
35
+ ".ru", ".rw", ".sa", ".sb", ".sc", ".sd", ".se", ".sg", ".sh", ".si",
36
+ ".sj", ".sk", ".sl", ".sm", ".sn", ".so", ".sr", ".ss", ".st", ".su",
37
+ ".sv", ".sx", ".sy", ".sz", ".tc", ".td", ".tf", ".tg", ".th", ".tj",
38
+ ".tk", ".tl", ".tm", ".tn", ".to", ".tr", ".tt", ".tv", ".tw", ".tz",
39
+ ".ua", ".ug", ".uk", ".us", ".uy", ".uz", ".va", ".vc", ".ve", ".vg",
40
+ ".vi", ".vn", ".vu", ".wf", ".ws", ".ye", ".yt", ".za", ".zm", ".zw"
41
+ ]
42
+
43
+ generic_tlds_part1 = [
44
+ ".com", ".org", ".net", ".info", ".biz", ".name", ".xyz", ".top", ".club", ".online",
45
+ ".site", ".tech", ".store", ".app", ".dev", ".link", ".website", ".live", ".space", ".shop",
46
+ ".work", ".click", ".vip", ".loan", ".win", ".men", ".bid", ".stream", ".download", ".accountant",
47
+ ".trade", ".science", ".cricket", ".party", ".faith", ".webcam", ".gdn", ".date", ".racing", ".review",
48
+ ".web", ".cloud", ".digital", ".agency", ".marketing", ".studio", ".design", ".photography", ".media", ".news",
49
+ ".today", ".world", ".global", ".international", ".expert", ".guru", ".solutions", ".systems", ".services", ".support",
50
+ ".network", ".company", ".business", ".enterprise", ".ltd", ".inc", ".pro", ".mobi", ".tel", ".asia",
51
+ ".cat", ".jobs", ".travel", ".museum", ".coop", ".aero", ".icu", ".cyou", ".monster", ".fun",
52
+ ".buzz", ".lol", ".wtf", ".fail", ".rocks", ".cool", ".best", ".money", ".gold", ".finance",
53
+ ".capital", ".investments", ".exchange", ".market", ".trading", ".bank", ".credit", ".cards", ".cash", ".tax",
54
+ ".pay", ".secure", ".safe", ".protection", ".security", ".legal", ".law", ".court", ".health", ".clinic",
55
+ ".doctor", ".hospital", ".care", ".life", ".fit", ".games", ".play", ".casino", ".bet", ".poker",
56
+ ".bingo", ".lotto", ".run", ".walk", ".ride", ".family", ".mom", ".dad", ".kids", ".baby",
57
+ ".pet", ".dog", ".home", ".house", ".rent", ".buy", ".sale", ".discount", ".coupons", ".deals",
58
+ ".cheap", ".free", ".bargain", ".save", ".academy", ".accountants", ".actor", ".ads", ".adult", ".affiliate",
59
+ ".apartments", ".arch", ".architect", ".army", ".art", ".associates", ".attorney", ".auction", ".audio", ".auto",
60
+ ".autos", ".band", ".bar", ".bargains", ".baseball", ".basketball", ".beauty", ".beer", ".bible", ".bike",
61
+ ".bio", ".black", ".blackfriday", ".blog", ".blue", ".boats", ".bonds", ".boo", ".book", ".boutique",
62
+ ".box", ".broadway", ".broker", ".builders", ".build", ".cab", ".cafe", ".cam", ".camera", ".camp"
63
+ ]
64
+
65
+ generic_tlds_part2 = [
66
+ ".capital", ".car", ".cards", ".care", ".careers", ".cars", ".casa", ".case", ".cash", ".casino",
67
+ ".catering", ".center", ".ceo", ".charity", ".chat", ".cheap", ".chinas", ".chloe", ".christmas", ".church",
68
+ ".cie", ".cisco", ".citadel", ".citi", ".city", ".claims", ".cleaning", ".clinic", ".clothing", ".cloud",
69
+ ".club", ".coach", ".codes", ".coffee", ".college", ".cologne", ".community", ".company", ".compare", ".computer",
70
+ ".comsec", ".condos", ".construction", ".consulting", ".contact", ".contractors", ".cooking", ".cool", ".coop", ".corsica",
71
+ ".country", ".coupon", ".coupons", ".courses", ".credit", ".creditcard", ".creditunion", ".cricket", ".crown", ".cruise",
72
+ ".cruises", ".cuisinella", ".cyou", ".dabur", ".dad", ".dance", ".data", ".date", ".dating", ".datsun",
73
+ ".day", ".daze", ".deal", ".deals", ".degree", ".delivery", ".dell", ".deloitte", ".democrat", ".dental",
74
+ ".dentist", ".desi", ".design", ".dev", ".dhl", ".diamonds", ".diet", ".digital", ".direct", ".directory",
75
+ ".discount", ".discover", ".dish", ".diy", ".dnp", ".docs", ".doctor", ".dodge", ".dog", ".domains",
76
+ ".dot", ".download", ".drive", ".dtv", ".dubai", ".duck", ".dunlop", ".dupont", ".durban", ".dvag",
77
+ ".dvr", ".earth", ".eat", ".eco", ".edeka", ".education", ".email", ".emerck", ".energy", ".engineer",
78
+ ".engineering", ".enterprises", ".epson", ".equipment", ".ericsson", ".erni", ".esurance", ".estate", ".etisalat", ".eurovision",
79
+ ".eus", ".events", ".exchange", ".expert", ".exposed", ".express", ".extraspace", ".fage", ".fail", ".fairwinds",
80
+ ".faith", ".family", ".fan", ".fans", ".farm", ".farmers", ".fashion", ".fast", ".fedex", ".feedback",
81
+ ".ferrari", ".ferrero", ".fiat", ".fidelity", ".fido", ".film", ".final", ".finance", ".financial", ".fire",
82
+ ".firestone", ".firmdale", ".fish", ".fishing", ".fit", ".fitness", ".flickr", ".flights", ".flir", ".florist",
83
+ ".flowers", ".fly", ".foo", ".food", ".football", ".ford", ".forex", ".forsale", ".forum", ".foundation",
84
+ ".fox", ".free", ".fresenius", ".frl", ".frogans", ".frontier", ".ftr", ".fujitsu", ".fun", ".fund",
85
+ ".furniture", ".futbol", ".fyi", ".gal", ".gallery", ".gallo", ".gallup", ".game", ".games", ".garena"
86
+ ]
87
+
88
+ generic_tlds_part3 = [
89
+ ".gallo", ".gallup", ".garden", ".gayi", ".gbiz", ".gdn", ".gea", ".gent", ".genting", ".george",
90
+ ".ggee", ".gift", ".gifts", ".gives", ".giving", ".glass", ".gle", ".global", ".globo", ".gmail",
91
+ ".gmo", ".gmx", ".godaddy", ".gold", ".goldpoint", ".golf", ".goo", ".goodyear", ".goog", ".google",
92
+ ".gop", ".got", ".grainger", ".graphics", ".gratis", ".green", ".gripe", ".grocery", ".group", ".guardian",
93
+ ".gucci", ".guge", ".guide", ".guitars", ".guru", ".hair", ".hamburg", ".hangout", ".haus", ".hbo",
94
+ ".hdfc", ".hdfcbank", ".health", ".healthcare", ".help", ".helsinki", ".here", ".hermes", ".hiphop", ".hisamitsu",
95
+ ".hitachi", ".hiv", ".hkt", ".hockey", ".holdings", ".holiday", ".homedepot", ".homegoods", ".homes", ".homesense",
96
+ ".honda", ".horse", ".hospital", ".host", ".hosting", ".hot", ".hotels", ".hotmail", ".house", ".how",
97
+ ".hsbc", ".htc", ".hughes", ".hyundai", ".ibm", ".icbc", ".ice", ".icu", ".ieee", ".ifm",
98
+ ".ikano", ".imamat", ".imdb", ".immo", ".immobilien", ".inc", ".industries", ".infiniti", ".info", ".ing",
99
+ ".ink", ".institute", ".insurance", ".insure", ".intel", ".international", ".intuit", ".investments", ".ipiranga", ".irish",
100
+ ".intel", ".intuit", ".investments", ".ipiranga", ".irish", ".iselect", ".ismaili", ".ist", ".istanbul", ".itau",
101
+ ".itv", ".iveco", ".jaguar", ".java", ".jcb", ".jcp", ".jeep", ".jio", ".jll", ".jmp",
102
+ ".jnj", ".jobs", ".joburg", ".jot", ".joy", ".jpmorgan", ".jprs", ".juegos", ".juniper", ".kaufen",
103
+ ".kddi", ".kerryhotels", ".kerryproperties", ".kerrylogistics", ".kfh", ".kia", ".kids", ".kim", ".kinder", ".kindle",
104
+ ".kitchen", ".kiwi", ".koeln", ".komatsu", ".kosher", ".kpmg", ".kpn", ".krd", ".kred", ".kuwait",
105
+ ".kyoto", ".lacaixa", ".lamborghini", ".lamer", ".lancaster", ".lancia", ".land", ".landrover", ".lanxess", ".lasalle",
106
+ ".lat", ".latrobe", ".law", ".lawyer", ".lds", ".lease", ".leclerc", ".lefrak", ".legal", ".lego",
107
+ ".lexus", ".lgbt", ".lidl", ".life", ".lifeinsurance", ".lifestyle", ".lighting", ".like", ".lilly", ".limited",
108
+ ".limo", ".lincoln", ".linde", ".link", ".lipsy", ".live", ".livenet", ".lixil", ".loan", ".loans"
109
+ ]
110
+
111
+ generic_tlds_part4 = [
112
+ ".locker", ".locus", ".lol", ".london", ".lotte", ".lotto", ".love", ".lpl", ".lplfinancial", ".ltd",
113
+ ".ltda", ".lucerne", ".lupin", ".luxe", ".luxury", ".macys", ".madrid", ".maif", ".maison", ".makeup",
114
+ ".management", ".mango", ".map", ".market", ".marketing", ".markets", ".marriott", ".marshall", ".maserati", ".mattel",
115
+ ".mba", ".mcd", ".mcdonalds", ".mckinsey", ".med", ".media", ".meet", ".melbourne", ".meme", ".memorial",
116
+ ".mens", ".menu", ".merckmsd", ".metlife", ".miami", ".microsoft", ".mini", ".mint", ".mit", ".mitsubishi",
117
+ ".mlb", ".mls", ".mma", ".mobi", ".mobile", ".moda", ".moe", ".moi", ".mom", ".monash",
118
+ ".money", ".monster", ".mormon", ".mortgage", ".moscow", ".moto", ".motorcycles", ".mov", ".movie", ".msd",
119
+ ".mtn", ".mtr", ".museum", ".mutual", ".nab", ".nagoya", ".navy", ".nba", ".nec", ".netbank",
120
+ ".new", ".news", ".next", ".nextdirect", ".nexus", ".nfl", ".ngo", ".nhk", ".nico", ".nike",
121
+ ".nikon", ".ninja", ".nissan", ".nissay", ".nokia", ".northwesternmutual", ".norton", ".now", ".nowtv", ".nowruz",
122
+ ".nra", ".nrw", ".ntt", ".nyc", ".obi", ".observer", ".off", ".office", ".okinawa", ".olayan",
123
+ ".olayangroup", ".oldnavy", ".ollo", ".om", ".omega", ".one", ".ong", ".onl", ".online", ".onyourside",
124
+ ".ooo", ".open", ".oracle", ".orange", ".org", ".organic", ".origins", ".osaka", ".otsuka", ".ovh",
125
+ ".page", ".panasonic", ".paris", ".pars", ".partners", ".parts", ".party", ".passagens", ".pay", ".pccw",
126
+ ".pet", ".pfizer", ".pharmacy", ".phd", ".philips", ".phone", ".photo", ".photography", ".photos", ".physio",
127
+ ".pics", ".pictet", ".pictures", ".pid", ".pin", ".ping", ".pink", ".pioneer", ".pizza", ".place",
128
+ ".play", ".playstation", ".plumbing", ".plus", ".pnc", ".pohl", ".poker", ".politie", ".porno", ".post",
129
+ ".pramerica", ".praxi", ".press", ".prime", ".pro", ".prod", ".productions", ".prof", ".progressive", ".promo",
130
+ ".properties", ".property", ".protection", ".pru", ".prudential", ".pub", ".pwc", ".qpon", ".quebec", ".quest",
131
+ ".racing", ".radio", ".read", ".realestate", ".realtor", ".realty", ".recipes", ".red", ".redstone", ".redumbrella"
132
+ ]
133
+
134
+ generic_tlds_1 = set((
135
+ generic_tlds_part1 +
136
+ generic_tlds_part2
137
+ ))
138
+
139
+ wd_generic_tlds_2 = set((
140
+ generic_tlds_part3 +
141
+ generic_tlds_part4
142
+ ))
143
+
144
+ generic_tlds_2 = list(wd_generic_tlds_2 - generic_tlds_1)
145
+ generic_tlds_1 = list(generic_tlds_1)
@@ -0,0 +1,267 @@
1
+ from .hostlist import host_suffixes, country_tlds, generic_tlds_1, generic_tlds_2
2
+ import argparse
3
+ from colorama import init, Fore, Style
4
+ from curl_cffi.requests import AsyncSession, errors
5
+ import asyncio
6
+ import sys
7
+ import os
8
+ import hmac
9
+ import secrets
10
+
11
+ HEADER = {
12
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
13
+ "Accept-Language": "en-US, en;q=0.9",
14
+ "Cache-Control": "no-cache",
15
+ "Pragma": "no-cache",
16
+ "If-None-Match": "",
17
+ "If-Modified-Since": ""
18
+ }
19
+
20
+ def gen_hash() -> str:
21
+ hexone = secrets.token_hex(32)
22
+ hextwo = secrets.token_hex(32)
23
+ h1bytes = bytes.fromhex(hexone)
24
+ h2bytes = bytes.fromhex(hextwo)
25
+ hmachash = hmac.new(h1bytes, msg=h2bytes, digestmod='sha3-512')
26
+ finalhash = hmachash.hexdigest()
27
+ return finalhash
28
+
29
+ def extract_brand_name(user_input):
30
+ user_input = user_input.lower()
31
+ if "://" in user_input:
32
+ user_input = user_input.split("://")[1]
33
+ domain = user_input.split('/')[0]
34
+ if domain.startswith('www.'):
35
+ domain = domain[4:]
36
+ if user_input.isalpha():
37
+ brand = user_input
38
+ else:
39
+ brand = domain.split('.')[0]
40
+ return brand
41
+
42
+ async def testhashes(session, sem):
43
+ baselines = {}
44
+ all_extensions = list(host_suffixes) + list(country_tlds) + list(generic_tlds_1) + list(generic_tlds_2)
45
+ shared_hash = gen_hash()[:16]
46
+ baseline_tasks = []
47
+ extension_map = []
48
+ async def bound_get(url):
49
+ async with sem:
50
+ try:
51
+ return await session.get(url, headers=HEADER, timeout=3, impersonate="chrome120")
52
+ except Exception as e:
53
+ return e
54
+
55
+ for ext in all_extensions:
56
+ clean_ext = ext if ext.startswith('.') else f".{ext}"
57
+ if ext in host_suffixes:
58
+ fake_url = f"https://{shared_hash}{clean_ext}"
59
+ else:
60
+ fake_url = f"https://{shared_hash}{clean_ext}"
61
+
62
+ baseline_tasks.append(bound_get(fake_url))
63
+ extension_map.append((ext, shared_hash, fake_url))
64
+ try:
65
+ results = await asyncio.gather(*baseline_tasks, return_exceptions=True)
66
+ except (KeyboardInterrupt, SystemExit):
67
+ print("Scan stopped.")
68
+ sys.exit(0)
69
+ for (ext, current_hash, fake_url), res in zip(extension_map, results):
70
+ if isinstance(res, Exception):
71
+ continue
72
+
73
+ if 200 <= res.status_code < 400 or res.status_code in [401, 403, 405, 429]:
74
+ parsed_host = fake_url.replace("https://", "").replace("http://", "").split('/')[0]
75
+ baselines[ext] = {
76
+ "raw_bytes": res.content,
77
+ "hash_str": current_hash,
78
+ "fake_host": parsed_host
79
+ }
80
+ return baselines
81
+
82
+
83
+ async def test_single_url(session, url, show_unregistered, show_status, ignored_domains, baseline_signatures, target, sem):
84
+ async with sem:
85
+ current_domain = url.replace("https://", "").replace("http://", "").split('/')[0]
86
+ try:
87
+ res = await session.get(url, headers=HEADER, timeout=5, impersonate="chrome120")
88
+ status = res.status_code
89
+
90
+ if 200 <= status < 400 or status in [401, 403, 405, 429]:
91
+ is_false_positive = False
92
+
93
+ for ext, base_data in baseline_signatures.items():
94
+ if url.split('?')[0].split('#')[0].endswith(ext):
95
+ real_text = res.text
96
+ fake_hash = base_data["hash_str"]
97
+ fake_host = base_data["fake_host"]
98
+
99
+ normalized_text = real_text.replace(current_domain, fake_host)
100
+ normalized_text = normalized_text.replace(target, fake_hash)
101
+ normalized_text = normalized_text.replace(target.upper(), fake_hash.upper())
102
+ normalized_text = normalized_text.replace(target.capitalize(), fake_hash.capitalize())
103
+
104
+ normalized_bytes = normalized_text.encode('utf-8', errors='ignore')
105
+
106
+ if normalized_bytes == base_data["raw_bytes"]:
107
+ is_false_positive = True
108
+ break
109
+
110
+ if is_false_positive:
111
+ if show_unregistered:
112
+ if show_status:
113
+ print(f"[{Fore.GREEN}NOT REGISTERED{Fore.RESET}] {url} (Status: {status} [Fake 200])")
114
+ else:
115
+ print(f"[{Fore.GREEN}NOT REGISTERED{Fore.RESET}] {url}")
116
+ return
117
+
118
+ if current_domain in ignored_domains:
119
+ if show_status:
120
+ print(f"[{Fore.LIGHTBLACK_EX}IGNORED{Fore.RESET}] {url} (Status: {status})")
121
+ return
122
+
123
+ if show_status:
124
+ print(f"[{Fore.RED}REGISTERED{Fore.RESET}] {url} (Status: {status})")
125
+ else:
126
+ print(f"[{Fore.RED}REGISTERED{Fore.RESET}] {url}")
127
+
128
+ elif show_unregistered:
129
+ if current_domain in ignored_domains:
130
+ print(f"[{Fore.LIGHTBLACK_EX}IGNORED{Fore.RESET}] {url}")
131
+ elif show_status:
132
+ print(f"[{Fore.GREEN}NOT REGISTERED{Fore.RESET}] {url} (Status: {status})")
133
+ else:
134
+ print(f"[{Fore.GREEN}NOT REGISTERED{Fore.RESET}] {url}")
135
+
136
+ except errors.RequestsError as e:
137
+ if show_unregistered:
138
+ if current_domain in ignored_domains:
139
+ return
140
+ if show_status:
141
+ err_msg = str(e).lower()
142
+ if "dns" in err_msg or "resolve" in err_msg:
143
+ print(f"[{Fore.GREEN}NOT REGISTERED{Fore.RESET}] {url} ({Fore.LIGHTBLACK_EX}DNS Error{Fore.RESET})")
144
+ else:
145
+ print(f"[{Fore.GREEN}NOT REGISTERED{Fore.RESET}] {url} ({Fore.LIGHTBLACK_EX}Conn Error{Fore.RESET})")
146
+ else:
147
+ print(f"[{Fore.GREEN}NOT REGISTERED{Fore.RESET}] {url}")
148
+
149
+ except (KeyboardInterrupt, SystemExit):
150
+ raise
151
+ except Exception:
152
+ if show_unregistered and current_domain not in ignored_domains:
153
+ if show_status:
154
+ print(f"[{Fore.GREEN}NOT REGISTERED{Fore.RESET}] {url} ({Fore.LIGHTBLACK_EX}Error{Fore.RESET})")
155
+ else:
156
+ print(f"[{Fore.GREEN}NOT REGISTERED{Fore.RESET}] {url}")
157
+
158
+
159
+ async def testalldomains(target, show_unregistered, show_status, ignored_domains, only_results, sem):
160
+ all_domains = []
161
+
162
+ for suffix in host_suffixes:
163
+ all_domains.append(f"https://{target}{suffix}")
164
+
165
+ for tld in country_tlds:
166
+ tld = tld if tld.startswith('.') else f".{tld}"
167
+ all_domains.append(f"https://{target}{tld}")
168
+
169
+ for tld in generic_tlds_1:
170
+ tld = tld if tld.startswith('.') else f".{tld}"
171
+ all_domains.append(f"https://{target}{tld}")
172
+ for tld in generic_tlds_2:
173
+ tld = tld if tld.startswith('.') else f".{tld}"
174
+ all_domains.append(f"https://{target}{tld}")
175
+ if not only_results:
176
+ print(f"Loaded {len(all_domains)} total hosts to test.\n")
177
+ async with AsyncSession() as session:
178
+ if not only_results:
179
+ print(f"Testing fake domain for all hosts...")
180
+ baseline_signatures = await testhashes(session, sem)
181
+ if not only_results:
182
+ print("Fake domain test complete")
183
+ print(f"\n{Style.BRIGHT}Scanning...\n")
184
+ tasks = [
185
+ test_single_url(session, url, show_unregistered, show_status, ignored_domains, baseline_signatures, target, sem)
186
+ for url in all_domains
187
+ ]
188
+ try:
189
+ await asyncio.gather(*tasks)
190
+ except (KeyboardInterrupt, SystemExit):
191
+ print(f"\nScan stopped.")
192
+ sys.exit(0)
193
+
194
+ def chtrack():
195
+ parser = argparse.ArgumentParser(description="Tool to check if other people have tried impersonating your company/website.")
196
+ parser.add_argument("site", nargs='?', help="URL or brand name to verify.")
197
+ parser.add_argument("-su", "--show-unregistered", action="store_true", help="Display unregistered domains as well.")
198
+ parser.add_argument("-ss", "--show_status", action="store_true", help="Provide status codes/errors for every domain checked (forces -su).")
199
+ parser.add_argument("-sr", "--self-registered", help="Domains that you yourself have registered, so that those domains will be ignored. Use comma-seperated values or path to a text file.")
200
+ parser.add_argument("-or", "--only-results", action='store_true', help="Only print the result")
201
+ parser.add_argument("-ccr", "--concurrent-req", type=int, default=100, help="Maximum number of async requests, default 100.")
202
+ args = parser.parse_args()
203
+
204
+ MAX_CC_REQ = args.concurrent_req
205
+ sem = asyncio.Semaphore(MAX_CC_REQ)
206
+ show_unregistered = args.show_unregistered
207
+ show_status = args.show_status
208
+ only_results = args.only_results
209
+ if not args.only_results:
210
+ init(autoreset=True)
211
+ print()
212
+ print("-" * 65)
213
+ print(f"{Style.BRIGHT}ClHostMap {Fore.LIGHTMAGENTA_EX}v1.0.0")
214
+ print()
215
+ print(f"Made by: {Fore.LIGHTMAGENTA_EX}SphericalFlower52811")
216
+ print()
217
+ print(f"{Fore.LIGHTBLUE_EX}GitHub: {Fore.RESET}{Style.BRIGHT}https://github.com/SphericalFlower52811/clhostmap")
218
+ print("-" * 65)
219
+ print()
220
+
221
+ site = args.site if args.site else input("Website to test not found.\nEnter website (e.g. https://example.com): ").lower().strip()
222
+ target = extract_brand_name(site)
223
+ if not only_results:
224
+ print(f"Target: {Style.BRIGHT}{Fore.CYAN}{target}")
225
+ ignored_domains = set()
226
+ init_domain = site.replace("https://", "").replace("http://", "").split('/')[0]
227
+ if init_domain.startswith("www."):
228
+ init_domain = init_domain[4:]
229
+ if '.' in init_domain:
230
+ ignored_domains.add(init_domain)
231
+ if args.self_registered:
232
+ if os.path.isfile(args.self_registered):
233
+ try:
234
+ with open(args.self_registered, "r") as f:
235
+ for line in f:
236
+ item = line.strip().lower()
237
+ if "://" in item:
238
+ item = item.split("://")[1]
239
+ item = item.split('/')[0]
240
+ if item.startswith("www."):
241
+ item = item[4:]
242
+ if item and not item.isalpha() and '.' in item:
243
+ ignored_domains.add(item)
244
+ except Exception:
245
+ pass
246
+ else:
247
+ for piece in args.self_registered.split(","):
248
+ item = piece.strip().lower()
249
+ if "://" in item:
250
+ item = item.split("://")[1]
251
+ item = item.split('/')[0]
252
+ if item.startswith("www."):
253
+ item = item[4:]
254
+ if '.' in item:
255
+ ignored_domains.add(item)
256
+
257
+ if ignored_domains and not only_results:
258
+ print(f"{Fore.LIGHTBLACK_EX}Domains to be ignored: {Fore.RESET}{', '.join(sorted(ignored_domains))}")
259
+ print()
260
+
261
+ try:
262
+ asyncio.run(testalldomains(target, show_unregistered, show_status, ignored_domains, only_results, sem))
263
+ except KeyboardInterrupt:
264
+ print(f"\nScan stopped.")
265
+
266
+ if __name__ == '__main__':
267
+ chtrack()
@@ -0,0 +1,34 @@
1
+ [tool.setuptools.packages.find]
2
+ where = ["."]
3
+ include = ["clhostmapcode*"]
4
+
5
+ [build-system]
6
+ requires = ["setuptools"]
7
+ build-backend = "setuptools.build_meta"
8
+
9
+ [project]
10
+ name = "clhostmap"
11
+ version = "1.0.0"
12
+ readme = "README.md"
13
+ description = "Tool to check if other people have tried impersonating your company/website."
14
+ requires-python = ">=3.12"
15
+ keywords = [
16
+ "osint",
17
+ "brand-protection",
18
+ "typosquatting",
19
+ "phishing-recon",
20
+ "subdomain-scanner",
21
+ "cybersecurity-tools"
22
+ ]
23
+
24
+ dependencies = [
25
+ "curl_cffi",
26
+ "tldextract>=5.1.0",
27
+ "colorama>=0.4.6"
28
+ ]
29
+
30
+ [project.scripts]
31
+ clhostmap = "clhostmapcode.main:chtrack"
32
+
33
+ [project.urls]
34
+ Repository = "https://github.com/SphericalFlower52811/clhostmap"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+