端口扫描-基于TCP

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

内容简介:相比于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

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

查看所有标签

猜你喜欢:

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

High Performance Python

High Performance Python

Andrew Lewis / O'Reilly Media, Inc. / 2010-09-15 / USD 34.99

Chapter 1. Introduction Section 1.1. The High Performance Buzz-word Chapter 2. The Theory of Computation Section 2.1. Introduction Section 2.2. Problems Section 2.3. Models of Computati......一起来看看 《High Performance Python》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

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

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码