python实现web邮箱扫描的示例(附源码)


Posted in Python onMarch 30, 2021

信息收集是进行渗透测试的关键部分,掌握大量的信息对于攻击者来说是一件非常重要的事情,比如,我们知道一个服务器的版本信息,我们就可以利用该服务器框架的相关漏洞对该服务器进行测试。那么如果我们掌握了该服务器的管理员的邮箱地址,我们就可以展开一个钓鱼攻击。所以,对web站点进行邮箱扫描,是进行钓鱼攻击的一种前提条件。

下面,我们利用python脚本来实现一个web站点的邮箱扫描爬取。目的是在实现这个脚本的过程中对python进行学习

最后有完整代码

基本思路

  1. 我们向工具传入目标站点之后,首先要对输入进行一个基本的检查和分析,因为我们会可能会传入各种样式的地址,比如http://www.xxxx.com/、http://www.xxxx.com/123/456/789.html等等,我们需要对其进行简单的拆分,以便于后面链接的爬取
  2. 通过requests库爬取目标地址的内容,并且在内容通过正则表达式中寻找邮箱地址
  3. 查找爬取的网站中的超链接,通过这些超链接我们就能进入到该站点的另外一个页面继续寻找我们想要的邮箱地址。
  4. 开工:

该脚本所需要的一些库

from bs4 import BeautifulSoup #BeautifulSoup最主要的功能是从网页抓取数据,Beautiful Soup自动将输入文档转换为Unicode编码
import requests #requests是python实现的最简单易用的HTTP库
import requests.exceptions
import urllib.parse
from collections import deque #deque 是一个双端队列, 如果要经常从两端append 的数据, 选择这个数据结构就比较好了, 如果要实现随机访问,不建议用这个,请用列表. 
import re #是一个正则表达式的库

获取扫描目标

user_url=str(input('[+] Enter Target URL to Scan:'))
urls =deque([user_url]) #把目标地址放入deque对象列表

scraped_urls= set()#set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
emails = set()

对网页进行邮箱地址爬取(100条)

首先要对目标地址进行分析,拆分目标地址的协议,域名以及路径。然后利用requests的get方法访问网页,通过正则表达式过滤出是邮箱地址的内容。'[a-z0-0.-+]+@[a-z0-9.-+]+.[a-z]+',符合邮箱格式的内容就进行收录。

count=0
try:
  while len(urls):  #如果urls有长度的话进行循环
    count += 1		#添加计数器来记录爬取链接的条数 
    if count ==101:
      break
    url = urls.popleft() #popleft()会删除urls里左边第一条数据并传给url
    scraped_urls.add(url)

    parts = urllib.parse.urlsplit(url) # 打印 parts会显示:SplitResult(scheme='http', netloc='www.baidu.com', path='', query='', fragment='')
    base_url = '{0.scheme}://{0.netloc}'.format(parts)#scheme:协议;netloc:域名 

    path = url[:url.rfind('/')+1] if '/' in parts.path else url#提取路径
    print('[%d] Processing %s' % (count,url))
   
    try:
      head = {'User-Agent':"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11"}
      response = requests.get(url,headers = head)
    except(requests.exceptions.MissingSchema,requests.exceptions.ConnectionError):
      continue
    new_emails = set(re.findall(r'[a-z0-0\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+', response.text ,re.I))#通过正则表达式从获取的网页中提取邮箱,re.I表示忽略大小写
    emails.update(new_emails)#将获取的邮箱地址存在emalis中。

通过锚点进入下一网页继续搜索

soup = BeautifulSoup(response.text, features='lxml')

    for anchor in soup.find_all('a'):  #寻找锚点。在html中,<a>标签代表一个超链接,herf属性就是链接地址
      link = anchor.attrs['href'] if 'href' in anchor.attrs else '' #如果,我们找到一个超链接标签,并且该标签有herf属性,那么herf后面的地址就是我们需要锚点链接。
      if link.startswith('/'):#如果该链接以/开头,那它只是一个路径,我们就需要加上协议和域名,base_url就是刚才分离出来的协议+域名
        link = base_url + link
      elif not link.startswith('http'):#如果不是以/和http开头的话,就要加上路径。
        link =path + link
      if not link in urls and not link in scraped_urls:#如果该链接在之前没还有被收录的话,就把该链接进行收录。
        urls.append(link)
except KeyboardInterrupt:
  print('[+] Closing')

for mail in emails:
  print(mail)

完整代码

from bs4 import BeautifulSoup
import requests
import requests.exceptions
import urllib.parse
from collections import deque
import re

user_url=str(input('[+] Enter Target URL to Scan:'))
urls =deque([user_url])

scraped_urls= set()
emails = set()


count=0
try:
  while len(urls):
    count += 1
    if count ==100:
      break
    url = urls.popleft()
    scraped_urls.add(url)

    parts = urllib.parse.urlsplit(url)
    base_url = '{0.scheme}://{0.netloc}'.format(parts)

    path = url[:url.rfind('/')+1] if '/' in parts.path else url

    print('[%d] Processing %s' % (count,url))
    try:
      head = {'User-Agent':"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11"}
      response = requests.get(url,headers = head)
    except(requests.exceptions.MissingSchema,requests.exceptions.ConnectionError):
      continue
    new_emails = set(re.findall(r'[a-z0-0\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+', response.text ,re.I))
    emails.update(new_emails)

    soup = BeautifulSoup(response.text, features='lxml')

    for anchor in soup.find_all('a'):
      link = anchor.attrs['href'] if 'href' in anchor.attrs else ''
      if link.startswith('/'):
        link = base_url + link
      elif not link.startswith('http'):
        link =path + link
      if not link in urls and not link in scraped_urls:
        urls.append(link)
except KeyboardInterrupt:
  print('[+] Closing')

for mail in emails:
  print(mail)

实验………………

python实现web邮箱扫描的示例(附源码)

以上就是python实现web邮箱扫描的示例(附源码)的详细内容,更多关于python web邮箱扫描的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python 环境变量和import模块导入方法(详解)
Jul 11 Python
numpy.linspace函数具体使用详解
May 27 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
用python打印菱形的实操方法和代码
Jun 25 Python
python做反被爬保护的方法
Jul 01 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
May 11 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
python编写五子棋游戏
May 25 Python
Python OpenCV之常用滤波器使用详解
Apr 07 Python
python函数指定默认值的实例讲解
Mar 29 #Python
pytest进阶教程之fixture函数详解
python中pandas.read_csv()函数的深入讲解
Mar 29 #Python
python编写函数注意事项总结
Mar 29 #Python
python基于tkinter制作无损音乐下载工具
Python requests库参数提交的注意事项总结
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
You might like
域名查询代码公布
2006/10/09 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
php实现微信发红包功能
2018/07/13 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
2014/03/20 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
vue的keep-alive中使用EventBus的方法
2019/04/23 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
村优秀党员事迹材料
2014/01/15 职场文书
爱情检讨书大全
2014/01/21 职场文书
大专会计自我鉴定
2014/02/06 职场文书
邓小平理论心得体会
2014/09/09 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
七年级上册生物的课件
2019/08/07 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis