├── requirements.txt ├── combsearch.py ├── libs ├── globals.py ├── ascii.py ├── colours.py ├── args.py └── http.py └── README.md /requirements.txt: -------------------------------------------------------------------------------- 1 | argparse 2 | colorama 3 | requests 4 | -------------------------------------------------------------------------------- /combsearch.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from libs.args import parse_args 4 | from libs.ascii import PrintAscii 5 | 6 | if __name__ == "__main__": 7 | PrintAscii() 8 | parse_args() -------------------------------------------------------------------------------- /libs/globals.py: -------------------------------------------------------------------------------- 1 | VERSION = "0.1" 2 | PROXYNOVA_URL = "https://api.proxynova.com/" 3 | COMB_PROXYNOVA_URI = "comb" 4 | COMB_PARAM = "?query=" 5 | SHORT_DESCRIPTION = "Combination Of Many Breaches (COMB) info via proxynova.com" -------------------------------------------------------------------------------- /libs/ascii.py: -------------------------------------------------------------------------------- 1 | from .globals import SHORT_DESCRIPTION 2 | 3 | def PrintAscii(): 4 | art = f''' 5 | _ _ _ _ /_ __ _ __ /_ 6 | /_ /_// / //_/_\/_'/_|//_ / / @Kr0ff 7 | 8 | {SHORT_DESCRIPTION} 9 | ''' 10 | 11 | print(art) -------------------------------------------------------------------------------- /libs/colours.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | try: 4 | import colorama 5 | except ImportError: 6 | print("Failed to import colorama !") 7 | sys.exit(99) 8 | 9 | def isWin32Platform(): 10 | if sys.platform.startswith("win32"): 11 | return True 12 | 13 | def SUCCESS(string: str) -> str: 14 | if isWin32Platform() == True: 15 | colorama.just_fix_windows_console() 16 | 17 | strOut = colorama.Fore.GREEN + "[+] " + colorama.Style.RESET_ALL + string 18 | print(strOut) -------------------------------------------------------------------------------- /libs/args.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | try: 4 | import argparse 5 | except ImportError: 6 | print("Failed to import \"argparse\"") 7 | sys.exit(99) 8 | 9 | from .http import * 10 | from .globals import * 11 | 12 | def parse_args(): 13 | 14 | parser = argparse.ArgumentParser(description="combsearch - Retrieve information about breached accounts from \"Combination Of Many Breaches\" database (from proxynova.com)") 15 | parser.add_argument("-s", "--search", help="Keyword to use for the search (e.g testuser)") 16 | parser.add_argument("-v", "--version", help="Return version of script", action="store_true") 17 | arg = parser.parse_args() 18 | 19 | if arg.search: 20 | requestInfo(arg.search) 21 | 22 | if arg.version: 23 | print(f"--- Version: {VERSION} ---") 24 | sys.exit(0) -------------------------------------------------------------------------------- /libs/http.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import json 3 | 4 | from .globals import * 5 | from .colours import * 6 | 7 | try: 8 | import requests 9 | except ImportError: 10 | print("Failed to import \"requests\"") 11 | sys.exit(99) 12 | 13 | def parsejson(json_obj, p: str): 14 | _json = json.loads(json_obj) 15 | return _json[f"{p}"] 16 | 17 | 18 | def requestInfo(keyword: str) -> str: 19 | 20 | if len(keyword) < 3: 21 | print("[-] The provided search keyword is less than four (4) characters !") 22 | sys.exit(2) 23 | 24 | r = "" 25 | 26 | headers = { 27 | "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8", 28 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", 29 | "Content-Type": "application/json", 30 | "Cache-Control": "max-age=0", 31 | "Accept-Language": "en-US,en;q=0.9", 32 | "Accept-Encoding": "gzip, deflate, br, zstd" 33 | } 34 | 35 | s = requests.Session() 36 | 37 | FINAL_URL = PROXYNOVA_URL + COMB_PROXYNOVA_URI + COMB_PARAM 38 | 39 | try: 40 | r = requests.get( (FINAL_URL + keyword + "&start=0&limit=100"), verify=True, headers=headers ) 41 | SUCCESS(f"Results: ") 42 | 43 | _json = parsejson(r.text, "lines") 44 | for line in _json: 45 | print(line) 46 | 47 | except Exception as e: 48 | print(e) 49 | sys.exit(1) 50 | 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # combsearch 2 | Retrieve information about breached accounts from "Combination Of Many Breaches" database (from proxynova.com) 3 | 4 | # Description 5 | The script is pretty simple, it uses the API of proxynova.com to return results from the COMB database leak. 6 | > Please note that the information returned does not include all possible results and it seems to be a limitation of the API (afaik). The returned results appear to be always 20 entries, if there are more than 20 entries in the database. 7 | 8 | > UPDATE: Proxynova have now updated their API to allow up to 100 results to be retrieved per request. 9 | 10 | ```sh 11 | $ ./combsearch.py -h 12 | 13 | _ _ _ _ /_ __ _ __ /_ 14 | /_ /_// / //_/_\/_'/_|//_ / / @Kr0ff 15 | 16 | Combination Of Many Breaches (COMB) info via proxynova.com 17 | 18 | usage: combsearch.py [-h] [-s SEARCH] [-v] 19 | 20 | combsearch - Retrieve information about breached accounts from "Combination Of Many Breaches" database (from 21 | proxynova.com) 22 | 23 | options: 24 | -h, --help show this help message and exit 25 | -s SEARCH, --search SEARCH 26 | Keyword to use for the search (e.g testuser) 27 | -v, --version Return version of script 28 | ``` 29 | 30 | # Example 31 | Example of returned information: 32 | 33 | ```sh 34 | $ ./combsearch.py -s testuser 35 | 36 | _ _ _ _ /_ __ _ __ /_ 37 | /_ /_// / //_/_\/_'/_|//_ / / @Kr0ff 38 | 39 | Combination Of Many Breaches (COMB) info via proxynova.com 40 | 41 | [+] Results: 42 | testuser@mailcatch.com testuser 43 | testUser@testmail.bzzagent.com:password9 44 | testUser@testthis.com:fuckyourself 45 | testuser-@web.de:atorea59ud 46 | testuser@123test.com:test123 47 | testuser@12et.com:myspace8 48 | testuser@aaa.com:testuser 49 | testuser@abc.com:abc123 50 | testuser@aim.com:access 51 | testuser@aim.com:hydsy64 52 | testuser@aim.com:test 53 | testuser@aim.com:testpass 54 | testuser@aim.com:testuser 55 | testuser@aim.com:testuses 56 | testuser@aim.com:tlb012 57 | testuser@aim.com:usertest 58 | testuser@almerblank.com:test2010User 59 | testuser@amelsberg.com:password 60 | testuser@anthonyzarry.com:mydell1 61 | testuser@aol.com:Buldum11 62 | ``` 63 | 64 | # Disclaimer 65 | This script has been written for educational purposes only and the author is not liable for any missuse of third-parties ! 66 | --------------------------------------------------------------------------------