成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux下的Rootkit駐留技術分析

系統 Linux 服務器
針對Linux設備的惡意軟件(以下稱為rootkit)通常需要長期駐留于目標操作系統以達到獲利目的,所以如何實現駐留也是Linux rootkit作者的重點考慮內容之一,對此,實驗室進行了可能的思路探索和分析。

 前言

Linux作為服務器和IoT設備使用的主要操作系統,針對它的惡意軟件也層出不窮。針對Linux設備的惡意軟件(以下稱為rootkit)通常需要長期駐留于目標操作系統以達到獲利目的,所以如何實現駐留也是Linux rootkit作者的重點考慮內容之一,對此,實驗室進行了可能的思路探索和分析。

在接下來的說明中,我們統一使用一個名為evil的靜態鏈接ELF文件作為我們要實現駐留的rootkit,所有的駐留嘗試均圍繞這個程序展開。

技術匯總

1. 用戶態下的可利用點

1.1 各種init的利用

Linux init

在systemd成為主流之前,sysvinit是大多數發行版的選擇,即使是Ubuntu之前使用的upstart,和sysvinit也是完全兼容的,直到今天,Debian系發行版仍保留sysvinit的兼容性。作為Linux的init程序,也就是PID 1,負責啟動之后的所有進程,所有的服務都是由它管理,因此它是實現rootkit駐留的最常見手段。

對于傳統的sysvinit,常見的駐留點都需要以root身份寫入:

  1. /etc/init.d/etc/rc[runlevel].d/etc/rc.local 

其實sysv的服務文件就是遵循sysv規范的shell腳本,它在嵌入式設備中也很常見。給出一個sysv風格的服務文件如下:

  1. #!/bin/shPATH=/bin:/usr/bin:/sbin:/usr/sbin 
  2. DESC="cron daemon"NAME=cron 
  3. DAEMON=/usr/sbin/cron 
  4. PIDFILE=/var/run/crond.pid 
  5. SCRIPTNAME=/etc/init.d/"$NAME"test -f $DAEMON || exit 0 
  6.  
  7. . /lib/lsb/init-functions 
  8.  
  9. [ -r /etc/default/cron ] && . /etc/default/cronparse_environment() {    for ENV_FILE in /etc/environment /etc/default/locale; do 
  10.         [ -r "$ENV_FILE" ] || continue 
  11.         [ -s "$ENV_FILE" ] || continue 
  12.  
  13.         for var in LANG LANGUAGE LC_ALL LC_CTYPE; do 
  14.             value=$(egrep "^${var}=" "$ENV_FILE" | tail -n1 | cut -d= -f2) 
  15.             [ -n "$value" ] && eval export $var=$value 
  16.  
  17.             if [ -n "$value" ] && [ "$ENV_FILE" = /etc/environment ]; then 
  18.                 log_warning_msg "/etc/environment has been deprecated for locale information; use /etc/default/locale for $var=$value instead" 
  19.             fi 
  20.         done 
  21.     done 
  22.  
  23.     # Get the timezone set
  24.     if [ -z "$TZ" -a -e /etc/timezone ]; then 
  25.         TZ=$(cat /etc/timezone)    fi}# Parse the system's environmentif [ "$READ_ENV" = "yes" ]; then 
  26.     parse_environmentficase "$1" instart)    log_daemon_msg "Starting periodic command scheduler" "cron" # 這一行是我們修改的目標 
  27.     start_daemon -p $PIDFILE $DAEMON $EXTRA_OPTS 
  28.     log_end_msg $? 
  29.     ;; 
  30. stop)    log_daemon_msg "Stopping periodic command scheduler" "cron" 
  31.     killproc -p $PIDFILE $DAEMON 
  32.     RETVAL=$? 
  33.     [ $RETVAL -eq 0 ] && [ -e "$PIDFILE" ] && rm -f $PIDFILE 
  34.     log_end_msg $RETVAL 
  35.     ;; 
  36. restart)    log_daemon_msg "Restarting periodic command scheduler" "cron" 
  37.     $0 stop    $0 start 
  38.     ;; 
  39. reload | force-reload)    log_daemon_msg "Reloading configuration files for periodic command scheduler" "cron" 
  40.     # cron reloads automatically 
  41.     log_end_msg 0 
  42.     ;; 
  43. status) 
  44.     status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $? 
  45.     ;; 
  46. *)    log_action_msg "Usage: /etc/init.d/cron {start|stop|status|restart|reload|force-reload}" 
  47.     exit 2 
  48.     ;;esacexit 0 

我們在start case中做些修改,使之在啟動時執行我們的evil程序:

 

對于systemd,我們可以用更多手段實現駐留,甚至不需要root權限也可以:

  1. /etc/systemd/system/etc/systemd/user/lib/systemd/system/lib/systemd/user 
  2. ~/.local/share/systemd/user 
  3. ~/.config/systemd/user 

以下是一個利用systemd服務文件的示例:

 

systemctl --user enable service可以使服務隨用戶登錄啟動,systemctl enable service可以讓服務隨系統啟動。

  1. bashrc 

bashrc或者zshrc等文件會隨著shell的運行而被執行,利用時只需在里面加入惡意的shell script即可。

常見位置:

  1. /etc/profile 
  2. ~/.bashrc 
  3. ~/.bash_profile 
  4. ~/.bash_logout 

示例如下:

  1. xinitrc 

如果目標主機有安裝Xorg,我們也可以以下位置寫入shell script實現rootkit駐留,不需要root權限。

  1. ~/.xinitrc 
  2. ~/.xserverrc/etc/X11/xinit/xinitrc/etc/X11/xinit/xserverrc 
  3. 其它initrc 

任何應用程序都可能在啟動時執行代碼,而且它們很可能會執行用戶home目錄的rc文件。例如,我們甚至可以在vimrc里 寫入vimscript來執行代碼實現rookit的駐留,這同樣不需要root權限。

一個可能的示例如下:

 

1.2 圖形化環境的利用

雖然標準的服務器版Linux發行版是不會預裝Xorg的,但還是存在相當一部分用戶使用CentOS預裝gnome2的版本作為服務器操 作系統。因此,基于gnome等桌面環境和Xorg的駐留有時候也是重要的而且會容易被忽略的手段。

  1. XDG autostart for system 

/etc/xdg/autostart下的desktop文件會被主流桌面環境在啟動時執行。一個可能的示例如下:

  1. XDG autostart for user 

類似的,用戶可以在自己的~/.config/autostart目錄下加入需要自啟動的desktop文件。

1.3 crond的利用

這是一個很常見的駐留點,但需要注意的是,很多惡意軟件并不僅僅會把自己寫入用戶的crontab(如/var/spool/cron/root),它們會把自己寫入軟件包使用的crontab里面,如/etc/cron.d,這樣更不容易引起用戶注意。

 

1.4 替換文件

替換或者patch一些會被服務或用戶本身執行的程序文件,以同時執行惡意代碼,也是很常見的駐留方式。

我們可以方便的獲取到開源項目的源碼,進行修改,加上我們的惡意代碼并重新編譯,替換目標系統的相應文件。這樣我們的代碼就會隨之執行。

下面我們修改openssh portable 7.9的源碼,使之在特定條件下執行我們的代碼:

 

這里修改的函數是uncompress_buffer,用于處理壓縮傳輸的ssh連接。我們需要觸發它的時候,只需發起一個ssh -C即可。

 

如果沒有源碼,我們同樣可以給現有的binary注入shellcode,不過這種實現達到的功能相對有限,且可能會導致原文件損壞 。下面使用backdoor-factory進行shellcode注入,這個工具支持自定義shellcode:

 

如果我們的目標主機是git或svn服務器,有機會接觸到項目源碼的話,也可以通過修改目標的源碼植入惡意代碼,或者把編譯環境動手腳,在項目構建時插入惡意代碼,比如在configure腳本里或者Makefile里插入代碼,既可以在本機運行,又有可能在編譯之后在更多主機(取決于項目用途)上運行,進一步擴大感染范圍。這個思路也是當年中國xcode事件黑客的思路。

1.5 動態鏈接庫劫持

替換動態鏈接庫

libc會被幾乎所有的ELF調用,而特定的lib則會被特定的ELF調用,只要某個ELF的執行概率夠高,我們同樣可以用我們重新編譯的惡意so替換掉它所鏈接的某個so文件,達到執行惡意代碼的效果。

當然,以這種思路來看,替換掉整個libc也是未嘗不可的。

下面以sshd的動態鏈接庫為例,sshd使用的so文件如下:

 

libz.so.1看上去像是zlib的文件,可以驗證一下:

 

那么我們可以去下載zlib源碼,在可能會被調用的函數里加上我們的私貨。

經過grep搜索openssh portable 7.9的源碼,可以看到packet.c使用了zlib的函數:

 

確定了我們需要注入代碼的函數,就可以去修改zlib源碼了,在inflate.c的inflate函數里加入簡單的system調用,來執行我們的evil程序:

 

完成修改之后我們make構建項目,然后用我們的惡意libz.so替換原本的文件。

此處修改的zlib,通常只會在ssh客戶端指定了使用壓縮時,才會被使用。所以我們需要使用ssh -C命令去測試。

 

提醒一點,作為動態鏈接庫,它們的函數可能被頻繁調用,我們在利用的時候要避免造成不必要的負載。另外,由于大部分程序都是動態鏈接庫文件,我們也需要格外小心,避免加入的代碼調用的程序最終往回調用我們修改的庫文件本身(尤其是在修改libc的時候),造成死循環,導致系統停止響應。

  1. ld.so.preload 

最常見的實現是在/etc/ld.so.preload中寫入我們需要讓libc執行的so文件,或者設置LD_PRELOAD環境變量,這樣,任何依賴系統libc的user space程序,都會在運行之前執行我們的so文件,從而實現了有效的rootkit駐留(鑒于幾乎所有目標主 機都是動態編譯的,幾乎所有程序都要使用系統libc)。

下面我們編寫一個簡單的惡意so(shared object)作為說明:

這里的惡意so將編譯為libevil.so。通常的lib都是為主程序提供庫函數的,只有被調用的代碼才會被執行,于是我們需要 解決的第一個問題是讓我們的代碼在lib被加載時直接自動運行。類似于Windows下的DllMain,gcc提供了function attributes,我們可以用形如__attribute__((constructor))的attribute來達到目的。對應的,__attribute__((destructor)) 則會在lib被unload的時候執行。

具體解釋見官方文檔:

 

我們使用如下代碼構建libevil,這里有一個坑,execl函數只有出錯時才返回,如果使用它執行了外部程序,那么在外部程 序執行完之后,libevil將會退出當前進程(也就是我們本來要執行的進程),使任何ELF都無法正常執行。解決方法是使用 fork 函數創建子進程,在子進程里執行execl啟動外部程序。

 

 

使用如下命令構建我們的 libevil.so:

 

設置LD_PRELOAD環境變量,使我們的libevil在ld執行任何ELF之前被執行。

 

需要注意的是,我們的libevil會在每個動態ELF執行之前被執行,如果在其中調用了外部的動態ELF,那個ELF執行時會再次調用libevil,就會造成死循環,使系統處于不可用狀態。

我們也可以在libevil里實現rootkit的所有功能。

2. 內核態的駐留

傳統的rootkit就是指這類惡意軟件,對于Linux rootkit來說,最有效的方法就是把自己作為kernel module加載,因為大多數Linux目標都是允許動態加載kernel module的。

在kernel space里運行惡意代碼的好處顯而易見,由于大部分審計工具都在user space運行,管理員通常很難發現惡意軟件的存在,這就帶來了上面的方法所不能達到的隱蔽性。

2.1 LKM – 可加載內核模塊

目前有一些開源的LKM (Loadable Kernel Modules) 木馬demo,比較有代表性的是Reptile,它使用自己的kernel module實現了隱藏和駐留。

下面我們使用這個思路來實現一個簡單的內核惡意代碼執行:

這里的LKM實現比較簡單,只是在加載和退出的時候執行了兩個shell腳本,并使用printk輸出了內核調試信息。我們只需定義兩個函數分別用于initialize和exit即可完成LKM的主體框架了,module.h會有相應函數module_init和module_exit用來實現。

MODULE_LICENSE也需要設置,因為Linux是GPL授權,我們需要聲明兼容的授權協議,否則Linux會提示tainted kernel(雖然不影響正常使用,但會比較容易引起注意)。編譯LKM的方法可以參考Linux內核文檔,或者直接參考現有的LKM項目的Makefile,這里的Makefile內容如下:

 

 

 

 

LKM代碼如下,使用user space helper達到了執行外部程序的目的:

 

 

 

 

使用insmod命令動態加載LKM到內核,立即生效:

 

下面是dmesg的相關輸出:

 

LKM執行惡意代碼有比較大的局限性,因為必須針對相同內核版本編譯才能正常使用,從而引入了Linux headers的依賴,實現大范圍傳播的難度較大。防范此類攻擊(也是最危險和隱蔽的一種)的最有效方法就是關閉Linux的動態模塊加載功能,對于大多數Linux服務器,關掉這個功能通常不會造成額外影響。

2.2 initrd的利用

Reptile會把自己寫入/etc/rc.modules以便在系統啟動時插入自己的module。但通過initrd實現更加隱蔽可靠。initrd即init ram disk,用于提供一個基本的環境以便啟動完整的Linux。

鑒于initrd很少受到關注和保護,它又一定會在啟動時被加載入內存,我們可以在這個內存文件系統中插入自己的LKM并修改init腳本使我們的LKM在啟動時被加載,從而實現惡意代碼執行。

這里以Kali(Linux 4.18,基于Debian Sid)為例,分析可能的利用點:

下圖是init腳本functions定義中,加載自定義kernel module的函數,我們可以把自己的LKM放到modules目錄下(例如 ./usr/lib/modules/4.17.0-kali3-amd64/kernel),然后在 ./conf/modules里寫上自己的LKM,我們的LKM就會隨著initrd加載到內核。

或者我們也可以直接在load_modules函數內增加modprobe操作來加載惡意LKM。

 

總結

Linux下的惡意軟件雖然種類不多,但就其駐留技術實現而言,還是有不少的方法。本文除了主流的實現之外,也提出了一些通常很少有人注意的實現方法,希望對Linux攻防對抗的朋友有所幫助。

責任編輯:武曉燕 來源: 瘋貓網絡
相關推薦

2015-10-22 15:38:22

2010-01-15 10:32:40

2010-01-14 20:57:59

2009-07-27 08:50:29

2017-01-03 16:57:58

2010-09-07 21:25:22

2010-01-11 10:17:12

2017-02-23 10:30:49

2021-10-11 09:21:14

惡意軟件黑客網絡攻擊

2020-05-21 14:28:00

Linux故障分析工具

2017-01-12 16:02:18

2016-09-20 22:04:55

Docker Linux Names

2011-04-02 10:29:20

Linux工具

2023-12-11 07:21:36

2009-04-01 14:33:33

2009-07-04 20:16:50

2020-05-15 08:28:18

二進制文件binLinux

2022-02-12 10:47:58

Rootkit僵尸網絡攻擊

2022-03-21 18:15:21

黑客網絡攻擊

2010-09-09 23:14:45

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 超碰在线人人 | 激情久久网 | 国产精品一区网站 | 黄色大片免费播放 | 欧美日韩电影免费观看 | 日韩欧美中文 | 一区二区中文字幕 | 免费观看的av毛片的网站 | 91精品国产综合久久久久 | 欧美一级高潮片免费的 | 成人福利网站 | 欧美一级黄带 | 欧美精品一区二区免费 | 久久久久久久久精 | 久久国产精品久久久久久 | 欧美久久一区二区三区 | 精品少妇一区二区三区日产乱码 | 国产精品久久av | 国产一区二区三区四区三区四 | 永久免费视频 | 久久精品福利 | 久久成人人人人精品欧 | 91久久精 | 最新中文在线视频 | 亚洲91| 国产精品亚洲一区二区三区在线 | 欧美激情久久久久久 | 国产欧美一区二区在线观看 | 精品国产欧美一区二区 | 97成人在线 | 欧美在线综合 | 天天操天天射综合网 | 亚洲精品国产成人 | av一区二区三区四区 | 日韩精品免费在线 | 欧美精品在线观看 | 久久精品国产久精国产 | 欧美激情黄色 | 亚州av | 狠狠爱免费视频 | 欧美四虎 |