首页
社区
课程
招聘
[翻译]编写带密码保护的反向 Shell
发表于: 2019-5-30 12:26 9033

[翻译]编写带密码保护的反向 Shell

2019-5-30 12:26
9033

译者注:
首先,在阅读正文前,先来了解一下“反向 Shell”的概念。
反向 Shell,即从内部网络主动连接到外部主机,从而绕过网络防火请的封锁,建立远程连接。
下面的示意图或能更形象地表示:

reverse shell

解了 ?

首先,明确一下我们的目的:我们的目标是编写一个运行在 Linux x64 下的 shellcode,它能通过 TCP/IPv4 反向连接至远程主机;同时,远控端只有输入有效的密码,才能启用该 shell。

为了编写一个常规的反向 shell,我们需要调用一系列系统调用。具体的步骤如下(密码授权认证将在稍后叙述):

上述的每一系统调用都有唯一的标识,所以,特定的寄存器必须存储特定的值。例如,rax寄存器用来区分执行的系统调用,所以它存储的是系统调用号。完整的系统调用表,请参考该 文档

我们来看一下编写系统调用的一些例子。

这段代码存在一些问题。首先,是代码太长(足足 48 字节)。其次,包含太多的空字节(null bytes)。
接下来,我们来解决这两个问题!

下面的代码只有 12 字节长(为上述代码的 1/4)并且不含空字节:

为了实现反向 shell,我们所用到的系统调用,都要以这种方式编写。

pic_03

为了实现密码认证功能,我们需要读取客户端的文件描述符,并将用户输入与密码比较,然后执行 shell。代码框架如下:

基本流程是,我们从 client 端的文件描述符读取用户输入的密码,将该输入与给定的密码比对,重复该过程直到密码正确。

pic_04

基于我们前面准备的知识,现在我们要把这一系列系统调用串起来,组合成反向 TCP shell。下面是具体实现的例子,代码注释详细地阐述了每一块的功能:

pic_05

我们通过汇编、链接和运行等步骤,测试该 shellcode 是否正常工作。我也开发了一些定制化脚本来自动化地汇编连接提取shellcode以及生成测试架构

为了测试,我们需要类似 netcat 的工具监听 4444 端口,启动 shellcode,netcat 将会反向连接回服务端。请看例子:

Reverse TCP shell authentication

我们可以用strace 来验证和 Debug 这些系统调用。在下面的小短片可以看到,首先运行的是socketconnect 组合,接下来是重复的 read 系统调用,最后输入正确密码后的 3 次 dup2 以及 execve

Reverse TCP shell authentication with strace

原文:165K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0k6h3c8A6N6h3#2Q4x3X3g2U0L8$3#2Q4x3V1k6K6P5i4y4U0j5h3I4D9y4e0W2Q4x3V1k6%4M7X3W2@1K9h3&6Y4i4K6u0V1j5g2)9J5k6s2m8S2M7%4y4%4L8%4u0V1i4K6u0V1M7s2u0G2N6r3g2U0N6r3g2V1i4K6u0V1M7X3g2$3k6i4u0K6k6g2)9J5k6s2y4Z5k6h3I4D9i4K6u0V1L8r3W2F1N6i4S2Q4x3X3c8^5y4U0c8Q4x3X3b7#2k6U0c8V1x3$3p5J5z5r3b7&6x3h3p5`.

本文略有删改,并非按照原文逐字翻译!

翻译:看雪翻译小组 StrokMitream
校对:看雪翻译小组 lordVice


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2019-5-30 12:32 被StrokMitream编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回