├── InSpy.py ├── LICENSE ├── README.md ├── lib ├── __init__.py ├── __init__.pyc ├── export.py ├── export.pyc ├── http.py ├── http.pyc ├── logger.py ├── logger.pyc ├── soup.py ├── soup.pyc ├── workbench.py └── workbench.pyc ├── logs └── .gitignore ├── requirements.txt └── wordlists ├── title-list-large.txt └── title-list-small.txt /InSpy.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | # Copyright (c) 2018 Jonathan Broche (@LeapSecurity) 3 | 4 | import argparse, sys, os 5 | from lib.http import * 6 | from lib.workbench import * 7 | from lib.soup import * 8 | from lib.export import * 9 | from lib.logger import * 10 | 11 | 12 | parser = argparse.ArgumentParser(description='InSpy - A LinkedIn enumeration tool by Jonathan Broche (@LeapSecurity)', version="3.0.1") 13 | parser.add_argument('company', help="Company name to use for tasks.") 14 | parser.add_argument('--domain', help="Company domain to use for searching.") 15 | parser.add_argument('--email', help="Email format to create email addresses with. [Accepted Formats: first.last@xyz.com, last.first@xyz.com, firstl@xyz.com, lfirst@xyz.com, flast@xyz.com, lastf@xyz.com, first@xyz.com, last@xyz.com]") 16 | parser.add_argument('--titles', metavar='file', default="wordlists/title-list-small.txt", nargs='?', help="Discover employees by title and/or department. Titles and departments are imported from a new line delimited file. [Default: title-list-small.txt]") 17 | outgroup = parser.add_argument_group(title="Output Options") 18 | outgroup.add_argument('--html', metavar='file', help="Print results in HTML file.") 19 | outgroup.add_argument('--csv', metavar='file', help="Print results in CSV format.") 20 | outgroup.add_argument('--json', metavar='file', help="Print results in JSON.") 21 | outgroup.add_argument('--xml', metavar='file', help="Print results in XML.") 22 | 23 | if len(sys.argv) == 1: 24 | parser.print_help() 25 | sys.exit(1) 26 | 27 | args = parser.parse_args() 28 | start_logger(args.company) 29 | hunterapi = "" #insert hunterio api key here 30 | 31 | email = args.email 32 | domain = args.domain 33 | 34 | 35 | print "\nInSpy {}".format(parser.version) 36 | 37 | try: 38 | if domain and not email: #search hunterio for email format 39 | email = get_email_format(args.domain, hunterapi) 40 | if email and not domain: #search clearbit for domain 41 | domain = get_domain(args.company) 42 | if not email and not domain: #no domain or email provided - fully automate it 43 | domain = get_domain(args.company) 44 | if domain: 45 | email = get_email_format(domain, hunterapi) 46 | 47 | if email and domain: 48 | 49 | email = email.replace("{", "").replace("}","") 50 | 51 | print "\nDomain: {}, Email Format: {}\n".format(domain, email) 52 | 53 | employees = {} 54 | 55 | if os.path.exists(os.path.abspath(args.titles)): 56 | for response in search_linkedin(args.company, os.path.abspath(args.titles)): 57 | for name, title in get_employees(soupify(response)).items(): 58 | if args.company.lower() in title.lower(): 59 | if not name in employees: 60 | employees[name] = title 61 | print "\n{} Employees identified".format(len(employees.keys())) 62 | else: 63 | print os.path.abspath(args.titles) 64 | print "No such file or directory: '{}'".format(args.titles) 65 | 66 | if employees: 67 | #output employees 68 | for name, title in employees.iteritems(): 69 | print "{} {}".format(name, title[:50].replace('&', '&')) 70 | 71 | #craft emails 72 | emails = create_emails(employees, domain, email) 73 | 74 | 75 | if emails: 76 | #output emails 77 | print "\nEmails crafted\n".format(len(emails.keys())) 78 | for name, email in emails.items(): 79 | print email 80 | 81 | #export results 82 | if args.html: 83 | output("html", args.html, args.company, domain, employees, emails) 84 | if args.xml: 85 | output("xml", args.xml, args.company, domain, employees, emails) 86 | if args.json: 87 | output("json", args.json, args.company, domain, employees, emails) 88 | if args.csv: 89 | output("csv", args.csv, args.company, domain, employees, emails) 90 | except (KeyboardInterrupt, SystemExit): 91 | print "\nTerminated script.\n" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Leap Security 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # InSpy 2 | 3 | ⛔ [DEPRECATED]. This repo is no longer being maintained. 4 | 5 | ## Introduction 6 | ----- 7 | 8 | InSpy is a python based LinkedIn enumeration tool. 9 | 10 | Version 3.0 introduces the automation of domain and email retrieval in addition to randomized headers and xml output support. 11 | 12 | ## Installation 13 | ----- 14 | 15 | Run `pip install -r requirements.txt` within the cloned InSpy directory. 16 | 17 | Obtain an API key from [HunterIO](https://hunter.io/) and insert it into the hunterio variable within InSpy.py (line 29). 18 | 19 | ## Help 20 | ----- 21 | 22 | ``` 23 | InSpy - A LinkedIn enumeration tool by Jonathan Broche (@LeapSecurity) 24 | 25 | positional arguments: 26 | company Company name to use for tasks. 27 | 28 | optional arguments: 29 | -h, --help show this help message and exit 30 | -v, --version show program's version number and exit 31 | --domain DOMAIN Company domain to use for searching. 32 | --email EMAIL Email format to create email addresses with. [Accepted 33 | Formats: first.last@xyz.com, last.first@xyz.com, 34 | firstl@xyz.com, lfirst@xyz.com, flast@xyz.com, 35 | lastf@xyz.com, first@xyz.com, last@xyz.com] 36 | --titles [file] Discover employees by title and/or department. Titles and 37 | departments are imported from a new line delimited file. 38 | [Default: title-list-small.txt] 39 | 40 | Output Options: 41 | --html file Print results in HTML file. 42 | --csv file Print results in CSV format. 43 | --json file Print results in JSON. 44 | --xml file Print results in XML. 45 | ``` 46 | -------------------------------------------------------------------------------- /lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jobroche/InSpy/e886bb2af6010eff6031cdf7a753c15757f43bbc/lib/__init__.py -------------------------------------------------------------------------------- /lib/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jobroche/InSpy/e886bb2af6010eff6031cdf7a753c15757f43bbc/lib/__init__.pyc -------------------------------------------------------------------------------- /lib/export.py: -------------------------------------------------------------------------------- 1 | import json, os, xml.dom.minidom, time, csv 2 | from xml.etree.ElementTree import Element, SubElement, tostring 3 | 4 | def output(format, file, company, domain, employees, emails): 5 | if format == "xml": 6 | oxml(file, company, domain, employees, emails) 7 | if format == "csv": 8 | ocsv(file, company, domain, employees, emails) 9 | if format == "html": 10 | ohtml(file, company, domain, employees, emails) 11 | if format == "json": 12 | ojson(file, company, domain, employees, emails) 13 | 14 | #CSV 15 | def ocsv(filename, company, domain, employees, emails): 16 | with open(os.path.abspath(filename), 'a') as csvfile: 17 | fieldnames = ["Employee Name", "Title", "Email"] 18 | writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 19 | writer.writeheader() 20 | for name, title in employees.iteritems(): 21 | writer.writerow({"Employee Name": name, "Title": title.replace('&', '&'), "Email": emails[name]}) 22 | 23 | #JSON 24 | def ojson(file, company, domain, employees, emails): 25 | employee_json = [] 26 | 27 | for name, title in employees.iteritems(): 28 | employee_json.append({"name": name, "title": title.replace('&', '&'), "email": emails[name]}) 29 | 30 | full_json = { 31 | "company": {"name":company, "domain": domain}, 32 | "employees": employee_json 33 | } 34 | 35 | with open(os.path.abspath(file), 'w') as f: 36 | f.write(json.dumps(full_json)) 37 | 38 | #XML 39 | def oxml(file, company, domain, employees, emails): 40 | top = Element('InSpy') 41 | cxml = SubElement(top, 'Company') 42 | 43 | #company name 44 | cnxml = SubElement(cxml, "Name") 45 | cnxml.text = company 46 | #company domain 47 | cdxml = SubElement(cxml, "Domain") 48 | cdxml.text = domain 49 | 50 | echild = SubElement(top, 'Employees') 51 | 52 | for name, title in employees.iteritems(): 53 | 54 | employee = SubElement(echild, "Employee") 55 | #name 56 | nxml = SubElement(employee, "Name") 57 | nxml.text = name 58 | #title 59 | txml = SubElement(employee, "Title") 60 | txml.text = title.replace("&", "&") 61 | #email 62 | exml = SubElement(employee, "Email") 63 | exml.text = emails[name] 64 | 65 | fxml = xml.dom.minidom.parseString(tostring(top)) 66 | 67 | with open(os.path.abspath(file), 'w') as f: 68 | f.write(fxml.toprettyxml()) 69 | 70 | #HTML 71 | def ohtml(file, company, domain, employees, emails): 72 | employee_html = [] 73 | 74 | for name, title in employees.iteritems(): 75 | employee_html.append("{name}{title}{email}".format(name=name, title=title, email=emails[name])) 76 | 77 | page = """ 78 | 79 | InSpy - {company} 80 | 81 | 82 | 83 |

InSpy

84 |

Company: {company}

Date: {time}

85 | 86 | 87 | 88 | 89 | 90 | 91 | {html} 92 |
Employee NameTitleE-mail
93 |
94 | 95 | 96 | """.format(company=company, time=time.strftime("%Y/%m/%d %H:%M:%S"), html=employee_html) 97 | 98 | with open(os.path.abspath(file), 'w') as f: 99 | f.write(page) -------------------------------------------------------------------------------- /lib/export.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jobroche/InSpy/e886bb2af6010eff6031cdf7a753c15757f43bbc/lib/export.pyc -------------------------------------------------------------------------------- /lib/http.py: -------------------------------------------------------------------------------- 1 | 2 | import requests, random 3 | from logger import * 4 | #requests.packages.urllib3.disable_warnings() 5 | 6 | def random_header(): 7 | 8 | agents = ['Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0', 9 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36', 10 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2', 11 | 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41', 12 | 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'] 13 | 14 | return {'User-Agent': random.choice(agents),'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'} 15 | 16 | def http_request(url): 17 | 18 | try: 19 | r = requests.get(url, timeout=3, headers=random_header()) 20 | 21 | if r.status_code == 200: 22 | if "linkedin.com" in url: 23 | return {"status": r.status_code, "response": r.text} 24 | else: 25 | return {"status": r.status_code, "response": r.json()} 26 | else: 27 | return {"status": r.status_code, "response": ""} 28 | 29 | except requests.exceptions.Timeout as e: 30 | print "Error: Timed out." 31 | logging.error(e) 32 | except Exception as e: 33 | logging.error(e) -------------------------------------------------------------------------------- /lib/http.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jobroche/InSpy/e886bb2af6010eff6031cdf7a753c15757f43bbc/lib/http.pyc -------------------------------------------------------------------------------- /lib/logger.py: -------------------------------------------------------------------------------- 1 | import logging, sys, time 2 | 3 | time_format = time.strftime("%Y-%m-%d %H:%M:%S") 4 | 5 | def start_logger(company): 6 | handler = logging.FileHandler('./logs/{}_{}.log'.format(company.replace(' ', '_'), time_format.replace(' ', '_'))) 7 | handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s - %(message)s")) 8 | 9 | logger = logging.getLogger() 10 | logger.propagate = False 11 | logger.addHandler(handler) 12 | logger.setLevel(logging.INFO) 13 | logging.getLogger("requests").setLevel(logging.DEBUG) -------------------------------------------------------------------------------- /lib/logger.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jobroche/InSpy/e886bb2af6010eff6031cdf7a753c15757f43bbc/lib/logger.pyc -------------------------------------------------------------------------------- /lib/soup.py: -------------------------------------------------------------------------------- 1 | import BeautifulSoup, json 2 | 3 | def soupify(response): 4 | try: 5 | soupd = BeautifulSoup.BeautifulSoup(response) 6 | return soupd 7 | except (AttributeError, TypeError) as e: 8 | pass 9 | except Exception as e: 10 | print "Error: {}".format(e) 11 | 12 | def get_employees(soup): 13 | try: 14 | employees = {} 15 | for n, t in zip(soup.findAll('a', {"class": "professional__name"}), soup.findAll("p", {"class" : "professional__headline"})): 16 | name = n.getText().encode('ascii','ignore') 17 | title = t.getText().encode('ascii','ignore') 18 | if name and title: 19 | employees[name] = title 20 | return employees 21 | except (AttributeError, TypeError) as e: 22 | pass 23 | except Exception as e: 24 | print "Error: {}".format(e) 25 | 26 | -------------------------------------------------------------------------------- /lib/soup.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jobroche/InSpy/e886bb2af6010eff6031cdf7a753c15757f43bbc/lib/soup.pyc -------------------------------------------------------------------------------- /lib/workbench.py: -------------------------------------------------------------------------------- 1 | import re, json, HTMLParser, unicodedata 2 | from http import * 3 | from logger import * 4 | 5 | 6 | def get_domain(company): #Clearbit API - clearbit.com 7 | 8 | clearbit_request = "https://autocomplete.clearbit.com/v1/companies/suggest?query={}".format(company) 9 | clearbit_results = [] 10 | domain = "" 11 | 12 | r = http_request(clearbit_request) 13 | 14 | if len(r["response"]) >=1: 15 | for element in r["response"]: 16 | if company.lower() == element['name'].lower(): 17 | clearbit_results.append({"name" : element['name'], "domain":element['domain']}) 18 | 19 | if len(clearbit_results) == 1: #return domain if one result 20 | domain = clearbit_results[0]["domain"] 21 | elif len(clearbit_results) > 1: #prompt user if multiple domains identified 22 | print "Multiple domains identified for company. Which one is the target?" 23 | for index, result in enumerate(clearbit_results): 24 | print "{}) Name: {}, Domain: {}".format(index, result["name"], result["domain"]) 25 | choice = input() 26 | domain = clearbit_results[choice]["domain"] 27 | 28 | if domain: 29 | return domain 30 | else: 31 | logging.error("Clearbit API - HTTP {} Error".format(r["status"])) 32 | print "InSpy could not identify the domain name. Use --domain." 33 | 34 | 35 | def get_email_format(domain, apikey): #HunterIO API - hunter.io 36 | hunter_request = "https://api.hunter.io/v2/domain-search?domain={domain}&api_key={api}".format(domain=domain, api=apikey) 37 | emailformat = "" 38 | 39 | r = http_request(hunter_request) 40 | 41 | if r["status"] == 200: 42 | for k,v in r["response"].iteritems(): 43 | if k == 'data': 44 | if v['pattern']: 45 | emailformat = v['pattern'] 46 | logging.info("HunterIO Returned Email Format: {}".format(emailformat)) 47 | else: 48 | logging.error("HunterIO - HTTP {} Error".format(r["status"])) 49 | 50 | if emailformat: 51 | return emailformat 52 | else: 53 | print "InSpy could not identify the email format. Use --email." 54 | 55 | def search_linkedin(company, file): 56 | titles = [] 57 | responses = [] 58 | 59 | with open(file) as f: 60 | for title in f.readlines(): 61 | titles.append(title.rstrip()) 62 | 63 | for title in titles: 64 | response = http_request("https://www.linkedin.com/title/{}-at-{}".format(title.replace(' ', '-'), company.replace(' ', '-'))) 65 | if response["status"] == 200: 66 | responses.append(response["response"]) 67 | elif response["status"] == 999: #LinkedIn doesn't like InSpy 68 | logging.error("LinkedIn Search - HTTP 999 Error Crawling {}".format(title)) 69 | pass 70 | else: 71 | logging.error("LinkedIn Search - HTTP {} Error Crawling {}".format(response["status"], title)) 72 | pass 73 | return responses 74 | 75 | 76 | #craft emails 77 | def create_emails(employees, domain, eformat): 78 | hparser=HTMLParser.HTMLParser() 79 | emails = {} 80 | 81 | for name in employees.keys(): #split up employee name by first, last name 82 | try: 83 | first = hparser.unescape([n.split() for n in name.split(',',1)][0][0]) 84 | last = hparser.unescape([n.split() for n in name.split(',',1)][0][-1]) 85 | except UnicodeDecodeError: 86 | first = [n.split() for n in name.split(',',1)][0][0] 87 | last = [n.split() for n in name.split(',',1)][0][-1] 88 | 89 | #create emails 90 | email = "{}@{}".format(format_email(eformat.split("@")[0], first.lower(), last.lower()), domain) 91 | 92 | if email: 93 | emails[name] = email 94 | 95 | if emails: 96 | return emails 97 | 98 | def format_email(eformat, first, last): 99 | try: 100 | formats = { 101 | 'first.last': '{}.{}'.format(first,last), 102 | 'last.first': '{}.{}'.format(last,first), 103 | 'firstlast': '{}{}'.format(first,last), 104 | 'lastfirst': '{}{}'.format(last,first), 105 | 'first_last': '{}_{}'.format(first,last), 106 | 'last_first': '{}_{}'.format(last,first), 107 | 'firstl':'{}{}'.format(first,last[0]), 108 | 'lfirst':'{}{}'.format(last[0],first), 109 | 'flast': '{}{}'.format(first[0],last), 110 | 'lastf': '{}{}'.format(last,first[0]), 111 | 'first': first, 112 | 'last': last 113 | } 114 | return formats[eformat] 115 | except Exception as e: 116 | print e -------------------------------------------------------------------------------- /lib/workbench.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jobroche/InSpy/e886bb2af6010eff6031cdf7a753c15757f43bbc/lib/workbench.pyc -------------------------------------------------------------------------------- /logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests==2.20.1 2 | BeautifulSoup==3.2.1 3 | -------------------------------------------------------------------------------- /wordlists/title-list-large.txt: -------------------------------------------------------------------------------- 1 | .net developer 2 | accessibility specialist 3 | accountant 4 | administrator 5 | agile business analyst 6 | agile coach 7 | agile project manager 8 | analyst 9 | analytics specialist 10 | application developer 11 | application manager 12 | application support analyst 13 | application support engineer 14 | applications engineer 15 | associate 16 | associate developer 17 | auditor 18 | billing analyst 19 | build engineer 20 | build manager 21 | business analyst 22 | business architect 23 | business intelligence engineer 24 | business relationship manager 25 | business systems analyst 26 | chairman 27 | change manager 28 | chief architect 29 | CEO 30 | chief executive officer 31 | CIO 32 | chief information officer 33 | CSO 34 | chief security officer 35 | CTO 36 | chief technology officer 37 | cloud architect 38 | cloud consultant 39 | cloud product and project manager 40 | cloud services developer 41 | cloud software and network engineer 42 | cloud system administrator 43 | cloud system engineer 44 | communication systems design manager 45 | computer and information research scientist 46 | computer and information systems manager 47 | computer and related services manager 48 | computer application development manager 49 | computer applications manager 50 | computer department co-ordinator 51 | computer development division head 52 | computer facility manager 53 | computer graphics animator 54 | computer legacy systems manager 55 | computer manager 56 | computer network architect 57 | computer networks manager 58 | computer programmer 59 | computer programs manager 60 | computer projects manager 61 | computer software design manager 62 | computer system operations manager 63 | computer systems analyst 64 | computer systems development manager 65 | computer systems manager 66 | computerized information systems manager 67 | computerized technical information manager 68 | configuration manager 69 | consultant 70 | content manager 71 | content strategist 72 | contracts manager 73 | controller 74 | coordinator 75 | counsel 76 | customer support administrator 77 | customer support specialist 78 | data analyst 79 | data architect 80 | data center manager 81 | data center support specialist 82 | data center system administrator 83 | data centre manager 84 | data migration architect 85 | data modeler 86 | data processing and systems analysis manager 87 | data processing director 88 | data processing manager 89 | data processing planning manager 90 | data quality manager 91 | data scientist 92 | DBA 93 | database administrator 94 | database analyst 95 | database developer 96 | deputy 97 | desktop support manager 98 | desktop support specialist 99 | desktop support technician 100 | developer 101 | development 102 | devops manager 103 | digital marketing manager 104 | director 105 | director of delivery 106 | director of information systems 107 | director of operations 108 | director of technology 109 | director of technology management 110 | disaster recovery specialist 111 | electronic data processing manager 112 | EDP manager 113 | electronic data processing (EDP) manager 114 | engagement director 115 | engineer 116 | enterprise architect 117 | enterprise solutions architect 118 | erp analyst 119 | executive 120 | financial 121 | foreman 122 | frameworks specialist 123 | front end developer 124 | front-end designer 125 | front-end developer 126 | full-stack developer 127 | game architect 128 | game designer 129 | game developer 130 | graphic designer 131 | growth hacker 132 | help desk specialist 133 | help desk technician 134 | hr 135 | human resources 136 | information architect 137 | information assurance engineer 138 | information security architect 139 | information systems development director 140 | information systems manager 141 | information systems operations director 142 | information technology development manager 143 | information technology director 144 | information technology implementation manager 145 | information technology integration manager 146 | infrastructure manager 147 | integration architect 148 | interaction designer 149 | Internet systems administrator 150 | IT analyst 151 | IT auditor 152 | IT coordinator 153 | IT development manager 154 | IT director 155 | IT implementation manager 156 | IT integration manager 157 | IT manager 158 | IT risk manager 159 | IT support manager 160 | IT support specialist 161 | IT systems administrator 162 | java developer 163 | junior software engineer 164 | lead developer 165 | management information system manager 166 | management information systems director 167 | manager 168 | marketing 169 | marketing technologist 170 | MIS director 171 | MIS manager 172 | mobile app developer 173 | mobile developer 174 | network administrator 175 | network analyst 176 | network and computer systems administrator 177 | network architect 178 | network design manager 179 | network engineer 180 | network security architect 181 | network systems administrator 182 | nurse 183 | occupational 184 | operations analyst 185 | outsourcing manager 186 | owner 187 | partner 188 | pathologist 189 | payroll 190 | pharmacist 191 | president 192 | process analyst 193 | product 194 | product manager 195 | program manager 196 | programmer 197 | programmer analyst 198 | project 199 | project manager 200 | python developer 201 | QA specialist 202 | quality assurance specialist 203 | quality assurance manager 204 | recruiter 205 | ruby on rails developer 206 | sales engineer 207 | secretary 208 | security 209 | security engineer 210 | security specialist 211 | security testing engineer 212 | senior applications engineer 213 | senior database administrator 214 | senior network architect 215 | senior network engineer 216 | senior network system administrator 217 | senior programmer 218 | senior programmer analyst 219 | senior security specialist 220 | senior software engineer 221 | senior support specialist 222 | senior system administrator 223 | senior system analyst 224 | senior system architect 225 | senior system designer 226 | senior systems analyst 227 | senior systems software engineer 228 | senior web administrator 229 | senior web developer 230 | seo consultant 231 | service delivery manager 232 | service desk operator 233 | social media manager 234 | software 235 | software architect 236 | software developer 237 | software developers 238 | software development manager 239 | software development managers 240 | software engineer 241 | software engineering director 242 | software engineering manager 243 | software quality assurance analyst 244 | solution architect 245 | sql developer 246 | sr. applications engineer 247 | sr. database administrator 248 | sr. network architect 249 | sr. network engineer 250 | sr. network system administrator 251 | sr. programmer 252 | sr. programmer analyst 253 | sr. security specialist 254 | sr. software engineer 255 | sr. support specialist 256 | sr. system administrator 257 | sr. system analyst 258 | sr. system architect 259 | sr. system designer 260 | sr. systems analyst 261 | sr. systems software engineer 262 | sr. web administrator 263 | sr. web developer 264 | storage engineer 265 | supervisor 266 | support specialist 267 | system architect 268 | systems - computer systems manager 269 | systems administrator 270 | systems analyst 271 | systems designer 272 | systems development - computer systems manager 273 | systems development manager 274 | systems engineer 275 | systems implementation manager 276 | systems integration manager 277 | systems manager 278 | systems operations manager 279 | systems software engineer​ 280 | technical account manager 281 | technical lead 282 | technical operations officer 283 | technical specialist 284 | technical support engineer 285 | technical support representative 286 | technical support specialist 287 | technician 288 | technology architect 289 | telecommunications specialist 290 | test analyst 291 | test automation engineer 292 | therapist 293 | training 294 | treasurer 295 | ui architect 296 | ui designer 297 | ux designer 298 | virtualization architect 299 | web administrator 300 | web analytics developer 301 | web designer 302 | web developer 303 | webmaster 304 | wordpress developer 305 | -------------------------------------------------------------------------------- /wordlists/title-list-small.txt: -------------------------------------------------------------------------------- 1 | sales 2 | marketing 3 | human resources 4 | finance 5 | accounting 6 | inventory 7 | quality assurance 8 | insurance 9 | licenses 10 | operational 11 | customer service 12 | staff 13 | research & development 14 | management 15 | administration 16 | engineering 17 | it 18 | is 19 | strategy 20 | other --------------------------------------------------------------------------------