Vorder's blog

记一次防守总结

字数统计: 2.2k阅读时长: 8 min
2019/07/01 Share

为期20天的某行动终于结束,期间见识到不少攻方大佬的神仙操作,也从我方大佬学习到不少防守/应急方面的知识。为此我打算梳理下近期学习/感悟到的一些知识点。

资产整理阶段

  • 资产整理

初期的资产整理相当重要,尤其需要联合企业对内网系统的(网站名/域名/ip/框架/脚本/中间件/版本号/系统/补丁情况)等一系列资产信息做成excel表,方便进入正式防守阶段的应急响应/问题定位速度。
高亮标注互联网资产,方便应对初期的外部攻击。

  • 划分好内网情况

各个网段对应的办公区域
如:
10.1.2 对应开发部
10.1.3 对应营销部

防守阶段

提高防守效率

首先作为防守方,由于被动获取信息量太过庞大。为此我们只能通过查看apt、ips、ids、大数据等感知设备的告警方式,来识别攻击行为。但是在一家大企业里面,可能会用到多家公司的设备,那么频繁切换设备页面查看报警信息无疑会浪费大量时间。此时我们应当编写个整合apt/ips/大数据的报警信息的定时刷新脚本,来方便对告警信息监控(由于比较懒,就写了几个简易脚本分屏监控)。
ps:如果作为完整的监控一体化脚本的话推荐加入(误报去除/攻击ip地址聚合/ua等特征识别/ip频率统计)

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
import requests
import json,time,sys
import hashlib

##-----check---------
if len(sys.argv)!=4:
print('[!] Usage: python %s 1.1.1.1 [admin] [password] \n'%sys.argv[0])
exit(-1)


requests.packages.urllib3.disable_warnings()

headers= {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",
"Referer":""
}
data={"endTime":"","startTime":"","from":0,"size":500,"interval":"默认","searchTypeNum":2,"queryStr":"","condition":{"str":{},"num":{},"strNot":{},"numNot":{}},"extraUi":{"alarmStatus":{"unprocessed":0,"processing":0,"processed":0,"falsePositives":0},"threatSeverity":{"High":0,"Medium":0,"Low":0},"killChain":{"Scanning & Probing":0,"Penetration Attack":0,"Obtain Permission":0,"Command & Control":0,"Asset Destruction":0,"others":0},"attackIntent":{"exploitAttack":0,"maliciousFile":0,"DoS":0,"scanProbe":0,"anomalyEvent":0,"systemManagement":0,"APT":0,"others":0},"srcSecurityZone":"","srcAddress":"","srcPort":"","srcUserName":"","direction":"","destSecurityZone":"","destAddress":"","destPort":"","destHostName":"","requestUrl":""},"userName":"admin"}
host="https://"+sys.argv[1]
username=sys.argv[2]
password=sys.argv[3]
headers['Referer']=host+"/index.html"
sum_=1
# data["queryStr"]=''' (NOT name:*DNS* AND NOT rawEvent:*youdao*) '''

##-----config---------
#设置显示字段
display=['起始时间(startTime)','数据流方向(direction)','来源IP(srcAddress)','目的IP(destAddress)','事件名称(name)']#,'原始事件(rawEvent)'
#设置间隔时间/s
interval = 300

##-----login---------
try:
s=requests.Session()
s.get(url=host+"/index.html",verify=False)
login={"username":username,"password":hashlib.sha1(password.encode('utf-8')).hexdigest()}
s.post(url=host+'/api/login',headers=headers,data=login, verify=False)
except Exception as e:
print("[-] login error")
exit(-1)
##-----main---------
while True:
times=int(time.time())
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(times))
data["startTime"]=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(times-interval))
data["endTime"]=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(times+120))#redress ailpha time
headers["Content-Type"]="application/json"
html=s.post(url=host+"/api/search/events/getList",headers=headers,data=json.dumps(data), verify=False).text
try:
dic = json.loads(html)["data"]["data"]
except :
continue
count=len(dic)
for j in range(count,0,-1):
print('[+] ',end="")
for i in display:
try:
print(dic[j][i],end=" | ")
except :
pass
print("\n")
print("[====================================================================================]")
print("[ 互联网ip事件监测 ]-[ {t} 分钟一次:第 {x} 次 ]-[ 事件 {count} 次 ]-[ {now} ]".format(host=host,t=int(interval/60),x=sum_,count=count,now=now))
print("[====================================================================================]")
time.sleep(interval)
sum_+=1

提高攻击识别率

单看告警信息的话我们会忽略很多信息。比如处在第一步信息搜集阶段的目录扫描/域名扫描/账号变更的爆破尝试。

基于上述问题我在防守中想到的简单应对方式:

0x00 日志筛选。

如我们防守网站为java框架,日志访问信息中出现.php/.aspx文件访问请求,说明这些请求为目录扫描请求。

曾在防守时候见到一大串的.php文件扫描请求,根据导出日志进行筛选匹配,发现攻击者使用御剑进行目录扫描,由此我们可以在筛选中加入一些御剑里特有的目录进行防御。同时该类扫描会使用PUT请求来发送,在核实业务里面不存在该类请求方式后也可将PUT/DELETE…该类请求加入黑名单。

0x01 频率统计

攻击者可能在漏洞发现阶段对一个系统进行大量重复性的测试,而该类请求又不包含敏感操作,此时我们可以简单的对全天/指定时间段内日志进行导出,放入excel进行来源ip次数统计,统计数值大的可以认定为恶意ip。
同理可以对已知恶意ip做一个聚类分析,在防守阶段我们发现针对我们的攻击ip显著分布于北京/江苏地区,且大量ip来源于一个小众idc。

0x02 来源ip的反查

借助ip反查whois等网站接口实现自动的反查ip关联信息。

在防守中遇到有老哥使用自己的vps,同时vps上绑定过相关域名信息,此时可以通过获取到的相关邮箱等信息进行一波反向社工

0x03 ua的识别

有些使用脚本的老哥可能忘记在脚本里面加入ua导致默认请求里面包含python-request头。

或者这些老哥没有引入随机ua头,导致相关的攻击行为容易通过ua特征识别出来。
ps:这些攻击者特别喜欢使用mac os,见到mac的ua头可以留意一下

应急

终端主机发现问题:

  • 先断网
  • 保持开机
  • 等待从业人员现场分析

如确定相关病毒文件后:
在线沙箱丢进去分析一下
先查看设备开放端口 netstat -ano | more
使用DNSQuerySniffer查看可疑的域名
借助LiveTcpUdpWatch将可疑域名与pid对应起来
安装sysmon 配置方式sysmon.exe -i -accepteula -h md5 -n -l(ps:可以将sysmon名称和资源更改为qq等常用软件名字逃过恶意软件反侦察)
在事件查看器-应用程序和服务日志-\Microsoft\windows\sysmon 中打开optional查看进程创建相关。追溯到原始恶意文件

蜜罐的使用

蜜罐可采用内外双布局的方式,布局内网有效感知内网横向攻击行为。布局外网的话可以使用mysql反读文件/页面嵌入js调用各社交网站的api来获取攻击者的相关信息。

学到的攻击思路

0x00 针对钓鱼的思路

ps:被第一天的反钓思路秀到。

正常的钓鱼思路可以:

  • 廉价的钓鱼

将exe或相关执行文件的图标伪造成excel,文件名.docx.exe 此方法无需相关0day漏洞及具有一定迷惑性。

  • 在邮件中引入url

使用相似域名做钓鱼系统,具体参考:unicode相关编码伪造成与目标域名相类似的地址进行钓鱼

  • 增加钓鱼成功率

钓鱼登录界面加入错误提示,用来收集多个用户密码

0x01 其他

某些防御设备会报爬虫行为,在开始信息搜集阶段,可以将ua伪造成google/360/sougou等搜索引擎爬虫,并混入正常流量,将扫描目录/子域名的行为伪装为爬虫所干。

弱口令命名格式:xx@年份 如:admin@2010 、 admin@2011.、Aalibaba123456、
绕过思路:

1. 请求头里面加命令 payload函数调用请求头绕waf
2. 和xss localtion 一个思路截取 ;后url来绕waf

github搜邮箱/各种搜邮箱猜解密码进去
CSDN搜索开发ID、邮箱、qq
没安装控件可能页面空白
webshell使用冰蝎
目录中查找相对于开发测试环境xxxx/v4/

0x02 其他大佬那看到的思路

  • 该自动化就去自动。# 用nessus配置规则去识别资产信息,这个确实秀的我一脸,以前一直不太注意nessus,这次大佬用这个斩获了一个2000多分漏洞,滋滋滋 !get到了。

  • 多注意边缘文件,越是端口号靠后的越要注意。1级目录不行那就2级,2级不行就3级,总会搞到点意外的东西。

  • 在内网横向的时候,ICMP和广播地址结合来扫描局域网内的所有主机。 # 这个操作也是秀的我头皮发麻,详情可以去看看tcpping这个工具,使用的ICMP的特性,穿透防火墙/过滤。

CATALOG
  1. 1. 资产整理阶段
  2. 2. 防守阶段
    1. 2.1. 提高防守效率
    2. 2.2. 提高攻击识别率
      1. 2.2.1. 0x00 日志筛选。
      2. 2.2.2. 0x01 频率统计
      3. 2.2.3. 0x02 来源ip的反查
      4. 2.2.4. 0x03 ua的识别
    3. 2.3. 应急
    4. 2.4. 蜜罐的使用
  3. 3. 学到的攻击思路
    1. 3.1. 0x00 针对钓鱼的思路
    2. 3.2. 0x01 其他
    3. 3.3. 0x02 其他大佬那看到的思路