├── 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 |
5 |
6 |
7 |
8 |
9 |
10 | [](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 |
--------------------------------------------------------------------------------