从TCP状态机判断DDOS攻击

ttgo2 发表了文章 • 0 个评论 • 363 次浏览 • 2018-08-22 17:01 • 来自相关话题

最近解决同学们提出的问题,大部分都是工作遇到的问题,比如说通过查看系统的网络连接转态来看分析是否有网络攻击DDOS,或者说有人在扫描我们的服务器,其中很大部分对TCP协议的状态机不是很清楚,所以使用Netstat 调试出来的结果看不懂,无法分析,今天我们就简单介绍一下TCP协议的状态机制:
 
#一、TCP协议
TCP 协议是传送层的核心协议,提供了可靠面向连接的协议,分为三次握手和四次断开,在这个过程中TCP有个状态机,记录不同阶段的状态。
二、 握手和断开
这里不着重介绍三次握手和四次断开,只是附加一个图解,这部分详细内容大家自行脑补:参考链接:https://blog.csdn.net/qzcsu/article/details/72861891
2.1 握手协议:




2.2 断开过程




三 TCP的状态机
在协议建立和断开过程,tcp协议一直要维护一个状态,我们称为tcp的状态机。具体情况见下图:




3.1 握手过程状态
[]CLOSED: 表示初始状态。[/][]LISTEN: 侦听端口状态[/][]SYN_RCVD: 表示接受到了SYN报文,时间短暂[/][]SYN_SENT: 表示发送一个SYN的报文[/][]ESTABLISHED:表示连接已经建立了,是一个稳定状态。[/]为了方便理解,简单举个例子,某饭店8点之前是未开业,关门状态(closed 状态),八点之后开门营业,等待客人关顾(listen状态),客户进店点菜(SYS_SEND),老板收到并确认(SYS_RCVD), 客户说没错可以上菜,然后双方进入(Established)状态。3.2  断开过程状态[]FIN WAIT 1:本地的 TCP 实体发送一个 FIN 报文段并等待响应的确认[/][]CLOSE WAIT:服务器收到一个 FIN 报文段,它确认客户端的请求发回一个 ACK 报文段[/][]FIN WAIT 2 :客户端收到确认 ACK 报文段,就转移到 FIN WAIT 2 状态[/][]CLOSED:服务器收到最后一个确认 ACK 报文段,其 TCP 实体便释放该连接,并删除连接记录[/]
为了方便理解:可以简单理解为:客人吃饭要离开,喊老板结账(fin wait1), 老板说你等一下我找你钱(closeing),客户收到检查是否正确(fin wait2),确认无误然后彼此断开(closed)
四, 半打开和半关闭
DDOS网络攻击的方式很多,有应用层ddos也有网络层的,本文只讨论网络层形成的ddos攻击类型,上文我们讲述状态机,就非常好理解了,大量的半打开的链接,占用了大量的网络带宽,从而达到了DOS的目的。
4.1 半打开
发生在TCP3次握手中。
如果A向B发起TCP请求,B也按照正常情况进行响应了,但是A不进行第3次握手,这就是半连接
4.2半关闭
当一方关闭发送通道后,仍可接受另一方发送过来的数据,这样的情况叫“半关闭”。(拆除TCP连接是:你关闭你的发送通道,我关闭我的发送通道)。
五、Netstat DOS检测
netstat -na
显示所有连接到服务器的活跃的网络连接
netstat -an | grep :80 | sort
只显示连接到80段口的活跃的网络连接,80是http端口,这对于web服务器非常有用,并且对结果排序.对于你从许多的连接中找出单个发动洪水攻击IP非常有用
netstat -n -p|grep SYN_REC | wc -l
这个命令对于在服务器上找出活跃的SYNC_REC非常有用,数量应该很低,最好少于5.
在dos攻击和邮件炸弹,这个数字可能非常高.然而值通常依赖于系统,所以高的值可能平分给另外的服务器.
netstat -n -p | grep SYN_REC | sort -u
列出所有包含的IP地址而不仅仅是计数.
netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
列出所有不同的IP地址节点发送SYN_REC的连接状态
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
使用netstat命令来计算每个IP地址对服务器的连接数量
netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
列出使用tcp和udp连接到服务器的数目
netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
检查ESTABLISHED连接而不是所有连接,这可以每个ip的连接数
netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
显示并且列出连接到80端口IP地址和连接数.80被用来作为HTTP 查看全部
最近解决同学们提出的问题,大部分都是工作遇到的问题,比如说通过查看系统的网络连接转态来看分析是否有网络攻击DDOS,或者说有人在扫描我们的服务器,其中很大部分对TCP协议的状态机不是很清楚,所以使用Netstat 调试出来的结果看不懂,无法分析,今天我们就简单介绍一下TCP协议的状态机制:
 
#一、TCP协议
TCP 协议是传送层的核心协议,提供了可靠面向连接的协议,分为三次握手和四次断开,在这个过程中TCP有个状态机,记录不同阶段的状态。
二、 握手和断开
这里不着重介绍三次握手和四次断开,只是附加一个图解,这部分详细内容大家自行脑补:参考链接:https://blog.csdn.net/qzcsu/article/details/72861891
2.1 握手协议:
握手.png

2.2 断开过程
20170607205756255.gif

三 TCP的状态机
在协议建立和断开过程,tcp协议一直要维护一个状态,我们称为tcp的状态机。具体情况见下图:
20160703002557770_(1).png

3.1 握手过程状态
    []CLOSED: 表示初始状态。[/][]LISTEN: 侦听端口状态[/][]SYN_RCVD: 表示接受到了SYN报文,时间短暂[/][]SYN_SENT: 表示发送一个SYN的报文[/][]ESTABLISHED:表示连接已经建立了,是一个稳定状态。[/]
为了方便理解,简单举个例子,某饭店8点之前是未开业,关门状态(closed 状态),八点之后开门营业,等待客人关顾(listen状态),客户进店点菜(SYS_SEND),老板收到并确认(SYS_RCVD), 客户说没错可以上菜,然后双方进入(Established)状态。3.2  断开过程状态
    []FIN WAIT 1:本地的 TCP 实体发送一个 FIN 报文段并等待响应的确认[/][]CLOSE WAIT:服务器收到一个 FIN 报文段,它确认客户端的请求发回一个 ACK 报文段[/][]FIN WAIT 2 :客户端收到确认 ACK 报文段,就转移到 FIN WAIT 2 状态[/][]CLOSED:服务器收到最后一个确认 ACK 报文段,其 TCP 实体便释放该连接,并删除连接记录[/]

为了方便理解:可以简单理解为:客人吃饭要离开,喊老板结账(fin wait1), 老板说你等一下我找你钱(closeing),客户收到检查是否正确(fin wait2),确认无误然后彼此断开(closed)
四, 半打开和半关闭
DDOS网络攻击的方式很多,有应用层ddos也有网络层的,本文只讨论网络层形成的ddos攻击类型,上文我们讲述状态机,就非常好理解了,大量的半打开的链接,占用了大量的网络带宽,从而达到了DOS的目的。
4.1 半打开
发生在TCP3次握手中。
如果A向B发起TCP请求,B也按照正常情况进行响应了,但是A不进行第3次握手,这就是半连接
4.2半关闭
当一方关闭发送通道后,仍可接受另一方发送过来的数据,这样的情况叫“半关闭”。(拆除TCP连接是:你关闭你的发送通道,我关闭我的发送通道)。
五、Netstat DOS检测
netstat -na
显示所有连接到服务器的活跃的网络连接
netstat -an | grep :80 | sort
只显示连接到80段口的活跃的网络连接,80是http端口,这对于web服务器非常有用,并且对结果排序.对于你从许多的连接中找出单个发动洪水攻击IP非常有用
netstat -n -p|grep SYN_REC | wc -l
这个命令对于在服务器上找出活跃的SYNC_REC非常有用,数量应该很低,最好少于5.
在dos攻击和邮件炸弹,这个数字可能非常高.然而值通常依赖于系统,所以高的值可能平分给另外的服务器.
netstat -n -p | grep SYN_REC | sort -u
列出所有包含的IP地址而不仅仅是计数.
netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
列出所有不同的IP地址节点发送SYN_REC的连接状态
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
使用netstat命令来计算每个IP地址对服务器的连接数量
netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
列出使用tcp和udp连接到服务器的数目
netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
检查ESTABLISHED连接而不是所有连接,这可以每个ip的连接数
netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
显示并且列出连接到80端口IP地址和连接数.80被用来作为HTTP

【Kali Linux网络扫描秘籍系列】使用 Scapy 探索第四层

kakaxi 发表了文章 • 0 个评论 • 181 次浏览 • 2018-06-19 18:19 • 来自相关话题

Scapy 四层发现简介:多种不同方式可以用于在第四层执行目标发现。可以使用用户数据报协议(UDP)或传输控制协议(TCP)来执行扫描。 Scapy 可以用于使用这两种传输协议来制作自定义请求,并且可以与 Python 脚本结合使用以开发实用的发现工具。 此秘籍演示了如何使用 Scapy 执行 TCP 和 UDP 的第四层发现。
 
准备:
使用 Scapy 执行第四层发现不需要实验环境,因为 Internet 上的许多系统都将回复TCP 和 UDP 请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 TCP/UDP 请求的系统。
 
操作步骤:
为了验证从活动主机接收到的 RST 响应,我们可以使用 Scapy 向已知的活动主机发送 TCP ACK 数据包。 在提供的示例中,ACK 数据包将发送到 TCP 目标端口80。此端口通常用于运行 HTTP Web 服务。 演示中使用的主机当前拥有在此端口上运行的 Apache 服务。 为此,我们需要构建我们的请求的每个层级。 要构建的第一层是IP层。 看看下面的命令:
root@kali:~# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.3.3)
[quote]>> i=IP()
>>> i.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= hopopt
chksum= None
src= 127.0.0.1
dst= 127.0.0.1
\options\[/quote]

[quote]>> i.dst="172.16.155.1"
>>> i.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= hopopt
chksum= None
src= 172.16.155.129
dst= 172.16.155.1
\options\这里,我们将 i 变量初始化为 IP 对象,然后重新配置标准配置,将目标地址设置为目标服务器的 IP 地址。 请注意,当为目标地址提供除回送地址之外的任何 IP地址时,源 IP 地址会自动更新。 我们需要构建的下一层是我们的 TCP 层。 这可以在以下命令中看到:
>>> request=(i/t)
>>> request.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= tcp
chksum= None
src= 172.16.155.129
dst= 172.16.155.1
\options\
[size=16]#[ TCP ][/size]#
sport= ftp_data
dport= http
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= A
window= 8192
chksum= None
urgptr= 0
options= {}这里,我们将整个请求栈赋给 request 变量。 现在,可以使用 send 和 recieve 函数跨线路发送请求,然后可以评估响应来确定目标地址的状态:
>>> response.display()
[size=16]#[ IP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 45867
flags=
frag= 0L
ttl= 64
proto= tcp
chksum= 0x3901
src= 172.16.155.1
dst= 172.16.155.129
\options\
[size=16]#[ TCP ][/size]#
sport= http
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0x20d9
urgptr= 0
options= {}
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00'
请注意,远程系统使用设置了 RST 标志的 TCP 数据包进行响应。 这由分配给 flags 属性的 R 值表示。 通过直接调用函数,可以将堆叠请求和发送和接收响应的整个过程压缩为单个命令:
>>> response=sr1(IP(dst="172.16.155.1")/TCP(flags='A'))
.Begin emission:
....................................Finished to send 1 packets.
..*
Received 40 packets, got 1 answers, remaining 0 packets
>>> response.display()
[size=16]#[ IP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 3286
flags=
frag= 0L
ttl= 64
proto= tcp
chksum= 0xdf56
src= 172.16.155.1
dst= 172.16.155.129
\options\
[size=16]#[ TCP ][/size]#
sport= http
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0x20d9
urgptr= 0
options= {}
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00'现在我们已经确定了与发送到活动主机上的打开端口的 ACK 数据包相关联的响应,让我们尝试向活动系统上的已关闭端口发送类似的请求,并确定响应是否有任何变化:
response=sr1(IP(dst="172.16.155.1")/TCP(dport=1111,flags='A'))
Begin emission:
.........................................................Finished to send 1 packets.
.*
Received 59 packets, got 1 answers, remaining 0 packets
>>> response.display()
[size=16]#[ IP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 33630
flags=
frag= 0L
ttl= 64
proto= tcp
chksum= 0x68ce
src= 172.16.155.1
dst= 172.16.155.129
\options\
[size=16]#[ TCP ][/size]#
sport= 1111
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0x1cd2
urgptr= 0
options= {}
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00'在此请求中,目标 TCP 端口已从默认端口 80 更改为端口 1111(未在其上运行服务的端口)。 请注意,从活动系统上的打开端口和关闭端口返回的响应是相同的。无论这是否是在扫描端口上主动运行的服务,活动系统都会返回 RST 响应。 另外,应当注意,如果将类似的扫描发送到与活动系统无关的 IP 地址,则不会返回响应。 这可以通过将请求中的目标 IP 地址修改为与实际系统无关的 IP 地址来验证:
>>> response=sr1(IP(dst="172.16.155.100")/TCP(dport=80,flags="A"),timeout=1)
Begin emission:
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Received 2320 packets, got 0 answers, remaining 1 packets因此,通过查看,我们发现对于发送到活动主机任何端口的 ACK 数据包,无论端口状态如何,都将返回 RST 数据包,但如果没有活动主机与之相关,则不会从 IP接收到响应。 这是一个好消息,因为它意味着,我们可以通过只与每个系统上的单个端口进行交互,在大量系统上执行发现扫描。 将 Scapy 与 Python 结合使用,我们可以快速循环访问 / 24 网络范围中的所有地址,并向每个系统上的仅一个TCP 端口发送单个 ACK 数据包。 通过评估每个主机返回的响应,我们可以轻易输出活动 IP 地址列表。
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *[/quote]

if len(sys.argv)!=2:
print("Usage - ./ACK_Ping.py [/24 network address]")
print("Example - ./ACK_Ping.py 172.16.155.0")
print("Example will perform a TCP ACK Ping scan of the 172.16.155.0/24 range")
sys.exit()

address=str(sys.argv[1])
prefix=address.split('.')[0]+'.'+address.split('.')[1]+'.'+address.split('.')[2]+'.'

for addr in range(1,254):
response=sr1(IP(dst=prefix+str(addr))/TCP(dport=80,flags="A"),timeout=1,verbose=0)
try:
if int(response[TCP].flags)==4:
print(prefix+str(addr))
except:
pass
提供的示例脚本相当简单。 当循环遍历 IP 地址中的最后一个八位字节的每个可能值时,ACK 封包被发送到 TCP 端口 80,并且评估响应来确定响应中的 TCP 标志的整数转换是否具有值 4 (与单独 RST 标志相关的值)。 如果数据包具有 RST标志,则脚本将输出返回响应的系统的 IP 地址。 如果没有收到响应,Python 无法测试响应变量的值,因为没有为其赋任何值。 因此,如果没有返回响应,将发生异常。 如果返回异常,脚本将会跳过。 生成的输出是活动目标 IP 地址的列表。 此脚本可以使用句号和斜杠,后跟可执行脚本的名称执行:
 
root@kali:~# ./ACK_Ping.py
Usage - ./ACK_Ping.py [/24 network address]
Example - ./ACK_Ping.py 172.16.155.0
Example will perform a TCP ACK Ping scan of the 172.16.155.0/24 range
root@kali:~# ./ACK_Ping.py 172.16.155.0
172.16.155.1
172.16.155.2类似的发现方法可以用于使用 UDP 协议来执行第四层发现。 为了确定我们是否可以使用 UDP 协议发现主机,我们需要确定如何从任何运行 UDP 的活动主机触发响应,而不管系统是否有在 UDP 端口上运行服务。 为了尝试这个,我们将首先在Scapy 中构建我们的请求栈:
oot@kali:~# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.3.3)
[quote]>> i=IP()
>>> i.dst="172.16.155.1"
>>> u=UDP()
>>>
>>> request=(i/u)
>>> request.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= udp
chksum= None
src= 172.16.155.129
dst= 172.16.155.1
\options\
[size=16]#[ UDP ][/size]#
sport= domain
dport= domain
len= None
chksum= None注意,UDP对象的默认源和目标端口是域名系统(DNS)。 这是一种常用的服务,可用于将域名解析为 IP 地址。 发送请求是因为它是有助于判断,IP 地址是否与活动主机相关联。 发送此请求的示例可以在以下命令中看到:
>>> reply=sr1(request,timeout=1,verbose=1)
Begin emission:
Finished to send 1 packets.[/quote]

Received 4 packets, got 1 answers, remaining 0 packets尽管与目标 IP 地址相关的主机是活动的,但我们没有收到响应。 讽刺的是,缺乏响应实际上是由于 DNS 服务正在目标系统上使用。这是因为活动服务通常配置为仅响应包含特定内容的请求。 你可能会自然想到,有时可以尝试通过探测未运行服务的 UDP 端口来高效识别主机,假设 ICMP 流量未被防火墙阻止。 现在,我们尝试将同一请求发送到不在使用的不同 UDP 端口:
>>> u.dport=123
[quote]>> request=(i/u)
>>> reply=sr1(request,timeout=1,verbose=1)
Begin emission:
Finished to send 1 packets.[/quote]

Received 4 packets, got 1 answers, remaining 0 packets
[quote]>> reply.display()
[size=16]#[ IP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 56
id= 9834
flags=
frag= 0L
ttl= 64
proto= icmp
chksum= 0xc5b7
src= 172.16.155.1
dst= 172.16.155.129
\options\
[size=16]#[ ICMP ][/size]#
type= dest-unreach
code= port-unreachable
chksum= 0xfc44
reserved= 0
length= 0
nexthopmtu= 0
[size=16]#[ IP in ICMP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 28
id= 1
flags=
frag= 0L
ttl= 64
proto= udp
chksum= 0xec2c
src= 172.16.155.129
dst= 172.16.155.1
\options\
[size=16]#[ UDP in ICMP ][/size]#
sport= domain
dport= ntp
len= 8
chksum= 0x0
通过将请求目标更改为端口 123,然后重新发送它,我们现在会收到一个响应,表明目标端口不可达。如果检查此响应的源 IP 地址,你可以看到它是从发送原始请求的主机发送的。此响应随后表明原始目标 IP 地址处的主机处于活动状态。不幸的是,在这些情况下并不总是返回响应。这种技术的效率在很大程度上取决于你正在探测的系统及其配置。正因为如此,UDP 发现通常比 TCP 发现更难执行。它从来不会像发送带有单个标志的 TCP 数据包那么简单。在服务确实存在的情况下,通常需要服务特定的探测。幸运的是,有各种相当复杂的 UDP 扫描工具,可以使用各种 UDP 请求和服务特定的探针,来确定活动主机是否关联了任何给定的IP地址。
 
工作原理:
这里提供的示例使用 UDP 和 TCP 发现方式。 我们能够使用 Scapy 来制作自定义请求,来使用这些协议识别活动主机。 在 TCP 的情况下,我们构造了自定义的ACK 封包并将其发送到每个目标系统上的任意端口。 在接收到 RST 应答的情况下,系统被识别为活动的。 或者,空的 UDP 请求被发送到任意端口,来尝试请求ICMP 端口不可达响应。 响应可用作活动系统的标识。 然后这些技术中的每一个都可以在 Python 脚本中使用,来对多个主机或地址范围执行发现。[/quote] 查看全部
Scapy 四层发现简介:多种不同方式可以用于在第四层执行目标发现。可以使用用户数据报协议(UDP)或传输控制协议(TCP)来执行扫描。 Scapy 可以用于使用这两种传输协议来制作自定义请求,并且可以与 Python 脚本结合使用以开发实用的发现工具。 此秘籍演示了如何使用 Scapy 执行 TCP 和 UDP 的第四层发现。
 
准备:
使用 Scapy 执行第四层发现不需要实验环境,因为 Internet 上的许多系统都将回复TCP 和 UDP 请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 TCP/UDP 请求的系统。
 
操作步骤:
为了验证从活动主机接收到的 RST 响应,我们可以使用 Scapy 向已知的活动主机发送 TCP ACK 数据包。 在提供的示例中,ACK 数据包将发送到 TCP 目标端口80。此端口通常用于运行 HTTP Web 服务。 演示中使用的主机当前拥有在此端口上运行的 Apache 服务。 为此,我们需要构建我们的请求的每个层级。 要构建的第一层是IP层。 看看下面的命令:
root@kali:~# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.3.3)
[quote]>> i=IP()
>>> i.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= hopopt
chksum= None
src= 127.0.0.1
dst= 127.0.0.1
\options\[/quote]

[quote]>> i.dst="172.16.155.1"
>>> i.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= hopopt
chksum= None
src= 172.16.155.129
dst= 172.16.155.1
\options\
这里,我们将 i 变量初始化为 IP 对象,然后重新配置标准配置,将目标地址设置为目标服务器的 IP 地址。 请注意,当为目标地址提供除回送地址之外的任何 IP地址时,源 IP 地址会自动更新。 我们需要构建的下一层是我们的 TCP 层。 这可以在以下命令中看到:
>>> request=(i/t)
>>> request.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= tcp
chksum= None
src= 172.16.155.129
dst= 172.16.155.1
\options\
[size=16]#[ TCP ][/size]#
sport= ftp_data
dport= http
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= A
window= 8192
chksum= None
urgptr= 0
options= {}
这里,我们将整个请求栈赋给 request 变量。 现在,可以使用 send 和 recieve 函数跨线路发送请求,然后可以评估响应来确定目标地址的状态:
>>> response.display()
[size=16]#[ IP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 45867
flags=
frag= 0L
ttl= 64
proto= tcp
chksum= 0x3901
src= 172.16.155.1
dst= 172.16.155.129
\options\
[size=16]#[ TCP ][/size]#
sport= http
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0x20d9
urgptr= 0
options= {}
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00'
请注意,远程系统使用设置了 RST 标志的 TCP 数据包进行响应。 这由分配给 flags 属性的 R 值表示。 通过直接调用函数,可以将堆叠请求和发送和接收响应的整个过程压缩为单个命令:
>>> response=sr1(IP(dst="172.16.155.1")/TCP(flags='A'))
.Begin emission:
....................................Finished to send 1 packets.
..*
Received 40 packets, got 1 answers, remaining 0 packets
>>> response.display()
[size=16]#[ IP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 3286
flags=
frag= 0L
ttl= 64
proto= tcp
chksum= 0xdf56
src= 172.16.155.1
dst= 172.16.155.129
\options\
[size=16]#[ TCP ][/size]#
sport= http
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0x20d9
urgptr= 0
options= {}
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00'
现在我们已经确定了与发送到活动主机上的打开端口的 ACK 数据包相关联的响应,让我们尝试向活动系统上的已关闭端口发送类似的请求,并确定响应是否有任何变化:
response=sr1(IP(dst="172.16.155.1")/TCP(dport=1111,flags='A'))
Begin emission:
.........................................................Finished to send 1 packets.
.*
Received 59 packets, got 1 answers, remaining 0 packets
>>> response.display()
[size=16]#[ IP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 33630
flags=
frag= 0L
ttl= 64
proto= tcp
chksum= 0x68ce
src= 172.16.155.1
dst= 172.16.155.129
\options\
[size=16]#[ TCP ][/size]#
sport= 1111
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0x1cd2
urgptr= 0
options= {}
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00'
在此请求中,目标 TCP 端口已从默认端口 80 更改为端口 1111(未在其上运行服务的端口)。 请注意,从活动系统上的打开端口和关闭端口返回的响应是相同的。无论这是否是在扫描端口上主动运行的服务,活动系统都会返回 RST 响应。 另外,应当注意,如果将类似的扫描发送到与活动系统无关的 IP 地址,则不会返回响应。 这可以通过将请求中的目标 IP 地址修改为与实际系统无关的 IP 地址来验证:
>>> response=sr1(IP(dst="172.16.155.100")/TCP(dport=80,flags="A"),timeout=1)
Begin emission:
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Received 2320 packets, got 0 answers, remaining 1 packets
因此,通过查看,我们发现对于发送到活动主机任何端口的 ACK 数据包,无论端口状态如何,都将返回 RST 数据包,但如果没有活动主机与之相关,则不会从 IP接收到响应。 这是一个好消息,因为它意味着,我们可以通过只与每个系统上的单个端口进行交互,在大量系统上执行发现扫描。 将 Scapy 与 Python 结合使用,我们可以快速循环访问 / 24 网络范围中的所有地址,并向每个系统上的仅一个TCP 端口发送单个 ACK 数据包。 通过评估每个主机返回的响应,我们可以轻易输出活动 IP 地址列表。
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *[/quote]

if len(sys.argv)!=2:
print("Usage - ./ACK_Ping.py [/24 network address]")
print("Example - ./ACK_Ping.py 172.16.155.0")
print("Example will perform a TCP ACK Ping scan of the 172.16.155.0/24 range")
sys.exit()

address=str(sys.argv[1])
prefix=address.split('.')[0]+'.'+address.split('.')[1]+'.'+address.split('.')[2]+'.'

for addr in range(1,254):
response=sr1(IP(dst=prefix+str(addr))/TCP(dport=80,flags="A"),timeout=1,verbose=0)
try:
if int(response[TCP].flags)==4:
print(prefix+str(addr))
except:
pass

提供的示例脚本相当简单。 当循环遍历 IP 地址中的最后一个八位字节的每个可能值时,ACK 封包被发送到 TCP 端口 80,并且评估响应来确定响应中的 TCP 标志的整数转换是否具有值 4 (与单独 RST 标志相关的值)。 如果数据包具有 RST标志,则脚本将输出返回响应的系统的 IP 地址。 如果没有收到响应,Python 无法测试响应变量的值,因为没有为其赋任何值。 因此,如果没有返回响应,将发生异常。 如果返回异常,脚本将会跳过。 生成的输出是活动目标 IP 地址的列表。 此脚本可以使用句号和斜杠,后跟可执行脚本的名称执行:
 
root@kali:~# ./ACK_Ping.py 
Usage - ./ACK_Ping.py [/24 network address]
Example - ./ACK_Ping.py 172.16.155.0
Example will perform a TCP ACK Ping scan of the 172.16.155.0/24 range
root@kali:~# ./ACK_Ping.py 172.16.155.0
172.16.155.1
172.16.155.2
类似的发现方法可以用于使用 UDP 协议来执行第四层发现。 为了确定我们是否可以使用 UDP 协议发现主机,我们需要确定如何从任何运行 UDP 的活动主机触发响应,而不管系统是否有在 UDP 端口上运行服务。 为了尝试这个,我们将首先在Scapy 中构建我们的请求栈:
oot@kali:~# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.3.3)
[quote]>> i=IP()
>>> i.dst="172.16.155.1"
>>> u=UDP()
>>>
>>> request=(i/u)
>>> request.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= udp
chksum= None
src= 172.16.155.129
dst= 172.16.155.1
\options\
[size=16]#[ UDP ][/size]#
sport= domain
dport= domain
len= None
chksum= None
注意,UDP对象的默认源和目标端口是域名系统(DNS)。 这是一种常用的服务,可用于将域名解析为 IP 地址。 发送请求是因为它是有助于判断,IP 地址是否与活动主机相关联。 发送此请求的示例可以在以下命令中看到:
>>> reply=sr1(request,timeout=1,verbose=1)
Begin emission:
Finished to send 1 packets.[/quote]

Received 4 packets, got 1 answers, remaining 0 packets
尽管与目标 IP 地址相关的主机是活动的,但我们没有收到响应。 讽刺的是,缺乏响应实际上是由于 DNS 服务正在目标系统上使用。这是因为活动服务通常配置为仅响应包含特定内容的请求。 你可能会自然想到,有时可以尝试通过探测未运行服务的 UDP 端口来高效识别主机,假设 ICMP 流量未被防火墙阻止。 现在,我们尝试将同一请求发送到不在使用的不同 UDP 端口:
>>> u.dport=123
[quote]>> request=(i/u)
>>> reply=sr1(request,timeout=1,verbose=1)
Begin emission:
Finished to send 1 packets.[/quote]

Received 4 packets, got 1 answers, remaining 0 packets
[quote]>> reply.display()
[size=16]#[ IP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 56
id= 9834
flags=
frag= 0L
ttl= 64
proto= icmp
chksum= 0xc5b7
src= 172.16.155.1
dst= 172.16.155.129
\options\
[size=16]#[ ICMP ][/size]#
type= dest-unreach
code= port-unreachable
chksum= 0xfc44
reserved= 0
length= 0
nexthopmtu= 0
[size=16]#[ IP in ICMP ][/size]#
version= 4L
ihl= 5L
tos= 0x0
len= 28
id= 1
flags=
frag= 0L
ttl= 64
proto= udp
chksum= 0xec2c
src= 172.16.155.129
dst= 172.16.155.1
\options\
[size=16]#[ UDP in ICMP ][/size]#
sport= domain
dport= ntp
len= 8
chksum= 0x0

通过将请求目标更改为端口 123,然后重新发送它,我们现在会收到一个响应,表明目标端口不可达。如果检查此响应的源 IP 地址,你可以看到它是从发送原始请求的主机发送的。此响应随后表明原始目标 IP 地址处的主机处于活动状态。不幸的是,在这些情况下并不总是返回响应。这种技术的效率在很大程度上取决于你正在探测的系统及其配置。正因为如此,UDP 发现通常比 TCP 发现更难执行。它从来不会像发送带有单个标志的 TCP 数据包那么简单。在服务确实存在的情况下,通常需要服务特定的探测。幸运的是,有各种相当复杂的 UDP 扫描工具,可以使用各种 UDP 请求和服务特定的探针,来确定活动主机是否关联了任何给定的IP地址。
 
工作原理:
这里提供的示例使用 UDP 和 TCP 发现方式。 我们能够使用 Scapy 来制作自定义请求,来使用这些协议识别活动主机。 在 TCP 的情况下,我们构造了自定义的ACK 封包并将其发送到每个目标系统上的任意端口。 在接收到 RST 应答的情况下,系统被识别为活动的。 或者,空的 UDP 请求被发送到任意端口,来尝试请求ICMP 端口不可达响应。 响应可用作活动系统的标识。 然后这些技术中的每一个都可以在 Python 脚本中使用,来对多个主机或地址范围执行发现。[/quote]

【Kali Linux网络扫描秘籍系列】使用 hping3 探索第三层

kakaxi 发表了文章 • 0 个评论 • 160 次浏览 • 2018-06-14 13:06 • 来自相关话题

hping3简介:

hping3 可以用于以多种不同方式执行主机发现的更多功能。 它比 fping 更强大,因为它可以执行多种不同类型的发现技术,但作为扫描工具不太有用,因为它只能用于定位单个主机。 然而,这个缺点可以使用 bash 脚本克服。 该秘籍演示了如何使用 hping3 在远程主机上执行第3层发现。

准备:

使用 hping3 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复 ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 ICMP 请求的系统。

hping3 是一个非常强大的发现工具,具有大量可操作的选项和模式。它能够在第3层和第4层上执行发现。为了使用 hping3 对单个主机地址执行基本的 ICMP 发现, 只需要将要测试的 IP 地址和所需的 ICMP 扫描模式传递给它:
root@kali:~# hping3 8.8.8.8 --icmp
HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes
len=46 ip=8.8.8.8 ttl=128 id=61632 icmp_seq=0 rtt=59.6 ms
len=46 ip=8.8.8.8 ttl=128 id=62130 icmp_seq=1 rtt=59.3 ms
len=46 ip=8.8.8.8 ttl=128 id=62209 icmp_seq=2 rtt=57.6 ms
len=46 ip=8.8.8.8 ttl=128 id=62432 icmp_seq=3 rtt=56.4 ms
len=46 ip=8.8.8.8 ttl=128 id=62642 icmp_seq=4 rtt=55.6 ms
^C
--- 8.8.8.8 hping statistic ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 55.6/57.7/59.6 ms
提供的演示使用 Ctrl + C 停止进程。与标准 ping 工具类似, hping3 ICMP模式将无限继续,除非在初始命令中指定了特定数量的数据包。 为了定义要发送的尝试次数,应包含 -c 选项和一个表示所需尝试次数的整数值:
root@kali:~# hping3 8.8.8.8 --icmp -c 2
HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes
len=46 ip=8.8.8.8 ttl=128 id=64399 icmp_seq=0 rtt=58.8 ms
len=46 ip=8.8.8.8 ttl=128 id=65153 icmp_seq=1 rtt=54.7 ms

--- 8.8.8.8 hping statistic ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 54.7/56.7/58.8 ms
虽然 hping3 默认情况下不支持扫描多个系统,但可以使用 bash 脚本轻易编写脚本。 为了做到这一点,我们必须首先确定与活动地址相关联的输出,以及与非响应地址相关联的输出之间的区别。 为此,我们应该在未分配主机的 IP 地址上使用相同的命令:
root@kali:~# hping3 8.8.8.100 --icmp -c 2
HPING 8.8.8.100 (eth0 8.8.8.100): icmp mode set, 28 headers + 0 data bytes

--- 8.8.8.100 hping statistic ---
2 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
尽管产生了期望的结果,在这种情况下, grep 函数似乎不能有效用于输出。 由于 hping3 中的输出显示处理,它难以通过管道传递到 grep 函数,并只提取所需的行,我们可以尝试通过其他方式解决这个问题。 具体来说,我们将尝试确定输出是否可以重定向到一个文件,然后我们可以直接从文件中 grep 。 为此,我们尝试将先前使用的两个命令的输出传递给 handle.txt 文件:
root@kali:~# hping3 8.8.8.8 --icmp -c 1 >> handle.txt

--- 8.8.8.8 hping statistic ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 55.6/55.6/55.6 ms
root@kali:~# hping3 8.8.8.100 --icmp -c 1 >> handle.txt

--- 8.8.8.100 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
root@kali:~# cat handle.txt
HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes
len=46 ip=8.8.8.8 ttl=128 id=35997 icmp_seq=0 rtt=55.6 ms
HPING 8.8.8.100 (eth0 8.8.8.100): icmp mode set, 28 headers + 0 data bytes
虽然这种尝试并不完全成功,因为输出没有完全重定向到文件,我们可以看到通过读取文件中的输出,足以创建一个有效的脚本。 具体来说,我们能够重定向一个唯一的行,该行只与成功的 ping 尝试相关联,并且包含该行中相应的 IP 地址。 要验证此解决方法是否可行,我们需要尝试循环访问 / 24 范围中的每个地址,然后将结果传递到 handle.txt 文件:
root@kali:~# cat handle.txt
HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes
len=46 ip=8.8.8.8 ttl=128 id=35997 icmp_seq=0 rtt=55.6 ms
HPING 8.8.8.100 (eth0 8.8.8.100): icmp mode set, 28 headers + 0 data bytes
root@kali:~# for addr in $(seq 1 254);do hping3 8.8.8.$addr --icmp -c 1 >> handle.txt & done
[1] 13477
[2] 13478
[3] 13479
[4] 13480
[5] 13481
[6] 13482
[7] 13483
[8] 13484
[9] 13485
[10] 13486
[11] 13487
[12] 13488
[13] 13489
[14] 13490
[15] 13491
[16] 13492
[17] 13493
[18] 13494
[19] 13495
[20] 13496
[21] 13497
[22] 13498
[23] 13499
[24] 13500
[25] 13501
[26] 13502

--- 8.8.8.8 hping statistic ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 71.5/71.5/71.5 ms
[27] 13503
[28] 13504
[29] 13505
[30] 13506
[31] 13507
[32] 13508
[33] 13509
[34] 13510
[35] 13511
[36] 13512
[37] 13513
[38] 13514
[39] 13515
[40] 13516

--- 8.8.8.1 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.3 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.2 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.4 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
[b][i] {TRUNCATED} [/b][/i]
通过这样做,仍然有大量的输出(提供的输出为了方便而被截断)包含未重定向到文件的输出。 但是,以下脚本的成功不取决于初始循环的过多输出,而是取决于从输出文件中提取必要信息的能力:
root@kali:~# grep len handle.txt | cut -d ' ' -f 2
ip=8.8.8.8
root@kali:~# grep len handle.txt | cut -d ' ' -f 2 | cut -d '=' -f 2
8.8.8.8
root@kali:~# grep len handle.txt
len=46 ip=8.8.8.8 ttl=128 id=36000 icmp_seq=0 rtt=60.5 ms
root@kali:~# grep len handle.txt | cut -d ' ' -f 2
ip=8.8.8.8
root@kali:~# grep len handle.txt | cut -d ' ' -f 2 | cut -d '=' -f 2
8.8.8.8
通过将输出使用管道连接到一系列 cut 函数,我们可以从输出中提取 IP 地址。现在我们已经成功地确定了一种方法,来扫描多个主机并轻易识别结果,我们应该将其集成到一个脚本中。 将所有这些操作组合在一起的功能脚本的示例如下:
#!/bin/bash

if [ "$#" -ne 1 ]; then
echo "Usage - ./ping_sweep.sh [/24 network address]"
echo "Example - ./ping-sweep.sh 172.16.155.0"
echo "Example will perform an ICMP ping sweep of the 172.16.155.0/24 network and output to an output.txt file"
exit
fi

prefix=$(echo $1 | cut -d '.' -f 1-3)
for addr in $(seq 1 254); do
hping3 $prefix.$addr --icmp -c 1 >> handle.txt;
done

grep len handle.txt | cut -d ' ' -f 2 | cut -d '=' -f 2 >> output.txt

rm handle.txt
在提供的 bash 脚本中,第一行定义了 bash 解释器的位置。 接下来的代码块执行测试来确定是否提供了预期的一个参数。 这通过评估提供的参数的数量是否不等于1 来确定。如果未提供预期参数,则输出脚本的用法,并且退出脚本。 用法输出表明,脚本需要接受 / 24 网络地址作为参数。 下一行代码从提供的网络地址中提取网络前缀。 例如,如果提供的网络地址是 192.168.11.0 ,则前缀变量将被赋值为 192.168.11 。 然后对 / 24 范围内的每个地址执行 hping3 操作,并将每个任务的结果输出放入 handle.txt 文件中。一旦完成, grep 用于从 handle 文件中提取与活动主机响应相关联的行,然后从这些行中提取 IP 地址。 然后将生成的 IP 地址传递到 output.txt 文件,并从目录中删除 handle.txt 临时文件。 此脚本可以使用句号和斜杠,后跟可执行脚本的名称执行:
root@kali:~# ./ping_sweep.sh
Usage - ./ping_sweep.sh [/24 network address]
Example - ./ping-sweep.sh 172.16.155.0
Example will perform an ICMP ping sweep of the 172.16.155.0/24 network and output to an output.txt file
root@kali:~# ./ping_sweep.sh 8.8.8.0

--- 8.8.8.1 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.2 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.3 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.4 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
[b][i] {TRUNCATED} [/b][/i]
一旦完成,脚本应该返回一个 output.txt 文件到执行目录。 这可以使用 ls 验证,并且 cat 命令可以用于查看此文件的内容:
root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
8.8.8.8
当脚本运行时,你仍然会看到在初始循环任务时看到的大量输出。 幸运的是,你发现的主机列表不会在此输出中消失,因为它每次都会写入你的输出文件。
 
工作原理
 我们需要进行一些调整,才能使用 hping3 对多个主机或地址范围执行主机发现。提供的秘籍使用 bash 脚本顺序执行 ICMP 回应请求。 这是可性的,因为成功和不成功的请求能够生成唯一响应。 通过将函数传递给一个循环,并将唯一响应传递给 grep ,我们可以高效开发出一个脚本,对多个系统依次执行 ICMP 发现,然后输出活动主机列表。
  查看全部
hping3简介:


hping3 可以用于以多种不同方式执行主机发现的更多功能。 它比 fping 更强大,因为它可以执行多种不同类型的发现技术,但作为扫描工具不太有用,因为它只能用于定位单个主机。 然而,这个缺点可以使用 bash 脚本克服。 该秘籍演示了如何使用 hping3 在远程主机上执行第3层发现。


准备:


使用 hping3 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复 ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 ICMP 请求的系统。


hping3 是一个非常强大的发现工具,具有大量可操作的选项和模式。它能够在第3层和第4层上执行发现。为了使用 hping3 对单个主机地址执行基本的 ICMP 发现, 只需要将要测试的 IP 地址和所需的 ICMP 扫描模式传递给它:
root@kali:~# hping3 8.8.8.8 --icmp 
HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes
len=46 ip=8.8.8.8 ttl=128 id=61632 icmp_seq=0 rtt=59.6 ms
len=46 ip=8.8.8.8 ttl=128 id=62130 icmp_seq=1 rtt=59.3 ms
len=46 ip=8.8.8.8 ttl=128 id=62209 icmp_seq=2 rtt=57.6 ms
len=46 ip=8.8.8.8 ttl=128 id=62432 icmp_seq=3 rtt=56.4 ms
len=46 ip=8.8.8.8 ttl=128 id=62642 icmp_seq=4 rtt=55.6 ms
^C
--- 8.8.8.8 hping statistic ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 55.6/57.7/59.6 ms
提供的演示使用 Ctrl + C 停止进程。与标准 ping 工具类似, hping3 ICMP模式将无限继续,除非在初始命令中指定了特定数量的数据包。 为了定义要发送的尝试次数,应包含 -c 选项和一个表示所需尝试次数的整数值:
root@kali:~# hping3 8.8.8.8 --icmp -c 2
HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes
len=46 ip=8.8.8.8 ttl=128 id=64399 icmp_seq=0 rtt=58.8 ms
len=46 ip=8.8.8.8 ttl=128 id=65153 icmp_seq=1 rtt=54.7 ms

--- 8.8.8.8 hping statistic ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 54.7/56.7/58.8 ms
虽然 hping3 默认情况下不支持扫描多个系统,但可以使用 bash 脚本轻易编写脚本。 为了做到这一点,我们必须首先确定与活动地址相关联的输出,以及与非响应地址相关联的输出之间的区别。 为此,我们应该在未分配主机的 IP 地址上使用相同的命令:
root@kali:~# hping3 8.8.8.100 --icmp -c 2
HPING 8.8.8.100 (eth0 8.8.8.100): icmp mode set, 28 headers + 0 data bytes

--- 8.8.8.100 hping statistic ---
2 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
尽管产生了期望的结果,在这种情况下, grep 函数似乎不能有效用于输出。 由于 hping3 中的输出显示处理,它难以通过管道传递到 grep 函数,并只提取所需的行,我们可以尝试通过其他方式解决这个问题。 具体来说,我们将尝试确定输出是否可以重定向到一个文件,然后我们可以直接从文件中 grep 。 为此,我们尝试将先前使用的两个命令的输出传递给 handle.txt 文件:
root@kali:~# hping3 8.8.8.8 --icmp -c 1 >> handle.txt

--- 8.8.8.8 hping statistic ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 55.6/55.6/55.6 ms
root@kali:~# hping3 8.8.8.100 --icmp -c 1 >> handle.txt

--- 8.8.8.100 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
root@kali:~# cat handle.txt
HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes
len=46 ip=8.8.8.8 ttl=128 id=35997 icmp_seq=0 rtt=55.6 ms
HPING 8.8.8.100 (eth0 8.8.8.100): icmp mode set, 28 headers + 0 data bytes
虽然这种尝试并不完全成功,因为输出没有完全重定向到文件,我们可以看到通过读取文件中的输出,足以创建一个有效的脚本。 具体来说,我们能够重定向一个唯一的行,该行只与成功的 ping 尝试相关联,并且包含该行中相应的 IP 地址。 要验证此解决方法是否可行,我们需要尝试循环访问 / 24 范围中的每个地址,然后将结果传递到 handle.txt 文件:
root@kali:~# cat handle.txt 
HPING 8.8.8.8 (eth0 8.8.8.8): icmp mode set, 28 headers + 0 data bytes
len=46 ip=8.8.8.8 ttl=128 id=35997 icmp_seq=0 rtt=55.6 ms
HPING 8.8.8.100 (eth0 8.8.8.100): icmp mode set, 28 headers + 0 data bytes
root@kali:~# for addr in $(seq 1 254);do hping3 8.8.8.$addr --icmp -c 1 >> handle.txt & done
[1] 13477
[2] 13478
[3] 13479
[4] 13480
[5] 13481
[6] 13482
[7] 13483
[8] 13484
[9] 13485
[10] 13486
[11] 13487
[12] 13488
[13] 13489
[14] 13490
[15] 13491
[16] 13492
[17] 13493
[18] 13494
[19] 13495
[20] 13496
[21] 13497
[22] 13498
[23] 13499
[24] 13500
[25] 13501
[26] 13502

--- 8.8.8.8 hping statistic ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 71.5/71.5/71.5 ms
[27] 13503
[28] 13504
[29] 13505
[30] 13506
[31] 13507
[32] 13508
[33] 13509
[34] 13510
[35] 13511
[36] 13512
[37] 13513
[38] 13514
[39] 13515
[40] 13516

--- 8.8.8.1 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.3 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.2 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.4 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
[b][i] {TRUNCATED} [/b][/i]
通过这样做,仍然有大量的输出(提供的输出为了方便而被截断)包含未重定向到文件的输出。 但是,以下脚本的成功不取决于初始循环的过多输出,而是取决于从输出文件中提取必要信息的能力:
root@kali:~# grep len handle.txt | cut -d ' ' -f 2
ip=8.8.8.8
root@kali:~# grep len handle.txt | cut -d ' ' -f 2 | cut -d '=' -f 2
8.8.8.8
root@kali:~# grep len handle.txt
len=46 ip=8.8.8.8 ttl=128 id=36000 icmp_seq=0 rtt=60.5 ms
root@kali:~# grep len handle.txt | cut -d ' ' -f 2
ip=8.8.8.8
root@kali:~# grep len handle.txt | cut -d ' ' -f 2 | cut -d '=' -f 2
8.8.8.8
通过将输出使用管道连接到一系列 cut 函数,我们可以从输出中提取 IP 地址。现在我们已经成功地确定了一种方法,来扫描多个主机并轻易识别结果,我们应该将其集成到一个脚本中。 将所有这些操作组合在一起的功能脚本的示例如下:
#!/bin/bash

if [ "$#" -ne 1 ]; then
echo "Usage - ./ping_sweep.sh [/24 network address]"
echo "Example - ./ping-sweep.sh 172.16.155.0"
echo "Example will perform an ICMP ping sweep of the 172.16.155.0/24 network and output to an output.txt file"
exit
fi

prefix=$(echo $1 | cut -d '.' -f 1-3)
for addr in $(seq 1 254); do
hping3 $prefix.$addr --icmp -c 1 >> handle.txt;
done

grep len handle.txt | cut -d ' ' -f 2 | cut -d '=' -f 2 >> output.txt

rm handle.txt
在提供的 bash 脚本中,第一行定义了 bash 解释器的位置。 接下来的代码块执行测试来确定是否提供了预期的一个参数。 这通过评估提供的参数的数量是否不等于1 来确定。如果未提供预期参数,则输出脚本的用法,并且退出脚本。 用法输出表明,脚本需要接受 / 24 网络地址作为参数。 下一行代码从提供的网络地址中提取网络前缀。 例如,如果提供的网络地址是 192.168.11.0 ,则前缀变量将被赋值为 192.168.11 。 然后对 / 24 范围内的每个地址执行 hping3 操作,并将每个任务的结果输出放入 handle.txt 文件中。一旦完成, grep 用于从 handle 文件中提取与活动主机响应相关联的行,然后从这些行中提取 IP 地址。 然后将生成的 IP 地址传递到 output.txt 文件,并从目录中删除 handle.txt 临时文件。 此脚本可以使用句号和斜杠,后跟可执行脚本的名称执行:
root@kali:~# ./ping_sweep.sh 
Usage - ./ping_sweep.sh [/24 network address]
Example - ./ping-sweep.sh 172.16.155.0
Example will perform an ICMP ping sweep of the 172.16.155.0/24 network and output to an output.txt file
root@kali:~# ./ping_sweep.sh 8.8.8.0

--- 8.8.8.1 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.2 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.3 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 8.8.8.4 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
[b][i] {TRUNCATED} [/b][/i]
一旦完成,脚本应该返回一个 output.txt 文件到执行目录。 这可以使用 ls 验证,并且 cat 命令可以用于查看此文件的内容:
root@kali:~# ls output.txt 
output.txt
root@kali:~# cat output.txt
8.8.8.8
当脚本运行时,你仍然会看到在初始循环任务时看到的大量输出。 幸运的是,你发现的主机列表不会在此输出中消失,因为它每次都会写入你的输出文件。
 
工作原理
 我们需要进行一些调整,才能使用 hping3 对多个主机或地址范围执行主机发现。提供的秘籍使用 bash 脚本顺序执行 ICMP 回应请求。 这是可性的,因为成功和不成功的请求能够生成唯一响应。 通过将函数传递给一个循环,并将唯一响应传递给 grep ,我们可以高效开发出一个脚本,对多个系统依次执行 ICMP 发现,然后输出活动主机列表。
 

【Kali Linux网络扫描秘籍系列】使用 fping 探索第三层

kakaxi 发表了文章 • 0 个评论 • 166 次浏览 • 2018-06-03 11:49 • 来自相关话题

本期秘籍简介:fping 工具非常类似于著名的 ping 工具。 但是,它也内建了在 ping 中不存在的许多附加功能。 这些附加功能让 fping 能够用作功能扫描工具,无需额外修改。 该秘籍演示了如何使用 fping 在远程主机上执行第3层发现。
 
准备
使用 fping 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复 ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。
 
操作步骤
fping 非常类似于添加了一些额外功能的 ping 工具。 它可以以 ping 的相同方式,向单个目标发送 ICMP 回显请求,以确定它是否活动。 这通过将 IP 地址作为参数传递给 fping 实用程序来完成:
【注:我本机的ip地址是172.16.155.150】
root@kali:~# fping 172.16.155.1
172.16.155.1 is alive与标准 ping 工具不同, fping 会在收到单个应答后停止发送 ICMP 回显请求。在接收到回复时,它将显示对应该地址的主机是活动的。 或者,如果未从地址接收到响应,则在确定主机不可达之前, fping 通常尝试联系系统四次:
root@kali:~# fping 172.16.155.100
ICMP Host Unreachable from 172.16.155.150 for ICMP Echo sent to 172.16.155.100
ICMP Host Unreachable from 172.16.155.150 for ICMP Echo sent to 172.16.155.100
ICMP Host Unreachable from 172.16.155.150 for ICMP Echo sent to 172.16.155.100
ICMP Host Unreachable from 172.16.155.150 for ICMP Echo sent to 172.16.155.100
172.16.155.100 is unreachable可以使用 -c count 选项修改此默认连接尝试次数,并向其提供一个定义尝试次数的整数值:
root@kali:~# fping 172.16.155.100 -c 1

172.16.155.100 : xmt/rcv/%loss = 1/0/100%当以这种方式执行时,输出更加隐蔽一些,但可以通过仔细分析来理解。 任何主机的输出包括 IP 地址,尝试次数( xmt ),接收的回复数( rcv )和丢失百分比( %loss )。 在提供的示例中, fping 发现第一个地址处于联机状态。 这可以由接收的字节数和应答的等待时间都被返回的事实来证明。 你还可以通过检查百分比损失,来轻松确定是否存在与提供的 IP 地址关联的活动主机。 如果百分比损失为 100,则未收到回复。与 ping (最常用作故障排除工具)不同, fping 内建了集成功能,可扫描多个主机。 可以使用 fping 扫描主机序列,使用 -g 选项动态生成 IP 地址列表。 要指定扫描范围,请使用该参数传递所需序列范围中的第一个和最后一个 IP 地址:
fping -g 192.168.1.1 192.168.1.254
192.168.1.1 is alive
192.168.1.114 is alive
192.168.1.2 is unreachable
192.168.1.3 is unreachable
192.168.1.4 is unreachable
192.168.1.5 is unreachable
[b][i] {TRUNCATED} [/b][/i]root@kali:~# fping -g 192.168.1.0/24
192.168.1.114 is alive
192.168.1.1 is alive
192.168.1.2 is unreachable
192.168.1.3 is unreachable
192.168.1.4 is unreachable
192.168.1.5 is unreachable
192.168.1.6 is unreachable
[b][i] {TRUNCATED} [/b][/i]最后, fping 还可以用于扫描由输入文本文件的内容指定的一系列地址。 要使用输入文件,请使用 -f 文件选项,然后提供输入文件的文件名或路径:
root@kali:~# ls iplist.txt
iplist.txt
root@kali:~# cat iplist.txt
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.10
192.168.1.254
root@kali:~# fping -f iplist.txt
192.168.1.1 is alive
192.168.1.2 is unreachable
192.168.1.3 is unreachable
192.168.1.4 is unreachable
192.168.1.5 is unreachable
192.168.1.10 is unreachable
192.168.1.254 is unreachable

工作原理
fping 工具执行ICMP发现的方式与我们之前讨论的其他工具相同。 对于每个 IP地址, fping 发送一个或多个 ICMP 回显请求,然后评估所接收的响应以识别活动主机。 fping 还可以用于通过提供适当的参数,来扫描一系列系统或 IP 地址的输入列表。 因此,我们不必使用 bash 脚本来操作工具,就像使用 ping 操作一样,使其成为有效的扫描工具。 查看全部
本期秘籍简介:fping 工具非常类似于著名的 ping 工具。 但是,它也内建了在 ping 中不存在的许多附加功能。 这些附加功能让 fping 能够用作功能扫描工具,无需额外修改。 该秘籍演示了如何使用 fping 在远程主机上执行第3层发现。
 
准备
使用 fping 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复 ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。
 
操作步骤
fping 非常类似于添加了一些额外功能的 ping 工具。 它可以以 ping 的相同方式,向单个目标发送 ICMP 回显请求,以确定它是否活动。 这通过将 IP 地址作为参数传递给 fping 实用程序来完成:
注:我本机的ip地址是172.16.155.150
root@kali:~# fping 172.16.155.1
172.16.155.1 is alive
与标准 ping 工具不同, fping 会在收到单个应答后停止发送 ICMP 回显请求。在接收到回复时,它将显示对应该地址的主机是活动的。 或者,如果未从地址接收到响应,则在确定主机不可达之前, fping 通常尝试联系系统四次:
root@kali:~# fping 172.16.155.100
ICMP Host Unreachable from 172.16.155.150 for ICMP Echo sent to 172.16.155.100
ICMP Host Unreachable from 172.16.155.150 for ICMP Echo sent to 172.16.155.100
ICMP Host Unreachable from 172.16.155.150 for ICMP Echo sent to 172.16.155.100
ICMP Host Unreachable from 172.16.155.150 for ICMP Echo sent to 172.16.155.100
172.16.155.100 is unreachable
可以使用 -c count 选项修改此默认连接尝试次数,并向其提供一个定义尝试次数的整数值:
root@kali:~# fping 172.16.155.100 -c 1

172.16.155.100 : xmt/rcv/%loss = 1/0/100%
当以这种方式执行时,输出更加隐蔽一些,但可以通过仔细分析来理解。 任何主机的输出包括 IP 地址,尝试次数( xmt ),接收的回复数( rcv )和丢失百分比( %loss )。 在提供的示例中, fping 发现第一个地址处于联机状态。 这可以由接收的字节数和应答的等待时间都被返回的事实来证明。 你还可以通过检查百分比损失,来轻松确定是否存在与提供的 IP 地址关联的活动主机。 如果百分比损失为 100,则未收到回复。与 ping (最常用作故障排除工具)不同, fping 内建了集成功能,可扫描多个主机。 可以使用 fping 扫描主机序列,使用 -g 选项动态生成 IP 地址列表。 要指定扫描范围,请使用该参数传递所需序列范围中的第一个和最后一个 IP 地址:
fping -g 192.168.1.1 192.168.1.254
192.168.1.1 is alive
192.168.1.114 is alive
192.168.1.2 is unreachable
192.168.1.3 is unreachable
192.168.1.4 is unreachable
192.168.1.5 is unreachable
[b][i] {TRUNCATED} [/b][/i]
root@kali:~# fping -g 192.168.1.0/24
192.168.1.114 is alive
192.168.1.1 is alive
192.168.1.2 is unreachable
192.168.1.3 is unreachable
192.168.1.4 is unreachable
192.168.1.5 is unreachable
192.168.1.6 is unreachable
[b][i] {TRUNCATED} [/b][/i]
最后, fping 还可以用于扫描由输入文本文件的内容指定的一系列地址。 要使用输入文件,请使用 -f 文件选项,然后提供输入文件的文件名或路径:
root@kali:~# ls iplist.txt 
iplist.txt
root@kali:~# cat iplist.txt
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.10
192.168.1.254
root@kali:~# fping -f iplist.txt
192.168.1.1 is alive
192.168.1.2 is unreachable
192.168.1.3 is unreachable
192.168.1.4 is unreachable
192.168.1.5 is unreachable
192.168.1.10 is unreachable
192.168.1.254 is unreachable

工作原理
fping 工具执行ICMP发现的方式与我们之前讨论的其他工具相同。 对于每个 IP地址, fping 发送一个或多个 ICMP 回显请求,然后评估所接收的响应以识别活动主机。 fping 还可以用于通过提供适当的参数,来扫描一系列系统或 IP 地址的输入列表。 因此,我们不必使用 bash 脚本来操作工具,就像使用 ping 操作一样,使其成为有效的扫描工具。

【Kali Linux网络扫描秘籍系列】使用 Nmap 发现第三层

kakaxi 发表了文章 • 0 个评论 • 173 次浏览 • 2018-06-01 17:04 • 来自相关话题

(特此强调一下: 笔者在做实验的时候,有一个问题大家特别要注意:(注:如果你的kali运行在虚拟机里而且网卡是nat模式,三层的话测试就不准了,结果会造成本来不存在的ip地址,也会误判成ip地址存活,但是如果kali虚拟机的网卡在桥接模式下是没有问题的,一切都是正常的)
 
 
本节秘籍简介:Nmap 是 Kali Linux 中最强大和最通用的扫描工具之一。 因此,毫不奇怪,Nmap也支持 ICMP 发现扫描。 该秘籍演示了如何使用 Nmap 在远程主机上执行第三层发现。
 
准备
使用 Nmap 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 ICMP 请求的系统。
 
操作步骤
Nmap是一种自适应工具,它可以按需自动调整,并执行第2层,第3层或第4层发现。 如果 -sn 选项在 Nmap 中用于扫描本地网段上不存在的 IP 地址,则 ICMP回显请求将用于确定主机是否处于活动状态和是否响应。 为了对单个目标执行ICMP 扫描,请使用带有 -sn 选项的Nmap,并传递要扫描的 IP 地址作为参数:nmap -sn 8.8.8.8
Starting Nmap 7.70 ( https://nmap.org ) at 2018-06-01 04:18 EDT
Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
Host is up (0.00071s latency).
Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds

此命令的输出表明了设备是否已启动,还会提供有关所执行扫描的详细信息。 此外请注意,系统名称也已确定。 Nmap 还执行 DNS 解析来在扫描输出中提供此信息。 它还可以用于使用破折号符号扫描 IP 地址连续范围。 Nmap 默认情况下是多线程的,并且并行运行多个进程。 因此,Nmap 在返回扫描结果时非常快。 看看下面的命令
: nmap -sn 8.8.8.1-254
Starting Nmap 7.70 ( https://nmap.org ) at 2018-06-01 04:52 EDT
Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
Host is up (0.41s latency).
Nmap done: 254 IP addresses (1 host up) scanned in 94.38 seconds在提供的示例中,Nmap 用于扫描整个 / 24 网络范围。 通过使用 tcpdump 分析通过接口的流量,你可能会注意到这些地址没有按顺序扫描。 这可以在以下屏幕截图中看到。 这是 Nmap 的多线程特性的进一步证据,并展示了当其他进程完成时,如何从队列中的地址启动进程:root@kali:~# tcpdump -n tcp port not 22 | grep '8.8.8'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:52:02.032593 IP 192.168.43.234 > 8.8.8.2: ICMP echo request, id 12279, seq 0, length 8
04:52:02.032676 IP 192.168.43.234 > 8.8.8.3: ICMP echo request, id 43809, seq 0, length 8
04:52:02.032721 IP 192.168.43.234 > 8.8.8.4: ICMP echo request, id 60133, seq 0, length 8
04:52:02.032764 IP 192.168.43.234 > 8.8.8.5: ICMP echo request, id 24812, seq 0, length 8
04:52:02.032809 IP 192.168.43.234 > 8.8.8.6: ICMP echo request, id 54369, seq 0, length 8
04:52:02.032882 IP 192.168.43.234 > 8.8.8.7: ICMP echo request, id 22707, seq 0, length 8
04:52:02.032948 IP 192.168.43.234 > 8.8.8.8: ICMP echo request, id 28454, seq 0, length 8
04:52:02.033005 IP 192.168.43.234 > 8.8.8.9: ICMP echo request, id 43781, seq 0, length 8
04:52:02.033072 IP 192.168.43.234 > 8.8.8.10: ICMP echo request, id 21354, seq 0, length 8
04:52:02.033137 IP 192.168.43.234 > 8.8.8.11: ICMP echo request, id 12225, seq 0, length 8
04:52:03.035021 IP 192.168.43.234 > 8.8.8.14: ICMP echo request, id 55346, seq 0, length 8
04:52:03.035240 IP 192.168.43.234 > 8.8.8.15: ICMP echo request, id 25919, seq 0, length 8
04:52:03.035409 IP 192.168.43.234 > 8.8.8.16: ICMP echo request, id 37157, seq 0, length 8
04:52:03.035493 IP 192.168.43.234 > 8.8.8.17: ICMP echo request, id 47584, seq 0, length 8
04:52:03.035579 IP 192.168.43.234 > 8.8.8.18: ICMP echo request, id 34270, seq 0, length 8
04:52:03.035682 IP 192.168.43.234 > 8.8.8.19: ICMP echo request, id 46436, seq 0, length 8
04:52:03.035796 IP 192.168.43.234 > 8.8.8.20: ICMP echo request, id 38654, seq 0, length 8
04:52:03.035961 IP 192.168.43.234 > 8.8.8.21: ICMP echo request, id 23572, seq 0, length 8
04:52:03.036050 IP 192.168.43.234 > 8.8.8.22: ICMP echo request, id 64559, seq 0, length 8
04:52:03.036181 IP 192.168.43.234 > 8.8.8.23: ICMP echo request, id 64132, seq 0, length 8
04:52:03.236049 IP 8.8.8.8 > 192.168.43.234: ICMP echo reply, id 28454, seq 0, length 8
04:52:03.239222 IP 192.168.43.234 > 8.8.8.26: ICMP echo request, id 3723, seq 0, length 8或者,Nmap 也可用于扫描输入文本文件中的 IP 地址。 这可以使用 -iL 选项,后跟文件或文件路径的名称来完成:root@kali:~# ls iplist.txt
iplist.txt
root@kali:~# cat iplist.txt
8.8.8.1
8.8.8.2
8.8.8.3
8.8.8.4
8.8.8.5
8.8.8.6
8.8.8.7
8.8.8.8
root@kali:~# nmap -iL iplist.txt -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-06-01 05:02 EDT
Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
Host is up (0.23s latency).
Nmap done: 8 IP addresses (1 host up) scanned in 7.53 seconds

在提供的示例中,执行目录中存在六个 IP 地址的列表。 然后将此列表输入到Nmap 中,并扫描每个列出的地址来尝试识别活动主机。
 
工作原理
Nmap 通过对提供的范围或文本文件中的每个 IP 地址发出 ICMP 回显请求,来执行第3层扫描。 由于 Nmap 是一个多线程工具,所以它会并行发送多个请求,结果会很快返回给用户。 由于 Nmap 的发现功能是自适应的,它只会使用 ICMP 发现,如果 ARP 发现无法有效定位本地子网上的主机。 或者,如果 ARP 发现或ICMP 发现都不能有效识别给定 IP 地址上的活动主机时,那么将采第四层发现技术。
 
  查看全部
(特此强调一下: 笔者在做实验的时候,有一个问题大家特别要注意:(注:如果你的kali运行在虚拟机里而且网卡是nat模式,三层的话测试就不准了,结果会造成本来不存在的ip地址,也会误判成ip地址存活,但是如果kali虚拟机的网卡在桥接模式下是没有问题的,一切都是正常的)
 
 
本节秘籍简介:Nmap 是 Kali Linux 中最强大和最通用的扫描工具之一。 因此,毫不奇怪,Nmap也支持 ICMP 发现扫描。 该秘籍演示了如何使用 Nmap 在远程主机上执行第三层发现。
 
准备
使用 Nmap 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 ICMP 请求的系统。
 
操作步骤
Nmap是一种自适应工具,它可以按需自动调整,并执行第2层,第3层或第4层发现。 如果 -sn 选项在 Nmap 中用于扫描本地网段上不存在的 IP 地址,则 ICMP回显请求将用于确定主机是否处于活动状态和是否响应。 为了对单个目标执行ICMP 扫描,请使用带有 -sn 选项的Nmap,并传递要扫描的 IP 地址作为参数:
nmap -sn 8.8.8.8
Starting Nmap 7.70 ( https://nmap.org ) at 2018-06-01 04:18 EDT
Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
Host is up (0.00071s latency).
Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds

此命令的输出表明了设备是否已启动,还会提供有关所执行扫描的详细信息。 此外请注意,系统名称也已确定。 Nmap 还执行 DNS 解析来在扫描输出中提供此信息。 它还可以用于使用破折号符号扫描 IP 地址连续范围。 Nmap 默认情况下是多线程的,并且并行运行多个进程。 因此,Nmap 在返回扫描结果时非常快。 看看下面的命令
 nmap -sn 8.8.8.1-254
Starting Nmap 7.70 ( https://nmap.org ) at 2018-06-01 04:52 EDT
Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
Host is up (0.41s latency).
Nmap done: 254 IP addresses (1 host up) scanned in 94.38 seconds
在提供的示例中,Nmap 用于扫描整个 / 24 网络范围。 通过使用 tcpdump 分析通过接口的流量,你可能会注意到这些地址没有按顺序扫描。 这可以在以下屏幕截图中看到。 这是 Nmap 的多线程特性的进一步证据,并展示了当其他进程完成时,如何从队列中的地址启动进程:
root@kali:~# tcpdump -n tcp port not 22 | grep '8.8.8'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:52:02.032593 IP 192.168.43.234 > 8.8.8.2: ICMP echo request, id 12279, seq 0, length 8
04:52:02.032676 IP 192.168.43.234 > 8.8.8.3: ICMP echo request, id 43809, seq 0, length 8
04:52:02.032721 IP 192.168.43.234 > 8.8.8.4: ICMP echo request, id 60133, seq 0, length 8
04:52:02.032764 IP 192.168.43.234 > 8.8.8.5: ICMP echo request, id 24812, seq 0, length 8
04:52:02.032809 IP 192.168.43.234 > 8.8.8.6: ICMP echo request, id 54369, seq 0, length 8
04:52:02.032882 IP 192.168.43.234 > 8.8.8.7: ICMP echo request, id 22707, seq 0, length 8
04:52:02.032948 IP 192.168.43.234 > 8.8.8.8: ICMP echo request, id 28454, seq 0, length 8
04:52:02.033005 IP 192.168.43.234 > 8.8.8.9: ICMP echo request, id 43781, seq 0, length 8
04:52:02.033072 IP 192.168.43.234 > 8.8.8.10: ICMP echo request, id 21354, seq 0, length 8
04:52:02.033137 IP 192.168.43.234 > 8.8.8.11: ICMP echo request, id 12225, seq 0, length 8
04:52:03.035021 IP 192.168.43.234 > 8.8.8.14: ICMP echo request, id 55346, seq 0, length 8
04:52:03.035240 IP 192.168.43.234 > 8.8.8.15: ICMP echo request, id 25919, seq 0, length 8
04:52:03.035409 IP 192.168.43.234 > 8.8.8.16: ICMP echo request, id 37157, seq 0, length 8
04:52:03.035493 IP 192.168.43.234 > 8.8.8.17: ICMP echo request, id 47584, seq 0, length 8
04:52:03.035579 IP 192.168.43.234 > 8.8.8.18: ICMP echo request, id 34270, seq 0, length 8
04:52:03.035682 IP 192.168.43.234 > 8.8.8.19: ICMP echo request, id 46436, seq 0, length 8
04:52:03.035796 IP 192.168.43.234 > 8.8.8.20: ICMP echo request, id 38654, seq 0, length 8
04:52:03.035961 IP 192.168.43.234 > 8.8.8.21: ICMP echo request, id 23572, seq 0, length 8
04:52:03.036050 IP 192.168.43.234 > 8.8.8.22: ICMP echo request, id 64559, seq 0, length 8
04:52:03.036181 IP 192.168.43.234 > 8.8.8.23: ICMP echo request, id 64132, seq 0, length 8
04:52:03.236049 IP 8.8.8.8 > 192.168.43.234: ICMP echo reply, id 28454, seq 0, length 8
04:52:03.239222 IP 192.168.43.234 > 8.8.8.26: ICMP echo request, id 3723, seq 0, length 8
或者,Nmap 也可用于扫描输入文本文件中的 IP 地址。 这可以使用 -iL 选项,后跟文件或文件路径的名称来完成:
root@kali:~# ls iplist.txt 
iplist.txt
root@kali:~# cat iplist.txt
8.8.8.1
8.8.8.2
8.8.8.3
8.8.8.4
8.8.8.5
8.8.8.6
8.8.8.7
8.8.8.8
root@kali:~# nmap -iL iplist.txt -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-06-01 05:02 EDT
Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
Host is up (0.23s latency).
Nmap done: 8 IP addresses (1 host up) scanned in 7.53 seconds

在提供的示例中,执行目录中存在六个 IP 地址的列表。 然后将此列表输入到Nmap 中,并扫描每个列出的地址来尝试识别活动主机。
 
工作原理
Nmap 通过对提供的范围或文本文件中的每个 IP 地址发出 ICMP 回显请求,来执行第3层扫描。 由于 Nmap 是一个多线程工具,所以它会并行发送多个请求,结果会很快返回给用户。 由于 Nmap 的发现功能是自适应的,它只会使用 ICMP 发现,如果 ARP 发现无法有效定位本地子网上的主机。 或者,如果 ARP 发现或ICMP 发现都不能有效识别给定 IP 地址上的活动主机时,那么将采第四层发现技术。
 
 

【Kali Linux网络扫描秘籍系列】使用 Scapy 发现第三层

kakaxi 发表了文章 • 0 个评论 • 155 次浏览 • 2018-05-30 22:30 • 来自相关话题

本秘籍简介:
Scapy 是一种工具,允许用户制作并向网络中注入自定义数据包。 此工具可以用于构建 ICMP 协议请求,并将它们注入网络来分析响应。 这个特定的秘籍演示了如何使用 Scapy 在远程主机上执行第3层发现。
 
准备
使用 Scapy 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 ICMP 请求的系统。
 
操作步骤
为了使用 Scapy 发送 ICMP 回显请求,我们需要开始堆叠层级来发送请求。 堆叠数据包时的一个好的经验法则是,通过 OSI 按照的各层进行处理。 你可以通过使用斜杠分隔每个层级来堆叠多个层级。 为了生成 ICMP 回显请求,IP 层需要与 ICMP请求堆叠。 为了开始,请使用 scapy 命令打开 Scapy 交互式控制台,然后将 IP 对象赋给变量:
 root@kali:~# scapy
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
WARNING: No route found for IPv6 destination :: (no default route?)
WARNING: IPython not available. Using standard Python shell instead.
AutoCompletion, History are disabled.

aSPY//YASa
apyyyyCY//////////YCa |
sY//////YSpcs scpCY//Pp | Welcome to Scapy
ayp ayyyyyyySCP//Pp syY//C | Version 2.4.0
AYAsAYYYYYYYY///Ps cY//S |
pCCCCY//p cSSps y//Y | https://github.com/secdev/scapy
SPPPP///a pP///AC//Y |
A//A cyP////C | Have fun!
p///Ac sC///a |
P////YCpc A//A | We are in France, we say Skappee.
scccccp///pSP///p p//Y | OK? Merci.
sY/////////y caa S//P | -- Sebastien Chabal
cayCyayP//Ya pY/Ya |
sY/PsY////YCc aC//Yp
sc sccaCY//PCypaapyCP//YSs
spCPY//////YPSps
ccaacs

[quote]>> ip=IP()
>>> ip.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= hopopt
chksum= None
src= 127.0.0.1
dst= 127.0.0.1
\options\[/quote]


将新值赋给目标地址属性后,可以通过再次调用 display() 函数来验证更改。 请注意,当目标 IP 地址值更改为任何其他值时,源地址也会从回送地址自动更新为与默认接口关联的 IP 地址。 现在 IP 对象的属性已经适当修改了,我们将需要在我们的封包栈中创建第二层。 要添加到栈的下一个层是 ICMP 层,我们将其赋给单独的变量:
 >>> ping=ICMP()
[quote]>> ping.display()
[size=16]#[ ICMP ][/size]#
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0[/quote]


在所提供的示例中,ICMP 对象使用 ping 变量名称初始化。 然后可以调用 display() 函数来显示 ICMP 属性的默认配置。 为了执行 ICMP 回显请求,默认配置就足够了。 现在两个层都已正确配置,它们可以堆叠来准备发送。 在Scapy 中,可以通过使用斜杠分隔每个层级来堆叠层级。 看看下面的命令集:
 >>> ip.dst="172.16.155.1"
[quote]>> ping_request=(ip/ping)
>>> ping_request.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= icmp
chksum= None
src= 172.16.155.150
dst= 172.16.155.1
\options\
[size=16]#[ ICMP ][/size]#
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0[/quote]



一旦堆叠层级被赋给一个变量, display() 函数可以显示整个栈。 以这种方式堆叠层的过程通常被称为数据报封装。 现在已经堆叠了层级,并已经准备好发送请求。 这可以使用 Scapy 中的 sr1() 函数来完成:
 >>> ping_reply=sr1(ping_request)
Begin emission:
...........................*Finished sending 1 packets.

Received 28 packets, got 1 answers, remaining 0 packets
[quote]>> ping_reply.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= 5
tos= 0x0
len= 28
id= 47924
flags=
frag= 0
ttl= 64
proto= icmp
chksum= 0x30f4
src= 172.16.155.1
dst= 172.16.155.150
\options\
[size=16]#[ ICMP ][/size]#
type= echo-reply
code= 0
chksum= 0xffff
id= 0x0
seq= 0x0
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'[/quote]



在提供的示例中, sr1() 函数赋给了 ping_reply 变量。 这将执行该函数,然后将结果传递给此变量。 在接收到响应后,在 ping_reply 变量上调用 display() 函数来查看响应的内容。请注意,此数据包是从我们发送初始请求的主机发送的,目标地址是 Kali 系统的 IP 地址。 另外,注意响应的 ICMP 类型是回应应答。 基于此示例,使用 Scapy 发送和接收 ICMP 的过程看起来很有用,但如果你尝试对非响应的目标地址使用相同的步骤,你会很快注意到问题:>>> ip.dst="172.16.155.100"
[quote]>> ping_request=(ip/ping)
>>> ping_reply=sr1(ping_request)
Begin emission:
..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................WARNING: Mac address to reach destination not found. Using broadcast.
Finished sending 1 packets.
......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C
Received 4340 packets, got 0 answers, remaining 1 packets示例输出被截断,但此输出应该无限继续,直到你使用 Ctrl + C 强制关闭。不向函数提供超时值, sr1() 函数会继续监听,直到接收到响应。 如果主机不是活动的,或者如果 IP 地址没有与任何主机关联,则不会发送响应,并且该功能也不会退出。 为了在脚本中有效使用此函数,应定义超时值:>>> ping_reply=sr1(ping_request,timeout=1)
Begin emission:
....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................WARNING: Mac address to reach destination not found. Using broadcast.
Finished sending 1 packets.
................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Received 2340 packets, got 0 answers, remaining 1 packets
>>> [/quote]

通过提供超时值作为传递给 sr1() 函数的第二个参数,如果在指定的秒数内没有收到响应,进程将退出。 在所提供的示例中, sr1() 函数用于将 ICMP 请求发送到无响应地址,因为未收到响应,会在 1 秒后退出。 到目前为止提供的示例中,我们将函数赋值给变量,来创建持久化和可操作的对象。 但是,这些函数不必复制给变量,也可以通过直接调用函数生成。>>> answer=sr1(IP(dst="172.16.155.1")/ICMP(),timeout=1)
Begin emission:
..................................................................Finished sending 1 packets.
*
Received 67 packets, got 1 answers, remaining 0 packets
[quote]>> answer.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= 5
tos= 0x0
len= 28
id= 2141
flags=
frag= 0
ttl= 64
proto= icmp
chksum= 0xe3cb
src= 172.16.155.1
dst= 172.16.155.150
\options\
[size=16]#[ ICMP ][/size]#
type= echo-reply
code= 0
chksum= 0xffff
id= 0x0
seq= 0x0
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
 
在这里提供的示例中,之前使用四个单独的命令完成的所有工作,实际上可以通过直接调用函数的单个命令来完成。 请注意,如果在超时值指定的时间范围内,ICMP 请求没有收到 IP 地址的回复,调用对象会产生异常。 由于未收到响应,因此此示例中赋值为响应的应答变量不会初始化:>>> answer=sr1(IP(dst="172.16.155.100")/ICMP(),timeout=1)
Begin emission:
....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................WARNING: Mac address to reach destination not found. Using broadcast.
...Finished sending 1 packets.
.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Received 2348 packets, got 0 answers, remaining 1 packets
>>> answer.dislay()
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'dislay'[/quote]

有关这些不同响应的知识,可以用于生成在多个 IP 地址上按顺序执行 ICMP 请求的脚本。 脚本会循环遍历目标 IP 地址中最后一个八位字节的所有可能值,并为每个值发送一个 ICMP 请求。 当从每个 sr1() 函数返回时,将评估响应来确定是否接收到应答的响应:#!/usr/bin/python3
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

if len(sys.argv)!=2:
print("Usage - ./ping.py [/24 network address]")
print("Exameple - ./pinger.py 172.16.155.1")
print("Exameple will perform an ICMP scan of the 172.16.155.0/24 range")
sys.exit()

address=str(sys.argv[1])
prefix=address.split(".")[0]+'.'+address.split(".")[1]+'.'+address.split(".")[2]+'.'

for addr in range(1,255):
answer=sr1(IP(dst=prefix+str(addr))/ICMP(),timeout=1,verbose=0)

if answer==None:
pass
else:
print(prefix+str(addr))脚本的第一行标识了 Python 解释器所在的位置,以便脚本可以在不传递到解释器的情况下执行。 然后脚本导入所有 Scapy 函数,并定义 Scapy 日志记录级别,以消除脚本中不必要的输出。 还导入了子过程库,以便于从系统调用中提取信息。第二个代码块是条件测试,用于评估是否向脚本提供了所需的参数。 如果在执行时未提供所需的参数,则脚本将输出使用情况的说明。 该说明包括工具的用法,示例和所执行任务的解释。
 
在这个代码块之后,有一个单独的代码行将所提供的参数赋值给 interface 变量。下一个代码块使用 check_output() 子进程函数执行 ifconfig 系统调用,该调用也使用 grep 和 cut 从作为参数提供的本地接口提取 IP 地址。然后将此输出赋给 ip 变量。然后使用 split 函数从 IP 地址字符串中提取 / 24 网络前缀。例如,如果 ip 变量包含 192.168.11.4 字符串,则值为 192.168.11 。它将赋给 prefix 变量。
 
最后一个代码块是一个用于执行实际扫描的 for 循环。 for 循环遍历介于 0 和254 之间的所有值,并且对于每次迭代,该值随后附加到网络前缀后面。在早先提供的示例的中,将针对 192.168.11.0 和 192.168.11.254 之间的每个 IP 地址发送 ICMP 回显请求。然后对于每个回复的活动主机,将相应的 IP 地址打印到屏幕上,以表明主机在 LAN 上活动。一旦脚本被写入本地目录,你可以在终端中使用句号和斜杠,然后是可执行脚本的名称来执行它。看看以下用于执行脚本的命令:
 root@kali:~# ./ping.py
Usage - ./ping.py [/24 network address]
Exameple - ./pinger.py 172.16.155.1
Exameple will perform an ICMP scan of the 172.16.155.0/24 range
root@kali:~# ./ping.py 172.16.155.0
172.16.155.1
172.16.155.2如果在没有提供任何参数的情况下执行脚本,则会将使用方法输出到屏幕。 使用方法输出表明,此脚本需要用于定义要扫描的 / 24 网络的单个参数。 提供的示例使用 172.16.155.0 网络地址来执行脚本。 该脚本然后输出在 / 24 网络范围上的活动 IP 地址的列表。 此输出也可以使用尖括号重定向到输出文本文件,后跟输出文件名。 一个例子如下:root@kali:~# ./ping.py 172.16.155.0 > output.txt
root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
172.16.155.1
172.16.155.2然后可以使用 ls 命令来验证输出文件是否已写入文件系统,或者可以使用 cat 命令查看其内容。 也可以修改此脚本,来接受 IP 地址列表作为输入。 为此,必须更改 for 循环来循环遍历从指定的文本文件读取的行。 一个例子如下:#!/usr/bin/python3
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

if len(sys.argv)!=2:
print("Usage - ./ping.py [filename]")
print("Exameple - ./pinger.py iplist.txt")
print("Exameple will perform an ICMP scan of the IP addresses in iplist.txt")
sys.exit()

filename=str(sys.argv[1])
file1=open(filename,"r")
for addr in file1:
answer=sr1(IP(dst=addr.strip())/ICMP(),timeout=1,verbose=0)

if answer==None:
pass
else:
print(str(addr.strip()))与之前的脚本唯一的主要区别是,它接受一个输入文件名作为参数,然后循环遍历此文件中列出的每个 IP 地址进行扫描。 与其他脚本类似,生成的输出包括响应ICMP 回显请求的系统的相关 IP 地址的简单列表,其中包含 ICMP 回显响应:
 root@kali:~# ./ping2.py
Usage - ./ping.py [filename]
Exameple - ./pinger.py iplist.txt
Exameple will perform an ICMP scan of the IP addresses in iplist.txt
root@kali:~# ./ping2.py iplist.txt
172.16.155.1
172.16.155.2

此脚本的输出可以以相同的方式重定向到输出文件。 使用作为参数提供的输入文件来执行脚本,然后使用尖括号重定向输出,后跟输出文本文件的名称。 一个例子如下:root@kali:~# ./ping2.py iplist.txt > output.txt
root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
172.16.155.1
172.16.155.2工作原理
此处使用 Scapy 通过构造包括 IP 层和附加的 ICMP 请求的请求来执行 ICMP 第三层发现。 IP 层能够将封包路由到本地网络之外,并且 ICMP 请求用于从远程系统请求响应。 在 Python 脚本中使用此技术,可以按顺序执行此任务,来扫描多个系统或整个网络范围。
  查看全部
本秘籍简介:
Scapy 是一种工具,允许用户制作并向网络中注入自定义数据包。 此工具可以用于构建 ICMP 协议请求,并将它们注入网络来分析响应。 这个特定的秘籍演示了如何使用 Scapy 在远程主机上执行第3层发现。
 
准备
使用 Scapy 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 ICMP 请求的系统。
 
操作步骤
为了使用 Scapy 发送 ICMP 回显请求,我们需要开始堆叠层级来发送请求。 堆叠数据包时的一个好的经验法则是,通过 OSI 按照的各层进行处理。 你可以通过使用斜杠分隔每个层级来堆叠多个层级。 为了生成 ICMP 回显请求,IP 层需要与 ICMP请求堆叠。 为了开始,请使用 scapy 命令打开 Scapy 交互式控制台,然后将 IP 对象赋给变量:
 
root@kali:~# scapy
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
WARNING: No route found for IPv6 destination :: (no default route?)
WARNING: IPython not available. Using standard Python shell instead.
AutoCompletion, History are disabled.

aSPY//YASa
apyyyyCY//////////YCa |
sY//////YSpcs scpCY//Pp | Welcome to Scapy
ayp ayyyyyyySCP//Pp syY//C | Version 2.4.0
AYAsAYYYYYYYY///Ps cY//S |
pCCCCY//p cSSps y//Y | https://github.com/secdev/scapy
SPPPP///a pP///AC//Y |
A//A cyP////C | Have fun!
p///Ac sC///a |
P////YCpc A//A | We are in France, we say Skappee.
scccccp///pSP///p p//Y | OK? Merci.
sY/////////y caa S//P | -- Sebastien Chabal
cayCyayP//Ya pY/Ya |
sY/PsY////YCc aC//Yp
sc sccaCY//PCypaapyCP//YSs
spCPY//////YPSps
ccaacs

[quote]>> ip=IP()
>>> ip.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= hopopt
chksum= None
src= 127.0.0.1
dst= 127.0.0.1
\options\[/quote]


将新值赋给目标地址属性后,可以通过再次调用 display() 函数来验证更改。 请注意,当目标 IP 地址值更改为任何其他值时,源地址也会从回送地址自动更新为与默认接口关联的 IP 地址。 现在 IP 对象的属性已经适当修改了,我们将需要在我们的封包栈中创建第二层。 要添加到栈的下一个层是 ICMP 层,我们将其赋给单独的变量:
 
>>> ping=ICMP()
[quote]>> ping.display()
[size=16]#[ ICMP ][/size]#
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0[/quote]


在所提供的示例中,ICMP 对象使用 ping 变量名称初始化。 然后可以调用 display() 函数来显示 ICMP 属性的默认配置。 为了执行 ICMP 回显请求,默认配置就足够了。 现在两个层都已正确配置,它们可以堆叠来准备发送。 在Scapy 中,可以通过使用斜杠分隔每个层级来堆叠层级。 看看下面的命令集:
 
>>> ip.dst="172.16.155.1"
[quote]>> ping_request=(ip/ping)
>>> ping_request.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= icmp
chksum= None
src= 172.16.155.150
dst= 172.16.155.1
\options\
[size=16]#[ ICMP ][/size]#
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0[/quote]



一旦堆叠层级被赋给一个变量, display() 函数可以显示整个栈。 以这种方式堆叠层的过程通常被称为数据报封装。 现在已经堆叠了层级,并已经准备好发送请求。 这可以使用 Scapy 中的 sr1() 函数来完成:
 
>>> ping_reply=sr1(ping_request)
Begin emission:
...........................*Finished sending 1 packets.

Received 28 packets, got 1 answers, remaining 0 packets
[quote]>> ping_reply.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= 5
tos= 0x0
len= 28
id= 47924
flags=
frag= 0
ttl= 64
proto= icmp
chksum= 0x30f4
src= 172.16.155.1
dst= 172.16.155.150
\options\
[size=16]#[ ICMP ][/size]#
type= echo-reply
code= 0
chksum= 0xffff
id= 0x0
seq= 0x0
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'[/quote]



在提供的示例中, sr1() 函数赋给了 ping_reply 变量。 这将执行该函数,然后将结果传递给此变量。 在接收到响应后,在 ping_reply 变量上调用 display() 函数来查看响应的内容。请注意,此数据包是从我们发送初始请求的主机发送的,目标地址是 Kali 系统的 IP 地址。 另外,注意响应的 ICMP 类型是回应应答。 基于此示例,使用 Scapy 发送和接收 ICMP 的过程看起来很有用,但如果你尝试对非响应的目标地址使用相同的步骤,你会很快注意到问题:
>>> ip.dst="172.16.155.100"
[quote]>> ping_request=(ip/ping)
>>> ping_reply=sr1(ping_request)
Begin emission:
..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................WARNING: Mac address to reach destination not found. Using broadcast.
Finished sending 1 packets.
......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C
Received 4340 packets, got 0 answers, remaining 1 packets
示例输出被截断,但此输出应该无限继续,直到你使用 Ctrl + C 强制关闭。不向函数提供超时值, sr1() 函数会继续监听,直到接收到响应。 如果主机不是活动的,或者如果 IP 地址没有与任何主机关联,则不会发送响应,并且该功能也不会退出。 为了在脚本中有效使用此函数,应定义超时值:
>>> ping_reply=sr1(ping_request,timeout=1)
Begin emission:
....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................WARNING: Mac address to reach destination not found. Using broadcast.
Finished sending 1 packets.
................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Received 2340 packets, got 0 answers, remaining 1 packets
>>> [/quote]

通过提供超时值作为传递给 sr1() 函数的第二个参数,如果在指定的秒数内没有收到响应,进程将退出。 在所提供的示例中, sr1() 函数用于将 ICMP 请求发送到无响应地址,因为未收到响应,会在 1 秒后退出。 到目前为止提供的示例中,我们将函数赋值给变量,来创建持久化和可操作的对象。 但是,这些函数不必复制给变量,也可以通过直接调用函数生成。
>>> answer=sr1(IP(dst="172.16.155.1")/ICMP(),timeout=1)
Begin emission:
..................................................................Finished sending 1 packets.
*
Received 67 packets, got 1 answers, remaining 0 packets
[quote]>> answer.display()
[size=16]#[ IP ][/size]#
version= 4
ihl= 5
tos= 0x0
len= 28
id= 2141
flags=
frag= 0
ttl= 64
proto= icmp
chksum= 0xe3cb
src= 172.16.155.1
dst= 172.16.155.150
\options\
[size=16]#[ ICMP ][/size]#
type= echo-reply
code= 0
chksum= 0xffff
id= 0x0
seq= 0x0
[size=16]#[ Padding ][/size]#
load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

 
在这里提供的示例中,之前使用四个单独的命令完成的所有工作,实际上可以通过直接调用函数的单个命令来完成。 请注意,如果在超时值指定的时间范围内,ICMP 请求没有收到 IP 地址的回复,调用对象会产生异常。 由于未收到响应,因此此示例中赋值为响应的应答变量不会初始化:
>>> answer=sr1(IP(dst="172.16.155.100")/ICMP(),timeout=1)
Begin emission:
....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................WARNING: Mac address to reach destination not found. Using broadcast.
...Finished sending 1 packets.
.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Received 2348 packets, got 0 answers, remaining 1 packets
>>> answer.dislay()
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'dislay'[/quote]

有关这些不同响应的知识,可以用于生成在多个 IP 地址上按顺序执行 ICMP 请求的脚本。 脚本会循环遍历目标 IP 地址中最后一个八位字节的所有可能值,并为每个值发送一个 ICMP 请求。 当从每个 sr1() 函数返回时,将评估响应来确定是否接收到应答的响应:
#!/usr/bin/python3
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

if len(sys.argv)!=2:
print("Usage - ./ping.py [/24 network address]")
print("Exameple - ./pinger.py 172.16.155.1")
print("Exameple will perform an ICMP scan of the 172.16.155.0/24 range")
sys.exit()

address=str(sys.argv[1])
prefix=address.split(".")[0]+'.'+address.split(".")[1]+'.'+address.split(".")[2]+'.'

for addr in range(1,255):
answer=sr1(IP(dst=prefix+str(addr))/ICMP(),timeout=1,verbose=0)

if answer==None:
pass
else:
print(prefix+str(addr))
脚本的第一行标识了 Python 解释器所在的位置,以便脚本可以在不传递到解释器的情况下执行。 然后脚本导入所有 Scapy 函数,并定义 Scapy 日志记录级别,以消除脚本中不必要的输出。 还导入了子过程库,以便于从系统调用中提取信息。第二个代码块是条件测试,用于评估是否向脚本提供了所需的参数。 如果在执行时未提供所需的参数,则脚本将输出使用情况的说明。 该说明包括工具的用法,示例和所执行任务的解释。
 
在这个代码块之后,有一个单独的代码行将所提供的参数赋值给 interface 变量。下一个代码块使用 check_output() 子进程函数执行 ifconfig 系统调用,该调用也使用 grep 和 cut 从作为参数提供的本地接口提取 IP 地址。然后将此输出赋给 ip 变量。然后使用 split 函数从 IP 地址字符串中提取 / 24 网络前缀。例如,如果 ip 变量包含 192.168.11.4 字符串,则值为 192.168.11 。它将赋给 prefix 变量。
 
最后一个代码块是一个用于执行实际扫描的 for 循环。 for 循环遍历介于 0 和254 之间的所有值,并且对于每次迭代,该值随后附加到网络前缀后面。在早先提供的示例的中,将针对 192.168.11.0 和 192.168.11.254 之间的每个 IP 地址发送 ICMP 回显请求。然后对于每个回复的活动主机,将相应的 IP 地址打印到屏幕上,以表明主机在 LAN 上活动。一旦脚本被写入本地目录,你可以在终端中使用句号和斜杠,然后是可执行脚本的名称来执行它。看看以下用于执行脚本的命令:
 
root@kali:~# ./ping.py
Usage - ./ping.py [/24 network address]
Exameple - ./pinger.py 172.16.155.1
Exameple will perform an ICMP scan of the 172.16.155.0/24 range
root@kali:~# ./ping.py 172.16.155.0
172.16.155.1
172.16.155.2
如果在没有提供任何参数的情况下执行脚本,则会将使用方法输出到屏幕。 使用方法输出表明,此脚本需要用于定义要扫描的 / 24 网络的单个参数。 提供的示例使用 172.16.155.0 网络地址来执行脚本。 该脚本然后输出在 / 24 网络范围上的活动 IP 地址的列表。 此输出也可以使用尖括号重定向到输出文本文件,后跟输出文件名。 一个例子如下:
root@kali:~# ./ping.py 172.16.155.0 > output.txt
root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
172.16.155.1
172.16.155.2
然后可以使用 ls 命令来验证输出文件是否已写入文件系统,或者可以使用 cat 命令查看其内容。 也可以修改此脚本,来接受 IP 地址列表作为输入。 为此,必须更改 for 循环来循环遍历从指定的文本文件读取的行。 一个例子如下:
#!/usr/bin/python3
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

if len(sys.argv)!=2:
print("Usage - ./ping.py [filename]")
print("Exameple - ./pinger.py iplist.txt")
print("Exameple will perform an ICMP scan of the IP addresses in iplist.txt")
sys.exit()

filename=str(sys.argv[1])
file1=open(filename,"r")
for addr in file1:
answer=sr1(IP(dst=addr.strip())/ICMP(),timeout=1,verbose=0)

if answer==None:
pass
else:
print(str(addr.strip()))
与之前的脚本唯一的主要区别是,它接受一个输入文件名作为参数,然后循环遍历此文件中列出的每个 IP 地址进行扫描。 与其他脚本类似,生成的输出包括响应ICMP 回显请求的系统的相关 IP 地址的简单列表,其中包含 ICMP 回显响应:
 
root@kali:~# ./ping2.py 
Usage - ./ping.py [filename]
Exameple - ./pinger.py iplist.txt
Exameple will perform an ICMP scan of the IP addresses in iplist.txt
root@kali:~# ./ping2.py iplist.txt
172.16.155.1
172.16.155.2

此脚本的输出可以以相同的方式重定向到输出文件。 使用作为参数提供的输入文件来执行脚本,然后使用尖括号重定向输出,后跟输出文本文件的名称。 一个例子如下:
root@kali:~# ./ping2.py iplist.txt  > output.txt
root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
172.16.155.1
172.16.155.2
工作原理
此处使用 Scapy 通过构造包括 IP 层和附加的 ICMP 请求的请求来执行 ICMP 第三层发现。 IP 层能够将封包路由到本地网络之外,并且 ICMP 请求用于从远程系统请求响应。 在 Python 脚本中使用此技术,可以按顺序执行此任务,来扫描多个系统或整个网络范围。
 

【Kali Linux网络扫描秘籍系列】使用 ICMP 探索第三层

kakaxi 发表了文章 • 0 个评论 • 146 次浏览 • 2018-05-29 18:32 • 来自相关话题

本文简介:
第三层的发现可能是网络管理员和技术人员中最常用的工具。 第三层的发现使用著名的 ICMP ping 来识别活动主机。 此秘籍演示了如何使用 ping 工具在远程主机上执行第三层发现。
 
准备
使用 ping 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 ICMP 请求的系统。
 
操作步骤
大多数在 IT 行业工作的人都相当熟悉 ping 工具。 要使用 ping 确定主机是否处于活动状态,你只需要向命令传递参数来定义要测试的 IP 地址:
root@kali:~# ping 172.16.155.1
PING 172.16.155.1 (172.16.155.1) 56(84) bytes of data.
64 bytes from 172.16.155.1: icmp_seq=1 ttl=64 time=0.209 ms
64 bytes from 172.16.155.1: icmp_seq=2 ttl=64 time=0.230 ms
64 bytes from 172.16.155.1: icmp_seq=3 ttl=64 time=0.351 ms
^C
--- 172.16.155.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2055ms
rtt min/avg/max/mdev = 0.209/0.263/0.351/0.063 ms
发出此命令时,ICMP 回显请求将直接发送到提供的 IP 地址。 为了接收对此 ICMP回显请求的回复,必须满足几个条件。 这些条件如下:测试的 IP 地址必须分配给系统系统必须处于活动状态并在线必须存在从扫描系统到目标 IP 的可用路由系统必须配置为响应 ICMP 流量扫描系统和配置为丢弃 ICMP 流量的目标 IP 之间没有基于主机或网络防火墙你可以看到,有很多变量成为 ICMP 发现的成功因素。 正是由于这个原因,ICMP可能有点不可靠,但与 ARP 不同,它是一个可路由的协议,可用于发现局域网外的主机。 请注意,在前面的示例中,在 ping 命令显示的输出中出现 ^ C 。 这表示使用了转义序列(具体来说, Ctrl + C )来停止进程。 与 Windows 不同,默认情况下,集成到 Linux 操作系统的 ping 命令会无限 ping 目标主机。 但是, -c 选项可用于指定要发送的 ICMP 请求数。 使用此选项,一旦达到超时或每个发送的数据包的回复已接收,过程将正常结束。 看看下面的命令:
root@kali:~# ping 172.16.155.1 -c 2
PING 172.16.155.1 (172.16.155.1) 56(84) bytes of data.
64 bytes from 172.16.155.1: icmp_seq=1 ttl=64 time=0.342 ms
64 bytes from 172.16.155.1: icmp_seq=2 ttl=64 time=0.147 ms

--- 172.16.155.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1009ms
rtt min/avg/max/mdev = 0.147/0.244/0.342/0.098 ms
与 ARPing 相同的方式可以在 bash 脚本中使用,通过并行地循环遍历多个IP, ping 可以与 bash 脚本结合使用,来在多个主机上并行执行第三层发现。 为了编写脚本,我们需要确定与成功和失败的 ping 请求相关的各种响应。 为此,我们应该首先 ping 一个我们知道它活动并响应 ICMP 的主机,然后使用 ping 请求跟踪一个无响应的地址。 以下命令演示了这一点:
 
root@kali:~# ping 172.16.155.1 -c 1
PING 172.16.155.1 (172.16.155.1) 56(84) bytes of data.
64 bytes from 172.16.155.1: icmp_seq=1 ttl=64 time=0.403 ms

--- 172.16.155.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.403/0.403/0.403/0.000 ms
root@kali:~# ping 172.16.155.100 -c 1
PING 172.16.155.100 (172.16.155.100) 56(84) bytes of data.
From 172.16.155.150 icmp_seq=1 Destination Host Unreachable

--- 172.16.155.100 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

与 ARPing 请求一样,来自唯一字符串的字节只存在在与活动 IP 地址相关的输出中,并且也位于包含此地址的行上。 使用同样的方式,我们可以使用 grep 和 cut 的组合,从任何成功的 ping 请求中提取 IP 地址:
root@kali:~# ping 172.16.155.1 -c 1 |grep 'bytes from'
64 bytes from 172.16.155.1: icmp_seq=1 ttl=64 time=0.248 ms
root@kali:~# ping 172.16.155.1 -c 1 |grep 'bytes from'|cut -d ' ' -f 4
172.16.155.1:
root@kali:~# ping 172.16.155.1 -c 1 |grep 'bytes from'|cut -d ' ' -f 4|cut -d ':' -f 1
172.16.155.1
root@kali:~# 通过在包含一系列目标 IP 地址的循环中使用此任务序列,我们可以快速识别响应ICMP 回显请求的活动主机。 输出是一个简单的的活动 IP 地址列表。 使用此技术的示例脚本如下所示:
 
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "Usage - ./ping_sweep.sh [/24 network address]"
echo "Example - ./ping_sweep.sh 172.16.155.0"
echo "Example will perform an ICMP ping sweep of the 172.16.155.0/24 network"
exit
fi

prefix=$(echo $1 | cut -d '.' -f 1-3)

for addr in $(seq 1 254); do
ping -c 1 $prefix.$addr | grep "bytes from" | cut -d ' ' -f 4 |cut -d ":" -f 1 &
done在提供的bash脚本中,第一行定义了 bash 解释器的位置。接下来的代码块执行测试来确定是否提供了预期的一个参数。这通过评估提供的参数的数量是否不等于 1来确定。如果未提供预期参数,则输出脚本的用法,并且退出脚本。用法输出表明,脚本接受 / 24 网络地址作为参数。下一行代码从提供的网络地址中提取网络前缀。例如,如果提供的网络地址是 192.168.11.0 ,则前缀变量将被赋值为 192.168.11 。然后使用 for 循环遍历最后一个字节的值,来在本地 / 24 网络中生成每个可能的 IP 地址。对于每个可能的 IP 地址,执行单个 ping 命令。然后通过管道传输每个请求的响应,然后使用 grep 来提取带有短语 bytes 的行。这只会提取包含活动主机的 IP 地址的行。最后,使用一系列 cut 函数从该输出中提取 IP 地址。请注意,在 for 循环任务的末尾使用 & 符号,而不是分号。该符号能够并行执行任务,而不是顺序执行。这极大地减少了扫描 IP 范围所需的时间。然后,可以使用句号和斜杠,并带上是可执行脚本的名称来执行脚本:
 
root@kali:~# chmod +x ./ping.sh #给脚本文件增加执行权限
root@kali:~# ls -al ./ping.sh
-rwxr-xr-x 1 root root 382 May 29 06:27 ./ping.sh
root@kali:~# ./ping.sh
Usage - ./ping_sweep.sh [/24 network address]
Example - ./ping_sweep.sh 172.16.155.0
Example will perform an ICMP ping sweep of the 172.16.155.0/24 network
root@kali:~# ./ping.sh 172.16.155.0
172.16.155.2
172.16.155.1
172.16.155.150
root@kali:~# 当在没有提供任何参数的情况下执行时,脚本会返回用法。 但是,当使用网络地址值执行时,任务序列开始执行,并返回活动 IP 地址的列表。 如前面的脚本中所讨论的那样,此脚本的输出也可以重定向到文本文件,来供将来使用。 这可以使用尖括号,后跟输出文件的名称来实现。
 
root@kali:~# ./ping.sh 172.16.155.0 > output.txt
root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
172.16.155.2
172.16.155.1
172.16.155.150在提供的示例中, ls 命令用于确认输出文件已创建。 通过将文件名作为参数传递给 cat 命令,可以查看此输出文件的内容。
 
工作原理
Ping 是 IT 行业中众所周知的工具,其现有功能能用于识别活动主机。 然而,它的目的是为了发现单个主机是否存活,而不是作为扫描工具。 这个秘籍中的 bash 脚本基本上与在 / 24 CIDR范围中对每个可能的 IP 地址使用 ping 相同。 但是,我们不需要手动执行这种繁琐的任务,bash 允许我们通过循环传递任务序列来快速,轻松地执行此任务。 查看全部
本文简介:
第三层的发现可能是网络管理员和技术人员中最常用的工具。 第三层的发现使用著名的 ICMP ping 来识别活动主机。 此秘籍演示了如何使用 ping 工具在远程主机上执行第三层发现。
 
准备
使用 ping 执行第三层发现不需要实验环境,因为 Internet 上的许多系统都将回复ICMP 回显请求。但是,强烈建议你只在您自己的实验环境中执行任何类型的网络扫描,除非你完全熟悉您受到任何管理机构施加的法律法规。如果你希望在实验环境中执行此技术,你需要至少有一个响应 ICMP 请求的系统。
 
操作步骤
大多数在 IT 行业工作的人都相当熟悉 ping 工具。 要使用 ping 确定主机是否处于活动状态,你只需要向命令传递参数来定义要测试的 IP 地址:
root@kali:~# ping 172.16.155.1
PING 172.16.155.1 (172.16.155.1) 56(84) bytes of data.
64 bytes from 172.16.155.1: icmp_seq=1 ttl=64 time=0.209 ms
64 bytes from 172.16.155.1: icmp_seq=2 ttl=64 time=0.230 ms
64 bytes from 172.16.155.1: icmp_seq=3 ttl=64 time=0.351 ms
^C
--- 172.16.155.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2055ms
rtt min/avg/max/mdev = 0.209/0.263/0.351/0.063 ms
发出此命令时,ICMP 回显请求将直接发送到提供的 IP 地址。 为了接收对此 ICMP回显请求的回复,必须满足几个条件。 这些条件如下:测试的 IP 地址必须分配给系统系统必须处于活动状态并在线必须存在从扫描系统到目标 IP 的可用路由系统必须配置为响应 ICMP 流量扫描系统和配置为丢弃 ICMP 流量的目标 IP 之间没有基于主机或网络防火墙你可以看到,有很多变量成为 ICMP 发现的成功因素。 正是由于这个原因,ICMP可能有点不可靠,但与 ARP 不同,它是一个可路由的协议,可用于发现局域网外的主机。 请注意,在前面的示例中,在 ping 命令显示的输出中出现 ^ C 。 这表示使用了转义序列(具体来说, Ctrl + C )来停止进程。 与 Windows 不同,默认情况下,集成到 Linux 操作系统的 ping 命令会无限 ping 目标主机。 但是, -c 选项可用于指定要发送的 ICMP 请求数。 使用此选项,一旦达到超时或每个发送的数据包的回复已接收,过程将正常结束。 看看下面的命令:
root@kali:~# ping 172.16.155.1 -c 2
PING 172.16.155.1 (172.16.155.1) 56(84) bytes of data.
64 bytes from 172.16.155.1: icmp_seq=1 ttl=64 time=0.342 ms
64 bytes from 172.16.155.1: icmp_seq=2 ttl=64 time=0.147 ms

--- 172.16.155.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1009ms
rtt min/avg/max/mdev = 0.147/0.244/0.342/0.098 ms

与 ARPing 相同的方式可以在 bash 脚本中使用,通过并行地循环遍历多个IP, ping 可以与 bash 脚本结合使用,来在多个主机上并行执行第三层发现。 为了编写脚本,我们需要确定与成功和失败的 ping 请求相关的各种响应。 为此,我们应该首先 ping 一个我们知道它活动并响应 ICMP 的主机,然后使用 ping 请求跟踪一个无响应的地址。 以下命令演示了这一点:
 
root@kali:~# ping 172.16.155.1 -c 1
PING 172.16.155.1 (172.16.155.1) 56(84) bytes of data.
64 bytes from 172.16.155.1: icmp_seq=1 ttl=64 time=0.403 ms

--- 172.16.155.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.403/0.403/0.403/0.000 ms
root@kali:~# ping 172.16.155.100 -c 1
PING 172.16.155.100 (172.16.155.100) 56(84) bytes of data.
From 172.16.155.150 icmp_seq=1 Destination Host Unreachable

--- 172.16.155.100 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

与 ARPing 请求一样,来自唯一字符串的字节只存在在与活动 IP 地址相关的输出中,并且也位于包含此地址的行上。 使用同样的方式,我们可以使用 grep 和 cut 的组合,从任何成功的 ping 请求中提取 IP 地址:
root@kali:~# ping 172.16.155.1 -c 1 |grep 'bytes from'
64 bytes from 172.16.155.1: icmp_seq=1 ttl=64 time=0.248 ms
root@kali:~# ping 172.16.155.1 -c 1 |grep 'bytes from'|cut -d ' ' -f 4
172.16.155.1:
root@kali:~# ping 172.16.155.1 -c 1 |grep 'bytes from'|cut -d ' ' -f 4|cut -d ':' -f 1
172.16.155.1
root@kali:~#
通过在包含一系列目标 IP 地址的循环中使用此任务序列,我们可以快速识别响应ICMP 回显请求的活动主机。 输出是一个简单的的活动 IP 地址列表。 使用此技术的示例脚本如下所示:
 
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "Usage - ./ping_sweep.sh [/24 network address]"
echo "Example - ./ping_sweep.sh 172.16.155.0"
echo "Example will perform an ICMP ping sweep of the 172.16.155.0/24 network"
exit
fi

prefix=$(echo $1 | cut -d '.' -f 1-3)

for addr in $(seq 1 254); do
ping -c 1 $prefix.$addr | grep "bytes from" | cut -d ' ' -f 4 |cut -d ":" -f 1 &
done
在提供的bash脚本中,第一行定义了 bash 解释器的位置。接下来的代码块执行测试来确定是否提供了预期的一个参数。这通过评估提供的参数的数量是否不等于 1来确定。如果未提供预期参数,则输出脚本的用法,并且退出脚本。用法输出表明,脚本接受 / 24 网络地址作为参数。下一行代码从提供的网络地址中提取网络前缀。例如,如果提供的网络地址是 192.168.11.0 ,则前缀变量将被赋值为 192.168.11 。然后使用 for 循环遍历最后一个字节的值,来在本地 / 24 网络中生成每个可能的 IP 地址。对于每个可能的 IP 地址,执行单个 ping 命令。然后通过管道传输每个请求的响应,然后使用 grep 来提取带有短语 bytes 的行。这只会提取包含活动主机的 IP 地址的行。最后,使用一系列 cut 函数从该输出中提取 IP 地址。请注意,在 for 循环任务的末尾使用 & 符号,而不是分号。该符号能够并行执行任务,而不是顺序执行。这极大地减少了扫描 IP 范围所需的时间。然后,可以使用句号和斜杠,并带上是可执行脚本的名称来执行脚本:
 
root@kali:~# chmod +x ./ping.sh   #给脚本文件增加执行权限
root@kali:~# ls -al ./ping.sh
-rwxr-xr-x 1 root root 382 May 29 06:27 ./ping.sh
root@kali:~# ./ping.sh
Usage - ./ping_sweep.sh [/24 network address]
Example - ./ping_sweep.sh 172.16.155.0
Example will perform an ICMP ping sweep of the 172.16.155.0/24 network
root@kali:~# ./ping.sh 172.16.155.0
172.16.155.2
172.16.155.1
172.16.155.150
root@kali:~#
当在没有提供任何参数的情况下执行时,脚本会返回用法。 但是,当使用网络地址值执行时,任务序列开始执行,并返回活动 IP 地址的列表。 如前面的脚本中所讨论的那样,此脚本的输出也可以重定向到文本文件,来供将来使用。 这可以使用尖括号,后跟输出文件的名称来实现。
 
root@kali:~# ./ping.sh 172.16.155.0 > output.txt
root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
172.16.155.2
172.16.155.1
172.16.155.150
在提供的示例中, ls 命令用于确认输出文件已创建。 通过将文件名作为参数传递给 cat 命令,可以查看此输出文件的内容。
 
工作原理
Ping 是 IT 行业中众所周知的工具,其现有功能能用于识别活动主机。 然而,它的目的是为了发现单个主机是否存活,而不是作为扫描工具。 这个秘籍中的 bash 脚本基本上与在 / 24 CIDR范围中对每个可能的 IP 地址使用 ping 相同。 但是,我们不需要手动执行这种繁琐的任务,bash 允许我们通过循环传递任务序列来快速,轻松地执行此任务。

【Kali Linux网络扫描秘籍系列】使用 Metasploit 探索第二层

kakaxi 发表了文章 • 0 个评论 • 178 次浏览 • 2018-05-29 17:39 • 来自相关话题

Metasploit简介
Metasploit 主要是漏洞利用工具,这个功能将在接下来的章节中详细讨论。 然而,除了其主要功能之外,Metasploit 还有一些辅助模块,可用于各种扫描和信息收集任务。 特别是,由一个辅助模块可以用于在本地子网上执行 ARP 扫描。 这对许多人都有帮助,因为 Metasploit 是大多数渗透测试人员熟悉的工具,并且将该功能集成到 Metasploit 中,减少了给定测试阶段内所需的工具总数。 这个特定的秘籍演示了如何使用 Metasploit 来执行 ARP 发现。
 
准备
要使用 Metasploit 执行 ARP 发现,你需要在 LAN 上至少拥有一个响应 ARP 请求的系统。 
 
操作步骤​
虽然经常被认为是一个利用框架,Metasploit 也有大量的辅助模块,可用于扫描和信息收集。 特别是有一个可以用于执行第二层发现的辅助模块。 要启动 Metasploit框架,请使用 msfconsole 命令。 然后,使用命令结合所需的模块来配置扫描: Metasploit Park, System Security Interface
Version 4.0.5, Alpha E
Ready...
> access security
access: PERMISSION DENIED.
> access security grid
access: PERMISSION DENIED.
> access main security grid
access: PERMISSION DENIED....and...
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!


=[ metasploit v4.16.48-dev ]
+ -- --=[ 1749 exploits - 1002 auxiliary - 302 post ]
+ -- --=[ 536 payloads - 40 encoders - 10 nops ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf >
msf >
msf > use auxiliary/scanner/discovery/arp_sweep
msf auxiliary(scanner/discovery/arp_sweep) >选择模块后,可以使用 show options 命令查看可配置选项:msf auxiliary(scanner/discovery/arp_sweep) > show options

Module options (auxiliary/scanner/discovery/arp_sweep):

Name Current Setting Required Description
---- --------------- -------- -----------
INTERFACE no The name of the interface
RHOSTS yes The target address range or CIDR identifier
SHOST no Source IP Address
SMAC no Source MAC Address
THREADS 1 yes The number of concurrent threads
TIMEOUT 5 yes The number of seconds to wait for new data


这些配置选项指定要扫描的目标,扫描系统和扫描设置的信息。 可以通过检查扫描系统的接口配置来收集用于该特定扫描的大多数信息。 我们可以十分方便地在Metasploit Framework 控制台中可以传入系统 shell 命令。 在以下示例中,我们在不离开 Metasploit Framework 控制台界面的情况下,进行系统调用来执行 ifconfig :
 msf auxiliary(scanner/discovery/arp_sweep) > ifconfig eth0


exec: ifconfig eth0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.16.155.150 netmask 255.255.255.0 broadcast 172.16.155.255 inet6 fe80::20c:29ff:fe24:94d1 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:24:94:d1 txqueuelen 1000 (Ethernet) RX packets 896660 bytes 1223980847 (1.1 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 412768 bytes 35051896 (33.4 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 用于此扫描的接口是 eth0 。 由于第二层扫描仅能够有效地识别本地子网上的活动主机,因此我们应该查看扫描系统 IP 和子网掩码以确定要扫描的范围。 在这种情况下,IP 地址和子网掩码显示,我们应扫描 172.16.155.1-254范围。 此外,可以在这些配置中识别扫描系统的源 IP 地址和 MAC 地址。 要在 Metasploit 中定义配置,请使用 set 命令,然后是要定义的变量,然后是要赋的值: msf auxiliary(scanner/discovery/arp_sweep) > set interface eth0interface => eth0msf auxiliary(scanner/discovery/arp_sweep) > set RHOSTS 172.16.155.1-254RHOSTS => 172.16.155.1-254msf auxiliary(scanner/discovery/arp_sweep) > set SHOST 172.16.155.150SHOST => 172.16.155.150msf auxiliary(scanner/discovery/arp_sweep) > set SMAC 00:0c:29:24:94:d1SMAC => 00:0c:29:24:94:d1msf auxiliary(scanner/discovery/arp_sweep) > set THREADS 20THREADS => 20msf auxiliary(scanner/discovery/arp_sweep) > set timeout 1timeout => 1设置扫描配置后,可以使用 show options 命令再次查看设置。 现在应显示之前设置的所有值:msf auxiliary(scanner/discovery/arp_sweep) > show optionsModule options (auxiliary/scanner/discovery/arp_sweep): Name Current Setting Required Description ---- --------------- -------- ----------- INTERFACE eth0 no The name of the interface RHOSTS 172.16.155.1-254 yes The target address range or CIDR identifier SHOST 172.16.155.150 no Source IP Address SMAC 00:0c:29:24:94:d1 no Source MAC Address THREADS 20 yes The number of concurrent threads TIMEOUT 1 yes The number of seconds to wait for new data 在验证所有设置配置正确后,可以使用 run 命令启动扫描。 此特定模块将打印出使用 ARP 发现的任何活动主机。 它还会识别网卡(NIC)供应商,它由发现的主机的 MAC 地址中的前3个字节定义: msf auxiliary(scanner/discovery/arp_sweep) > run[+] 172.16.155.1 appears to be up (VMware, Inc.).[+] 172.16.155.2 appears to be up (VMware, Inc.).[+] 172.16.155.254 appears to be up (VMware, Inc.). Scanned 254 of 254 hosts (100% complete) Auxiliary module execution completed工作原理Metasploit 执行 ARP 发现的基本原理是相同的:广播一系列 ARP 请求,记录并输出 ARP 响应。 Metasploit 辅助模块的输出提供所有活动系统的 IP 地址,然后,它还在括号中提供 MAC 厂商名称。 查看全部
Metasploit简介
Metasploit 主要是漏洞利用工具,这个功能将在接下来的章节中详细讨论。 然而,除了其主要功能之外,Metasploit 还有一些辅助模块,可用于各种扫描和信息收集任务。 特别是,由一个辅助模块可以用于在本地子网上执行 ARP 扫描。 这对许多人都有帮助,因为 Metasploit 是大多数渗透测试人员熟悉的工具,并且将该功能集成到 Metasploit 中,减少了给定测试阶段内所需的工具总数。 这个特定的秘籍演示了如何使用 Metasploit 来执行 ARP 发现。
 
准备
要使用 Metasploit 执行 ARP 发现,你需要在 LAN 上至少拥有一个响应 ARP 请求的系统。 
 
操作步骤​
虽然经常被认为是一个利用框架,Metasploit 也有大量的辅助模块,可用于扫描和信息收集。 特别是有一个可以用于执行第二层发现的辅助模块。 要启动 Metasploit框架,请使用 msfconsole 命令。 然后,使用命令结合所需的模块来配置扫描:
  Metasploit Park, System Security Interface
Version 4.0.5, Alpha E
Ready...
> access security
access: PERMISSION DENIED.
> access security grid
access: PERMISSION DENIED.
> access main security grid
access: PERMISSION DENIED....and...
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!
YOU DIDN'T SAY THE MAGIC WORD!


=[ metasploit v4.16.48-dev ]
+ -- --=[ 1749 exploits - 1002 auxiliary - 302 post ]
+ -- --=[ 536 payloads - 40 encoders - 10 nops ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf >
msf >
msf > use auxiliary/scanner/discovery/arp_sweep
msf auxiliary(scanner/discovery/arp_sweep) >
选择模块后,可以使用 show options 命令查看可配置选项:
msf auxiliary(scanner/discovery/arp_sweep) > show options

Module options (auxiliary/scanner/discovery/arp_sweep):

Name Current Setting Required Description
---- --------------- -------- -----------
INTERFACE no The name of the interface
RHOSTS yes The target address range or CIDR identifier
SHOST no Source IP Address
SMAC no Source MAC Address
THREADS 1 yes The number of concurrent threads
TIMEOUT 5 yes The number of seconds to wait for new data


这些配置选项指定要扫描的目标,扫描系统和扫描设置的信息。 可以通过检查扫描系统的接口配置来收集用于该特定扫描的大多数信息。 我们可以十分方便地在Metasploit Framework 控制台中可以传入系统 shell 命令。 在以下示例中,我们在不离开 Metasploit Framework 控制台界面的情况下,进行系统调用来执行 ifconfig :
 
msf auxiliary(scanner/discovery/arp_sweep) > ifconfig eth0


  •  exec: ifconfig eth0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 172.16.155.150  netmask 255.255.255.0  broadcast 172.16.155.255        inet6 fe80::20c:29ff:fe24:94d1  prefixlen 64  scopeid 0x20<link>        ether 00:0c:29:24:94:d1  txqueuelen 1000  (Ethernet)        RX packets 896660  bytes 1223980847 (1.1 GiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 412768  bytes 35051896 (33.4 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
     用于此扫描的接口是 eth0 。 由于第二层扫描仅能够有效地识别本地子网上的活动主机,因此我们应该查看扫描系统 IP 和子网掩码以确定要扫描的范围。 在这种情况下,IP 地址和子网掩码显示,我们应扫描 172.16.155.1-254范围。 此外,可以在这些配置中识别扫描系统的源 IP 地址和 MAC 地址。 要在 Metasploit 中定义配置,请使用 set 命令,然后是要定义的变量,然后是要赋的值: 
    msf auxiliary(scanner/discovery/arp_sweep) > set interface eth0interface => eth0msf auxiliary(scanner/discovery/arp_sweep) > set RHOSTS 172.16.155.1-254RHOSTS => 172.16.155.1-254msf auxiliary(scanner/discovery/arp_sweep) > set SHOST 172.16.155.150SHOST => 172.16.155.150msf auxiliary(scanner/discovery/arp_sweep) > set SMAC 00:0c:29:24:94:d1SMAC => 00:0c:29:24:94:d1msf auxiliary(scanner/discovery/arp_sweep) > set THREADS 20THREADS => 20msf auxiliary(scanner/discovery/arp_sweep) > set timeout 1timeout => 1
    设置扫描配置后,可以使用 show options 命令再次查看设置。 现在应显示之前设置的所有值:
    msf auxiliary(scanner/discovery/arp_sweep) > show optionsModule options (auxiliary/scanner/discovery/arp_sweep):   Name       Current Setting    Required  Description   ----       ---------------    --------  -----------   INTERFACE  eth0               no        The name of the interface   RHOSTS     172.16.155.1-254   yes       The target address range or CIDR identifier   SHOST      172.16.155.150     no        Source IP Address   SMAC       00:0c:29:24:94:d1  no        Source MAC Address   THREADS    20                 yes       The number of concurrent threads   TIMEOUT    1                  yes       The number of seconds to wait for new data
     在验证所有设置配置正确后,可以使用 run 命令启动扫描。 此特定模块将打印出使用 ARP 发现的任何活动主机。 它还会识别网卡(NIC)供应商,它由发现的主机的 MAC 地址中的前3个字节定义: 
    msf auxiliary(scanner/discovery/arp_sweep) > run[+] 172.16.155.1 appears to be up (VMware, Inc.).[+] 172.16.155.2 appears to be up (VMware, Inc.).[+] 172.16.155.254 appears to be up (VMware, Inc.).
    •  Scanned 254 of 254 hosts (100% complete)
      •  Auxiliary module execution completed
        工作原理Metasploit 执行 ARP 发现的基本原理是相同的:广播一系列 ARP 请求,记录并输出 ARP 响应。 Metasploit 辅助模块的输出提供所有活动系统的 IP 地址,然后,它还在括号中提供 MAC 厂商名称。

【Kali Linux网络扫描秘籍系列】使用 NetDiscover 探索第二层

kakaxi 发表了文章 • 0 个评论 • 157 次浏览 • 2018-05-29 16:37 • 来自相关话题

NetDiscover简介
NetDiscover是一个工具,用于通过 ARP 主动和被动分析识别网络主机。 它主要是在无线接口上使用; 然而,它在其它环境中上也具有功能。 在这个特定的秘籍中,我们将讨论如何使用 NetDiscover 进行主动和被动扫描。
 
操作步骤
NetDiscover 是专门为执行第2层发现而设计的工具。 NetDiscover 可以用于扫描一系列 IP 地址,方法是使用 -r 选项以 CIDR 表示法中的网络范围作为参数。 输出将生成一个表格,其中列出了活动 IP 地址,相应的 MAC 地址,响应数量,响应的长度和 MAC 厂商:root@kali:~# netdiscover -r 172.16.155.0/24

Currently scanning: Finished! | Screen View: Unique Hosts

4 Captured ARP Req/Rep packets, from 3 hosts. Total size: 240
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
172.16.155.1 00:50:56:c0:00:08 1 60 VMware, Inc.
172.16.155.2 00:50:56:e4:e6:af 1 60 VMware, Inc.
172.16.155.254 00:50:56:ee:88:3c 2 120 VMware, Inc. NetDiscover 还可用于扫描来自输入文本文件的 IP 地址。 不是将 CIDR 范围符号作为参数传递, -l 选项可以与输入文件的名称或路径结合使用:root@kali:~# ls iplist.txt
iplist.txt
root@kali:~# cat iplist.txt
172.16.155.0/24
root@kali:~# netdiscover -l iplist.txt
Currently scanning: Finished! | Screen View: Unique Hosts

3 Captured ARP Req/Rep packets, from 3 hosts. Total size: 180
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
172.16.155.1 00:50:56:c0:00:08 1 60 VMware, Inc.
172.16.155.2 00:50:56:e4:e6:af 1 60 VMware, Inc.
172.16.155.254 00:50:56:ee:88:3c 1 60 VMware, Inc. 将此工具与其他工具区分开的另一个独特功能是执行被动发现的功能。 对整个子网中的每个 IP 地址 ARP 广播请求有时可以触发来自安全设备(例如入侵检测系统(IDS)或入侵防御系统(IPS))的警报或响应。 更隐秘的方法是侦听 ARP 流量,因为扫描系统自然会与网络上的其他系统交互,然后记录从 ARP 响应收集的数据。 这种被动扫描技术可以使用 -p 选项执行:root@kali:~# netdiscover -p
Currently scanning: (passive) | Screen View: Unique Hosts

6 Captured ARP Req/Rep packets, from 3 hosts. Total size: 360
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
172.16.155.2 00:50:56:e4:e6:af 4 240 VMware, Inc.
172.16.155.254 00:50:56:ee:88:3c 1 60 VMware, Inc.
172.16.155.1 00:50:56:c0:00:08 1 60 VMware, Inc. 注:以上命令运行之后如果没有arp报文的是显示不出来结果的,所以你可以ping一下对应的地址,这样就可以收到了
 
这种技术在收集信息方面明显更慢,因为请求必须作为正常网络交互的结果产生,但是它也不会引起任何不必要的注意。 如果它在无线网络上运行,这种技术更有效,因为混杂模式下,无线适配器会接收到目标是其他设备的 ARP 应答。 为了在交换环境中有效工作,你需要访问 SPAN 或 TAP,或者需要重载 CAM 表来强制交换机开始广播所有流量。
 
工作原理
NetDiscover ARP 发现的基本原理与我们之前所讨论的第2层发现方法的基本相同。 这个工具和我们讨论的其他一些工具的主要区别,包括被动发现模式,以及在输出中包含 MAC 厂商。 在大多数情况下,被动模式在交换网络上是无用的,因为ARP 响应的接收仍然需要与发现的客户端执行一些交互,尽管它们独立于NetDiscover 工具。 然而,重要的是理解该特征,及其它们在例如集线器或无线网络的广播网络中可能会有用。 NetDiscover 通过评估返回的 MAC 地址的前半部分(前3个字节/ 24位)来识别 MAC 厂商。 这部分地址标识网络接口的制造商,并且通常是设备其余部分的硬件制造商的良好标识。
  查看全部
NetDiscover简介
NetDiscover是一个工具,用于通过 ARP 主动和被动分析识别网络主机。 它主要是在无线接口上使用; 然而,它在其它环境中上也具有功能。 在这个特定的秘籍中,我们将讨论如何使用 NetDiscover 进行主动和被动扫描。
 
操作步骤
NetDiscover 是专门为执行第2层发现而设计的工具。 NetDiscover 可以用于扫描一系列 IP 地址,方法是使用 -r 选项以 CIDR 表示法中的网络范围作为参数。 输出将生成一个表格,其中列出了活动 IP 地址,相应的 MAC 地址,响应数量,响应的长度和 MAC 厂商:
root@kali:~# netdiscover -r 172.16.155.0/24

Currently scanning: Finished! | Screen View: Unique Hosts

4 Captured ARP Req/Rep packets, from 3 hosts. Total size: 240
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
172.16.155.1 00:50:56:c0:00:08 1 60 VMware, Inc.
172.16.155.2 00:50:56:e4:e6:af 1 60 VMware, Inc.
172.16.155.254 00:50:56:ee:88:3c 2 120 VMware, Inc.
NetDiscover 还可用于扫描来自输入文本文件的 IP 地址。 不是将 CIDR 范围符号作为参数传递, -l 选项可以与输入文件的名称或路径结合使用:
root@kali:~# ls iplist.txt 
iplist.txt
root@kali:~# cat iplist.txt
172.16.155.0/24
root@kali:~# netdiscover -l iplist.txt
Currently scanning: Finished! | Screen View: Unique Hosts

3 Captured ARP Req/Rep packets, from 3 hosts. Total size: 180
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
172.16.155.1 00:50:56:c0:00:08 1 60 VMware, Inc.
172.16.155.2 00:50:56:e4:e6:af 1 60 VMware, Inc.
172.16.155.254 00:50:56:ee:88:3c 1 60 VMware, Inc.
将此工具与其他工具区分开的另一个独特功能是执行被动发现的功能。 对整个子网中的每个 IP 地址 ARP 广播请求有时可以触发来自安全设备(例如入侵检测系统(IDS)或入侵防御系统(IPS))的警报或响应。 更隐秘的方法是侦听 ARP 流量,因为扫描系统自然会与网络上的其他系统交互,然后记录从 ARP 响应收集的数据。 这种被动扫描技术可以使用 -p 选项执行:
root@kali:~# netdiscover -p
Currently scanning: (passive) | Screen View: Unique Hosts

6 Captured ARP Req/Rep packets, from 3 hosts. Total size: 360
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
172.16.155.2 00:50:56:e4:e6:af 4 240 VMware, Inc.
172.16.155.254 00:50:56:ee:88:3c 1 60 VMware, Inc.
172.16.155.1 00:50:56:c0:00:08 1 60 VMware, Inc.
注:以上命令运行之后如果没有arp报文的是显示不出来结果的,所以你可以ping一下对应的地址,这样就可以收到了
 
这种技术在收集信息方面明显更慢,因为请求必须作为正常网络交互的结果产生,但是它也不会引起任何不必要的注意。 如果它在无线网络上运行,这种技术更有效,因为混杂模式下,无线适配器会接收到目标是其他设备的 ARP 应答。 为了在交换环境中有效工作,你需要访问 SPAN 或 TAP,或者需要重载 CAM 表来强制交换机开始广播所有流量。
 
工作原理
NetDiscover ARP 发现的基本原理与我们之前所讨论的第2层发现方法的基本相同。 这个工具和我们讨论的其他一些工具的主要区别,包括被动发现模式,以及在输出中包含 MAC 厂商。 在大多数情况下,被动模式在交换网络上是无用的,因为ARP 响应的接收仍然需要与发现的客户端执行一些交互,尽管它们独立于NetDiscover 工具。 然而,重要的是理解该特征,及其它们在例如集线器或无线网络的广播网络中可能会有用。 NetDiscover 通过评估返回的 MAC 地址的前半部分(前3个字节/ 24位)来识别 MAC 厂商。 这部分地址标识网络接口的制造商,并且通常是设备其余部分的硬件制造商的良好标识。
 

【Kali Linux网络扫描秘籍系列】使用 Nmap 探索TCP/IP的二层

kakaxi 发表了文章 • 2 个评论 • 155 次浏览 • 2018-05-29 16:04 • 来自相关话题

网络映射器(Nmap)是 Kali Linux 中最有效和强大的工具之一。 Nmap 可以用于执行大范围的多种扫描技术,并且可高度定制。 这个工具在整本书中会经常使用。在这个特定的秘籍中,我们将讨论如何使用 Nmap 执行第2层扫描。
 
准备
要使用 ARPing 执行 ARP 发现,你需要在 LAN 上至少拥有一个响应 ARP 请求的系统。
 
操作步骤
Nmap 是使用单个命令执行自动化第二层发现扫描的另一个方案。 -sn 选项在Nmap 中称为 ping 扫描( -sn: Ping Scan - disable port scan)。 虽然术语“ping 扫描”自然会导致你认为正在执行第三层发现,但实际上是自适应的。 假设将同一本地子网上的地址指定为参数,可以使用以下命令执行第2层扫描:root@kali:~# nmap 172.16.155.1 -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:41 EDT
Nmap scan report for 172.16.155.1
Host is up (0.00027s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.18 seconds
此命令向 LAN 广播地址发送 ARP 请求,并根据接收到的响应确定主机是否处于活动状态。 或者,如果对不活动主机的 IP 地址使用该命令,则响应会表示主机关闭:root@kali:~# nmap 172.16.155.100 -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:42 EDT
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 0.48 seconds我们可以修改此命令,来使用破折号符号对一系列顺序 IP 地址执行第2层发现。 要扫描完整的 / 24 范围,可以使用 0-255 :root@kali:~# nmap 172.16.155.1-254 -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:43 EDT
Nmap scan report for 172.16.155.1
Host is up (0.00020s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 172.16.155.2
Host is up (0.00044s latency).
MAC Address: 00:50:56:E4:E6:AF (VMware)
Nmap scan report for 172.16.155.254
Host is up (0.00017s latency).
MAC Address: 00:50:56:EE:88:3C (VMware)
Nmap scan report for 172.16.155.150
Host is up.
Nmap done: 254 IP addresses (4 hosts up) scanned in 2.76 seconds使用此命令将向该范围内的所有主机发送 ARP 广播请求,并确定每个主动响应的主机。 也可以使用 -iL 选项对 IP 地址的输入列表执行此扫描:root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
172.16.155.1
172.16.155.2
172.16.155.254
172.16.155.150
root@kali:~# nmap -iL output.txt -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:46 EDT
Nmap scan report for 172.16.155.1
Host is up (0.00045s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 172.16.155.2
Host is up (0.00099s latency).
MAC Address: 00:50:56:E4:E6:AF (VMware)
Nmap scan report for 172.16.155.254
Host is up (0.014s latency).
MAC Address: 00:50:56:EE:88:3C (VMware)
Nmap scan report for 172.16.155.150
Host is up.
Nmap done: 4 IP addresses (4 hosts up) scanned in 0.30 seconds当使用 -sn 选项时,Nmap 将首先尝试使用第2层 ARP 请求定位主机,并且如果主机不位于 LAN 上,它将仅使用第3层 ICMP 请求。 注意对本地网络(在 172.16.155.0/24 专用范围)上的主机执行的 Nmap ping 扫描才能返回MAC 地址。 这是因为 MAC 地址由来自主机的 ARP 响应返回。 但是,如果对不同 LAN 上的远程主机执行相同的 Nmap ping 扫描,则响应不会包括系统的 MAC地址。(注:如果你的kali运行在虚拟机里而且网卡是nat模式,三层的话测试就不准了,下面的主机ip实际上都是不存在的,但是如果kali,在桥接模式下桥接模式下是没有问题的)root@kali:~# nmap 172.16.1.1-254 -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:48 EDT
Nmap scan report for 172.16.1.1
Host is up (0.014s latency).
Nmap scan report for 172.16.1.2
Host is up (0.0045s latency).
Nmap scan report for 172.16.1.3
Host is up (0.015s latency).
Nmap scan report for 172.16.1.4
Host is up (0.015s latency).
Nmap scan report for 172.16.1.5
Host is up (0.016s latency).
Nmap scan report for ....
......当对远程网络范围(公共范围 172.16.1.0/24 )执行时,你可以看到,使用了第三层发现,因为没有返回 MAC 地址。 这表明,Nmap 会尽可能自动利用第二层发现的速度,但在必要时,它将使用可路由的 ICMP 请求,在第三层上发现远程主机(特别注意:这些ip实际上不存在,没有reply的报文,但是nmap还是把他们报告存活,所以nmap x.x.x.x -sn  不适合做跨三层的ip存活检查)。root@kali:~# tcpdump not tcp port 22 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:00:46.446852 IP 172.16.155.150 > 172.16.1.2: ICMP echo request, id 24535, seq 0, length 8
04:00:46.446966 IP 172.16.155.150 > 172.16.1.3: ICMP echo request, id 13971, seq 0, length 8
04:00:46.447021 IP 172.16.155.150 > 172.16.1.4: ICMP echo request, id 6749, seq 0, length 8
04:00:46.447137 IP 172.16.155.150 > 172.16.1.5: ICMP echo request, id 57289, seq 0, length 8
04:00:46.447218 IP 172.16.155.150 > 172.16.1.6: ICMP echo request, id 63355, seq 0, length 8
04:00:46.447276 IP 172.16.155.150 > 172.16.1.7: ICMP echo request, id 19443, seq 0, length 8
04:00:46.447502 IP 172.16.155.150 > 172.16.1.8: ICMP echo request, id 8520, seq 0, length 8
04:00:46.447781 IP 172.16.155.150 > 172.16.1.9: ICMP echo request, id 6980, seq 0, length 8
04:00:46.447860 IP 172.16.155.150 > 172.16.1.10: ICMP echo request, id 27215, seq 0, length 8
04:00:46.447937 IP 172.16.155.150 > 172.16.1.11: ICMP echo request, id 9896, seq 0, length 8
04:00:46.559346 ARP, Request who-has 172.16.155.2 tell 172.16.155.150, length 28
04:00:46.559608 ARP, Reply 172.16.155.2 is-at 00:50:56:e4:e6:af, length 46
04:00:47.449237 IP 172.16.155.150 > 172.16.1.14: ICMP echo request, id 44063, seq 0, length 8
04:00:47.449506 IP 172.16.155.150 > 172.16.1.15: ICMP echo request, id 24681, seq 0, length 8
04:00:47.449829 IP 172.16.155.150 > 172.16.1.16: ICMP echo request, id 19344, seq 0, length 8
04:00:47.451613 IP 172.16.155.150 > 172.16.1.17: ICMP echo request, id 46601, seq 0, length 8





 
如果你使用 tcpdump 监控流量,而 Nmap 对本地网络上的主机执行 ping 扫描。 在以下屏幕截图中,你可以看到 Nmap 利用 ARP 请求来识别本地段范围内的主机:root@kali:~# tcpdump not tcp port 22 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:03:04.668788 ARP, Request who-has 172.16.155.2 tell 172.16.155.150, length 28
04:03:04.669356 ARP, Request who-has 172.16.155.3 tell 172.16.155.150, length 28
04:03:04.670004 ARP, Request who-has 172.16.155.4 tell 172.16.155.150, length 28
04:03:04.670256 ARP, Reply 172.16.155.2 is-at 00:50:56:e4:e6:af, length 46
04:03:04.670459 ARP, Request who-has 172.16.155.5 tell 172.16.155.150, length 28
04:03:04.671149 ARP, Request who-has 172.16.155.6 tell 172.16.155.150, length 28
04:03:04.671374 ARP, Request who-has 172.16.155.7 tell 172.16.155.150, length 28
04:03:04.671729 ARP, Request who-has 172.16.155.8 tell 172.16.155.150, length 28
04:03:04.672124 ARP, Request who-has 172.16.155.9 tell 172.16.155.150, length 28工作原理
 
Nmap 已经高度功能化,需要很少甚至无需调整就可以运行所需的扫描。 底层的原理是一样的。 Nmap 将 ARP 请求发送到一系列 IP 地址的广播地址,并通过标记响应来识别活动主机。 但是,由于此功能已集成到 Nmap 中,因此可以通过提供适当的参数来执行。
 
  查看全部
网络映射器(Nmap)是 Kali Linux 中最有效和强大的工具之一。 Nmap 可以用于执行大范围的多种扫描技术,并且可高度定制。 这个工具在整本书中会经常使用。在这个特定的秘籍中,我们将讨论如何使用 Nmap 执行第2层扫描。
 
准备
要使用 ARPing 执行 ARP 发现,你需要在 LAN 上至少拥有一个响应 ARP 请求的系统。
 
操作步骤
Nmap 是使用单个命令执行自动化第二层发现扫描的另一个方案。 -sn 选项在Nmap 中称为 ping 扫描( -sn: Ping Scan - disable port scan)。 虽然术语“ping 扫描”自然会导致你认为正在执行第三层发现,但实际上是自适应的。 假设将同一本地子网上的地址指定为参数,可以使用以下命令执行第2层扫描:
root@kali:~# nmap 172.16.155.1 -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:41 EDT
Nmap scan report for 172.16.155.1
Host is up (0.00027s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.18 seconds

此命令向 LAN 广播地址发送 ARP 请求,并根据接收到的响应确定主机是否处于活动状态。 或者,如果对不活动主机的 IP 地址使用该命令,则响应会表示主机关闭:
root@kali:~# nmap 172.16.155.100 -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:42 EDT
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 0.48 seconds
我们可以修改此命令,来使用破折号符号对一系列顺序 IP 地址执行第2层发现。 要扫描完整的 / 24 范围,可以使用 0-255 :
root@kali:~# nmap 172.16.155.1-254 -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:43 EDT
Nmap scan report for 172.16.155.1
Host is up (0.00020s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 172.16.155.2
Host is up (0.00044s latency).
MAC Address: 00:50:56:E4:E6:AF (VMware)
Nmap scan report for 172.16.155.254
Host is up (0.00017s latency).
MAC Address: 00:50:56:EE:88:3C (VMware)
Nmap scan report for 172.16.155.150
Host is up.
Nmap done: 254 IP addresses (4 hosts up) scanned in 2.76 seconds
使用此命令将向该范围内的所有主机发送 ARP 广播请求,并确定每个主动响应的主机。 也可以使用 -iL 选项对 IP 地址的输入列表执行此扫描:
root@kali:~# ls output.txt 
output.txt
root@kali:~# cat output.txt
172.16.155.1
172.16.155.2
172.16.155.254
172.16.155.150
root@kali:~# nmap -iL output.txt -sn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:46 EDT
Nmap scan report for 172.16.155.1
Host is up (0.00045s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 172.16.155.2
Host is up (0.00099s latency).
MAC Address: 00:50:56:E4:E6:AF (VMware)
Nmap scan report for 172.16.155.254
Host is up (0.014s latency).
MAC Address: 00:50:56:EE:88:3C (VMware)
Nmap scan report for 172.16.155.150
Host is up.
Nmap done: 4 IP addresses (4 hosts up) scanned in 0.30 seconds
当使用 -sn 选项时,Nmap 将首先尝试使用第2层 ARP 请求定位主机,并且如果主机不位于 LAN 上,它将仅使用第3层 ICMP 请求。 注意对本地网络(在 172.16.155.0/24 专用范围)上的主机执行的 Nmap ping 扫描才能返回MAC 地址。 这是因为 MAC 地址由来自主机的 ARP 响应返回。 但是,如果对不同 LAN 上的远程主机执行相同的 Nmap ping 扫描,则响应不会包括系统的 MAC地址。(注:如果你的kali运行在虚拟机里而且网卡是nat模式,三层的话测试就不准了,下面的主机ip实际上都是不存在的,但是如果kali,在桥接模式下桥接模式下是没有问题的)
root@kali:~# nmap 172.16.1.1-254 -sn 
Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-29 03:48 EDT
Nmap scan report for 172.16.1.1
Host is up (0.014s latency).
Nmap scan report for 172.16.1.2
Host is up (0.0045s latency).
Nmap scan report for 172.16.1.3
Host is up (0.015s latency).
Nmap scan report for 172.16.1.4
Host is up (0.015s latency).
Nmap scan report for 172.16.1.5
Host is up (0.016s latency).
Nmap scan report for ....
......
当对远程网络范围(公共范围 172.16.1.0/24 )执行时,你可以看到,使用了第三层发现,因为没有返回 MAC 地址。 这表明,Nmap 会尽可能自动利用第二层发现的速度,但在必要时,它将使用可路由的 ICMP 请求,在第三层上发现远程主机(特别注意:这些ip实际上不存在,没有reply的报文,但是nmap还是把他们报告存活,所以nmap x.x.x.x -sn  不适合做跨三层的ip存活检查)。
root@kali:~# tcpdump not tcp port 22  -n 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:00:46.446852 IP 172.16.155.150 > 172.16.1.2: ICMP echo request, id 24535, seq 0, length 8
04:00:46.446966 IP 172.16.155.150 > 172.16.1.3: ICMP echo request, id 13971, seq 0, length 8
04:00:46.447021 IP 172.16.155.150 > 172.16.1.4: ICMP echo request, id 6749, seq 0, length 8
04:00:46.447137 IP 172.16.155.150 > 172.16.1.5: ICMP echo request, id 57289, seq 0, length 8
04:00:46.447218 IP 172.16.155.150 > 172.16.1.6: ICMP echo request, id 63355, seq 0, length 8
04:00:46.447276 IP 172.16.155.150 > 172.16.1.7: ICMP echo request, id 19443, seq 0, length 8
04:00:46.447502 IP 172.16.155.150 > 172.16.1.8: ICMP echo request, id 8520, seq 0, length 8
04:00:46.447781 IP 172.16.155.150 > 172.16.1.9: ICMP echo request, id 6980, seq 0, length 8
04:00:46.447860 IP 172.16.155.150 > 172.16.1.10: ICMP echo request, id 27215, seq 0, length 8
04:00:46.447937 IP 172.16.155.150 > 172.16.1.11: ICMP echo request, id 9896, seq 0, length 8
04:00:46.559346 ARP, Request who-has 172.16.155.2 tell 172.16.155.150, length 28
04:00:46.559608 ARP, Reply 172.16.155.2 is-at 00:50:56:e4:e6:af, length 46
04:00:47.449237 IP 172.16.155.150 > 172.16.1.14: ICMP echo request, id 44063, seq 0, length 8
04:00:47.449506 IP 172.16.155.150 > 172.16.1.15: ICMP echo request, id 24681, seq 0, length 8
04:00:47.449829 IP 172.16.155.150 > 172.16.1.16: ICMP echo request, id 19344, seq 0, length 8
04:00:47.451613 IP 172.16.155.150 > 172.16.1.17: ICMP echo request, id 46601, seq 0, length 8





 
如果你使用 tcpdump 监控流量,而 Nmap 对本地网络上的主机执行 ping 扫描。 在以下屏幕截图中,你可以看到 Nmap 利用 ARP 请求来识别本地段范围内的主机:
root@kali:~# tcpdump not tcp port 22  -n 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:03:04.668788 ARP, Request who-has 172.16.155.2 tell 172.16.155.150, length 28
04:03:04.669356 ARP, Request who-has 172.16.155.3 tell 172.16.155.150, length 28
04:03:04.670004 ARP, Request who-has 172.16.155.4 tell 172.16.155.150, length 28
04:03:04.670256 ARP, Reply 172.16.155.2 is-at 00:50:56:e4:e6:af, length 46
04:03:04.670459 ARP, Request who-has 172.16.155.5 tell 172.16.155.150, length 28
04:03:04.671149 ARP, Request who-has 172.16.155.6 tell 172.16.155.150, length 28
04:03:04.671374 ARP, Request who-has 172.16.155.7 tell 172.16.155.150, length 28
04:03:04.671729 ARP, Request who-has 172.16.155.8 tell 172.16.155.150, length 28
04:03:04.672124 ARP, Request who-has 172.16.155.9 tell 172.16.155.150, length 28
工作原理
 
Nmap 已经高度功能化,需要很少甚至无需调整就可以运行所需的扫描。 底层的原理是一样的。 Nmap 将 ARP 请求发送到一系列 IP 地址的广播地址,并通过标记响应来识别活动主机。 但是,由于此功能已集成到 Nmap 中,因此可以通过提供适当的参数来执行。