嚴謹地說, Linux只是一個內核, `GNU Linux`纔算完整的操做系統, 但在本文裏仍是用通俗的叫法,javascript
把`Ubuntu`,`Debian`,`RedHat`,`CentOS`,`ArchLinux`等發行版都統稱爲`Linux`.html
本文裏所說的方法不只對Linux的發行版適用, 部分方法對`Mac OSX`操做系統也是適用的.java
若是黑客曾經得到過命令運行的機會, 對方每每會想要將這個機會持續下去, 業內稱之爲`持久化(persistence)`.git
而建立後門賬號, 每每是一個持久化的途徑.github
`cat /etc/passwd`能夠看到當前系統中的全部用戶和對應的組信息, 若是賬號太多一眼看不過來,shell
我一般會用下述方法篩選:ubuntu
```shwindows
cat /etc/passwd | awk -F: '{print $7}' | sort | uniq -c安全
```bash
改命令的做用是打印全部類型的shell和對應的數量, 對於有shell的用戶, 要仔細檢查.
若是上一步得到了某個異常的用戶名(假設爲`hacker`), 能夠用如下方法詳細檢查該用戶:
- 查看用戶id和組信息: id hacker
- 查看用戶最近登陸信息: lastlog -u hacker
- 查看用戶歷史登陸信息: last hacker
- 查看用戶登陸失敗信息: lastb hacker
- 查看綜合信息: finger hacker
注: `finger`命令在某些操做系統裏不是內置的, 能夠自行用包管理工具安裝, 如:
> Ubuntu/Debian: apt-get install finger
> CentOS/RedHat: yum install finger
> ArchLinux: pacman -S finger
下面提到的其餘非內置命令相似
通常的Linux用戶都會用`sudo`來讓普通用戶能夠執行root操做, 所以對於已經存在的普通用戶,
也不可掉以輕心. `sudo`所管理的權限, 在`/etc/sudoers`以及`/etc/sudoers.d`中能夠查看,
最好常常檢查改文件以確保沒有普通用戶得到了意外的權限. 對於每一個普通用戶,
能夠用命令`groups username`來查詢其所屬的組, 若是是root或者sudo組,
或者該組在`/etc/sudoers`文件中, 那就要格外警覺了.
Linux下的自啓動流程根據其服務管理器的不一樣而不一樣, 經常使用的有如下三種:
[Upstart][upstart]是基於事件的,用來取代古老的/sbin/init進程來處理任務和服務自啓動的方法.
查看該類型的自啓動文件能夠用如下命令:
- 查看全部自啓動項目: `initctl list`
- 查看某個自啓動項目: `initctl show-config evil`
[SystemV][systemv]就是經常使用的`service start/stop/status xxx.service`命令背後的服務管理系統.
查看該類型的自啓動文件能夠用如下命令:
- 查看自啓動腳本: `ls /etc/init.d/`
- 查看運行級別的符號連接: `ls /etc/rc*.d/`
[SystemD][systemd]是現代的服務管理系統, 比較新的Linux版都已經遷移爲SystemD了.
有兩種方式查看全部自啓動的服務:
- `systemctl list-unit-files –type=service`
- `ls /lib/systemd/system/*.service /etc/systemd/system/*.service`
舊版本的Linux通常是Upstart和SystemV混用, 新版本都大多遷移到SystemD了.
除了上述的自啓動服務, Linux下還能夠經過計劃任務來進行持久化運行, 檢查異常的計劃任務相對簡單,
只須要查看`/etc/crontab`以及子目錄下`/etc/cron.*`的計劃任務文件便可.
用過Linux的都知道, 在`$HOME/.bashrc`文件裏能夠進行初始化配置並應用於每一個shell,
也就是說裏面的腳本在每次新開一個terminal的時候都是有可能被運行的.
這類配置文件包括`.bashrc`, `.bash_profile`, `.bash_login`, `.profile`等等.
其是否運行以及運行的順序由shell被調用時是否登陸, 以及是否交互運行來決定,
對於bash來講, 執行流程以下表:
腳本名稱 |交互登陸|交互非登陸|腳本(即非交互)
------------------|--------|----------|--------------
`/etc/profile `| A | |
`/etc/bash.bashrc`| | A |
`~/.bashrc `| | B |
`~/.bash_profile `| B1 | |
`~/.bash_login `| B2 | |
`~/.profile `| B3 | |
`$BASHENV `| | | A
` `| | |
`~/.bash_logout `| C | |
其中執行順序爲`A->B->C`, B[123]表示只有當第一個腳本存在時候纔會執行. 用流程圖表示以下:
![啓動順序](http://www.solipsys.co.uk/images/BashStartupFiles1.png)
關於登陸/非登陸shell以及交互/非交互shell的內容能夠參考網上的其餘介紹, 這裏就不展開了.
只要知道本身的shell初始化所執行的文件順序, 並檢查這些文件看是否有可疑命令, 從而才能發現異常信息.
要找到全部可疑的自啓動項是困難的, 有經驗攻擊者能夠修改現有的自啓動腳本, 額外拉起命令,
從而減小被發現的風險. 一些Linux桌面版本也會負責運行相似的自啓動命令, 好比我最愛的xfce,
在`Settings -> Session Starup -> Application Autostart`就能夠添加自啓動的應用.
通常而言, 黑客獲取shell以後會在上面執行某些命令, 咱們能夠經過`history`命令來查看曾經運行過的命令.
或者直接查看`~/.bash_history`文件. 聰明的黑客幹完壞事也許會清理痕跡, 但若是發現history被惡意清除,
或者被異常篡改, 那也足以給咱們警示的信號了.
日誌, 尤爲是系統日誌, 是咱們絕佳的幫手, 下面一些命令能夠用來讀取日誌文件並輸出相關信息:
- 查看每一個用戶最近的登陸時間和ip: `lastlog`
- 查看每一個用戶的登陸記錄: `last`
- 查看每一個用戶的登陸嘗試(包括失敗的)記錄: `lastb`
- 查看當前登陸的用戶,ip以及正在執行的命令: `w`
固然, 有心的攻擊者也會在這些命令中隱藏本身的痕跡, 好比使用小工具[hidemyass][hidemyass].
系統日誌通常都由rsyslogd進程產生, 配置在`/etc/rsyslog.conf`文件以及`/etc/rsyslog.d/`目錄下,
一些常見的日誌和介紹以下:
- /var/log/messages: 通常的系統日誌
- /var/log/kern.log: 系統內核日誌
- /var/log/boot.log: 系統啓動日誌
- /var/log/auth.log: 登陸相關的日誌, 好比ssh/sudo成功失敗的日誌都在這裏
- /var/log/secure: 同上
- /var/log/cron.d: cron計劃任務的執行日誌
經過檢查上述日誌, 每每能夠發現一些意想不到的痕跡(若是有的話).
雖說自檢主要是從犯罪痕跡中找到線索和指示, 但有時候攻擊者留下的惡意軟件仍是會正在運行中的,
這時, 從犯罪現場來搜尋蛛絲馬跡也是一個不錯的主意.
查找異常進程, 能夠用`top`命令查看正在運行的程序所佔用的資源, 或者用`ps -ef`列出當前系統所用的進程.
若是發現本身不認識的進程, 能夠用如下命令進行詳細的檢查:
- 查看該進程啓動的完整命令行: `ps eho command -p $PID`
- 查看該進程啓動時候所在的目錄: `readlink /proc/$PID/cwd`
- 查看該進程啓動時的完整環境變量: `strings -f /proc/$PID/environ | cut -f2 -d ‘ ‘`
- 列出該進程所打開的全部文件: `lsof -p $PID`
- 列出該進程所打開的網絡鏈接: `netstat -pan | grep $PID`
固然, 若是攻擊者用某種手段隱藏了進程, 也仍是會留下一些線索, 好比可疑的LKM模塊, 這裏就不深刻了.
若是某個惡意進程正在活動, 極可能此時正在與外界網絡有交流, 這就須要經過抓包工具來進行分析了.
對於Linux桌面用戶, wireshark是個絕佳選擇, 而對於服務端, tcpdump是個好工具, 對其掌握也是很必要的.
以wireshark爲例, 打開抓包幾分鐘左右, 經過內置的過濾規則, 加上上面分析到的應用所打開的網絡鏈接,
就能夠看到這個惡意應用到底在和外界作些什麼邪惡的交流, 從而及時評估損失和保護數據.
除了惡意軟件發起的網絡瀏覽, 還有一些是經過自身發起的. 好比攻擊者修改了iptables,DNS,http代理,
或者`/etc/hosts`, 均可能會致使咱們正常的網絡請求被攻擊者監聽並篡改. 這些小小的修改也許不是很明顯,
可一旦發現自身網絡環境’不太對勁’, 就要提升警戒, 仔細排查了.
使用Linux做爲平常桌面操做系統的人, 通常都是有必定的技術水平, 但道高一尺, 魔高一丈,
攻擊Linux的人對應地技術水平也會高些, 因此本文相對於[Windows版的自檢][windows]略爲詳細.
正所謂’未知攻,焉知防’, 本文不少自檢方法也是根據筆者平常的紅隊經驗獲得的,
但願能對提升小夥伴們的安全意識和防禦能力有所幫助吧.
[windows]:https://www.pppan.net/blog/detail/2017-11-08-windows-self-check
[upstart]:http://upstart.ubuntu.com/cookbook/
[systemd]:https://fedoraproject.org/wiki/Systemd#systemd_documentation
[bashinit]:https://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc/
[hidemyass]:https://github.com/pannzh/hidemyass