优先以 java 反序列化这些漏洞像 shiro,fastjson,weblogic,用友 oa 等等进行打点,随后再找其他脆弱性易打进去的点。
因为 javaweb 程序运行都是以高权限有限运行,部分可能会降权。
靶标确认、信息收集、漏洞探测、漏洞利用、权限获取。最终的目的是获取靶标的系统权限 / 关键数据。在这个过程中,信息收集最为重要。掌握靶标情报越多,后续就会有更多的攻击方式去打点。比如:钓鱼邮件、web 漏洞、边界网络设备漏洞、弱口令等。
有一个 redis 的未授权访问漏洞,redis 在默认的情况下会绑定在 0.0.0.0:6379, 如果防火墙没有做策略限制,则外网可以访问到 redis 上,如果没有设置 redis 密码(默认为空),会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据(这对于用于验证码码来说威胁很大),而且攻击者在未授权访问 Redis 的情况下,可以利用 Redis 自身的提供的 config 命令像目标主机写 WebShell、写 SSH 公钥、创建计划任务反弹 Shell 等。
iis: PUT漏洞、短文件名猜解、远程代码执行、解析漏洞
apache: 解析漏洞、目录遍历
nginx: 文件解析、目录遍历、CRLF注入、目录穿越
tomcat: 远程代码执行、war后门文件部署
jBoss: 反序列化漏洞、war后门文件部署
weblogic: 反序列化漏洞SSRF任意文件上传war后门文件部署
Apache Shiro 反序列化漏洞: Shiro rememberMe(Shiro-550) Shiro Padding Oracle Attack(Shiro-721)
Apache Shiro 是一个 Java 安全框架,执行身份验证、授权、密码和会话管理。apacheShiro 框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。
shiro 反序列化漏洞:shiro 在 CookieRememberMeManaer 类中将 cookie 中 rememberMe 字段内容分别进行序列化、AES 加密、Base64 编码操作。攻击者构造一个恶意的对象,并且对其序列化,AES 加密,base64 编码后,作为 cookie 的 rememberMe 字段发送。Shiro 将 rememberMe 进行解密并且反序列化,最终造成反序列化漏洞。
登陆失败时候会返回 rememberMe=deleteMe 字段或者使用 shiroScan 被动扫描去发现
完整:
未登陆的情况下,请求包的 cookie 中没有 rememberMe 字段,返回包 set-Cookie 里也没有 deleteMe 字段
登陆失败的话,不管勾选 RememberMe 字段没有,返回包都会有 rememberMe=deleteMe 字段
不勾选 RememberMe 字段,登陆成功的话,返回包 set-Cookie 会有 rememberMe=deleteMe 字段。但是之后的所有请求中 Cookie 都不会有 rememberMe 字段
勾选 RememberMe 字段,登陆成功的话,返回包 set-Cookie 会有 rememberMe=deleteMe 字段,还会有 rememberMe 字段,之后的所有请求中 Cookie 都会有 rememberMe 字段
shiro 有几种漏洞类型
shiro 550
shiro 721
Apache Shiro 框架提供了记住我的功能(RemeberMe),用户登录成功后会生成经过加密并编码的 cookie。cookie 的 key 为 RemeberMe,cookie 的值是经过对相关信息进行序列化,然后使用 aes 加密,最后在使用 base64 编码处理形成的
在服务端接收 cookie 值时,按以下步骤解析:
> 检索 RemeberMe cookie 的值
>
> Base 64 解码
>
> 使用 ACE 解密(加密密钥硬编码)
>
> 进行反序列化操作(未作过滤处理)
在调用反序列化的时候未进行任何过滤,导致可以触发远程代码执行漏洞
用户登陆成功后会生成经过加密并编码的 cookie,在服务端接收 cookie 值后,Base64 解码 -->AES 解密 --> 反序列化。攻击者只要找到 AES 加密的密钥,就可以构造一个恶意对象,对其进行序列化 -->AES 加密 -->Base64 编码,然后将其作为 cookie 的 rememberMe 字段发送,Shiro 将 rememberMe 进行解密并且反序列化,最终造成反序列化漏洞。
`CVE-2020-14883` 是一个 `Console` 的未授权访问,而 `CVE-2020-14883` 是在利用未授权访问的前提下,在 `Console` 进行代码执行,于是远程攻击者可以构造特殊的 `HTTP` 请求,在未经身份验证的情况下接管 `WebLogic Server Console` ,并在 `WebLogic Server Console` 执行任意代码。
1、 通过静态资源来绕过权限验证,防止被重定向到登陆界面。
2、 通过请求 `.portal` ,控制处理的 `Servlet` 是渲染 `UI` 的 `MBeanUtilsInitSingleFileServlet` 。
3、 通过编码后的 `../` ,让最终渲染的模版是 `console.portal` 。
综合起来,才造成了最终的未授权访问。
在请求包里面中发送恶意的 json 格式 payload,漏洞在处理 json 对象的时候,没有对 @type 字段进行过滤,从而导致攻击者可以传入恶意的 TemplatesImpl 类,而这个类有一个字段就是_bytecodes,有部分函数会根据这个_bytecodes 生成 java 实例,这就达到 fastjson 通过字段传入一个类,再通过这个类被生成时执行构造函数。
FastJson 是一个由阿里巴巴研发的 java 库,可以把 java 对象转换为 JSON 格式,也可以把 JSON 字符串转换为对象。
通俗理解就是:漏洞利用 fastjson autotype 在处理 json 对象的时候,未对 @type 字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程 rmi 主机,通过其中的恶意类执行代码。
攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大影响。
Fastjson RCE 的本质就是在反序列化时会调用目标类的 setter 方法。以 com.sun.rowset.JdbcRowSetImpl Gadget 为例,类中的 setAutoCommit 方法中通过 connect 方法调用了 lookup 方法,且 lookup 方法的参数又能通过 setDataSourceName 方法设置,即其参数可控。那么就会导致 JNDI 注入,最终实现任意命令执行。
Java 处理 Json 格式数据有三个比较流行的类库:
- Gson (google 维护)
- Jackson
- Fastjson
[MongoDB] 服务安装后,默认未开启权限验证。如果服务监听在 0.0.0.0,则可远程无需授权访问[数据库]
? 3.0 之前版本的 MongoDB, 默认监听在 0.0.0.0,3.0 及之后版本默认监听在 127.0.0.1。
? 3.0 之前版本,如未添加用户管理员账号及数据库账号,使用 --auth 参数启动时,在本地通过 127.0.0.1 仍可无需账号密码登陆访问数据库,远程访问则提示需认证;
? 3.0 及之后版本,使用 --auth 参数启动后,无账号则本地和远程均无任何数据库访问权限。
JNDI RCE 漏洞产生的原因就在于当我们在注册 RMI 服务时,可以指定 Codebase url,也就是远程要加载类的位置,设 置该属性可以让 JDNI 应用程序在加载时去寻找我们指定的类 ( 例如:http://ip:port/EvilObject.class) 。
这里还有一个比较重要的点,也是触发恶意代码的点。就是当 JNDI 应用程序通过 lookup (RMI 服务的地址) 方法调用指 定 Codebase url 上的类后,会调用被远程调用类的构造方法,所以如果我们将恶意代码放在被远程调用类的构造方法中时, 漏洞就会触发。
、
Apache Log4j2 是一个基于 Java 的日志记录工具。Apache Log4j 2.x <= 2.14.1 版本存在远程代码执行漏洞。 漏洞的主要原因是 log4j2 的接收器对于不可靠来源的输入没有过滤,攻击者则可以利用此特性通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。由于 Log4j2 组件在处理程序日志记录时存在 JNDI 注入缺陷,未经授权的攻击者利用该漏洞,可向服务器发送恶意的数据,触发 log4j2 组件的缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。
为了输出日志时能够方便地输出任意位置的 java 对象,Log4j2 引入了一个叫 Lookup 的统一接口。这个接口允许在写日志的时候,按照具体的实现逻辑去查找对象的位置,并输出对象的内容。这里的对象通常在内存中,但由于 java 支持对象的序列化 / 反序列化,它也可以存储在硬盘文件里,甚至是远程服务器上。
我们提到的 JNDI 就是对 Lookup 接口的一种实现。其本身也是一个接口,提供了命名关键字到对象的映射目录,允许开发者提供一个名称,即可获取到对象的内容。LDAP,即轻量级目录访问协议,是 JNDI 的一种底层实现,它可以让我们方便的查询分布式数据库。既然是分布式的,LDAP 允许从远程服务器加载对象。而这里加载对象时使用的不是一般的反序列化方法,而是通过「命名引用」功能,支持直接从远程下载 class 文件并加载对象。
于是,Log4j2 中就暗含了注入漏洞:允许传入参数解析为 LDAP 协议,从远程服务器下载 class 文件并执行。这个功能本来是为了方便开发,使 java 对象位置对上层应用透明,却不料酿成大祸
Struts2 是 apache 项目下的一个 web 框架,使用 OGNL 作为默认的表达式语言,由于 OGNL 能够创建或更改可执行代码,因此能够为使用它的任何框架引入严重的安全漏洞,多个 Apache Struts 2 版本容易受到 OGNL 安全漏洞的攻击。
Webshell 是黑客经常使用的一种恶意脚本,其目的是获得对服务器的执行操作权限,比如执行系统命令、窃取用户数据、删除 web 页面、修改主页等。黑客通常利用常见的漏洞,如 SQL 注入、远程文件包含 (RFI)、FTP,甚至使用跨站点脚本攻击 (XSS) 等方式作为社会工程攻击的一部分,最终达到控制网站服务器的目的。
黑客可以用 web 的方式,通过 asp 或 php 木马后门控制网站服务器,包括上传下载文件、查看数据库、执行任意程序命令等。
Webshell 可以嵌套在正常网页中运行,且不容易被查杀。它还可以穿越服务器防火墙,由于与被控制服务器或远程主机交互的数据都是通过 80 端口传递,因此不会被防火墙拦截,在没有记录流量的情况下,Webshell 使用 post 包发送,也不会被记录在系统日志中,只会在 Web 日志中记录一些数据提交的记录。
- WebShell 的分类 ①根据文件大小分类:大马和小马 (通常指的是一句话木马,能够使用菜刀这类工具去直接连接它) ②根据脚本名称分类:jsp、asp、aspx、php
- WebShell 的利用
寻找页面上传点
写好一句话木马(上传木马),比如如下的 PHP 一句话木马的代码:
`_POST['shell']); ?>`
然后寻找上传后的文件位置(绝对路径),可以用蚁剑、中国菜刀等工具连接到主机进行接下来的操作,比如提权。
- WebShell 有哪些特征?
- 持久化远程访问
Webshell 脚本通常会包含后门,黑客上传 Webshell 之后,就可以充分利用 Webshell 的后门实现远程访问并控制服务器,从而达到长期控制网站服务器的目的。此外,在上传完 Webshell 之后,黑客会选择自己修复漏洞,以确保没有其他人会利用该漏洞。通过这种方式,黑客就可以一种低调的姿态,避免与管理员进行任何交互,同时仍然获得相同的结果。
- 提权
在服务器没有配置错误的情况下,Webshell 将在 web 服务器的用户权限下运行,而用户权限是有限的。通过 Webshell,黑客可以利用系统上的本地漏洞来实现权限提升,从而获得 Root 权限,这样黑客基本上可以在系统上做任何事情,包括安装软件、更改权限、添加和删除用户、窃取密码、阅读电子邮件等等。
- 隐藏性极强
Webshell 可以嵌套在正常网页中运行,且不容易被查杀。它还可以穿越服务器防火墙,由于与被控制服务器或远程主机交互的数据都是通过 80 端口传递,因此不会被防火墙拦截,在没有记录流量的情况下,Webshell 使用 post 包发送,也不会被记录在系统日志中,只会在 Web 日志中记录一些数据提交的记录。
- WebShell 常用的 PHP 函数
Webshell 几乎适用于所有 Web 编程语言。之所以关注 PHP,是因为它是 web 上使用最广泛的编程语言。下面是 PHP 中一些执行 shell 命令最常用的函数。
- system()
system () 函数将命令作为参数,并输出结果。
下面的示例是在 Windows 操作系统上运行 dir 命令,然后返回 PHP 文件所在目录的目录列表。
```php
<?php
echo system('ls -al');
```
exec()
exec () 功能是将命令作为参数,但不输出结果。
如果指定了第二个可选参数,则返回结果为数组。否则,如果回显,只显示结果的最后一行。
```php
<?php
echo exce('ls -al');
echo exce('ls -al',$array);
var_dump($array);
```
shell_exec()
shell_exec () 函数类似于 exec (),但是,其整个输出结果为字符串。
```php
<?php
echo shell_exce('ls -al');
```
passthru()
passthru () 执行一个命令并返回原始格式的输出。
```php
<?php
echo passthru('ls -al');
```
- proc_open()
proc_open () 可以创建一个处理程序(流程),实现脚本和要运行的程序之间的通信。
- 倒引号
PHP 会首先执行 shell 命令中倒引号(`)内的内容
- System 函数的语法是: system (string $command [, int &end-inline-katex-->return_var ] )
- 同 C 版本的 system () 函数一样
- 本函数执行 command 参数所指定的命令,并且输出执行结果
- 命令执行后的返回值为输出值的最后一行
- 函数本身也会打印全部的输出值
- Exec 函数的语法为:exec (string $command [, array &$output [, int &c194a9eg<!-- begin-inline-katexreturn_var]] )
- 这个函数的作用是执行 command 参数所指定的命令
- 命令执行后的值为输出值的最后一行
- 函数本身不会打印任何内容
- Passthru 函数的语法为:passthru (string $command [, int &end-inline-katex-->return_var ] )
- 同 exec () 函数类似
- passthru () 函数也是用来执行外部命令 command 的
- 当所执行的系统命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec () 或 system () 函数。
- Shell_exec 函数的语法为: shell_exec (string $cmd)
- cmd 是要执行的命令
- String 是参数的数据类型,也就是字符串。
- 函数会在命令执行完成后将全部的输出值作为字符串输入返回值,本身并不打印任何信息。
- Shell_exec 函数的用法同反引号形同,注意是反引号(``)而不是普通单引号(’’)。
- 传统访问:用户访问域名 --> 解析服务器 IP--> 访问目标主机
- 普通 CDN:用户访问域名 -->CDN 节点 --> 真实服务器 IP--> 访问目标主机
- 带 WAF 的 CDN:用户访问域名 -->CDN 节点(云 WAF)--> 真实服务器 IP--> 访问目标主机
很简单,使用不同地方的 ping 服务,查看对应 IP 地址是否唯一,如果不唯一则极有可能是使用了 CDN
1、通过 ping 命令,查看回显情况 2、windows 系统环境下,使用 nslookup 进行查询,看返回的域名解析的情况 3、超级 ping 工具,比如”all-tool.cn/tools /ping“「看 ip 结果」
1、大小写检测:windows 大小写不敏感,而 linux 大小写敏感。
2、PING 指令:根据 TTL 值,winodws 一般情况下 > 100,linux<100 TTL (生存时间值):该字段指定 IP 包被路由器丢弃之前允许通过的最大网段数量。
1、net user test$ 123456 /add [建立隐藏用户]
2、net localgroup administrators test$ /add