第四章 主动信息收集
本篇文章所讲内容:
4.1 主动信息收集的原理
4.2 基于 ping 命令的探测
4.3 基于 Nmap 的扫描方式
4.4 实战 1-使用 scapy 定制数据包进行高级扫描
4.5 实战 2-僵尸扫描
4.1 主动信息收集的原理
4.1.1 主动信息收集的特点
1.直接与目标系统交互通信
凡是我们使用工具,去探测目标的,都属于主动方式,主动比较危险,容易被封IP,被动比较安全一些,一般来讲,主动和被动需要结合在一起使用
2.无法避免留下访问的痕迹,万一留下来了,你是需要负责任的
3.使用受控的第三方电脑进行探测,使用代理或已经被控制的机器,做好被封杀的准备
目标系统,根据系统的日志检控记录,如果想溯源找到你,也是可以找到你的,只是难易程度,不要保有侥幸的心理,我们在渗透测试过程,可以使用代理
4.扫描发送不同的探测,根据返回结果判断目标状态
我们可以通过wireshark抓包,看扫描器,发送了那些数据包,得到了那些响应,去分析它的原理
4.1.2发现目标主机的过程
目标主机,从渗透测试的角度来讲,它首先是存活的,如果它关机了,那我们就访问不到了,所以它是开机状态的,能访问到的,目标可达的
1、识别存活主机,发现潜在的被攻击目标
你拿到一个IP,你ping都ping不通,你拿任何的扫描器,都没有返回结果,我们就无法去渗透
拿到主域名,我们要去做信息收集,收集它的子域名,就是二级、三级,多收集几层,这些收集完之后
2、根据这些主域和子域,输出他们的IP地址列表,或者IP地址段,有些主域和子域,可能在旁站,就是同一个IP,也可能在一个C段,有的把主站和子站,放在一台服务器上,一个IP。或者c段来一个,在一个局域网内,一个网段内的服务器
比如,我用fofa拿到服务器的IP地址,通过nmap、fofa或者其它工具,拿到它的旁站、C段。如果主站攻击不进去,我们可以从子站、旁站下手,一般主站防守都比较严密,子站可能稍微弱一些,如果在一个C段或者子站,拿到服务器的权限,横向移动,拿到主站的权限,内网渗透。网络安全涉及到内网
3、拿到IP地址之后,使用二、三、四层进行探测发现,进一步信息收集
4.2 基于 ping 命令的探测
4.2.1 PING
死亡之ping,能把一台服务器,ping死,相当于,发送大量数据包
PING 命令是我们常用的判断主机之间网络是否畅通,同样也是能判断我们的目标主机是否存活
ping不通,不一定代表不存活,也有可能禁ping
Traceroute 命令可以对路由进行跟踪
traceroute youku.com
每经过一个网络设备,就会返回一个信息,有的显示**,就是不让你看,防火墙过滤了每一个人所处的网络位置不一样,它所经过的路由也是不一样的
然而 PING 命令也延伸出了很多其他的命令,如 ARPING、FPING、HPING 等
4.2.2 ARPING
1、ARP 协议概述:ARP 协议是“Address Resolution Protocol”(地址解析协议)的缩写。计算机通过 ARP 协议将 IP 地址转换成 MAC 地址。
2、ARP 协议工作原理
在以太网中,数据传输的目标地址是 MAC 地址,一个主机要和另一个主机进行直接通信,必须要知道目标主机的 MAC 地址。
计算机使用者通常只知道目标机器的 IP 信息,“地址解析”就是主机在发送帧前将目标 IP 地址转换成目标 MAC 地址的过程。
简单地说,ARP 协议主要负责将局域网中的 32 位 IP 地址转换为对应的 48 位物理地址,即网卡的MAC 地址,保障通信顺利进行。
arp 工作原理如下:
arp欺骗是为了中间人攻击
3、使用 arping 命令查看局域网中的 IP 是否有冲突
局域网中,有相同的IP地址,叫IP冲突
arping 192.168.42.2 -c 1
arping一次只能ping一个IP地址
例 1:对 arping 命令的结果进行筛选,只取 ip 地址
探测的时候,我们关注的是存活主机,就是IP地址
arping -c 1 192.168.1.1 | grep "bytes from" | cut -d" " -f 5 | cut -d "(" -f 2 | cut -
d ")" -f 1
在linux里面,有一个筛选过滤,叫grep。管道符,把结果输送出去。
arping 192.168.42.2 -c 1 | grep "bytes from"
cut以空格符为判断,取第五个字符
arping 192.168.42.2 -c 1 | grep "byte from" | cut -d " " -f 5
以左括号为间隔
arping 192.168.42.2 -c 1 | grep "byte from" | cut -d " " -f 5 | cut -d "(" -f 2
arping 192.168.42.2 -c 1 | grep "byte from" | cut -d " " -f 5 | cut -d "(" -f 2 | cut -d ")" -f 1
我们发现 arping 只能对一个 ip 地址进行判断,这个时候我们就需要通过脚本来实现对网络的自动扫描,探测那些主机是存活的。
vim arping1.sh
#!/bin/bash
if [ "$#" -ne 1 ];then #判断用户是否输入了至少一个参数如果没有输入参数,输出提示信息并退出echo "Usage - ./arping.sh [interface]"echo "Excample - ./arping.sh eth0"echo "Example will perform an ARP scan of the local subnet to which eth0 is
assigned"exit
fiinterface=$1 #将用户输入的参数传递给 interface 变量
prefix=$(ifconfig $interface | grep "inet " | cut -d 't' -f 2 | cut -d '.' -f 1-3) #获取本机 IP 地址网段 192.168.42
#对整个网段进行 arping
for addr in $(seq 1 254);do arping -c 1 $prefix.$addr | grep "bytes from" | cut -d" " -f 5 | cut -d "(" -f 2 | cut -d")"
-f 1
done
粘贴完成后检查有没有粘贴错误的地方,按 esc 输入 :wq 保存退出
给我们写好的脚本加上执行权限,我们 linux 中可执行程序需要拥有执行权限才可以直接执行
chmod +x arping1.sh
每个人的网段不一样,它想探测内网,所有的存活主机,得先拿到内网的网段,拿到网段之后,得先知道这个网段里面,有多少台主机
ifconfig eth0 | grep "inet " | cut -d 't' -f 2 | cut -d '.' -f 1-3
例 2:模拟 IP 地址冲突
再开一台 虚拟机kali,把 IP 地址改成 192.168.42.2
ifconfig eth0 192.168.42.2
执行我们的脚本,进行扫描
./arping1.sh eth0 #查看局域网中是否存在 arp 攻击
如果在内网当中,出现其它的IP地址,就说明有人进来了,出现两个一样的 IP 地址,就是有 ARP 攻击了,为了安全,可以把网给拔了
4、使用 netdiscover 进行被动方式探测局域中存活的机器
netdiscover 是一个主动/被动的 ARP 侦查工具。使用 netdiscover 工具可以在网络上扫描 IP 地址,检查在线主机或搜索为它们发送的 ARP 请求。
主动模式:
主动模式顾名思义就是主动的探测发现网络内主机,但是这种方式往往会引起网络管理员的注意
netdiscover -i eth0 -r 192.168.42.0/24
参数:-i device: your network device
-r range: scan a given range instead of auto scan. 192.168.42.0/24,/16,/8
很多工具,都可以探测局域网主机,是否存活,我们可以都去了解,都去尝试,看那个好用,就用那个
被动模式:
被动模式的方法更加隐蔽,但是速度会比较慢,网卡被设置为混杂模式来侦听网络内的 arp 数据包进行被动式探测,这种方式就需要网络内设备发送 arp 包才能被探测到。
netdiscover -p
参数:-p passive mode: do not send anything, only sniff
4.3.3 HPING3
hping3 是一个命令行下使用的 TCP/IP 数据包组装/分析工具,通常 web 服务会用来做压力测试使用,也可以进行 DOS 攻击的实验。同样 Hping 只能每次扫描一个目标。
例:使用 HPING 进行压力测试
hping3 -c 1000 -d 120 -S -w 64 -p 80 --flood --rand-source xxx.cn
-c 1000 = 发送的数据包的数量。
-d 120 = 发送到目标机器的每个数据包的大小。单位是字节
-S = 只发送 SYN 数据包。
-w 64 = TCP 窗口大小。
-p 80 = 目的地端口(80 是 WEB 端口)。你在这里可以使用任何端口。
–flood = 尽可能快地发送数据包,不需要考虑显示入站回复。洪水攻击模式。
–rand-source = 使用随机性的源头 IP 地址。这里伪造的 IP 地址,只是在局域网中伪造。通过路由器后,还会还原成真实的 IP 地址。
一般DDOS攻击,源IP是伪造的,瞬间发送大量的连接攻击请求,大量的占用网络服务器的资源,每一个都会发送二次握手,但因为源IP是伪造的,收不到返回的确认包,如果网络带宽不大的情况下,瞬间网络资源耗尽,网站就打不开了
Ctrl+c 停止后即可访问网站。
大量的数据包,经过路由器,路由器抗不了,你以为你把网络,干瘫了,其实是把自己干废了
4.3.4 使用 FPING 查看局域中运行了哪些机器
Fping 就是 ping 命令的加强版他可以对一个 IP 段进行 ping 扫描,而 ping 命令本身是不可以对网段进行扫描的。
fping -ag 192.168.42.0/24 > fping.txt
-a 表示只显示存活主机
-g 表示对地址段进行扫描如果不加可以对某个 IP 进行扫描
>fping.txt 表示将扫描的结果重定向到 fping.txt ,原因是如果扫描一个网段的话输出结果是非常多的,我们输出重定向到文件中只会获得存活的主机信息。
cat fping.txt
4.3 基于 Nmap 的扫描方式
4.3.1 Nmap 的基本扫描方式
Nmap,也就是 Network Mapper,最早是 Linux 下的网络扫描和嗅探工具包。nmap的核心功能是端口探测,除此之外,可以进行存活主机识别、操作系统识别,服务识别、漏洞识别、代码审计、设备发现等等
例:扫描 192.168.42.0 这个网段
nmap -sn 192.168.42.0/24
-sn表示只进行ping扫,不进行端口探测
外网也可以扫描,拿到一台外网服务器之后,可以扫描C段
4.3.2 使用 nmap 进行半连接扫描
nmap 扫描类型主要有 TCP 的全连接扫描(会在被扫描机器留下记录),半连接扫描(不会留下记录)
nmap -sS 192.168.42.138 -p 80,81,21,25,110,443
-sS 表示使用 SYN 进行半连接扫描
4.3.3 使用 nc 扫描端口
nc 是 netcat 的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具
nc 的作用:
-
实现任意 TCP/UDP 端口的侦听,nc 可以作为 server 以 TCP 或 UDP 方式侦听指定端口
-
端口的扫描,nc 可以作为 client 发起 TCP 或 UDP 连接
-
机器之间传输文件
-
机器之间网络测速
nc 参数:
-nv 表示我们扫描的目标是个 IP 地址不做域名解析
-w 表示超时时间
-z 表示进行端口扫描
nc -nv -w 1 -z 192.168.42.138 1-100
4.4 实战 1-使用 scapy 定制数据包进行高级扫描
4.4.1 scapy 概述
Scapy 是一个可以让用户发送、侦听和解析并伪装网络报文的 Python 程序。这些功能可以用于制作侦测、扫描和攻击网络的工具。
4.4.2 scapy 定制 ARP 协议
scapy
如果提示 INFO 找不到某个模块可以使用 apt install python3-pyx
安装时我们输入 exit() 退出 scapy
exit()
apt install python3-pyx
scapy
我们使用 ARP().display()来查看 ARP 函数的用法
ARP().display()
hwtype= 0x1 硬件类型ptype= 0x800 协议类型hwlen= 6 硬件地址长度(MAC)plen= 4 协议地址长度(IP)op= who-has who-has 标识arp的数据类型,1表示请求包,2表示应答包hwsrc= 00:0c:29:6a:cf:1d 源 MAC 地址psrc= 192.168.1.53 源 IP 地址hwdst= 00:00:00:00:00:00pdst= 0.0.0.0 向谁发送查询请求
例:定义向 192.168.42.138发送 arp 请求的数据包
sr1 函数作用:sr1 函数包含了发送数据包和接收数据包的功能。
sr1(ARP(pdst="192.168.42.138"))
exit()
注:发现源地址 psrc=192.168.42.138,说明已经收到网关的应答包。
向不存在的IP地址,发送ARP包,会一直闪点,因为他没有收到应答包,地址不存在,无应答
scapy
sr1(ARP(pdst="192.168.42.133"))
如果IP地址存在,但还是无应答,可能不通或者在路由器里面,禁止arp包
4.4.3 scapy 定制 PING 包
Scapy 的功能是非常强大的,我们前面只是简单的介绍了他的 ARP 探测方式,下面我们简单讲一下
IP/ICMP 的方式
下面两条命令可以直接看到我们的数据包格式
IP().display()
###[ IP ]### version= 4 版本:4,即 IPv4ihl= None 首部长度tos= 0x0 服务len= None 总长度id= 1 标识flags= frag= 0 标志ttl= 64 生存时间proto= hopopt 传输控制协议 IPv6 逐跳选项chksum= None 首部校验和src= 127.0.0.1 源地址dst= 127.0.0.1 目的地址
ICMP().display()
###[ ICMP ]### type= echo-request 类型,标识 ICMP 报文的类型code= 0 代码chksum= None 校验和id= 0x0 标识seq= 0x0
注: IP()生成 ping 包的源 IP 和目标 IP ,ICMP() 生 ping 包的类型。使用 IP()和 ICMP()两个函数,可以生成 ping 包,进行探测。
思路:
1、修改 IP 包头的 dst,也就是我们的目的地址
2、拼接上 ICMP 的数据包类型
3、使用 sr1()进行发送数据包并接收数据包
sr1(IP(dst="192.168.42.138")/ICMP(),timeout=1)
注:大家复制命令时,>>>提示符和命令之间不能有空格。
sr1(IP(dst="192.168.42.136")/ICMP(),timeout=1)
4.4.4 scapy 定制 TCP 协议 SYN 请求
tcp 三次握手过程中 flags 的标记
#查看 TCP()函数的用法
TCP().display()
###[ TCP ]### sport= ftp_data TCP 源端口dport= http TCP 目的端口seq= 0 32 位序号ack= 0 32 位确认序号dataofs= None 4 位首部长度 reserved= 0 保留 6 位flags= S 标志域,紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FINwindow= 8192 窗口大小chksum= None 16 位校验和urgptr= 0 优先指针options= [] 选项
sr1(IP(dst="192.168.42.138")/TCP(flags="S",dport=80),timeout=1)
flags=”S”表示 SYN 数据包
dport=80 表示目标端口 80
我们到一个 flags=SA 的数据包。SA 标志即 SYN+ACK。我们收到服务器 tcp 三次握手中的第二个包,能收到回应,表示端口开放。
如果flag=RA,代表rst+ ack,断开了,端口不存在
注:这种基于 tcp 的半链接扫描,更隐密,更不容易被发现。
我们在端口扫描的时候,没有必要这样大废召章,做为了解就可以了
4.5 实战 2-僵尸扫描
在做渗透测试的时候,尽可能去隐藏自己是最好的,因为目标如果有防御,一不小心把你封了,你接下来的工作将怎么进行
有一些逻辑漏洞,通过扫描器是扫描不出来的,关键在于你的思维,你能不能想到这一点,CTF特别锻炼你的思维,而且考验你的综合能力
CTF不能一味的去刷题目,每做一道题,回过头来,复盘,把整个思路去写出来,WP,在这整个的过程中,有那些知识点是你的盲区,然后有重点的去补,整个都OK了,这就是你学到的,下次有点不太一样,但是你已经学到了
做渗透最重要是什么? 思维! 学僵尸扫描实用性不大,但是僵尸扫描的这个种思维值得你学习。
4.5.1 僵尸扫描概述
僵尸主机:僵尸主机是指感染僵尸程序病毒,从而被黑客程序控制的计算机设备。但是僵尸扫描中的僵尸主机指得是一个闲置的操作系统(这里的闲置是指主机不会主动和任何人通信),且此系统中 IP 数据包中 ID 是递增的。
一台机器只要联网了,即使不打开任何应用程序,不做任何操作,他在后台运行的程序,肯定会向后台发送数据包,
IPID:指的是通信过程中,IP 数据包中的 ID。
僵尸扫描拥有极高的隐蔽特性,但是实施条件苛刻。
- 目标网络可伪造源地址进行访问
- 选择僵尸机,僵尸机需要在互联网上是一个闲置的操作系统,需要系统使用递增的 IPID,比如XP 系统。
互动:
nmap 和 ping 都会直接和目标机器接触。 如何可以不直接目标主机接触,还可以探测出目标主机是否开放端口?
多级跳,多个肉鸡和多个跳板机,一个个连上去,然后对目标进行探测
前提是:你在公网或局域网上先拿到了肉机。 僵尸扫描可以不拿到肉机权限,只要对方的 IPID 是自增长上的就可以了。
4.5.2 僵尸扫描原理
1、端口开放状态扫描原理:
TCP 三次握手发包过程中,SYN/ACK 是第二次包。
第一步:参考图 1。
(1)、攻击者向僵尸机发送 SYN/ACK 确认包。
(2)、僵尸主机返回我们 RST 数据包关闭链接,RST 数据包中包含了 IPID 信息。假设 IPID=X
注:三次握手的第一个包是 SYN,目标主机收到 SYN 才会应答 SYN/ACK,因为僵尸主机没有向我
们发送 SYN 请求。所以僵尸主机返回我们 RST 数据包关闭链接。
第一步中,黑客的收获是:知道了僵尸主机的 IPID。
第二步:参考图 2。
(1)、攻击者修改 IP 包头的 SRC 字段为僵尸主机的 IP,伪装成僵尸主机给目标主机发 SYN 请求。
(2)、目标主机收到请求,如果端口是开放的就会返回给僵尸主机一个 SYN/ACK 的数据包。
(3)、僵尸主机收到目标主机发来的 SYN/ACK 确认包,因为僵尸主机没有给你发 SYN 请求。所以僵尸主机给目标主机返回了一个 RST 数据包。这个数据包表示关闭连接。此僵尸主机对外发出一个数据包,所以僵尸主机的 IPID 值+1。此时 IPID 值为 X+1。
第二步中,黑客的收获是:如果目标主机端口开放,让僵尸主机的 IPID+1
第三步:参考图 3。
(1)、攻击者再次向僵尸主机发送 SYN/ACK 确认包
(2)、僵尸主机同样向攻击者返回了一个 RST 数据包,此僵尸主机对外又发出一个数据包,所以僵尸主机的 IPID 值再+1。此时 IPID 值为 X+2。
第四步:计算 3 次通信过程中的 IPID 值。
(1)、攻击者查看僵尸主机返回的数据包中 IPID 值为 X+2。
(2)、攻击者对比在第一步中的 IPID 值 X,发现增加了 2。
结论:肯定目标主机和僵尸主机通信了,能通信,就说明目标主机端口是开放的。
如果在我们发送完第一个数据包的时候,僵尸机又向别的服务器发送数据包了,回过头来,这个IPID不是加1加2的问题,而是加n的问题,所以僵尸主机一定要够闲置
2、端口关闭状态扫描原理:
第一步:参考图 1。
(1)、攻击者向僵尸机发送 SYN/ACK 确认包。
(2)、僵尸主机返回我们 RST 数据包关闭链接,数据包中包含了 IPID 信息。假设 IPID=X
注:三次握手的第一个包是 SYN,目标主机收到 SYN 才会应答 SYN/ACK,因为僵尸主机没有向我
们发送 SYN 请求。所以僵尸主机返回我们 RST 数据包关闭链接。
第二步:参考图 2。
(1)、攻击者修改 IP 包头的 SRC 字段为僵尸主机的 IP,伪装成僵尸主机给目标主机发 SYN 请求。
(2)、目标主机收到请求,如果端口是关闭的。就会返回给僵尸主机一个 RST 的数据包。
(3)、僵尸主机收到目标主机发来的 RST 包,关闭链接不对外发送数据包。此僵尸主机的 IPID 值
还是 X。
第三步:参考图 3。
(1)、攻击者再次向僵尸主机发送 SYN/ACK 确认包
(2)、僵尸主机同样向攻击者返回了一个 RST 数据包,此僵尸主机对外发出一个数据包,所以僵尸主机的 IPID 值+1。此时 IPID 值为 X+1。
第四步:计算 3 次通信过程中的 IPID 值。
(1)、攻击者查看僵尸主机返回的数据包中 IPID 值为 X+1。
(2)、攻击者对比在第一步中的 IPID 值 X,发现增加了 1。
结论:肯定目标主机和僵尸主机没有通信了。没能通信,就说明目标主机端口是关闭的。
以上就是僵尸扫描原理
4.5.3 僵尸扫描-实战
实验拓扑图:
一台 XP 的虚拟机为僵尸主机,IP 地址为 192.168.42.138 并关闭 XP 系统的防火墙
192.168.42.145 为目标主机,确认 sshd 服务能够正常访问。
XP 安装完后,要关闭防火墙:
第一步:给僵尸主机发送的 SYN/ACK 数据包,将返回的数据包存入 rz1
rz1=sr1(IP(dst="192.168.42.138")/TCP(dport=445,flags="SA"))
命令详解:
rz1 表示定义了一个变量来接受我们返回的数据包
dst 表示我们的僵尸主机 IP
dport=445 表示我们向僵尸主机的 445 端口发送数据包,XP 主机的 445 端口一般都是开启状态
flags=“SA”表示发送 SYN/ACK
查看一下 IPID
display()表示查看变量中的内容。我们只需要查看 IP 下面的 ID 字段即可
rz1.display()
第二步:攻击者修改 IP 包头的 SRC 字段为僵尸主机的 IP,伪装成僵尸主机给目标主机发 SYN 请求。
rt=sr1(IP(src="192.168.42.138",dst="192.168.42.137")/TCP(dport=23),timeout=1)
命令详解
rt 表示定义了一个变量来接受我们返回的数据包
src 表示伪造成僵尸主机的 IP 地址
dst 表示将数据包发送目标主机
dport 目标端口
timeout 超时时间
第三步:攻击者再次向僵尸主机发送 SYN/ACK 确认包,获得 IPID
rz2=sr1(IP(dst="192.168.42.138")/TCP(dport=445,flags="SA"))
实验结果查看
display()表示查看变量中的内容。我们只需要查看 IP 下面的 ID 字段即可
rz1.display()
rz2.display()
即 258-256=2 表示端口开放
这三条命令,我们在同一个界面里面,分批次去执行
我们测试端口不开放的情况,我们将第二步的端口修改成 222 ,因为 222 肯定是没有开启的端口
rz1=sr1(IP(dst="192.168.42.138")/TCP(dport=445,flags="SA"))
rt=sr1(IP(src="192.168.42.138",dst="192.168.42.137")/TCP(dport=2222),timeout=1)
rz2=sr1(IP(dst="192.168.42.138")/TCP(dport=445,flags="SA"))
rz1.display()
rz2.display()
我们可以看到 549 、550 结果为+1 即端口为关闭状态
exit() #退出
僵尸扫描分两步,第一步找到僵尸主机,第二步使用僵尸主机进行僵尸扫描
4.5.4 使用 nmap 进行僵尸扫描
1、扫描 192.168.42.0 网段中某些机器可以作为僵尸主机,外网也可以,不一定要内网,我只是在内网进行演示
nmap 192.168.42.0/24 -p1-1024 --script=ipidseq.nse > a.txt
-p1-1024 #指定扫描的端口范围为 1 到 1024。只扫描常用端口就可以了
–script=ipidseq.nse 判断主机是否可以当做僵尸主机
vim a.txt #在文档中查找关键字 Incremental
Incremental 英 [ˌɪnkrɪˈmɛnt(ə)l] 增量式;增量备份;增量的;渐进的;增量法
表示主机 IPID 为递增,可以做为僵尸主机。
nmap 192.168.42.138 -sI 192.168.42.137 -p1-100
-sI 参数表示指定僵尸主机进行扫描目标主机。注意是大写的 I
Zombie是僵尸的意思,IPID自增不一定就能够做僵尸主机,还要足够闲置
nmap 192.168.42.137 -sI 192.168.42.138 -p1-100
这台192.168.42.138做不了僵尸主机