溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

安全牛學(xué)習(xí)——主機(jī)發(fā)現(xiàn)

發(fā)布時(shí)間:2020-06-16 01:55:01 來(lái)源:網(wǎng)絡(luò) 閱讀:1051 作者:時(shí)間帶 欄目:安全技術(shù)

一、二層主機(jī)發(fā)現(xiàn)

目的:實(shí)現(xiàn)局域網(wǎng)內(nèi)的主機(jī)掃描

1.arping命令掃描主機(jī)

使用kali對(duì)局域網(wǎng)主機(jī)進(jìn)行掃描時(shí)候,arping命令只能挨個(gè)挨個(gè)ip的掃描,下面寫一個(gè)簡(jiǎn)單的腳本實(shí)現(xiàn)批量掃描
root@kal:~/scan# vim arping.sh

#! bin/bash
if [ $# -ne 1 ];then
    echo "Tips Example: ./arping  10.10.10"
    exit
fi

prefix=$1
for i in $(seq 1 254);do
{
    ip=$prefix.$i
    arping $ip -c 1 | grep "reply from" | awk -F" " '{print $4}'
}&   #這里是實(shí)現(xiàn)多進(jìn)程掃描,用時(shí)非常短,可以嘗試不加 & 符號(hào),沒有對(duì)比沒有傷害嘛!
done

缺點(diǎn):不能路由

2. netdiscover掃描

1) root@kal:~# netdiscover -p

  • 隱藏掃描,也就是通過嗅探局域網(wǎng)中主機(jī)的數(shù)據(jù)發(fā)送判斷主機(jī)是否存活,隱蔽性比較好,但是,如果主機(jī)存活,沒有數(shù)據(jù)交互那么這個(gè)命令就掃描不到
    2) root@kal:~/scan# netdiscover -i eth0 -r 10.10.10.0/24

  • 主動(dòng)掃描,-i 設(shè)置網(wǎng)卡,-r 設(shè)置掃描范圍

3.arp構(gòu)造數(shù)據(jù)包請(qǐng)求掃描局域網(wǎng)存活主機(jī)

已經(jīng)寫過,有興趣可以去這里看看 https://blog.51cto.com/13155409/2129980

4.nmap掃描

root@kal:~/scan# nmap -sn 10.10.10.0/24

  • 直接可以實(shí)現(xiàn)批量掃描。-sn表示不掃描端口

二、三層主機(jī)發(fā)現(xiàn)

1. ping命令

root@kal:~/scan# ping 10.10.10.12

  • 同樣只能單個(gè)主機(jī)掃描
    編寫腳本實(shí)現(xiàn)多個(gè)ip掃描

    #!/bin/bash

    if [ $# -eq 0 ];then
    echo "useage ./pinger [/24 network address] "
    echo "Example ./pinger.sh 172.16.15"
    exit
    fi

    prefix=$1
    for addr in $(seq 1 254)
    do
    ping $prefix.$addr -c 1|grep "bytes from"|awk -F" " '{print $4}'|cut -d":" -f 1
    done

##三、 四層主機(jī)發(fā)現(xiàn)##
優(yōu)點(diǎn):

  • 可路由并且結(jié)果可靠

  • 不太可能被防火墻過濾

  • 甚至可以發(fā)現(xiàn)所有端口都被過濾的主機(jī)
    缺點(diǎn):

  • 基于狀態(tài)過濾的防火墻可能過濾掃描

  • 全端口掃描速度慢
    TCP:

  • 未經(jīng)過請(qǐng)求的ACK——RST

  • SYN——SYN/ACK、RST
    UDP:

  • ICMP端口不可達(dá),一去不復(fù)返

1.TCP之ACK掃描

掃描原理:在沒有與目標(biāo)主機(jī)直接建立三次連接時(shí),直接發(fā)送ACK包,那么目標(biāo)主機(jī)就會(huì)返回一個(gè)RST,通過這種方式判斷主機(jī)的存活。不過這個(gè)并不是完全正確的,也存在特例,主機(jī)存在,但是不會(huì)返回RST包。

>>> IP().show()   #交互界面查看IP需要設(shè)置參數(shù)
###[ IP ]### 
    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\

>>> TCP().show()   #交互界面查看TCP所需參數(shù)
###[ TCP ]### 
    sport= ftp_data
    dport= http   #設(shè)置目的端口(判斷主機(jī)存活時(shí),可以隨便設(shè)置,不管目標(biāo)端口是否存在,都會(huì)返回一個(gè)RST)
    seq= 0
    ack= 0
    dataofs= None
    reserved= 0
    flags= S     #將這里設(shè)置成A,表示發(fā)送ACK包
    window= 8192
    chksum= None
    urgptr= 0
    options= {}

發(fā)送一個(gè)存活主機(jī),但是端口不存活的

a1 = sr1(IP(dst='10.10.10.13')/TCP(dport=1111,flags='A'),timeout=1,verbose=0)
a1.show()
###[ IP ]###
version= 4L
..............
\options\
###[ TCP ]###
sport= 1111 #如果端口存活,會(huì)返回相應(yīng)的服務(wù)名稱
dport= ftp_data
................
urgptr= 0
options= {}
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00'
發(fā)送一個(gè)存活主機(jī),端口也存活的
a1 = sr1(IP(dst='10.10.10.13')/TCP(dport=111,flags='A'),timeout=1,verbose=0)
a1.show()
###[ IP ]###
version= 4L
.........
src= 10.10.10.13
dst= 10.10.10.11
\options\
###[ TCP ]###
sport= sunrpc #端口存活的話,會(huì)返回服務(wù)名稱
dport= ftp_data
......
urgptr= 0
options= {}
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00'

發(fā)送給一個(gè)不存活主機(jī)

a1 = sr1(IP(dst='10.10.10.133')/TCP(dport=1111,flags='A'),timeout=1,verbose=0)
WARNING: Mac address to reach destination not found. Using broadcast.
不會(huì)得到任何回應(yīng)

————————————————————————————————

利用腳本實(shí)現(xiàn)ACK的掃描如下:

#!/usr/bin/python
#!encoding=utf-8

from scapy.all import *
import sys
import time

def scanf(ip):
        response = sr1(IP(dst=ip)/TCP(flags='A',dport=80),timeout=0.1,verbose=0) #三層和四層結(jié)合,構(gòu)造包
        if(response):
                print ip

def ip_range(prefix):
        try:
                for addr in range(20):
                        ip = prefix + '.' + str(addr)
                        scanf(ip)
        except KeyboardInterrupt:
                print
                exit

def main():
        try:
                prefix = raw_input('請(qǐng)輸入ip段:')
                prefix = prefix.split('.')[0:3]
                ip = prefix[0]+'.'+prefix[1]+'.'+prefix[2]
                ip_range(ip)
        except KeyboardInterrupt:
                print "\n*********1.重新輸入"
                print "*********2.退出\n"
                choice = int(raw_input('******請(qǐng)輸入您的選擇:'))
                if choice == 1 | choice != 2:
                        print "\n"
                        main()
                else:
                        exit()

if __name__ == "__main__":
        main()

2.UDP掃描

掃描原理: 利用發(fā)送的數(shù)據(jù)包到主機(jī)上,如果主機(jī)的存活并且目標(biāo)端口不存活才會(huì)返回一個(gè)ICMP不可達(dá),否則發(fā)送的UDP就會(huì)一去不復(fù)返(如:目標(biāo)主機(jī)不存在、目標(biāo)主機(jī)存在并且端口開放)
【目標(biāo)主機(jī)存在但是端口不是存活狀態(tài)】

a1 = sr1(IP(dst='10.10.10.12')/UDP(dport=12345),timeout=1)
Begin emission:
...Finished to send 1 packets.
*
Received 4 packets, got 1 answers, remaining 0 packets #收到 1個(gè)回復(fù)
【目標(biāo)主機(jī)存在,并且端口存活】
a1 = sr1(IP(dst='10.10.10.12')/UDP(dport=445),timeout=1)
Begin emission:
.Finished to send 1 packets.
.........
Received 10 packets, got 0 answers, remaining 1 packets #收到 0個(gè)回復(fù)
【目標(biāo)主機(jī)不存在】
a1 = sr1(IP(dst='10.10.10.123')/UDP(dport=445),timeout=1)
Begin emission:
............WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
.........
Received 21 packets, got 0 answers, remaining 1 packets #收到 0個(gè)回復(fù)

實(shí)現(xiàn)腳本可以通過修改上面的腳本實(shí)現(xiàn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI