浅谈TCP扫描与SYN扫描与FIN扫描
时间: 2023-10-17 12:05:28 浏览: 301
TCP扫描是一种常见的网络扫描技术,它通过发送TCP包来探测目标主机上的开放端口。其中,SYN扫描和FIN扫描是TCP扫描的两种常见方式。
SYN扫描是指发送一个SYN包到目标主机的指定端口。如果目标主机返回一个SYN/ACK包,说明该端口是开放的;如果返回一个RST包,说明该端口是关闭的。如果没有返回任何响应,则可能是防火墙屏蔽了该端口,也可能是目标主机已经崩溃或者网络故障了。
FIN扫描是指发送一个FIN包到目标主机的指定端口。如果目标主机返回一个RST包,说明该端口是关闭的;如果没有返回任何响应,则说明该端口是开放的。这是因为在RFC 793中规定,如果目标主机收到一个FIN包,而该端口没有开放,它应该返回一个RST包。
SYN扫描和FIN扫描的区别在于,SYN扫描会发送SYN包,而FIN扫描会发送FIN包。此外,SYN扫描只能探测TCP协议下的端口,而FIN扫描可以探测TCP、UDP和SCTP协议下的端口。
需要注意的是,TCP扫描是一种被动的扫描技术,它并不会对目标主机造成实质性的影响。但如果扫描频率过高,有可能会被IDS/IPS系统检测到并触发警报。因此,在进行TCP扫描时,需要谨慎选择扫描工具和扫描频率,以避免引起不必要的麻烦。
相关问题
设计一个扫描器,要实现以下功能,使用 TCP connect 、 TCP SYN 和 TCP FIN 进行端口扫描,使用 ICMP echo 扫描实现 IP 扫描。并把扫描得知的结果记录下来。要具体的过程还要运行代码
好的,我可以为您提供一个示例代码,这个代码使用 Python 和 Scapy 实现了基本的端口和 IP 扫描功能。请注意,此代码仅供参考。
```python
#!/usr/bin/env python
from scapy.all import *
import argparse
def scan_port(target, port, scan_type):
""" 使用指定的扫描类型扫描目标主机的指定端口 """
if scan_type == "SYN":
# 使用 TCP SYN 扫描器进行端口扫描
syn_scan_resp = sr1(IP(dst=target)/TCP(dport=port,flags="S"),timeout=1, verbose=False)
if syn_scan_resp is not None:
if syn_scan_resp.haslayer(TCP):
if syn_scan_resp.getlayer(TCP).flags == 0x12:
send_rst = sr(IP(dst=target)/TCP(dport=port,flags="R"),timeout=1, verbose=False)
return True
elif syn_scan_resp.getlayer(TCP).flags == 0x14:
return False
elif scan_type == "FIN":
# 使用 TCP FIN 扫描器进行端口扫描
fin_scan_resp = sr1(IP(dst=target)/TCP(dport=port,flags="F"),timeout=1, verbose=False)
if fin_scan_resp is not None:
if fin_scan_resp.haslayer(TCP):
if fin_scan_resp.getlayer(TCP).flags == 0x14:
return False
else:
# 使用 TCP connect 扫描器进行端口扫描
conn_scan_resp = sr1(IP(dst=target)/TCP(dport=port,flags="S"),timeout=1, verbose=False)
if conn_scan_resp is not None:
if conn_scan_resp.haslayer(TCP):
send_rst = sr(IP(dst=target)/TCP(dport=port,flags="R"),timeout=1, verbose=False)
return True
return False
def scan_ip(target):
""" 使用 ICMP echo 扫描实现 IP 扫描 """
icmp = IP(dst=target)/ICMP()
resp = sr1(icmp, timeout=2, verbose=False)
if resp is not None:
return True
else:
return False
def main():
# 解析命令行参数
parser = argparse.ArgumentParser(description="Simple port scanner")
parser.add_argument("target", help="Target IP address")
parser.add_argument("-p", "--ports", help="Ports to scan (default: 1-1024)", default="1-1024")
parser.add_argument("-t", "--type", help="Scan type (CONN, SYN, FIN)", default="CONN")
parser.add_argument("-o", "--output", help="Output file")
args = parser.parse_args()
# 解析端口范围
port_range = args.ports.split("-")
if len(port_range) == 1:
ports = [int(port_range[0])]
else:
ports = range(int(port_range[0]), int(port_range[1])+1)
# 扫描目标主机的端口和 IP 地址
open_ports = []
live_ips = []
for port in ports:
if scan_port(args.target, port, args.type):
open_ports.append(port)
if scan_ip(args.target):
live_ips.append(args.target)
# 输出扫描结果
print("Open ports: ", open_ports)
print("Live IPs: ", live_ips)
if args.output is not None:
with open(args.output, "w") as f:
f.write("Open ports: " + str(open_ports) + "\n")
f.write("Live IPs: " + str(live_ips) + "\n")
if __name__ == "__main__":
main()
```
您可以在命令行中运行这个脚本,例如:
```
python scanner.py 192.168.1.1 -p 1-100 -t SYN -o result.txt
```
这将扫描 IP 地址为 192.168.1.1 的主机的端口 1 到 100,使用 TCP SYN 扫描器进行扫描,并将结果输出到 result.txt 文件中。
请注意,为了运行这个脚本,您需要安装 Python 和 Scapy 库。您可以使用 pip 命令来安装 Scapy,例如:
```
pip install scapy
```
当然,这个示例代码只是一个简单的实现,还有许多细节需要考虑,例如多线程扫描、扫描速度控制等。如果您需要更完善的扫描器,建议参考专业的开源工具,例如 Nmap。
简述TCP全连接扫描和TCP SYN扫描并分析其不同点。
TCP全连接扫描和TCP SYN扫描都是用于检测目标主机上开放端口的扫描技术,但它们的工作原理略有不同。
TCP全连接扫描是通过向目标主机的每个端口发送一个完整的TCP连接请求来进行扫描。如果一个端口是开放的,那么目标主机将会响应这个连接请求,建立一个完整的TCP连接。如果一个端口是关闭的,那么目标主机将会响应一个RST(重置)消息,表明连接被拒绝。通过分析这些响应消息,扫描器可以确定哪些端口是开放的。
TCP SYN扫描则是通过向目标主机的每个端口发送一个TCP SYN(同步)消息来进行扫描。如果一个端口是开放的,那么目标主机将会响应一个SYN/ACK(同步/确认)消息,表明端口是开放的。如果一个端口是关闭的,那么目标主机将会响应一个RST消息,表明连接被拒绝。通过分析这些响应消息,扫描器可以确定哪些端口是开放的。
TCP全连接扫描和TCP SYN扫描的主要区别在于,TCP全连接扫描需要建立一个完整的TCP连接来进行扫描,而TCP SYN扫描只需要发送一个TCP SYN消息,不需要建立完整的TCP连接。因此,TCP SYN扫描可以更快地进行扫描,同时也更难被目标主机的防火墙和入侵检测系统检测到。但是,TCP SYN扫描也可能会被一些防火墙和入侵检测系统检测到,并被视为一种攻击行为。因此,在进行渗透测试和攻击时,需要根据实际情况选择合适的扫描技术。
阅读全文