web知识
WEB 知识点
用来记一些知识点的概念
最近主要学java安全
绕沙箱
- 检查所有进程id,无常见进程则不运行
- 查注册表反虚拟机
- IsDebuggerPresent反调试(非0则退出)
- 写入注册表开机启动
- raw+aes
- 系统服务
- 转移
防溯源
blogs/躲避检测/渗透测试中的身份隐藏.md at master · aplyc1a/blogs (github.com)
流量特征
cs shellcode
1、RWX(可读可写可执⾏)权限的内存空间
2、异或密钥固定,3.x 是 0x69,4.x 是 0x2e
3、命名管道名称字符串
\\.\pipe\MSSE-1676-server
%c%c%c%c%c%c%c%cMSSE-%d-sever
冰蝎
重点
1.0
- Content-Type: application/octet-stream
- Accpet头:application/xhtml+xmlapplication/xmlapplication/signed-exchange
2.0
- 动态秘钥
- 内置UA头
- AES+BASE64
- Content-Length: 16
3.0
默认密码 rebeyond
content-type application/octet-stream
Accept 头
application/xhtml+xmlapplication/xmlapplication/signed-exchange
4.0
- 默认密码rebeyond
- Accept : application/json, text/javascript, /; q=0.01 意思是浏览器可接受任何文件
- 大端口 长连接
1.0
1.Accpet 头 application/xhtml+xmlapplication/xmlapplication/signed-exchange
2.Content-Type: application/octet-stream
这是一个强特征,查阅资料可知 octet-stream 的意思是,只能提交二进制,而且只能提交一个二进制,如果提交文件的话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组),所以很少使用
2.0
1.使用 AES+base64,AES 使用动态秘钥进行加密。
2.请求的时候内置了十几个 UA 头,(导致频繁变化)
3.Content-Length: 16
3.0
在冰蝎中,任何请求,最终都会调用 Utils.getData 函数,对请求的参数加密。对于上传文件,命令执行来讲,加密的参数不定长。但是对于密钥交互,获取基本信息来讲,payload 都为定长,且无随机 padding。
1.固定链接秘钥
2.webshell 默认密码 rebeyond(md5(‘rebeyond’)[0:16]=e45e329feb5d925b)
3.连接 jsp 的数据包 content-type常见为 application/octet-stream
4.Accept 头 application/xhtml+xmlapplication/xmlapplication/signed-exchange
4.0
1.取消连接密码,自定义传输协议算法
2.Accept 字段(弱特征)通常是: application/json, text/javascript, /; q=0.01 意思是浏览器可接受任何文件,但最倾向 application/json 和 text/javascript。
3.Content-Type 字段(弱特征),通常是 Content-type: Application/x-www-form-urlencoded
4.连接使用本地端口在 49700 左右(就是比较大的端口),每连接一次,每建立一次新的连接,端口就依次增加。
5.使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection:Keep-Alive
6.固定的请求头和响应头,请求字节头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M ,响应字节头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd
哥斯拉
类似冰蝎 2.0 的密钥交换方式,webshell 动态生成
https://github.com/BeichenDream/Godzilla/releases
重点
- 请求包pass=”xxx”
- 响应包为 0
- md5 前十六位 +base64+md5 后十六位。
静态特征
在默认脚本编码的情况下,jsp 会出现 xc、pass 字符和 Java 反射(ClassLoader,getClass().getClassLoader()),base64 加解码等特征。
动态特征
1.Accept 字段(弱特征),默认是 Accept:text/html, image/gif, image/jpeg, *; q=.2, /; q=.2
2.Cookie 中有一个非常关键的特征,最后会有个分号。估计后续的版本会修复。
3.响应体的数据有一定特征,哥斯拉会把一个 32 位的 md5 字符串按照一半拆分,分别放在 base64 编码的数据的前后两部分。整个响应包的结构体征为:md5 前十六位 +base64+md5 后十六位。
4.请求包长度 52541
5.以 pass=“xxxx”
开始请求包
6.请求包较长,响应包为 0
7.一个 tcp 包里面有三个 http
8.一共 6 个 http 报文,3 去 3 回
蚁剑
重点
- UA头 antsword xxx (在/modules/request.js中可修改)
- @ini_set(“displyad_errors”,”0”)
- _0x参数
静态特征
蚁剑中 php 使用 assert、eval 执行;asp 只有 eval 执行;在 jsp 使用的是 Java 类加载(ClassLoader),同时会带有 base64 编码解码等字符特征。
动态特征
1.我们使用一句话木马上传 webshell,抓包后会发现每个请求体都存在以 @ini_set("display_errors","0");@set_time_limit(0)
开头。
2.并且响应体的返回结果是 base64 编码发混淆字符,格式为:随机数 结果 随机数。
3.参数名大多以“_0x…..=”这种形式(下划线可替换为其他)所以,以_0x 开头的参数名,后面为加密数据的数据包也可识别为蚁剑的流量特征
4.UA 头是 antsword xxx
菜刀
重点
- base64
- z0 z1参数
动态特征
1.payload 在请求体中,采用 url 编码 +base64 编码,payload 部分是明文传输。
2.payload 中有 eval 或 assert、base64_decode 这样的字符。
3.payload 中有默认固定的&z0=QGluaV9zZXQ…这样 base64 加密的攻击载荷
4.参数 z0 对应 $_POST[z0]
接收到的数据,且固定为 QGluaV9zZXQ 开头。
5.进行 base64 解码后可看到代码:@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);
这段意思是首先关闭报错和 magic_quotes,接下来去获取主机的信息。
web解析与编码
浏览器解析与编码顺序及xss挖掘绕过全汇总-腾讯云开发者社区-腾讯云 (tencent.com)
编码
url编码
%接ascil字符
HTML编码
&开头;结尾。
中间英文或者#后接十进制数或#x后接十六进制数。
JS编码
解析顺序
浏览器解析:(文档html解析生成DOM树和css样式表后)HTML解码,遇到<script>标签的时候将控制权交给JS引擎
由于需要先生成DOM树再解析html编码内容,所以不可以将标签进行html编码
解码顺序
HTML解码。JS解码。URL解码。
APP
过ROOT :Frida-AntiRootDetection:hook底层禁止检测su(那么其实也可以直接hook对应检测函数),Apatch框架,还有狐狸面具+shamiko、KSU框架都可以过root检测
绕过frida:二开,先开应用再开frida
抓包代理:根证书手动设置,SSLUnpinning和算法助手
脱壳:为了可以用jadx反编译,先用MT管理器或者找一些文件资源的功能点查壳,然后用Fundex等软件脱壳
HOOK函数:Frida(hluda)
免杀
免杀方法
- 修改特征码,猜测杀软对哪几个字节进行查杀,再对应修改(几乎没用了)
- shellcode 加载器,改变加载到内存的方式和加密方式(主流)(分离免杀)
- 反射 dll 加载,把 dll 加密,远程下载到内存中再解密执行(高级)
无文件执行木马的方式有哪些?
powershell(脚本解析器) 》》》powershell.exe(应用程序)
VB.script(脚本解析器) 》》》cscript.exe(应用程序)
bat 处理 (脚本解析器) 》》》cmd.exe(应用程序)
javaSrtipt(脚本解析器) 》》》mshta.exe(应用程序)
怎么做 shellcode 免杀?
- 编码
- 加壳
- 混淆
- 分离免杀
- 特征码修改
- 添加无用逻辑语句
- 重写 api
分离免杀怎么做?
分为加载器和 shellcode 两部分,一般将 shellcode 存储在网页或者图片中,然后加载器远程加载存在 shellcode 的网页或者图片之类的
powershell 怎么远程加载?
可以远程加载 mimikazt,远控文件,exe 可执行文件实现无文件落地
Webshell
1.高版本 php 不换行执行命令
2.\报错
3.十六进制字符串(php7 不是数字,php5 是)
4.jspx CDATA 特性
jsp 的后缀可以兼容为 jspx 的代码,也兼容 jspx 的所有特性,如 CDATA 特性 jspx 的后缀不兼容为 jsp 的代码,jspx 只能用 jspx 的格式 在 XML 元素里,< 和&是非法的,遇到 < 解析器会把该字符解释为新元素的开始,遇到&解析器会把该字符解释为字符实体化编码的开始 但是我们有时候有需要在 jspx 里添加 js 代码用到大量的 < 和&字符,因此可以将脚本代码定义为 CDATA CDATA 部分内容会被解析器忽略,此时 ameter 依旧会与 getPar 拼接成为 getParameter。
5.实体化编码
6.其他编码格式
msf/cs
1.shellcode 加密
2.垃圾字节
3.硬编码单字节秘钥进行运算
4.移位
5.交换连续字节
沙盒免杀
JAVA
基础概念
base 加密网站 Runtime.exec Payload Generater | AresX’s Blog (ares-x.com)
java-web 内存马 https://www.freebuf.com/articles/web/274466.html
rO0AB:base64 加密的 java 对象
JNDI(Java 命名和目录接口)
JNDI 是一个接口,在这个接口下会有多种目录系统服务的实现,我们能名称等去找到相关的对象,并把它下载到客户端中来。—DNS OR LDAP
RMI(远程方法调用)
作用
RMI 实现了 java 利用远程服务器为具体的 java 方法提供接口,本地只需要根据接口类的定义来提供参数即可调用,依靠 JRMP(远程方法协议)
要求
1.传输的类必须可序列化
2.客户端服务器的 serialVersionUID 字段相同,
3.被远程调用方法的对象一定要实现 java.rmi.remote 接口,
远程对象实现类必须继承 UnicastRemoteObject 类(或者构造方法调用 UnicastRemoteObject.exportObject()静态方法)
运行逻辑
0.JDK 提供注册表功能,创建 RMIRegistry 对象监听 1099 端口
手动注册如下
1.服务器随机监听一个端口
2.客户端的 stub 通过 JRMP 协议封装数据,调用了上面的方法
3.连接服务端并提交参数
4.执行方法 返回结果给客户端
shiro 反序列化
(apache 安全框架)
Shior550
https://blog.csdn.net/Aaron_Miller/article/details/106475088
取出请求包中 rememberMe 的 cookie 值 => Base64 解码=>AES 解密(用到密钥 key,硬编码)=> 反序列化。知道了秘钥就可以控制反序列化的内容来构造链子
则 payload 构造:序列化=>AES 加密=>BASE64=> 写入 cookie
条件:获取 key,存在攻击链
流程:攻击者搭建恶意 vps,存放反弹 shell(经过 base64 加密并且反序列化工具处理!这里的 base64 加密跟服务器无关,应该是为了免杀跟避免编码问题)的 payload1 并进行 JRMPListener,将上述 VPS JRMPListener 的地址进行 AES 加密和 base64 编码,构造请求包 cookie 中的 rememberMe 字段,向存在漏洞的服务器发送加密编码后的结果 payload2。
服务器接收到 payload2 进程 base64 解码 AES 解密,反序列化过程中触发 pop 链造成 payload2 中的语句执行,发现要和恶意 VPS 的 JRMP 通信,请求的过程中接收到了反弹 shell 的 payload1。
Shiro721
由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存在问题,用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行
条件:合法 cookie,攻击链
在一个合法的cookie后面,利用aes加解密机制往后填充恶意数据
绕waf
利用http请求头:请求头修改随机字符,置空
利用shiro特性:rememberMe脏数据,空白字符
绕过waf监控的对象:Host改ip 利用ipv6
fastjson 反序列化
(json 跟 java 对象转换库)
要求:RMI 服务的开启(x),没过滤 json 格式,1.2.24<fastjson 版本<1.2.80
fastjson 查看版本
fastjson反序列化漏洞区分版本号的方法总结 - komomon - 博客园
原理
Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象
AutoType 功能(代替了 setter/getter,当多个类继承同一类,又有同名属性,需要AutoType去指明他原始类),fastjson 在对 json 字符串反序列化的时候,会读取到 @type 的内容,将 json 内容反序列化为 java 对象并调用这个类的 setter 方法。
攻击分类
1.JNDI打:(JdbcRowSetImpl链)我们搭建一个远程恶意站点,然后构造语句去让服务器反序列的时候访问 rmi 服务器,rmi 服务器来执行我们在恶意站点上的 class 文件
1 |
|
2.传入恶意的 TemplatesImpl 类,而这个类有一个字段就是_bytecodes,有部分函数会根据这个_bytecodes 生成 java 实例,这就达到 fastjson 通过字段传入一个类,再通过这个类被生成时执行构造函数
1 |
|
无回显
1.一种是直接将命令执行结果写入到静态资源文件里,如 html、js 等,然后通过 http 访问就可以直接看到结果
2.通过 dnslog 进行数据外带,但如果无法执行 dns 请求就无法验证了
3.直接将命令执行结果回显到请求 Poc 的 HTTP 响应中
各版本
Java中Fastjson各版本漏洞对抗史与总结 - 先知社区
完全零基础入门Fastjson系列漏洞(基础篇) - 先知社区
首先要知道fastjson反序列化的时候通过AutoType去寻找对应类getter setter is 构造函数等方法并调用
TemplatesTmpl链
首先解释TemplatesTmpl本身的安全威胁
TemplatesTmpl包的getTransletInstance方法对于成员属性_class下标为_transletIndexdex类进行实例化
然后跟链子
一直往上分析,可以发现就是_1属性的getter方法
来到赋值类,_class类可控但是要求_bytecodes不为null,父类为ABSTRACT_TRANSLET
JdbcRowSetImpl链
好理解很多,setAutoCommit方法会调this.connect(当this.conn空),然后调用了lookup(this.getDataSourceName)
发现还存在一个setDataSourceName方法导致DataSourceName可控
绕过
1.2.25,1.2.42,1.2.44,1.2.45不断加入L; [等字符绕过过滤
1.2.47后利用autoType关闭时自动加载缓存的机制
加载缓存中的Class类,反序列时自动加载val对应的类
1.2.68后利用异常
Weblogic
(用于解析 java,部署大型分布式 Web 应用的 Web 中间件。)
分类:
1.weblogic 控制台的 7001 端口默认开启 T3 协议服务,T3 协议缺陷实现了 RMI
2.weblogic WLS Security 组件对外提供 webservice,使用 XMLDecoder 解析 XML 数据,存在反序列化漏洞
最早的版本过滤了object 后来用void绕过
指明使用XMLDecoder类,调用恶意类ProcessBuilder,调用start方法,传入字符数组
log4j2
(apache 日志库)
2.15.0>log4j2>2.0.0
远程代码执行原理
日志在打印的时候遇到 ${后以:分割为 prefix 和 key,对于 prefix 会调用 lookup 方法并且带入 key 参数
由于 JNDI 出栈没有做好过滤,攻击者利用 lookup 功能对{}内内容的解析进行 JNDI 注入,受害者请求远程服务来链接本地对象,在{}中调用 JNDI 接口(LDAP/RMI 服务)向攻击者提前部署好的恶意站点获取恶意的.class 对象并运行代码
此时的 JNDI 服务调用 RMI 服务,RMI 通过 Reference 类绑定了一个外部远程对象
原理流程
1.目标代码调用了 InitialContext.lookup(URI)且 URL 为恶意 RMI 地址
2.恶意 RMI 服务器返回一个 Reference 对象,其中有一个恶意的 factory 类
3.factory 被动态加载并且实例化,接着调用 factory.getObjectInstance()获取外部远程对象实例
(代码可以写入 factory 类的 getObjectInstance,构造方法,静态代码块等位置)
攻击流程
ldap
编写反弹 shell 语句,base64 编码。攻击机上存放恶意.java 文件并且编译为.class,同一目录下开启 http 服务,开启 LDAP 服务(1389 端口)
再新建一个 shell 开启监听,在 JNDL 注入点,最后的是 class 文件名前缀,ip 是 http 服务的 ip
Jndi高版本注入
jdk(>8u191)
默认禁止了codebase的加载
绕过分析:
1 |
|
那么 无法调用远程codebase的高版本jdk(>8u191)只需要找到一个ObjectFactory子类且可利用的java本地类即可
例如BeanFactory类 他的默认构造函数可以实例化一个类的同时调用任意只有string参数的方法
再去利用ELProcessor类
log4j2 (2.15-rc1)
对jndi的host port 加载的java类型等进行了限制
struct2
.action \.do文件
OGNL:用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
st2-045:注意请求头Content-Type
内存马
原理:通过在 Java 虚拟机(JVM)中运行的恶意代码,实现对被攻击者系统的远程控制。其原理是通过在 Java 虚拟机中注入特定的 Java 类、变量或方法等 Java 对象,然后在 Java 虚拟机中运行这些代码,实现对受害者机器的远程控制
Tomcat 实现内存马的方式
Servlet-API 型
通过命令执行等方式动态注册一个新的 listener、filter 或者 servlet,从而实现命令执行等功能。特定框架、容器的内存马原理与此类似,如 tomcat 的 value 内存马
filter 型内存马
所谓 filter 内存马,就是在 web 容器中创建了含有恶意代码的 filter,在请求传递到 servlet 前被拦截下来且执行了恶意代码。
servlet 型内存马
servlet 型的内存马原理就是注册一个恶意的 servlet,与 filter 相似,只是创建过程不同。
核心还是看 StandardContext,在 init filter 后就调用了 loadOnStartup 方法实例化 servlet
可以发现 servlet 的相关信息是保存在 StandardContext 的 children 字段。
listener 型内存马
listener 用于监听时间的发生或状态的改变,其初始化与调用顺序在 filter 之前。
listener 选择很多。我们选择与 request 相关的 ServletRequestListener。
Tomcat 使用两类 Listener 接口分别是 org.apache.catalina.LifecycleListener 和原生 Java.util.EventListener。
一般作为 webshell,需要对网站发送请求使用 Java.util.EventListener。
字节码增强型
通过 java 的 instrumentation 动态修改已有代码,进而实现命令执行等功能。
查杀思路
检查日志,相同路径但是参数不同,页面不存在返回200
中间件日志报错
流量分析
利用 Java Agent 遍历加载到内存中的 Class
先判断是否是内存马,是则进入内存查杀。
特征判断
(关键字)根据 shell 或者随机数关键字
(优先级)根据 Filter 优先级;为了使权限最大化,保证在各种情况下都可以访问,需要把优先级调到最高
(加载器)根据特殊的 classloader(类加载器)、 Filter 对应的 ClassLoader 目录进行检测; Filter 也是一种 Class,必定需要特定的 classloader(类加载器)
(恶意代码)把内存中 class 导出,反编译之后查看是否存在恶意代码;如调用的了一些特殊的方法
- java.lang.Runtime.getRuntime
- defineClass
- Invoke
(配置)web.xml 中没有 fitter 配置
JBOSS
Jboss 是一个管理 EJB 的容器和服务器。
分类
jbossmq-httpil/HTTPServerILServlet
invoker/readonly
invoker/JMXInvokerServlet
原理
程序获取 http 请求数据保存到 httpRequest 中,进一步处理后保存到变量 ois 中,然后程序没有对该数据进行过滤,直接使用 readObject()方法进行反序列化。
php
phpmyadmin
Select into outfile 写入
条件
1.web 目录写权限以及单引号
2.绝对路径(phpinfo/php 探针/报错)
3.secure_file_priv 没有具体值
show global variables like ‘%secure%’; 查看当前设置
1.当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入 | 导出,此时无法提权
- 当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入 | 导出只能发生在 /tmp/ 目录下,此时也无法提权
- 当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入 | 导出做限制,此时可提权 在 MySQL 的配置文件 my.ini 中进行配置
利用
1 |
|
日志写入
1.查看配置
1 |
|
2.开启 general_log 模式
1 |
|
3.修改日志目录为 shell 地址
1 |
|
4.写入 shell 并连接利用
1 |
|
5.抹除痕迹
1 |
|
绕过disable_funcion
bypass disable_function的方法及蚁剑插件bypass-php-function使用 - zw1sh - 博客园 (cnblogs.com)
apache mod_cgi
前提
LD_preload
写一个动态链接文件
shellshock
PHP-FPM
其他
UAF
FFI
COM
PHP 爆路径
单引号,错误路径报错
phpinfo 和 phpmyadmin 探针
任意文件读取
图片路径
phpinfo
路径:SCRIPT_FILENAME DOCUMENT_ROOT
支持程序:如redis,mysql,fastcgi,gopher
真实ip:_SERVER[“SERVER_ADDR”] (绕cdn)
敏感配置:远程文件包含,文件读取,禁用函数名,基础目录,短标签,配置文件位置
解析漏洞
IIS
罕见后缀名
asa cer cdx
分号截断
ap.asp;,jpg
PUT文件上传
MS15-034
HTTP.sys RCE
文件夹解析**(5.x-6.x**)
/xx.asp/xx.jpg(控制文件夹名字就可以让此文件夹下文件执行)
CGI漏洞(7.0-7.5):默认开启 Fast-CGI
上传如上文件,访问路径/1.jpg/.php 会导致图片被解析为 php 并生成 shell
Ngnix
CGI漏洞(<0.8.37)
和 IIS 7.0/7.5 一致
%00 空字节
Nginx 0.5.*
Nginx 0.6.*
Nginx 0.7 <= 0.7.65
Nginx 0.8 <= 0.8.37
xxx.php%00.jpg
Apache
文件名解析
从右到左,例如上传一个 xie.php.rar,无法识别 rar 会走到 php
罕见后缀
.htaccess
RCE
CVE-2021-42013
2e url编码路径穿越后文件包含,可以包含/bin/sh
若开启cgi-bin可以rce
其他
windows: xx.jpg[空格或.]会被默认删除,可绕过黑名单
总结:IIS的文件夹解析和FASTCGI,Nginx的FASTCGI和%00空字节,apache多后缀和罕见后缀
Redis 提权
渗透测试怎么利用 Redis 提权 - h0cksr - 博客园 (cnblogs.com)
默认端口 6379
利用
一.登录 redis
默认无密码与弱口令/未授权访问
二.提权
1.写入 webshell
2.公私钥获取 root 权限
3.crontab 定时任务反弹 shell
软连接
- 只有centos才可以: 因为默认redis写⽂件后是644的权限,但ubuntu要求执⾏定时任务⽂件**/var/spool/cron/crontabs/
权限必须是600也就是-rw———-才会执⾏,否则会报 错(root) INSECURE MODE (mode 0600 expected),⽽Centos的定时任务⽂ 件/var/spool/cron/ 权限644** - 执⾏redis保存RDB会存在乱码,在Ubuntu上 会报错,⽽在Centos上不会报错
- 然后由于系统的不同,crontrab定时⽂件位置也会不同
4.主从复制 rce
解决脏数据:fulshall清除内容,select xx切换数据库
防御
更改端口
修改口令
绑定内网
开启保护模式
docker逃逸
检查环境
ls -al / 寻找.dockerenv
cat /proc/1/cgroup
漏洞
Docker Remote Api 未授权访问
2375端口,特权模式拉取一个镜像后挂载宿主机进入一个新建的目录,然后目录中写一个sh文件反弹shell
特权模式逃逸
cat /proc/self/status|grep Cap检查0000003fffffffff
同上挂载,还可以写计划任务,ssh公钥,chroot换目录
危险挂载
Docker Socket挂载
宿主机procfs
脏牛
runC
端口
常用
21 ftp
22 ssh
23 telnet
25 smtp
101 pop3
135 rpc
139 445 SMB netbios MS170
389 LDAP协议
3389 远程桌⾯
5985 winrm
数据库
1433 MSSQL
1521 Oracle
3306 MySQL
5432 PostgreSQL
web服务
80-89 web
8000-9090 web
特殊服务
443 SSL⼼脏滴⾎
2601、2604 zebra路由,默认密码zebra
873 Rsync未授权
5984 CouchDB http://xxx:5984/_utils/
6379 redis未授权
7001、7002 weblogic默认弱⼝令、反序列化
9200、9300 elasticsearch 参考乌云:多玩某服务器ElasticSearch命令执⾏漏洞
11211 memcache未授权访问
50000 SAP命令执⾏
50070、50030 hadoop默认端⼝未授权访问
内网
Microsoft-DS traffic : 445/TCP 445/UDP
Kerberos : 88/TCP 88/UDP
LDAP ping : 389/UDP
DNS : 53/TCP 53/UDP
NetBIOS的相关服务 : 137/TCP 137/UDP 138/UDP 139/UDP 开放这些连续的端口,以便于通过防火墙来使用
面试小问题
七层协议
物理 数据链路 网络 传输 会话 表达 应用层
蜜罐如何欺骗攻击者
协议:模拟对应协议响应,指纹
数据:伪造真实数据插入数据库,文件等
流量:伪造流量回显,定期发送同步流量
web:开放高危端口
交互:允许登录 返回提权成功数据
工控流量
协议层
修改默认协议头,增加响应延迟
Modbus:监听端口 响应03 05等功能码,返回伪造寄存器数值
西门子PLC(s7comm):伪造握手协议,响应S7 Read/write返回plc型号
DNP3:模拟主从站点通信,伪造二进制点
留下nday
型号,web界面伪造
动态生成随机数据
发送真实工控流量巡检的噪声
检测蜜罐
大量指纹 js 特征 网站速度
开放大量端口
bp查看下流数据
数据流是否是动态近期的
下载文件的命令
windows
- FTP
- VBS
- bitsman
- cerutil
- ps(New-Object System.Net.WebClient)
- wget
- curl
linux
- curl
- wget
- scp
- rz
- netcat
- git clone
shiro长度限制
System.setProperty写入系统属性
通过线程对象的名字来存储payload
文件落地分块传输
webshell不能执行命令
disable_func
注册表缺少组件
waf
cmd被降权
http和https
基于SSL/TLS协议,包含:
- 公钥:加密数据
- 证书颁发机构 CA签名:保证证书真实性和信任
- 证书持有者信息:包含域名和组织信息
##什么情况没有referer头
手动清除
https跳到http
meta标签禁止
referer-policy
隐私模式
JWT安全问题
加密算法置空
jwt数据敏感
秘钥混淆攻击:RS256可换为HS256
无效令牌
暴力破解
头部注入
JDK高版本安全修复
JNDI (8u191) 禁止了远程加载,必须继承ObjectFactory:利用本地类BeanFactory实例化一个类如ELProcessor
企业内部钓鱼检测思路
邮件网关过滤
- 配置上启用SPF DKIM DMARC,拦截伪造域名
- URL分析 识别短连接
- 附件沙箱扫描 禁用宏
流量监控
- dns请求监控
- 防护域前置,检测host头
- ai识别异常访问
端点安全
- 监控异常行为与进程
- 保护浏览器安全
云存储桶漏洞
- 可遍历桶
- bucket爆破
- 任意文件上传覆盖
- bucket接管
- ak sk
- 配置可写
绕cdn
从cdn本身出发:
- 历史记录
- 多地区
- 子域名
- 空间引擎,censys搜ssl
从漏洞:
- 邮件(发邮件给不存在的地址,失败后返回ip)
- ssrf
- ping dnslog
从网站配置:
- 源代码,探针,phpinfo等配置信息
sqlmap os-shell原理
(实操也可以用fields)lines terminated by写php shell,一个用来上传,一个用来rce
- 提高容错(被删掉后门)
- 绕过waf
- 错误隔离,方便调试
- 流量监控复杂化
域名收集
被动子域名收集的方式:
- 信息泄露(github)
- 搜索引擎
- 网络空间测绘引擎
- 证书透明(证书查询相关子域名)
- 使用公共数据集
- 第三方DNS服务(dns服务接口查询)
- AS 号码查询(某个AS下所有域名)
- SAN 收集(SSL/TLS证书中的SAN字段)
主动收集子域名的方式:
- 字典枚举
- 置换扫描(根据命名模式生成字典)
- 域传送漏洞(主从DNS同步漏洞,请求获取所有子域名)
- DNSSEC(验证DNS记录签名信息)
- DNS缓存
验证码
手机
- 绕过登录:万能密码,置空绕过,返回包中存在
- 其他逻辑洞:篡改内容为他人手机号,可复用验证码
- 服务器资源:可爆破(XFF头,加号 86 空格,并发,多个手机号)
图形
- 绕过登录:万能密码,置空绕过,返回包中存在
- 其他逻辑洞:可识别,可复用
- 服务器资源:长宽可控
域前置/CDN技术
利用CDN、域前置、重定向三种技术隐藏C2的区别_域前置与cdn区别-CSDN博客
CDN
注册一个域名,将他的A记录解析到一个cloudflare域名(或者其他cdn平台)上,然后再把自己的域名再注册一个cdn服务
将自己的cdn的A记录解析,让他可以解析到C2的ip上,受害机的流量就只看得见cdn的ip了
1 |
|
域前置
同一个cdn下有两个域名,curl访问的时候取决于host头写的是哪个域名
1 |
|
vCenter渗透思路
1.查看版本:https ://x.x.x.x/sdk/vimServiceVersions.xml 打cve拿webshell
2.寻找凭据后解密拿cookie
•Linux:
/storage/db/vmware-vmdir/data.mdb
•Windows
C:\ProgramData\VMware\vCenterServer\data\vmdird\data.mdb
3.获取机器hash或者密码
生成快照-vol/Vmss2core内存分析
未授权访问
hadoop,FTP,LDAP,docker,Redis,Jboos,Jenkins..
站库分离怎么打?
立足点是web的时候常规打,翻找数据库配置文件
对于数据库
select * from information_schema.PROCESSLIST;
定位web端ip load_file(mysql<5.7)读文件
MSSQL:host_name() @@servername确认站库分离 尝试RCE
KDC服务器
启动到88,464
用户名爆破
密码喷洒和密码爆破
Kerberoasting(利用spn GetUserSPN)
ASRepRoasting(利用预认证后爆破凭据 GetNPUser)
黄金票据和白银票据
MS14-068
非约束委派、约束委派、基于资源的约束委派
票据传递(ptt/ptk/ptc)
mimikatz加密降级攻击(万能钥匙)
使用恶意的kerberos证书做权限维持
psexec原理
连接SMB共享后上传恶意服务文件到共享目录,打开SCM创建恶意服务连接管道
frp有哪些流量特征,如何进行隐藏?
如果没有做任何配置或者 tls_enable=false,则 wireshark 抓取的流量就是纯明文的,很容易暴露
frpc 在连接认证 frps 的时候,会进行三次握手,会把 frp 的版本信息发给 frps 进行认证,如果是用的一个没有改过的 Frp 那么这时候只要建立连接,很容易就会被安全设备捕获到
打开 tls_enable 之后,流量就做了加密
使用 tls_enable 加密后,首次连接会一个 0x17 的头部特征,并发送一个大小为 243 的数据包
ubuntu定时任务弹shell失败
ubuntu的/bin/sh指向的是sh
重新改软连接,或者写成 bash -c “bash -i >& ……”
⽇志被删除如何处理
将⽂件 /proc/544/fd/7 拷⻉到 /var/log/messages
执⾏命令: cp /proc/544/fd/7 /var/log/messages
重新启动 rsyslog 服务即可恢复被误删除的⽇志⽂件
为什么 aspx 木马权限比 asp 大?
aspx 使用的是.net 技术。IIS 中默认不支持,ASP 只是脚本语言而已。
入侵的时候 asp 的木马一般是 guest 权限而 APSX 的木马一般是 users 权限。
代码执行、文件读取、命令执行函数有哪些?
1 |
|
提权为何选择可读写目录?不用带空格的目录?
因为 exp 执行多半需要空格界定参数
token 和 refer 横向对比 谁安全等级高?
token 安全等级更高
内存马怎么手工排查,不用工具,怎么手动杀内存马
内存马如何排查:如果发现了一些内存 webshell 的痕迹,需要有一个排查的思路来进行跟踪和分析,也是根据各类型的原理,
1、如果是 jsp 注入,日志中排查可以 jsp 的访问请求。
2、如果是代码执行漏洞,排查中间件的 error.log,查看是否有可疑的报错,判断注入时间和方法。
3、根据业务使用的组件排查可能存在的 java 代码执行漏洞,spring 的 controller 类型的话根据上报 webshell 的 url 查找日志,filter 或者 listener 类型,可能会有较多的 404 但是带有参数的请求。
杀马:
终止进程:如果确认某个进程是内存马,可以尝试终止该进程。在 Windows 系统中,可以通过任务管理器或者命令行工具 taskkill 来终止进程;在 Linux 系统中,可以通过命令行工具 kill 或者 pkill 来终止进程。
删除文件:如果进程终止后,还需要删除相关的文件,以防止内存马重新启动。在 Windows 系统中,可以直接删除相关文件;在 Linux 系统中,需要先终止进程,然后再删除文件。
鱼叉和水坑
鱼叉攻击:指利用木马程序作为电子邮件的附件,发送到目标电脑上,诱导受害者去打开附件来感染木马
水坑攻击:分析攻击目标的上网活动规律,寻找攻击目标经常访问的网站的弱点,将网站攻破并植入恶意程序,等待目标访问
企业安全
跨域
IDS/IPS
加密通道
混淆编码
分割攻击
流量模仿
票据
常见内网ip
10.0.0.0/8
10.0.0.0 - 10.255.255.255
172.16.0.0/12
172.16.0.0 - 172.31.255.255
192.168.0.0/16
192.168.0.0 - 192.168.255.255
登录口
- 注入点与万能密码
- 不安全用户提示
- 源代码
- 验证码
- 暴力破解
- 逻辑漏洞
windows登陆成功失败
4624(成功)/4625
查询域成员和对应机器
利用userWorkstations或者组策略
1 |
|
域内用户正在登陆的主机
- 利用NetSessionEnum(win32 API)来寻找登陆的网络会话,一般用来查域控。【任意用户都可以】
- 利用NetWkstaUserEnum(win32 API)列出当前登录到该机器的所有用户。【本地机器管理员】
- 查询远程机器注册表项里 HKEY_USERS,来查看谁正在登陆该机器。【机器开启远程注册表连接】
域信任关系
1 |
|
用户加入林外部域时,会出现在 CN=ForeignSecurityPrincipals,DC=domain,DC=com
组中。只要枚举 ForeignSecurityPrincipals
组,就可得知哪些用户具有这个外部森林的访问权限。
域控端口
1 |
|
定位域管
域管进程
- 通过 net group “domain admins” /domain 列出域管理员组成员
- 通过 tasklist /v 列出本地进程的所有者
- 进行交叉处理,找到域管理进程
1 |
|
psloggedon.exe
psloggedon.exe //dc,通过检查注册表的HKEY USERS项的key值来查询谁登录过。
PVEFindADUser.exe(要管理员权限)
netview.exe(小部分要管理员权限)
利用 NetSessionEnum 来找寻登陆sessions, 利用NetShareEnum来找寻共享 , 利用 NetWkstaUserEnum 来枚举登陆的用户。调用Api太多不是个好事。
PowerView 脚本
Invoke-UserHunter:搜索本地域中域管理员当前在线的主机,并验证当前用户是否具有对这些主机的本地管理员访问权限。它可以使用 Get-NetSessions 和Get-NetLoggedon 扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,并且无需管理员权限。
wmic 如何构造有回显的命令执行
- 执行完写文件再读。
- impacket 工具包的 wmiexec 直接实现了回显。
- wmicmd 是将执行后的结果插入了注册表,然后在读取注册表中的值来完成不依赖 445 的回显。
web 零散知识
SSRF 利用 fastcgi 攻击
之前做 ctf 题也运用过工具,但是不了解原理
https://blog.csdn.net/weixin_39664643/article/details/114977217
基础知识
CGI/FASTCGI/PHP-CGI/PHP-FPM
PHP-CGI 与 PHP-FPM 是一个接口程序,CGI/FASTCGI 是服务器中间件与某个语言后端(如 PHP-FPM)之间的协议,可以将他们与客户端和服务器之间的 http 等协议做类比,网站服务器收到数据之后会根据是否是静态文件来决定需不需要给予 php 解析器来处理
gopher 协议
概念
1 |
|
格式
1 |
|
构造方法
1.抓取一个 tcp 数据包
2.bp url 全编码
3.拼接格式
FASTCGI 协议详解
1 |
|
结构如下,头固定八个字节,body 由头中的 contentLength 决定
漏洞
利用条件
- PHP 版本要高于 5.3.3,才能动态修改 PHP.INI 配置文件(题目环境已满足)
- 知道题目环境中的一个 PHP 文件的绝对路径
- PHP-FPM 监听在本机 9000 端口(题目环境已满足)
FASTCGI 攻击 PHP-FPM
PHP-FPM 默认监听 9000 端口,如果这个端口暴露在公网,则我们可以自己构造 FastCGI 协议,和 FPM 进行通信。
我们可以自己构造 FASTCGI 数据包控制 SCRIPT_FILENAME 来让 PHP-FPM 执行任意文件
利用方案
例子如下
SSRF 攻击 PHP-FPM
利用工具 gopherus 在 ssrf 利用点直接攻击即可,其原理同上
区别
一个是 PHP-FPM 直接暴露在外网会收到我们的攻击,
一个是在内网,需要 ssrf(gopher 协议)进一步利用
php 源码泄露问题
PHP<=7.4.21 时通过 php -S
的 WEB 服务器存在源码泄露漏洞,可以将 PHP 文件作为静态文件直接输出源码
tar 解压目录穿越
在 python 或者 Unix 下,使用 tar 压缩的文件名如果存在目录穿越,那么解压后的文件也会造成穿越
ar cPvf shell.tar ../../../../../../../../var/www/html/testupload/payload.php
pickle 反序列化
yaml 反序列化
Phpsession 特性
PHP session 反序列化漏洞原理解析 - 掘金 (juejin.cn)
- 利用 session 上传文件(配合文件上传)
- 由于 php 序列化处理器的不同导致的反序列化
CRLF 注入
利用换行符和回车符导致注入 http 数据
Nodejs Ssrf 拆分攻击
利用的是 nodejs 对于特殊字符的转换导致不能正常过滤掉控制字符/r/n 导致的 CRLF 注入
Soap ssrf
结合 CRLF 注入:通过第二个参数控制 UA 间接可控制 content-type
1 |
|
Phar 反序列化
同时存在文件上传和和一些触发 phar 协议的函数的时候可以强制触发反序列化
自动注册类函数 spl_autoload_register
假如可以上传.inc 文件,同时存在反序列化,则将 webshell 修改为 inc 文件上传,记录上传的文件名,将他作序列化之后输入到反序列化的地方即 getshell
Docker PHP 裸文件本地包含
只有文件包含但是无法上传文件,则需要利用本地文件
- 日志包含:由于 Docker 将日志文件重定向,包含权限不足
- Phpinfo 与条件竞争
我们需要获取文件名,同时需要条件竞争
- window 通配符
- session.upload_progress
- pearcmd.php
DNS 域传送漏洞
DNS 备份服务器通过”域传送”从主服务器上复制数据,如果域传送被攻击者利用就会导致整个网络拓扑泄露,一般使用 privateDNS 防御(内外网分离),限制区域传送 ip 并且设置 TSIG key
利用:nslookup -type=ns 域名
然后进入交互模式 ls 列出域名–> 是否可以列出域
kali 下 dig 发送 axfr 请求,要求返回某个区域全部记录 dnsenum dnswalk 都可以
未设置 spf 导致邮箱任意伪造
https://www.cnblogs.com/wkzb/p/15401932.html
https://www.cnblogs.com/wkzb/p/15553178.html
https://mp.weixin.qq.com/s/tOOBZ1aC6SsjslCM70WKBQ 邮件伪造
SPF
Sender Policy Framework 简单来说就是通过修改 SPF 记录来导致邮件任意发送
查看方式
绕过
SPF 显然有其局限性,当用户 A 发邮件给 B,B 再转发给 C 的时候,SPF 将邮件的发件人转换为 B,这个时候就产生了 DKIM 技术
DKIM
利用了公开密钥提供了身份验证和数字签名功能防止伪造篡改。