四层发现


title: 四层发现
date: 2016-05-11 09:45
tags: kali渗透测试 主动信息收集


0x00 碎语

首先我们要明确的是,发现的目的是扫描出可能存活的IP地址,四层发现虽然涉及端口扫描,但是并不对端口的状态进行识别,其本质是利用四层协议的一些通信来识别主机ip是否存在,至于端口的问题,以后在谈。

四层发现的优点是可路由且结果可靠;不太可能被防火墙过滤,甚至可以发现所有端口都被过滤的主机。缺点是基于状态过滤的防火墙可能过滤扫描;全端口(十几万个端口)扫描的速度慢。


0x01 四层发现如何探测目标


TCP探测

正确tcp连接是通过三次握手建立通信过程,然后可以向目标发送资源申请的请求,本机再发送ack进行确认,这是一种基于连接的可靠的通信协议,当然这是正确的时候。如果我们之前没有建立tcp连接,而是直接向目标发送tcp资源请求,这时目标服务器回想本机发送一个RST包(意思是,你是谁,我不认识你啊,你不能连我哦),因此,当目标服务器委婉且礼貌的拒绝我们时,便可以基于次探测目标主机是否存在了!这是已中国基于tcp协议的特征进行的一种判断。当然我们也可以通过正确的,即是通过三次握手建立通信连接,通过发送的SYN包来确定目标主机是否在线。


UDP探测

UDP不同于TCP,UDP没有通过握手建立连接的过程,UDP只是尽力而为而已,它是一种非连接的不可靠传输协议,因此基于UDP来探测主机,难度和发现的准确率都高于TCP。同样是基于UDP的一些特征信息来探测。

如果目标ip不在线,那我们对其发送的UDP包不会有任何的回应,但假如目标Ip在线,而且发送到UDP的目标端口处于开放状态,一般说来,这时目标主机接受到我的UDP包时也不会有任何回应,但有一种列外,即是目标端口没有开放时,会向我们发送一个ICMP不可达的包(但是到这里我们并不对其端口进行扫描)。


0x02 TCP发现

原理:通过非正常TCP连接,探测目标主机(防火墙,交换机,服务器)是否存在

ACK-->TCP Port-->RST
将TCP包头的flag位设定为ACK,然后发送给一个目标/端口,最后判断是否收到RST响应包,以此确定目标是否存在!

无论是基于几层的探测扫描,得到结果也只不过是一种极大可能的参考,一切都可能不是真实的

Scapy构造四层TCP探测数据包

先构造三层ip包,再构成四层tcp,然后将三层/四层组合起来构成一个TCP包

root@jack:~/scripts# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.2.0)
>>> ip=IP() 
>>> tcp=TCP()
>>> r=(ip/tcp)
>>> r[IP].dst="192.168.0.1" #设置目标Ip地址
>>>r[TCP].flags="A" #设置TCPflags为”ACK“
>>>r.display()
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags= 
  frag= 0
  ttl= 64
  proto= tcp
  chksum= None
  src= 192.168.0.109 #本机ip已经自动识别
  dst= 192.168.0.1 #目标ip也已设置好
  \options\
###[ TCP ]###
     sport= ftp_data
     dport= http  #默认的tcp的端口是80端口
     seq= 0
     ack= 0
     dataofs= None
     reserved= 0
     flags= A
     window= 8192
     chksum= None
     urgptr= 0
     options= {}

开始发包

>>> a=sr1(r)
Begin emission:
.Finished to send 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
>>> a.display()
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 40
  id= 14705
  flags= 
  frag= 0L
  ttl= 64
  proto= tcp
  chksum= 0xbfa0
  src= 192.168.0.1
  dst= 192.168.0.109
  \options\
###[ TCP ]###
     sport= http
     dport= ftp_data
     seq= 0
     ack= 0
     dataofs= 5L
     reserved= 0L
     flags= R  <---flags位由A变成了R
     window= 0
     chksum= 0x2dbe
     urgptr= 0
     options= {}
###[ Padding ]###
        load= '\x00\x00\x13(\x82\x9e'

一条命令搞定

>>> a=sr1(IP(dst="192.168.0.1")/TCP(dport=80,flags='A'),timeout=1,verbose=0)
>>> a
<IP  version=4L ihl=5L tos=0x0 len=40 id=50048 flags= frag=0L ttl=64 proto=tcp chksum=0x3591 src=192.168.0.1 dst=192.168.0.109 options=[] |<TCP  sport=http dport=ftp_data seq=0 ack=0 dataofs=5L reserved=0L flags=R window=0 chksum=0x2dbe urgptr=0 |<Padding  load='\x00\x00\x80+\x86\xfe' |>>>

Python脚本实现TCP四层扫描

#!/usr/bin/python

import logging
import subprocess
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

if len(sys.argv)!= 2:
  print "Usage - ./ping1.py [/24 network address]"
  print "Example - ./ping1.py 128.38.28.3"
  sys.exit()

address = str(sys.argv[1])
prefix = address.split(".")[0]+'.'+address.split(".")[1]+'.'+address.split(".")[2]+'.'

for addr in range(1, 254):
  response = sr1(IP(dst=prefix+str(addr))/TCP(dport=2222,flags='A'),timeout=0.1,verbose=0)
  try:
    if int(response[TCP].flags)==4: #tcp中Reset对应的flags是倒数第三位,2^2=4
      print(prefix+str(addr))
  except:
    pass

0x03 UDP发现

一条命令搞定

>>> a=sr1(IP(dst="192.168.0.1")/UDP(dport=7643),timeout=0.1,verbose=0)
>>> a
<IP  version=4L ihl=5L tos=0x0 len=56 id=63680 flags= frag=0L ttl=64 proto=icmp chksum=0x46 src=192.168.0.1 dst=192.168.0.109 options=[] |<ICMP  type=dest-unreach code=port-unreachable chksum=0xdee4 unused=0 |<IPerror  version=4L ihl=5L tos=0x0 len=28 id=1 flags= frag=0L ttl=64 proto=udp chksum=0xf911 src=192.168.0.109 dst=192.168.0.1 options=[] |<UDPerror  sport=domain dport=7643 len=8 chksum=0x0 |>>>>

Python脚本实现UDP四层扫描

#!/usr/bin/python

import logging
import subprocess
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

if len(sys.argv)!= 2:
  print "Usage - ./ping1.py [/24 network address]"
  print "Example - ./ping1.py 128.38.28.3"
  sys.exit()

address = str(sys.argv[1])
prefix = address.split(".")[0]+'.'+address.split(".")[1]+'.'+address.split(".")[2]+'.'

for addr in range(1, 254):
  response = sr1(IP(dst=prefix+str(addr))/UDP(dport=7634),timeout=0.1,verbose=0)
  try:
    if int(response[IP].proto)==1: #为何是protoco=1,
#通过wireshark抓包可以发现
#ip层有protocol字段,指向它的上层协议,TCP为6,ICMP为1,IJMP
#为2,UDP为17,
#由此我们可以知道ip上层协议不一定除了tcp,就是udp,
#还可以是其它的很多类型的协议,在这里我们发送了一个udp包给
#目标,我们由是否接受到来自目标的icmp包来判断ip是否存活
      print(prefix+str(addr))
  except:
    pass

0x04 nmap-四层发现

nmap很强大,它除了可以实现三层扫描,第四层也是信手拈来,如探囊取物一般,当然他的强大远不止于此。

  • { Usage $: nmap [ip段] -PU[port] -sn }

只对ip段进行四层发现而不进行端口扫描,类似于UDP扫描

root@jack:~/MyBlog/hexo/source/_posts# nmap 221.22.0.1-50 -PU80 -sn
Starting Nmap 7.01 ( https://nmap.org ) at 2016-05-11 09:07 CST
Nmap scan report for softbank221022000006.bbtec.net (221.22.0.6)
Host is up (0.25s latency).
Nmap scan report for softbank221022000025.bbtec.net (221.22.0.25)
Host is up (0.18s latency).
Nmap done: 50 IP addresses (2 hosts up) scanned in 11.75 seconds

可以看到基于udp的扫描结果并不理想

  • __ { Usage $: nmap [ip段] -PA[port] -sn }__

只对ip段进行四层发现而不进行端口扫描,类似于Scapy扫描

  • { Usage $: nmap -iL iplist.txt -PA[port] -sn}

    对已有ip地址进行存活检测

无论如何,以上方法并不是适用于所有互联网设备,但是对大部分还是有所收获的


0x05 hping3 四层发现

  • { Usage $: hping3 -udp ip -c 1 }

hping3基于udp的四层发现

udp_hping3.sh核心代码

for addr in $(seq 1 254); do hping3 -udp $prefix.$addr -c 1 >> r.txt.done
grep Unreachable r.txt | cut -d" " -f 5 | cut -d"=" -f 2
  • {Usage $: hping3 ip -c 1}

hping3基于tcp的四层发现,不加参数,默认就是

tcp_hping3.sh核心代码

prefix=$(echo $1 | cut -d"." -f 1-3)
for addr in $(seq 1 254);do
   hping3 $prefix.$addr -c 1 >> r.txt
done
grep ^len r.txt | cut -d" " -f 2 | cut -d"=" -f 2 >> output.txt
rm r.txt

凡是hping发送的tcp所有的flags位都是not set的,即都是0的状态,它不同于udp的扫描,它通过返回的ack+rst包来判断主机存活!

hping3对四层扫描结果最不理想,当然这个就是智者见智!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容