信息收集之主动信息收集(一)
主动信息收集:
1.主机发现
1.1二层主机发现
1.2三层主机发现
1.3四层主机发现
2.端口扫描
2.1TCP端口扫描
2.2UDP端口扫描
2.3僵尸扫描
3.服务识别
3.1 python socket
3.2 dmitry -pb
3.3 nmap
3.4 amap -B
4.操作系统识别
4.1 nmap
4.2 TTL
主动信息收集
直接与目标系统交互通信
使用受控的第三方电脑进行探测
使用代理或者已经被控制的主机
使用噪声迷惑目标,淹没真实的探测流量 #伪造不同的IP给目标发送数据,并把真实的源IP的发包速率调低,以迷惑目标,让目标认为是别的IP在攻击它
扫描:发送不同的探测,根据返回结果判断目标状态
主机发现--二层发现
原理:使用ARP协议,在网段内进行广播,看是否有回包
1.arping实现二层主机发现
arping实现了简单的二层发现,由于没有ip层的参与,所以是不可路由的。
优点是速度快,准确性高
缺点是不可路由,无法发现局域网以外的主机,只能发现同一网段内的主机
arping 192.168.10.200 -c 1
arping 192.168.10.200 -w 2
arping 192.168.10.200 -c 1 |grep "Unicast" |cut -d' ' -f4
shell脚本实现arping主机发现
#!/bin/bash
#该脚本用于实现arping扫描整个网段
if [ "$#" -ne 1 ]
then
echo "用法:$0 eth0"
exit
fi
interface=$1
net=$(ifconfig eth1|grep "inet addr" |awk '{print $2}'|awk -F":" '{print $2}'|cut -d "." -f1-3)
for ((i=1;i<=254;i++))
do
arping -c 1 -I $interface $net.$i|grep "Unicast"|cut -d ' ' -f 4
done
2.nmap实现二层主机发现
nmap 192.168.10.200 -sn # -sn只进行主机发现,不进行端口扫描
创建IP字典,nmap -iL iplist.txt -sn #扫描特定IP列表的IP,只进行主机发现
3.Netdiscover 专用于二层发现
不仅支持主动arp检测,还支持被动的arp检测,即把网卡设置为混杂模式,收取所有局域网内的arp广播数据包,从而判断存活的ip
主动模式扫描主机 #主动arp容易触发报警
netdiscover -i eth0 -r 192.168.10.0/24 # -i指定所要侦听的网卡,-r指定ip段
被动模式嗅探存活的主机
netdiscover -p 开启监听,然后在另一个窗口,ping目标主机
此时就可以看到netdiscover监听到主机
4.Scapy实现二层主机发现
给目标发送一个ARP数据包
收到响应,说明目标主机存活
主机发现--三层发现
原理:使用IP/ICMP协议
优点:相对于二层可以路由
缺点:相对于二层速度慢,经常被防火墙过滤掉
1.ping 实现三层主机发现
ping 192.168.10.200 -c 2
ping 192.168.10.200 -c 1 |grep 'bytes from' |cut -d' ' -f 4|cut -d':' -f 1
2.Scapy实现三层主机发现
给目标发送一个ICMP包,收到响应,说明目标主机存活
3.fping实现三层主机发现
4.hping3实现三层主机发现
hping3 192.168.10.200 --icmp -c 2
主机发现--四层发现
原理:使用TCP/UDP协议
优点:可路由并且可靠,不太可能被防火墙过滤掉
缺点:基于状态过滤的防火墙可能过滤扫描
虽然这里使用到了端口发现,但是四层发现阶段并不对端口进行解析,而是通过端口进行对ip是否存活的判断
TCP发现:直接发送ACK数据包,一般来说状态为up的目标主机会返回一个RST数据包以终止这个不正常的TCP链接。也可以发送正常的SYN数据包,若果目标主机返回SYN/ACK或者SRT数据包,都可以证明目标主机为up状态。
UDP发现:如果目标ip为up状态且UDP目标端口为关闭状态,目标主机就会返回一个目标端口不可达的数据包,这就可以证明目标主机是up状态(无论目标ip是down状态还是目标ip为up只要目标端口为开放状态,都不会有任何数据包返回,这是UDP的特点) #可以利用UDP的这一特点发送一个数据包给一个目标主机不可能开放的端口,如果收到icmp port-unreachable,说明目标主机存活。
Scapy实现四层主机发现
TCP
1.发送一个ack包给目标主机,正常情况下up状态的目标ip会返回一个SRT数据包
2.查看目标主机返回的包,可以看到有一个RET包,说明目标主机存活
UDP
给目标主机的一个不可能开放的UDP端口发送数据,得到(icmp port-unreachable),说明目标主机存活
查看返回的数据包
二、端口扫描
TCP端口扫描 #基于连接的协议,三次握手
TCP扫描有三种类型:全连接扫描,隐蔽扫描,僵尸扫描
隐蔽扫描:发送完SYN数据包以及收到SYN/ACK数据包后不再发送SCK数据包,由于没有建立完整的TCP连接,所以在目标主机的应用日志中不会有扫描的记录,只会在ip层有记录,因而较为隐蔽。
僵尸扫描:条件较为苛刻。首先要能够进行地址欺骗,其次僵尸机没有什么网络流量产生,最后僵尸机的ipid必须是递增的
所有的TCP扫描方式都是基于三次握手的变化来判断目标的状态
TCP端口扫描
1.nmap实现TCP端口扫描
nmap -sS 192.168.10.200 -p 80,21,23,25
nmap -sS -iL iplist.txt -p 80,21,23
2.Scapy实现TCP端口扫描
给目标主机发送一个SYN数据包,看是否收到响应
3.dmitry实现端口扫描
dmitry -p 192.168.10.200 #默认150个常见的端口
dmitry -p 192.168.10.200 -o scanport
python脚本实现tcp端口扫描
#!/usr/bin/python
from scapy.all import *
if len(sys.argv)!=2:
print("error,use example:./scanhost.py 192.168.10.0")
sys.exit()
ip=str(sys.argv[1])
net=ip.split(".")[0]+"."+ip.split(".")[1]+"."+ip.split(".")[2]+"."
for addr in range(120,140):
response=sr1(IP(dst=net+str(addr))/TCP(dport=22,flags="A"),timeout=0.1,verbose=0)
try:
if (response[TCP].flags) =="R":
print(net+str(addr)+"is up!")
except:
pass
运行效果如下:
僵尸扫描:
1.确定僵尸机
1.1首先攻击者寻找僵尸主机,先给僵尸机目标发送一个sys/ack数据包,收到僵尸机回复一个RST数据包并且IPID等于x
1.2等一段时间再给僵尸机目标发送一个sys/ack数据包,收到僵尸机回复一个RST数据包,并且带有IPID值,如果IPID值为x+1,说明僵尸目标可以当成僵尸机,否则继续寻找别的僵尸目标
2.确定完僵尸机之后,便开始僵尸扫描
2.1向僵尸机发送SYN/ACK数据包,僵尸机会返回一个RST数据包,记录下ipip为y
2.2向目标主机发送SYN数据包(原地址伪造成僵尸机)
2.3若目标主机端口开放,则向僵尸机发送SYN/ACK数据包
2.3.1 僵尸机收到SYN/ACK数据包,则向目标主机发送RST数据包,此时僵尸机ipid为y+1
2.3.2攻击方向僵尸机发送SYN/ACK数据包,僵尸机返回一个RST数据包,此时ipid为y+2
2.4若目标主机端口关闭,则向僵尸机发送RST数据包,此时僵尸机不会产生任何数据包
2.4.1攻击方向僵尸机发送SYN/ACK数据包,僵尸机返回一个RST数据包,此时ipdi为y+1
通过攻击方从僵尸机接收到的两个RST数据包的ipid可以判断目标主机的目标端口是否开放
目标端口开放:
目标端口不开放:
僵尸扫描实验:
实验环境:
Kali(攻击者):192.168.10.128
Linux 6.5 (目标):192.168.10.200
Win7(僵尸机):192.168.10.129
Scapy实现:
下图说明目标主机的21号端口是开放的
Nmap实现:
1.首先寻找僵尸目标
nmap -p445 192.168.10.0/24 --script=ipidseq.nse
2.开始僵尸扫描
nmap 192.168.10.200 -sI 192.168.10.129 -Pn # -sI参数指定僵尸机 -Pn 跳过主机发现
Python脚本实现僵尸扫描
#/usr/bin/python
# -*- coding: utf-8 -*-
from scapy.all import *
import time
#查找合适的僵尸机,根据IPID来判断目标僵尸是否是个好的僵尸机
def IsZombie(zIP):
response1=sr1(IP(dst=zIP)/TCP(dport=445,flags="SA"),timeout=1,verbose=0)
time.sleep(1)
response2=sr1(IP(dst=zIP)/TCP(dport=445,flags="SA"),timeout=1,verbose=0)
if response1[IP].id+1==response2[IP].id:
print "this is a very good zombie!"
#开始僵尸扫描
targetIP=raw_input("请输入目标的IP:")
targetPort=int(raw_input("请输入要扫描目标机的端口:"))
scan(zIP,targetIP,targetPort)
else:
print "this is not a good zombie!"
#定义扫描函数
def scan(zIP,targetIP,targetPort):
#给僵尸机发生第一个SYN/ACK包
rz1=sr1(IP(dst=zIP)/TCP(dport=445,flags="SA"),timeout=1,verbose=0)
#给目标主机发送一个伪造地址的SYN数据包
sr1(IP(dst=targetIP,src=zIP)/TCP(sport=445,dport=targetPort,flags="S"),timeout=1,verbose=0)
#给僵尸机发生第二个SYN/ACK包
rz2=sr1(IP(dst=zIP)/TCP(dport=445,flags="SA"),timeout=1,verbose=0)
if rz1[IP].id+2==rz2[IP].id:
print "目标targetIP的端口targetPort is UP"
else:
print "目标targetIP的端口targetPort is closed"
ip=raw_input("请输入目标僵尸的IP:")
IsZombie(ip)
运行效果如下:
UDP端口扫描
Scapy 实现UDP端口扫描
端口关闭: icmp port-unreachable
端口开放:没有回包
下图给目标主机udp53端口发送数据包,响应icmp port-unreachable,说明目标相应的端口关闭
在目标主机开启UDP 53端口,然后测试,下图可以看到没有返回数据包,说明目标端口UDP53是开放的
Nmap实现UDP端口扫描
nmap 192.168.10.200 -sU -p 53
Python脚本实现UDP端口扫描
#!/usr/bin/python
from scapy.all import *
if len(sys.argv)!=2:
print("error,use example:./scanhost.py 192.168.10.0")
sys.exit()
ip=str(sys.argv[1])
net=ip.split(".")[0]+"."+ip.split(".")[1]+"."+ip.split(".")[2]+"."
for addr in range(120,140):
response=sr1(IP(dst=net+str(addr))/UDP(dport=5555),timeout=0.1,verbose=0)
try:
if (response[TCP].flags) =="R":
print(net+str(addr)+"is up!")
except:
pass
三、banner捕获、服务扫描与识别
banner 可能是管理员伪造的
软件开发商
软件名称
服务类型
版本号--直接发现已知的漏洞和弱点
连接建立后直接获取banner
另类服务识别方法
特征行为和响应字段
不同的响应可用于识别底层操作系统
1.通过python socket获得目标服务的banner
2.通过dmitry -pb获得目标服务的banner信息
dmitry -pb 192.168.10.200
3.通过nmap获得目标服务的banner信息
nmap -sT 192.168.10.200 -p21,22,53 --script=banner
4.通过amap获得banner信息 #专门用于发现开放端口后的服务的工具
amap -B 192.168.10.200 21
四、操作系统识别
windows:128(65-128) #TTL
linux/unix:64(1-64)
某些unix:255
1.通过ttl值判断操作系统的类型
2.通过nmap -O 识别操作系统的类型
nmap -O 192.168.10.129
---------------------------------------------------------------------------------------------------------------
信息收集之主动信息收集(二):https://www.cnblogs.com/yuzly/p/10658570.html