
Nmap Development mailing list archives
Re: TCP Split Handshake and Nmap
From: Fyodor <fyodor () insecure org>
Date: Thu, 10 Jun 2010 23:23:00 -0700
On Tue, Jun 08, 2010 at 11:26:43AM -0600, David Fifield wrote:
On Fri, Jun 04, 2010 at 04:22:55PM +0100, jah wrote:The attached patch does very little work since the split handshake SYN passes the existing checks for dest port matching a probe source port; it adds a test for the SYN flag right after the test for SYN|ACK for SYN scans.+ } else if (USI->scantype == SYN_SCAN && tcp->th_flags == TH_SYN) { Just one thing I would change here: + } else if (USI->scantype == SYN_SCAN && (tcp->th_flags & TH_SYN) == TH_SYN) { That way it will work with a SYN|URG or SYN|PSH or something else silly. Putting this test after the SYN|ACK test lets SYN|ACK continue giving the correct reason code.
That's a great point, but it could tip the balance too far in the other direction. I don't think we should count a SYN|RST as open. And I have no idea how a Linux or Windows client would treat a SYN|FIN response. So my suggestion is to basically do as you say, but move it so it after the RST test as well as the SYN|ACK test. I just checked this patch in: Index: scan_engine.cc =================================================================== --- scan_engine.cc (revision 18032) +++ scan_engine.cc (working copy) @@ -4102,10 +4102,6 @@ /* Yeah! An open port */ newstate = PORT_OPEN; current_reason = ER_SYNACK; - } else if (USI->scantype == SYN_SCAN && tcp->th_flags == TH_SYN) { - /* A SYN from a TCP Split Handshake - open port */ - newstate = PORT_OPEN; - current_reason = ER_SYN; } else if (tcp->th_flags & TH_RST) { current_reason = ER_RESETPEER; if (USI->scantype == WINDOW_SCAN ) { @@ -4113,6 +4109,10 @@ } else if (USI->scantype == ACK_SCAN) { newstate = PORT_UNFILTERED; } else newstate = PORT_CLOSED; + } else if (USI->scantype == SYN_SCAN && (tcp->th_flags & TH_SYN)) { + /* A SYN from a TCP Split Handshake - http://nmap.org/misc/split-handshake.pdf - open port */ + newstate = PORT_OPEN; + current_reason = ER_SYN; } else { if (o.debugging) error("Received scan response with unexpected TCP flags: %d", tcp->th_flags); As for the name, I think split-handshake-syn is still OK. Maybe it is a SYN|URG or SYN|PSH, but SYN is still the operative flag here. I mean we often refer to RST packets when they are technically RST|ACK because it is the RST which is important in these cases. Perhaps I should have really moved the RST test to the very top of the if block. From the current code it looks like a SYN|ACK|RST would wrongly (IMHO) be considered open. Cheers, Fyodor _______________________________________________ Sent through the nmap-dev mailing list http://cgi.insecure.org/mailman/listinfo/nmap-dev Archived at http://seclists.org/nmap-dev/
Current thread:
- TCP Split Handshake and Nmap jah (Jun 02)
- what is ER_INITACK? jah (Jun 02)
- Re: TCP Split Handshake and Nmap Fyodor (Jun 03)
- Re: TCP Split Handshake and Nmap Fyodor (Jun 03)
- Re: TCP Split Handshake and Nmap jah (Jun 04)
- Re: TCP Split Handshake and Nmap Fyodor (Jun 07)
- Re: TCP Split Handshake and Nmap jah (Jun 07)
- Re: TCP Split Handshake and Nmap David Fifield (Jun 08)
- Re: TCP Split Handshake and Nmap jah (Jun 08)
- Re: TCP Split Handshake and Nmap David Fifield (Jun 08)
- Re: TCP Split Handshake and Nmap Fyodor (Jun 10)