⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 560.htm

📁 unix高级编程原吗
💻 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 + -