Recopilación pasiva de información

Introducción

La recopilación de información pasiva se refiere a no interactuar directamente con el host de destino y, por lo general, obtiene la información del host de destino indirectamente basándose en motores de búsqueda o métodos de redes sociales.

La recopilación de información pasiva extrae principalmente información de activos de destino a través de motores de búsqueda o redes sociales y otros métodos, que generalmente incluyen consultas de IP, consultas de Whois, recopilación de subdominios, etc. Al recopilar información pasiva, no hay interacción con el objetivo, y la información del objetivo se puede extraer sin tocar el sistema del objetivo. Los métodos principales incluyen resolución de DNS, minería de subdominios, rastreo de correo electrónico, etc.

Consulta de IP

La consulta de IP es el proceso de consultar la dirección IP correspondiente a través de la URL obtenida actualmente.
Inserte la descripción de la imagen aquí

Consulta Whois

Whois es un protocolo de transmisión que se utiliza para consultar la IP y la información del propietario de un nombre de dominio. En pocas palabras, es una base de datos para consultar si el nombre de dominio se ha registrado y la información detallada del nombre de dominio registrado, como el propietario del nombre de dominio. , registrador de nombres de dominio, etc.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Minería de subdominios

Los nombres de dominio se pueden dividir en nombres de dominio de nivel superior, nombres de dominio de primer nivel y nombres de dominio de segundo nivel. En el proceso de prueba, si no se encuentran vulnerabilidades relacionadas al probar la estación maestra de destino, generalmente se considera extraer el nombre del subdominio del sistema de destino en este momento. Hay muchos métodos de minería de subdominios, como motor de búsqueda, descifrado de subdominios, consulta de diccionario, etc.

Entre las herramientas actualmente en uso, mi favorita es la excavadora de subdominio Layer
Inserte la descripción de la imagen aquí

Raspado de correo

En el proceso de infiltración en el sistema de destino, si la seguridad del servidor de destino es muy alta y es difícil obtener la autoridad de destino a través del servidor, el método de ingeniería social se utiliza generalmente para atacar aún más el servidor de destino. El phishing por correo electrónico es uno de los métodos de ataque más habituales. Después de rastrear y procesar la información de correo electrónico relevante en la página de búsqueda, la cuenta de correo electrónico obtenida se utiliza para enviar correos electrónicos de phishing en lotes para engañar o defraudar a los usuarios o administradores para que inicien sesión o hagan clic para ejecutar la cuenta, obteniendo así los permisos del sistema.

Bibliotecas de funciones relacionadas que se utilizarán

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

La entrada principal del programa, sys.argv [0] representa la ruta del código en sí, sys.argv [1:] representa todos los siguientes parámetros excepto la ruta, y devuelve una forma de lista.

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

Escriba la función de inicio en el programa principal. Lo más importante aquí es entender la función getopt.getopt (). La función de esta función es principalmente cortar los parámetros de la línea de comando y devolver una lista de dos tuplas, que se pasan '-'y '--'cortar respectivamente .

#主函数,传入用户输入的参数
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 es la información de formato analizada. args son los parámetros restantes de la línea de comandos que no son información de formato, es decir, información distinta de los caracteres de opción largos o cortos y los parámetros adicionales definidos en getopt (). La opción en el bucle for es el primer parámetro en la tupla (es decir, el parámetro ingresado por el usuario) y arg es el segundo parámetro de la tupla (es decir, el valor del parámetro ingresado por el usuario).

Genere información de ayuda para aumentar la legibilidad y la facilidad de uso de la herramienta de código.

#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()

El siguiente es el cuerpo principal de la función, que también es la parte central. Primero, escriba la función de devolución de llamada de vulnerabilidad para mejorar la robustez y escalabilidad del código.

#漏洞回调函数
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)

Luego escriba dos funciones de rastreador para rastrear correos electrónicos, ya que Bing y Baidu tienen protección anti-escalada, puede omitir la protección anti-escalada de los motores de búsqueda limitando el referente, las cookies y otra información.

#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

Obtenga el número de buzón a través de expresiones regulares y adjunte modificadores de marca opcionales para controlar el patrón de coincidencia.

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
Modificador descripción
re. Hacer que la coincidencia no distinga entre mayúsculas y minúsculas
re.L Haga una coincidencia basada en la configuración regional
movimiento rápido del ojo Coincidencia de varias líneas, afecta a ^ y $
re.S Hacer coincidir todos los caracteres, incluida la nueva línea
re.U Analice los caracteres según el juego de caracteres Unicode. Esta bandera afecta a \ w, \ W, \ b, \ B.
re.X Esta bandera le permite escribir expresiones regulares más fáciles de entender al brindarle un formato más flexible.

Finalmente, adjunte el código completo

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...")

Representación de código
Inserte la descripción de la imagen aquí

Resumen: debido a que la recopilación de información implica una gran cantidad de conocimientos básicos sobre rastreadores, la base de los rastreadores de Python debe ser sólida y el código anterior no es estático, porque la URL del sitio web puede cambiar.

Supongo que te gusta

Origin blog.csdn.net/weixin_45007073/article/details/113136441
Recomendado
Clasificación