端口扫描-基于TCP

栏目: 服务器 · 发布时间: 5年前

内容简介:相比于UDP的端口扫描,基于TCP的扫描将会复杂很多。TCP的扫描方式都是基于连接的三次握手的变化来判断目标端口的状态。TCP可以进行隐蔽扫描,僵尸扫描(比隐蔽扫描更隐蔽的扫描方式),全连接扫描(基于完整的三次握手)不建立完整的连接,而是只发送SYN包,如果对方回复ACK表示目标端口是开放的,如果回复RST表示目标端口未开放,接下来不再发送第三次的ACK确认,由此也不会建立起正常的TCP连接,应用层日志不会有任何记录,但是网络层有迹象可循

相比于UDP的端口扫描,基于TCP的扫描将会复杂很多。TCP的扫描方式都是基于连接的三次握手的变化来判断目标端口的状态。TCP可以进行隐蔽扫描,僵尸扫描(比隐蔽扫描更隐蔽的扫描方式),全连接扫描(基于完整的三次握手)

隐蔽扫描

不建立完整的连接,而是只发送SYN包,如果对方回复ACK表示目标端口是开放的,如果回复RST表示目标端口未开放,接下来不再发送第三次的ACK确认,由此也不会建立起正常的TCP连接,应用层日志不会有任何记录,但是网络层有迹象可循

端口扫描-基于TCP

僵尸扫描

极度隐蔽,但是实施条件苛刻,可伪造源地址。僵尸扫描的苛刻条件之一就是发起方必须伪造IP地址;二是选择的僵尸机必须是闲置状态的并且这些操作系统的IPID(ip包头里的ip字段)必须是递增的,IPID不能是随机的或者永远是0

端口扫描-基于TCP

端口扫描-基于TCP

隐蔽端口扫描

扫描环境:

Kali_64B :192.168.0.108

Kali_64B_Target: 192.168.0.110

win10: 192.168.0.107

用Kali_64B来扫描Kali_64B_Target和win10的端口:

首先在Kali_64B中利用scapy制作一个基于TCP的SYN包(不指定端口的情况下扫描的是80端口):

res=sr1(IP(dst="192.168.0.103")/TCP(flags="S"),timeout=1,verbos=0)

端口扫描-基于TCP

flags=RA(RST+ACK),即端口关闭

指定目标端口进行扫描:

res=sr1(IP(dst="192.168.0.103")/TCP(flags="S",dport=22),timeout=1)

端口扫描-基于TCP

22端口也没开

scapy脚本扫描:

#!/usr/bin/python
 
import logging
 
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 
from scapy.all import *
 
 
 
if len(sys.argv) != 4:
 
  print "Usage - ./udp_port.py [Target - TP] [First port] [Last port]"
 
  print "Usage - ./udp-port.py 128.13.34.13 1 100"
 
  sys.exit()
 
 
 
ip = sys.argv[1]
 
start = int(sys.argv[2])
 
end = int(sys.argv[3])
 
 
 
for port in range(start, end):
 
  a = sr1(IP(dst=ip)/TCP(dport=port),timeout=1,verbose=0)
 
  if a == None:
 
    pass
 
  else:
 
    if int(a[TCP].flags) == 18:
 
      print port
 
    else:
 
      pass

目标机如果开了防火墙,扫不到端口

nmap的TCP隐蔽端口扫描

namp -sS -p[start-port]-[end-port] ip 
 
namp -sS -p[start-port]-[end-port] ip --open  (--open只显示端口状态为open的端口)

hping3基于SYN的隐蔽端口扫描

hping3 --scan 1-30,70-90 -S 192.168.0.109

hping3 -c 10 -S --spoof fake_source -p ++1 dst_ip

-c 10:发10个包

--spoof fake_source:将IP伪造成fake_source实现对源IP的隐藏

-p ++:从端口1开始,每次增加1

当目标主机的端口是开放的那么它会发送一个ACK包给fake_source,如果想要知道扫描的结果,那么必须具有登录拥有fake_source IP的主机才能看到

全连接端口扫描

用SYN包进行扫描时,如果在存在防火墙,或者网络条件十分苛刻时,可能无法判断目标端口是否开放,以此我们这时需要通过三次握手跟目标主机建立完整的TCP连接来进行试探,全连接的扫描结果准确率是最高的,但是不隐蔽,很容易触发目标网络层的报警系统

脚本:

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
 
SYN = IP(dst="192.168.86.132")/TCP(dport=25,flags="S")
 
print("---SENT---")
SYN.display()
#显示要发的包
 
print"\n\n---RECEIVED---"
response = sr1(SYN,timeout=1,verbose=0)
#将定义好的SYN包发送出去
response.display()
#----------------
#这里有问题,就是机器内核会认为SYN/ACK
#是非法包,将会直接发送RST断开连接,导致三次握手(全连接)失败
#可以使用 linux 的自带防火墙iptables直接DROP掉由系统发出的RST包
#iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.86.132 -j DROP
#-A新家一条规则,出站,-p tcp表示使用TCP协议 -d表示目标ip,-j表示动作
#----------------
if int(response[TCP].flags)==18:
#如果收到的回包是SYN+ACK,那么TCP包头的flags将会是18
  print("\n\n---SENT---")
  A = IP(dst="192.168.86.132")/TCP(dport=25,flags="A",ack=(response[TCP].seq+1))
#确定收到syn+ack相应,再次向目标发送ACK包确认,同时序列号加1
  A.display()
  print("\n\n---RECRIVED---")
  response2 = sr1(A,timeout=1,verbose=0)
  response2.display()
else:
#如果没有收到syn+ack回应,将不做任何相应
  print"SYN.ACK not returned"

nmap进行TCP全连接扫描

namp -sT 192.168.86.134 -p 1-100

-sT:表示基于TCP连接的扫描;基于TCP的全连接扫描会较慢非全连接扫描

其它扫描工具

dmitry -P 192.168.86.34 

nv -w 1 -z 192.168.14.112 1-100

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图论导引

图论导引

韦斯特 / 机械工业出版社 / 2006-2 / 65.00元

图论起源于著名的哥尼斯堡七桥问题,在计算科学、社会科学和自然科学等各个领域都有广泛应用。本书是本科生或研究生一学期或两学期的图论课程教材。内容全面,证明与应用实例并举,不仅包括对证明技巧的讨论、1200多道习题、400多幅插图以及许多例题,而且对所有定理都给出了详细完整的证明。可以作为高等院校数学系本科生和研究生、计算机专业和其他专业研究生的图论课程教材,也可以作为有关教师和工程技术人员的参考书。......一起来看看 《图论导引》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具