阅读本文之前建议了解 TCP 三次握手过程以及 TCP 的包头详细信息。
由于 TCP 协议并没有对 TCP 的传输包进行验证,所以在我们知道一个 TCP 连接中的 seq 和 ack 的信息后就可以很容易的伪造传输包,假装任意一方与另一方进行通信,我们将这一过程称为 TCP 会话劫持(TCP Session Hijacking)
(可见,tcp 协议并无验证部分)
为解决这个问题,通常会在网络层采用 IPSec 协议,在传输层采用 TLS 协议,在应用层采用对应的协议。各协议安放位置如下。
所以对于一些未进行防护的,采用明文传输的协议,我们就可以很容易的进行会话劫持。
这里以 telnet 连接为例,采用三台虚拟机进行演示。
虚拟机配置如下:
攻击机 192.168.204.130
服务器 192.168.204.131
客户机 192.168.204.132
实现条件:
攻击机工具: wireshark,netwox,shijack
服务器 需要配置 telnet 服务器(这里就不详细说明了,有兴趣的同学可以自行百度)
过程:
首先,我们让 客户机 连接 服务器 。按提示输入服务器的账户,密码(输入密码时字符不可显)。
终端输入命令:
telnet 192.168.204.131
此时,在同一网段的 攻击机 使用 wireshark 嗅探共用网卡,等待 客户机 和 服务器 通信,捕捉 telnet 包。
为了直接找到 telnet 包可以在 wireshark 设置过滤 telnet ,同时设置 wireshark 查看包实际序号(Edit Preferences->Protocols->TCP-> 不选 Relative Sequence Numbers
)。
在 客户机 和 服务器 进行通讯后,我们成功捕捉到包。
直接找到最后的一个包,点击 TransmissionControl Protocol 查看其中的源端口,目的端口,next seq 和 ack 信息。(其中 服务器 的端口固定为 23 ,因为 telnet 端口是 23 )
因为我们要伪造发下一个包,所以直接采用 nextseq 作为下一个包的 ack ,采用 ack 作为下一个包的 seq(这里是 tcp 协议的规定,不懂的同学可以百度下 tcp 协议三次握手)
获取到信息之后,攻击机 使用 netwox 工具伪造 客户端3 给 服务器 发一个 tcp 包。发送成功后,原来的 客户端3 就会失去连接,同时 服务器 会把 攻击机 当作 客户端3 ,这样 攻击机 就实现了会话劫持。
攻击机 终端输入:
netwox 40 --ip4-dontfrag --ip4-offsetfrag 0 --ip4-ttl 64 --ip4-protocol 6 --ip4-src 192.168.204.132 --ip4-dst 192.168.204.131 --tcp-src 45116 --tcp-dst 23 --tcp-seqnum 3332505945 --tcp-acknum 4096321077 --tcp-ack --tcp-psh --tcp-window 128 --tcp-data "6c"
解释:因为是伪造 客户机 给 服务器 发送消息,所以源 ip 为 192.168.204.132,目的 ip 是 192.168.204.131 ,seq 和 ack 按刚才所说填写,末尾的 6c 是字母 l 的十六进制数,可以更换为别的,其余参数默认就可以了。
发送成功后 wireshark 显示出一个带着数据 l 的包,说明我们劫持成功。
上面每次伪造包的时候需要输入一大堆参数的实现过程是不是略显麻烦?这里推荐使用 shijack 工具(我的机子 hunt1.5 不能运行,,)。
同样,我们先让 客户机 连接 服务器 。此时 攻击机 打开 wireshark 抓包,获取到源,目的 ip 以及端口号。
根据上面的信息,使用 shijack 工具输入以下命令
./shijack-lnx eth0 192.168.204.132 45188 192.168.204.131 23
参数依次为网卡名,源地址,源端口,目的地址,telnet 端口
显示等待客户端和服务器通信以便工具自动获取 seq,ack进行劫持。
在通信之后显示劫持成功。此时我们输入 ls 并回车,用 wireshark 查看是不是真的成功发出伪造包。
Ok,劫持成功!
总结
那么会话劫持成功后,我们一遍可以采用反向 shell 的方法让攻击机直接获取服务器的权限,这部分内容以后再讲(我是不会告诉你们我是来刷文章数的 0.0 )。同时我们要注意的是在渗透的时候可以使用 nmap 这类工具对攻击点进行扫描,如果发现有类似 telnet 这种不安全的协议的端口开放的话就可以采用相应手段进行攻击了。