mirror of
https://github.com/bellingcat/octosuite.git
synced 2026-06-11 04:48:34 +03:00
Compare commits
9 Commits
1.5.0
...
1.5.1-beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d1e163d9a | ||
|
|
a8730864e9 | ||
|
|
315cb7ec6f | ||
|
|
2afac6c0d4 | ||
|
|
b226f1b53b | ||
|
|
bb38d95e57 | ||
|
|
eae41866ec | ||
|
|
1e71c2d3bd | ||
|
|
d91f88d31b |
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Smartphone (please complete the following information):**
|
||||
- Device: [e.g. iPhone6]
|
||||
- OS: [e.g. iOS8.1]
|
||||
- Browser [e.g. stock browser, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Richard Mwewa (Telegram)
|
||||
url: https://t.me/rly0nheart/
|
||||
about: Please ask and answer questions here.
|
||||
- name: Richard Mwewa (Twitter)
|
||||
url: https://m.twitter.com/rly0nheart/
|
||||
about: Please report security vulnerabilities or bugs here.
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
5
LICENSE
5
LICENSE
@@ -1,3 +1,4 @@
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
@@ -631,8 +632,8 @@ to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
octosuite Advanced Github OSINT Framework
|
||||
Copyright (C) 2022 Richard Mwewa
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
||||
43
README.md
43
README.md
@@ -1,14 +1,15 @@
|
||||

|
||||
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
> *Simply gather OSINT on Github users and organizations like a god🔥*
|
||||
> *Simply gather OSINT on Github users & organizations like a God🔥*
|
||||
|
||||
# FEATURES
|
||||
- [x] Fetches organization info
|
||||
@@ -29,7 +30,7 @@
|
||||
- [x] Automatically logs network activity (.logs folder)
|
||||
|
||||
# INSTALLATION
|
||||
**clone project**:
|
||||
## Clone from Github
|
||||
|
||||
```
|
||||
git clone https://github.com/rly0nheart/octosuite.git
|
||||
@@ -43,8 +44,13 @@ cd octosuite
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
# USAGE
|
||||
**Linux**:
|
||||
## Install from PyPI
|
||||
```
|
||||
pip install octosuite
|
||||
```
|
||||
|
||||
# GITHUB FORK USAGE
|
||||
## Linux
|
||||
```
|
||||
sudo chmod +x octosuite
|
||||
```
|
||||
@@ -53,16 +59,32 @@ sudo chmod +x octosuite
|
||||
sudo ./octosuite
|
||||
```
|
||||
|
||||
**Windows**:
|
||||
## Windows
|
||||
```
|
||||
python3 octosuite
|
||||
```
|
||||
|
||||
**Mac**:
|
||||
## Mac
|
||||
```
|
||||
python3 octosuite
|
||||
```
|
||||
|
||||
# PYPI PACKAGE USAGE
|
||||
## Linux
|
||||
```
|
||||
octosuite
|
||||
```
|
||||
|
||||
## Windows
|
||||
```
|
||||
octosuite
|
||||
```
|
||||
|
||||
## Mac
|
||||
```
|
||||
octosuite
|
||||
```
|
||||
|
||||
# AVAILABLE COMMANDS
|
||||
| Command | Usage|
|
||||
| ------------- |:---------:|
|
||||
@@ -91,6 +113,9 @@ python3 octosuite
|
||||
* *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***
|
||||
|
||||
# PYPI
|
||||
[PyPI](https://pypi.org/project/octosuite)
|
||||
|
||||
# LICENSE
|
||||

|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import os
|
||||
from lib.colors import red,white,green,reset
|
||||
banner = f'''{red}
|
||||
▒█████ ▄████▄ ▄▄▄█████▓ ▒█████ ██████ █ ██ ██▓▄▄▄█████▓▓█████
|
||||
@@ -7,11 +8,13 @@ banner = f'''{red}
|
||||
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
|
||||
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
|
||||
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
|
||||
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ v1.5.0
|
||||
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ v1.5.1-beta
|
||||
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
|
||||
░ {white}— Advanced Github {red}OSINT{white} Framework{reset}
|
||||
|
||||
|
||||
|
||||
> {white}Welcome {os.getlogin()}{reset}
|
||||
> {white}use '{green}help{white}' command for usage{reset}
|
||||
> {white}commands are case sensitive
|
||||
{'-'*30}
|
||||
|
||||
@@ -3,7 +3,7 @@ import sys
|
||||
# Colors will be unavailable on non-linux machines
|
||||
colors = True
|
||||
machine = sys.platform
|
||||
if machine.lower().startswith(("os", "win", "darwin")):
|
||||
if machine.lower().startswith(("os", "win", "darwin","ios")):
|
||||
colors = False
|
||||
|
||||
if not colors:
|
||||
|
||||
108
src/main.py
108
src/main.py
@@ -1,9 +1,23 @@
|
||||
'''
|
||||
octosuite Advanced Github OSINT Framework
|
||||
Copyright (C) 2022 Richard Mwewa
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
'''
|
||||
|
||||
import os
|
||||
import logging
|
||||
import requests
|
||||
import platform
|
||||
import subprocess
|
||||
import urllib.request
|
||||
from tqdm import tqdm
|
||||
from pprint import pprint
|
||||
from lib.banner import banner
|
||||
@@ -162,7 +176,7 @@ class octosuite:
|
||||
subprocess.run(['clear'],shell=False)
|
||||
|
||||
print(banner)
|
||||
command = input(f'''{white}┌─({red}{platform.node()}{white}@{red}octosuite{white})-[{green}{os.getcwd()}{white}]\n└─╼[{green}:~{white}]{reset} ''')
|
||||
command = input(f'''{white}┌─({red}{os.getlogin()}{white}@{red}octosuite{white})-[{green}{os.getcwd()}{white}]\n└─╼[{green}:~{white}]{reset} ''')
|
||||
if command == 'orginfo':
|
||||
self.org_info()
|
||||
elif command == 'userinfo':
|
||||
@@ -197,20 +211,22 @@ class octosuite:
|
||||
print(self.changelog())
|
||||
elif command == 'author':
|
||||
self.author()
|
||||
elif command == 'ilinso':
|
||||
self.easter_egg()
|
||||
elif command == 'help':
|
||||
print(self.help())
|
||||
elif command == 'exit':
|
||||
logging.info('Session terminated.')
|
||||
exit(f'\n{white}[{red}-{white}] Session terminated.{reset}')
|
||||
logging.info('Session terminated with \'exit\' command')
|
||||
exit(f'\n{white}[{red}-{white}] Session terminated with \'exit\' command{reset}')
|
||||
else:
|
||||
print(f'\n{white}[{red}!{white}] Unknown command: ‘{command}’{reset}')
|
||||
logging.warning(f'Unknown command: ‘{command}’')
|
||||
print(f'\n{white}[{red}!{white}] Command not found: ‘{command}’{reset}')
|
||||
logging.warning(f'command not found: ‘{command}’')
|
||||
|
||||
input(f'\n{white}^ Press any key to continue{reset} ')
|
||||
input(f'\n{white}[{green}?{white}] Press any key to continue{reset} ')
|
||||
|
||||
|
||||
def org_info(self):
|
||||
organization = input(f'{white}@{green}Organization{white} >> {reset}')
|
||||
organization = input(f'{white}@{green}Organization {white}>>{reset} ')
|
||||
api = f'https://api.github.com/orgs/{organization}'
|
||||
response = requests.get(api)
|
||||
if response.status_code != 200:
|
||||
@@ -408,22 +424,35 @@ class octosuite:
|
||||
logging.info('Fetching updates...')
|
||||
files_to_update = ['src/main.py','lib/banner.py','lib/colors.py','octosuite','.github/dependabot.yml','LICENSE','README.md','requirements.txt']
|
||||
for file in tqdm(files_to_update,desc=f'{white}[{green}*{white}] Updating{reset}'):
|
||||
data = urllib.request.urlopen(f'https://raw.githubusercontent.com/rly0nheart/octosuite/master/{file}').read()
|
||||
data = requests.get(f'https://raw.githubusercontent.com/rly0nheart/octosuite/master/{file}')
|
||||
with open(file, 'wb') as code:
|
||||
code.write(data)
|
||||
code.write(data.content)
|
||||
code.close()
|
||||
|
||||
logging.info('Update complete.')
|
||||
exit(f'{white}[{green}+{white}] Updated successfully. Re-run octosuite.{reset}')
|
||||
|
||||
|
||||
def easter_egg(self):
|
||||
print(f'\n{white}[{green}*{white}] Downloading. Please wait...{reset}')
|
||||
file = requests.get('https://drive.google.com/uc?export=download&id=1IRu4kWSuNpYWH8hZkqQ8mLnv4sSDu-GN')
|
||||
with open('EasterEgg.zip','wb') as f:
|
||||
f.write(file.content)
|
||||
|
||||
exit(f'{white}[{green}+{white}] Downloaded (EasterEgg.zip).\n{white}[{green}!{white}] The password is: {green}horus{white}\n[{green}!{white}] Happy hunting! :).{reset}')
|
||||
|
||||
|
||||
# Show changelog
|
||||
def changelog(self):
|
||||
# lol yes the changelog is hard coded
|
||||
changelog_text = '''
|
||||
v1.5.0 Changelog:
|
||||
v1.5.1-beta CHANGELOG:
|
||||
|
||||
• Fixed import error in src/main.py
|
||||
• First pypi package release
|
||||
• Termux users will now have to manually create the .logs folder
|
||||
• Changed logs date/time format
|
||||
• Removed 1 internal dependency
|
||||
• There's an easter egg somewhere in here ;) (use the command 'ilinso')
|
||||
'''
|
||||
return changelog_text
|
||||
|
||||
@@ -436,34 +465,45 @@ class octosuite:
|
||||
|
||||
|
||||
def help(self):
|
||||
help = '''
|
||||
help = f'''
|
||||
|
||||
help:
|
||||
|
||||
Command Descritption
|
||||
{white}Command Descritption
|
||||
------------ ---------------------------------------------------------
|
||||
orginfo --> Get target organization info
|
||||
userinfo --> Get target user profile info
|
||||
repoinfo --> Get target repository info
|
||||
pathcontents --> Get contents of a specified path from a target repository
|
||||
orgrepos --> Get a list of repositories owned by a target organization
|
||||
userrepos --> Get a list of repositories owned by a target user
|
||||
usergists --> Get a list of gists owned by a target user
|
||||
userfollowers --> Get a list of the target's followers
|
||||
userfollowing --> Check whether or not User[A] follows User[B]
|
||||
usersearch --> Search user(s)
|
||||
reposearch --> Search repositor[y][ies]
|
||||
topicsearch --> Search topic(s)
|
||||
issuesearch --> Search issue(s)
|
||||
commitsearch --> Search commit(s)
|
||||
update --> Update octosuite
|
||||
changelog --> Show changelog
|
||||
author --> Show author info
|
||||
help --> Show usage/help
|
||||
exit --> Exit session
|
||||
{green}orginfo{white} --> Get target organization info{reset}
|
||||
{green}userinfo{white} --> Get target user profile info{reset}
|
||||
{green}repoinfo{white} --> Get target repository info{reset}
|
||||
{green}pathcontents{white} --> Get contents of a specified path from a target repository{reset}
|
||||
{green}orgrepos{white} --> Get a list of repositories owned by a target organization{reset}
|
||||
{green}userrepos{white} --> Get a list of repositories owned by a target user{reset}
|
||||
{green}usergists{white} --> Get a list of gists owned by a target user{reset}
|
||||
{green}userfollowers{white} --> Get a list of the target's followers{reset}
|
||||
{green}userfollowing{white} --> Check whether or not User[A] follows User[B]{reset}
|
||||
{green}usersearch{white} --> Search user(s){reset}
|
||||
{green}reposearch{white} --> Search repositor[y][ies]{reset}
|
||||
{green}topicsearch{white} --> Search topic(s){reset}
|
||||
{green}issuesearch{white} --> Search issue(s){reset}
|
||||
{green}commitsearch{white} --> Search commit(s){reset}
|
||||
{green}update{white} --> Update octosuite{reset}
|
||||
{green}changelog{white} --> Show changelog{reset}
|
||||
{green}author{white} --> Show author info{reset}
|
||||
{green}help{white} --> Show usage/help{reset}
|
||||
{green}exit{white} --> Exit session{reset}
|
||||
{white}------------ ---------------------------------------------------------{reset}
|
||||
'''
|
||||
return help
|
||||
|
||||
|
||||
if os.path.exists('.logs'):
|
||||
pass
|
||||
|
||||
else:
|
||||
# Creating the .logs directory
|
||||
if platform.system() == "Windows":
|
||||
subprocess.run(['mkdir','.logs'])
|
||||
else:
|
||||
subprocess.run(['sudo','mkdir','.logs'],shell=False)
|
||||
|
||||
# Set to automatically monitor and log network and user activity into the .logs folder
|
||||
logging.basicConfig(filename=f'.logs/{datetime.now()}.log',format='[%(asctime)s] %(message)s',level=logging.DEBUG)
|
||||
logging.basicConfig(filename=f'.logs/{datetime.now()}.log',format='%(asctime)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S',level=logging.DEBUG)
|
||||
|
||||
Reference in New Issue
Block a user