-
-
[翻译]编写带密码保护的反向 Shell
-
发表于: 2019-5-30 12:26 9033
-
译者注:
首先,在阅读正文前,先来了解一下“反向 Shell”的概念。
反向 Shell,即从内部网络主动连接到外部主机,从而绕过网络防火请的封锁,建立远程连接。
下面的示意图或能更形象地表示:
解了 ?
首先,明确一下我们的目的:我们的目标是编写一个运行在 Linux x64 下的 shellcode,它能通过 TCP/IPv4 反向连接至远程主机;同时,远控端只有输入有效的密码,才能启用该 shell。
为了编写一个常规的反向 shell,我们需要调用一系列系统调用。具体的步骤如下(密码授权认证将在稍后叙述):
上述的每一系统调用都有唯一的标识,所以,特定的寄存器必须存储特定的值。例如,rax
寄存器用来区分执行的系统调用,所以它存储的是系统调用号。完整的系统调用表,请参考该 文档。
我们来看一下编写系统调用的一些例子。
这段代码存在一些问题。首先,是代码太长(足足 48 字节)。其次,包含太多的空字节(null bytes)。
接下来,我们来解决这两个问题!
下面的代码只有 12 字节长(为上述代码的 1/4)并且不含空字节:
为了实现反向 shell,我们所用到的系统调用,都要以这种方式编写。
为了实现密码认证功能,我们需要读取客户端的文件描述符,并将用户输入与密码比较,然后执行 shell。代码框架如下:
基本流程是,我们从 client 端的文件描述符读取用户输入的密码,将该输入与给定的密码比对,重复该过程直到密码正确。
基于我们前面准备的知识,现在我们要把这一系列系统调用串起来,组合成反向 TCP shell。下面是具体实现的例子,代码注释详细地阐述了每一块的功能:
我们通过汇编、链接和运行等步骤,测试该 shellcode 是否正常工作。我也开发了一些定制化脚本来自动化地汇编连接、提取shellcode以及生成测试架构。
为了测试,我们需要类似 netcat
的工具监听 4444 端口,启动 shellcode,netcat 将会反向连接回服务端。请看例子:
我们可以用strace
来验证和 Debug 这些系统调用。在下面的小短片可以看到,首先运行的是socket
和connect
组合,接下来是重复的 read
系统调用,最后输入正确密码后的 3 次 dup2
以及 execve
。
本文略有删改,并非按照原文逐字翻译!
翻译:看雪翻译小组 StrokMitream
校对:看雪翻译小组 lordVice
赞赏
- 通过 SWD 读写 STM32 固件 23042
- [翻译]我的创业产品如何被 2.2 W 美金收购 ? 8025
- [原创] 20 年征文 | 看雪之路 4690
- [翻译]使用 TensorFlow 机器学习自动化 RF 侧信道攻击 14868
- [翻译]固件分析--工具、方法技巧浅析(下) 21007