大厂面试(安全岗)

122次阅读
没有评论

这些是今年 3 - 9 月份各个大厂问我的一些问题 , 这里给出了我的一些解决方案 , 包括阿里 , 腾讯 , 字节 , 美团问道的一些问题 , 当然有一些问题我没有给出答案 ( 涉及到自己的一些技巧 ), 也有一些常规问题没有罗列 , 比如自我介绍 , 项目经验 , 还有根据你的简历问的东西我就没有罗列出来 , 以及一些非常简单的问题我也没有罗列出来 , 比如 sqlmap –os-shell 原理是啥 ,ok

1.shiro 反序列化
shiro550( 命令 => 序列化 =>AES 加密 =>base64 编码 =>RememberMe Cookie 值 )
比较重要的是 AES 加密的密钥 , 一般的 shiro 利用工具就是找到其默认的 AES 的 key, 然后反序列化执行我们的恶意 payload 即可
一些问题
ysoserial 是什么 ?
ysoserial 工具集成了大量 java 反序列化的 payload, 包括 fastjson,spring,weblogic 等
Java Runtime 为什么要 bash 编码 ?
管道符、输入输出重定向 , 只有在 bash 环境下才能用
shiro550 与 shiro721 的区别是什么 ?
加密的方式不同了 ,721 用的是 AES-128-CBC 加密
利用失败的原因可能有哪些 ?
没有找到真的 gadget, 亦或者是经过 oracle padding 加密后的 payload 过长导致打不进去

2.fastjson 反序列化
特征 : 一些 json 的字符串 , 直接用 payload 请求 dnslog
fastjson 就是将 json 格式转换为类、字符串等 , 或者将类、字符串等数据转换成 json 数据 , 类似序列化的操作
fastjson 版本 <= 1.2.24(jndi 注入和 JSON.parseObject() 函数的反序列化 )
一些问题
如何理解反序列化 ?
我们是没办法直接转储对象 , 只能将对象的所有属性一一访问 , 保存 , 取出时一一还原 , 序列化与反序列化就是为了解决这个问题
rmi 和 ldap 是什么 ?
rmi 相当于是解决 java 客服端与服务端远程调用对象的一个方法 ,ldap 就是身份认证认证
jndi 和 jdbc 的区别和联系 ?
两者都是 API, 是连接数据库的标准
jdbc: 数据库可能改用别的产品 , 如改用 DB2 或者 Oracle, 引发 JDBC 驱动程序包和类名需要修改
jndi: 没有上述 jdbc 的问题 , 基本交给交给 J2EE 容器来配置和管理

3.cobalt strike 域前置
作用 : 隐蔽自己的远控
原理 : 比如在我们的通信层外部 , 域名叫做 a.com, 通信层内部 , 域名叫做 b.com, 然后 b.com 才是我们真正的域名 , 因为检测的话要么放行 , 要么禁止 , 检测内部层 , 成本太高 , 所以放行
操作 :cs 设置一个监听器(host 改为谷歌和端口号 443) –> 然后部署 gae( 谷歌的云平台 ) 代码 , 参数的内容包括 cs 的 ip 或域名 –> 更改我们的 cs 配置文件

4. 内存马
tomcat 内存马(注册 filter, 打 shiro,fastjson)
过程 :
客户端发起请求 -> 经过监听器 listener -> 经过 filter( 起编码 , 敏感过滤的作用 ) -> 到达 servlet(web 内容的呈现 , 渲染 , 交互) -> 最后 response 我们的客户端
当我们注册了 filter, 我们可以对请求和响应消息进行预修改 , 当然 , 我们也可以注册多个 filter, 从而形成 filter 链
所以 , 我们现在需要注册恶意的 filter, 载入 jvm 内存即可
如何查杀 :
因为此类内存马是通过 filter 注册的 , 所以查看 filter 节点的数据 , 检查是否存在我们不认识的 , 或者没有在 web.xml 中配置的 filter, 或者 filterClass 为空的 Filter
当然亦或者可以把 jar 包 dump 下来反编译看源码 , 哈哈哈哈 , 但是最主要的还是看我们 web 容器是怎么被突破的 , 缩小入口点嘛
spring 内存马(注册 controllers, 打 spring mvc 框架的)

5.tp5rce 分析
比如我们的 paylaod:?s=index/\think\app/invokefunction?function=call_user_func&vars[0]=system&vars[1]=whoami
跟据代码的信息可以得知通过?s 的方式传入路由信息 -> 控制器的名字中存在 \ 或者以 \ 开头 , 会被会被当作一个类 , 可以利用命名空间 , 实例化任意类 ->
执行的实例化类的方法 , 然后方法里面对应的参数通过 get 请求传入 -> tp 的路由规则是 ?s= 模块 / 控制器名 / 操作名
总的操作流程 :
找到控制器 -> 导致可以用命名空间的方式来调用任意类的任意方法 -> 进而通过对应的内部函数通过 get 请求传入拿下 shell

6. 内网 kerberos 认证 , 金银票据 , 约束委派 , 权限维持 ,bypassuac,dll 注入 \ 劫持
kerberos 认证
一些基本概念 :
KDC 负责管理票据、认证票据、分发票据 , 但是 KDC 不是一个独立的服务 , 它由以下服务组成 :
Authentication Service: 为 client 生成 TGT 的服务
Ticket Granting Service: 为 client 生成某个服务的 ticket
1. 客户端向 kerberos 请求访问服务端的权限 , 然后 Kerberos 在 account database 查看我们客服端的账户是否是白名单 , 是的话将 tgt 返回给客户端
ps: 生成的 tgt 用的是 krbtgt 用户的 hash, 如果我们拿到了 krbtgt 的 hash, 就可以伪造黄金票据了
2. 客户端拿到 tgt 后 , 再次像 kerberos 申请访问服务端的请求 ,kerberos 通过检测 tgt 确认无误后 , 将访问客户端的 ticket 给了客户端
3. 然后访问成功
白银票据 :
当我们知道了 server 的 hash, 就可以跳过认证的第一步和第二步 , 直接请求成功
黄金票据 :
当我们知道了 krbtgt 的 hash, 就可以伪造第一步的 tgt, 进而拿到黄金票据
两者的防御方法 :
1. 及时更新 krbtgt 用户的密码
2. 开启 pac 认证

基于资源的约束委派 : 一个专门将用户加入域环境里 , 当我们拿下这个这个账号时 , 相当于拿下了其他被它加入的域机器
约束委派 : 域用户账号分为 3 类, 服务账号 ( 数据库 ,sql 账号 ), 主机账号 (system 权限 ), 普通账号 ( 域账号 ),A 机器委派给服务账号 B , 当我们拿下服务账号 B , 即相当于拿下机器 A

权限维持
1. 利用 sc 自启动
2.shift5 次后门后门 , 添加隐藏用户 , 金银票据
3. 利用 acl 添加普通用户的完全访问权限 ps:acl = 访问控制列表

bypass uac
uac 的原理 : 因为有一些系统程序 , 直接获取管理员权限 , 同时不弹出 uac 的窗口 , 这类程序统称为白名单程序 , 这些程序拥有 autoElevate 属性的值为 True

dll 注入 \ 劫持
dll 注入 : 将我们的 shellcode 注入某一个进程支持的 dll 中 , 修改或拓展程序行为
dll 劫持 :a.exe 运行需要 b.dll, 我们将恶意的 c.dll 放置在比 b.dll 更优先级执行的位置 , 也是通常白 + 黑常用的方式

7. 护网前的信息收集
(1) 常规的资产收集 , 包括子域名 , 端口 ,c 段 , 旁站等 , 对于医院可以搜寻公众号 , 学校可以搜索 qq 群
(2) 邮件搜寻 , 脉脉在职员工定向钓鱼 (vx, 手机号 ), 公司组织架构 , 电话 , 物理地址 ( 打不动可以考虑物理渗透 )
(3) 服务器的提供商 , 各类云 , 各类 waf,vpn 的设备是什么 , 现在供应链是新的方向了

8.cors 与 csrf
cors
同源策略 : 协议 ,https/http, 端口 , 域名 (子域名) 三者保持一致 , 如果不一致将会无法请求数据
因为有了同源策略 , 导致跨域访问技术的提出 , 而我们的 cors 就是我们的跨域技术之一 , 此外还有我们的 jsonp 也是跨域技术之一
我们的 cors 也分为简单请求和非简单请求 , 区别在与请求方法(get,post,head), 请求头包含的字段(Accept-Language,Content-Type)
隐患 :cors 处理跨域请求的时候 , 并没有先验证 , 而是先处理了请求 , 打破了传统同源策略下不能跨域读写资源
攻击场景 :
(1) 正常的网页被嵌入了到攻击者控制页面的跨域请求 , 从而劫持用户的会话 , 访问内网的敏感资源
(2) 绕过 http-only
csrf
用当前用户的权限去执行当前用户能做的事情 , 比如后台管理员新增用户 , 修改密码 , 当然也能 getshell, 看你的表单怎么构造以及当前用户的权限是否能够新增修改模板代码
防御方法 :
(1) 增加 referer 头
(2) 增加 token 的验证 , 以及各种二次验证 , 比如验证码 , 二次密码
(3) 尽量使用 post 方法

9.xss 与 sql 注入
xss: 尖括号绕过 , 引号绕过
sql 注入 : 逗号如何绕过 , 盲注除了 sleep 还有什么什么函数 , 笛卡尔注入原理是什么 , 宽字节绕过的原理是什么

10.redis
windows 与 redis 常见拿 shell 的方法
windows:1. 绝对路径写 webshell 2. 或者用 msf 的脚本打 , 原理就是将 exp 写入宿主机 , 然后执行反弹 shell, 相当于我们的 mshta 上线 cs 一样
linux:1. 写计划任务 2. 公私钥 3. 绝对路径
redis 主从复制 :
主从模式是一个 redis 实例作为主机 , 其他实例都是备份机 , 主机和从机的数据是相同的 , 从机只负责读 , 主机只负责写。而我们的主从攻击的要求需要 redis 的版本在 4 -5, 是因为此版本的 redis 可以编译出我们恶意的 so 文件

11.csp
csp 是内容安全策略 , 能够阻止部分 XSS 攻击和数据注入攻击 , 为什么能阻止 , 因为开启 csp 后 , 当前服务器只信任当前域名 , 不信任任何 url, 不加载任何资源 , 相当于白名单机制。
如何绕过 csp 呢 ?
请求包 / 返回包看看 csp 字段 , 那些白名单网站是否能利用

原文链接:https://blog.csdn.net/weixin_43570648/article/details/120254570

正文完
 0