zoukankan      html  css  js  c++  java
  • 信息收集之主动信息收集(一)

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

    主动信息收集:

      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 

     

      

      

      

  • 相关阅读:
    PHP调用WCF提供的方法
    关于git报 warning: LF will be replaced by CRLF in README.md.的警告的解决办法
    vue中引入mui报Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them的错误
    微信小程序报Cannot read property 'setData' of undefined的错误
    Vue那些事儿之用visual stuido code编写vue报的错误Elements in iteration expect to have 'v-bind:key' directives.
    关于xampp中无法启动mysql,Attempting to start MySQL service...的解决办法!!
    PHP的环境搭建
    新手PHP连接MySQL数据库出问题(Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES))
    手机号码、获得当前时间,下拉框,填写限制
    团队作业(五):冲刺总结
  • 原文地址:https://www.cnblogs.com/yuzly/p/10652516.html
Copyright © 2011-2022 走看看