# 前言
在渗透测试的过程中,无论你是在进行 web 渗透还是,内网渗透还是域渗透,收集到关于目标系统更加全面的信息是非常重要的,信息收集贯穿整个渗透测试的生命周期中,通常我们将信息收集分为主动信息收集和被动信息收集
被动信息收集
主要是指不与目标主机进行直接交互,通常根据搜索引擎或者社交等方式间接的获取目标服务器的信息。常见的信息收集主要包括:子域名收集,IP 地址查询,域名反查,whois 查询,邮件收集,github 源码泄露等
# 域名查 IP
IP 查询是通过当前所获取到的 url 去查询对应 ip 地址的过程
可以应用 Socket 库函数中的 gethostbyname () 函数获域名对应的 ip 值
import socket
print(socket.gethostbyname('www.baidu.com'))
也可以直接去 ping 域名
但是这样拿到的 ip 不一定是真实 ip,可能存在 CDN,我们可以通过这个网站 http://www.baidu.com GET 测试结果 网站速度测试 17CE 通过全国各地的 ping,看域名是否一致,如果不一致我们就可以认定,这里打开了 CDN,反之一直就可以认定其为真实 ip
# 绕过 CDN 查找真实 IP
CDN 是 Content Delivery Network 的缩写,翻译成中文是内容分发网络。它是一种通过在全球范围内部署服务器来提高网站访问速度和性能的技术。CDN 的主要目的是通过将网站的静态资源(如图片、视频、CSS、JavaScript 等)缓存到离用户更近的服务器上,从而加快用户访问网站的速度。当用户请求访问网站时,CDN 会自动选择离用户最近的服务器来提供内容,从而减少了网络延迟和带宽使用,提高了网站的访问速度和性能。
下面几种常见的绕过 CDN 防护寻找真实 ip 的方法:
- 目标邮件系统:一般的邮件系统都在内部,没有进行 CDN 解析,通过目标网站的用户注册 / 登录等功能,寻找邮件服务器域名 ip
- 扫描敏感文件:如 phpinfo 泄露,github 信息泄露,命令执行等,可在敏感文件中寻找到真实 ip
- 国外访问:国内的 CDN 往往只对国内的用户访问加速,因此可通过国外的代理,或者服务器访问,可能会拿到真实 ip
- 分站域名:很多服务器主站的访问量会比较大,所以主站挂 dns,但是分站没有 CDN
- 利用 Access denied (securitytrails.com) 平台,查找历史记录来寻找到真实 ip
# 验证获取的 ip 地址
- 找到目标的真实 IP 后,如果是 web 服务,最简单的方式就是直接用 IP 访问,看响应的页面和访问域名的一致
- 借助端口扫描工具,扫描对应的 IP 地址,并以 IP 地址加端口的形式进行访问,观察响应结果是否和目标站点一致
- 借助第三方工具,查看该 ip 绑定的域名是否相同
# whois 查询和 ip 反查
# whois 查询
whois 查询是用来查询域名的 ip 以及所有者信息的传输协议,简单地说,whois 就是一个数据库,用来查询域名是否已经被注册,以及注册域名的详细信息(如域名所有人,域名注册商等)。python 中的模块 python-whois 可用于 whois 的查询
安装模块命令:
pip install python-whois |
使用
# ip 反查绑定域名
当访问 ip 地址,查询不到网站目录,此时可以通过查询目标 IP 绑定的 url,通过访问该域名访问目标网站,多网站进行 web 渗透,常使用两个网站域名查 iP 域名解析 iP 查询网站 iP 反查域名 iP 反查网站 同一 iP 网站 同 iP 网站域名 iP 查询 (ip138.com)
222.140.23.133 属于河南省 许昌市 魏都区 联通_IP 反查域名_同 IP 站点查询_同 ip 网站查询_爱站网 (aizhan.com)
这里既然是 python 骗,这里贴上一个大佬的 python 脚本
import requests | |
from bs4 import BeautifulSoup | |
import re | |
from optparse import OptionParser | |
def main(): | |
parser = OptionParser("Usage:%prog -i <target host> ") # 输出帮助信息 | |
parser.add_option('-i',type='string',dest='IP',help='specify target host') # 获取 ip 地址参数 | |
options,args = parser.parse_args() | |
print("Search for " + options.IP + "\n") | |
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0', | |
'Accept': '*/*' | |
} | |
url = "https://site.ip138.com/"+options.IP | |
r = requests.get(url,headers=headers) | |
pattern = re.compile('<li><span class="date".*?</li>',re.S) | |
content = re.findall(pattern,r.text) | |
for line in content: | |
soup = BeautifulSoup(line,'lxml') | |
url = soup.a.attrs['href'] | |
print(url.strip('/')) | |
if __name__ == "__main__": | |
try: | |
main() | |
except KeyboardInterrupt: | |
print("interrupted by user, killing all threads...") |
# web 指纹识别
主要是为了探究目标网站的 CMS,通过网上已经公开的快速的进行漏洞验证对目标渗透测试过程中,目标的 cms 是十分重要的信息,有了目标的 cms,就可以利用相关 bug 进行测试,进行代码审计等。
有很多开源的工具和指纹库,如 fofa、WhatWeb、w11scan、WebEye.
# 域名解析
DNS 是互联网上作为域名和 ip 地址相互映射的一个分布式数据库,通过 DNS 使得用户更方便的访问互联网,而不是去记忆能够被机器读取的 IP 地址,简单来说就是将域名解析成 IP 地址
域名解析的特点:IP 地址对域名是一对多的关系
常见的解析类型:
- A 记录解析:有被称为 ip 指向,用户可以在此设置子域名并指向到自己的目标主机 ip 地址上,从而通过域名找到服务器 (一一对应)
- CNAME 记录解析:有被称为别名指向,把域名解析到另一个地址,比如设置 test.mydomain.com,用来指向一个主机 www.rddns.com 那么以后就可以用 test.mydomain.com 来代替方法 www.rddns.com
- MX 记录解析:有被称为邮件交换记录,用于以该域名为结尾的电子邮箱指向邮件服务器,如:用户所有的邮件结尾是以域名 mydomain.com 结尾,则需要在管理界面添加该域名的 MX 记录来处理所有以 @mydomain.com 结尾的邮件
# 域名服务器
根域名服务器:主要用来管理互联网的主目录,世界一个有 13 个根域名服务器,名字分别是 A 到 M
顶级域名服务器:顶级域名就是在根域名的前面加上你自己定义的字母或者数字等字符
二级域名服务器:当注册了一个顶级域名服务器后,列入 web.cn 就可以在互联网服务提供商的 dns 解析系统上面自由的分配二级域名或者三级域名
权威名称服务器:名称服务器(DNS 服务器),用于保存特定域 / 地址的实际 DNS 记录(A,CNAME,PTR 等)。
# 基于搜索引擎的子域名收集
- Site:特定域名下进行搜索。
- Domain:查询自身网站的外部链接。
- Inurl:指令用于搜索查询词出现在 url 中的页面。
- Intitle:进行搜索含关键字的标题。
- Info:查找指定站点的一些基本信息。
- Filetype:只搜索某些特定类型的文件格式。
- Link:返回所有和 xxxxxxx 做了链接的 URLIndex:返回的网页中在正文部分包含关键词。
- Define:搜索某个词语的定义 And:利用 and 表示前后两个关键词是 “与” 的逻辑关系,例如 “SEO and 网络营销”,就会找出将包含 SEO 和网络营销有关的网站。
# 社工攻击概述
下面是一个流程的攻击链
社会工程攻击,是一种利用 “社会工程学” 来实施的网络攻击行为
- 供应链攻击:针对各类软件,供应商,合作商等进行攻击的攻击方式
- 水坑攻击:通过猜测观察目标的经常访问的网站,并入侵其中一个或者多个,植入恶意软件,达到感染该组目标中部分成员的目的
- 物理攻击 - USB 摆渡:散播 USB 攻击:Autorun.inf,BadUSB,u 盘,鼠标,键盘,USB 风扇,USB 灯;
- 物理攻击 - WIFI 攻击:内网 WIFI - 弱口令,内网 GuestWIFI,使用 wifi 钥匙一类的众筹密码产品
- 物理攻击 - 人工渗透:伪造工牌,伪造工卡,伪造工作人员,物理开锁
- 钓鱼邮件攻击:攻击这获取或者篡改邮件,病毒邮件,垃圾邮件,邮件炸弹等
# 邮件钓鱼攻击
# 伪造钓鱼网站
做一个很像的前段,发一个链接让受害者去访问点击,获取受害者的账号密码
使用 kali 的 Social-Engineer Toolkit
首先选择社会工程学攻击
接着选择 web 网站攻击
接着选择 5
接着选择 1,网站克隆
下面就是 ip 和目标网站了
# 鱼叉攻击
利用木马程序作为邮件的附件,发送到目标电脑上,诱导受害者去打开附件来感染木马
传统宏文件制作钓鱼邮件
# CHM 钓鱼
CHM 已编译的帮助文件,它是微软新一代的帮助文件格式,利用 HTML 作为源文,把帮助内容以类似数据库的形式编译存储
# 其他钓鱼方式
- OLE 钓鱼:
利用 word 中插入外部对象的方式 - LNK 钓鱼:
lnk 文件是用于指向其他文件的一种文件。这些文件通常被称为快捷方式 - HTA 钓鱼
HTA 钓鱼是 HTML Application 的缩写,直接讲 HTML 保持成 HTA 的格式,是一个独立的应用软件 - 捆绑马
# 目标邮箱收集
Find email addresses in seconds • Hunter (Email Hunter)
微匹 - 让每天都有新客户 (veryvp.com)
上面两个网站都说用来收集邮箱的
#-*- coding:utf-8 -*- | |
import sys | |
import getopt | |
import requests | |
from bs4 import BeautifulSoup | |
import re | |
import time | |
import threading | |
#banner 信息 | |
def banner(): | |
print('\033[1;34m########################################################################################\033[0m\n' | |
'\033[1;34m######################################\033[1;32m贝塔安全实验室\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 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()) | |
threader(url, pages) | |
class MyThread(threading.Thread): | |
def __init__(self, func, args=()): | |
super(MyThread, self).__init__() | |
self.func = func | |
self.args = args | |
def run(self): | |
if self.args[1] < 1: | |
pass | |
else: | |
self.result = self.func(*self.args) # 在执行函数的同时,把结果赋值给 result, 然后通过 get_result 函数获取返回的结果 | |
def get_result(self): | |
try: | |
return self.result | |
except Exception as e: | |
return None | |
def threader(url,pages): | |
launcher(url,pages) | |
#漏洞回调函数 | |
def launcher(url,pages): | |
if len(pages)< 1: | |
pass | |
else: | |
for page in range(1,int(pages)+1): | |
keyword(url,page) | |
def keyword(url,page): | |
threads = [] | |
email_sum = [] | |
email_num = [] | |
key_words = ['email', 'mail', 'mailbox', '邮件', '邮箱', 'postbox'] | |
for key_word in key_words: | |
t = MyThread(emails, args=(url, page,key_word)) | |
t.start() | |
threads.append(t) | |
for t in threads: | |
t.join() # 一定执行 join, 等待子进程执行结束,主进程再往下执行 | |
email_num.append(t.get_result()) | |
for email in email_num: | |
for list in email: | |
if list in email_sum: | |
pass | |
else: | |
email_sum.append(list) | |
print(list) | |
def emails(url,page,key_word): | |
bing_emails = bing_search(url, page, key_word) | |
baidu_emails = baidu_search(url, page, key_word) | |
sum_emails = bing_emails + baidu_emails | |
return sum_emails | |
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 = "http://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 | |
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 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0', | |
'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...") |
# 邮件钓鱼的防御
- 尽量避免直接点击邮件中的网络连接以及附件文件;
- 回复邮件时,如果回复的地址与发信人不同,要谨慎对待;
- 对于要求提供任何关于自己隐私(如:账号名、口令、银行账号等)的邮件,要谨慎对待;
- 不要使用很简单的口令;
- 尽量不要使用同一个口令,不同的账号,使用不同的口令;
- 邮件系统要及时清理;
- 公司邮件系统安装部署安全邮件网关