Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c296f09e0e | ||
|
|
04ea880276 | ||
|
|
eef44716d5 | ||
|
|
8eea84e546 | ||
|
|
acd65e7919 | ||
|
|
4a7b199929 | ||
|
|
2723e75735 | ||
|
|
0365616478 | ||
|
|
befd61eea0 | ||
|
|
daa426d73b | ||
|
|
22df1eae73 | ||
|
|
51c1efbcec |
12
README.md
@@ -9,6 +9,9 @@
|
||||

|
||||
|
||||
> *Simply gather OSINT on Github users & organizations like a God🔥*
|
||||

|
||||

|
||||
|
||||
|
||||
## Wiki
|
||||
[Refer to the Wiki](https://github.com/rly0nheart/octosuite/wiki) for installation instructions, in addition to all other documentation.
|
||||
@@ -46,16 +49,13 @@
|
||||
- [x] ...And more
|
||||
|
||||
## Note
|
||||
> octosuite automatically logs network and minor user activity of each session. The logs are saved by date and time in the .logs folder
|
||||
>> Although octosuite was developed to work on Mac, Windows, or any Linux Distribution, it has only been tested on Termux and Kali Linux
|
||||
>>> If you believe octosuite can be better, feel free to open a pull request with your improvements✌🏾🙂
|
||||
> Octosuite automatically logs network and user activity of each session, the logs are saved by date and time in the .logs folder
|
||||
|
||||
|
||||
## License
|
||||

|
||||
|
||||
## Donations
|
||||
Love octosuite and would like to donate? You can buy me a coffee using the button below.
|
||||
Buy a coffee to the creator of *Octosuite*
|
||||
|
||||
<a href="https://www.buymeacoffee.com/189381184" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>
|
||||
|
||||
Your support is much appreciated!☕👌🏾😊
|
||||
|
||||
BIN
images/octosuite_app.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
images/octosuite_app1.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
images/octosuite_exe.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
images/octosuite_gui_exe (1).png
Normal file
|
After Width: | Height: | Size: 248 KiB |
BIN
images/octosuite_gui_exe (2).png
Normal file
|
After Width: | Height: | Size: 264 KiB |
BIN
images/octosuite_gui_exe (3).png
Normal file
|
After Width: | Height: | Size: 257 KiB |
BIN
images/octosuite_gui_exe (4).png
Normal file
|
After Width: | Height: | Size: 234 KiB |
BIN
images/octosuite_gui_exe.png
Normal file
|
After Width: | Height: | Size: 207 KiB |
@@ -1,11 +1,11 @@
|
||||
import getpass
|
||||
from octosuite.colors import red, white, green, reset
|
||||
|
||||
'''
|
||||
"""
|
||||
banner.py
|
||||
This file holds the program's banner logo and version tag
|
||||
'''
|
||||
version_tag = "2.2.1"
|
||||
"""
|
||||
version_tag = "2.2.3"
|
||||
name_logo = f"""{white}
|
||||
_______ __ _______ __ __
|
||||
| |.----.| |_.-----.| __|.--.--.|__| |_.-----.
|
||||
|
||||
@@ -5,39 +5,39 @@ from datetime import datetime
|
||||
# This file gets called first at start up before any other file gets called
|
||||
# colors.py is the reason why users get to choose whether to enable/disable colors
|
||||
system_info = [("Processor",platform.processor),
|
||||
("Node", platform.node),
|
||||
("Release", platform.release),
|
||||
("Architecture", platform.architecture),
|
||||
("Version", platform.version)]
|
||||
("Node", platform.node),
|
||||
("Release", platform.release),
|
||||
("Architecture", platform.architecture),
|
||||
("Version", platform.version)]
|
||||
banner = f"""
|
||||
OCTOSUITE © 2022 Richard Mwewa
|
||||
{datetime.now().strftime('%A %d %B %Y, %H:%M:%S%p')}
|
||||
|
||||
"""
|
||||
OCTOSUITE © 2022 Richard Mwewa
|
||||
{datetime.now().strftime('%A %d %B %Y, %H:%M:%S%p')}
|
||||
|
||||
"""
|
||||
|
||||
print(banner)
|
||||
print(f"\t{platform.system()}")
|
||||
for key, value in system_info:
|
||||
print(f"\t├─ {key}: {value()}")
|
||||
print(f"\t├─ {key}: {value()}")
|
||||
print("\n")
|
||||
while True:
|
||||
try:
|
||||
color_chooser = input(f"[ ? ] Welcome, would you like to enable colors for this session? (Y/n) ").lower()
|
||||
if color_chooser == "y":
|
||||
header_title = "bold white"
|
||||
red = "[red]"
|
||||
white = "[white]"
|
||||
green = "[green]"
|
||||
red_bold = "[white bold]"
|
||||
white_bold = "[white bold]"
|
||||
green_bold = "[green bold]"
|
||||
reset = "[/]"
|
||||
break
|
||||
elif color_chooser == "n":
|
||||
header_title = red = white = green = red_bold = white_bold = green_bold = reset = ""
|
||||
break
|
||||
else:
|
||||
print(f"\n[ ! ] Your response '{color_chooser}' is invalid (expected y or n)")
|
||||
|
||||
except KeyboardInterrupt:
|
||||
exit(f"[ ! ] Process interrupted with [Ctrl+C].")
|
||||
try:
|
||||
color_chooser = input(f"[ ? ] Welcome, would you like to enable colors for this session? (Y/n) ").lower()
|
||||
if color_chooser == "y":
|
||||
header_title = "bold white"
|
||||
red = "[red]"
|
||||
white = "[white]"
|
||||
green = "[green]"
|
||||
red_bold = "[white bold]"
|
||||
white_bold = "[white bold]"
|
||||
green_bold = "[green bold]"
|
||||
reset = "[/]"
|
||||
break
|
||||
elif color_chooser == "n":
|
||||
header_title = red = white = green = red_bold = white_bold = green_bold = reset = ""
|
||||
break
|
||||
else:
|
||||
print(f"\n[ ! ] Your response '{color_chooser}' is invalid (expected y or n)")
|
||||
|
||||
except KeyboardInterrupt:
|
||||
exit(f"[ ! ] Process interrupted with [Ctrl+C].")
|
||||
|
||||
@@ -5,10 +5,11 @@ from octosuite.sign_vars import SignVar
|
||||
from octosuite.log_roller import logRoller
|
||||
from octosuite.colors import red, white, green, reset
|
||||
|
||||
'''
|
||||
"""
|
||||
csvLogger
|
||||
This class holds the methods for creating .csv files of each functionality in main
|
||||
'''
|
||||
"""
|
||||
|
||||
class csvLogger:
|
||||
# .csv for organization' profile
|
||||
def logOrgProfile(response):
|
||||
|
||||
@@ -1,93 +1,106 @@
|
||||
from rich.table import Table
|
||||
from rich import print as xprint
|
||||
from octosuite.colors import white, green, white_bold, green_bold, header_title, reset
|
||||
|
||||
"""
|
||||
Help
|
||||
This class holds the help text for available commands.
|
||||
"""
|
||||
|
||||
|
||||
class Help:
|
||||
usageText = 'Use syntax {} to get started with %s{}%s.' % (green_bold, reset)
|
||||
usageText1 = '%sUse {} to view all available subcommands.%s' % (white, reset)
|
||||
usageText2 = "%sThe {} command works with subcommands. %s" % (white, reset)
|
||||
|
||||
|
||||
def Org():
|
||||
xprint(Help.usageText2.format(f"{green_bold}org{reset}") + Help.usageText1.format(f"{green_bold}help:org{reset}"))
|
||||
|
||||
|
||||
xprint(
|
||||
Help.usageText2.format(f"{green_bold}org{reset}") + Help.usageText1.format(f"{green_bold}help:org{reset}"))
|
||||
|
||||
|
||||
def Repo():
|
||||
xprint(Help.usageText2.format(f"{green_bold}repo{reset}") + Help.usageText1.format(f"{green_bold}help:repo{reset}"))
|
||||
|
||||
|
||||
xprint(Help.usageText2.format(f"{green_bold}repo{reset}") + Help.usageText1.format(
|
||||
f"{green_bold}help:repo{reset}"))
|
||||
|
||||
|
||||
def User():
|
||||
xprint(Help.usageText2.format(f"{green_bold}user{reset}") + Help.usageText1.format(f"{green_bold}help:user{reset}"))
|
||||
|
||||
xprint(Help.usageText2.format(f"{green_bold}user{reset}") + Help.usageText1.format(
|
||||
f"{green_bold}help:user{reset}"))
|
||||
|
||||
|
||||
def Search():
|
||||
xprint(Help.usageText2.format(f"{green_bold}search{reset}") + Help.usageText1.format(f"{green_bold}help:search{reset}"))
|
||||
|
||||
|
||||
xprint(Help.usageText2.format(f"{green_bold}search{reset}") + Help.usageText1.format(
|
||||
f"{green_bold}help:search{reset}"))
|
||||
|
||||
|
||||
def Source():
|
||||
xprint(Help.usageText2.format(f"{green_bold}source{reset}") + Help.usageText1.format(f"{green_bold}help:source{reset}"))
|
||||
|
||||
xprint(Help.usageText2.format(f"{green_bold}source{reset}") + Help.usageText1.format(
|
||||
f"{green_bold}help:source{reset}"))
|
||||
|
||||
|
||||
def Logs():
|
||||
xprint(Help.usageText2.format(f"{green_bold}logs{reset}") + Help.usageText1.format(f"{green_bold}help:logs{reset}"))
|
||||
|
||||
|
||||
xprint(Help.usageText2.format(f"{green_bold}logs{reset}") + Help.usageText1.format(
|
||||
f"{green_bold}help:logs{reset}"))
|
||||
|
||||
|
||||
def Version():
|
||||
xprint(Help.usageText2.format(f"{green_bold}version{reset}") + Help.usageText1.format(f"{green_bold}help:version{reset}"))
|
||||
|
||||
|
||||
xprint(Help.usageText2.format(f"{green_bold}version{reset}") + Help.usageText1.format(
|
||||
f"{green_bold}help:version{reset}"))
|
||||
|
||||
|
||||
def Csv():
|
||||
xprint(Help.usageText2.format(f"{green_bold}csv{reset}") + Help.usageText1.format(f"{green_bold}help:csv{reset}"))
|
||||
|
||||
|
||||
xprint(
|
||||
Help.usageText2.format(f"{green_bold}csv{reset}") + Help.usageText1.format(f"{green_bold}help:csv{reset}"))
|
||||
|
||||
|
||||
def versionCommand():
|
||||
version_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
version_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
version_cmd_table.add_column("Command", style="dim", width=12)
|
||||
version_cmd_table.add_column("Description")
|
||||
version_cmd_table.add_row("check", "Check for new release(s)")
|
||||
version_cmd_table.add_row("check", "Check for new release(s)")
|
||||
version_cmd_table.add_row("info", "Version information")
|
||||
|
||||
syntax = f"{green}version:<command>{reset}"
|
||||
xprint(f"{Help.usageText.format(syntax, 'version management')}")
|
||||
xprint(version_cmd_table)
|
||||
|
||||
|
||||
|
||||
|
||||
def sourceCommand():
|
||||
source_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
source_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
source_cmd_table.add_column("Command", style="dim", width=12)
|
||||
source_cmd_table.add_column("Description")
|
||||
source_cmd_table.add_row("zipball", "Download source code Zipball")
|
||||
source_cmd_table.add_row("zipball", "Download source code Zipball")
|
||||
source_cmd_table.add_row("tarball", "Download source code Tarball")
|
||||
|
||||
syntax = f"{green}source:<command>{reset}"
|
||||
xprint(f"{Help.usageText.format(syntax, 'source code downloads')}")
|
||||
xprint(source_cmd_table)
|
||||
|
||||
|
||||
|
||||
|
||||
def searchCommand():
|
||||
search_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
search_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
search_cmd_table.add_column("Command", style="dim", width=12)
|
||||
search_cmd_table.add_column("Description")
|
||||
search_cmd_table.add_row("users", "Search user(s)")
|
||||
search_cmd_table.add_row("users", "Search user(s)")
|
||||
search_cmd_table.add_row("repos", "Search repositor[y][ies]")
|
||||
search_cmd_table.add_row("topics", "Search topic(s)")
|
||||
search_cmd_table.add_row("issues", "Search issue(s)")
|
||||
search_cmd_table.add_row("commits", "Search commit(s)")
|
||||
search_cmd_table.add_row("commits", "Search commit(s)")
|
||||
|
||||
syntax = f"{green}search:<command>{reset}"
|
||||
xprint(f"{Help.usageText.format(syntax, 'target discovery')}")
|
||||
xprint(search_cmd_table)
|
||||
|
||||
|
||||
|
||||
|
||||
def userCommand():
|
||||
user_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
user_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
user_cmd_table.add_column("Command", style="dim", width=12)
|
||||
user_cmd_table.add_column("Description")
|
||||
user_cmd_table.add_row("profile", "Get a target's profile info")
|
||||
user_cmd_table.add_row("profile", "Get a target's profile info")
|
||||
user_cmd_table.add_row("gists", "Return a users's gists")
|
||||
user_cmd_table.add_row("org", "Return organizations that a target belongs to/owns")
|
||||
user_cmd_table.add_row("repos", "Return a target's repositories")
|
||||
user_cmd_table.add_row("events", "Return a target's events")
|
||||
user_cmd_table.add_row("events", "Return a target's events")
|
||||
user_cmd_table.add_row("follows", "Check if user(A) follows user(B)")
|
||||
user_cmd_table.add_row("followers", "Return a target's followers")
|
||||
user_cmd_table.add_row("following", "Return a list of users the target is following")
|
||||
@@ -96,13 +109,13 @@ class Help:
|
||||
syntax = f"{green}user:<command>{reset}"
|
||||
xprint(f"{Help.usageText.format(syntax, 'user investigation(s)')}")
|
||||
xprint(user_cmd_table)
|
||||
|
||||
|
||||
|
||||
|
||||
def orgCommand():
|
||||
org_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
org_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
org_cmd_table.add_column("Command", style="dim", width=12)
|
||||
org_cmd_table.add_column("Description")
|
||||
org_cmd_table.add_row("profile", "Get a target organization' profile info")
|
||||
org_cmd_table.add_row("profile", "Get a target organization' profile info")
|
||||
org_cmd_table.add_row("repos", "Return a target organization' repositories")
|
||||
org_cmd_table.add_row("events", "Return a target organization' events")
|
||||
org_cmd_table.add_row("member", "Check if a specified user is a public member of the target organization")
|
||||
@@ -110,68 +123,68 @@ class Help:
|
||||
syntax = f"{green}org:<command>{reset}"
|
||||
xprint(f"{Help.usageText.format(syntax, 'organization investigation(s)')}")
|
||||
xprint(org_cmd_table)
|
||||
|
||||
|
||||
|
||||
|
||||
def repoCommand():
|
||||
repo_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
repo_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
repo_cmd_table.add_column("Command", style="dim", width=12)
|
||||
repo_cmd_table.add_column("Description")
|
||||
repo_cmd_table.add_row("profile", "Get a repository's info")
|
||||
repo_cmd_table.add_row("profile", "Get a repository's info")
|
||||
repo_cmd_table.add_row("issues", "Return a repository's issues")
|
||||
repo_cmd_table.add_row("forks", "Return a repository's forks")
|
||||
repo_cmd_table.add_row("releases", "Return a repository's releases")
|
||||
repo_cmd_table.add_row("stargazers", "Return a repository's stargazers")
|
||||
repo_cmd_table.add_row("stargazers", "Return a repository's stargazers")
|
||||
repo_cmd_table.add_row("path_contents", "List contents in a path of a repository")
|
||||
|
||||
syntax = f"{green}repo:<command>{reset}"
|
||||
xprint(f"{Help.usageText.format(syntax, 'repository investigation(s)')}")
|
||||
xprint(repo_cmd_table)
|
||||
|
||||
|
||||
|
||||
|
||||
def logsCommand():
|
||||
logs_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
logs_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
logs_cmd_table.add_column("Command", style="dim", width=12)
|
||||
logs_cmd_table.add_column("Description")
|
||||
logs_cmd_table.add_row("view", "View logs")
|
||||
logs_cmd_table.add_row("view", "View logs")
|
||||
logs_cmd_table.add_row("read", "Read log")
|
||||
logs_cmd_table.add_row("delete", "Delete log")
|
||||
|
||||
syntax = f"{green}logs:<command>{reset}"
|
||||
xprint(f"{Help.usageText.format(syntax, 'log(s) management')}")
|
||||
xprint(logs_cmd_table)
|
||||
|
||||
|
||||
|
||||
def csvCommand():
|
||||
csv_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
csv_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
csv_cmd_table.add_column("Command", style="dim", width=12)
|
||||
csv_cmd_table.add_column("Description")
|
||||
csv_cmd_table.add_row("view", "View csv files")
|
||||
csv_cmd_table.add_row("view", "View csv files")
|
||||
csv_cmd_table.add_row("read", "Read csv")
|
||||
csv_cmd_table.add_row("delete", "Delete csv")
|
||||
|
||||
syntax = f"{green}csv:<command>{reset}"
|
||||
xprint(f"{Help.usageText.format(syntax, 'csv management')}")
|
||||
xprint(csv_cmd_table)
|
||||
|
||||
|
||||
|
||||
def helpCommand():
|
||||
core_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
core_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
core_cmd_table.add_column("Command", style="dim", width=12)
|
||||
core_cmd_table.add_column("Description")
|
||||
core_cmd_table.add_row("help", "Help menu")
|
||||
core_cmd_table.add_row("exit", "Close session")
|
||||
core_cmd_table.add_row("help", "Help menu")
|
||||
core_cmd_table.add_row("exit", "Close session")
|
||||
core_cmd_table.add_row("clear", "Clear screen")
|
||||
core_cmd_table.add_row("about", "Program's info")
|
||||
core_cmd_table.add_row("about", "Program's info")
|
||||
core_cmd_table.add_row("author", "Developer's info")
|
||||
|
||||
help_sub_cmd_table =Table(show_header=True, header_style=header_title)
|
||||
|
||||
help_sub_cmd_table = Table(show_header=True, header_style=header_title)
|
||||
help_sub_cmd_table.add_column("Command", style="dim", width=12)
|
||||
help_sub_cmd_table.add_column("Description")
|
||||
help_sub_cmd_table.add_row("csv", "List all csv management commands")
|
||||
help_sub_cmd_table.add_row("logs", "List all logs management commands")
|
||||
help_sub_cmd_table.add_row("org", "List all organization investigation commands")
|
||||
help_sub_cmd_table.add_row("user", "List all users investigation commands")
|
||||
help_sub_cmd_table.add_row("repo", "List all repository investigation commands")
|
||||
help_sub_cmd_table.add_row("repo", "List all repository investigation commands")
|
||||
help_sub_cmd_table.add_row("search", "List all target discovery commands")
|
||||
help_sub_cmd_table.add_row("source", "List all source code download commands (for developers)")
|
||||
help_sub_cmd_table.add_row("version", "List all version management commands")
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
"""
|
||||
logRoller
|
||||
This class is where the main notification strings/messages are held,
|
||||
and are being used in two different cases (they're beig used by logging to be written to log files, and being printed out to the screen).
|
||||
logRoller This class is where the main notification strings/messages are held, and are being used in two different
|
||||
cases (they're being used by logging to be written to log files, and being printed out to the screen).
|
||||
"""
|
||||
|
||||
|
||||
class logRoller:
|
||||
Ctrl = "Session terminated with {}."
|
||||
Error = "An error occurred: {}"
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
from octosuite.colors import red, white, green, reset
|
||||
from octosuite.colors import red, white, green, reset
|
||||
|
||||
'''
|
||||
SignVar
|
||||
*Even here, I couldn't think of a good name.*
|
||||
The Attributes class holds the signs/symbols that show what a notification in OctoSuite might be all about.
|
||||
This might not be very important or necessary in some cases, but I think it's better to know the severerity of the notifications you get in a program.
|
||||
'''
|
||||
"""
|
||||
SignVar *Even here, I couldn't think of a good name.* The Attributes class holds the signs/symbols that show what
|
||||
a notification in OctoSuite might be all about. This might not be very important or necessary in some cases,
|
||||
but I think it's better to know the severity of the notifications you get in a program.
|
||||
"""
|
||||
class SignVar:
|
||||
prompt = f"{white}[{green} ? {white}]{reset}"
|
||||
warning = f"{white}[{red} ! {white}]{reset}"
|
||||
error = f"{white}[{red} x {white}]{reset}"
|
||||
positive = f"{white}[{green} + {white}]{reset}"
|
||||
negative = f"{white}[{red} - {white}]{reset}"
|
||||
info = f"{white}[{green} * {white}]{reset}"
|
||||
prompt = f"{white}[{green} ? {white}]{reset}"
|
||||
warning = f"{white}[{red} ! {white}]{reset}"
|
||||
error = f"{white}[{red} x {white}]{reset}"
|
||||
positive = f"{white}[{green} + {white}]{reset}"
|
||||
negative = f"{white}[{red} - {white}]{reset}"
|
||||
info = f"{white}[{green} * {white}]{reset}"
|
||||
|
||||
4
setup.py
@@ -5,9 +5,9 @@ with open("README.md", "r", encoding="utf-8") as file:
|
||||
|
||||
setuptools.setup(
|
||||
name="octosuite",
|
||||
version="2.2.1",
|
||||
version="2.2.3",
|
||||
author="Richard Mwewa",
|
||||
author_email="richardmwewa@duck.com",
|
||||
author_email="rly0nheart@duck.com",
|
||||
packages=["octosuite"],
|
||||
description="Advanced Github OSINT Framework",
|
||||
long_description=long_description,
|
||||
|
||||