title: 二層發(fā)現(xiàn)
date: 2016-04-10 10:45
tags: kali滲透測(cè)試 主動(dòng)信息收集
0x00 瑣碎
從上一章節(jié),我們可以收集到大量的被動(dòng)信息,但是因被動(dòng)而收集的信息,并不與目標(biāo)系統(tǒng)進(jìn)行直接交互,所以很有可能所收集的并不是最新的信息,所以現(xiàn)在我們開(kāi)始進(jìn)行主動(dòng)信息收集!
毫無(wú)疑問(wèn),主動(dòng)信息收集,終極目標(biāo)不過(guò)是為了獲得目標(biāo)大大量信息,比如高層管理賬號(hào)密碼,核心數(shù)據(jù)庫(kù),系統(tǒng)root權(quán)限,也因此我們不可避免的需要與目標(biāo)主機(jī)進(jìn)行直接接觸而留下訪問(wèn)痕跡,為了避免留下痕跡,我們有必要使用受控的第三方電腦進(jìn)行探測(cè),并且做好被封殺的準(zhǔn)備,或者我們可以使用噪音迷惑目標(biāo),淹沒(méi)真實(shí)的探測(cè)流量。這些所有的主動(dòng)信息收集過(guò)程我們稱之為掃描!
過(guò)程是這樣的,首先對(duì)目標(biāo)進(jìn)行IP層掃描,再對(duì)其進(jìn)行端口掃描,然后是應(yīng)用層的掃描,就是對(duì)其進(jìn)行各種網(wǎng)絡(luò)層面的掃描,根據(jù)發(fā)送不同探測(cè)返回的結(jié)果判斷目標(biāo)狀態(tài)!
0x01 第一階段 發(fā)現(xiàn)
一層發(fā)現(xiàn) IP層
一層發(fā)現(xiàn)階段的目的是為了識(shí)別網(wǎng)絡(luò)里活著的主機(jī),這些主機(jī)就會(huì)成為我們后續(xù)潛在的攻擊目標(biāo),整理出一個(gè)IP地址列表!二層發(fā)現(xiàn) 基于數(shù)據(jù)鏈路層
二層發(fā)現(xiàn)是基于數(shù)據(jù)鏈路層的,主要根據(jù)其arp協(xié)議,其有優(yōu)點(diǎn)是掃描速度 ,探測(cè)出來(lái)的結(jié)果也非常可靠,缺點(diǎn)是不可路由,它只能發(fā)現(xiàn)本網(wǎng)段之內(nèi)的主機(jī),若是需要夸網(wǎng)段,進(jìn)行下一跳的話是不可以的,因?yàn)槁酚善鞑⒉粫?huì)轉(zhuǎn)發(fā)arp協(xié)議包
0x02 基于二層發(fā)現(xiàn)的工具
arping 發(fā)現(xiàn)網(wǎng)卡所在網(wǎng)段的IP
- 參數(shù):airping ip -c <數(shù)字> 限定發(fā)送的探測(cè)包的數(shù)量
root@jack:~# arping 192.168.0.109 -c 2
ARPING 192.168.0.109
Timeout
Timeout
--- 192.168.0.109 statistics ---
2 packets transmitted, 0 packets received, 100% unanswered (0 extra)
__參數(shù):arping ip -d __其作用是發(fā)現(xiàn)重復(fù)的相應(yīng),即是發(fā)現(xiàn)不同的mac地址擁有同一個(gè)IP,就是說(shuō)明這是一個(gè)arp地址欺騙了!
下面來(lái)嘗試抓取本機(jī)網(wǎng)卡下的ip:使用grep管道對(duì)信息進(jìn)行過(guò)濾
首先抓取一個(gè)包,分析其特征信息
root@jack:~# arping 192.168.0.110 -c 2 -d
ARPING 192.168.0.110
60 bytes from 20:6a:8a:02:bf:19 (192.168.0.110): index=0 time=6.563 msec
60 bytes from 20:6a:8a:02:bf:19 (192.168.0.110): index=1 time=1.518 msec
--- 192.168.0.110 statistics ---
2 packets transmitted, 2 packets received, 0% unanswered (0 extra)
rtt min/avg/max/std-dev = 1.518/4.040/6.563/2.522 ms
如上可知得到的返回信息中還包含了統(tǒng)計(jì)信息,使用grep篩選出我們想要的"bytes from"字段:
root@jack:~# arping 192.168.0.110 -c 2 | grep "bytes from"
60 bytes from 20:6a:8a:02:bf:19 (192.168.0.110): index=0 time=10.246 msec
60 bytes from 20:6a:8a:02:bf:19 (192.168.0.110): index=1 time=5.159 msec
在進(jìn)一步篩選,只顯示第五行IP字段信息:
root@jack:~# arping 192.168.0.110 -c 2 | grep "bytes from" | cut -d " " -f 5
{cut -d " "忽略空格;-f 5意思是顯示第五個(gè)字段的信息}
(192.168.0.110):
(192.168.0.110):
最后除去括號(hào)和冒號(hào):
root@jack:~# arping 192.168.0.110 -c 2 | grep "bytes from" | cut -d " " -f 5 | cut -d "(" -f 2 | cut -d ")" -f 1
192.168.0.110
192.168.0.110
- 但是arping只能一個(gè)一個(gè)的取ping并不能進(jìn)行大量同時(shí)的ping,所以這便需要腳本來(lái)完成了!
腳本代碼如下:
#!/bin/bash
#===============================================================================
#
# FILE: arping1.sh
#
# USAGE: ./arping1.sh
#
# DESCRIPTION: 通過(guò)arping實(shí)現(xiàn)對(duì)整個(gè)網(wǎng)段或者網(wǎng)卡下連接的一個(gè)網(wǎng)絡(luò)存活ip的掃描
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: onejustone
# ORGANIZATION:
# CREATED: 2016年04月29日 15:47
# REVISION: ---
#===============================================================================
if [ "$#" -ne 1 ]; then
#腳本攜帶的參數(shù)數(shù)量只能為1個(gè)參數(shù)
echo "usage ../arping.sh [interface]"
echo "Example ../arping.sh etho"
echo "Example wil perfors an arp scanf of the local subnet to which eth0 is assigned"
fi
interface=$1
#獲得第一參數(shù)
prefix=$(ifconfig $interface | grep 'inet addr'| cut -d":" -f 2 | cut -d' ' -f 1 | cut -d"." -f 1-3)
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 >>addr.txt
done
運(yùn)行腳本:
root@jack:~/scripts# sh arping1.sh eth0 &
root@jack:~/scripts# cat addr.txt
192.168.0.1
192.168.0.101
192.168.0.102
192.168.0.103
192.168.0.110
192.168.0.113
我們獲得了6個(gè)相同局域網(wǎng)下活著的IP,但是多段時(shí)間以后我們?nèi)绻獙?duì)這些ip重新進(jìn)行檢查是否依舊存活?
#!/bin/bash -
#===============================================================================
#
# FILE: arping2.sh
#
# USAGE: ./arping2.sh
#
# DESCRIPTION: 定期對(duì)已收集到的IP進(jìn)行存活檢查
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: YOUR NAME (),
# ORGANIZATION:
# CREATED: 2016年04月29日 17:06
# REVISION: ---
#===============================================================================
if [ "$#" -ne 1 ]; then
echo "usage ../arping.sh [interface]"
echo "Example ../arping.sh etho"
echo "Example wil perfors an arp scanf of the local subnet to which eth0 is assigned"
fi
file=$1
for addr in $(cat $file); do
arping -c 1 $addr | grep "bytes from" | cut -d" " -f 5 | cut -d"(" -f 2 | cut -d")" -f 1
done
運(yùn)行腳本arping2.sh
root@jack:~/scripts# sh arping2.sh addr.txt
192.168.0.1
192.168.0.101
192.168.0.102
192.168.0.103
192.168.0.110
192.168.0.113
[1]+ 已完成 sh arping1.sh eth0
nmap 神器
nmap是一個(gè)超級(jí)強(qiáng)大的工具,但是在這里我們不會(huì)細(xì)說(shuō),而只是基于nmap對(duì)于二層發(fā)現(xiàn)的作用,后面我們會(huì)單獨(dú)介紹
-
參數(shù):nmap -sn
不對(duì)端口進(jìn)行掃描,只是二層發(fā)現(xiàn),尋找存活I(lǐng)P
root@jack:~/scripts# nmap -sn 192.168.0.*
Starting Nmap 7.01 ( https://nmap.org ) at 2016-04-29 17:35 CST
Nmap scan report for 192.168.0.1
Host is up (0.00069s latency).
MAC Address: C8:3A:35:4E:4B:B0 (Tenda Technology)
Nmap scan report for bogon (192.168.0.102)
Host is up (0.52s latency).
MAC Address: F8:A4:5F:14:74:FB (Xiaomi Communications)
Nmap scan report for 192.168.0.103
Host is up (0.52s latency).
MAC Address: DC:6D:CD:D1:E4:FA (Guangdong Oppo Mobile Telecommunications)
Nmap scan report for bogon (192.168.0.110)
Host is up (0.00025s latency).
MAC Address: 20:6A:8A:02:BF:19 (Wistron InfoComm Manufacturing(Kunshan)Co.)
Nmap scan report for 192.168.0.113
Host is up (0.00026s latency).
MAC Address: 5C:F9:DD:6A:02:61 (Dell)
Nmap scan report for 192.168.0.109
Host is up.
Nmap done: 256 IP addresses (6 hosts up) scanned in 2.71 seconds
我可以發(fā)現(xiàn)nmap的掃描速度明顯快于arping,執(zhí)行時(shí)間為5秒,并且掃描出來(lái)的的信息比arping詳細(xì)很多!
同樣nmap也可以從文件中獲得ip地址段并對(duì)其進(jìn)行掃描探測(cè)
root@jack:~/scripts# nmap -iL addr.txt -sn
Nmap done: 7 IP addresses (7 hosts up) scanned in 0.43
seconds
運(yùn)行時(shí)間縮短到了0.43秒!
#### Netdiscover
----
Netdiscover可用于主動(dòng)發(fā)現(xiàn)和被動(dòng)發(fā)現(xiàn),同樣它采用arp協(xié)議,通過(guò)向目標(biāo)發(fā)送arp包是否響應(yīng)來(lái)判斷目標(biāo)是否存活,當(dāng)然主動(dòng)探測(cè)很有可能會(huì)觸發(fā)目標(biāo)的反偵查系統(tǒng)(如果目標(biāo)有的話),所以Netdiscover也支持被動(dòng)發(fā)送,Netdiscover對(duì)網(wǎng)卡啟用混雜模式,收取非本網(wǎng)卡IP地址和非本網(wǎng)卡MAC地址的數(shù)據(jù)包,并且他的機(jī)制是基于廣播的,Netdiscover會(huì)一直在網(wǎng)絡(luò)中默默偵聽(tīng)著,等待截取目標(biāo)發(fā)送的arp!這是一種被動(dòng)的等待,所以比主動(dòng)的探測(cè)或許響應(yīng)稍慢!
* __主動(dòng)探測(cè)__
root@jack:/tmp# netdiscover -i eth0 -r 192.168.0.109/24
-i指定在哪個(gè)網(wǎng)卡上進(jìn)行發(fā)現(xiàn)
-r指定網(wǎng)絡(luò)地址段
Currently scanning: Finished! | Screen View: Unique Hosts
1 Captured ARP Req/Rep packets, from 1 hosts. Total size: 60
IP At MAC Address Count Len MAC Vendor y scanni ----------------------------------------------------------------------------- dress 192.168.0.1 08:aa:45:6e:4b:10 01 060 Unknown vendor
* __被動(dòng)掃描__
-p將網(wǎng)卡配置為混雜模式,將會(huì)抓取非本網(wǎng)卡即整個(gè)網(wǎng)絡(luò)物理空間中所廣播的數(shù)據(jù)包
root@jack:/# netdiscover -p
Currently scanning: (passive) | Screen View: Unique Hosts
0 Captured ARP Req/Rep packets, from 0 hosts. Total size: 0
IP At MAC Address Count Len MAC Vendor
### 0x03 Python Scapy
----
Scapy是Python的一個(gè)庫(kù)文件,可以在腳本里進(jìn)行調(diào)用,主要是為Python處理一些網(wǎng)絡(luò)的處理,可以抓包,以可以單獨(dú)的創(chuàng)建一個(gè)數(shù)據(jù)包,進(jìn)行發(fā)送,也可以對(duì)收集到數(shù)據(jù)包進(jìn)行修改然后重放,向網(wǎng)絡(luò)里注入流量,用Scapy學(xué)習(xí)網(wǎng)絡(luò)協(xié)議也是不錯(cuò)的選擇!
初次使用Scapy需要安裝python-gnuplot的一組件:
root@jack:~# apt-get install python-gnuplot
進(jìn)入Scapy
root@jack:~# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.2.0)
### 0x04 Python Scapy 腳本實(shí)現(xiàn)arp掃描
----
!/usr/bin/python
import logging
'''導(dǎo)入日志'''
import subprocess
'''實(shí)現(xiàn)一些系統(tǒng)命令的調(diào)用'''
logging.getLogger("scapy.routime").setLevel(logging.ERROR)
from scapy.all import *
'''導(dǎo)入scapy模塊'''
if len(sys.argv)!= 2:
'''如果命令加腳本不等于2,這里不同于bash shell'''
print "Usage .. /arp.display [interface]"
print "Usage .. /arp.display.py eth0"
print "Example will perfors an ARP scanf of the local subnet to which etho is assigned"
sys.exit()
interface = str(sys.argv[1])
ip = subprocess.check_output("ifconfig "+interface +" | grep 'inet addr'| cut -d':' -f 2 | cut -d' ' -f 1", shell=True).strip()
prefix = ip.split('.')[0]+'.'+ip.split('.')[1]+'.'+ip.split('.')[2]+'.'
for addr in range(0, 254):
answer = sr1(ARP(pdst=prefix+str(addr)),timeout=0.1,verbose=0)
'''如果不添加timeout參數(shù),那么scapy遇到不存在的p將會(huì)一直發(fā)包,
直到有響應(yīng)為止,所以我們?yōu)槠涮砑觮imeout參數(shù),
超過(guò)1秒沒(méi)響應(yīng)將放棄,verbose=0表示不顯示異常信息=1則會(huì)顯示'''
if answer == None:
pass
else:
print prefix+str(addr)
### 0x05 何時(shí)用到二層發(fā)現(xiàn)
---
一般只有當(dāng)滲透到內(nèi)網(wǎng)以后才會(huì)使用基于二層的探測(cè),一般服務(wù)器不會(huì)安裝nmap,也可能沒(méi)有arping,也有可能沒(méi)有Netdiscover,也有可能運(yùn)行不了Python的腳本,但是一般沒(méi)有可能連以上一個(gè)可能都沒(méi)有,這是不可能的。