Kali linux 学习笔记(十二)主动信息收集——四层发现(nmap、scapy、hping) 2020.2.21

前言

四层发现
优点:

  • 可路由且结果可靠
  • 不太会被防火墙过滤
  • 可以发现所有端口被过滤的主机

缺点:

  • 基于状态过滤的防火墙可能过滤
  • 全端口扫描速度慢

主要有TCP和UDP两种协议

TCP:

  • 发送未经请求的ACK,收到RST
  • 发送SYN,收到SYN/ACK或RST

UDP:

  • 收到ICMP端口不可达

1、四层发现——TCP

直接发一个ACK包
返回RST说明活着

scapy指令

i=IP()
t=TCP()
r=(i/t) 
r[IP].dst="192.168.1.1"
r[TCP].flags="A"
a=sr1(r)

脚本

ACK_ping.py

#!/usr/bin/python
import logging #导入日志
import subprocess #系统指令
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
form scapy.all import *
if len(sys.argv) != 2: #命令后面如果没跟参数
 print("Example : ./ACK_ping.py 1.1.1.1")
 sys.exit
address = str(sys.argv[1])
prefix = address.split('.')[0] +"." + address.split('.')[1]+"." + address.split('.')[2] + "."
for addr in range(0,254):
 answer = sr1(IP(dst=prefix+str(addr))/TCP(dport=2222,flags="A"),timeout=0.1,verbose=0) #verbose=0指错误不显示
 try:
  if int(response(TCP).flags) == 4:
   print(prefix+str(addr))
 except:
  pass

2、四层发现——UDP

有以下几种情况:

  • 目标IP不存在——一去不返
  • IP存在且端口开放——一去不返
  • IP存在且端口不开放——ICMP端口不可达

scapy指令

i=IP()
u=UDP()
r=(i/u)
r[IP].dst="192.168.1.1"
r[UDP].dport=7345 #设置一个偏门的端口
a=sr1(r,timeout=0.1)

脚本

UDP_ping.py

#!/usr/bin/python
import logging #导入日志
import subprocess #系统指令
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
form scapy.all import *
if len(sys.argv) != 2: #命令后面如果没跟参数
 print("Example : ./UDP_ping.py 1.1.1.1")
 sys.exit
address = str(sys.argv[1])
prefix = address.split('.')[0] +"." + address.split('.')[1]+"." + address.split('.')[2] + "."
for addr in range(0,254):
 answer = sr1(IP(dst=prefix+str(addr))/UDP(dport=33333),timeout=0.1,verbose=0) #verbose=0指错误不显示
 try:
  if int(response(IP).proto) == 1: #上层是个SMP的包
   print(prefix+str(addr))
 except:
  pass

3、四层发现——nmap

类似三层发现

nmap 1.1.1.1-254 -PU533 -sn #UDP扫描一整个IP段的533端口
nmap 1.1.1.1-254 -PA80 -sn #ACK扫描一整个IP段的80端口
nmap -iL iplist.txt -PA80 -sn

4、四层发现——hping3

指令

hping3 1.1.1.1 -c 1 #默认TCP
hping3 --udp 1.1.1.1 -c 1

脚本

UDP_hping.sh

扫描二维码关注公众号,回复: 9636283 查看本文章
#!/bin/bash
if["$#" -ne 1] then #脚本执行时后面参数不为1
 echo "Example  ./UDP_hping.sh 1.1.1.1" 
 exit
fi
prefix=$(echo $1 | cut -d "." -f 1-3)  #取指定IP的前三部分
for addr in $(seq 1 254):do
 hping3 $prefix.$addr --udp -c 1 >>  r.txt
done
grep Unreachable r.txt | cut -d " " -f 5 | cut -d "=" -f 2 >> output.txt
rm r.txt

TCP_hping.sh

#!/bin/bash
if["$#" -ne 1] then #脚本执行时后面参数不为1
 echo "Example  ./TCP_hping.sh 1.1.1.1" 
 exit
fi
prefix=$(echo $1 | cut -d "." -f 1-3)  #取指定IP的前三部分
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

结语

四层发现结果可靠,但速度慢
显然二三四层发现就是效率和可靠性的平衡
当然每种扫描结果只可作参考,不能认为绝对正确
灵活运用此三篇里提到的工具,来发现活着的主机

下一节是在发现活着的主机后寻找开放的端口,即端口扫描

发布了28 篇原创文章 · 获赞 2 · 访问量 1039

猜你喜欢

转载自blog.csdn.net/weixin_44604541/article/details/104430767