Initial commit
This commit is contained in:
		
						commit
						49e1d16c6f
					
				
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					.idea/
 | 
				
			||||||
 | 
					venv/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__pycache__/
 | 
				
			||||||
 | 
					*.py[cod]
 | 
				
			||||||
							
								
								
									
										15
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					# GitMon
 | 
				
			||||||
 | 
					Monitor GitHub events and clone repositories to search for secrets, and more.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Overview
 | 
				
			||||||
 | 
					GitMon allows an operator to continually monitor the GitHub Events API to collect
 | 
				
			||||||
 | 
					metadata and look for secret leakage.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When certain events such as _CreateEvent_ or _DeleteEvent_ are observed, GitMon
 | 
				
			||||||
 | 
					will send the repository URL to a worker that will clone the repository and
 | 
				
			||||||
 | 
					search for API keys, passwords, endpoints, and more.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GitMon will also build a table that maps commit email addresses to GitHub usernames.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Contributors
 | 
				
			||||||
 | 
					- agathanonymous
 | 
				
			||||||
							
								
								
									
										0
									
								
								gitmon/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								gitmon/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										46
									
								
								gitmon/api.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								gitmon/api.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					"""GitHub API module"""
 | 
				
			||||||
 | 
					import logging
 | 
				
			||||||
 | 
					import requests
 | 
				
			||||||
 | 
					from requests.adapters import HTTPAdapter
 | 
				
			||||||
 | 
					from requests.packages.urllib3.util.retry import Retry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GitHubApi:
 | 
				
			||||||
 | 
					    def __init__(self, proxy=None):
 | 
				
			||||||
 | 
					        self.base_url = 'https://api.github.com'
 | 
				
			||||||
 | 
					        self.session = requests.Session()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        retries = Retry(total=3, backoff_factor=1)
 | 
				
			||||||
 | 
					        self.session.mount('https://', HTTPAdapter(max_retries=retries))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if proxy:
 | 
				
			||||||
 | 
					            self.session.proxies.update(proxy)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __get(self, endpoint, params=None):
 | 
				
			||||||
 | 
					        """GET an HTTP resource and return JSON."""
 | 
				
			||||||
 | 
					        url = self.base_url + endpoint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            response = self.session.get(url, params=params)
 | 
				
			||||||
 | 
					        except requests.RequestException as e:
 | 
				
			||||||
 | 
					            logging.warning(f'Failed to execute GET request: {str(e)}')
 | 
				
			||||||
 | 
					            return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.__parse_headers(response.headers)
 | 
				
			||||||
 | 
					        return response.json()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __parse_headers(self, headers):
 | 
				
			||||||
 | 
					        """Parse headers to update rate limits."""
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_events(self, page=None):
 | 
				
			||||||
 | 
					        """Fetch GitHub events."""
 | 
				
			||||||
 | 
					        endpoint = '/events'
 | 
				
			||||||
 | 
					        params = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if page:
 | 
				
			||||||
 | 
					            params = {'page': page}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        events = self.__get(endpoint, params)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return events
 | 
				
			||||||
							
								
								
									
										16
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					"""GitMon"""
 | 
				
			||||||
 | 
					from gitmon.api import GitHubApi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def main():
 | 
				
			||||||
 | 
					    """Main entry point."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    api = GitHubApi()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    events = api.get_events()
 | 
				
			||||||
 | 
					    for event in events:
 | 
				
			||||||
 | 
					        print(event['type'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == '__main__':
 | 
				
			||||||
 | 
					    main()
 | 
				
			||||||
							
								
								
									
										1
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					requests
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user