概述
本文讨论了如何查询一台主机的TCP/IP协议栈来收集宝贵的信息。首
先,我列举了栈指纹之外的几种“经典的”操作系统辨识方法。然后
我描述了栈指纹工具的“工艺现状”。接下来说明让远程主机泄漏其
信息的一些技术。最后详述了我的实现(nmap),和用它获得的一些
流行网站的操作系统信息。
理由热点网络
我认为辨识一个系统所运行OS的用处是相当显而易见的,所以这一节
会很短。最有力的例子之一是许多安全漏洞是OS相关的。试想你正在
作突破试验并发现53端口是打开的。如果那是易遭攻击的bind版本,
则你只有一次机会利用它因为失败的尝试会杀死守护程序。有了正确
的TCP/IP指纹,你将很快发现它运行的是'Solaris 2.51'或者'Linux 2.0.35'
而因此调整你的外壳代码。
一个比较糟的例子是某人扫描500,000台主机以找出它们运行什么OS
和哪些端口是打开的。然后等谁贴(说)有一个root漏洞在Sun的comsat
守护程序里,我们的小朋友能从人家的列表中找出 'UDP/512'和'Solaris 2.6'
这两个词,并立即得到了整页整页的可得到root特权的盒子。必须认
识到那是脚本小子(SCRIPT KIDDIE)的行为。你证明了你的无能而
且没有人,甚至对方也,对你能找到没有及时修补漏洞而易受攻击的
.edu之事留有印象。人们也_较少_留有印象如果你用你新找到的通路
去破坏政府的web 站,换以一个自大的你如何强大而管理员们如何愚
蠢的话的话。。
另一个用法是社会工学。假如你扫描目标公司而namp报告一个'Datavoice
TxPOR TPRISM 3000 T1 CSU/DSU 6.22/2.06'。则黑客就以'Datavoice
support'为名打电话并讨论他们PRISM 3000的一些问题。“我们正要
公布一个安全漏洞,但希望我们现在的客户先安装补丁--我刚刚寄给
你...”一些天真的管理员会假定只有Datavoice指定的工程师才会对
他们的CSU/DSU知道的如此之多。
这个能力另一个潜在的用途是评价你要交易的公司。在选择一个新ISP
前,扫描它们看用的是什么设备。那些“ 99美元/年”的买卖不向听
起来那么好当你发现它们用廉价的路由器并用一堆运行Windows 的机
器提供PPP 服务的时候。
经典技术
栈指纹以独特的方式解决OS辨识的问题。我想这个技术最有把握,但
现在有许多其他解决方案。遗憾的是,这仍是其中最有效的:
playground~> telnet hpux.u-aizu.ac.jp
Trying 163.143.103.12...
Connected to hpux.u-aizu.ac.jp.
Escape character is '^]'.
HP-UX hpux B.10.01 A 9000/715 (ttyp2)
login:
没有必要在指纹上费这么大力气,如果机器能大声对世界说明它们运
行的是什么!遗憾的是,许多制造商交付带有这类标志的_现有的_系
统而且许多管理员没有关上它。[译者:原文如此]只是因为还有其他
方法找出运行的OS(例如指纹),但不是说我们应该通知每个尝试连
接的笨蛋我们的OS和体系结构。
依靠这个技术的问题是越来越多的人把标志关闭,许多系统不给出更
多信息,还有少数在标志中“说谎”。不过,你得到全部就是读标志
方式的OS和OS版本检查,如果你把上千美元花在商业的ISS 扫描器上
的话。下载nmap或queso代替它们可以替你省钱:)。
即使你关闭了标志,当被询问时许多应用程序仍然很高兴给出这类信
息。例如这个FTP服务器:
payfonez> telnet ftp.netscape.com 21
Trying 207.200.74.26...
Connected to ftp.netscape.com.
Escape character is '^]'.
220 ftp29 FTP server (UNIX(r) System V Release 4.0) ready.
SYST
215 UNIX Type: L8 Version: SUNOS
首先,它给出了它默认的系统细节标志。然后如果我们给出'SYST'命
令它愉快地送回更多信息。
如果FTP的anon被支持,我们经常可以下载/bin/ls或其他的二进制文
件而测定它所建造的体系结构。 许多其他应用程序对信息太随便了。比如web服务器:
playground> echo 'GET / HTTP/1.0/n' | nc hotbot.com 80 | egrep '^Server:'
Server: Microsoft-IIS/4.0
playground>
Hmmm ... 我对这些家伙运行的感到惊讶。
其他经典技术包括DNS 主机信息记录(不太有效)和社会工学。如果
它在听161/udp (snmp),用CMU SNMU工具包里的'snmpwalk'和'public'
通信名你肯定能获得一大堆信息。
当前指纹问题
Nmap不是第一个用TCP/IP指纹辨识OS的程序。Johan的通用的IRC欺骗
程序sirc包括了非常基本的指纹技术从版本3 (或更早)开始。它尝
试把主机分为 "Linux","4.4BSD", "Win95", 或 "Unknown"几类通过
几个简单TCP标志测试。
另一个这样的程序是checkos,作者Shok对版本7终于有了信心在今年
一月公开发行。指纹技术和SIRC的完全一样,甚至_代码_都有许多同
样之处。Checkos 在公开发行前私下流传了很久,所以不知谁偷谁的。
但看起来谁都不信任对方。checkos增加的是telnet 标志检查,有用
但有前面说的问题。[更新:Shok写信来说checkos无意公开发行而这
就是为什么他没有找SIRC要那些代码的许可。]
Su1d也写了一个OS检查程序。他称它叫SS其版本3.11可以辨识12个不
同的OS类型。我有些偏爱它因为他许可我的nmap程序一些网络代码:)。
然后是queso 。这是最新的而且对其他程序是一个巨大的飞跃。不仅
是因为它们推出了一些新测试,而且它们是首先(就我所见)把OS指
纹_移出_代码的。其他扫描的代码象:
/* from ss */
if ((flagsfour & TH_RST) && (flagsfour & TH_ACK) && (winfour == 0) &&
(flagsthree & TH_ACK))
reportos(argv[2],argv[3],"Livingston Portmaster ComOS");
相反,queso 把这些代码移到一个配置文件显然使更易扩展而且使增
加一个OS成为在指纹文件中增加几行的简单工作。
Queso由Savage,Apostols.org的高手之一,所写。
以上所述所有问题中的一个问题是只有非常有限数量的指纹测试从而
限制了回答的详细程度。我想知道不仅是'这台机器是OpenBSD, FreeBSD,
或者NetBSD',我想确切知道它到底是那一个还有版本号。同样,我希
望看到'Solaris 2.6' 而不仅仅是'Solaris'。为此,我对一系列指纹
技术进行了研究,它们将在下一节说明。
指纹方法学
有许多许多技术可以用来定义网络栈指纹。基本上,你只要找出操作
系统间的不同并写探测器查明它们。如果你合并足够这些,你可以非
常细致的区分它们。例如nmap可以可靠分辨出Solaris 2.4 和Solaris 2.5-2.51
以及Solaris 2.6。他能分辨Linux内核2.0.30到2.0.31-34或or 2.0.35。
这有一些技术:
FIN 探测器 -- 这里我们送一个FIN包(或任何其他包不带ACK 或SYN
标记)给一个打开的端口并等待回应。正确的RFC793行为是不
响应,但许多有问题的实现例如 MS Windows, BSDI, CISCO,
HP/UX,MVS,和IRIX 发回一个RESET。许多现有工具利用这个技
术。
BOGUS 标记探测器 -- Queso 是我见过的第一个用这个聪明技术扫描
器。这个主意是设置一个未定义的TCP "标记"(64或128)在SYN
包的TCP头里。Linux机器到2.0.35之前在回应中保持这个标记。
我没有发现其他OS有这个错误。然而,一些操作系统象是复位
连接当它们得到一个SYN+ BOGUS包的时候。这一行为对辨识它
们有用。
TCP ISN 取样 -- 这个主意是找出当响应一个连接请求时由TCP 实现
所选择的初始化序列数式样。这可分为许多组例如传统的64K
(许多老UNIX机器),随机增量(新版本的Solaris, IRIX, FreeBSD,
Digital UNIX, Cray, 和许多其他的),真“随机”(Linux 2.0.*,
OpenVMS,新的AIX,等)。Windows 机器(和一些其他的)用一
个“时间相关”模型,每过一段时间ISN 就被加上一个小的固
定数。不用说,这几乎和老的64K 行为一样容易攻破。当然我
喜欢的技术是"常数"。机器总是使用确切同样的ISN :)。我已
经在3Com的集线器(用0x803)和Apple LaserWriter打印机(
用0xC7001 )上看到了。
你也可以通过例如计算其随机数的变化量,最大公约数,以及
序列数的其他函数和数之间的差异再进一步分组。
要知道ISN 的生成和安全息息相关。想了解更多情况,联络在
SDSC的“安全专家”Tsutome Shimmy Shimomura,问他所知道
的。Nmap是我所见到的第一个用它来辨识OS的程序。
不分段位 -- 许多操作系统开始在送出的一些包中设置IP的"Don't Fragment"
位。这带来多种性能上的好处(尽管它也可能是讨厌的 -- 这
就是nmap的分段扫描对Solaris机器无效的原因)。无论如何,
不是所有的OS都这样做而且另一些做的场合不同,所以通过注
意这个位我们甚至能收集目标OS的更多信息。在那两个程序中
没见过这个。
TCP 初始化窗口 -- 这只包括了检查返回包的窗口大小。较老的扫描
器简单地用一个非零窗口在RST包中来表示“BSD 4.4 族”。新
一些的如queso 和nmap则保持对窗口的精确跟踪因为它对于特定
OS基本是常数。这个测试事实上给出许多信息,因为有些可以被
唯一确定(例如,AIX 是所知唯一用0x3F25的)。在它们“完全
重写”的NT5 TCP 栈中,Microsoft 用的是0x402E。有趣的是,
这和OpenBSD 与FreeBSD 中所用的数字完全一样。
ACK 值 -- 尽管你会认为这个会完全标准,不同实现中一些情况下ACK
域的值是不同的。例如,如果你送了一个FIN|PSH|URG 到一个
关闭的TCP 端口。大多数实现会设置ACK 为你的初始序列数,
而Windows 和一些傻打印机会送给你序列数加1 。若你送一个
SYN|FIN|URG|PSH 到一个打开的端口,Windows 会非常古怪。
一些时候它送回序列号,但也有可能送回序列号加1, 甚至还
可能送回一个随机数。我们觉得奇怪,不知微软写的是些什么
代码。
ICMP 错误信息终结 -- 一些(聪明的)操作系统跟从RFC 1812的建
议限制各种错误信息的发送率。例如,Linux 内核(在net/ipv4/icmp.h)
限制目的不可达消息的生成每4 秒钟80个,违反导致一个1/4
秒的处罚。测试的一种办法是发一串包到一些随机的高UDP 端
口并计数收到的不可达消息。没见过用它的,而且实际上我也
没有把它加进nmap(除了作为UDP 端口扫描用)。这个测试会
让OS辨识多花一些时间因为需要送一批包再等它们回来。而且
对付网络丢包会很痛苦。
ICMP 消息引用 -- RFC 规定ICMP错误消息可以引用一部分引起错误
的源消息。对一个端口不可达消息,几乎所有实现只送回IP请
求头外加8 字节。然而,Solaris 送回的稍多,而Linux 更多。
这使得nmap甚至在没有对方没有监听端口的情况下认出Linux
和Solaris 主机。
ICMP 错误消息回应完整性 -- 我这个想法来自Theo De Raadt (OpenBSD
开发负责人)贴在comp.security.unix的文章。刚刚提到,机
器会把原始消息的一部分和端口不可达错误一起送回。然而一
些机器倾向于在初始化处理时用你的消息头作为“草稿纸”所
以再得到时会有些许的改动。例如,AIX 和BSDI送回一个IP“
全长”域在20字节处。一些 BSDI,FreeBSD,OpenBSD,ULTRIX,
和VAXen 改变了你送的IP ID 。因为TTL 改变而改变了检查和,
有些机器(AIX, FreeBSD, 等)送回错误的或0 检查和。总之,
nmap作9 种测试在ICMP错误上以分辨出这类细微差别。
服务类型 -- 对于ICMP端口不可达消息我察看送回包的服务类型(TOS)
值。几乎所有实现在这个ICMP错误里用0 除了Linux 用0xc0。
这不是标准的TOS 值,而是一个未使用优先域(AFAIK) 的一部
分。我不知道为什么如此,但如果他们改成0 我们还能够分辨
旧系统_而且_还能分辨出旧系统和新系统。
分段控制 -- 这是安全网络公司(现在由一帮在NAI 的Windows 用户
所拥有)的Thomas H. Ptacek喜爱的技术。它获益于事实即不
同实现经常以不同方式控制覆盖IP段。一些会用新的覆盖旧的
部分,另一些情况中旧的优先。有很多不同可能你可以用来决
定如何重组数据包。我没有加入这一特性因为没有简便的方式
发送IP分段(特别是,在Solaris 上是不允许的)。关于覆盖
段的更多信息,可以看IDS 的论文(www.secnet.com)
TCP 选项 -- 这简直是泄漏信息的金矿。它的好处在于:
1) 这通常是可选的(哈!):) 所以并非所有实现都支持。
2) 若一个实现发出设置了选项的请求,目标通过设置它在回
应中表示支持。
3) 可以在一个数据包中设置而一次测试所有选项。
Nmap发送这些选项的几乎所有可能的包:
Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops;
当你得到回应,看看那个选项被送回也就是被支持。一些操作
系统如最近的FreeBSD 机器支持上面所有的,而其他,如Linux 2.0.X
支持的则很少。最近的Linux 2.1.x 内核支持上面所有的。另
一方面,它们又有更易受攻击的TCP 序列生成方式。去看看。
即使几个操作系统支持同样的选项集,有时仍可以通过选项的
_值_分辨出它们。例如,如果送一个小的MSS值给Linux机器,
它会用那个MSS 生成一个回答给你。其他主机会给你不同的值。
甚至即使你得到同样的支持选项集和同样得值,你仍可以通过
选项提供的_顺序_和填充字进行辨识,例如Solaris返回'NNTNWME'
表示:
而Linux 2.2.122返回MENNTNW。同样的选项,同样的值,但不
同顺序!
没见过其他OS检测工具利用TCP 选项,但它非常有用。
因同样原因有其他几个有用的选项我会探测,象那些支持T/TCP
和选择性确认。
开发年代 -- 甚至使用上面所有测试,nmap仍不能从TCP 栈区分Win95,
WinNT,或Win98。这很令人惊讶,尤其是Win98 比Win95 晚出
现4 年。你可能想它们不得不从某些方面进行改善(象支持更
多的TCP 选项)这样我们可以检测到改变而分辨出它们。不幸
的是,不是这样的。NT的栈显然就是放在95里的蹩脚的东西。
而且到98也没加改动。
但别放弃希望,还有个办法。你可以简单的进行早期的Windows
DOS 攻击(Ping of Death, Winnuke, 等)而比当时的如Teardrop
和Land多做一些。就是在每个攻击之后,ping它们看是否垮
掉了。等到你最后crash 掉它们,你就能缩小的某一服务包
或补丁。
这个没加进nmap,尽管我承认它非常诱人:)。
SYN洪水限度 -- 一些操作系统会停止新的连接尝试如果你送太多的
伪造SYN 给它(伪造包避免你的内核复位连接)。许多操作系
统只能处理8 个包。最近的Linux 内核(包括其他操作系统)
允许不同的方式如SYN cookie来防止这成为严重问题。所以你
可以试着从伪造地址发8 个包到目标打开的端口再尝试你还能
否建立连接以发现一些信息。这没在nmap中实现因为有人不喜
欢你用SYN 洪水,甚至你解释这只是想知道它运行的操作系统
也不能使他们平静。
NMAP实现和结果
我已经作了一个上面说的OS探测技术的参考实现(除了我说不包括的)。
我把它们加到了我的Nmap扫描器这样在分析指纹时它已经知道了什么
端口是打开还是关闭的而不用你再告诉。它也能在Linux,*BSD, 和
Solaris 2.51和2.6, 以及其他一些操作系统间移植。
新版的nmap读一个指纹模板文件。下面是语法的例子:
FingerPrint IRIX 6.2 - 6.4 # Thanks to Lamont Granquist
TSeq(Class=i800)
T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
看第一行(我加了'>'标记):
> FingerPrint IRIX 6.2 - 6.3 # Thanks to Lamont Granquist
这简单表明这个指纹覆盖IRIX版本6.2到6.3而注释表明Lamont Granquist
友好地送给我测试用IRIX机器的IP地址或指纹。
> TSeq(Class=i800)
这表明ISN 取样放在"i800组"。这意味着每一个新序列号比前一个大
800的整数倍。
> T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
这个测试叫T1(比test1 聪明吧?)。这个测试我们送一个SYN 包带
一组TCP 选项到一个打开的端口。DF=N意为回答的"Don't fragment"
位必须没有设置。W=C000|EF2A意为收到的窗口特征必须是0xC000 或
EF2A。ACK=S++是说响应必须是我们送的序列号加1 。Flags=AS 意为
ACK 和SYN 标记在回答中。Ops=MNWNNT意为回答的选项必须如此顺序:
> T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
测试2 包括一个NULL及同样选项到一个打开的端口。Resp=Y表示我们
必须得到一个回答。Ops=表示必须没有任何选项包括在回答中。若整
个用'%Ops='则任何选项都匹配。
> T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)
测试3 是一个SYN|FIN|URG|PSH w/options 到一个打开端口。
> T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
这是一个到打开端口的ACK。注意这儿没有Resp=。这意味着缺少回答
(比如包在网络上掉了或被防火墙拦住了)不会妨碍其他测试的匹配。
我们如此是因为实际上所有的OS都会回答,所以缺少回答总是网络原
因而不是OS本身造成。测试2和3里有Resp标记因为有OS_确实_丢弃它
们而不回答。
> T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
> T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
> T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
这些测试是SYN,ACK,和FIN|PSH|URG, 分别地,到一个关闭端口。
总是设置同样的选项。当然这显然给了名字'T5', 'T6', 和 'T7' :)。
> PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
这大家伙是端口不可达消息测试。现在你应该认识DF=N了。TOS=0 意
为IP服务域类型是0 。下两个域给出(16进制)返回的消息头IP全长
域和IP头中给的全长。RID=E 是说在返回的部分原始包中的RID 值应
和原来的一样(就如我们送出的)。RIPCK=E 表示没有修改检查和(
改了的话用RIPCK=F)。UCK=E表示UDP 检查和也正确。下面的是UDP
长度0x134 和DAT=E 表示它们正确返回我们的UDP 数据。因为大多数
实现(包括这个)不送回任何我们的UDP 数据包,它们默认DAT=E。
带这个功能的这个版本的nmap正在私下进行第六次beta测试循环。你
读到的时候,也许已经完成,也许没有。访问http://www.insecure.org/nmap/
以得到最新版本。
流行网站快照
下面是我们努力的成果。我们现在可以随机挑选Internet网站判断它
使用的OS。它们许多修改了telnet标志,等。以使这些信息保密。但
这对我们的新指纹没用!这也是好办法揭露<填上你喜欢的傻OS>的用
户是多么的愚蠢。:)
用在这些例子中的命令是:nmap -sS -p 80 -O -v <主机>
也要注意大多数扫描是在98-10-18进行的。那以后一些家伙会升级/
改变了它们的服务器。
注意我并不喜欢这的每个网站。
# "黑客" 网站或(两方都是)自认为是的
www.l0pht.com => OpenBSD 2.2 - 2.4
www.insecure.org => Linux 2.0.31-34
www.rhino9.ml.org => Windows 95/NT # 没的说 :)
www.technotronic.com => Linux 2.0.31-34
www.nmrc.org => FreeBSD 2.2.6 - 3.0
www.cultdeadcow.com => OpenBSD 2.2 - 2.4
www.kevinmitnick.com => Linux 2.0.31-34 # Free Kevin!
www.2600.com => FreeBSD 2.2.6 - 3.0 Beta
www.antionline.com => FreeBSD 2.2.6 - 3.0 Beta
www.rootshell.com => Linux 2.0.35 # 改成了 OpenBSD 在他们得到以后
# 安全提供商,顾问,等
www.repsec.com => Linux 2.0.35
www.iss.net => Linux 2.0.31-34
www.checkpoint.com => Solaris 2.5 - 2.51
www.infowar.com => Win95/NT
# OS制造商
www.li.org => Linux 2.0.35 # Linux 国际版
www.redhat.com => Linux 2.0.31-34 # 我奇怪它们发行什么 :)
www.debian.org => Linux 2.0.35
www.linux.org => Linux 2.1.122 - 2.1.126
www.sgi.com => IRIX 6.2 - 6.4
www.netbsd.org => NetBSD 1.3X
www.openbsd.org => Solaris 2.6 # 啊嗨 :)
www.freebsd.org => FreeBSD 2.2.6-3.0 Beta
# 学联
www.harvard.edu => Solaris 2.6
www.yale.edu => Solaris 2.5 - 2.51
www.caltech.edu => SunOS 4.1.2-4.1.4 # Hello! 这是90年代的 :)
www.stanford.edu => Solaris 2.6
www.mit.edu => Solaris 2.5 - 2.51 # 这么多好学校喜欢SUN?
# 大概是给.edu打40%的折扣 :)
www.berkeley.edu => UNIX OSF1 V 4.0,4.0B,4.0D
www.oxford.edu => Linux 2.0.33-34 # 好家伙!
# 残疾网站
www.aol.com => IRIX 6.2 - 6.4 # 不奇怪它们那么不安全 :)
www.happyhacker.org => OpenBSD 2.2-2.4 # 病态的, Carolyn?
# 甚至最安全的OS在不合格的管理员手里也没用
# 其他
www.lwn.net => Linux 2.0.31-34 # 这是Linux新闻网站!
www.slashdot.org => Linux 2.1.122 - 2.1.126
www.whitehouse.gov => IRIX 5.3
sunsite.unc.edu => Solaris 2.6
注意:在它们的安全白皮书中,Microsoft 说到它们松懈的安全:“
这种假设已经改变在这些年中Windows NT获得普及很大程度上是由于
其安全特性”。喔,从我这里看Windows 在安全团体中不是很普遍:)。
从中我只看到2 台Windows 机器,而且对nmap来说Windows 是_ 容易_
分辨的它太破了(一流的聪明)
当然,有更多需要检查的。这是ultra-secret Transmeta公司的网站。
有趣的是该公司主要由微软的Paul Allen建立,而非其雇员Linus Torvalds。
那么它们是和Paul用NT或者投身到Linux革命中去呢?我们看看:
我们用命令:
nmap -sS -F -o transmeta.log -v -O www.transmeta.com/24
这个说SYN 扫描一致端口(从/etc/services),记录结果到'transmeta.log',
详细地,进行OS扫描,并扫描www.transmeta.com所在的'C'地址。这
是结果摘要:热点网络
neon-best.transmeta.com (206.184.214.10) => Linux 2.0.33-34
www.transmeta.com (206.184.214.11) => Linux 2.0.30
neosilicon.transmeta.com (206.184.214.14) => Linux 2.0.33-34
ssl.transmeta.com (206.184.214.15) => Linux unknown version
linux.kernel.org (206.184.214.34) => Linux 2.0.35
www.linuxbase.org (206.184.214.35) => Linux 2.0.35 可能和上面的是同一台机器
新闻热点
疑难解答