Compare commits

..

10 Commits

Author SHA1 Message Date
Richard Mwewa
3cd6442d91 Update README.md 2022-04-28 01:33:21 +02:00
Richard Mwewa
7ebb90790a Update banner.py 2022-04-28 01:10:39 +02:00
Richard Mwewa
ca0d2dc268 Update main.py 2022-04-28 01:08:26 +02:00
Richard Mwewa
51babb3c45 Update README.md 2022-04-27 17:09:33 +02:00
Richard Mwewa
12e9dbcae9 Update main.py 2022-04-27 15:31:31 +02:00
Richard Mwewa
be4e88d99b Update banner.py 2022-04-27 15:29:53 +02:00
Richard Mwewa
f7ac0fb8d5 Update colors.py 2022-04-27 15:28:07 +02:00
Richard Mwewa
fc7a65c593 Update octosuite 2022-04-27 15:25:15 +02:00
Richard Mwewa
51f2a46c65 Delete tmp 2022-04-23 14:10:18 +02:00
Richard Mwewa
4afbc5adaa Create tmp 2022-04-23 14:09:35 +02:00
5 changed files with 98 additions and 146 deletions

View File

@@ -1,14 +1,22 @@
![octosuite](https://user-images.githubusercontent.com/74001397/165550323-d880e320-a4c0-4f4e-87dd-d2e8319554ec.png)
![OS](https://img.shields.io/badge/OS-GNU%2FLinux-red?style=for-the-badge&logo=Linux)
![OS](https://img.shields.io/badge/OS-Windows-blue?style=for-the-badge&logo=Windows)
![OS](https://img.shields.io/badge/OS-Mac-white?style=for-the-badge&logo=apple)
![GitHub](https://img.shields.io/github/license/rly0nheart/octosuite?style=for-the-badge&logo=github)
![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/rly0nheart/octosuite?style=for-the-badge&logo=github)
![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/rly0nheart/octosuite/1.7.0-dev?style=for-the-badge&logo=github)
![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/rly0nheart/octosuite/1.8.0?style=for-the-badge&logo=github)
![GitHub last commit](https://img.shields.io/github/last-commit/rly0nheart/octosuite?style=for-the-badge&logo=github)
![GitHub repo size](https://img.shields.io/github/repo-size/rly0nheart/octosuite?style=for-the-badge&logo=github)
> *Simply gather OSINT on Github users & organizations like a God🔥*
# INSTALLATION
Installation instructions are on the wiki, in addition to all other documentation.
[Refer to the Wiki](https://github.com/rly0nheart/octosuite/wiki)
***
# FEATURES
- [x] Fetches organization info
- [x] Fetches user info
@@ -28,77 +36,7 @@
- [x] Automatically logs network activity (.logs folder)
- [x] User can view, read and delete log files
# INSTALLATION
## Clone from Github
```
git clone https://github.com/rly0nheart/octosuite.git
```
![Screenshot_20220414-002508](https://user-images.githubusercontent.com/74001397/163280996-ed0f8817-c3e3-49d8-9e15-93452cb08a3e.jpg)
```
cd octosuite
```
![Screenshot_20220414-002214](https://user-images.githubusercontent.com/74001397/163281317-158bbf7b-073f-457e-8a8a-730d4c0ed413.jpg)
```
pip install -r requirements.txt
```
![Screenshot_20220414-004420](https://user-images.githubusercontent.com/74001397/163282481-6cb5efe8-6e5a-4c2b-a8b5-7ff99f7ca293.jpg)
## Install from PyPI
```
pip install octosuite
```
![Screenshot_20220414-005400](https://user-images.githubusercontent.com/74001397/163283184-e9458439-8074-4338-938b-4588390bb6b7.jpg)
# GITHUB FORK USAGE
## Linux
```
sudo chmod +x octosuite
```
![Screenshot_20220414-004443](https://user-images.githubusercontent.com/74001397/163282620-a5307969-bcce-49d1-ad3c-c3ea0f78fb44.jpg)
```
sudo ./octosuite
```
![Screenshot_20220414-004507](https://user-images.githubusercontent.com/74001397/163282716-41ace7fc-ee04-4c95-985e-68dd3286682c.jpg)
## Windows
```
python3 octosuite
```
## Mac
```
python3 octosuite
```
# PYPI PACKAGE USAGE
## Linux
```
octosuite
```
## Windows
```
octosuite
```
## Mac
```
octosuite
```
***
# AVAILABLE COMMANDS
| COMMAND | DESCRIPTION|
| ------------- |:---------:|
@@ -125,19 +63,22 @@ octosuite
| ``help`` | *show usage/help* |
| ``exit`` | *exit session* |
# NOTE
***
# NOTES
* *octosuite automatically logs network and minor user activity. The logs are saved by date and time in .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* ✌🏾🙂
***
# PYPI
[PyPI Package](https://pypi.org/project/octosuite)
![PyPI Downloads](https://pepy.tech/badge/octosuite)
***
# LICENSE
![license](https://user-images.githubusercontent.com/74001397/137917929-2f2cdb0c-4d1d-4e4b-9f0d-e01589e027b5.png)
***
# ABOUT DEVELOPER
[About.me](https://about.me/rly0nheart)

View File

@@ -1,23 +1,23 @@
import os
from lib.colors import red,white,white_bg,red_bg,reset
from lib.colors import red, white, green, red_bg,reset
banner = f'''{red}
▒█████ ▄████▄ ▄▄▄█████▓ ▒█████ ██████ █ ██ ██▓▄▄▄█████▓▓█████
▒██▒ ██▒▒██▀ ▀█ ▓ ██▒ ▓▒▒██▒ ██▒▒██ ▒ ██ ▓██▒▓██▒▓ ██▒ ▓▒▓█ ▀
▒██░ ██▒▒▓█ ▄ ▒ ▓██░ ▒░▒██░ ██▒░ ▓██▄ ▓██ ▒██░▒██▒▒ ▓██░ ▒░▒███
▒██ ██░▒▓▓▄ ▄██▒░ ▓██▓ ░ ▒██ ██░ ▒ ██▒▓▓█ ░██░░██░░ ▓██▓ ░ ▒▓█ ▄
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ {red_bg}v1.7.0-dev{reset}{red}
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
{white}— Advanced Github {red}OSINT{white} Framework{reset}
▒█████ ▄████▄ ▄▄▄█████▓ ▒█████ ██████ █ ██ ██▓▄▄▄█████▓▓█████
▒██▒ ██▒▒██▀ ▀█ ▓ ██▒ ▓▒▒██▒ ██▒▒██ ▒ ██ ▓██▒▓██▒▓ ██▒ ▓▒▓█ ▀
▒██░ ██▒▒▓█ ▄ ▒ ▓██░ ▒░▒██░ ██▒░ ▓██▄ ▓██ ▒██░▒██▒▒ ▓██░ ▒░▒███
▒██ ██░▒▓▓▄ ▄██▒░ ▓██▓ ░ ▒██ ██░ ▒ ██▒▓▓█ ░██░░██░░ ▓██▓ ░ ▒▓█ ▄
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ {red_bg} v1.8.0 {reset}{red}
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
{white}— Advanced Github {red}OSINT{white} Framework{reset}
> {white}Current user: {white_bg}{os.getlogin()}{reset}
> {white}Use {white_bg}help{reset}{white} command for usage{reset}
> {white}Commands are {white_bg}case sensitive{reset}
{'-'*30}
> {white}Current user: {green}{os.getlogin()}{reset}
> {white}Use {green}help{reset}{white} command for usage{reset}
> {white}Commands are case sensitive{reset}
{'-'*27}
'''

View File

@@ -10,28 +10,42 @@ if machine.lower().startswith(("os", "win", "darwin","ios")):
colors = False
if not colors:
reset = red = white = green = green_bg = white_bg = red_bg = ""
reset = red = white = green = red_bg = ""
else:
date_time = datetime.now()
print(f"\n\t OCTOSUITE © 2022 Richard Mwewa\n\t{date_time.strftime('%A %d %B %Y, %H:%M:%S%p')}\n\n\nOS: {platform.system()}\nProcessor: {platform.processor()}\nNode: {platform.node()}\nRelease: {platform.release()}\nArchitecture: {platform.architecture()}\nVersion: {platform.version()}\n\n")
sys_info = [("Processor",platform.processor),
("Node", platform.node),
("Release", platform.release),
("Architecture", platform.architecture),
("Version", platform.version)]
banner = f"""
OCTOSUITE © 2022 Richard Mwewa
{date_time.strftime('%A %d %B %Y, %H:%M:%S%p')}
{platform.system()}"""
print(banner)
for key, value in sys_info:
print(f"\t├─ {key}: {value()}")
print("\n")
while True:
try:
color_chooser = input(f"[ ? ] Welcome {os.getlogin()}, would you like to enable colors for this session? (y/n) ")
if color_chooser.lower() == "y":
white = "\033[97m"
white_bg = "\033[47;30m"
red = "\033[91m"
reset = "\033[0m"
green = "\033[92m"
green_bg = "\033[42;37m"
red_bg = "\033[41;37m"
break
elif color_chooser.lower() == "n":
red = white = green = green_bg = white_bg = red_bg = reset = ""
red = white = green = red_bg = 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")
exit(f"[ ! ] Process interrupted with (Ctrl+C)")

View File

@@ -2,16 +2,16 @@
import logging
from src.main import *
from lib.colors import red,red_bg,white,reset
from lib.colors import red,white,reset
if __name__ == '__main__':
try:
octosuite().on_start()
except KeyboardInterrupt:
logging.warning('Process interrupted with Ctrl+C')
exit(f'\n{white}[{red} x {white}] Process interrupted with {red_bg}Ctrl+C{reset}')
logging.warning('Session terminated with (Ctrl+C)')
exit(f'\n{white}[{red} x {white}] Session terminated with ({red}Ctrl{white}+{red}C{reset}{white}).{reset}')
except Exception as e:
logging.error(f'Session terminated on error: {e}')
exit(f'\n{white}[{red} ! {white}] Session {red_bg}terminated{reset}{white} on error: {red}{e}{reset}')
exit(f'\n{white}[{red} ! {white}] Session terminated on error: {red}{e}{reset}')

View File

@@ -23,7 +23,7 @@ from tqdm import tqdm
from pprint import pprint
from lib.banner import banner
from datetime import datetime
from lib.colors import red, white, green, green_bg, white_bg, red_bg, reset
from lib.colors import red, white, green, red_bg, reset
class octosuite:
def __init__(self):
@@ -225,15 +225,15 @@ class octosuite:
else:
pass
input(f'\n{white}[{green} ? {white}] Press {white_bg}any key{reset}{white} to continue{reset} ')
input(f'\n{white}[{green} ? {white}] Press any key to continue{reset} ')
# Fetching organization info
def org_info(self):
organization = input(f'\n{white}[{white_bg}@Organization{reset}{white}] (username){reset} ')
organization = input(f'\n{white}--> @{green}organization{white} (username){reset} ')
api = f'https://api.github.com/orgs/{organization}'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{white}[{red}-{white}] Organization @{organization} {red_bg}Not Found{reset}')
print(f'\n{white}[{red} - {white}] Organization ({organization}) not found.{reset}')
else:
response = response.json()
print(f"\n{white}{response['name']}{reset}")
@@ -243,11 +243,11 @@ class octosuite:
# Fetching user information
def user_profile(self):
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ')
username = input(f'\n{white}--> @{green}username{reset} ')
api = f'https://api.github.com/users/{username}'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}')
print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
else:
response = response.json()
print(f"\n{white}{response['name']}{reset}")
@@ -257,12 +257,12 @@ class octosuite:
# Fetching repository information
def repo_info(self):
repo_name = input(f'\n{white}[{white_bg}%reponame{reset}{white}]{reset} ')
username = input(f'{white}[{white_bg}@Owner{reset}{white}] (username){reset} ')
repo_name = input(f'\n{white}--> %{green}reponame{reset} ')
username = input(f'{white}--> @{green}owner{white} (username){reset} ')
api = f'https://api.github.com/repos/{username}/{repo_name}'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{white}[{red} - {white}] Repository %{repo_name} or user @{username} {red_bg}Not Found{reset}')
print(f'\n{white}[{red} - {white}] Repository ({repo_name}) or user ({username}) not found.{reset}')
else:
response = response.json()
print(f"\n{white}{response['full_name']}{reset}")
@@ -272,13 +272,13 @@ class octosuite:
# Get path contents
def path_contents(self):
repo_name = input(f'\n{white}[{white_bg}%reponame{reset}{white}]{reset} ')
username = input(f'{white}[{white_bg}@Owner{reset}{white}] (username){reset} ')
path_name = input(f'{white}[{white_bg}/path/name{reset}{white}]{reset} ')
repo_name = input(f'\n{white}--> %{green}reponame{reset} ')
username = input(f'{white}--> @{green}owner{white} (username){reset} ')
path_name = input(f'{white}--> ~{green}/path/name{reset} ')
api = f'https://api.github.com/repos/{username}/{repo_name}/contents/{path_name}'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{white}[{red} - {white}] Information {red_bg}Not Found{reset}')
print(f'\n{white}[{red} - {white}] Information not found.{reset}')
else:
response = response.json()
for item in response:
@@ -289,11 +289,11 @@ class octosuite:
# Fetching organization repositories
def org_repos(self):
organization = input(f'\n{white}[{white_bg}@Organization{reset}{white}] (username){reset} ')
organization = input(f'\n{white}--> @{green}organization{white} (username){reset} ')
api = f'https://api.github.com/orgs/{organization}/repos?per_page=100'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{white}[{red} - {white}] Organization @{organization} {red_bg}Not Found{reset}')
print(f'\n{white}[{red} - {white}] Organization ({organization}) not found.{reset}')
else:
response = response.json()
for repo in response:
@@ -305,11 +305,11 @@ class octosuite:
# Fetching user repositories
def user_repos(self):
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ')
username = input(f'\n{white}--> @{green}username{reset} ')
api = f'https://api.github.com/users/{username}/repos?per_page=100'
response = requests.get(api)
if response.status_code != 200:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}')
print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
else:
response = response.json()
for repo in response:
@@ -321,13 +321,13 @@ class octosuite:
# Fetching user's gists
def user_gists(self):
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ')
username = input(f'\n{white}--> @{green}username{reset} ')
api = f'https://api.github.com/users/{username}/gists'
response = requests.get(api).json()
if response == []:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}does not{reset}{white} have any active gists.{reset}')
elif "Not Found" in response['message']:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}')
print(f'\n{white}[{red} - {white}] User ({username}) does not have any active gists.{reset}')
elif "not found" in response['message']:
print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
else:
for item in response:
print(f"\n{white}{item['id']}{reset}")
@@ -338,13 +338,13 @@ class octosuite:
# Fetching user's followera'
def followers(self):
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ')
username = input(f'\n{white}--> @{green}username{reset} ')
api = f'https://api.github.com/users/{username}/followers?per_page=100'
response = requests.get(api).json()
if response == []:
print(f'\n{white}[{red} - {white}]User @{username} {red_bg}does not{reset}{white} have followers.{reset}')
elif "Not Found" in response['message']:
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}')
print(f'\n{white}[{red} - {white}]User ({username}) does not have followers.{reset}')
elif "not found" in response['message']:
print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
else:
for item in response:
print(f"\n{white}@{item['login']}{reset}")
@@ -355,19 +355,19 @@ class octosuite:
# Checking whether or not user[A] follows user[B]
def following(self):
user_a = input(f'\n{white}[{white_bg}@User A{reset}{white}] (username){reset} ')
user_b = input(f'{white}[{white_bg}@User B{reset}{white}] (username){reset} ')
user_a = input(f'\n{white}--> @{green}user{white}[A] (username){reset} ')
user_b = input(f'{white}--> @{green}user{white}[B] (username){reset} ')
api = f'https://api.github.com/users/{user_a}/following/{user_b}'
response = requests.get(api)
if response.status_code == 204:
print(f'\n{white}[{green} + {white}] @{user_a} {green_bg}follows{reset}{white} @{user_b}.{reset}')
print(f'\n{white}[{green} + {white}] @{user_a} follows @{user_b}.{reset}')
else:
print(f'\n{white}[{red} - {white}] @{user_a} {red_bg}does not{reset}{white} follow @{user_b}.{reset}')
print(f'\n{white}[{red} - {white}] @{user_a} does not follow @{user_b}.{reset}')
# User search
def user_search(self):
query = input(f'\n{white}[{white_bg}#@Query{reset}{white}]{reset} ')
query = input(f'\n{white}--> @{green}query{white} (eg. john){reset} ')
api = f'https://api.github.com/search/users?q={query}&per_page=100'
response = requests.get(api).json()
for item in response['items']:
@@ -379,7 +379,7 @@ class octosuite:
# Repository search
def repo_search(self):
query = input(f'\n{white}[{white_bg}#%Query{reset}{white}]{reset} ')
query = input(f'\n{white}--> %{green}query{white} (eg. git){reset} ')
api = f'https://api.github.com/search/repositories?q={query}&per_page=100'
response = requests.get(api).json()
for item in response['items']:
@@ -391,7 +391,7 @@ class octosuite:
# Topics search
def topic_search(self):
query = input(f'\n{white}[{white_bg}##Query{reset}{white}]{reset} ')
query = input(f'\n{white}--> #{green}query{white} (eg. osint){reset} ')
api = f'https://api.github.com/search/topics?q={query}&per_page=100'
response = requests.get(api).json()
for item in response['items']:
@@ -403,7 +403,7 @@ class octosuite:
# Issue search
def issue_search(self):
query = input(f'\n{white}[{white_bg}#!Query{reset}{white}]{reset} ')
query = input(f'\n{white}--> !{green}query{white} (eg. error){reset} ')
api = f'https://api.github.com/search/issues?q={query}&per_page=100'
response = requests.get(api).json()
for item in response['items']:
@@ -415,13 +415,13 @@ class octosuite:
# Commits search
def commits_search(self):
query = input(f'\n{white}[{white_bg}#:Query{reset}{white}]{reset} ')
query = input(f'\n{white}--> :{green}query{white} (eg. filename:index.php){reset} ')
api = f'https://api.github.com/search/commits?q={query}&per_page=100'
response = requests.get(api).json()
number=0
for item in response['items']:
number+=1
print(f'{white}{number}.{reset}')
print(f'\n{white}-> {number}.{reset}')
pprint(item['commit'])
print('\n')
@@ -437,7 +437,7 @@ class octosuite:
# Delete a specified log file
def delete_log(self):
log_file = input(f"\n{white}[{white_bg}logfile{reset}{white}]{reset} ")
log_file = input(f"\n{white}--> logfile (eg. 2022-04-27 10:09:36.068312.log){reset} ")
if sys.platform.lower().startswith(('win','darwin')):
subprocess.run(['del',f'{os.getcwd()}/.logs/{log_file}'])
else:
@@ -449,7 +449,7 @@ class octosuite:
# Read a specified log file
def read_log(self):
log_file = input(f"\n{white}[{white_bg}logfile{reset}{white}]{reset} ")
log_file = input(f"\n{white}--> logfile (eg. 2022-04-27 10:09:36.068312.log){reset} ")
with open(f'.logs/{log_file}', 'r') as log:
logging.info(f'Reading log file: {log_file}')
print("\n"+log.read())
@@ -466,7 +466,7 @@ class octosuite:
code.close()
logging.info('Update complete.')
exit(f'{white}[{green} + {white}] {green_bg}Updated{reset}{white} successfully. Re-run octosuite.{reset}')
exit(f'{white}[{green} + {white}] Update complete. Re-run octosuite.{reset}')
# Show changelog
@@ -474,13 +474,10 @@ class octosuite:
# lol yes the changelog is hard coded
changelog_text = f'''
{red_bg}v1.7.0-dev [CHANGELOG] {reset}
• Changed (y/n) behavior in color chooser (where any input apart from 'y' was considered as 'n')
Added 'logs:view' command for viewing octosuite logs
• Added 'logs:read' command for reading a specified log file
• Added 'logs:delete' command for deleting a specified log file
• Minor improvements
{red_bg} {reset}'''
{red_bg} v1.8.0 [CHANGELOG] {reset}
• Cleaned code
Changes and improvements (noticeable)
{red_bg} {reset}'''
print(changelog_text)
@@ -493,8 +490,8 @@ class octosuite:
# Close session
def exit_session(self):
logging.info('Session closed with \'exit\' command.')
exit(f'\n{white}[{green} ! {white}] Session closed with {white_bg}exit{reset}{white} command.{reset}')
logging.info('Session closed with (exit) command.')
exit(f'\n{white}[{green} ! {white}] Session closed with ({green}exit{reset}{white}) command.{reset}')
# Help/usage