📄 560.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="561.htm">下一篇</a>]
<hr><p align="left"><small>发信人: cloudsky (小四), 信区: Security <br>
标 题: RPC/XDR/NFS系列之----RPC编程初战(2) <br>
发信站: 武汉白云黄鹤站 (Wed Feb 23 17:15:33 2000), 站内信件 <br>
标题:RPC/XDR/NFS系列之----RPC编程初战(2) <br>
概述: <br>
本文提供了另外一个rpcscan.c,实现对特定rpc server的扫描 <br>
程序利用了portmapper本身提供的远程过程PMAPPROC_DUMP。 <br>
<< RPC/XDR/NFS系列之----rpcinfo利用 >>中给出过一个C程序, <br>
调用rpcinfo进行rpc scan,这里给出的程序是利用RPC CALL进行 <br>
rpc scan,显然效率要高得多。 <br>
测试: <br>
RedHat6.0 <br>
程序: <br>
/* <br>
File Name: rpcscan.c <br>
Author : unknown <br>
Test : Linux 2.2.5 <br>
Compile : gcc -pipe -O3 -o rpcscan rpcscan.c <br>
Date : 2000/02/22 <br>
*/ <br>
#include <stdio.h> <br>
#include <netdb.h> <br>
#include <stdlib.h> <br>
#include <signal.h> <br>
#include <rpc/rpc.h> <br>
#include <arpa/inet.h> <br>
#include <sys/socket.h> <br>
#include <netinet/in.h> <br>
#include <netinet/ip.h> <br>
#include <rpc/pmap_prot.h> <br>
#include <rpc/pmap_clnt.h> <br>
void doNothing ( int arg ) <br>
{ <br>
return; <br>
} /* end of doNothing */ <br>
u_long resolveHost ( char * host ) <br>
{ <br>
struct hostent * he; <br>
unsigned long ip; <br>
if( ( he = gethostbyname( host ) ) == NULL ) <br>
{ <br>
ip = inet_addr( host ); /* 网络字节顺序 */ <br>
if ( ip == INADDR_NONE ) <br>
{ <br>
ip = 0; <br>
} <br>
} <br>
else <br>
{ <br>
bcopy( he->h_addr_list[0], &ip, sizeof( unsigned long ) ); <br>
} <br>
return( ip ); <br>
} /* end of resolveHost */ <br>
int rpcServerDump ( char * host, char * rpcServerName ) <br>
{ <br>
struct sockaddr_in server_addr; <br>
struct pmaplist * head = NULL; <br>
int rpcsocket = RPC_ANYSOCK; <br>
struct timeval minutetimeout; <br>
register CLIENT * clientHandle; <br>
struct rpcent * rpc; <br>
server_addr.sin_addr.s_addr = resolveHost( host ); /* 获得远程主机IP地址 <br>
*/ <br>
server_addr.sin_family = AF_INET; /* 只能是这个地址族 <br>
*/ <br>
server_addr.sin_port = htons( PMAPPORT ); /* 111端口 */ <br>
minutetimeout.tv_sec = 15; <br>
minutetimeout.tv_usec = 0; <br>
/* cause clnttcp_create uses connect() */ <br>
signal( SIGALRM, doNothing ); <br>
alarm( 15 ); <br>
/* 创建句柄 */ <br>
if ( ( clientHandle = clnttcp_create( &server_addr, PMAPPROG, PMAPVERS, <br>
&rpc <br>
socket, 50, 500 ) ) == NULL ) <br>
{ <br>
alarm( 0 ); <br>
signal( SIGALRM, SIG_DFL ); <br>
return( 0 ); <br>
} <br>
alarm( 0 ); <br>
signal( SIGALRM, SIG_DFL ); <br>
/* portmapper本身是一个rpc server,提供远程过程PMAPPROC_DUMP */ <br>
if ( clnt_call( clientHandle, PMAPPROC_DUMP, ( xdrproc_t )xdr_void, NULL <br>
, <br>
( xdrproc_t )xdr_pmaplist, ( caddr_t )&head, minutetimeout ) != RPC_S <br>
UCCE <br>
SS ) <br>
{ <br>
{ <br>
return( 0 ); <br>
} <br>
if ( head != NULL ) <br>
{ <br>
for ( ; head != NULL; head = head->pml_next ) <br>
{ <br>
if ( ( rpc = getrpcbynumber( head->pml_map.pm_prog ) ) ) /* 可以 <br>
考 <br>
虑 改这里 */ <br>
{ <br>
if ( strcmp( rpc->r_name, rpcServerName ) == 0 ) <br>
{ <br>
return( 1 ); <br>
} <br>
} <br>
} <br>
} <br>
return( 0 ); <br>
} /* end of rpcServerDump */ <br>
void rpcServerScan ( char * inputFileName, char * rpcServerName ) <br>
{ <br>
FILE * inputFile; <br>
char buffer[512]; <br>
if ( ( inputFile = fopen( inputFileName, "rt" ) ) == NULL ) <br>
{ <br>
return; <br>
} <br>
while ( fgets ( buffer, 512, inputFile ) != NULL ) <br>
{ <br>
if ( buffer[ strlen( buffer ) - 1 ] == '\n' ) <br>
{ <br>
buffer[ strlen( buffer ) - 1 ] = '\0'; <br>
} <br>
if ( rpcServerDump( buffer, rpcServerName ) ) <br>
{ <br>
buffer[ strlen( buffer ) + 1 ] = '\0'; <br>
buffer[ strlen( buffer ) ] = '\n'; <br>
fprintf( stderr, "%s", buffer ); <br>
} <br>
} /* end of while */ <br>
fclose( inputFile ); <br>
return; <br>
} /* end of rpcServerScan */ <br>
int main ( int argc, char * argv[] ) <br>
{ <br>
if ( argc < 3 ) <br>
{ <br>
fprintf( stderr, "Usage: %s <hostListFile> <rpcServerName>\n", argv[ <br>
0] ) <br>
; <br>
exit( -1 ); <br>
} <br>
rpcServerScan( argv[1], argv[2] ); <br>
return( 0 ); <br>
} /* end of main */ <br>
[scz@ /home/scz/src/rpc]> gcc -pipe -O3 -o rpcscan rpcscan.c <br>
[scz@ /home/scz/src/rpc]> strip rpcscan <br>
[scz@ /home/scz/src/rpc]> ./rpcscan <br>
Usage: ./rpcscan <hostListFile> <rpcServerName> <br>
[scz@ /home/scz/src/rpc]> ./rpcscan hostlist rpcbind <br>
higgs.*.*.* <br>
server.*.*.* <br>
[scz@ /home/scz/src/rpc]> <br>
原理: <br>
signal和alarm函数的使用就不用我解释了吧,W.Richard.Stevens的经典著作 <br>
看得还不够么,尤其是华南木棉站socket版的朋友,你一定不要问我这个程序 <br>
怎么理解,否则要倒。 <br>
前面的系列中我们已经再三强调,portmapper本身就是一个rpc server。 <br>
程序利用了portmapper提供的远程过程PMAPPROC_DUMP。实际上rpcinfo -p就是这样 <br>
实 <br>
现的。 <br>
然后在dump出来的远程主机上的rpc server注册信息中根据关键字查找 <br>
我们所关心的特 <br>
定 <br>
的rpc server。这和先用rpcinfo -p后用grep的道理是一致的。 <br>
远程过程PMAPPROC_DUMP,顾名思义,就是dump出所有rpc server注册信息。 <br>
hostListFile的格式如下: <br>
server.*.*.* <br>
higgs.*.*.* <br>
192.168.67.152 <br>
192.168.67.124 <br>
至于命令行上的rpcServerName如何指定,你用rpcinfo -p先看看就知道了。rpcbi <br>
nd正 <br>
是 <br>
portmapper本身的rpc server name。 <br>
可以写出各种各样的rpc scan程序,后面的系列中还会给出一些,完全可以根据自 <br>
己的 <br>
需 <br>
要适当修改加以利用。 <br>
注意,一切rpc scan都是非常容易暴露自己的扫描过程,除非敢保证敌人没有条件 <br>
过来 <br>
修 <br>
理你,否则还是悠着好。作为网络管理人员,一旦发现rpc scan,应该警惕,rpc <br>
scan <br>
是rpc remote attack的前奏,这种攻击的危害性相当大。比如前段时间攻击日本站 <br>
点 <br>
, <br>
大量使用过的rpc.cmsd,chat* sigh <br>
scz < mailto: cloudsky@263.net > <br>
2000.02.23 13:22 (待续) <br>
-- <br>
我问飘逝的风:来迟了? <br>
风感慨:是的,他们已经宣战。 <br>
我问苏醒的大地:还有希望么? <br>
大地揉了揉眼睛:还有,还有无数代的少年。 <br>
我问长空中的英魂:你们相信? <br>
英魂带着笑意离去:相信,希望还在。 <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="561.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -