コード例 #1
0
def load_groups(api, assessment):
    """Return all groups in an assessment."""
    groups = assessment["groups"]

    for group in groups:
        logging.info("Loading Group %s", group["name"])

        new_group = Group()
        new_group.name = group["name"]

        for tgt in group["targets"]:
            target = User()
            target.first_name = tgt["first_name"]
            target.last_name = tgt["last_name"]
            target.email = tgt["email"]
            if tgt["position"]:
                target.position = tgt["position"]
            new_group.targets.append(target)
        """
         Catches when a Group has already been loaded into Gophish.
         Finds the current Gophish group ID so it can be deleted
         prior to re-loading the new group.
        """
        while True:
            try:
                new_group = api.groups.post(new_group)
                break
            except Error as e:
                if e.message == "Group name already in use":
                    logging.warning(
                        "%s. Finding previously loaded group to delete.", e)
                    groups = api.groups.get()
                    logging.debug(
                        "Checking %d for previously imported group to get ID",
                        len(groups),
                    )
                    for old_group in groups:
                        if old_group.name == new_group.name:
                            logging.debug("Deleting Group with ID %d",
                                          old_group.id)
                            api.groups.delete(old_group.id)
                            logging.info("Re-Loading new group.")
                else:
                    logging.exception(
                        "Exception encountered when loading group in Gophish (%s)",
                        e)
                    raise

        group["id"] = new_group.id

        logging.info("Group Ready: %s", new_group.name)

    return groups
コード例 #2
0
def load_groups(api, assessment):
    """Return all groups in an assessment."""
    groups = assessment["groups"]

    for group in groups:
        logging.info(f"Loading Group {group['name']}")

        new_group = Group()
        new_group.name = group["name"]

        for tgt in group["targets"]:
            target = User()
            target.first_name = tgt["first_name"]
            target.last_name = tgt["last_name"]
            target.email = tgt["email"]
            if tgt["position"]:
                target.position = tgt["position"]
            new_group.targets.append(target)
        """
         Catches when a Group has already been loaded into GoPhish.
         Finds the current GoPhish group ID so it can be deleted
         prior to re-loading the new group.
        """
        while True:
            try:
                new_group = api.groups.post(new_group)
                break
            except Error as e:
                if e.message == "Group name already in use":
                    logging.warning(
                        f"{e}. Finding previously loaded group to delete.")
                    groups = api.groups.get()
                    logging.debug(
                        f"Checking {len(groups)} for previously imported group to get ID"
                    )
                    for old_group in groups:
                        if old_group.name == new_group.name:
                            logging.debug(
                                f"Deleting Group with ID {old_group.id}")
                            api.groups.delete(old_group.id)
                            logging.info("Re-Loading new group.")
                else:
                    logging.error(f"{e}\n")
                    raise

        group["id"] = new_group.id

        logging.info("Group Ready: {}\n".format(new_group.name))

    return groups
コード例 #3
0
def campaign_test(api, assessmentCampaigns, assessment_id):
    """Create test campaigns."""
    tempGroups = [Group(name=add_group(api, assessment_id))]

    for campaign in assessmentCampaigns:
        tempUrl = campaign.url
        tempName = "Test-" + campaign.name
        tempPage = Page(name=campaign.page.name)
        tempTemplate = Template(name=campaign.template.name)
        tempSmtp = SMTP(name=campaign.smtp.name)

        postCampaign = Campaign(
            name=tempName,
            groups=tempGroups,
            page=tempPage,
            template=tempTemplate,
            smtp=tempSmtp,
            url=tempUrl,
        )

        postCampaign = api.campaigns.post(postCampaign)
        logging.debug("Test Campaign added: {}".format(postCampaign.name))

    logging.info("All Test campaigns added.")

    return True
コード例 #4
0
    def _import_into_gophish(self):
        users = self._zoom_results_to_gophish_users()
        group_name = f'{self.target_domain.split(".")[0]}-all'

        # Get user groups from gophish and match against current domain
        found_group_id = [
            group.id for group in self.gophish_api.groups.get()
            if group.name == group_name
        ]

        if found_group_id:
            # Takes current results and PUTs them into the existing group in gophish
            click.secho(
                f'[+] gophish > updating existing users group \'{group_name}\'',
                fg='green')
            group_id = found_group_id[0]
            group = self.gophish_api.groups.get(group_id)
            group.targets = users
            group = self.gophish_api.groups.put(group)
        else:
            # Adds ZoomInfo results into gophish user group for domain
            click.secho(
                f'[+] gophish > adding users to group \'{group_name}\'',
                fg='green')
            group = self.gophish_api.groups.post(
                Group(name=group_name, targets=users))
コード例 #5
0
def send_to_gophish(userList):
    ''' create a group with the forged email addresses into gophish '''
    print(okBox + 'Connecting to the goPhish API')
    api = Gophish(apiKey, host=host, verify=False)
    targets = [
        User(first_name=u.firstname,
             last_name=u.lastname,
             email=u.getMail(),
             position=u.position) for u in userList
    ]
    group = Group(name='l2gp - ' + company, targets=targets)
    api.groups.post(group)
    print(okBox + 'Group created !')
コード例 #6
0
def add_group(api, assessment_id):
    """Create a test group."""
    logging.info("Adding Test Group")

    newGroup = Group()

    newGroup.name = "Test-" + assessment_id

    # Holds list of Users to be added to group.
    targets = list()

    target = User()
    target.first_name = get_input("Enter First Name: ")
    # Receives the file name and checks if it exists.
    while target.first_name != "done" or target.first_name == "":

        target.last_name = get_input("Enter Last Name: ")

        while True:
            target.email = get_input("Enter Email: ")
            if not validate_email(target.email):
                print("In Valid Email")
            else:
                break

        target.position = get_input("Enter Org: ")

        targets.append(target)

        target = User()
        target.first_name = get_input("Enter First Name or 'done': ")

    newGroup.targets = targets

    newGroup = api.groups.post(newGroup)

    return newGroup.name
コード例 #7
0
def newgroup(name, path):
    targetlist = []
    fieldnames = ['First Name', 'Last Name', 'Email', 'Position']
    try:
        with open(path) as file:
            reader = csv.DictReader(file, fieldnames)
            for row in reader:
                if row:
                    targetlist.append(newuser(row))
                    
        group = Group(name=name, targets=targetlist)

    except(FileNotFoundError):
        exit('\tError: no such file {}'.format(path))

    try:
        group = api.groups.post(group)
        print('\nSuccess: {} target group created'.format(group.name))
        return group

    except(AttributeError):
        exit('\n\tError:  failed to create target group (possible duplicate)\n')
コード例 #8
0
def build_campaigns(api, assessment):
    """Build campaigns."""
    logging.info("Building Campaigns.")
    for campaign in assessment["campaigns"]:
        logging.info(f"Building Campaign: {campaign['name']}")

        # Build Template object
        new_template = Template(
            name=campaign["template"]["name"],
            subject=campaign["template"]["subject"],
            html=campaign["template"]["html"],
            text=campaign["template"]["text"],
        )
        """
         Catches when Template has already been loaded into GoPhish.
         Finds the current GoPhish template ID so it can be deleted
         prior to re-loading the new template.
        """
        while True:
            try:
                new_template = api.templates.post(new_template)
                break
            except Error as e:
                if e.message == "Template name already in use":
                    logging.warning(
                        f"{e}. Finding previously loaded template to delete.")
                    templates = api.templates.get()
                    logging.debug(
                        f"Checking {len(templates)} for previously imported template to get ID"
                    )
                    for old_template in templates:
                        if old_template.name == new_template.name:
                            logging.debug(
                                f"Deleting Template with ID {old_template.id}")
                            api.templates.delete(old_template.id)
                            logging.info("Re-Loading new template.")
                else:
                    logging.error(f"{e}\n")
                    raise

        # Build SMTP Object
        new_smtp = SMTP(
            name=campaign["smtp"]["name"],
            host=campaign["smtp"]["host"],
            from_address=campaign["smtp"]["from_address"],
            interface_type="SMTP",
            ignore_cert_errors=True,
        )
        if ("username" in campaign["smtp"].keys()
                and "password" in campaign["smtp"].keys()):
            new_smtp.username = campaign["smtp"]["username"]
            new_smtp.password = campaign["smtp"]["password"]

        while True:
            try:
                new_smtp = api.smtp.post(new_smtp)
                break
            except Error as e:
                if e.message == "SMTP name already in use":
                    logging.warning(
                        f"{e}. Finding previously loaded smtp to delete.")
                    smtps = api.smtp.get()
                    logging.debug(
                        f"Checking {len(smtps)} for previously imported smtp profiles to get ID"
                    )
                    for old_smtp in smtps:
                        if old_smtp.name == new_smtp.name:
                            logging.debug(
                                f"Deleting SMTP with ID {old_smtp.id}")
                            api.smtp.delete(old_smtp.id)
                            logging.info("Re-Loading new SMTP.")
                else:
                    logging.error(f"{e}\n")
                    raise

        # Check to remove any campaigns with the same name
        old_campaigns = api.campaigns.get()
        for old_campaign in old_campaigns:
            if old_campaign.name == campaign["name"]:
                logging.warning(
                    f"Previous Campaign found with name {campaign['name']}.")
                logging.warning(
                    f"Previous Campaign with id {old_campaign.id} being deleted."
                )
                api.campaigns.delete(old_campaign.id)

        # Loads the campaign
        try:
            api.campaigns.post(
                Campaign(
                    name=campaign["name"],
                    groups=[Group(name=campaign["group_name"])],
                    page=Page(name=campaign["page_name"]),
                    template=new_template,
                    smtp=new_smtp,
                    url=campaign["url"],
                    launch_date=campaign["launch_date"],
                    completed_date=campaign["complete_date"],
                ))
        except Exception as e:
            logging.error(e)
            raise

        logging.info(f"Campaign {campaign['name']} successfully loaded.\n")