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