信息收集之主动信息收集(一)

信息收集之主动信息收集(一)

主动信息收集:

  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 

 

  

  

  

posted @ 2019-04-06 12:39  雨中落叶  阅读(1960)  评论(0编辑  收藏  举报