LInux系統木馬植入排查分析 及 應用漏洞修復配置(隱藏bannner版本等)

 

在平常繁瑣的運維工做中,對linux服務器進行安全檢查是一個很是重要的環節。今天,分享一下如何檢查linux系統是否遭受了入侵?php

1、是否入侵檢查node

1)檢查系統日誌python

檢查系統錯誤登錄日誌,統計IP重試次數(last命令是查看系統登錄日誌,好比系統被reboot或登錄狀況)
[root@bastion-IDC ~]# last

2)檢查系統用戶linux

查看是否有異常的系統用戶
[root@bastion-IDC ~]# cat /etc/passwd

查看是否產生了新用戶,UID和GID爲0的用戶
[root@bastion-IDC ~]# grep "0" /etc/passwd

查看passwd的修改時間,判斷是否在不知的狀況下添加用戶
[root@bastion-IDC ~]# ls -l /etc/passwd

查看是否存在特權用戶
[root@bastion-IDC ~]# awk -F: '$3==0 {print $1}' /etc/passwd

查看是否存在空口令賬戶
[root@bastion-IDC ~]# awk -F: 'length($2)==0 {print $1}' /etc/shadow

3)檢查異常進程nginx

注意UID爲0的進程
使用ps -ef命令查看進程

察看該進程所打開的端口和文件
[root@bastion-IDC ~]# lsof -p pid命令查看

檢查隱藏進程
[root@bastion-IDC ~]# ps -ef | awk '{print }' | sort -n | uniq >1
[root@bastion-IDC ~]# ls /porc |sort -n|uniq >2
[root@bastion-IDC ~]# diff 1 2

4)檢查異常系統文件web

[root@bastion-IDC ~]# find / -uid 0 –perm -4000 –print
[root@bastion-IDC ~]# find / -size +10000k –print
[root@bastion-IDC ~]# find / -name "…" –print
[root@bastion-IDC ~]# find / -name ".." –print
[root@bastion-IDC ~]# find / -name "." –print
[root@bastion-IDC ~]# find / -name " " –print

5)檢查系統文件完整性shell

[root@bastion-IDC ~]# rpm –qf /bin/ls
[root@bastion-IDC ~]# rpm -qf /bin/login
[root@bastion-IDC ~]# md5sum –b 文件名
[root@bastion-IDC ~]# md5sum –t 文件名

6)檢查RPM的完整性apache

[root@bastion-IDC ~]# rpm -Va #注意相關的/sbin,/bin,/usr/sbin,/usr/bin
輸出格式說明:
S – File size differs

M – Mode differs (permissions)

5 – MD5 sum differs

D – Device number mismatch

L – readLink path mismatch

U – user ownership differs

G – group ownership differs

T – modification time differs

7)檢查網絡vim

[root@bastion-IDC ~]# ip link | grep PROMISC(正常網卡不應在promisc模式,可能存在sniffer)
[root@bastion-IDC ~]# lsof –i
[root@bastion-IDC ~]# netstat –nap(察看不正常打開的TCP/UDP端口)
[root@bastion-IDC ~]# arp –a

8)檢查系統計劃任務瀏覽器

[root@bastion-IDC ~]# crontab –u root –l
[root@bastion-IDC ~]# cat /etc/crontab
[root@bastion-IDC ~]# ls /etc/cron.*

9)檢查系統後門

[root@bastion-IDC ~]# cat /etc/crontab
[root@bastion-IDC ~]# ls /var/spool/cron/
[root@bastion-IDC ~]# cat /etc/rc.d/rc.local
[root@bastion-IDC ~]# ls /etc/rc.d
[root@bastion-IDC ~]# ls /etc/rc3.d

10)檢查系統服務

[root@bastion-IDC ~]# chkconfig —list
[root@bastion-IDC ~]# rpcinfo -p(查看RPC服務)

11)檢查rootkit

[root@bastion-IDC ~]# rkhunter -c
[root@bastion-IDC ~]# chkrootkit -q

2、linux系統被入侵/中毒的表象

比較常見的中毒表如今如下三個方面:
1)服務器出去的帶寬會跑高這個是中毒的一個特徵。
由於服務器中毒以後被別人拿去利用,常見的就是拿去當肉雞攻擊別人;再者就是拿你的數據之類的。
因此服務器帶寬方面須要特別注意下,若是服務器出去的帶寬跑很高,那確定有些異常,須要及時檢查一下!

2)系統裏會產生多餘的不明的用戶
中毒或者被入侵以後會致使系統裏產生一些不明用戶或者登錄日誌,因此這方面的檢查也是能夠看出一些異常的。

3)開機是否啓動一些不明服務和crond任務裏是否有一些來歷不明的任務?
由於中毒會隨系統的啓動而啓動的,因此通常會開機啓動,檢查一下啓動的服務或者文件是否有異常,通常會在/etc/rc.local和crondtab -l 顯示出來。

3、順便說下一次Linux系統被入侵/中毒的解決過程

在工做中碰到系統常常卡,並且有時候遠程鏈接不上,從本地以及遠程檢查一下這個系統,發現有不明的系統進程。
初步判斷就是可能中毒了!!!

解決過程:
1)在監控裏檢查一下這臺服務器的帶寬,發現服務器出去的帶寬跑很高,因此纔會致使遠程鏈接卡甚至鏈接不上,這是一個緣由。
爲何服務器出去的帶寬這麼高且超出了開通的帶寬值?這個緣由只能進入服務器系統裏檢查了。

2)遠程進入系統裏檢查了下, ps -aux查到不明進程 ,馬上關閉它。

3)檢查一下開機啓動項:
#chkconfig --list | grep 3:on
服務器啓動級別是3的,我檢查一下了開機啓動項,沒有特別明顯的服務。
而後檢查了一下開機啓動的一個文件
#more /etc/rc.local
看到這個文件裏被添加了不少未知項,註釋了它。

4)而後在遠程鏈接這臺服務器的時候,仍是有些卡。
檢查了一下系統的計劃任務crond,使用crondtab -l 命令進行查看,看到不少註釋行。
這些註釋行與/etc/rc.local的內容差很少。最後備份下/var/spool/cron/root文件(也就是root下的crontab計劃任務內容),就刪除了crontab內容,而後中止crond任務,並chkconfig crond off 禁用它開機啓動。

5)爲了完全清除危害,我檢查了一下系統的登錄日誌(last命令查看),看到除了root用戶以外還有其它的用戶登錄過。
檢查了一下/etc/passwd ,看到有不明的用戶,馬上用usermod -L XXX 禁用這些用戶。 
而後更新了下系統的複雜密碼。

==============================================================

禁用/鎖定用戶登陸系統的方法
1. usermod -L username 鎖定用戶
    usermod -U username 解鎖
2. passwd -l username 鎖定用戶
    passwd -u username 解鎖
3.修改用戶的shell類型爲/sbin/nologin(/etc/passwd文件裏修改)
4.在/etc/下建立空文件nologin,這樣就鎖定了除root以外的所有用戶

4、怎樣確保linux系統安全

1)從以往碰到的實例來分析,密碼太簡單是一個錯
用戶名默認,密碼太簡單是最容易被入侵的對象,因此切忌不要使用太過於簡單的密碼,先前碰到的那位客戶就是使用了太簡單的且規則的密碼 1q2w3e4r5t, 這種密碼在掃描的軟件裏是通用的,因此很容易被別人掃描出來的。

2)不要使用默認的遠程端口,避免被掃描到
掃描的人都是根據端口掃描,而後再進行密碼掃描,默認的端口每每就是掃描器的對象,他們掃描一個大的IP 段,哪些開放22端口且認爲是ssh服務的linux系統,因此纔會猜這機器的密碼。更改遠程端口也是安全的一個措施!

3)使用一些安全策略進行保護系統開放的端口
使用iptables或者配置/etc/hosts.deny 和/etc/hosts.allow進行白名單設置
能夠對/etc/passwd、/etc/group、/etc/sudoers、/etc/shadow等用戶信息文件進行鎖定(chattr +ai)

4)禁ping設置
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

====================================================
發現一次服務器被getshell滲透的解決辦法:

1)使用top命令發現一個python程序佔用了95%的cpu
2)使用ps -ef|grep python發現下面程序:
   python -c import pty;pty.spamn("/bin/sh")
這個程序命令表示經過webshell反彈shell回來以後獲取真正的ttyshell進行滲透到服務器裏。kill掉這個進程!
3)發如今/var/spool/cron下面設置了一個nobody的定時執行上面獲取getshell的滲透命令!果斷刪除這個任務!
4)ss -a發現一個可疑ip以及它的進程,果斷在iptables裏禁止這個ip的全部請求:
   -I INPUT -s 180.125.131.192 -j DROP 

好比: 在一臺服務器上,已經啓動了80端口的nginx進程,可是執行「lsof -i:80」或者"ps -ef"命令後,沒有任何信息輸出!這是爲何?
懷疑機器上的ps命令被人黑了!執行:

[root@locahost ~]# which ps
/bin/ps
[root@locahost ~]# ls -l /bin/ps
-rwxr-xr-x. 1 root root 85304 5月  11 2016 /bin/ps
[root@locahost ~]# stat /bin/ps
  File: "/bin/ps"
  Size: 85304     	Blocks: 168        IO Block: 4096   普通文件
Device: fc02h/64514d	Inode: 13549       Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-07 17:14:37.862999884 +0800
Modify: 2016-05-11 07:23:09.000000000 +0800
Change: 2017-05-07 17:14:37.146999967 +0800

發現ps命令的二進制文件果真在近期被改動過。
解決辦法:能夠拷貝別的機器上的/bin/ps二進制文件覆蓋本機的這個文件。

=======================記一次Linux操做系統被入侵的排查過程=======================

某天忽然發現IDC機房一臺測試服務器的流量異常,幾乎佔滿了機房的總帶寬,致使其餘服務器程序運行業務受阻!
意識到了這臺測試機被人種了木馬,因而開始了緊張的排查過程:

1)運行ps和top命令
發現了兩個陌生名稱的程序(好比mei34hu)佔用了大部分CPU資源,顯然這是別人植入的程序!
果斷嘗試kill掉這兩個進程,kill後,測試機流量明顯降下去。然而不幸的是,不一下子又恢復了以前的狀態。

2)將IDC這臺測試機的外網關閉。遠程經過跳板機內網登錄這臺機器。

3)查看這些陌生程序所在路徑
查找程序路徑:
ls /proc/進程號/exe,而後再次kill掉進程,又會生成一個新的進程名,發現路徑也是隨機在PATH變量的路徑中變換,有時在/bin目錄,有時在/sbin,有時在/usr/bin目錄中。
看來還有後臺主控程序在做怪,繼續查找。

4)嘗試查找跟蹤程序
查看/bin,/sbin,/usr/bin等目錄下是否存在以.開頭的文件名,發現很多,並且部分程序移除後會自動生成。
[root@localhost ~]# ls /usr/bin/.    //按Tab鍵補全
./  ../  .ssh.hmac 

這說明還沒找到主控程序。

5)接着用strace命令跟蹤這些陌生程序:
[root@localhost ~]# strace /bin/mei34hu

結果發如今跟蹤了這個程序後,它竟然自殺了(把本身進程文件幹掉了)!而後想用netstat看下網絡鏈接狀況,結果竟然查不到任何對外的網絡鏈接,因而開始懷疑命令被修改過了。
使用stat 查看系統命令ps、ls 、netstat、pstree等等:
[root@localhost ~]# which ps
/usr/bin/ps
[root@localhost ~]# which ls
alias ls='ls --color=auto'
    /usr/bin/ls
[root@localhost ~]# which netstat
/usr/bin/netstat
[root@localhost ~]# stat /usr/bin/netstat 
[root@localhost ~]# stat /usr/bin/ps
[root@localhost ~]# stat /usr/bin/ls
......

發現修改時間都是在最近的3天內,這讓我猛然想起傳說中的rootkit用戶態級病毒!!
有多是這臺測試機剛安裝好系統後,設置了root密碼爲123456,以後又把它放到過公網上被人入侵了。

接着查一下它在相關路徑中還放了哪些程序:
[root@localhost ~]# find /bin -mtime -3 -type f | xargs rm -f
[root@localhost ~]# find /usr/bin -mtime -3 -type f | xargs rm -f
[root@localhost ~]# find /use/sbin -mtime -3 -type f | xargs rm -f
[root@localhost ~]# find /sbin -mtime -3 -type f | xargs rm -f

將上面查找出的3天前的程序通通都刪掉,並強制斷電,重啓服務器!然而可恨的是這些程序在機器重啓後又好端端的運行以來!
很明顯,這些程序都被設置了開機自啓動

6)查看系統啓動項
[root@localhost ~]# find /etc/rc.d/ -mtime -3 ! -type d

果真這些程序都被設置了開機自啓動。因而,就再來一次刪除,而後暴力重啓服務器。
[root@localhost ~]# find /bin -mtime -3 -type f | xargs rm -f
[root@localhost ~]# find /usr/bin -mtime -3 -type f | xargs rm -f
[root@localhost ~]# find /use/sbin -mtime -3 -type f | xargs rm -f
[root@localhost ~]# find /sbin -mtime -3 -type f | xargs rm -f
[root@localhost ~]# find /etc/rc.d/ -mtime -3 ! -type d | xargs rm -f 

重啓完服務器後,用top命令查看,系統CPU使用率也不高了。竟然這樣就被幹掉了。

7)顧慮到系統經常使用命令中(如ls,ps等)可能會隱藏啓動進程,這樣一旦執行又會拉起木馬程序。因而再查看下系統中是否建立了除root之外的管理員帳號:
[root@localhost ~]# awk -F":" '{if($3 == 0) print $1}' /etc/passwd
root

結果發現只輸入了root這一個用戶,說明系統用戶是正常的。
其實,當系統被感染rootkit後,系統已經變得不可靠了,惟一的辦法就是重裝系統了。

8)對於一些經常使用命令程序的修復思路:找出經常使用命令所在的rpm包,而後強制刪除,最後在經過yum安裝(因爲外網已拿掉,能夠經過squid代理上網的yum下載)
[root@localhost ~]# rpm -qf /bin/ps
[root@localhost ~]# rpm -qf /bin/ls
[root@localhost ~]# rpm -qf /bin/netstat
[root@localhost ~]# rpm -qf /usr/bin/pstree

而後將上面命令查找出來的rpm包強制卸載
[root@localhost ~]# rpm -e --nodeps ......
[root@localhost ~]# rpm -e --nodeps ......
[root@localhost ~]# rpm -e --nodeps ......
[root@localhost ~]# rpm -e --nodeps ......

接着再從新安裝
[root@localhost ~]# yum install -y procps coreutils net-tools psmisc

最後重啓下系統便可。除了上面此次排查以外,還能夠:
1)結合服務器的系統日誌/var/log/messages、/var/log/secure進行仔細檢查。
2)將可疑文件設爲不可執行,用chattr +ai將幾個重要目錄改成不可添加和修改,再將進程殺了,再重啓
3)chkrootkit之類的工具查一下

對於以上這些梳理的木馬排查的思路要清楚,排查手段要熟練。遇到問題不要慌,靜下心,細查系統日誌,根據上面的排查思路來一步步處理,這樣Hacker就基本"投降"了~~~

=====================針對一些linux應用漏洞, 作出的必要修改 (應用版本信息隱藏等)===================
1) 關閉Apache服務器的TRACE請求, 或是禁止遠端WWW服務支持TRACE請求

TRACE_Method是HTTP(超文本傳輸)協議定義的一種協議調試方法,該方法會使服務器原樣返回任意客戶端請求的任何內容。
TRACE和TRACK是用來調試web服務器鏈接的HTTP方式。支持該方式的服務器存在跨站腳本漏洞,一般在描述各類瀏覽器缺陷的時候,把"Cross-Site-Tracing"簡稱
爲XST。攻擊者能夠利用此漏洞欺騙合法用戶並獲得他們的私人信息。

1) 虛擬主機用戶能夠在.htaccess文件中添加以下代碼過濾TRACE請求:
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]

2) 服務器用戶在httpd.conf尾部添加以下指令後重啓apache便可:
TraceEnable off 

2) 隱藏apache的版本(banner信息).  一些應用的banner信息,容易讓黑客更快的匹配到漏洞信息,因此隱藏起來能夠提高必定的安全性。

在apache的http.conf中添加或修改爲以下二條代碼便可:
ServerSignature Off
ServerTokens Prod

通過以上修改,能夠隱藏一些 banner. 可是用wget -S和curl -I仍是能夠看到apache字樣! 

完全假裝的話須要修改源文件:
[root@localhost include]# pwd
/usr/local/src/httpd-2.4.37/include
[root@localhost include]# ll ap_release.h
-rw-r--r-- 1 root dip 3144 Oct 18 22:33 ap_release.h

編輯ap_release.h文 件,修改
#define AP_SERVER_BASEPRODUCT "Apache"
爲
#define AP_SERVER_BASEPRODUCT "Microsoft-IIS/5.0"

[root@localhost httpd-2.4.37]# pwd
/usr/local/src/httpd-2.4.37
[root@localhost httpd-2.4.37]# ll ./os/unix/os.h
-rw-r--r-- 1 root dip 1668 Sep 24  2011 ./os/unix/os.h

編輯os/unix/os.h文 件修改
#define PLATFORM "Unix"
爲
#define PLATFORM "Win64"

最後再從新編譯apache

3) 隱藏php的版本

在php的php.ini中添加或修改爲以下一條代碼便可:
expose_php = Off

4) 隱藏openssh版本

[root@localhost ~]# telnet 172.16.60.207 22
Trying 172.16.60.207...
Connected to 172.16.60.207.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.6

如上, 能夠看到openssh版本泄露了.  下面介紹下隱藏openssh版本的方法:

找到openssh的解壓目錄
[root@localhost ~]# cd /usr/local/src/openssh-7.6p1
[root@localhost openssh-7.6p1]# cat version.h 
/* $OpenBSD: version.h,v 1.80 2017/09/30 22:26:33 djm Exp $ */

#define SSH_VERSION     "OpenSSH_7.6"

#define SSH_PORTABLE    "p1"
#define SSH_RELEASE     SSH_VERSION SSH_PORTABLE

修改 #define SSH_VERSION     "OpenSSH_7.6" 這一行, 好比修改成"#define SSH_VERSION     "OpenSSH""
接着進行編譯安裝便可

5) 隱藏ssh版本

修改SSH登陸時的Banner信息

首先建立一個文件, 用於ssh登陸後的banner信息提示, 提示內容能夠自行定義
[root@localhost ~]# touch /etc/ssh_banner_change
[root@localhost ~]# echo "welcome to login this server:172.16.60.207" > /etc/ssh_banner_change
[root@localhost ~]# cat /etc/ssh_banner_change
welcome to login this server:172.16.60.207

接着修改SSH配置文件中的banner文件路徑
[root@localhost ~]# vim /etc/ssh/sshd_config
#Banner none
Banner /etc/ssh_banner_change

而後重啓ssh服務
[root@localhost ~]# /etc/init.d/sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                              [  OK  ]

這樣, 在遠程登陸這臺機器, 就會看到定義的banner信息了

6) 隱藏Proftpd版本信息

修改proftpd的配置文件:

1) 假裝登入歡迎信息
修改 
ServerIdent on "Serv-U FTP Server v5.0 for WinSock ready...\"
或
ServerIdent off

如上配置後, telnet proftpd端口後會顯示:
220 ::ffff:192.168.2.3 FTP server ready

2) 假裝banner信息
DisplayLogin [msgfile] DisplayConnect [msgfile]

7) 隱藏vsftpd版本信息

配置文件:vsftpd.conf

修改 ftpd_banner=welcome to this FTP server

8) 隱藏Nginx版本信息

在nginx.conf 的 http區域裏頭加入 server_tokens 的參數
server_tokens off;

若是想要完全屏敝, 則須要修改源碼
[root@uatclient-node01 core]# pwd
/data/software/nginx-1.12.2/src/core
[root@uatclient-node01 core]# ll nginx.h
-rw-r--r-- 1 ambari-qa 1001 476 Oct 17  2017 nginx.h

找到
#define nginx_version           1012002
#define NGINX_VERSION      "1.12.2"
#define NGINX_VER              "nginx/" NGINX_VERSION

把上面三行內容 假裝成其餘信息, 以下
#define nginx_version           1111111
#define NGINX_VERSION      "0.0000"
#define NGINX_VER              "nginx/" NGINX_VERSION

而後再次編輯便可

9) TTL

用如下命令修改Linux的TTL基數爲128(默認爲64)
[root@uatclient-node01 core]# cat /proc/sys/net/ipv4/ip_default_ttl
64
[root@uatclient-node01 core]# echo "128" > /proc/sys/net/ipv4/ip_default_ttl
[root@uatclient-node01 core]# cat /proc/sys/net/ipv4/ip_default_ttl         
128

還能夠在內核參數裏修改
[root@uatclient-node01 core]# vim /etc/sysctl.conf 
net.ipv4.ip_default_ttl = 128
[root@uatclient-node01 core]# sysctl -p
相關文章
相關標籤/搜索