Skip to content

Commit

Permalink
Merge pull request #19 from 6abd/dev
Browse files Browse the repository at this point in the history
Horus v1.2.5
  • Loading branch information
6abd authored Jun 29, 2024
2 parents fbf5d6c + 4051a6f commit d5c3754
Show file tree
Hide file tree
Showing 6 changed files with 206 additions and 7 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
Expand Down
23 changes: 22 additions & 1 deletion horus.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import src.modules.flightinfo as flightinfo
import src.modules.wigle as wigle
import src.modules.bankindex as bankindex
import src.modules.exif as exif
import src.modules.ytd as ytd
# CASE-GEN.
# SDB.
# Loki.
Expand Down Expand Up @@ -56,10 +58,11 @@
ap.add_argument('-bankindex', help='Search up BIN/IIN, Sort Codes, Cheque details, etc.\n', action="store_true")
ap.add_argument('-mactrace', help='Type in an MAC address to get the vendor or device.', action="store_true")
ap.add_argument('-flightinfo', help='\n', action="store_true")
ap.add_argument('-exif', help='Check exif data on a file, or wipe it clean.\n', action="store_true")
#ap.add_argument('-Licenseinfo', help='\n', action="store_true")
ap.add_argument('-cryptotrace', help='Transaction information, & crypto-wallet tracing.', action="store_true")
#ap.add_argument('-Dischook', help='\n', action="store_true")
#ap.add_argument('-Ytd', help='\n', action="store_true")
ap.add_argument('-ytd', help='\n', action="store_true")
#ap.add_argument('-Leverage', help='\n', action="store_true")
# CASE-GEN.
#ap.add_argument('-Casegenerate', help='\n', action="store_true")
Expand Down Expand Up @@ -185,6 +188,24 @@ def __exit__(self, *args):
print(f">_ {Fore.RED}FAILURE{Fore.WHITE}: {error}\n")
os._exit(0)

if args['exif']: # Runs the mactrace program.
while True:
try:
exif.exif()
os._exit(0)
except Exception as error:
print(f">_ {Fore.RED}FAILURE{Fore.WHITE}: {error}\n")
os._exit(0)

if args['ytd']: # Runs the mactrace program.
while True:
try:
ytd.ytd()
os._exit(0)
except Exception as error:
print(f">_ {Fore.RED}FAILURE{Fore.WHITE}: {error}\n")
os._exit(0)

if __name__ == '__main__':
try:
banner.banner()
Expand Down
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ cryptography==42.0.5
Requests==2.32.2
shodan==1.31.0
pytest==8.1.1
exif==1.6.0
pytube==15.0.0
18 changes: 13 additions & 5 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import src.modules.flightinfo as flightinfo
import src.modules.wigle as wigle
import src.modules.bankindex as bankindex
import src.modules.exif as exif
import src.modules.ytd as ytd
# FORENSICS.


Expand Down Expand Up @@ -86,7 +88,7 @@ def section(text):
"Numlook | Look up validity, carriers, names of phone numbers globally.")
command(Fore.GREEN,
"Geolock | Shodan & auxiliary API based IP tracing & tracking.")
command(Fore.RED,
command(Fore.GREEN,
"Bankindex | Search up BIN/IIN, Sort Codes, Cheque details, etc.")
command(Fore.GREEN,
"Mactrace | Type in an MAC address to get the vendor or device.")
Expand All @@ -98,7 +100,7 @@ def section(text):
"Cryptotrace | Transaction information, & crypto-wallet tracing.")
command(Fore.RED,
"Dischook | Upload or pull information from a Discord server, or webhook.")
command(Fore.RED,
command(Fore.GREEN,
"Ytd | Download Youtube videos, in crystal clear format.")
command(Fore.RED,
"Leverage | You can leverage a suite of tools such as; Sherlock!")
Expand All @@ -125,10 +127,8 @@ def section(text):
section("FORENSICS") ######################
command(Fore.RED,
"Autodd | Create disc images & snapshots for later analysis, or mount one!")
command(Fore.RED,
command(Fore.GREEN,
"Exif | Check exif data on a file, or wipe it clean.")
command(Fore.RED,
"Geo | Geo-locate an IP, or exif & meta data.")
command(Fore.GREEN,
"Vt | Connect to the virus-total API to scan, or screen files, links, etc.")
command(Fore.RED,
Expand Down Expand Up @@ -178,6 +178,10 @@ def section(text):
if option.lower() == "bankindex":
bankindex.bankindex()
os._exit(0)

if option.lower() == "ytd":
ytd.ytd()
os._exit(0)
# CASE-GEN.
# SDB.
# Loki.
Expand Down Expand Up @@ -205,6 +209,10 @@ def section(text):
apicon.apicon()
os._exit(0)

if option == "exif".lower():
exif.exif()
os._exit(0)


except KeyboardInterrupt:
print(f'\n{Fore.YELLOW}You interrupted the program.{Fore.WHITE}')
Expand Down
120 changes: 120 additions & 0 deletions src/modules/exif.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# Imports.
import os
import sys
import json
import requests
from colorama import Fore # For text colour.
from exif import Image

# Config (Prints).
text = (f"{Fore.WHITE}") # Change the colour of text output in the client side
dividers = (f"{Fore.LIGHTRED_EX}") # Changes the [], | and : in the client side
success = (f"\n{Fore.WHITE}[{Fore.GREEN}SUCCESS{Fore.WHITE}] Program executed sucessfully.") # Success output.
response = (f"{Fore.WHITE}[{Fore.GREEN}+{Fore.WHITE}]")
successfully = (f"{Fore.WHITE}[{Fore.GREEN}SUCCESSFULLY{Fore.WHITE}]") # Successfully output.
failed = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}FAILED{Fore.WHITE}]") # Failed output.
prompt = (f"{Fore.WHITE}[{Fore.YELLOW}»{Fore.WHITE}]") # Prompt output.
notice = (f"{Fore.WHITE}[{Fore.YELLOW}!{Fore.WHITE}]") # Notice output.
question = (f"{Fore.WHITE}[{Fore.YELLOW}?{Fore.WHITE}]") # Alert output.
alert = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}!{Fore.WHITE}]") # Alert output.
exited = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}EXITED{Fore.WHITE}]") # Execited output.
disconnected = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}DISCONNECTED{Fore.WHITE}]") # Disconnected output.
command = (f"\n[{Fore.YELLOW}>_{Fore.WHITE}]: ") # Always asks for a command on a new line.

# Pre-run.
os.system("clear")

# Hide tracebacks - change to 1 for dev mode.
sys.tracebacklimit = 0

# API.
# Example, uncomment lines 30-32 if API required.
#with open('var/pipes/api_config.json') as f:
# data = json.load(f)
# #{api_name} = data["{api_name}"]

# Program.
def exif():
im = input(f"{question} Enter an image file path: ")

with open(im, 'rb') as image_file:
target = Image(image_file)

if target.has_exif:
print("")

try:
print(f"{response} Camera Make: {target.make}")
except AttributeError:
print(f"{notice} Camera Make: N/A")

try:
print(f"{response} Camera Model: {target.model}")
except AttributeError:
print(f"{notice} Camera Model: N/A")

try:
print(f"{response} Lens: {target.lens_model}")
except AttributeError:
print(f"{notice} Lens: N/A")

try:
print(f"{response} Focal Length: {target.focal_length}")
except AttributeError:
print(f"{notice} Focal Length: N/A")

try:
print(f"{response} Aperture: {round(target.aperture_value, 2)}")
except AttributeError:
print(f"{notice} Aperture: N/A")

try:
print(f"{response} ISO Speed: {target.iso_speed}")
except AttributeError:
print(f"{notice} ISO Speed: N/A")

try:
print(f"{response} Flash: {target.flash[0]}")
except AttributeError:
print(f"{notice} Flash: N/A")

print("")

try:
if target.gps_altitude_ref == 0:
print(f"{response} Altitude: {round(target.gps_altitude, 2)} meters above sea level")
else:
print(f"{response} Altitude: {round(target.gps_altitude, 2)} meters below sea level")
except AttributeError:
print(f"{notice} Altitude: N/A")

try:
print(f"""{response} Location: {round(target.gps_latitude[0])}°{int(target.gps_latitude[1])}'{target.gps_latitude[2]}"{target.gps_latitude_ref} {round(target.gps_longitude[0])}°{int(target.gps_longitude[1])}'{target.gps_longitude[2]}"{target.gps_longitude_ref}""")
except AttributeError:
print(f"{notice} Location: N/A")

print("")

try:
print(f"{response} File Source: {target.file_source}")
except AttributeError:
print(f"{notice} File Source: N/A")

try:
print(f"{response} Image Size: {target.pixel_x_dimension} x {target.pixel_y_dimension}")
except AttributeError:
print(f"{notice} Image Size: N/A")

try:
print(f"{response} Datetime: {target.datetime}")
except AttributeError:
print(f"{notice} Datetime: N/A")
print("")
print(success)
else:
print(f"{alert} Target image does not have EXIF data")

# Run module_name module.

if __name__ == '__main__':
exif()
49 changes: 49 additions & 0 deletions src/modules/ytd.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Imports.
import os
import sys
import json
import requests
from colorama import Fore # For text colour.
from pytube import YouTube
from pytube.cli import on_progress

# Config (Prints).
text = (f"{Fore.WHITE}") # Change the colour of text output in the client side
dividers = (f"{Fore.LIGHTRED_EX}") # Changes the [], | and : in the client side
success = (f"\n{Fore.WHITE}[{Fore.GREEN}SUCCESS{Fore.WHITE}] Program executed sucessfully.") # Success output.
response = (f"{Fore.WHITE}[{Fore.GREEN}+{Fore.WHITE}]")
successfully = (f"{Fore.WHITE}[{Fore.GREEN}SUCCESSFULLY{Fore.WHITE}]") # Successfully output.
failed = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}FAILED{Fore.WHITE}]") # Failed output.
prompt = (f"{Fore.WHITE}[{Fore.YELLOW}»{Fore.WHITE}]") # Prompt output.
notice = (f"{Fore.WHITE}[{Fore.YELLOW}!{Fore.WHITE}]") # Notice output.
question = (f"{Fore.WHITE}[{Fore.YELLOW}?{Fore.WHITE}]") # Alert output.
alert = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}!{Fore.WHITE}]") # Alert output.
exited = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}EXITED{Fore.WHITE}]") # Execited output.
disconnected = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}DISCONNECTED{Fore.WHITE}]") # Disconnected output.
command = (f"\n[{Fore.YELLOW}>_{Fore.WHITE}]: ") # Always asks for a command on a new line.

# Pre-run.
os.system("clear")

# Hide tracebacks - change to 1 for dev mode.
sys.tracebacklimit = 0

# API.
# Example, uncomment lines 30-32 if API required.
#with open('var/pipes/api_config.json') as f:
# data = json.load(f)
# #{api_name} = data["{api_name}"]

# Program.
def ytd():
link = input(f"{question} Enter a YouTube video link: ")
print("")
print(f"{response} Downloading...")

yt = YouTube(link, on_progress_callback=on_progress)
yt.streams.filter(progressive=True, file_extension='mp4').get_highest_resolution().download(output_path="videos")
print(success)

# Run module_name module.
if __name__ == '__main__':
ytd()

0 comments on commit d5c3754

Please sign in to comment.