【网警提醒】基础网络攻防之webshell攻击

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【网警提醒】基础网络攻防之webshell攻击相关的知识,希望对你有一定的参考价值。

参考技术A

什么是webshell?有什么危害?

webshell 就是一种可以在web服务器上执行的后台脚本或者命令执行环境。

黑客通过入侵网站上传webshell后获得服务器的执行操作权限,比如执行系统命令、窃取用户数据、删除web页面、修改主页等,其危害不言而喻。

Webshell攻击的特点有哪些?

1

持续远程访问

入侵者可以利用 webshell 从而达到长期控制网站服务器的目的。若攻击者自行修复了漏洞,以确保没有其他人会利用该漏洞,攻击者可以低调的随时控制服务器。一些流行的 webshell 使用密码验证和其他技术来确保只有上传 webshell 的攻击者才能访问它。

2

权限提升

在服务器没有配置错误的情况下, webshell 将在web服务器的用户权限下运行,该用户权限是有限的。通过使用 webshell ,攻击者可以尝试通过利用系统上的本地漏洞来执行权限提升,常见的有查找敏感配置文件、通过内核漏洞提权、利用低权限用户目录下可被Root权限用户调用的脚本提权、任务计划等。

3

极强的隐蔽性

有些恶意网页脚本可以嵌套在正常网页中运行,且不容易被查杀。webshell还可以穿越服务器防火墙,由于与被控制的服务器或远程主机交互的数据都是通过80端口传递,因此不会被防火墙拦截,在没有记录流量的情况下, webshell 使用post包发送,也不会被记录在系统日志中,只会在web日志中记录一些数据提交的记录。

获取webshell的常见方法

1

直接上传获得webshell

因过滤上传文件不严,导致用户可以直接上传 webshell 到网站任意可写目录中,从而拿到网站的管理员控制权限。

2

添加修改上传类型

现在很多脚本程序上传模块不是只允许上传合法文件类型,大多数的系统是允许添加上传类型。

3

利用后台管理功能写入webshell

进入后台后还可以通过修改相关文件来写入webshell。

4

利用后台数据库备份及恢复获得

主要是利用后台对access数据库的“备份数据库”或“恢复数据库”功能,“备份的数据库路径”等变量没有过滤导致可以把任意文件后缀改为asp,从而得到webshell。

5

php+mysql系统

后台需要有mysql数据查询功能,入侵者就可以利用它执行SELECT ... in TO OUTFILE查询输出php文件,因为所有的数据是存放在mysql里的,所以我们可以通过正常手段把我们的WebShell代码插入mysql在利用SELECT ... in TO OUTFILE语句导出shell。

webshell网站后门的清除方法

后门的文件可以直接删除,找到后门文件,直接删除即可;

不能直接删除后门文件,只能删除文件内容中的木马代码进行清除。

1、文件名为index.asp 、index.php,这类为自动生成SEO类型文件,可以直接删除,如要彻底清除后门,需找生成此文件的源文件。

2、文件内容只有一行,或很少量的代码,此类被称为“一句话后门”。

3、文件内容中存在password或UserPass关键字。

4、另外一些在上传组件目录或上传目录的文件可以直接删除。如eWebEditor、Editor、FCKeditor、webeditor、UploadFiles、uploads等。

1、网站自身文件被插入恶意代码

2、网站配置文件

这类插入网站自身代码中的后门清除方法:

首先备份此文件以备改错可恢复,查找到后门代码的位置,一般通过查找“eval、execute、request、ExecuteGlobal”关键字进行定位。把确定为后门的代码删除后保存文件。访问网站看是否报错,以确认有没有改错。

网站如何防御webshell攻击?

从根本上解决动态网页脚本的安全问题,要做到防注入、防暴库、防COOKIES欺骗、防跨站攻击等等,务必配置好服务器FSO权限。

1、建议用户通过ftp来上传、维护网页,尽量不安装上传程序。

2、对上传程序的调用一定要进行身份认证,并只允许信任的人使用上传程序。

3、程序管理员的用户名和密码要有一定复杂性,不能过于简单,还要注意定期更换。

4、到正规网站下载程序,要对数据库名称和存放路径进行修改,数据库名称要有一定复杂性。

5、尽量保持程序是最新版本。

6、不要在网页上加注后台管理程序登陆页面的链接。

7、为防止程序有未知漏洞,可以在维护后删除后台管理程序的登陆页面,下次维护时再上传。

8、时常备份数据库等重要文件。

9、日常多维护,并注意空间中是否有来历不明的asp文件。

10、尽量关闭网站搜索功能,利用外部搜索工具,以防爆出数据。

11、利用白名单上传文件,不在白名单内的一律禁止上传,上传目录权限遵循最小权限原则。

黑客技能:网络攻防的艺术之TCP协议篇


1. 概述


网络攻击的主要内容包括系统安全攻防、网络安全攻防、物理攻击与社会工程学三部分: 系统安全攻防主要是利用软件安全漏洞进行攻击,网络安全攻防利用协议栈的安全漏洞(不局限于此), 物理攻击与社会工程学攻击主要是利用人的心理弱点、物理设计缺陷。



一般我们讲TCP提供可靠的有连接服务,这个可靠包括三层含义:

  • 数据有序传输

  • 丢包重传机制

  • 流量控制机制


2. TCP协议的工作原理


我们通过一个简单的TCP client程序和TCP Server程序来展示TCP建立连接、数据传输、断开连接的过程。以下这两个程序中,为了能清晰说明程序的通信过程,不做容错处理,力求简单。工作当中这样的程序是不能正常工作的。


2.1 TCP Client 程序


#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <sys/socket.h>

#include <netinet/ip.h>

 

#include <unistd.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#define SER_ADDR "127.0.0.1"

#define SER_PORT 9999

//#define SER_ADDR "172.16.28.98"

 

/* main function */

int main(int argc, char *argv[])

{

        /**

         * Step 1: 创建一个socket, 指定SOCK_STREAM参数代表基于TCP协议

         *   如果是UDP协议,则需要用SOCK_DGRAM

         */

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);

 

 

        /**

         *   IP+Port, 标识网络上某个主机的通信进程

         */

    struct sockaddr_in dest;

    memset(&dest, 0, sizeof(struct sockaddr_in));

    dest.sin_family = AF_INET;

    dest.sin_addr.s_addr = inet_addr(SER_ADDR);

    dest.sin_port = htons(SER_PORT);

 

        /**

         * Step 3: 连接服务器

          */

    if (connect(sockfd, (struct sockaddr *)&dest,

                    sizeof(struct sockaddr_in)) != 0){

                /* 此处SYN Flood攻击会用到 */

                fprintf(stdout, "Error for connect: %s ", strerror(errno));

                return 1;

        }

 

        /**

         * Step 4: Server发送数据

         */

 

        char *buffer1 = "Hello Server! ";

    char *buffer2 = "Hello Again! ";

    write(sockfd, buffer1, strlen(buffer1));

 

    write(sockfd, buffer2, strlen(buffer2));

 

        /**

         *  Step 5: 关闭连接

         */

    close(sockfd);

 

        return 0;

}


一个客户端程序大概如下几个步骤:

1. 创建一个socket,通过指定参数SOCK_STREAM,来标识基于TCP传输, 如果需要用UDP协议的话,则需要指定SOCK_DGRAM。 特别指出,如果需要通过原始套接字进行通讯,需要指定SOCK_RAW。

3. 与Server建立连接, TCP是基于连接下协议,因此在数据传输之前,需要通过三次握手建立连接。 

4. 收发数据,一旦连接建立成功,C/S两端就可以通过write/send/sendto/sendmsg发送数据,可以通过read/recv/recvfrom/recvmsg/接收数据 

5. 关闭连接, 当数据收发完毕后,连接不再需要时,可以通过close断开连接。


2.2 TCP Server程序

下面我们编写一个TCP Server程序,还是老规矩,力求简单,不做容错处理。

#include <stdio.h>

#include <string.h>

#include <sys/socket.h>

#include <netinet/ip.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

 

#define SER_ADDR 9999

 

int main(int argc, char *argv[])

{

    int sockfd, newsockfd;

    struct sockaddr_in my_addr, client_addr;

    char buffer[100];

 

        /**

         * Step 1: 创建一个socket, 指定SOCK_STREAM代表TCP

         */

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

 

        /**

         *  Step 2:   绑定一个端口号

         */

    memset(&my_addr, 0, sizeof(struct sockaddr_in));

    my_addr.sin_family = AF_INET;

    my_addr.sin_port = htons(SER_ADDR);

    bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in));

 

        /**

         * Step 3: 监听连接

         */

    listen(sockfd, 5);

 

        fprintf(stdout, "Serve listenning.... ");

        while(1){

                /**

                 * Step 4: Accept 一个连接请求

                 */

                socklen_t client_len = sizeof(client_addr);

                newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);

 

                /**

                 * Step 5: 从当前连接读取数据 */

                memset(buffer, 0, sizeof(buffer));

                int len = read(newsockfd, buffer, 100);

                printf("Received %d bytes: %s", len, buffer);

 

                /**

                 * Step 6: 关闭当前链接*/

                close(newsockfd);

        }

 

        /**

         * Step 7: 关闭套接字

         */

        close(sockfd);

 

    return 0;

}


一个Server程序的大致步骤为:

1. 创建一个socket

2. 绑定一个端口号

3. 开始监听

4. 接受一个连接请求。

5. 收发数据

6. 关闭连接请求

7. 关闭socket

其中 4、5、6可作为一个循环,多次响应连接请求。


2. 3 掀开数据传输的面纱

一旦连接建立, OS分别为Client端和Server端申请两个Buffer, 一个是SendBuffer,用于发送数据,一个是ReceiveBuffer,用于接收数据。 TCP协议是全双工的,两端都可以发送和接收数据。详细流程见下图: 


这里面有几个问题,我们此处并不会对TCP协议完整展开解释,选取和我们后续课程相关重点的描述一下:

1.TCP提供面向连接的服务, 连接的建立过程在下一章节中,重点描述。

2.数据有序传输:每个数据包编个序号,数据包到达主机可能错序,在传输层调整顺序后上传。

3.丢包重传机制:引入滑动窗口机制, 窗口内的数据如果没有接到应答ack, “超时”进行重传。

4.流量控制机制:引入滑动窗口机制后,接收端实时通知发送端当前自己接受窗口大小,从而约束发送端的发送,进行流量控制


2.4 TCP Header


黑客技能:网络攻防的艺术之TCP协议篇

TCP 部分一般称之为Segment, 数据段, (补充: 在应用层--消息、传输层--数据段Segment、网络层--包/分组 packet、 链路层--帧frame、 物理层bits),对于TCP header的格式如上图所述, 详细解读如下:

  • 源端口号和目的端口号, 各占16bits

  • 32位序号 (seq)

  • 32位应答序号(ack)

  • TCP header长度: 4位, 以4字节度量, 故Header最长为64字节

  • 保留: 6位

  • 标志位: 6位, 包括 SYN、FIN、ACK、RST、PSH、URG

  • 滑动窗口: 16位, 可用于流量控制

  • 校验: 16位

  • 紧急指针:16位, 当URG标志置位时, 此指针有效,用于带外数据

  • 选项:0~320bits, 以32bits为单位,TCP可以通过options携带一些补充数据


我们讲,TCP是面向连接的服务, 因此就存在建立连接, 断开连接等操作。后续我们选取针对连接建立过程和连接断开过程进行攻击方面的展示。


3. TCP SYN Flood 攻击


3.1 TCP 建立连接(三次握手)

我们说TCP提供面向连接的服务, 因此数据发送前需要先通过三次握手建立连接:

5.第一次握手: 首先客户端C(?)主动发起连接,发送SYN(连接请求标志), 以及序号SEQ=x(序号x随机生成)到服务器端S。

6.第二次握手: 服务器端S接受到SYN后, 向客户端C也发送SYN及ACK, 且ack=x+1, 以及序号Seq=y(序号y随机生成)。

7.第三次握手: 客户端接到SYN及ACK后, 核查ack是否为x+1, 若正确, 则客户端C发送ACK 且ack=y+1,至服务器端S。

8.服务器端S接收到ACK,核查ack是否为y+1。若正确,则连接正常建立。


三方握手建立连接的过程详细见下图


黑客技能:网络攻防的艺术之TCP协议篇


3.2 SYN Flooding 攻击

在探讨SYN攻击之前,我们先看看linux内核对SYN是怎么处理的: 1. Server接收到SYN连接请求。 内部维护一个队列(我们暂称之半连接队列,半连接并不准确), 发送ack及syn给Client端,等待Client端的ack应答,接收到则完成三次握手建立连接。 如果接收不到ack应答,则根据延时重传规则继续发送ack及syn给客户端。


详细见下图所示:


黑客技能:网络攻防的艺术之TCP协议篇


3.3 SYN Flood 攻击防护手段

  • tcp_max_syn_backlog: 半连接队列长度

  • tcp_synack_retries: syn+ack 的重传次数

  • tcp_syncookies : syn dookie


一般的防御措施就是就是减小SYN+ACK重传次数,增加半连接队列长度,启用syn cookie。不过在高强度攻击面前,调优 tcp_syn_retries 和 tcp_max_syn_backlog 并不能解决根本问题,更有效的防御手段是激活 tcp_syncookies,在连接真正创建起来之前,它并不会立刻给请求分配数据区存储连接状态,而是通过构建一个带签名的序号来屏蔽伪造请求。 

喜欢今天的内容吗?

记得替播妞分享给身边需要的小伙伴哦!



▼点击了解 更多详情

以上是关于【网警提醒】基础网络攻防之webshell攻击的主要内容,如果未能解决你的问题,请参考以下文章

20155338 《网络攻防》Exp5 MSF基础应用

20155328 网络攻防 实验五:MSF基础应用

2018-2019-2 20165329《网络攻防技术》Exp5 MSF基础应用

20155201 网络攻防技术 实验九 Web安全基础

2015306 白皎 《网络攻防》Exp5 MSF基础应用

20145306 网路攻防 web安全基础实践