二层发现
二层主机发现主要利用的是arp协议,所以只能发现在同一个网段里的主机,不能路由,但是扫描速度快、可靠。
0x01 arping
探测某个主机命令行
用法
arping [-f 收到第一个回复就停止] [-c 指定发送的数量] [-s 源地址] 目的地址
实例
arping -f 192.168.11.129
arping 192.168.11.129 -c 1
对结果进行摘取
arping -f 192.168.11.129 | grep "reply from" | cut -d" " -f 4
还可以将结果输出到文件中
arping -f 192.168.11.129 | grep "reply from" | cut -d" " -f 4 >> arping.txt
利用脚本可以批量扫描一个网段内的所有主机
#!/bin/bash
#!获取网络号,这里默认的掩码为255.255.255.0
network_number=$(ifconfig | grep "inet.*broadcast" | cut -f 1 | cut -c 14-23)
for addr in $(seq 1 254)
do
arping $network_number.$addr -c 1 | grep "reply from" | cut -d" " -f 4
#!或者将结果输出到一个文本文件中
#!arping $network_number.$addr -c 1 | grep "reply from" | cut -d" " -f 4 >> arping.txt
done
扫描结果
利用脚本扫描多个指定的IP地址
#! /bin/bash
file=$1
for addr in $(cat $file)
do
arping -c 1 $addr | grep "reply from" | cut -d" " -f 4
done
结果
0x02 nmap
nmap很强大,在这里只介绍nmap在二层发现中的应用。
ping扫描,不要端口扫描
单个扫描
nmap -sn [ip地址]
批量扫描
nmap -sn 192.168.11.0/24[或192.168.11.1-254]
读取文件中的ip地址来扫描
nmap -iL ip.txt -sn
0x03 netdiscover
- 专用于二层发现
- 无线或交换网络环境
- 主动或被动探测
netdiscover -i eth0 -r 192.168.11.0/24
扫描一个文件
netdiscover -l ip.txt
0x04 scapy
- 作为python库进行调用
- 也可作为单独的工具使用
- 抓包、分析、创建、修改、注入网络流量
构造arp包
- 查看arp包的各个字段
ARP().display()
2. 构造一个默认的arp包
arp=ARP()
- 编辑arp包的字段
比如指定arp报文的目的IP地址
arp.pdst="192.168.11.129"
再次查看结果
4. 发送一个arp包
send(arp)
或者
sr1(arp)
5. 查看回复报文
>>> answer=sr1(arp)
>>> answer.display()
python脚本
- 批量扫描某个网段
#!/usr/bin/python
import logging
import subprocess
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
network_number=subprocess.check_output("ifconfig | grep 'inet.*broadcast' | cut -f 1 | cut -c 14-23",shell=True).strip()
for addr in range(0,254):
answer=sr1(ARP(pdst=network_number+'.'+str(addr)),timeout=1,verbose=0)
if answer == None:
pass
else:
print network_number+'.'+str(addr)
2.扫描文本文件中的IP地址
#! /usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
filename=str(sys.argv[1])
file=open(filename,'r')
for addr in file:
answer=sr1(ARP(pdst=addr.strip()),timeout=0.1,verbose=0)
if answer == None:
pass
else:
print addr.strip()
三层发现
- 协议
- IP
- icmp
- 优点
- 可路由
- 缺点
- 速度比二层慢
- 经常被边界防火墙过滤
命令
ping [ip地址]
ping -r [ip地址]
traceroute [ip地址/域名]
脚本
#!/bin/bash
echo "example: ./ping.sh 192.18.11.0"
network_number=$(echo $1 | cut -d '.' -f 1-3)
for addr in $(seq 1 254):
do
ping -c 1 $network_number.$addr | grep "bytes from" | cut -d ' ' -f 4 |
cut -d ':' -f 1 &
done
四层发现
- 优点
- 可路由切结果可靠
- 被防火墙过滤的可能性较小
- 甚至可以发现所有端口都被过滤的主机
- 缺点
- 基于状态过滤的防火墙可能被过滤
- 全端口扫描速度慢
- 协议
1.TCP、udp
0x01 TCP
tcp的ACK扫描,想目标主机发送一个ack报文,如果回复一个重置报文,则说明目标主机存在。
- 构造ack报文
启动scapy
>>> ip=IP()
>>> ycp=TCP()
>>> tcp=TCP()
>>> r=(ip/tcp)
>>> r[IP].dst="192.168.11.130"
>>> r[TCP].flags="A"
- 查看报文各个字段值
>>> r.display()
- 发送ack报文
>>> a=sr1(r)
Begin emission:
.Finished sending 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
- 查看回复报文结构
>>> a.display()
可以从回复报文中看到是重置报文,说明目的主机192.168.11.130存在。
0x02 UDP
如果目标端口未开放,则会收到目标icmp不可达的回复报文,说明目标知己存在;如果目标主机不存在,则请求报文一去不复返,不会收到任何回复报文。
- 构造udp请求报文
指定目标主机为192.168.11.130
目标主机的未开放端口为8888
>>> ip=IP()
>>> udp=UDP()
>>> r=(ip/udp)
>>> r[IP].dst="192.168.11.130"
>>> r[UDP].dport=8888
查看报文字段值
- 发送udp请求报文
>>> a=sr1(r)
Begin emission:
Finished sending 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
- 查看回复报文
收到一个icmp端口不可达的回复报文,说明目标主机存在
0x03 nmap
- UDP Ping扫描
nmap发送一个空的udp包到目标主机,如果目标主机响应则返回一个icmp端口不可达错误。
nmap 192.168.11.120-140 -PU53333 -sn
- tcp ACK Ping扫描
nmap会发送一个ACK标志的TCP包给目标主机,如果目标主机不是存活状态则不响应该请求;如果目标主机在线则会返回一个RST包。
nmap 192.168.11.120-140 -PA53333 -sn
0x04 hping3
hping3 192.168.11.130 -c 1