Collecte d'informations passive

introduction

La collecte d'informations passive se réfère à ne pas interagir directement avec l'hôte cible et obtient généralement les informations de l'hôte cible indirectement sur la base des moteurs de recherche ou des méthodes de réseautage social.

La collecte d'informations passive extrait principalement les informations sur les actifs cibles via les moteurs de recherche ou les réseaux sociaux et d'autres méthodes, y compris généralement la requête IP, la requête Whois, la collecte de sous-domaines, etc. Lors de la collecte d'informations passives, il n'y a pas d'interaction avec la cible et les informations sur la cible peuvent être exploitées sans toucher le système cible. Les principales méthodes incluent la résolution DNS, l'extraction de sous-domaines, l'exploration des e-mails, etc.

Requête IP

La requête IP est le processus d'interrogation de l'adresse IP correspondante via l'URL actuellement obtenue
Insérez la description de l'image ici

Requête Whois

Whois est un protocole de transmission utilisé pour interroger l'adresse IP et les informations du propriétaire d'un nom de domaine. En termes simples, il s'agit d'une base de données permettant de demander si le nom de domaine a été enregistré et les informations détaillées du nom de domaine enregistré, telles que le propriétaire du nom de domaine. , registraire de noms de domaine, etc.
Insérez la description de l'image ici
Insérez la description de l'image ici

Extraction de sous-domaines

Les noms de domaine peuvent être divisés en noms de domaine de premier niveau, noms de domaine de premier niveau et noms de domaine de second niveau. Dans le processus de test, si aucune vulnérabilité associée n'est trouvée lors du test de la station maître cible, il est généralement envisagé d'explorer le nom de sous-domaine du système cible à ce moment. Il existe de nombreuses méthodes d'exploration de sous-domaines, telles que le moteur de recherche, le craquage de sous-domaine, la requête de dictionnaire, etc.

Parmi les outils actuellement utilisés, mon préféré est la pelle de sous-domaine Layer
Insérez la description de l'image ici

Grattage de courrier

Lors du processus d'infiltration du système cible, si la sécurité du serveur cible est très élevée et qu'il est difficile d'obtenir l'autorité cible via le serveur, la méthode d'ingénierie sociale est généralement utilisée pour attaquer davantage le serveur cible. Le phishing par e-mail est l'une des méthodes d'attaque les plus courantes. Après l'exploration et le traitement des informations d'e-mail pertinentes sur la page de recherche, le compte de messagerie obtenu est utilisé pour envoyer des e-mails de phishing par lots pour tromper ou frauder les utilisateurs ou les administrateurs pour qu'ils se connectent ou cliquer pour exécuter le compte, obtenant ainsi des autorisations système.

Bibliothèques de fonctions associées à utiliser

import sys
import getopt
import requests
from bs4 import BeautifulSoup
import re

L'entrée principale du programme, sys.argv [0] représente le chemin du code lui-même, sys.argv [1:] représente tous les paramètres suivants à l'exception du chemin, et renvoie une forme de liste

if __name__ == '__main__':
    #定义异常
    try:
        start(sys.argv[1:])
    except KeyboardInterrupt:
        print("interrupted by user,killing all threads...")

Ecrivez la fonction de démarrage dans le programme principal. Le plus important ici est de comprendre la fonction getopt.getopt (). La fonction de cette fonction est principalement de couper les paramètres de la ligne de commande et de renvoyer une liste de deux tuples, qui sont passés '-'et '--'couper respectivement .

#主函数,传入用户输入的参数
def start(argv):
    url = ""
    pages = ""
    if len(sys.argv) < 2:
        print("-h 帮助信息;\n")
        sys.exit()
    #定义异常处理
    try:
        banner()
        opts,args = getopt.getopt(argv,"-u:-p:-h")
    except getopt.GetoptError:
        print('Error an argument!')
        sys.exit()
    for opt,arg in opts:
        if opt == "-u":
            url = arg
        elif opt == "-p":
            pages = arg
        elif opt == "-h":
            print(usage())

    launcher(url,pages)

opts correspond aux informations de format analysées. args sont les paramètres de ligne de commande restants qui ne sont pas des informations de format, c'est-à-dire des informations autres que les caractères d'option longs ou courts et les paramètres supplémentaires définis dans getopt (). L' opt dans la boucle for est le premier paramètre du tuple (c'est-à-dire le paramètre entré par l'utilisateur) et arg est le deuxième paramètre du tuple (c'est-à-dire la valeur du paramètre entrée par l'utilisateur).

Afficher des informations d'aide pour augmenter la lisibilité et la facilité d'utilisation de l'outil de code

#banner信息
def banner():
    print('\033[1;34m########################################################################################\033[0m\n'
          '\033[1;34m######################################\033[1;32mpython安全实战\033[1;34m#####################################\033[0m\n'
          '\033[1;34m########################################################################################\033[0m\n')

#使用规则
def usage():
    print('-h: --help 帮助;')
    print('-u: --url 域名;')
    print('-p: --pages 页数;')
    print('eg: python -u "www.baidu.com" -p 100' + '\n')
    sys.exit()

Vient ensuite le corps principal de la fonction, qui est également la partie principale. Tout d'abord, écrivez la fonction de rappel de vulnérabilité pour améliorer la robustesse et l'évolutivité du code.

#漏洞回调函数
def launcher(url,pages):
    email_num = []
    key_words = ['email','mail','mailbox','邮件','邮箱','postbox']
    for page in range(1,int(pages)+1):
        for key_word in key_words:
            bing_emails = bing_search(url,page,key_word)
            baidu_emails = baidu_search(url,page,key_word)
            sum_emails = bing_emails + baidu_emails
            for email in sum_emails:
                if email in email_num:
                    pass
                else:
                    print(email)
                    with open('data.txt','a+') as f:
                        f.write(email + '\n')
                    email_num.append(email)

Ensuite, écrivez deux fonctions de robot d'exploration pour l'exploration des e-mails, car Bing et Baidu ont tous deux une protection anti-escalade, vous pouvez contourner la protection anti-escalade des moteurs de recherche en limitant les références, les cookies et autres informations.

#bingSearch
def bing_search(url,page,key_word):
    referer = "http://cn.bing.com/search?q=email+site%3abaidu.com&qs=n&sp=-1&pq=emailsite%3abaidu.com&first=1&FORM=PERE1"
    conn = requests.session()
    bing_url = "https://cn.bing.com/search?q="+key_word+"site%3a"+url+"&qs=n&sp=-1&pq="+key_word+"site%3a"+url+"&first="+str((page-1)*10)+"&FORM=PERE1"
    conn.get('http://cn.bing.com',headers=headers(referer))
    r = conn.get(bing_url,stream=True,headers=headers(referer),timeout=8)
    emails = search_email(r.text)
    return emails

#baiduSearch
def baidu_search(url,page,key_word):
    email_list = []
    emails = []
    referer = "https://www.baidu.com/s?wd=email+site%3Abaidu.com&pn=1"
    baidu_url = "https://www.baidu.com/s?wd="+key_word+"+site%3A"+url+"&pn="+str((page-1)*10)
    conn = requests.session()
    conn.get(referer,headers=headers(referer))
    r = conn.get(baidu_url, headers=headers(referer))
    soup = BeautifulSoup(r.text, 'lxml')
    tagh3 = soup.find_all('h3')
    for h3 in tagh3:
        href = h3.find('a').get('href')
        try:
            r = requests.get(href, headers=headers(referer),timeout=8)
            emails = search_email(r.text)
        except Exception as e:
            pass
        for email in emails:
            email_list.append(email)
    return email_list

Obtenez le numéro de boîte aux lettres via des expressions régulières et attachez des modificateurs d'indicateur facultatifs pour contrôler le modèle de correspondance.

def search_email(html):
    emails = re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+",html,re.I)
    return emails

def headers(referer):
    headers = {
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
               'Accept': '*/*',
               'Accept-Language':'en-US,en;q=0.5',
               'Accept-Encoding':'gzip,deflate',
               'Referer':referer}
    return headers
Modificateur la description
re.I Rendre le match insensible à la casse
re.L Faire une correspondance tenant compte des paramètres régionaux
re.M Correspondance multiligne, affecte ^ et $
re.S Faire. Faire correspondre tous les caractères, y compris les sauts de ligne
re.U Analysez les caractères en fonction du jeu de caractères Unicode. Cet indicateur affecte \ w, \ W, \ b, \ B.
re.X Cet indicateur vous permet d'écrire des expressions régulières plus faciles à comprendre en vous offrant une mise en forme plus flexible.

Enfin, joignez le code complet

import sys
import getopt
import requests
from bs4 import BeautifulSoup
import re

#主函数,传入用户输入的参数
def start(argv):
    url = ""
    pages = ""
    if len(sys.argv) < 2:
        print("-h 帮助信息;\n")
        sys.exit()
    #定义异常处理
    try:
        banner()
        opts,args = getopt.getopt(argv,"-u:-p:-h")
    except getopt.GetoptError:
        print('Error an argument!')
        sys.exit()
    for opt,arg in opts:
        if opt == "-u":
            url = arg
        elif opt == "-p":
            pages = arg
        elif opt == "-h":
            print(usage())

    launcher(url,pages)

#banner信息
def banner():
    print('\033[1;34m########################################################################################\033[0m\n'
          '\033[1;34m######################################\033[1;32mpython安全实战\033[1;34m#####################################\033[0m\n'
          '\033[1;34m########################################################################################\033[0m\n')

#使用规则
def usage():
    print('-h: --help 帮助;')
    print('-u: --url 域名;')
    print('-p: --pages 页数;')
    print('eg: python -u "www.baidu.com" -p 100' + '\n')
    sys.exit()

#漏洞回调函数
def launcher(url,pages):
    email_num = []
    key_words = ['email','mail','mailbox','邮件','邮箱','postbox']
    for page in range(1,int(pages)+1):
        for key_word in key_words:
            bing_emails = bing_search(url,page,key_word)
            baidu_emails = baidu_search(url,page,key_word)
            sum_emails = bing_emails + baidu_emails
            for email in sum_emails:
                if email in email_num:
                    pass
                else:
                    print(email)
                    with open('data.txt','a+') as f:
                        f.write(email + '\n')
                    email_num.append(email)

#bingSearch
def bing_search(url,page,key_word):
    referer = "http://cn.bing.com/search?q=email+site%3abaidu.com&qs=n&sp=-1&pq=emailsite%3abaidu.com&first=1&FORM=PERE1"
    conn = requests.session()
    bing_url = "https://cn.bing.com/search?q="+key_word+"site%3a"+url+"&qs=n&sp=-1&pq="+key_word+"site%3a"+url+"&first="+str((page-1)*10)+"&FORM=PERE1"
    conn.get('http://cn.bing.com',headers=headers(referer))
    r = conn.get(bing_url,stream=True,headers=headers(referer),timeout=8)
    emails = search_email(r.text)
    return emails

#baiduSearch
def baidu_search(url,page,key_word):
    email_list = []
    emails = []
    referer = "https://www.baidu.com/s?wd=email+site%3Abaidu.com&pn=1"
    baidu_url = "https://www.baidu.com/s?wd="+key_word+"+site%3A"+url+"&pn="+str((page-1)*10)
    conn = requests.session()
    conn.get(referer,headers=headers(referer))
    r = conn.get(baidu_url, headers=headers(referer))
    soup = BeautifulSoup(r.text, 'lxml')
    tagh3 = soup.find_all('h3')
    for h3 in tagh3:
        href = h3.find('a').get('href')
        try:
            r = requests.get(href, headers=headers(referer),timeout=8)
            emails = search_email(r.text)
        except Exception as e:
            pass
        for email in emails:
            email_list.append(email)
    return email_list

def search_email(html):
    emails = re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+",html,re.I)
    return emails

def headers(referer):
    headers = {
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
               'Accept': '*/*',
               'Accept-Language':'en-US,en;q=0.5',
               'Accept-Encoding':'gzip,deflate',
               'Referer':referer}
    return headers

if __name__ == '__main__':
    #定义异常
    try:
        start(sys.argv[1:])
    except KeyboardInterrupt:
        print("interrupted by user,killing all threads...")

Rendu du code
Insérez la description de l'image ici

Résumé: Étant donné que la collecte d'informations implique beaucoup de connaissances de base sur les robots d'exploration, la base des robots d'exploration Python doit être solide et le code ci-dessus n'est pas statique, car l'URL du site Web peut changer.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45007073/article/details/113136441
conseillé
Classement