# 前言
主动信息收集是指与目标主机进行交互,从而获取所需要的目标信息,常见的主动信息收集包括:敏感目录,端口信息探测,系统版本,CMS 类型,服务器版本等
# ICMP
ICMP 是网络控制报文协议,属于网络层,用于在 IP 主机,路由之间传递控制消息,尝尝被称为 “错误侦测与回报机制”,能够检测网路的连线状态,确保连线的准确性。
# Ping 命令的功能
- 网络状态诊断:向特定的目的主机发送请求报文,测试目的站是否可达以及了解其工作状态
- 探测主句存活:向特定的目的主机发送请求报文,如果目标主机返回应答数据包,则表达主机存活
- 识别系统类别:向特定的目的主机发送请求报文,返回的 TTL 值可以判断目标主机系统类型
- 查看域名对应的 ip 地址:Ping 域名,可返回该域名多对应的 ip 地址信息
# 功能概述
- request time out
- 目标已关机
- 对方与自己不在同一网段内
- 设置了 ICMP 数据包过滤
- Destination host Unreachable
- 网线出了故障
- Source quench received
- 表示对方或者中途服务器繁忙无法回应
- unknown host name
- DNS 配置不正确
- 域名不正确
- no rout to host
- 网卡工作不正常
- transmit fai led,error code
- 10043 网卡驱动错误
TTL 值:Time To Live,表示 DNS 记录在 DNS 服务器上存在的时间,它是 IP 协议包的一个值,告诉路由器该数据何时需要被丢弃
实际上是 Ip 数据包在计算机网络中可以转发的最大跳数 (有 IP 数据包的发送者设置),在整个转发路径上,每经过一个路由都会修改这个 TTL 字段值,具体的做法就是减一,然后再将 IP 包转发出去
通过 ping 返回的 TTL 值的大小可以粗略的判断目标主机的系统类型,默认情况下 Linux 为 64 或 255,win 系列是 128,unix 是 255
# ICMP 主机探测
# Windows-bat 脚本
首先先记录一些 bash 语法
- echo off:关闭其他所有命令的回显
- @:关闭紧跟其后的一条命令的回显
- set/p :在屏幕中输出信息(不换行),并接受用户输入的内容,赋值给 ip
- for /L:for 循环以增量的形式从开始到结束
- % name%:用 % 将要调用的变量包起来就可以调用这个变量
- %% name:表示 name 为 for 里面的循环量
ping 命令使用的帮助信息:
- -n:count 发送的回显请求数
- -l:发送缓冲区大小
- -w:每次等待回复的超时时间(毫秒)
@echo off | |
set /p ip="请输入IP地址段,格式如:"192.168.1." >>> " | |
for /L %%i in (1,1,254) do ( | |
Ping.exe -n 1 -l 16 -w 100 %ip%%%i |findstr TTL= >nul && echo %ip%%%i is up. || echo %ip%%%i is down. | |
) | |
echo 检测ping完成!& pause |
# Linux-shell
还是先记录用到的一些写法
- /bin/bash:利用 /bin/bash 执行 shell 脚本
- read:用于读取用户输入的字符
- for:for 循环以增量形式从开始到结束
#!/bin/bash | |
$ip | |
read -p "please inpur ip :" ip | |
for((i=0;i<=255;i++)); do | |
ping -c 1 -W 0.1 $ip$i > /dev/null && echo "$ip$i is up." || echo "$ip$i is down." | |
done | |
echo "检测ping完成" |
# python 代码实现
#!/usr/bin/python | |
#coding:utf-8 | |
from scapy.all import * | |
from random import randint | |
from optparse import OptionParser | |
def Scan(ip): | |
ip_id = randint(1, 65535) | |
icmp_id = randint(1, 65535) | |
icmp_seq = randint(1, 65535) | |
packet=IP(dst=ip,ttl=64,id=ip_id)/ICMP(id=icmp_id,seq=icmp_seq)/b'rootkit' | |
result = sr1(packet, timeout=1, verbose=False) | |
if result: | |
for rcv in result: | |
scan_ip = rcv[IP].src | |
print(scan_ip + '--->' 'Host is up') | |
else: | |
print(ip + '--->' 'host is down') | |
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("Scan report for " + options.IP + "\n") | |
# 判断是单台主机还是多台主机 | |
# ip 中存在 -, 说明是要扫描多台主机 | |
if '-' in options.IP: | |
# 代码意思举例:192.168.1.1-120 | |
# 通过 '-' 进行分割,把 192.168.1.1 和 120 进行分离 | |
# 把 192.168.1.1 通过 ',' 进行分割,取最后一个数作为 range 函数的 start, 然后把 120+1 作为 range 函数的 stop | |
# 这样循环遍历出需要扫描的 IP 地址 | |
for i in range(int(options.IP.split('-')[0].split('.')[3]), int(options.IP.split('-')[1]) + 1): | |
Scan( | |
options.IP.split('.')[0] + '.' + options.IP.split('.')[1] + '.' + options.IP.split('.')[ | |
2] + '.' + str(i)) | |
time.sleep(0.2) | |
else: | |
Scan(options.IP) | |
print("\nScan finished!....\n") | |
if __name__ == "__main__": | |
try: | |
main() | |
except KeyboardInterrupt: | |
print("interrupted by user, killing all threads...") |
# TCP&UDP
传输层主要负责向两个主机中进程之间的通信提供服务。包括:传输控制协议(TCP)和用户数据报协议(UDP)
# 概述
- TCP
为两台计算机之间提供面向连接、可靠的字节流服务。一台计算机发出的字节流无差错地发往网络上的其他计算机,由于其可靠的传输方式,故传输速度较慢。 - UDP
是一个简单的面向数据报的传输层协议。提供的是非面向连接的、不可靠的数据流传输。UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故传输速度很快。
# TCP 探测存活主机
tcp 报文
- URG:表示紧急指针是否有效;
- ACK:表示确认号是否有效,携带 ACK 标志的数据报文段为确认报文段;
- PSH:表示是带有 PUSH 标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满;
- RST:表示出现严重差错。可能需要重现创建 TCP 连接。还可以用于拒绝非法的报文段和拒绝连接请求;
- SYN:表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步;
- FIN:表示发送方没有数据要传输了,要求释放连接;
利用 TCP 的三次握手原理进行主机存活探测,当向目标主句直接发送 ACK 数据包时,如果目标主机存活就会返回一个 RST 数据包,以终止这个不支持的链接。其工作原理主要以来于目标主句响应数据包的 flags 指端,如果这个 flags 字段有值则表示主机存活,
# UDP 主机存活探测
UDP 是一种利用 IP 提供面向无连接的网络通信服务,UDP 会把应用程序发来的数据,在收到的一刻立即原样发送到网络上,即使在网络传输过程中出现丢包、顺序错乱等情况,UDP 也不会负责重新发送以及纠错。
# ARP
# 概述
地址解析协议 (ARP,Address Resolution Protocol) 根据 IP 地址获取物理地址的一个 TCP/IP 协议。以太网协议规定,同一网段中的一台主机要和另一台主机进行直接通信,必须知道目标主机的 MAC 地址,此时需要 ARP 协议来完成 IP 地址到 MAC 地址的转换。
- PC1 知道 PC3 的 IP 地址为 192.168.1.3,然后 PC1 会检查自己的 APR 缓存表中是否有 PC3 对应的 MAC 地址。
- 如果 PC1 有 PC3 MAC 地址,则进行通信。如果没有,PC1 通过广播方式给网络上的每一台主机发送 ARP 请求,询问 192.168.1.3 对应的 MAC 地址。ARP 请求中同时也包含了 PC1 的 IP 地址和 MAC 地址。以太网内的所有主机都会接收到 ARP 请求,并检查是否与自己的 IP 地址匹配。如果不匹配,则丢弃该 ARP 请求。
- PC3 确定 ARP 请求中的 IP 地址与自己的 IP 地址匹配,则将 ARP 请求中 PC1 的 IP 地址和 MAC 地址添加到本地 ARP 缓存中。PC3 将自己的 MAC 地址发送给 PC1。
- PC1 收到 PC3 的 ARP 响应时,将 PC3 的 IP 地址和 MAC 地址都更新到本地 ARP 缓存表中。
# ARP 主机欺骗
ARP 欺骗 (ARP spoofing) 又称 ARP 毒化,是针对以太网地址解析协议的一种攻击技术。通过 ARP 欺骗可让攻击者获取局域网上的数据包甚至可篡改数据包,并且可让网络上特定计算机或所有计算机无法正常连线。
假设一个网络环境中有三台主机,分别为主机A、B、C。详细信息如下描述:
A的地址为:IP:192.168.10.1 MAC: AA-AA-AA-AA-AA-AA
B的地址为:IP:192.168.10.2 MAC: BB-BB-BB-BB-BB-BB
C的地址为:IP:192.168.10.3 MAC: CC-CC-CC-CC-CC-CC
- B 向 A 发送一个自己伪造的 ARP 应答,而这个应答中的数据发送方的 IP 地址是 192.168.10.3(C 的 IP 地址),MAC 地址是 BB-BB-BB-BB-BB-BB(C 的 MAC 地址本来应该是 CC-CC-CC-CC-CC-CC,这里 C 被伪造了)。
- 当 A 接收到 B 伪造的 ARP 应答,会更新本地的 ARP 缓存(A 被欺骗了),这时 B 就伪装成 C 了。
- 同时,B 同样向 C 发送一个 ARP 应答,应答包中发送方 IP 地址是 192.168.10.1(A 的 IP 地址),MAC 地址是 BB-BB-BB-BB-BB-BB(A 的 MAC 地址本来应该是 AA-AA-AA-AA-AA-AA)。
- 当 C 收到 B 伪造的 ARP 应答,也会更新本地 ARP 缓存(C 也被欺骗了),这时 B 就伪装成了 A。这样主机 A 和 C 都被主机 B 欺骗,A 和 C 之间通讯的数据都经过了 B,主机 B 完全可以知道他们之间传输的任何信息。这就是典型的 ARP 欺骗过程。
# ARP 主机发现的原理
当目标主机与我们处于同一个以太网的时候,可以利用 ARP 协议进行主机发现,该种扫描方式速度较快、识别精准。我们通过利用 Scapy 进行 ARP 主机发现,若主机存活,则会响应我们的 ARP 请求,否则不会响应。
# 端口指纹识别
# 概述
在 Internet 上,各主机间通过 TCP/IP 协议发送和接收数据包,各个数据包根据其目的主机的 ip 地址来进行互联网络中的路由选择,把数据包顺利的传送到目的主机进程分配协议端口。
简单来说,如果把服务器看作一栋房子,那么端口就是可以进出这栋房子的门。真正的房子只有一个或几个门,服务器至多有 65536 个门。不同的端口(门)可以指向不同的服务(房间)。
# 常用端口对应的服务
# 敏感目录探测
# 概述
敏感目录探测属于信息搜集的一部分,善于发现隐藏的信息。例如:备份文件、数据库、网站路径、后门文件、管理后台登陆界面等,对渗透测试具有事半功倍的作用。
通常用于进行敏感目录的常见工具有:
- 御剑目录爆破工具
- Dirsearch
- DirBrute
- 7kbscan-WebPathBrute
# Response 状态码
敏感目录探测作用:
- 探测网站真实目录;
- 探测系统敏感目录;
- 探测 web 服务备份文件;
- 查询网站右后门文件;