一,域名信息收集
1-1 域名信息查询
可以用一些在线网站进行收集,比如站长之家
域名Whois查询 - 站长之家站长之家-站长工具提供whois查询工具,汉化版的域名whois查询工具。https://whois.chinaz.com/
可以查看一下有没有有用的信息,不过一些大网站优化的很好,一般没有什么可用信息的。
其他查询网站
中国万网域名WHOIS信息查询地址:
https://whois.aliyun.com/
西部数码域名WHOIS信息查询地址:
https://whois.west.cn/
新网域名WHOIS信息查询地址:
http://whois.xinnet.com/domain/whois/index.jsp
纳网域名WHOIS信息查询地址:
http://whois.nawang.cn/
中资源域名WHOIS信息查询地址:
https://www.zzy.cn/domain/whois.html
三五互联域名WHOIS信息查询地址:
https://cp.35.com/chinese/whois.php
新网互联域名WHOIS信息查询地址:
http://www.dns.com.cn/show/domain/whois/index.do
美橙互联域名WHOIS信息查询地址:
https://whois.cndns.com/
爱名网域名WHOIS信息查询地址:
https://www.22.cn/domain/
易名网域名WHOIS信息查询地址:
https://whois.ename.net/
1-2 SEO信息查询
站长之家可以查
可以看到一些备案信息,真实IP地址等一些信息
1-3 子域名收集
首先为什么要进行子域名收集呢?因为往往网站首页或者一些主要网页安全做的很好,很难找到突破口,但是一些子网站安全不一定做的很好,所以有时候从子域名入手也是个思路,所以需要手机子域名信息
1-3-1 在线收集子域名
子域名查询 - 站长工具子域名查询https://tool.chinaz.com/subdomain/
查到的子域名你一个个去访问一下,看看是否能访问,是否开放文本服务等
1-3-2 子域名收集工具
2-1JSFinder
工具下载地址:(Python写的工具,需要有Python环境)
需要安装模块
bash
pip install requests
pip install bs4
用法:(在JSFinder.py路径下打开终端,按住shift,鼠标右击可以看到打开终端选项)
bash
python JSFinder.py -u https://www.mi.com
2-2 Layer子域名挖掘机
(需要工具可以留言)
2-3 subDomainsBrute.py
需要工具可以留言,或者自行找一下,去github上搜
bash
python .\subDomainsBrute.py www.baigui.cloud
2-4 oneforall.py
bash
python .\oneforall.py --target mi.com run
2-5 用Python自己写个脚本
5-1 ping命令+ 域名字典进行收集
python
## 基于ping 进行子域名扫描
import os
def ping_domain(P_domain):
## xxx是二级域名字典
with open('xxx') as f:
domain_list = f.readlines()
for domain in domain_list:
full_domain = f'{domain.strip()}.{P_domain}'
result = os.popen(f'ping -n 1 -w 1000 {full_domain}').read()
if '请求超时' in result or "TTL=" in result:
print(f'{full_domain} 存在')
if "找不到主机" not in result:
print(f'{full_domain} 存在')
5-2 基于socket库
python
import socket
## 基于socket库DNS解析记录实现扫描
def socket_domain(P_domain):
## 读取域名字典文件
with open('xxx') as f:
domain_list = f.readlines()
for domain in domain_list:
try:
full_domain = f'{domain.strip()}.{P_domain}'
ip = socket.gethostbyname(full_domain)
## 如果这个域名存在则会返回IP地址,不存在报 socket.gaierror
print(f"{ip} ------ {full_domain}")
except socket.gaierror:
pass
except:
pass
1-4 备案号和ssl证书查询子域名
1-4-1 域名备案信息查询
1-4-2 ICP备案号查询
https://beian.miit.gov.cn/https://beian.miit.gov.cn/
有了备案号,可以通过备案号查询这个公司的其他备案的子域名
1-4-3 ssl证书查询
二,真实IP信息收集
为什么要找网站真实IP呢,因为网站有可能使用CDN服务器来进行加速,相当于说CDN服务器也缓存了一份服务器的数据,网站数据是从CDN服务器获取的,这样的话我们需要找出网站的真实IP来找出网站自己的真实服务器,所以我们需要找到网站的真实IP。要不然不找到真实IP,直接进行攻击,很有可能我们攻击的是CSDN服务器,
有了CDN服务器加速以后,客户端只要到离自己最近的一个CDN服务器拿数据即可,这样网站访问速度会提高,但是我们要攻击的是网站的真实服务器,不是CDN服务器,那么就需要找出真实IP
如何判断有没有CDN加速呢? 下面有几种方法?
2-1 超级ping
原理:如果有了CDN加速的话,不同地方的客户端都会去离子最近的CND服务器去拿资源,所以你在新疆,海南,北京.....不同地方Ping对方服务器,拿到的IP不一样。如果没有CDN加速的话,你ping 对方服务器,无论你在哪里,都会去找真实服务器拿资源,ping出来的IP都一样
多个地点Ping服务器,网站测速 - 站长工具通过该工具可以多个地点Ping服务器以检测服务器响应速度。https://ping.chinaz.com/
全国各地对域名进行ping 最后ping出来的只有一个IP,说明没有用CDN加速
模拟全国各地进行ping 得到8个IP地址,说明很有可能使用了DNS加速
2-2 终端ping
上面看到的IP很有可能是真实IP,不过需要确认。
2-3 nslookup(windows)
是查询DNS的记录,查看域名解析是否正常,在网络故障的时候用来诊断网络问题的工具,通过它也可以尝试获取一个域名对应的ip地址
bash
命令格式:nslookup domain[dns-server]
示例:
nslookup ainiai.top
还可以指定查询的DNS记录类型
命令格式:
nslookup -qt=type domain[dns-server]
示例:
nslookup -qt=CNAME ainiai.top
2-4 dig(Linux)
Dig是一个在linux命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具。也能探测到某个域名对应的ip地址。dig 最基本的功能就是查询域名信息
bash
dig ainiai.top
2-5 CDN绕过工具
2-5-1 使用工具绕过,效果不佳
bash
## 工具1:fuckcdn
https://github.com/Tai7sy/fuckcdn
## 工具2:w8fuckcdn
https://github.com/boy-hack/w8fuckcdn
2-5-2 DNS历史解析
这种历史记录查询,有可能能够找到它没有使用cdn之前的真实ip地址
可以用如下网站试一试。我就不试了
bash
https://x.threatbook.com/v5/domain/wulaoban.top
https://dnsdb.io/zh-cn/ ###DNS查询
https://x.threatbook.cn/ ###微步在线
http://toolbar.netcraft.com/site_report?url=www.wulaoban.top ###在线域名信息查询
http://viewdns.info/ ###DNS、IP等查询
https://tools.ipip.net/cdn.php ###CDN查询IP
https://securitytrails.com/domain/wulaoban.top/dns
三,旁站和C段
3-1 什么是旁站?
旁站:一般是指的是同ip,也就是同服务器下的不同站点,比如我们前面使用IIS部署了多个网站在同一个ip下。
比如一个服务192.168.31.20 分别用三个端口部署了三个网站
192.168.31.20:80
192.168.31.20:81
192.168.31.20:82
3-2 什么是C段 ?
比如在:127.127.127.4 这个IP上面有一个网站 127.4 这个服务器上面有网站我们可以想想..他是一个非常大的站几乎没什么漏洞!但是在他同C段 127.127.127.1~127.127.127.255 这 1~255 上面也有服务器而且也有网站并且存在漏洞,那么我们就可以来渗透 1~255任何一个站 之后提权来嗅探得到127.4 这台服务器的密码 甚至3389连接的密码后台登录的密码 如果运气好会得到很多的密码...
简单来讲就是一个大的公司可能在一个IP段买了很多连号服务器 ,这些服务器就是C段
3-3 IISPutScanner
用来收集旁站和C段(需要工具请留言)
四,收集端口和服务
4-1 常用端口
这些端口需要记住,很多都是很常用的
ftp 21
ssh\sftp 22
telnet 23 # 很多交换机、路由器会用到telnet来进行管理,主要是用来做远程主机管理的
smtp 25 # 发邮件
pop3 110 # 收邮件
dns 53
smb 445 # 微软的文件共享,netstat -an -p tcp|findstr "LISTENING" windows必开,139端口也是windows做共享的
https 443
http 80
apache 80 443
nginx 80 443
tomcat 8080
weblogic 7001
mysql 3306
mssql 1433
oracle 1521
postgresql 5432
redis 6379
mongdb 27017
vnc 5900 # 远程控制工具
IIS 80
jboss 8080
rdp == remote desktop protocol 3389
4-2 nmap工具扫描
这个工具kali上自带,可以直接在命令行使用
Windows的话需要下载,我已经下载并配置好了环境变量
nmap工具的详细使用步骤我写了一篇博客详细讲了,请看下面这篇博客
nmap工具的使用_ANii_Aini的博客-CSDN博客扫描网段判断存活主机;扫描端口;扫描操作系统;基于三次握手去扫描;基于ACK包进行探测https://blog.csdn.net/m0_67844671/article/details/132805990?spm=1001.2014.3001.5502可以简单用以下,比如判断一个IP段的存活主机
收集一个主机开放的端口和服务
4-3 自己编写的Python脚本
4-3-1 基于单线程找开放端口
python
## 端口扫描
## 对目标IP进行进行端口扫描,尝试连接IP和端口
# 单线程
import socket
def socket_port(ip):
for port in range(1,100):
try:
s = socket.socket()
s.settimeout(0.1)
s.connect((ip,port))
print(f'端口:-----{port}可用 ----------- yes')
except socket.timeout:
pass
except:
pass
4-3-2 基于多线程找开放端口
python
# 基于多线程进行端口扫描
import socket
def socket_port_thread(ip,start):
for port in range(start,start+50):
try:
s = socket.socket()
s.settimeout(0.01)
s.connect((ip,port))
print(f'端口:-----{port}可用 ----------- yes')
except:
pass
from threading import Thread
port_list = [22,25,80,443,3306,1521]
if __name__ == "__main__":
# socket_port('192.168.31.162')
for i in range(1,10000,50):
Thread(target=socket_port_thread,args=('192.168.31.160',i)).start()
4-3-3 优化
python
## 优化思路:对常用端口进行优先扫描
import socket
import time
def socket_port_noramal(ip):
list = [7,21,22,23,25,53,67,68,69,79,80,81,88,109,110,113,135,137,138,139,143,161,162,179,194,220,389,443,445,465,513,520,546,547,554,563,631,636,991,993,995,1080,1194,1433,1434,1494,1521,1701,1723,1755,1812,1813,1863,3269,3306,3307,3389,3544,4369,5060,5061,5355,5432,5671,5672,6379,7001,8080,8081,8088,8443,8883,8888,9443,9988,15672,50389,61613,61614]
for port in list:
try:
s = socket.socket()
s.settimeout(0.01)
s.connect((ip,port))
print(f'端口:-----{port}可用 ----------- yes')
except:
pass
if __name__ == "__main__":
socket_port_noramal('192.168.31.162')
4-3-4 用Python进行IP扫描
4-1 Ping扫描
python
## 如果要内网渗透,则必须要知道哪些IP地址是存活的,可访问的
## IP地址工作在IP层,ICMP,ARP协议也存在IP信息
## 先使用ping 命令进行IP探测,不过一旦防火墙禁止ICMP协议,那么也会扫不出来
import socket,threading,os
def ping_ip():
for i in range(1,255):
ip = f'192.168.31.{i}'
res = os.popen(f'ping -n 1 -w 100 {ip}').read()
if 'TTL=' in res:
print(f'ip {ip} online')
## 第二种过滤,直接在命令里过滤
# res = os.popen(f'ping -n 1 -w 100 {ip} | findstr TTL=').read()
# if len(res) > 0:
# print(f'ip {ip} online')
ping_ip()
4-2 基于ARP协议
2-1 单线程
bash
import scapy
from scapy.layers.l2 import ARP
from scapy.sendrecv import sr1
## 设置日志级别,不让错误信息打印出来
import logging
logging.getLogger('scary.runtime').setLevel(logging.ERROR)
def scapy_ip():
for i in range(1,255):
ip = f'192.168.31.{i}'
try:
pkg = ARP(psrc='192.168.31.17', pdst=ip)
reply = sr1(pkg, timeout=3, verbose=False)
print(f'IP {ip} online ----- {reply[ARP].hwsrc} ')
except:
pass
if __name__ == '__main__':
scapy_ip()
2-2 多线程
bash
import threading
from scapy.layers.l2 import ARP
from scapy.sendrecv import sr1
import scapy
## 设置日志级别,不让错误信息打印出来
import logging
logging.getLogger('scapy.runtime').setLevel(logging.ERROR)
def scapy_ip(start):
for i in range(start,start+20):
ip = f'192.168.31.{i}'
try:
pkg = ARP(psrc='192.168.31.17', pdst=ip)
reply = sr1(pkg, timeout=3, verbose=False)
print(f'IP {ip} online ----- {reply[ARP].hwsrc} ')
except:
pass
if __name__ == '__main__':
for i in range(1,255,20):
threading.Thread(target=scapy_ip,args=(i,)).start()
2-3 扫描端口
bash
## 基于半链接,SYN / SYN,ACK / RA等标志位来对端口进行判断
## 如果目标端口开放,则 SYN -> SYN,ACK; 如果目标端口未开放,则SYN -> RA
import threading
from scapy.layers.inet import IP, TCP
from scapy.layers.l2 import ARP
from scapy.sendrecv import sr1
import scapy
## 设置日志级别,不让错误信息打印出来
import logging
logging.getLogger('scapy.runtime').setLevel(logging.ERROR)
def scapy_port(ip):
# 通过指定源IP地址,可以进行IP欺骗,进而导致半链接,此列操作也可以用于flags参数定义上
for port in range(20,100):
try:
pkg = IP(src = '192.168.31.17', dst = ip)/TCP(dport=port,flags='S')
reply = sr1(pkg,timeout=1,verbose=False)
res = reply[TCP].flags
if res == 0x12:
print(f"{port} 开放")
except:
pass
scapy_port('192.168.31.162')
五,收集敏感信息
5-1 目录信息收集
5-1-1 7kbscan工具检测
可以用默认字典,也可以指定字典,只要字典足够强大,可以收集到很多目录
比如下面发现了有一个phpmyadmin 这个是后台数据库登录页面,可以使用爆破登录或者弱口令登录等方式尝试进行攻击
除此之外有可能收集到源代码备份目录,git仓库目录,或者一些重要配置文件等重要目录
5-1-2 dirsearch工具
这是一款Python写的工具,需要有Python环境
下面是简单使用收集目录,详细使用方法自己收集一下资料
-u 制动URL地址
-e 指定服务端编程语言
bash
python3 .\dirsearch.py -u 192.168.31.162/pikachu -e php
5-1-3 kali dirbuster工具
六,综合信息收集
6-1 Google hack高级收集
Google搜索引擎之所以强大,关键在于它详细的搜索关键词,以下是几个常用的搜索关键词
Lisp
inurl: ## 用于查找含有该值的所有url网址网页。例:inurl:mail(可找一些免费邮箱)
related::## 找出和该网址类似的网站,比如想知道和amazon.com类似的大型网络书店有哪些时输入amazon.com网址。例:related:amazon.com
intext: ## 只搜索网页部分中包含的文字(也就是忽略了标题,URL等的文字).
filetype: ## 搜索通过文件的后缀或者扩展名来搜索含有这类文件的网页
intitle: ## 标题中存在关键字的网页
allintitle: ## 搜索所有关键字构成标题的网页. 但是推荐不要使用
link: ### 可以得到一个所有包含了某个指定URL的页面列表. 当我们使用link:URL提交查询的时候,Google会返回跟此URL做了链接的网站。例 [link:www.baidu.com],提交这个查询,我们将得到所有跟www.baidu.com这个网站做了链接的网站。(link是个单独的语 法,只能单独使用,且后面不能跟查询关键词,跟能跟URL)
location: ## 当我们提交location进行Google新闻查询的时候,Google仅会返回你当前指定区的跟查询关键词相关的网页。例[ queen location:canada ],提交这个查询,Google会返回加拿大的跟查询关键词"queen"相匹配的网站。
site: ## 搜索含有该域名的网页,google会限制尽在某个网站或者说域下面进行搜索
## 使用site进行站点搜索时,一般常见用法有:
site:ooxx.com filetype:xls # 支持组合搜索
site:xxx.com admin # 一般公司的后台系统都带有admin啊,login啊,内部系统啊之类的关键字
site:xxx.xxx login
site:xxx.xxx system
site:xxx.xxx 管理
site:xxx.xxx 登录
site:xxx.xxx 内部
site:xxx.xxx 系统
site:xxx.xxx 邮件
site:xxx.xxx email
site:xxx.xxx qq
site:xxx.xxx 群
site:xxx.xxx 企鹅
site:xxx.xxx 腾讯
site:ooxx.com
练习
Clojure
intext:管理
fietype:mdb ## 找到含有mdb类型文件的相关站点
site:baidu.com filetype:txt ### 查找百度这个域名下含有txt文件的相关站点
site:baidu.com intext:## 管理
site:baidu.com inurl:login
site:baidu.com intitle:## 后台
# 一般用于查找百度中能够找到的通过php、asp、jsp等语言开发的网站
site:baidu.com filetype:asp
site:baidu.com filetype:php
site:baidu.com filetype:jsp
site:baidu.com inurl:file # 这个一般用来找一些有上传文件动作的网站,之后可以检测是否有上传
文件漏洞。
# 查找某些国家或者地区的通过asp或php等语言开发的站点。
site:tw inurl:asp?id= #查找台湾的相关网站的url中包含asp?id=这些关键字的站点
site:hk inurl:asp?id= #查找香港的相关网站的url中包含asp?id=这些关键字的站点
6-2 FOFA
查询语法自己了解一下,我不多说,可以搜一下一个IP看看
6-3 钟馗之眼
ZoomEye - Cyberspace Search Enginehttps://www.zoomeye.org/
查询语法自己了解一下,我不多说
6-4 ARL灯塔资产侦查系统
6-4-1 Docker 启动
需要有docker环境,可以参考下面这篇文章进行安装和学习docker相关知识
bash
git clone https://github.com/TophantTechnology/ARL
cd ARL/docker/
docker volume create arl_db
docker-compose pull
docker-compose up -d
6-4-2 docker-compose
配置文件启动
bash
mkdir docker_arl
wget -O docker_arl/docker.zip https://github.com/TophantTechnology/ARL/releases/download/v2.5.4/docker.zip
cd docker_arl
unzip -o docker.zip
docker-compose pull
docker volume create arl_db
docker-compose up -d
6-4-3 用压缩包进行安装
(需要压缩包请留言,我可以分享)
bash
unzip ARL-master ## 进行解压缩
cd ARL-master
docker volume create arl_db
cd docker
docker-compose up -d
安装完成以后可以访问了,5003端口
192.168.31.150:5003端口
默认账号密码 admin/arlpass
登录以后可以看到有非常多的功能
比如收集子域名
任务列表------> 添加任务
看到done,然后可以导出报告了
可以自己多研究研究
3-1 任务选项说明
编号 | 选项 | 说明 |
---|---|---|
1 | 任务名称 | 任务名称 |
2 | 任务目标 | 任务目标,支持IP,IP段和域名。可一次性下发多个目标 |
3 | 域名爆破类型 | 对域名爆破字典大小, 大字典:常用2万字典大小。测试:少数几个字典,常用于测试功能是否正常 |
4 | 端口扫描类型 | ALL:全部端口,TOP1000:常用top 1000端口,TOP100:常用top 100端口,测试:少数几个端口 |
5 | 域名爆破 | 是否开启域名爆破 |
6 | DNS字典智能生成 | 根据已有的域名生成字典进行爆破 |
7 | 域名查询插件 | 已支持的数据源为12个,alienvault , certspotter ,crtsh ,fofa ,hunter 等 |
8 | ARL 历史查询 | 对arl历史任务结果进行查询用于本次任务 |
9 | 端口扫描 | 是否开启端口扫描,不开启站点会默认探测80,443 |
10 | 服务识别 | 是否进行服务识别,有可能会被防火墙拦截导致结果为空 |
11 | 操作系统识别 | 是否进行操作系统识别,有可能会被防火墙拦截导致结果为空 |
12 | SSL 证书获取 | 对端口进行SSL 证书获取 |
13 | 跳过CDN | 对判定为CDN的IP, 将不会扫描端口,并认为80,443是端口是开放的 |
14 | 站点识别 | 对站点进行指纹识别 |
15 | 搜索引擎调用 | 利用搜索引擎搜索下发的目标爬取对应的URL和子域名 |
16 | 站点爬虫 | 利用静态爬虫对站点进行爬取对应的URL |
17 | 站点截图 | 对站点首页进行截图 |
18 | 文件泄露 | 对站点进行文件泄露检测,会被WAF拦截 |
19 | Host 碰撞 | 对vhost配置不当进行检测 |
20 | nuclei 调用 | 调用nuclei 默认PoC 对站点进行检测 ,会被WAF拦截,请谨慎使用该功能 |
3-2 配置参数说明
Docker环境配置文件路径 docker/config-docker.yaml
配置 | 说明 |
---|---|
CELERY.BROKER_URL | rabbitmq连接信息 |
MONGO | mongo 连接信息 |
QUERY_PLUGIN | 域名查询插件数据源Token 配置 |
GEOIP | GEOIP 数据库路径信息 |
FOFA | FOFA API 配置信息 |
DINGDING | 钉钉消息推送配置 |
邮箱发送配置 | |
GITHUB.TOKEN | GITHUB 搜索 TOKEN |
ARL.AUTH | 是否开启认证,不开启有安全风险 |
ARL.API_KEY | arl后端API调用key,如果设置了请注意保密 |
ARL.BLACK_IPS | 为了防止SSRF,屏蔽的IP地址或者IP段 |
ARL.PORT_TOP_10 | 自定义端口,对应前端端口测试选项 |
ARL.DOMAIN_DICT | 域名爆破字典,对应前端大字典选项 |
ARL.FILE_LEAK_DICT | 文件泄漏字典 |
ARL.DOMAIN_BRUTE_CONCURRENT | 域名爆破并发数配置 |
ARL.ALT_DNS_CONCURRENT | 组合生成的域名爆破并发数 |
PROXY.HTTP_URL | HTTP代理URL设置 |
3-3 忘记密码重置
当忘记了登录密码,可以执行下面的命令,然后使用 admin/admin123
就可以登录了。
bash
docker exec -ti arl_mongodb mongo -u admin -p admin
use arl
db.user.drop()
db.user.insert({ username: 'admin', password: hex_md5('arlsalt!@#'+'admin123') })
今天的内容差不多就这些,需要工具或者有不懂的可以留言
欢迎技术交流,如果有错误希望能留言指正