Liunx木馬排查及糾結蛋碎的過程記錄

開場白

服務器掛了,原因

糾結的查殺過程

ifconfig

發現網卡的發送、接收數據情況,
網卡eth0累計發送了52.5G 的數據。剛重啓不久就這麼多數據,不太正常。
另,5M帶寬啊,平時最多佔用3M,而現在直接跑滿,進都進不去。
最後直接被阿里雲把服務器停了,說對外進行大量的攻擊。。。好吧,糾結,別人不攻擊我們就萬福了,哪有心情去攻擊別人。
這裏寫圖片描述

$ ll -al /usr/bin/bsd-port/

drwxr-xr-x  2 root root  4096 1213 20:01 .
dr-xr-xr-x. 4 root root 28672 1213 20:01 ..
-rw-r--r--  1 root root    73 1213 14:46 conf.n
-rwxr-xr-x  1 root root     5 1213 18:17 getty.lock

繞了很多彎路

根據監測的木馬文件,刪除

這裏寫圖片描述
有毛用,NND,刪了過一會又繼續出來新的
全部隨機生成到/usr/bin/* /boot/*下面去了,折騰了很久 ,頑強的小強一枚。

網上查了很多資料,用了很多方法,一直沒有清理乾淨

清理的第一步

netstat -an|more

查看當前服務器端口監聽情況。
首先解決漏洞,比如redis未授權訪問漏洞,memcache,mongod未授權訪問漏洞,先把漏洞解決掉再說。
百度一下即可,我的解決方案時這些都是內網訪問,所以簡單粗暴
1. 全部訪問IP綁定成127.0.0.1 禁止外部訪問
2. 網上,其他官方推薦加強修復方案:設置訪問密碼強度、獨立這些服務器的訪問用戶組,禁止使用root權限的用戶組。

清理的第二步

這個地方一直沒留意,導致前面做了很多無用功

more /etc/crontab

這裏寫圖片描述
看到這個貨了沒,NND,一個定時計劃任務。
木馬通過創建時間計劃任務來實現啓動,並每3分鐘檢測程序是否運行,如果不存在,會繼續通過拷貝副本運行。
木馬會起多線程進行網絡操作,利用下載文件、更新文件、進行DDos攻擊等。XorDdos木馬來自中國,攻擊的對象也同樣來自中國。

沒什麼說的,刪,刪,刪。記得刪完重啓服務器,雖然然並卵,但還是這麼幹吧。

到這裏基本完成一半了。

清理第三步,收尾

cd /etc/init.d/

$ ls Db*
DbSecurityMdt  DbSecuritySpt

$ ls sel*
selinux

$ more selinux 
#!/bin/bash
/usr/bin/bsd-port/getty

$ more DbSecuritySpt 
#!/bin/bash
然並卵,我之前刪了這個文件,所以沒看到它指向到哪裏去了,算了,反正也沒啥影響了。

$ more DbSecurityMdt 
#!/bin/bash
/root/cmy6

$ more DbSecurityMdt 
#!/bin/bash
/root/cmy6

常規查殺木馬一些命令
使用netstat查看網絡連接,分析是否有可疑發送行爲,如有則停止。
(linux常見木馬,清理命令chattr -i /usr/bin/.sshd; rm -f /usr/bin/.sshd; chattr -i /usr/bin/.swhd; rm -f /usr/bin/.swhd; rm -f -r /usr/bin/bsd-port; cp /usr/bin/dpkgd/ps /bin/ps; cp /usr/bin/dpkgd/netstat /bin/netstat; cp /usr/bin/dpkgd/lsof /usr/sbin/lsof; cp /usr/bin/dpkgd/ss /usr/sbin/ss;rm -r -f /root/.ssh; rm -r -f /usr/bin/bsd-port;find /proc/ -name exe | xargs ls -l | grep -v task |grep deleted| awk ‘{print 11}' | awk -F/ '{print NF}’ | xargs killall -9;)

盲人摸象,目前就這樣了,總結就一個字:刪。 目前問題已解決,如有更好的方式可以交流,偶也想深入學習下。

排查方法精囊妙計

cat /etc/passwd 查看賬戶信息

目的:查看是否有可疑賬戶信息。
註冊名:口令:用戶標識號:組標識號:用戶名:用戶主目錄:命令解釋程序

root:x:0:0:root:/root:/bin/bash

cat /etc/passwd|grep 用戶名

==============詳細字段說明介紹================

name:password:uid:gid:comment:home:shell

  • 註冊名(login_name):用於區分不同的用戶。在同一系統中註冊名是惟一的。在很多系統上,該字段被限制在8個字符(字母或數字)的長度之內;並且要注意,通常在Linux系統中對字母大小寫是敏感的。這與MSDOS/Windows是不一樣的。
  • 口令(passwd):系統用口令來驗證用戶的合法性。超級用戶root或某些高級用戶可以使用系統命令passwd來更改系統中所有用戶的口令,普通用戶也可以在登錄系統後使用passwd命令來更改自己的口令。
    現在的Unix/Linux系統中,口令不再直接保存在passwd文件中,通常將passwd文件中的口令字段使用一個“x”來代替,將/etc /shadow作爲真正的口令文件,用於保存包括個人口令在內的數據。當然shadow文件是不能被普通用戶讀取的,只有超級用戶纔有權讀取。
    此外,需要注意的是,如果passwd字段中的第一個字符是“*”的話,那麼,就表示該賬號被查封了,系統不允許持有該賬號的用戶登錄。
  • 用戶標識號(UID):UID是一個數值,是Linux系統中惟一的用戶標識,用於區別不同的用戶。在系統內部管理進程和文件保護時使用 UID字段。在Linux系統中,註冊名和UID都可以用於標識用戶,只不過對於系統來說UID更爲重要;而對於用戶來說註冊名使用起來更方便。在某些特定目的下,系統中可以存在多個擁有不同註冊名、但UID相同的用戶,事實上,這些使用不同註冊名的用戶實際上是同一個用戶。
  • 組標識號(GID):這是當前用戶的缺省工作組標識。具有相似屬性的多個用戶可以被分配到同一個組內,每個組都有自己的組名,且以自己的組標識號相區分。像UID一樣,用戶的組標識號也存放在passwd文件中。在現代的Unix/Linux中,每個用戶可以同時屬於多個組。除了在 passwd文件中指定其歸屬的基本組之外,還在/etc/group文件中指明一個組所包含用戶。
  • 用戶名(user_name):包含有關用戶的一些信息,如用戶的真實姓名、辦公室地址、聯繫電話等。在Linux系統中,mail和finger等程序利用這些信息來標識系統的用戶。
  • 用戶主目錄(home_directory):該字段定義了個人用戶的主目錄,當用戶登錄後,他的Shell將把該目錄作爲用戶的工作目錄。在Unix/Linux系統中,超級用戶root的工作目錄爲/root;而其它個人用戶在/home目錄下均有自己獨立的工作環境,系統在該目錄下爲每個用戶配置了自己的主目錄。個人用戶的文件都放置在各自的
    主目錄下。
  • 命令解釋程序(Shell):Shell是當用戶登錄系統時運行的程序名稱,通常是一個Shell程序的全路徑名,
    如/bin/bash。

cat /etc/group 查看用戶組信息

組名:加密密碼:組ID:所有屬於該組的用戶。

cat /etc/group|grep 組名
groups 查看當前登錄用戶的組內成員
groups test 查看test用戶所在的組,以及組內成員
whoami 查看當前登錄用戶名

netstat -anp 查看網絡信息

目的:查看進程及PID,是否有異常連接
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
常見參數
-a (all)顯示所有選項,默認不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態

-p 顯示建立相關鏈接的程序名
-r 顯示路由信息,路由表
-e 顯示擴展信息,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。

提示:LISTEN和LISTENING的狀態只有用-a或者-l才能看到

  • 列出所有端口 netstat -a
  • 列出所有 tcp 端口 netstat -at
  • 列出所有 udp 端口 netstat -au
  • 只顯示監聽端口 netstat -l
  • 只列出所有監聽 tcp 端口 netstat -lt
  • 只列出所有監聽 udp 端口 netstat -lu
  • 只列出所有監聽 UNIX 端口 netstat -lx
  • 顯示所有端口的統計信息 netstat -s
  • 顯示 TCP 或 UDP 端口的統計信息 netstat -st 或 -su
  • 顯示核心路由信息 netstat -r
  • 找出程序運行的端口 netstat -ap | grep ssh (netstat -an | grep ‘:80’)
  • IP和TCP分析
    • netstat -nat | grep “192.168.1.15:22” |awk ‘{print 5}'|awk -F: '{print 1}’|sort|uniq -c|sort -nr|head -20
  • TCP各種狀態列表
    • netstat -nat |awk ‘{print $6}’
  • 分析access.log獲得訪問前10位的ip地址
  • awk ‘{print $1}’ access.log |sort|uniq -c|sort -nr|head -10

last 查看登錄日誌

參考http://www.cnblogs.com/kerrycode/p/4223751.html

cat /etc/profile 查看全局的系統變量

與環境變量相關的文件可能還會有/etc/bashrc等,不過這是shell變量,是局部的,對於特定的shell器作用

ls -al /etc/rc.d/rc3.d查看當前級別開機啓動項

  • /etc/rc.d/init.d
    該文件夾包含所有服務在各個運行等級中的全部啓動腳本。一般來說,它們都是標準的shell腳本,遵守最基本的標準。每個腳本最少接受兩個參數start和stop,它們分別代表啓動和停止服務(如網頁服務)。除此之外,init腳本通常還會接受一些額外的選項,如restart(重啓服務器)、status(返回服務當前狀態)、reload(告知服務從配置文件中重新載入配置)以及force-reload(強制服務重載它的配置)。當用不帶參數的方式運行腳本的時候,一般應該返回一個它會接受的參數列表。

  • /etc/rc.d/rc0.d~/etc/rc.d/rc6.d
    這些文件夾分別包含每個運行等級對應的init腳本。在實際使用中,它們一般通過符號鏈接到/etc/init.d文件夾下的實際文件。不過要注意的是,這些文件夾下的init腳本都有一些特別的名字,命名都以S(start)、K(kill)或D(disable)開頭,後面跟一個數字。當init進入一個運行等級的時候,它會按照數字順序運行所有以K開頭的腳本並傳入stop參數,除非對應的init腳本在前一個運行等級中沒有啓動。然後init按照數字順序運行所有以S開頭的腳本並傳入start參數。任何以D開頭的init腳本都會被忽略—這讓你可以在指定的運行等級禁止一個腳本,或者你也可以僅僅移除全部符號鏈接。所以如果你有兩個腳本,S01foo和S05bar,init首先會運行S01foo start,當它進入特定的運行等級後再執行S05bar start。

  • /etc/rc.d/rc.local
    並非所有的發行版都使用了rc.local,通常它是一個留給用戶修改的shell腳本。一般會在init進程結束的時候運行它,所以你可以在這裏放一些想要運行的額外腳本,而不用再創建自己的init腳本。

  • /etc/rc.d/rc.sysinit
    /etc/rc.d/rc.sysinit主要做在各個運行模式中相同的初始化工作,包括設定PATH、設定網絡配置(/etc/sysconfig/network)、啓動swap分區、設定/proc等等。

  • /etc/rc.d/rc
    當運行級別改變時,負責啓動/停止各種服務。

比如我想把某個已經安裝了的服務添加爲系統服務,可以執行以下命令:
chkconfig –add 服務名稱 (首先,添加爲系統服務,注意add前面有兩個橫槓)
chkconfig -leve 啓動級別 服務名 on
(說明,3級別代表在命令行模式啓動,5級別代表在圖形界面啓動,on表示開啓)
chkconfig -leve 啓動級別 服務名 off
(說明,off表示關閉自啓動)
例如:chkconfig -level 3 mysql on (說明:讓mysql服務在命令行模式,隨系統啓動)
也可以使用 chkconfig –del 服務名稱 來刪除系統服務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章