📄 569.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="570.htm">下一篇</a>]
<hr><p align="left"><small>发信人: cloudsky (小四), 信区: Security <br>
标 题: RPC/XDR/NFS系列之----NFS/Mount协议 <br>
发信站: 武汉白云黄鹤站 (Tue Feb 29 11:36:12 2000), 站内信件 <br>
<br>
标题:RPC/XDR/NFS系列之----NFS/Mount协议 <br>
<br>
概述: <br>
<br>
本文用协议分析软件抓取了大量相关协议报文, <br>
加上注释,以便从协议角度理解一些东西。 <br>
<br>
测试: <br>
<br>
RedHat6.0 <br>
<br>
目录: <br>
<br>
★ Mount协议报文(用协议分析软件抓取) <br>
★ NFS协议报文(用协议分析软件抓取) <br>
★ 鉴别 <br>
★ NFS/Mount协议中可能存在的安全问题 <br>
★ 相关RFC以及参考资料 <br>
<br>
<br>
★ Mount协议报文(用协议分析软件抓取) <br>
<br>
研究mount协议远比我当初想象的复杂,因为mount协议使用了动态端口, <br>
用rpcinfo -p serverIp会发现不同底层支持协议的不同版本都注册了 <br>
动态端口。只好在NetXray3.03中指定抓TCP和UDP协议报文,同时指定源 <br>
端口和目标端口过滤,使用rpcinfo -p serverIp查询到的端口之一(为什 <br>
么说之一,因为你不知道会使用tcp还是udp,会使用版本1还是版本3)先 <br>
尝试一下。如果指定端口过滤规则下没有抓到包,换用另外的尝试。当然 <br>
你也可以先不指定端口过滤直接抓TCP & UDP报文,然后辨别出mount协议 <br>
报文,进而确定底层支持协议和当前使用的动态端口号。 <br>
<br>
曾经在华中站系统安全版上给出过<< NetXray使用说明之(2) >>介绍了 <br>
如何指定源端口/目标端口过滤规则,按照这个方法配合一下 <br>
rpcinfo -p serverIp的输出,我尝试了一次就找到当前所使用的端口号 <br>
和底层支持协议。 <br>
<br>
scz注:后来我在<< NetXray使用说明之(5) >>中给出了另外一种更方便的 <br>
过滤规则抓取RPC报文,有兴趣的朋友请自行参看。 <br>
<br>
通过抓取RPC报文发现,尽管NFS SERVER使用固定的2049端口,但 <br>
NFS CLIENT依旧使用PORTMAPPER的PMAPPROC_GETPORT远程过程获取 <br>
端口号,并不直接使用2049端口。可能是考虑兼容性和可移植性吧。 <br>
<br>
我们在192.168.67.106上用sniffer pro 2.6设置抓取RPC报文,无论底层 <br>
支持协议是TCP还是UDP。然后在192.168.67.107上以scz身份执行 <br>
<br>
<br>
/usr/sbin/rpcinfo -p 192.168.67.108 <br>
mount /home/scz/nfsmount <br>
ls /home/scz/nfsmount <br>
umount /home/scz/nfsmount <br>
<br>
等操作,可以抓到一批RPC报文,mount协议很容易辨认,因为sniffer pro 2.6 <br>
无法识别mount协议,而PMAP和NFS这两个协议它可以识别,于是排他法确定出 <br>
mount协议。下面是 mount -t nfs 命令引发的一个RPC CALL报文: <br>
<br>
数据链路层 <br>
aa bb cc dd ee ff 00 00 21 d4 0b 92 08 00 <br>
<br>
IP层 <br>
45 00 00 a4 02 81 40 00 40 06 2f ab c0 a8 43 6b c0 a8 43 6c <br>
<br>
TCP层 <br>
03 75 源端口885 <br>
03 c5 目标端口965 <br>
71 13 44 c1 b1 02 5a 4d 80 18 7d 78 86 42 <br>
00 00 01 01 08 0a 00 03 87 1c 00 02 86 2b <br>
80 00 00 6c RPC层(包括Mount协议层)总共108个字节 <br>
<br>
RPC层 <br>
37 a5 1c 99 XID <br>
00 00 00 00 RPC CALL报文 <br>
00 00 00 02 RPC协议版本号2 <br>
00 01 86 a5 远程程序号100005 <br>
00 00 00 01 远程程序版本号1( 100005 1 tcp 965 mountd ) <br>
00 00 00 01 远程过程号1(MOUNTPROC_MNT) <br>
00 00 00 01 AUTH_UNIX鉴别机制 <br>
00 00 00 2c AUTH_UNIX鉴别信息总长度44个字节,从时间戳开始算 <br>
38 bb 21 2f rpc client本地时间戳 <br>
00 00 00 12 client的主机名共18个字节 <br>
48 69 67 67 73 2e XX XX XX XX XX 2e 63 6f 6d 2e 63 6e 00 00 <br>
higgs.xxxxx.com.cn,注意这里不要求是asciiz串,因为有长度字段, <br>
00是填充字节。 <br>
00 00 00 00 UID = 0(为什么这里是root,而不是scz,后面给个解释) <br>
00 00 00 64 GID = 100(为什么这里是users,而不是root,后面有解释) <br>
00 00 00 01 总共1个组 <br>
00 00 00 64 GID=100 <br>
00 00 00 00 使用AUTH_NULL鉴别机制 <br>
00 00 00 00 AUTH_NULL鉴别信息总长度0个字节 <br>
<br>
Mount协议层 <br>
00 00 00 13 <br>
MOUNTPROC_MNT(dirpath)远程过程的参数dirpath的长度, <br>
总共19个字节 <br>
2f 68 6f 6d 65 2f 73 63 7a 2f 6e 66 73 65 78 70 6f 72 74 00 <br>
/home/scz/nfsexport,结束的00是填充字节,需要4字节对齐。 <br>
<br>
[scz@ /home/scz]> id <br>
uid=500(scz) gid=100(users) groups=100(users) <br>
[scz@ /home/scz]> ls -l /bin/mount <br>
-rwsr-xr-x 1 root root /bin/mount <br>
[scz@ /home/scz]> <br>
<br>
注意到/bin/mount的属性是rwsr-xr-x,所以只有SUID没有SGID,上面发送出去 <br>
的RPC CALL报文中符合这一点。需要理解的是,/etc/fstab文件中允许了 <br>
User mountable,否则即使mount是SUID了的,scz也无法执行mount -t nfs命令。 <br>
<br>
关于Mount协议,最好的参考资料就是RFC 1094中的 <br>
<< Appendix A. MOUNT PROTOCOL DEFINITION >>,有我们前面介绍的那么多文章 <br>
做铺垫,现在阅读这份RFC想必心情愉快,很容易看下去。我当时用sniffer pro 2.6 <br>
抓取了Mount协议报文,最后的Mount协议层就是通过查阅RFC才明白的,当然还需要 <br>
理解XDR对变长数据类型的处理,请参看<< RPC/XDR/NFS系列之----外部数据表示 >>。 <br>
<br>
下面是Mount协议的RPC REPLY报文,其中含有server:/home/scz/nfsexport的根 <br>
句柄,不知道这个被snoop上来的根句柄可以利用否: <br>
<br>
数据链路层 <br>
00 00 21 d4 0b 92 aa bb cc dd ee ff 08 00 <br>
<br>
IP层 <br>
45 00 00 74 00 c0 40 00 40 06 31 9c c0 a8 43 6c c0 a8 43 6b <br>
<br>
TCP层 <br>
03 c5 源端口965(当前mountd使用的动态端口) <br>
03 75 目标端口885 <br>
b1 02 5a 4d 71 13 45 31 80 18 7c 70 fa 92 <br>
00 00 01 01 08 0a 00 02 86 2b 00 03 87 1c <br>
80 00 00 3c RPC层(包括Mount协议层)总共60个字节 <br>
<br>
RPC层 <br>
RPC层 <br>
37 a5 1c 99 XID <br>
00 00 00 01 RPC REPLY报文 <br>
<br>
00 00 00 00 status字段为0,表明Message Accepted <br>
00 00 00 00 使用AUTH_NULL鉴别机制 <br>
00 00 00 00 AUTH_NULL鉴别信息总长度0个字节 <br>
00 00 00 00 accept status字段为0,表明远程过程被成功调用并返回 <br>
<br>
Mount协议层 <br>
00 00 00 00 status为0,表明远程过程调用成功返回 <br>
ca ba eb fe 2a 68 0e 00 04 30 1d 00 04 03 00 00 <br>
04 03 00 00 2a 68 0e 00 a1 a5 5a 4c 00 00 00 00 <br>
这是一个32字节的根句柄 <br>
<br>
现在让我们从RFC 1094中摘录一点东西来帮助理解最后的这个Mount协议 <br>
层,也是对XDR的一个复习: <br>
<br>
union fhstatus switch ( unsigned status ) <br>
{ <br>
case 0: <br>
fhandle directory; <br>
default: <br>
default: <br>
void; <br>
} <br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -