├── start.bat ├── install.bat ├── LICENSE ├── README.md └── main.py /start.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | echo Starting IP Information Retrieval Tool... 3 | python main.py 4 | pause 5 | -------------------------------------------------------------------------------- /install.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | echo Installing required packages... 3 | pip install pyfiglet colorama ipwhois geoip2-database requests dnspython ‎ipwhois 4 | echo Packages installed successfully. 5 | pause 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 约 - Wick 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Wick - IP Information Retrieval Tool 2 | 3 | Wick is a powerful and user-friendly command-line tool designed for retrieving comprehensive information about IP addresses or domains. Whether you're a cybersecurity enthusiast, network administrator, or simply curious about the details behind an IP address, Wick has you covered. 4 | 5 | ## Features 6 | 7 | - Resolve IP addresses and domains to get their corresponding hostnames. 8 | - Retrieve geolocation information, including the city, region, country, latitude, and longitude. 9 | - Check if an IP address is associated with a VPN or proxy server. 10 | - Obtain SSL certificate information when available. 11 | - Explore DNS information such as A, MX, TXT, and NS records. 12 | 13 | ## Usage 14 | 15 | 1. Enter an IP address or domain when prompted. 16 | 2. Wick will provide you with detailed information about the IP address, geolocation, VPN/proxy status, and more. 17 | 3. Open Google Maps to view the geographical location associated with the IP address. 18 | 4. Access contact information, including a website, GitHub profile, and Instagram page, directly from the tool. 19 | 20 | ## Installation 21 | 22 | To use Wick Tool, follow these steps: 23 | 24 | 1. Clone this repository. 25 | 2. Run `install.bat` to install the required Python packages. 26 | 3. Run `start.bat` to launch the Wick tool. 27 | 28 | ## Contact 29 | 30 | Feel free to reach out for questions, suggestions, or collaboration opportunities. 31 | 32 | 1. **Website:** [https://www.wickdev.xyz](https://wickdev.xyz/) 33 | 2. **GitHub:** [https://github.com/Wickdev077](https://github.com/Wickdev077) 34 | 3. **Instagram:** [https://www.instagram.com/mik__subhi](https://www.instagram.com/mik__subhi/) 35 | 36 | ============================================================================================================================== 37 | 38 | ## Intended Use 39 | 40 | Wick is designed and developed for legitimate purposes such as cybersecurity research, network administration, and educational exploration. It is meant to empower users with valuable information about IP addresses and domains, enhance their understanding of network infrastructure, and support ethical and responsible use. 41 | 42 | **Wick is not intended for any malicious or unethical activities, including hacking, cyberattacks, or any other harmful actions. The tool should only be used in compliance with applicable laws and ethical standards.** 43 | 44 | We strongly discourage any misuse of this tool and emphasize the importance of ethical and responsible usage of network-related information. 45 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import socket 4 | import requests 5 | from ipwhois import IPWhois 6 | import ssl 7 | import pyfiglet 8 | from colorama import init, Fore, Style 9 | import webbrowser 10 | import time 11 | import subprocess 12 | 13 | def disable_ansi_on_windows(): 14 | if sys.platform.startswith('win'): 15 | os.system('color') 16 | 17 | def print_banner(): 18 | banner = pyfiglet.figlet_format("WICK TOOL", font="slant") 19 | print(Fore.YELLOW + banner + Style.RESET_ALL) 20 | print(Fore.CYAN + "Welcome to the IP Information Retrieval Tool" + Style.RESET_ALL) 21 | print() 22 | 23 | def print_contact_info(): 24 | print(Fore.YELLOW + "Contact Information:" + Style.RESET_ALL) 25 | print("1. Website: https://wickdev.xyz/") 26 | print("2. GitHub: https://github.com/Wickdev077") 27 | print("3. Instagram: https://www.instagram.com/mik__subhi/") 28 | 29 | def resolve_ip(ip_address): 30 | try: 31 | host = socket.gethostbyname(ip_address) 32 | return host 33 | except socket.gaierror: 34 | return None 35 | 36 | def get_geolocation_info(ip_address): 37 | try: 38 | url = f"https://ipinfo.io/{ip_address}/json" 39 | response = requests.get(url) 40 | data = response.json() 41 | return data 42 | except Exception as e: 43 | print(Fore.RED + f"Sorry, there was an error while retrieving geolocation information {str(e)}" + Style.RESET_ALL) 44 | return None 45 | 46 | def print_colored_info(label, info): 47 | print(Fore.GREEN + f"{label}: " + Style.RESET_ALL + info) 48 | 49 | def open_google_maps_with_delay(latitude, longitude): 50 | print(Fore.YELLOW + "Opening Google Maps..." + Style.RESET_ALL) 51 | time.sleep(3) 52 | google_maps_url = f"https://www.google.com/maps/search/?api=1&query={latitude},{longitude}" 53 | webbrowser.open(google_maps_url) 54 | 55 | def ping_ip(ip_address): 56 | try: 57 | result = subprocess.run(['ping', '-c', '4', ip_address], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, timeout=10) 58 | if result.returncode == 0: 59 | print(Fore.GREEN + "\nPing to IP Address:" + Style.RESET_ALL) 60 | print(result.stdout) 61 | else: 62 | print(Fore.RED + "\nPing to IP Address (Failed)" + Style.RESET_ALL) 63 | print(result.stderr) 64 | except subprocess.TimeoutExpired: 65 | print(Fore.RED + "\nPing to IP Address (Timed out)" + Style.RESET_ALL) 66 | except Exception as e: 67 | print(Fore.RED + f"An error occurred while pinging the IP address: {str(e)}" + Style.RESET_ALL) 68 | 69 | def get_ip_information(ip_address): 70 | resolved_ip = resolve_ip(ip_address) 71 | if resolved_ip: 72 | print_colored_info("Resolved IP Address", resolved_ip) 73 | try: 74 | ip_info = IPWhois(resolved_ip).lookup_rdap() 75 | print_colored_info("IP Range", ip_info['asn_cidr']) 76 | print_colored_info("Organization", ip_info['asn_description']) 77 | print_colored_info("Country", ip_info['asn_country_code']) 78 | 79 | geolocation_info = get_geolocation_info(resolved_ip) 80 | if geolocation_info: 81 | print(Fore.BLUE + "\nGeolocation Information :" + Style.RESET_ALL) 82 | print_colored_info("City", geolocation_info['city']) 83 | print_colored_info("Region", geolocation_info['region']) 84 | print_colored_info("Country", geolocation_info['country']) 85 | lat, lon = geolocation_info['loc'].split(',') 86 | print_colored_info("Latitude", lat) 87 | print_colored_info("Longitude", lon) 88 | 89 | if 'bogon' in geolocation_info.get('org', '').lower(): 90 | print_colored_info("VPN/Proxy Detected", "Yes") 91 | else: 92 | print_colored_info("VPN/Proxy Detected", "No") 93 | 94 | get_ssl_certificate(resolved_ip) 95 | 96 | except Exception as e: 97 | print(Fore.RED + f"Oops, there was an error while fetching information: {str(e)}" + Style.RESET_ALL) 98 | else: 99 | print(Fore.RED + f"Sorry, we couldn't resolve the IP address for: {ip_address}" + Style.RESET_ALL) 100 | 101 | def get_ssl_certificate(ip_address): 102 | try: 103 | context = ssl.create_default_context() 104 | with socket.create_connection((ip_address, 443), timeout=10) as sock: 105 | with context.wrap_socket(sock, server_hostname=ip_address) as ssl_sock: 106 | cert = ssl_sock.getpeercert() 107 | print(Fore.BLUE + "\nSSL Certificate Information:" + Style.RESET_ALL) 108 | print_colored_info("Issuer", cert['issuer']) 109 | print_colored_info("Subject", cert['subject']) 110 | print_colored_info("Expiration Date", cert['notAfter']) 111 | except ssl.SSLError: 112 | print(Fore.RED + f"Unable to retrieve SSL certificate information for {ip_address}" + Style.RESET_ALL) 113 | except Exception as e: 114 | print(Fore.RED + f"Sorry, there was an issue connecting to {ip_address}: {str(e)}" + Style.RESET_ALL) 115 | 116 | def get_dns_information(ip_address): 117 | try: 118 | domain = socket.gethostbyaddr(ip_address)[0] 119 | print_colored_info("DNS Information for", domain) 120 | 121 | a_records = socket.gethostbyname_ex(domain) 122 | print_colored_info("A Records", ', '.join(a_records[2])) 123 | 124 | mx_records = [] 125 | try: 126 | mx_records = [str(record.exchange) for record in dns.resolver.resolve(domain, 'MX')] 127 | except Exception: 128 | pass 129 | print_colored_info("MX Records", ', '.join(mx_records)) 130 | 131 | txt_records = [] 132 | try: 133 | txt_records = [str(record) for record in dns.resolver.resolve(domain, 'TXT')] 134 | except Exception: 135 | pass 136 | print_colored_info("TXT Records", ', '.join(txt_records)) 137 | 138 | ns_records = [] 139 | try: 140 | ns_records = [str(record.target) for record in dns.resolver.resolve(domain, 'NS')] 141 | except Exception: 142 | pass 143 | print_colored_info("NS Records", ', '.join(ns_records)) 144 | except Exception as e: 145 | print(Fore.RED + f"Sorry, there was an error while retrieving DNS information: {str(e)}" + Style.RESET_ALL) 146 | 147 | if __name__ == "__main__": 148 | init(autoreset=True) 149 | disable_ansi_on_windows() 150 | print_banner() 151 | ip_address = input("Please enter an IP Address or Domain: ") 152 | geolocation_info = get_geolocation_info(ip_address) 153 | if geolocation_info: 154 | latitude, longitude = geolocation_info['loc'].split(',') 155 | get_ip_information(ip_address) 156 | get_dns_information(ip_address) 157 | ping_ip(ip_address) 158 | 159 | if geolocation_info: 160 | google_maps_url = f"https://www.google.com/maps/search/?api=1&query={latitude},{longitude}" 161 | webbrowser.open(google_maps_url) 162 | 163 | print_contact_info() 164 | 165 | while True: 166 | choice = input("Type a number to open a contact link (1 for Website, 2 for GitHub, 3 for Instagram, or q to quit): ").strip() 167 | 168 | if choice == '1': 169 | webbrowser.open("https://wickdev.xyz/") 170 | elif choice == '2': 171 | webbrowser.open("https://github.com/Wickdev077") 172 | elif choice == '3': 173 | webbrowser.open("https://www.instagram.com/mik__subhi/") 174 | elif choice.lower() == 'q': 175 | break 176 | else: 177 | print(Fore.RED + "Invalid choice. Please select a valid option." + Style.RESET_ALL) 178 | --------------------------------------------------------------------------------