/* HINT: Search archives @ http://www.indyramp.com/masq/ before posting! */
Hello,
On Tue, 28 Mar 2000, Joachim Feise wrote:
> /* HINT: Search archives @ http://www.indyramp.com/masq/ before posting! */
>
>
> Found this on the Bugtraq list.
It seems that the following code is not useful:
if (proto == IPPROTO_UDP && !mport)
#ifdef CONFIG_IP_MASQ_LOOSE_DEFAULT
/*
* Flag this tunnel as "dest loose"
*
*/
ms->flags |= IP_MASQ_F_DLOOSE;
#else
ms->flags |= IP_MASQ_F_NO_DADDR;
#endif
May be it must be deleted. I have to check it again. At least the
dport can be checked instead of mport.
>
> -Joe
>
> -------- Original Message --------
> Subject: Security Problems with Linux 2.2.x IP Masquerading
> Date: Mon, 27 Mar 2000 23:31:41 -0600
> From: H D Moore <[EMAIL PROTECTED]>
> Reply-To: H D Moore <[EMAIL PROTECTED]>
> To: [EMAIL PROTECTED]
>
> [ Security Problems with Linux 2.2.x IP Masquerading ]
>
>
>
> Summary:
>
> Due to lax checking in the masquerading kernel code, an attacker is able
> to rewrite a linux masq gateway's UDP masquerading entries so that the
> remote host and port are whatever they choose. This creates a tunnel
> between whatever host and port they want and a UDP port on an inside
> machine. The attacker is unable to tell what local inside ports and
> addresses are being used, but they can determine the number of currently
> masqueraded connections and the number of different hosts using those
> connections behind the firewall. Any network where UDP traffic is
> masqueraded to the outside is vulnerable to this, including DNS, TFTP,
> NetBIOS, and a multitude of other applications which rely on UDP
> transport. Since UDP is a connectionless protocol, the only way to
> determine that a masqueraded connection is no longer being used is by
> timing it out due to lack of activity or receiving ICMP messages
> indication the port is closed. The result is that there is a 5 minute
> time-out by default for all masqueraded UDP sessions, allowing an
> attacker enough time to find and exploit the connection with some of the
> methods outlined in the Examples section below.
>
> Details:
>
> For those familiar with the linux masquerading system, please jump to
> the next paragraph. IP masquerading is an implementation of NAT
> (Network Address Translation) for the linux OS. It allows you to
> connect an internal network using private addresses to an external
> network (internet) in a fairly secure manner. All packets coming from
> the internal network and destined for the external network are rewritten
> so the source of those packets is the masquerading gateway's external
> address and the source port is the gateway's source port. This only
> requires one external IP address to enable internet access for
> hundreds/thousands of internal machines and is therefore a popular
> method for many businesses and home users with broadband connections.
> The TCP and UDP protocols require both source and destination ports as
> well as source and destination addresses to work. The source port for
> outgoing UDP/TCP connections is usually picked from the first available
> port between 1024 and 65535 on the originating host, so how does the
> masq gateway relay these connections AND be able to use these protocols
> for its own networking? The kernel sets aside the ports 61000 to 65096
> by default for handling the masqueaded connection entries, allowing for
> a theoretical maximum of 4096 of both UDP and TCP connections at a
> time. These values can be changed in the code or through the /proc file
> system. Now when connection request from internal host A comes in from
> local port 1035 and its destination is the external DNS server Host Z on
> port 53, the masquerading machine adds a new entry to the masquerading
> table that looks like this:
>
> Host A:1035 (651001) -> Host Z:53
>
> The port in paranthesis is the local port the gateway uses to send the
> forwarded UDP datagrams from and the port it uses to receive responses
> back from Host Z. The next paragraph describes how the vulnerability
> found allows an attacker to modify the right side of the above
> connection to allow traffic to come from thier host back into the
> internal network to the local port on the inside host.
>
>
> The UDP masquerading code only checks the DESTINATION PORT to determine
> if a packet coming from the external network is to be forwarded inside.
> It then sets the remote HOST and PORT to the source address and source
> port of the incoming packet. An attacker only needs to determine the
> local port on the masq gateway to be able to rewrite the masq table with
> thier own address and port, which is trivial considering the relatively
> small port range set by default for use by masqueraded conenctions
> (65100 - 65096). Now how do you determine which one of these ports is
> the local port on the gateway for the masq connection? Easy, we send a
> probe packet to each of these hosts and watch the IP ID field in the
> responses. The IP ID field is sequentially incremented on each host's
> TCP/IP stack for each packet they send out, so the masq'd port ICMP
> response will have the IP ID of the INTERNAL host, which is almost
> always at least 1000 away from the current IP ID of the gateway
> machine. See the Examples section below for packet traces of a complete
> scan/attack.
>
>
> Examples:
>
> We know that example.com has a linux masquerading gateway and that thier
> DNS server is outside of this firewall. We can come to the conclusion
> that internal machines must be able to contact the external DNS server
> to be able to access the internet. We start sending our probe packets:
>
> Host A is our internal workstation (192.168.1.100)
> Host B is our masq gateway (192.168.1.1 / 10.0.0.1)
> Host C is the DNS server (10.0.0.25)
> Host X is the attacker (10.10.187.13)
>
> ipchains -L -M -n on the masq gateway BEFORE the probes
> > UDP 03:39.21 192.168.1.100 10.0.0.25 1035 (63767) -> 53
>
>
> [ tcpdump from attacker's machine ]
>
> ( we picked source port 12345 for our packets just so the trace would be
> easier to follow)
>
> [ snip -- this starts at port 61000 ]
>
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63762 unreachable [tos
> 0xd8] (ttl 245, id 13135)
> 10.10.187.13.12345 > 10.0.0.1.63763: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23069)
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63763 unreachable [tos
> 0xd8] (ttl 245, id 13136)
> 10.10.187.13.12345 > 10.0.0.1.63764: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23070)
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63764 unreachable [tos
> 0xd8] (ttl 245, id 13137)
> 10.10.187.13.12345 > 10.0.0.1.63765: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23071)
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63765 unreachable [tos
> 0xd8] (ttl 245, id 13138)
> 10.10.187.13.12345 > 10.0.0.1.63766: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23074)
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63766 unreachable [tos
> 0xd8] (ttl 245, id 13139)
> 10.10.187.13.12345 > 10.0.0.1.63767: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23083)
>
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63767 unreachable [tos
> 0xd8] (ttl 244, id 17205)
>
>^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> The above packet's ID is substantially different, we may have found a
> masq'd connection !!!
>
> 10.10.187.13.12345 > 10.0.0.1.63768: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23084)
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63768 unreachable [tos
> 0xd8] (ttl 245, id 13140)
> 10.10.187.13.12345 > 10.0.0.1.63769: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23088)
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63769 unreachable [tos
> 0xd8] (ttl 245, id 13141)
> 10.10.187.13.12345 > 10.0.0.1.63770: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23090)
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63770 unreachable [tos
> 0xd8] (ttl 245, id 13142)
> 10.10.187.13.12345 > 10.0.0.1.63771: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23091)
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63771 unreachable [tos
> 0xd8] (ttl 245, id 13143)
> 10.10.187.13.12345 > 10.0.0.1.63771: udp 0 (DF) [tos 0x18] (ttl 254, id
> 23092)
> 10.0.0.1 > 10.10.187.13: icmp: 10.0.0.1 udp port 63772 unreachable [tos
> 0xd8] (ttl 245, id 13144)
>
> [ snip -- all the way to the upper end of our masq ports ]
>
> ipchains -L -M -n on the masq gateway AFTER the probes
> > UDP 04:35.12 192.168.1.100 10.10.187.13 1035 (63767) -> 12345
> ^-------[ expiration of the udp tunnel has been updated ;)
>
> w00t! We now have a working tunnel from our host to port 1035 on the
> inside machine!
>
> Exploitation:
>
> We have demonstrated that it is possible for us to 'hijack' the enternal
> side of a masqueraded connection, so now what? There is not a whole lot
> we can do to the closed local udp port on the inside machine, so its
> time to examine other applications/protocols that use UDP for transport
> and what security risks there are in allowing unrestricted external
> access to thier source ports. I leave this as an excercise to the
> reader...
>
> -HD
>
> _______________________________________________
> Masq maillist - [EMAIL PROTECTED]
> Admin requests can be handled at http://www.indyramp.com/masq-list/ -- THIS INCLUDES
>UNSUBSCRIBING!
> or email to [EMAIL PROTECTED]
>
> PLEASE read the HOWTO and search the archives before posting.
> You can start your search at http://www.indyramp.com/masq/
> Please keep general linux/unix/pc/internet questions off the list.
>
Regards
--
Julian Anastasov <[EMAIL PROTECTED]>
_______________________________________________
Masq maillist - [EMAIL PROTECTED]
Admin requests can be handled at http://www.indyramp.com/masq-list/ -- THIS INCLUDES
UNSUBSCRIBING!
or email to [EMAIL PROTECTED]
PLEASE read the HOWTO and search the archives before posting.
You can start your search at http://www.indyramp.com/masq/
Please keep general linux/unix/pc/internet questions off the list.