本人首先进行了linux的应急响应,windows之后再进行

Linux与Windows应急响应初体验

  • 1 linux应急响应
    • 1.1 账户:
      • 1.1.1 使用`cat /etc/passwd`命令查看passwd文件
      • 2.1.2 使用`cat /etc/shadow`命令查找shadow文件,该文件为密码文件的存储项
    • 1.2 入侵排查
      • 1.2.1 查询特权用户
      • 1.2.2 查询sudo
      • 1.2.3 通过`.bash_history`查看历史命令:
      • 1.2.4 登陆情况
      • 1.2.5 开机启动项
      • 1.2.6 任务计划
    • 1.3 日志分析:
      • 1.3.1 查询指令
      • 1.3.2 登录成功的IP有哪些:
      • 1.3.3、增加一个用户kali日志:
      • 1.3.4 删除用户kali日志:
      • 1.3.5 su切换用户:
    • 1.4 攻击/应急响应初体验
      • 1.4.1 准备
      • 1.4.2 收集信息
      • 1.4.3 应急响应
        • 查询登陆成功
        • 查询日志中的登陆失败
        • 查询爆破使用的字典
      • 1.4.4 保护策略
  • 2 Windows应急响应

1 linux应急响应

不知为何,本人的登录日志内容在/var/log/auth.log文件中,因此任何牵扯到secure的内容都更换为auth.log

1.1 账户:

1.1.1 使用cat /etc/passwd命令查看passwd文件

该文件存储了系统中所有用户的基本信息
七个字段每个字段用:隔开,七个字段分别为:

用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
重点查/bin/bash(是否用bin/bash,用了就是创建新用户,已经被入侵了。如果用bin/login,就没有被入侵)

在这里插入图片描述

2.1.2 使用cat /etc/shadow命令查找shadow文件,该文件为密码文件的存储项

在这里插入图片描述

1.2 入侵排查

1.2.1 查询特权用户

awk -F: '$3==0{print $1}' /etc/passwd
在这里插入图片描述
若有其他未知的特权账户则证明被入侵过

1.2.2 查询sudo

牵扯到提权

账户提权:内核漏洞提权(成功率最大,如果失败,用其他方法提权的成功几率无限趋于0),敏感文件提权(运气)
suid提权:(suid是某个二进制文件在执行时自动提升到root权限,执行结束之后回归到正常权限)
tomcat-syl ALL=(root) NOPASSWD:/usr/root/find
tomcat是一个普通用户,不需要密码以root权限去执行find
find exec可以执行命令

创建一个普通用户qq
在这里插入图片描述
查看权限:
在这里插入图片描述
给find加权:
在这里插入图片描述
普通用户qq使用find命令执行文件
find /usr/bin/passwd -exec whoami \;
在这里插入图片描述
使用find命令全局查找,有哪些文件拥有suid权限,如果有能执行命令的情况下需要重点关注。
sudo提权:
sudo允许执行某个命令,但未对命令参数做限制
sudo允许执行某个带参数的具体命令

若其他未知用户有ALL=(ALL:ALL)ALL则被入侵过
任意用户任意东西执行任意

1.2.3 通过.bash_history查看历史命令:

1、root 用户的历史命令
histroy
2、打开 /home 各帐号目录下的 .bash_history,查看普通帐号执行的历史命令。
为历史的命令增加登录的 IP 地址、执行命令时间等信息:
1)保存1万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
2)在/etc/profile的文件尾部添加如下行数配置信息:
######jiagu history xianshi#########
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"
######### jiagu history xianshi ##########
3)source /etc/profile 让配置生效
生成效果: 1  2018-07-10 19:45:39 192.168.204.1 root source /etc/profile
3、历史操作命令的清除:history -c
但此命令并不会清除保存在文件中的记录,因此需要手动删除 .bash_profile 文件中的记录。

在这里插入图片描述
完成以上配置后使用history命令查看:
在这里插入图片描述
显示执行命令的日期、IP、用户

1.2.4 登陆情况

查看登陆成功信息:
在这里插入图片描述

查看错误登录信息:

在这里插入图片描述

1.2.5 开机启动项

查看运行级别命令 runlevel

系统默认允许级别

	vi  /etc/inittabid=3:initdefault  #系统开机后直接进入哪个运行级别

开机启动配置文件

	/etc/rc.local/etc/rc.d/rc[0~6].d

1.2.6 任务计划

crontab -l   列出某个用户cron服务的详细内容Tips:默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如: /var/spool/cron/rootcrontab -r   删除每个用户cront任务(谨慎:删除所有的计划任务)crontab -e   使用编辑器编辑当前的crontab文件 如:*/1 * * * * echo "hello world" >> /tmp/test.txt 每分钟写入文件

重点关注以下目录中是否存在恶意脚本

	/var/spool/cron/* /etc/crontab/etc/cron.d/*/etc/cron.daily/* /etc/cron.hourly/* /etc/cron.monthly/*/etc/cron.weekly//etc/anacrontab/var/spool/anacron/*

小技巧:

	more /etc/cron.daily/*  查看目录下所有文件

1.3 日志分析:

日志文件说明
/var/log/cron记录了系统定时任务相关的日志
/var/log/cups记录打印信息的日志
/var/log/dmesg记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/mailog记录邮件信息
/var/log/message记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/btmp记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/log/utmp记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/secure记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中

1.3.1 查询指令

定位有多少IP在爆破主机的root帐号:

grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

定位有哪些IP在爆破:

grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

爆破用户名字典是什么?

grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

1.3.2 登录成功的IP有哪些:

grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

登录成功的日期、用户名、IP:

grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}' 

1.3.3、增加一个用户kali日志:

Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
#grep "useradd" /var/log/secure 

1.3.4 删除用户kali日志:

Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
# grep "userdel" /var/log/secure

1.3.5 su切换用户:

Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo:    good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now

在这里插入图片描述

改为自己的日志目录
在这里插入图片描述
在这里插入图片描述

1.4 攻击/应急响应初体验

1.4.1 准备

攻击机的ip地址:192.168.244.142
在这里插入图片描述
靶机端:192.168.244.141
在这里插入图片描述

1.4.2 收集信息

使用nmap命令查看靶机端ssh的端口为22
在这里插入图片描述
爆破会使用到密码字典,因此创建两个txt文件,
password.txt
在这里插入图片描述
users.txt
在这里插入图片描述
我们使用hydra进行暴力破解
在这里插入图片描述

[root@server ~]# hydra -L users.txt -P passwrd.txt ssh://192.168.244.141#-L users.txt: 从名为users.txt的文件中读取用户名列表
#-P password.txt: 从名为password.txt的文件中读取密码列表
#ssh://192.168.244.141: 指定攻击的目标为IP地址为192.168.244.141的主机上运行的SSH服务

!!!
我们可以看到爆破出来一个用户和密码
在这里插入图片描述
使用爆破的用户名和密码登录到上面
在这里插入图片描述
输入yes并输入密码
在这里插入图片描述
登陆成功!
在这里插入图片描述

1.4.3 应急响应

快速进入靶机中,进入/var/log目录下迅速进行日志查询

查询登陆成功

在这里插入图片描述
发现敌机登陆成功!真的很可恶

查询日志中的登陆失败

在这里插入图片描述
发现敌机登录失败340次,太可恶了

查询爆破使用的字典

在这里插入图片描述
这个攻击者怎么坏成这样,心机如此之重!

1.4.4 保护策略

deny_ssh.sh
在这里插入图片描述

在使用deny_ssh.sh文件生成的iptables
在这里插入图片描述
分析可得:
这个文件是由 iptables-save 命令生成的防火墙规则配置文件,包含了 Linux 防火墙 (iptables) 的完整规则集。让我为您详细分析其结构和含义:

文件结构概览
文件分为两个主要部分:

  1. filter 表:负责包过滤(接受/拒绝流量)
  2. nat 表:负责网络地址转换(NAT)

每部分都包含:

  • 默认链策略
  • 自定义链
  • 具体的防火墙规则
  • 结束标记 (COMMIT)

一、filter 表分析 (包过滤)

1. 默认链策略

:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
  • INPUT:接受所有入站流量
  • FORWARD:丢弃所有转发流量
  • OUTPUT:接受所有出站流量

2. 自定义链(Docker 相关)

:DOCKER - [0:0]
:DOCKER-BRIDGE - [0:0]
:DOCKER-CT - [0:0]
:DOCKER-FORWARD - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]

这些是 Docker 创建的自定义链,用于管理容器网络流量。

3. 主要规则分析

(1) SSH 访问控制

-A INPUT -s 192.168.244.129/32 -p tcp -m tcp --dport 22 -j DROP
  • 功能:阻止来自 192.168.244.129 的 SSH 访问
  • 细节
    • -s 192.168.244.129/32:源IP地址
    • -p tcp:TCP协议
    • --dport 22:目标端口22 (SSH)
    • -j DROP:丢弃数据包

(2) Docker 网络隔离规则

-A DOCKER ! -i br-00c71e29d5b2 -o br-00c71e29d5b2 -j DROP
-A DOCKER ! -i docker0 -o docker0 -j DROP
  • 功能:防止非 Docker 网桥接口的流量进入容器网络
  • 细节
    • br-00c71e29d5b2:自定义 Docker 网桥
    • docker0:默认 Docker 网桥
    • 规则确保只有来自这些网桥的流量才能进入容器

(3) 连接跟踪

-A DOCKER-CT -o br-00c71e29d5b2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-CT -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  • 功能:允许已建立的连接和相关的连接通过
  • 细节
    • --ctstate RELATED,ESTABLISHED:匹配已建立或相关的连接状态

(4) Docker 网络隔离策略

-A DOCKER-ISOLATION-STAGE-1 -i br-00c71e29d5b2 ! -o br-00c71e29d5b2 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-00c71e29d5b2 -j DROP
  • 功能:实现 Docker 容器间的网络隔离
  • 细节
    • 两阶段隔离策略防止不同网桥间的流量互通
    • 确保容器只能与同一网络中的容器通信

二、nat 表分析 (网络地址转换)

1. 默认链策略

:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

2. 主要规则分析

(1) Docker 端口映射

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
  • 功能:将目标地址是本机的流量重定向到 DOCKER 链
  • 细节
    • 实现 Docker 容器的端口映射功能

(2) SNAT (源地址转换)

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-00c71e29d5b2 -j MASQUERADE
  • 功能:为容器提供出站互联网访问
  • 细节
    • 172.17.0.0/16:默认 Docker 网络
    • 172.18.0.0/16:自定义 Docker 网络 (br-00c71e29d5b2)
    • MASQUERADE:将容器流量源IP替换为主机IP

(3) Docker 链规则

-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-00c71e29d5b2 -j RETURN
  • 功能:直接返回来自 Docker 网桥的流量
  • 细节
    • 不对容器间的流量进行 NAT 处理

关键发现与安全分析

  1. 容器网络安全

    • Docker 创建了两个网络:docker0 (172.17.0.0/16) 和 br-00c71e29d5b2 (172.18.0.0/16)
    • 实现了严格的网络隔离策略,防止容器间未经授权的通信
  2. 主机安全

    • 仅有一条明确的访问控制规则:阻止 192.168.244.129 的 SSH 访问
    • INPUT 链默认策略为 ACCEPT,存在安全风险
  3. Docker 网络配置

    • 使用了标准的 Docker 网络隔离模型
    • 为容器提供了出站互联网访问 (MASQUERADE)
  4. 潜在风险

    • 除 SSH 规则外,没有其他主机级防护
    • 所有入站流量默认被接受
    • 没有针对常见攻击(如端口扫描、暴力破解)的防护

再次尝试进行ssh暴力破解发现无法访问
在这里插入图片描述

2 Windows应急响应

使用windows 10系统,对其进行爆破,实现应急响应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92424.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92424.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92424.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络1-4:计算机网络的定义和分类

目录 计算机网络的定义 计算机网络的分类 计算机网络的定义 计算机网络的分类 按交换技术分类&#xff1a;电路交换网络、报文交换网络、分组交换网络 按使用者分类&#xff1a;公用网、专用网 按传输介质分类&#xff1a;有线网络、无线网络 按覆盖范围分类&#xff1a;…

在QT中动态添加/删除控件,伸缩因子该怎么处理

开发中遇到的问题[TOC](开发中遇到的问题)处理方式在我们的界面开发过程中&#xff0c;通常需要开发一些可以动态添加or删除控件的容器&#xff0c;类似Tab页一样&#xff0c;为了美观的话&#xff0c;我们通常使用伸缩因子将容器中的控件往一个方向挤&#xff0c;类似下面的控…

【设计模式精解】什么是代理模式?彻底理解静态代理和动态代理

目录 静态代理 动态代理 JDK动态代理 CGLIB代理 JDK动态代理和CGLIB代理的区别 总结 代理模式简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;扩展目标对象的功能。 代理模式有静态代理…

MCU AI/ML - 弥合智能和嵌入式系统之间的差距

作者&#xff1a;芯科科技产品营销高级经理Gopinath Krishniah 人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;是使系统能够从数据中学习、进行推理并随着时间的推移提高性能的关键技术。这些技术通常用于大型数据中心和功能强大的GPU&#xff0c;但…

Redis中的sdshdr的len和alloc那块的知识点详解

文章目录核心比喻&#xff1a;一个可以伸缩的水瓶场景一&#xff1a;创建一个新字符串场景二&#xff1a;追加字符串&#xff08;触发“空间预分配”&#xff09;场景三&#xff1a;再次追加字符串&#xff08;利用空闲空间&#xff09;场景四&#xff1a;缩短字符串&#xff0…

在Linux下访问MS SQL Server数据库

Linux作为一个免费的Unix类操作系统&#xff0c;以其开放性源代码、多任务、X window等特点为众多的用户所采用&#xff0c;并有很多企业采用Linux来作为其内部网的全功能服务器(WWW&#xff0c;FTP&#xff0c;Email、DNS)。企业的内部网不仅要提供文本信息的访问&#xff0c;…

计算机视觉-OpenCV

一下载第三方库opencv-python3.4.18.65opencv-contrib-python3.4.18.65import cv2 # 读取的格式是BGR numpy import numpy as np# 读取图片 a cv2.imread(generated_image.jpg) # 读取图片 print(a) # NumPy数组&#xff0c;其中存储了读取的图像文件的像素值。cv2.imshow…

解决GitHub无法打开

找到下图文件&#xff0c;用记事本打开 在最下方粘贴如下代码140.82.113.4 github.com 20.205.243.166 github.com 140.82.112.4 github.com 151.101.1.6 github.global.ssl.fastly.net 185.199.108.153 assets-cdn.github.com 185.199.109.153 assets-cdn.github.com 185.199.…

AWS VPC Transit Gateway 可观测最佳实践

AWS VPC Transit Gateway 介绍 Amazon VPC Transit Gateway 是一个网络传输中心&#xff0c;用于互连虚拟私有云 (VPCs) 和本地网络。随着您的云基础设施在全球扩展&#xff0c;区域间对等互连使用 AWS 全球基础设施将中转网关连接在一起。 AWS 数据中心之间的所有网络流量都在…

WeakRef的作用和使用

文章目录WeakRef的作用和使用使用 WeakRef 避免强引用&#xff1a;原理与实践一、WeakRef 的核心特性二、WeakRef 与强引用的对比三、WeakRef 的使用场景与示例1. 非关键数据缓存&#xff08;避免缓存导致内存泄漏&#xff09;2. 跟踪对象生命周期&#xff08;不干扰回收&#…

【华为机试】332. 重新安排行程

文章目录332. 重新安排行程题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路核心思路算法流程图欧拉路径原理DFS回溯机制字典序优化策略复杂度分析算法实现要点完整题解代码332. 重新安排行程 题目描述 给你一份航线列表 tickets &#xff0c;其中 tic…

通信算法之300:CRC表生成方式-CRC8、CRC16、CRC32-输入字节

"CRC表的MATLAB生成代码"生成的查找表可以用于快速计算 CRC 值&#xff0c;通过查表法可以显著提高 CRC 计算效率&#xff0c;尤其适用于需要处理大量数据的场景。下面是一个生成 CRC 查找表&#xff08;CRC Table&#xff09;的 MATLAB 代码&#xff0c;该代码可以根…

国内使用 npm 时配置镜像源

在国内使用 npm 时&#xff0c;由于网络限制可能会遇到下载速度慢或连接超时的问题。通过设置国内镜像源&#xff0c;可以显著提升下载速度和稳定性。以下是常用的国内 npm 镜像源及其配置方法。 查询当前使用的镜像源 npm get registry 设置为淘宝镜像源 npm config set reg…

一篇文章入门TCP与UDP(保姆级别)

&#x1f433;第一部分&#xff1a;什么是TCP和UDP? 先给结论&#xff1a;TCP 和 UDP 都是传输层协议&#xff0c;负责把数据从一台电脑 “搬” 到另一台电脑&#xff0c;但它们的 “搬运风格” 完全不同 &#x1f4e6; 比喻&#xff1a;TCP 像 "打电话"&#xff…

2024年测绘程序设计比赛--空间探索性分析(数据为2025年第三次模拟数据)

想要在2026年参加这个比赛的&#xff0c;可以加入小编和其它大佬所建的群242845175一起来备赛&#xff0c;为2026年的比赛打基础&#xff0c;也可以私信小编&#xff0c;为你答疑解惑一、读写文件 internal class Read {public static List<Point> pts new List<Poin…

力扣 hot100 Day68

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 class Solution { public:int largestRectangleArea(vector<int>&…

生成式AI时代,Data+AI下一代数智平台建设指南

DataAI下一代数智平台建设指南一、生成式AI时代的五大数据挑战二、驱动DataAI平台建设的核心要素主动选择&#xff1a;构建竞争壁垒被动应对&#xff1a;解决现有痛点三、DataAI平台的六大关键能力四、腾讯云DataAI产品方案与实践1. 数据与AI协同层2. 开发与治理层3. 存储与计算…

FPGA学习笔记——SPI通讯协议简介

目录 一、SPI通讯协议简介 二、SPI物理层 三、SPI协议层 1.通讯模式 &#xff08;一&#xff09;模式零 &#xff08;二&#xff09;模式一 &#xff08;三&#xff09;模式二 &#xff08;四&#xff09;模式三 2.通讯流程 一、SPI通讯协议简介 SPI&#xff08;Seria…

JavaScript核心概念解析:从基础语法到对象应用

导语&#xff1a;本文系统梳理JavaScript的核心知识框架&#xff0c;适用于编程入门学习者。内容涵盖基础语法、数据类型、函数应用及内置对象&#xff0c;帮助读者构建清晰的JS知识体系。一、语言基础与执行原理浏览器执行机制渲染引擎&#xff1a;解析HTML/CSS&#xff08;如…

在 Kotlin 中使用函数类型和 lambda 表达式

参考官方文档: https://developer.android.google.cn/codelabs/basic-android-kotlin-compose-function-types-and-lambda?hl=zh-cn#0 1、 将函数存储在变量中 作为一种一级结构,函数也属于数据类型,因此,可以将函数存储在变量中、将函数传递到函数,以及从函数返回函数…