├── LICENSE ├── README.md ├── configs └── config.json ├── garudaOx.py ├── image ├── Garuddda.jpg └── Output.png └── install.sh /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Govind Acharya 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 |

G a r u d a O s i n T

2 | 3 |

4 | Garuda Logo 5 |

6 | 7 | 8 |
9 | 10 | [![forthebadge made-with-python](http://ForTheBadge.com/images/badges/made-with-python.svg)](https://www.python.org/) 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | ### Features 20 | - ```userrecon``` - username reconnaissance 21 | - ```facedumper``` - dump facebook information 22 | - ```mailfinder``` - find email with specific name 23 | - ```godorker``` - dorking with google search 24 | - ```phoneinfo``` - phone number information 25 | - ```dnslookup``` - domain name system lookup 26 | - ```whoislookup``` - identify who is on domain 27 | - ```sublookup``` - sub networking lookup 28 | - ```hostfinder``` - find host domain 29 | - ```dnsfinder``` - find host domain name system 30 | - ```riplookup``` - reverse ip lookup 31 | - ```iplocation``` - ip to location tracker 32 | - ```Bitly Bypass``` - Bypass all bitly urls 33 | - ```Github Lookup``` - Dump GitHub information 34 | - ```TempMail``` - Generate a Temp Mail and Mail Box 35 | 36 | ### USE: 37 | - For Put or Modify API KEY Type ```python3 garudaOx.py configs``` or edit configs/config.json 38 | - For use ```phoneinfo``` you need a [Veriphone API key](https://veriphone.io/), if you don't have this key you can use this test key to test the tool: KEY: ```47703D994B174BACBDC5AD734CC381B4``` 39 | - For use ```mailfinder``` you need a [real-email API key](https://isitarealemail.com/), if you don't have this key you can use this test key to test the tool: KEY: ```0c6ad1fd-f753-4628-8c0a-7968e722c6c7``` 40 | 41 | - Installation on linux 42 | ```bash 43 | $ git clone https://github.com/GONX729/Garuda-Osint 44 | $ cd Garuda-Osint 45 | $ bash install.sh 46 | $ python3 garudaOx.py 47 | ``` 48 | 49 | ### Credits 50 | Copyright Reserved © 2025 by @GonX729 51 | 52 | -------------------------------------------------------------------------------- /configs/config.json: -------------------------------------------------------------------------------- 1 | {"headers": {"User-Agent": "Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.334; U; id) Presto/2.5.25 Version/10.54"}, "real-email-api-key": "0c6ad1fd-f753-4628-8c0a-7968e722c6c7", "veriphone-api-key": "714EB24166464824837750F919DC9E53"} -------------------------------------------------------------------------------- /garudaOx.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import re 4 | import json 5 | import requests 6 | import textwrap 7 | import socket 8 | from lxml.html import fromstring 9 | from getpass import getpass 10 | from shutil import which 11 | from threading import Thread 12 | from time import sleep 13 | from bs4 import BeautifulSoup 14 | from tabulate import tabulate 15 | import pyperclip 16 | import random 17 | import string 18 | from requests.exceptions import RequestException 19 | from googlesearch import search # Added missing import for `search` 20 | from html.parser import HTMLParser # Added missing import for `parser` 21 | 22 | r = "\033[31m" 23 | g = "\033[32m" 24 | y = "\033[33m" 25 | b = "\033[34m" 26 | p = "\033[35m" 27 | d = "\033[2;37m" 28 | w = "\033[0m" 29 | lr = "\u001b[38;5;196m" 30 | 31 | W = f"{w}\033[1;47m" 32 | R = f"{w}\033[1;41m" 33 | G = f"{w}\033[1;42m" 34 | Y = f"{w}\033[1;43m" 35 | B = f"{w}\033[1;44m" 36 | 37 | mail_printate = [] 38 | 39 | # Check and create configs/config.json if missing 40 | config_path = "configs/config.json" 41 | if not os.path.exists(config_path): 42 | os.makedirs(os.path.dirname(config_path), exist_ok=True) 43 | with open(config_path, "w") as config_file: 44 | config_file.write(json.dumps({"veriphone-api-key": "", "real-email-api-key": ""})) 45 | print(f"Created missing config file at {config_path}") 46 | 47 | configs = json.loads(open(config_path, "r").read()) 48 | 49 | # Handle missing HOME environment variable and `.cookies` file 50 | home = os.getenv("HOME") 51 | if not home: 52 | home = os.path.expanduser("~") # Fallback to the user's home directory 53 | if not home: 54 | raise EnvironmentError("HOME environment variable is not set, and user home directory could not be determined.") 55 | 56 | cookifile = f"{home}/.cookies" 57 | if not os.path.exists(cookifile): 58 | os.makedirs(os.path.dirname(cookifile), exist_ok=True) # Ensure the directory exists 59 | with open(cookifile, "w") as cookie_file: 60 | cookie_file.write("") 61 | print(f"Created missing cookies file at {cookifile}") 62 | 63 | space = " " 64 | lines = space + "-" * 44 65 | apihack = "https://api.hackertarget.com/{}/?q={}" 66 | mbasic = "https://mbasic.facebook.com{}" 67 | graph = "https://graph.facebook.com{}" 68 | userrecon_num = 0 69 | userrecon_working = 0 70 | userrecon_results = [] 71 | check_email_num = 0 72 | headers = { 73 | "User-Agent": "Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.334; U; id) Presto/2.5.25 Version/10.54" 74 | } 75 | logo = f"""{b} 76 | ██████╗ █████╗ ██████╗ ██╗ ██╗██████╗ █████╗ ██████╗ ███████╗██╗███╗ ██╗████████╗ 77 | ██╔════╝ ██╔══██╗██╔══██╗██║ ██║██╔══██╗██╔══██╗ ██╔═══██╗██╔════╝██║████╗ ██║╚══██╔══╝ 78 | ██║ ███╗███████║██████╔╝██║ ██║██████╔╝███████║ ██║ ██║███████╗██║██╔██╗ ██║ ██║ 79 | ██║ ██║██╔══██║██╔═══╝ ██║ ██║██╔═══╝ ██╔══██║ ██║ ██║╚════██║██║██║╚██╗██║ ██║ 80 | ╚██████╔╝██║ ██║██║ ╚██████╔╝██║ ██║ ██║ ╚██████╔╝███████║██║██║ ╚████║ ██║ 81 | ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝╚═╝ ╚═══╝ ╚═╝ 82 | 83 | ┏───────────────────────────────────────────────────────────────────────────────┓ 84 | │ │ 85 | │ WELCOME TO G A R U D A O S I N T │ 86 | │ │ 87 | │ A Powerful Information Gathering Toolkit │ 88 | │ │ 89 | │ github.com/GONX729 | @muzzXalmighty │ 90 | ┗───────────────────────────────────────────────────────────────────────────────┘ 91 | {w} 92 | """ 93 | 94 | def menu(): 95 | os.system("clear") 96 | print(logo) 97 | print(f""" 98 | {W}\033[2;30m Choose number or type exit for exiting {w} 99 | 100 | {w}{b} 01{w} Userrecon {d} Username reconnaissance 101 | {w}{b} 02{w} Facedumper {d} Dump facebook information 102 | {w}{b} 03{w} Mailfinder {d} Find email with name 103 | {w}{b} 04{w} Godorker {d} Dorking with google search 104 | {w}{b} 05{w} Phoneinfo {d} Phone number information 105 | {w}{b} 06{w} DNSLookup {d} Domain name system lookup 106 | {w}{b} 07{w} Whoislookup {d} Identify who is on domain 107 | {w}{b} 08{w} Sublookup {d} Subnetwork lookup 108 | {w}{b} 09{w} Hostfinder {d} Find host domain 109 | {w}{b} 10{w} DNSfinder {d} Find host domain name system 110 | {w}{b} 11{w} RIPlookup {d} Reverse IP lookup 111 | {w}{b} 12{w} IPlocation {d} IP to location tracker 112 | {w}{b} 13{w} Bitly Bypass {d} Bypass all bitly urls 113 | {w}{b} 14{w} Github Lookup {d} Dump GitHub information 114 | {w}{b} 15{w} TempMail {d} Generate Temp Mail and Mail Box 115 | {w}{b} 00{w} Exit {d} Its Time To Leave ): 116 | """) 117 | mainmenu() 118 | 119 | def mainmenu(): 120 | while True: 121 | try: 122 | cmd = input(f"{space}{w}{b}>{w} choose:{b} ") 123 | if int(len(cmd)) < 6: 124 | if cmd in ("exit","Exit", "00", "0"): exit(r+space+"* Exiting !"+w) 125 | elif cmd in ("1","01"): userrecon() 126 | elif cmd in ("2","02"): fb.facedumper() 127 | elif cmd in ("3","03"): mailfinder() 128 | elif cmd in ("4","04"): godorker() 129 | elif cmd in ("5","05"): phoneinfo() 130 | elif cmd in ("6","06"): infoga("dnslookup") 131 | elif cmd in ("7","07"): infoga("whois") 132 | elif cmd in ("8","08"): infoga("subnetcalc") 133 | elif cmd in ("9","09"): infoga("hostsearch") 134 | elif cmd in ("10"): infoga("mtr") 135 | elif cmd in ("11"): infoga("reverseiplookup") 136 | elif cmd in ("12"): iplocation() 137 | elif cmd in ("14"): github_lookup() 138 | elif cmd in ("13"): bypass_bitly() 139 | elif cmd in ("15"): temp_mail_gen() 140 | else: continue 141 | except KeyboardInterrupt: 142 | exit(f"{r}\n{space}* Aborted !") 143 | 144 | def display_progress(iteration, total, text=""): 145 | bar_max_width = 40 146 | bar_current_width = bar_max_width * iteration // total 147 | bar = "█" * bar_current_width + " " * (bar_max_width - bar_current_width) 148 | progress = "%.1f" % (iteration / total * 100) 149 | print(f"{space}{iteration}/{total} |{bar}| {progress}% {text}", end="\r") 150 | if iteration == total: 151 | print() 152 | 153 | def send_req(url, username): 154 | try: 155 | req = requests.get(url.format(username), headers=headers) 156 | except requests.exceptions.Timeout: pass 157 | except requests.exceptions.TooManyRedirects: pass 158 | except requests.exceptions.ConnectionError: pass 159 | global userrecon_num, userrecon_results, userrecon_working 160 | userrecon_num += 1 161 | 162 | 163 | if req.status_code == 200: color = g; userrecon_working += 1 164 | elif req.status_code == 404: color = r 165 | else: color = y 166 | 167 | percent = 71/100*userrecon_num 168 | display_progress(userrecon_num, 71, f"FOUND: {userrecon_working}") 169 | 170 | userrecon_results.append(f" {space}{b}[{color}{req.status_code}{b}] {userrecon_num}/71 {w}{url.format(username)}") 171 | 172 | def check_email(email, api, total, ok, f): 173 | 174 | response = requests.get("https://isitarealemail.com/api/email/validate",params = {'email': email}, headers = {'Authorization': "Bearer " + api }) 175 | status = response.json()['status'] 176 | 177 | if status == 'invalid': color = r; back_color = R 178 | elif status == 'unknown': color = y; back_color = Y 179 | else: color = g; back_color = G 180 | 181 | 182 | global check_email_num 183 | check_email_num += 1 184 | if status == "valid": 185 | ok.append(email) 186 | f.write(email+"\n") 187 | print_space = " " 188 | else: 189 | print_space = " " 190 | 191 | #if check_email_num < 0: 192 | 193 | print(f"{space}{back_color}{w}{print_space}{status.upper()}{print_space}{w}{b} {check_email_num}/{total}{w} Status: {color}{status}{w} Email: {email}") 194 | 195 | 196 | def iplocation(): 197 | print(f"{space}{b}>{w} local IP: {os.popen('curl ifconfig.co --silent').readline().strip()}") 198 | x = input(f"{space}{b}>{w} enter IP:{b} ") 199 | if x.split(".")[0].isnumeric(): pass 200 | else: menu() 201 | print(w+lines) 202 | req = requests.get("https://ipinfo.io/"+x+"/json").json() 203 | try: ip = "IP: "+req["ip"] 204 | except KeyError: ip = "" 205 | try: city = "CITY: "+req["city"] 206 | except KeyError: city = "" 207 | try: country = "COUNTRY: "+req["country"] 208 | except KeyError: country = "" 209 | try: loc = "LOC: "+req["loc"] 210 | except KeyError: loc = "" 211 | try: org = "ORG: "+req["org"] 212 | except KeyError: org = "" 213 | try: tz = "TIMEZONE: "+req["timezone"] 214 | except KeyError: tz = "" 215 | z = [ip, city, country, loc, org, tz] 216 | for res in z: 217 | print(f"{space}{b}-{w} {res}") 218 | print(w+lines) 219 | getpass(space+"press enter for back to previous menu ") 220 | menu() 221 | 222 | def infoga(opt): 223 | x = input(f"{space}{b}>{w} enter domain or IP:{b} ") 224 | if not x: menu() 225 | if x.split(".")[0].isnumeric(): x = socket.gethostbyname(x) 226 | else: pass 227 | print(w+lines) 228 | req = requests.get(apihack.format(opt,x),stream=True) 229 | for res in req.iter_lines(): 230 | print(f"{space}{b}-{w} {res.decode('utf-8')}") 231 | print(w+lines) 232 | getpass(space+"press enter for back to previous menu ") 233 | menu() 234 | 235 | def phoneinfo(): 236 | no = input(f"{space}{b}>{w} enter number:{b} ") 237 | api_key = configs['veriphone-api-key'] 238 | if api_key == "": 239 | api_key = input(f"{space}{w}{b}>{w} enter your api key (https://veriphone.io) :{b} ") 240 | with open("configs/config.json", "w") as configs_file: 241 | configs["veriphone-api-key"] = api_key 242 | configs_file.write(json.dumps(configs)) 243 | if not no: menu() 244 | print(w+lines) 245 | 246 | url = "https://api.veriphone.io/v2/verify?phone={}&key=" + api_key 247 | req = requests.get(url.format(no)) 248 | res = json.loads(req.text) 249 | 250 | for info in res: 251 | print(f"{space}{b}-{w} {info}{' '*(23-len(info))}: {y}{res[info]}{w}") 252 | 253 | print(w+lines) 254 | print(f"{space}{B} DONE {R} {no} {w}") 255 | 256 | getpass(space+"press enter for back to previous menu ") 257 | menu() 258 | 259 | def godorker(): 260 | dork = input(f"{space}{b}>{w} enter dork (inurl/intext/etc):{b} ").lower() 261 | if not dork: menu() 262 | print(w+lines) 263 | urls = [] 264 | s = search(dork,num_results=30) 265 | for line in s: 266 | urls.append(line) 267 | f = open("result_godorker.txt","w") 268 | f.write("# Dork: "+dork+"\n\n") 269 | for url in urls: 270 | try: 271 | req = requests.get(url,headers=headers) 272 | res = fromstring(req.content) 273 | string = res.findtext(".//title") 274 | wrapper = textwrap.TextWrapper(width=47) 275 | dedented_text = textwrap.dedent(text=string) 276 | original = wrapper.fill(text=dedented_text) 277 | shortened = textwrap.shorten(text=original, width=47) 278 | title = wrapper.fill(text=shortened) 279 | f.write(url+"\n") 280 | print(f"{space}{B} FOUND {w} {str(title)}\n{space}{d}{url}{w}") 281 | except TypeError: pass 282 | except requests.exceptions.InvalidSchema: break 283 | except requests.exceptions.ConnectionError: break 284 | except KeyboardInterrupt: break 285 | f.close() 286 | print(w+lines) 287 | print(f"{space}{b}>{w} {str(len(url))} retrieved as: {y}result_godorker.txt{w}") 288 | getpass(space+"press enter for back to previous menu ") 289 | menu() 290 | 291 | def mailfinder(): 292 | fullname = input(f"{space}{b}>{w} enter name:{b} ").lower() 293 | if not fullname: menu() 294 | data = [ 295 | "gmail.com", 296 | "yahoo.com", 297 | "hotmail.com", 298 | "aol.com", 299 | "msn.com", 300 | "comcast.net", 301 | "live.com", 302 | "rediffmail.com", 303 | "ymail.com", 304 | "outlook.com", 305 | "cox.net", 306 | "googlemail.com", 307 | "rocketmail.com", 308 | "att.net", 309 | "facebook.com", 310 | "bellsouth.net", 311 | "charter.net", 312 | "sky.com", 313 | "earthlink.net", 314 | "optonline.net", 315 | "qq.com", 316 | "me.com", 317 | "gmx.net", 318 | "mail.com", 319 | "ntlworld.com", 320 | "frontiernet.net", 321 | "windstream.net", 322 | "mac.com", 323 | "centurytel.net", 324 | "aim.com", 325 | ] 326 | listuser = [ 327 | fullname.replace(" ",""), 328 | fullname.replace(" ","")+"123", 329 | fullname.replace(" ","")+"1234", 330 | fullname.replace("i", "1"), 331 | fullname.replace("a", "4"), 332 | fullname.replace("e", "3"), 333 | fullname.replace("i", "1").replace("a", "4").replace("e", "3"), 334 | fullname.replace("i", "1").replace("a", "4"), 335 | fullname.replace("i", "1").replace("e", "3"), 336 | fullname.replace("a", "4").replace("e", "3"), 337 | ] 338 | 339 | names = [] 340 | for name in fullname.split(" "): 341 | listuser.append(name) 342 | listuser.append(name+"123") 343 | listuser.append(name+"1234") 344 | names.append(name) 345 | 346 | f = open("result_mailfinder.txt","w") 347 | ok = [] 348 | results = [] 349 | try: 350 | api = configs["real-email-api-key"] 351 | if api == "": 352 | api = input(f"{space}{w}{b}>{w} enter your api key (https://isitarealemail.com) :{b} ") 353 | with open("configs/config.json", "w") as configs_file: 354 | configs["real-email-api-key"] = api 355 | configs_file.write(json.dumps(configs)) 356 | print(w+lines) 357 | for user in listuser: 358 | for domain in data: 359 | email = user + "@" + domain 360 | 361 | 362 | Thread(target=check_email, args=(email, api, len(data)*len(listuser), ok, f)).start() 363 | sleep(0.20) 364 | 365 | global check_email_num 366 | while check_email_num != len(data)*len(listuser): 367 | pass 368 | 369 | for result in results: 370 | print(result) 371 | check_email_num = 0 372 | except KeyboardInterrupt: 373 | print("ERROR") 374 | print("\r"),;sys.stdout.flush() 375 | pass 376 | f.close() 377 | print(w+lines) 378 | print(f"{space}{b}>{w} {str(len(ok))} retrieved as: {y}result_mailfinder.txt{w}") 379 | getpass(space+"press enter for back to previous menu ") 380 | menu() 381 | 382 | def userrecon(): 383 | global userrecon_results, userrecon_working, userrecon_num 384 | username = input(f"{space}{w}{b}>{w} enter username:{b} ").lower() 385 | if not username: menu() 386 | urllist = [ 387 | "https://facebook.com/{}", 388 | "https://instagram.com/{}", 389 | "https://twitter.com/{}", 390 | "https://youtube.com/{}", 391 | "https://vimeo.com/{}", 392 | "https://github.com/{}", 393 | "https://plus.google.com/{}", 394 | "https://pinterest.com/{}", 395 | "https://flickr.com/people/{}", 396 | "https://vk.com/{}", 397 | "https://about.me/{}", 398 | "https://disqus.com/{}", 399 | "https://bitbucket.org/{}", 400 | "https://flipboard.com/@{}", 401 | "https://medium.com/@{}", 402 | "https://hackerone.com/{}", 403 | "https://keybase.io/{}", 404 | "https://buzzfeed.com/{}", 405 | "https://slideshare.net/{}", 406 | "https://mixcloud.com/{}", 407 | "https://soundcloud.com/{}", 408 | "https://badoo.com/en/{}", 409 | "https://imgur.com/user/{}", 410 | "https://open.spotify.com/user/{}", 411 | "https://pastebin.com/u/{}", 412 | "https://wattpad.com/user/{}", 413 | "https://canva.com/{}", 414 | "https://codecademy.com/{}", 415 | "https://last.fm/user/{}", 416 | "https://blip.fm/{}", 417 | "https://dribbble.com/{}", 418 | "https://en.gravatar.com/{}", 419 | "https://foursquare.com/{}", 420 | "https://creativemarket.com/{}", 421 | "https://ello.co/{}", 422 | "https://cash.me/{}", 423 | "https://angel.co/{}", 424 | "https://500px.com/{}", 425 | "https://houzz.com/user/{}", 426 | "https://tripadvisor.com/members/{}", 427 | "https://kongregate.com/accounts/{}", 428 | "https://{}.blogspot.com/", 429 | "https://{}.tumblr.com/", 430 | "https://{}.wordpress.com/", 431 | "https://{}.devianart.com/", 432 | "https://{}.slack.com/", 433 | "https://{}.livejournal.com/", 434 | "https://{}.newgrounds.com/", 435 | "https://{}.hubpages.com", 436 | "https://{}.contently.com", 437 | "https://steamcommunity.com/id/{}", 438 | "https://www.wikipedia.org/wiki/User:{}", 439 | "https://www.freelancer.com/u/{}", 440 | "https://www.dailymotion.com/{}", 441 | "https://www.etsy.com/shop/{}", 442 | "https://www.scribd.com/{}", 443 | "https://www.patreon.com/{}", 444 | "https://www.behance.net/{}", 445 | "https://www.goodreads.com/{}", 446 | "https://www.gumroad.com/{}", 447 | "https://www.instructables.com/member/{}", 448 | "https://www.codementor.io/{}", 449 | "https://www.reverbnation.com/{}", 450 | "https://www.designspiration.net/{}", 451 | "https://www.bandcamp.com/{}", 452 | "https://www.colourlovers.com/love/{}", 453 | "https://www.ifttt.com/p/{}", 454 | "https://www.trakt.tv/users/{}", 455 | "https://www.okcupid.com/profile/{}", 456 | "https://www.trip.skyscanner.com/user/{}", 457 | "http://www.zone-h.org/archive/notifier={}", 458 | ] 459 | 460 | print(w+lines) 461 | for url in urllist: 462 | Thread(target=send_req, args=(url, username)).start() 463 | sleep(0.7) 464 | while True: 465 | if userrecon_num == len(urllist): 466 | break 467 | print() 468 | for user in userrecon_results: 469 | print(user) 470 | userrecon_results = [] 471 | userrecon_working = 0 472 | userrecon_num = 0 473 | print(w+lines) 474 | getpass(space+"press enter for back to previous menu ") 475 | menu() 476 | 477 | def bypass_bitly(): 478 | print(w+lines) 479 | bitly_url = input(f"{space}{w}{b}>{w} Bitly URL: {b}") 480 | bitly_code = requests.get(bitly_url, allow_redirects=False) 481 | soup = BeautifulSoup(bitly_code.text, features="lxml") 482 | original_link = soup.find_all('a', href=True)[0]['href'] 483 | print(f"{space}{B} DONE {w} Original URL: \u001b[38;5;32m{original_link}") 484 | print(w+lines) 485 | getpass(space+"press enter for back to previous menu ") 486 | menu() 487 | 488 | def github_lookup(): 489 | print(w+lines) 490 | github_username = input(f"{space}{w}{b}>{w} Github username: {b}") 491 | print(w) 492 | req = requests.get(f"https://api.github.com/users/{github_username}") 493 | res = json.loads(req.text) 494 | table = [] 495 | for info in res: 496 | table.append([str(info), str(res[info])]) 497 | headers = ["info", "content"] 498 | for line in tabulate(table, headers, tablefmt="fancy_grid").splitlines(): 499 | print(' '*int(len(space)/2) + line) 500 | print(w+lines) 501 | getpass(space+"press enter for back to previous menu ") 502 | menu() 503 | 504 | class Facebook(): 505 | 506 | def user_token(self): 507 | x = requests.get('https://m.facebook.com/composer/ocelot/async_loader/?publisher=feed#_=_', headers = { 508 | 'user-agent' : 'Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.011) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.86 Mobile Safari/537.36', # don't change this user agent. 509 | 'referer' : 'https://m.facebook.com/', 510 | 'host' : 'm.facebook.com', 511 | 'origin' : 'https://m.facebook.com', 512 | 'upgrade-insecure-requests' : '1', 513 | 'accept-language' : 'id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7', 514 | 'cache-control' : 'max-age=0', 515 | 'accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 516 | 'content-type' : 'text/html; charset=utf-8' 517 | }, cookies={"cookie":open(cookifile).read()}) 518 | find = re.search(r"(EAAA\w+)",x.text) # Fixed invalid escape sequence 519 | if find == None: 520 | exit(r+"[!] failed to get session token"+w) 521 | else: 522 | return find.group(1) 523 | 524 | def facedumper(self): 525 | try: 526 | coki = open(cookifile).read() 527 | except FileNotFoundError: 528 | while True: 529 | coki = getpass(f"{space}{b}>{w} enter facebook cookies (hidden input): ") 530 | if coki: 531 | break 532 | else: 533 | continue 534 | cookies = {"cookie": coki} 535 | try: 536 | req = requests.get(mbasic.format("/me"), cookies=cookies, verify=False).content 537 | except RequestException as e: 538 | exit(r + f"* Error fetching Facebook data: {e}" + w) 539 | 540 | if "mbasic_logout_button" in str(req): 541 | if "What are you thinking now" in str(req): 542 | with open(cookifile, "w") as f: 543 | f.write(cookies["cookie"]) 544 | else: 545 | try: 546 | parser = HTMLParser() # Fixed undefined `parser` 547 | follow_link = parser.unescape( 548 | BeautifulSoup(req, "html.parser") 549 | .find("a", string="Indonesian Language")["href"] 550 | ) 551 | requests.get(mbasic.format(follow_link), cookies=cookies) 552 | except Exception as e: 553 | print(r + f"* Warning: {e}" + w) 554 | else: 555 | exit(r + "* invalid credentials: cookies" + w) 556 | sleep(3) 557 | menu() 558 | 559 | print(f""" 560 | {w}{b} 01{w} Dump all {d} Dump all info from friendlist 561 | {w}{b} 02{w} Dump uid {d} Dump user id from friendlist 562 | {w}{b} 03{w} Dump email {d} Dump email from friendlist 563 | {w}{b} 04{w} Dump phone {d} Dump phone from friendlist 564 | {w}{b} 05{w} Dump birthday{d} Dump birthday from friendlist 565 | {w}{b} 06{w} Dump location{d} Dump location from friendlist 566 | """) 567 | 568 | while True: 569 | usr = input(f"{space}{w}{b}>{w} choose: {b}") 570 | if not usr: 571 | menu() 572 | if usr in ("1", "01"): 573 | fb.dump_all() 574 | elif usr in ("2", "02"): 575 | fb.dump_id() 576 | elif usr in ("3", "03"): 577 | fb.dump_email() 578 | elif usr in ("4", "04"): 579 | fb.dump_phone() 580 | elif usr in ("5", "05"): 581 | fb.dump_birthday() 582 | elif usr in ("6", "06"): 583 | fb.dump_location() 584 | else: 585 | continue 586 | 587 | def dump_all(self): 588 | token = fb.user_token() 589 | req = requests.get(graph.format("/v3.2/me/friends/?fields=name,email&access_token="+token+"&limit=5000"),headers=headers) 590 | res = json.loads(req.text) 591 | print(w+lines) 592 | i = 0 593 | for data in res["data"]: 594 | try: 595 | i += 1 596 | REQ = requests.get(graph.format("/"+data["id"]+"?access_token="+token+"&limit=5000"),headers=headers) 597 | RES = json.loads(REQ.text) 598 | id = data["id"] 599 | name = data["name"] 600 | print(f"{space}{B} DONE {R} {str(i)} {w}") 601 | print(f"{space}{b}-{w} Name: {name}") 602 | print(f"{space}{b}-{w} ID: {id}") 603 | try: print(f"{space}{b}-{w} Email: {RES['email']}") 604 | except KeyError: pass 605 | try: print(f"{space}{b}-{w} Email: {RES['phone']}") 606 | except KeyError: pass 607 | try: print(f"{space}{b}-{w} Email: {RES['birthday']}") 608 | except KeyError: pass 609 | try: 610 | location = RES["location"]["name"] 611 | print(f"{space}{b}-{w} Location: {location}") 612 | except KeyError: pass 613 | except KeyboardInterrupt: break 614 | print(w+lines) 615 | getpass(space+"press enter for back to previous menu ") 616 | menu() 617 | 618 | def dump_id(self): 619 | token = fb.user_token() 620 | req = requests.get(graph.format("/v3.2/me/friends/?fields=name,email&access_token="+token+"&limit=5000"),headers=headers) 621 | res = json.loads(req.text) 622 | listid = [] 623 | print(w+lines) 624 | f = open("dump_idfriends.txt","w") 625 | for data in res["data"]: 626 | try: 627 | id = data["id"] 628 | name = data["name"] 629 | print(f"{space}{B} DONE {w} ID: {id} {r}->{w} {name}") 630 | listid.append(data["id"]) 631 | f.write(id+"|"+name+"\n") 632 | except KeyboardInterrupt: 633 | break 634 | f.close() 635 | print(w+lines) 636 | print(f"{space}{b}>{w} {str(len(listid))} retrieved as: {y}dump_idfriends.txt{w}") 637 | getpass(space+"press enter for back to previous menu ") 638 | menu() 639 | 640 | def dump_email(self): 641 | token = fb.user_token() 642 | req = requests.get(graph.format("/v3.2/me/friends/?fields=name,email&access_token="+token+"&limit=5000"),headers=headers) 643 | res = json.loads(req.text) 644 | listmail = [] 645 | print(w+lines) 646 | f = open("dump_email.txt","w") 647 | for data in res["data"]: 648 | try: 649 | REQ = requests.get(graph.format("/"+data["id"]+"?access_token="+token+"&limit=5000"),headers=headers) 650 | RES = json.loads(REQ.text) 651 | try: 652 | name = RES["name"] 653 | email = RES["email"] 654 | print(f"{space}{B} DONE {w} Email: {email} {r}->{w} {name}") 655 | listmail.append(email) 656 | f.write(email+"|"+RES['id']+"|"+name+"\n") 657 | except KeyError: pass 658 | except KeyboardInterrupt: 659 | break 660 | f.close() 661 | print(w+lines) 662 | print(f"{space}{b}>{w} {str(len(listmail))} retrieved as: {y}dump_email.txt{w}") 663 | getpass(space+"press enter for back to previous menu ") 664 | menu() 665 | 666 | def dump_phone(self): 667 | token = fb.user_token() 668 | req = requests.get(graph.format("/v3.2/me/friends/?fields=name,email&access_token="+token+"&limit=5000"),headers=headers) 669 | res = json.loads(req.text) 670 | listphone = [] 671 | print(w+lines) 672 | f = open("dump_phone.txt","w") 673 | for data in res["data"]: 674 | try: 675 | REQ = requests.get(graph.format("/"+data["id"]+"?access_token="+token+"&limit=5000"),headers=headers) 676 | RES = json.loads(REQ.text) 677 | try: 678 | name = RES["name"] 679 | phone = RES["mobile_phone"] 680 | print(f"{space}{B} DONE {w} Phone: {phone} {r}->{w} {name}") 681 | listphone.append(phone) 682 | f.write(phone+"|"+RES['id']+"|"+name+"\n") 683 | except KeyError: pass 684 | except KeyboardInterrupt: 685 | break 686 | f.close() 687 | print(w+lines) 688 | print(f"{space}{b}>{w} {str(len(listphone))} retrieved as: {y}dump_phone.txt{w}") 689 | getpass(space+"press enter for back to previous menu ") 690 | menu() 691 | 692 | def dump_birthday(self): 693 | token = fb.user_token() 694 | req = requests.get(graph.format("/v3.2/me/friends/?fields=name,email&access_token="+token+"&limit=5000"),headers=headers) 695 | res = json.loads(req.text) 696 | listday = [] 697 | print(w+lines) 698 | f = open("dump_birthday.txt","w") 699 | for data in res["data"]: 700 | try: 701 | REQ = requests.get(graph.format("/"+data["id"]+"?access_token="+token+"&limit=5000"),headers=headers) 702 | RES = json.loads(REQ.text) 703 | try: 704 | name = RES["name"] 705 | day = RES["birthday"] 706 | print(f"{space}{B} DONE {w} Birthday: {day} {r}->{w} {name}") 707 | listday.append(day) 708 | f.write(day+"|"+RES['id']+"|"+name+"\n") 709 | except KeyError: pass 710 | except KeyboardInterrupt: 711 | break 712 | f.close() 713 | print(w+lines) 714 | print(f"{space}{b}>{w} {str(len(listday))} retrieved as: {y}dump_birthday.txt{w}") 715 | getpass(space+"press enter for back to previous menu ") 716 | menu() 717 | 718 | def dump_location(self): 719 | token = fb.user_token() 720 | req = requests.get(graph.format("/v3.2/me/friends/?fields=name,email&access_token="+token+"&limit=5000"),headers=headers) 721 | res = json.loads(req.text) 722 | listloc = [] 723 | print(w+lines) 724 | f = open("dump_location.txt","w") 725 | for data in res["data"]: 726 | try: 727 | REQ = requests.get(graph.format("/"+data["id"]+"?access_token="+token+"&limit=5000"),headers=headers) 728 | RES = json.loads(REQ.text) 729 | try: 730 | name = RES["name"] 731 | loc = RES["location"]["name"] 732 | f.write(loc+"|"+RES['id']+"|"+name+"\n") 733 | listloc.append(loc) 734 | print(f"{space}{B} DONE {w} Location: {loc} {r}->{w} {name}") 735 | except KeyError: pass 736 | except KeyboardInterrupt: 737 | break 738 | f.close() 739 | print(w+lines) 740 | print(f"{space}{b}>{w} {str(len(listloc))} retrieved as: {y}dump_location.txt{w}") 741 | getpass(space+"press enter for back to previous menu ") 742 | menu() 743 | 744 | def settings(): 745 | os.system("clear") 746 | print(f"""{r} 747 | .---. .----------- 748 | / \ __ / ------ 749 | / / \( )/ ----- 750 | ////// ' \/ ` --- ┏───────────────────────────────┓ 751 | //// / // : : --- │ WELCOME TO EAGLEOSINT │ 752 | // / / /` '-- │ {lr}discord.gg/wQqZpHX2V2{r} │ 753 | // //..\\ │ {lr}github.com/retr0-g04t{r} │ 754 | ====UU====UU==== └───────────────────────────────┘ 755 | '//||\\` 756 | ''`` 757 | {lr}Simple Information Gathering Toolkit{w} 758 | {lr}Authors: {w}{r}@Retr0{lr} & {w}{r}💳 | NDL{w} 759 | """) 760 | print(f"""\ 761 | {w}{R} \033[1mSETTINGS CHANGER MODE {w} 762 | """) 763 | setting_num = 0 764 | configs_num = {} 765 | for setting in configs: 766 | if setting != "headers": 767 | setting_num += 1 768 | configs_num[str(setting_num)] = setting 769 | print(f" {w}{r} 0{setting_num} {setting}" + ' '*(20-len(setting)) + f"{lr}: \"{configs[setting]}\" ") 770 | setting = "exit".upper() 771 | print(f" {w}{r} 00{r} {setting}" + ' '*(20-len(setting)) + f"{lr}: bye bye ): ") 772 | 773 | option = "" 774 | while option not in configs_num: 775 | option = input(f"{space}{lr}>{r} What do you want to change?{lr} ") 776 | if option in ("0", "00"): 777 | sys.exit() 778 | 779 | new_value = input(f"{space}{lr}>{r} Insert the new value of {configs_num[option]} :{lr} ") 780 | configs[configs_num[option]] = new_value 781 | with open("configs/config.json", "w") as configs_file: 782 | configs_file.write(json.dumps(configs)) 783 | 784 | def temp_mail_gen(): 785 | API = 'https://www.1secmail.com/api/v1/' 786 | domainList = ['1secmail.com', '1secmail.net', '1secmail.org'] 787 | domain = random.choice(domainList) 788 | 789 | def extract(): 790 | getUserName = re.search(r'login=(.*)&',newMail).group(1) 791 | getDomain = re.search(r'domain=(.*)', newMail).group(1) 792 | return [getUserName, getDomain] 793 | 794 | 795 | def deleteMail(): 796 | url = 'https://www.1secmail.com/mailbox' 797 | data = { 798 | 'action': 'deleteMailbox', 799 | 'login': f'{extract()[0]}', 800 | 'domain': f'{extract()[1]}' 801 | } 802 | 803 | print("Disposing your email address - " + mail + '\n') 804 | req = requests.post(url, data=data) 805 | 806 | def checkMails(): 807 | global mail_printate 808 | reqLink = f'{API}?action=getMessages&login={extract()[0]}&domain={extract()[1]}' 809 | req = requests.get(reqLink).json() 810 | if len(req) != 0: 811 | idList = [] 812 | for i in req: 813 | for k,v in i.items(): 814 | if k == 'id': 815 | mailId = v 816 | idList.append(mailId) 817 | 818 | 819 | current_directory = os.getcwd() 820 | final_directory = os.path.join(current_directory, r'All Mails') 821 | if not os.path.exists(final_directory): 822 | os.makedirs(final_directory) 823 | 824 | for i in idList: 825 | if not i in mail_printate: 826 | mail_printate.append(i) 827 | msgRead = f'{API}?action=readMessage&login={extract()[0]}&domain={extract()[1]}&id={i}' 828 | req = requests.get(msgRead).json() 829 | for k,v in req.items(): 830 | if k == 'from': sender = v 831 | if k == 'subject': subject = v 832 | if k == 'date': date = v 833 | if k == 'textBody': content = v 834 | 835 | table = [["From", sender], ["Subject", subject], ["Content", content], ["Date", date]] 836 | headers = ["info", "content"] 837 | for line in tabulate(table, tablefmt="fancy_grid").splitlines(): 838 | print(space + " " + w + line) 839 | print() 840 | 841 | 842 | try: 843 | email_name = input(f"{space}{b}>{w} Insert a custom name for the email:{b} ") 844 | newMail = f"{API}?login={email_name}&domain={domain}" 845 | reqMail = requests.get(newMail) 846 | mail = f"{extract()[0]}@{extract()[1]}" 847 | print(f"{space}{b}>{w} Temp mail: {b}{mail}") 848 | getpass(f"{space}{b}> {w}Press enter to continue") 849 | print(f"{space}{b}-------------------[ INBOX ]-------------------\n") 850 | while True: 851 | checkMails() 852 | # time.sleep(1) 853 | 854 | except(KeyboardInterrupt): 855 | deleteMail() 856 | exit(f"{r}\n{space}* Aborted !") 857 | 858 | 859 | if __name__ == "__main__": 860 | arg = sys.argv 861 | fb = Facebook() 862 | if len(arg) == 1: menu() 863 | elif len(arg) == 2: 864 | if arg[1] == "update": 865 | if which("termux-setup-storage"): path = "$PREFIX/bin/EagleOsint" 866 | else: 867 | if os.path.isdir("/usr/local/bin/"): path = "/usr/local/bin/EagleOsint" 868 | else: path = "/usr/bin/sigit" 869 | os.system(f"wget https://raw.githubusercontent.com/retr0-g04t/EagleOsint/main/EagleOsint.py -O {path} && chmod +x {path}") 870 | print(f"{b}>{w} wrapper script have been updated") 871 | elif arg[1] in ("settings", "configs"): 872 | settings() 873 | 874 | elif arg[1] in ("01", "1", "02", "2", "03", "3", "04", "4", "05", "5", "06", "6", "07", "7", "08", "8", "09", "9", "10", "11", "12", "13", "14"): 875 | print(logo) 876 | if arg[1] in ("1","01"): userrecon() 877 | elif arg[1] in ("2","02"): fb.facedumper() 878 | elif arg[1] in ("3","03"): mailfinder() 879 | elif arg[1] in ("4","04"): godorker() 880 | elif arg[1] in ("5","05"): phoneinfo() 881 | elif arg[1] in ("6","06"): infoga("dnslookup") 882 | elif arg[1] in ("7","07"): infoga("whois") 883 | elif arg[1] in ("8","08"): infoga("subnetcalc") 884 | elif arg[1] in ("9","09"): infoga("hostsearch") 885 | elif arg[1] in ("10"): infoga("mtr") 886 | elif arg[1] in ("11"): infoga("reverseiplookup") 887 | elif arg[1] in ("12"): iplocation() 888 | elif arg[1] in ("14"): github_lookup() 889 | elif arg[1] in ("13"): bypass_bitly() 890 | elif arg[1] in ("15"): temp_mail_gen() 891 | else: exit(r+"* no command found for: "+str(arg[1:]).replace("[","").replace("]","")) 892 | else: exit(r+"* no command found for: "+str(arg[1:]).replace("[","").replace("]","")) 893 | -------------------------------------------------------------------------------- /image/Garuddda.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GonX729/Garuda-Osint/c382fcde369fe8b0582331539e68c5fbc51917c2/image/Garuddda.jpg -------------------------------------------------------------------------------- /image/Output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GonX729/Garuda-Osint/c382fcde369fe8b0582331539e68c5fbc51917c2/image/Output.png -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/bash 2 | null="> /dev/null 2>&1" 3 | g="\033[1;32m" 4 | r="\033[1;31m" 5 | b="\033[1;34m" 6 | w="\033[0m" 7 | echo -e "$b"">""$w"" GarudaOsint - Powerful information gathering toolkit" 8 | echo -e "$b"">""$w"" prepare for installing dependencies ..." 9 | sleep 3 10 | echo -e "$b"">""$w"" installing package: ""$g""libxml2""$w" 11 | sudo apt install libxml2 12 | echo -e "$b"">""$w"" installing pacakge: ""$g""libxslt""$w" 13 | sudo apt install libxslt 14 | echo -e "$b"">""$w"" installing pacakge: ""$g""python3""$w" 15 | sudo apt install python3 16 | echo -e "$b"">""$w"" installing pacakge: ""$g""python3-pip""$w" 17 | sudo apt install python3-pip 18 | echo -e "$b"">""$w"" installing modules: ""$g""lxml""$w" 19 | pip3 install wheel lxml 20 | echo -e "$b"">""$w"" installing modules: ""$g""requests""$w" 21 | pip3 install requests 22 | echo -e "$b"">""$w"" installing modules: ""$g""BeautifulSoup""$w" 23 | pip3 install BeautifulSoup 24 | echo -e "$b"">""$w"" installing modules: ""$g""tabuate""$w" 25 | pip3 install tabulate 26 | echo -e "$b"">""$w"" successfully installing dependencies" 27 | echo -e "$b"">""$w"" use command ""$g""python3 EagleOsint.py""$w"" for start the console" 28 | --------------------------------------------------------------------------------