|
NAMEdhcdrop - program for searching and suppress false DHCP servers in Ethernet.SYNOPSISdhcdrop [ -h ] [ -D ] [ -t ] [ -y ] [ -r ] [ -b ] [ -a ] [ -A ] [ -f ] [ -R ] [ -q ][ -m count ] [ -c count ] [ -n hostname ] [ -N clientname ] [ -p port ] [ -P port ] [ -w seconds ] [ -T timeout ] [ -M max-hosts-scan ] [ -l MAC-address ] [ -L network ] [ -S network/mask ] [ -F from-IP ] [ -s server-IP ] [ -C children count (2 - 32) ] [ initial-MAC-address ] < -i interface-name|interface-index > DESCRIPTIONSuppressing DHCP server is made by dhcdrop with a help of an attack DHCP starvation or with a help of flooding with DHCPDISCOVER messages. Look for details below. Besides dhcdrop can be used as a diagnostical tool and stress-testing when setting and developing DHCP serversOPTIONS
THEORETICAL BASICSIn DHCP protocol there is an option which specifies duration of leasing an IP address (Lease Time). During this time DHCP server gives IP address for client's use. After this time period a client have to make an attempt to refresh IP address for the purpose of extension the lease. For the server giving out IP address in lease means that during the lease this IP address can be given only to an owner of the lease and nobody else. Identification of clients is usually done by the server on the ground of MAC address. Usually every server has a pool of dynamic IP addresses. These are addresses which are not assigned to concrete MAC addresses and are given dynamically after any client's request. Pool on SOHO routers with default settings is not very big - from tens to about 200 addresses. In case of using software which performs the function of DHCP server the size of the pool is defined by the one who sets. If the pool of addresses is over then DHCP server ignores the requests from new clients (probably documenting this in logs). Actually it's not in action.Thereby in case of appearance false DHCP they can be supressed rather easy. It's necessary to receive lease for every IP address available on this server sending requests from unique clients every time. The more Lease Time is in server settings, the bigger period of DHCP server suppression in case of exhaustion of dynamical pool is. For most of SOHO routers Lease time comes to a number of days or even weeks. In case of using WinGate, dhcpd and other similar soft as DHCP server the lease time depends on the fantasy of the man who launched false DHCP server. PRINCIPLE OF DHCDROP OPERATIONThe program opens the interface specified in command line options using promiscuous mode then forms DHCP message (DHCPDISCOVER) using random source MAC address (if another conduct isn't specified) and sends it to the interface:01:58:04.681600 00:70:de:3b:b9:05 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342: (tos 0x10, ttl 64, id 33964, offset 0, flags [none], proto UDP (17), length 328) 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:70:de:3b:b9:05, length 300, xid 0xcc1cfc5c, Flags [none] Client-Ethernet-Address 00:70:de:3b:b9:05 Vendor-rfc1048 Extensions Magic Cookie 0x63825363 DHCP-Message Option 53, length 1: Discover Parameter-Request Option 55, length 3: Domain-Name-Server, Default-Gateway, Subnet-Mask Hostname Option 12, length 12: "DHCP-dropper" Vendor-Class Option 60, length 12: "DHCP-dropper" Client-ID Option 61, length 7: ether 00:70:de:3b:b9:05 After this it starts to wait for server's answer (DHCPOFFER). If the answer with offering IP address lease is received then the next DHCP message (DHCPREQUEST) is send to the interface. On this message server answers with DHCPACK-packet which confirms the possibility of using the IP address by a client. This completes the operation of receiving IP address suggested by the server. The program changes source MAC address and sends DHCPDISCOVER again. After that all the above operations of receiving the lease of a new IP address are repeated. It's worth paying attention that the program changes not only the client's MAC address in DHCP message but also the MAC address in the header of Ethernet-frame. This possibility brings the work of the program maximally nearer to the work of real DHCP client (and also allows to avoid DHCP snooping). Cycle of receiving IP addresses from server comes to an end when the maximum number of IP addresses set by the option is received or in case of exhausting dynamical pool of the server. In the second case you gained a victory. In the first case if you have an aim to reject the DHCP server then there is a point to set another value of maximum number of leased address option. USAGE OF THE PROGRAMInterfaces listingFirst of all it's necessary to understand how the network interface, where there is DHCP server, is called. This is easy to understand in UNIX-like OS by outputting ifconfig command. But in Windows OS it is not so evident. Because of this let's launch the program with -D option first of all: C:>dhcdrop -D Available interfaces: 1:\Device\NPF_GenericDialupAdapter descr: Adapter for generic dialup and VPN capture 2:\Device\NPF_{0C796DB5-22D9-46AB-9301-9C7ADC2304AF} descr: ZyXEL GN650 1000Base-T Adapter (Microsoft's Packet Scheduler) iaddr: 192.168.1.2/24 bcast: 255.255.255.255 iaddr: 10.7.7.7/24 bcast: 255.255.255.255 According to the output information it's evident that we need the second interface. As an argument for program's option -i any index of the second interface or its name \Device\NPF_{0C796DB5-22D9-46AB-9301-9C7ADC2304AF} can be set. To my mind it's more easy to use index and to launch the program with pointing index instead of a name. For example: dhcdrop -i 2 Interactive mode, by default The easiest way of using the program for searching and choosing the rejected server manually: $ sudo dhcdrop -i eth1 Using interface: 'eth1' Got response from server 10.7.7.1 (IP-header 10.7.7.1), server ethernet address: 00:02:44:75:77:E4, lease time: 1.1h (3960s) Got BOOTREPLY (DHCPOFFER) for client ether: 00:16:09:D8:CF:60 You IP: 10.7.7.201/24 Drop him? [y/n] n Searching next server... Got response from server 192.168.1.1 (IP-header 192.168.1.1), server ethernet address: 00:1E:2A:52:C8:CA, lease time: 24h (86400s) Got BOOTREPLY (DHCPOFFER) for client ether: 00:16:09:D8:CF:60 You IP: 192.168.1.2/24 Drop him? [y/n] y 1. Got BOOTREPLY (DHCPACK) for client ether: 00:16:09:D8:CF:60 You IP: 192.168.1.2/24 2. Got BOOTREPLY (DHCPACK) for client ether: 00:A2:FA:12:41:F7 You IP: 192.168.1.3/24 3. Got BOOTREPLY (DHCPACK) for client ether: 00:56:EA:F8:1C:B0 You IP: 192.168.1.4/24 4. Got BOOTREPLY (DHCPACK) for client ether: 00:EA:91:1A:C8:A8 You IP: 192.168.1.5/24 5. Got BOOTREPLY (DHCPACK) for client ether: 00:83:8A:25:C7:1C You IP: 192.168.1.6/24 6. Got BOOTREPLY (DHCPACK) for client ether: 00:CA:A7:FF:C1:70 You IP: 192.168.1.7/24 Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Finished. As it's seen from the example when receiving an answer from DHCP server dhcdrop reports information from the server about given IP address and asks of necessity to suppress this server. Receiving a negative answer it goes on searching for servers in the network ignoring the server discovered before. In case of receiving a positive answer it starts a process for rejecting the server with a method shown above. Automatical suppresion mode of all the servers except the legitimate one In case of knowing (and usually we know) MAC address of the legal DHCP server in our network the operation of suppressing illegal servers can be simplified: $ sudo dhcdrop -i eth1 -y -l 00:02:44:75:77:E4 Using interface: 'eth1' Got response from server 192.168.1.1 (IP-header 192.168.1.1), server ethernet address: 00:1E:2A:52:C8:CA, lease time: 24h (86400s) Got BOOTREPLY (DHCPOFFER) for client ether: 00:37:C5:10:BE:16 You IP: 192.168.1.2/24 1. Got BOOTREPLY (DHCPACK) for client ether: 00:37:C5:10:BE:16 You IP: 192.168.1.2/24 2. Got BOOTREPLY (DHCPACK) for client ether: 00:94:26:88:33:BD You IP: 192.168.1.3/24 3. Got BOOTREPLY (DHCPACK) for client ether: 00:E5:AC:7B:79:BB You IP: 192.168.1.4/24 <skipped> Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Finished. In this version of using dhcdrop rejects any server except that ones states with -l option without asking additional questions (due to using option -y ). Test mode Test mode ( -t ) is comfortable to use for execution the program from code in computer-aided mode. An example of the simplest code is below: 00 #!/bin/bash 01 LEGAL_SERVER="00:11:22:33:44:55" 02 DROPPER="/usr/sbin/dhcdrop" 03 IFNAME="eth1" 04 $DROPPER -i $IFNAME -t -l $LEGAL_SERVER -m 3 05 if [ $? = 200 ] 06 then 07 echo Illegal server found Dropping him 08 $DROPPER -i eth1 -l $LEGAL_SERVER -y 09 else 10 echo Illegal server not found. 11 fi In the forth line launching of dhcdrop is being executed in a test mode with setting an option of legal DHCP server for the network ( -l ), an option of testing ( -t ) and an option of setting maximum number of attempts of sending DHCPDISCOVER in mode of searching the server ( -m). If there is no answer for all the requests been sent then the program ends with 0 code. If there is answer for the server without -l option then the program ends with 200 code which leads to the further launching of the program with options describing suppression of any DHCP server in the network except the legal one. Usage of aggressive mode for receiving addresses As you can guess from the description of DHCP protocol - if a client received the configuration from illegal DHCP server then the server wouldn't give this configuration iteratively to another client until the period of lease expires. So a simple exhaustion of IP addresses' pool won't save clients who have already received incorrect configuration. The server will give these addresses only to the clients who requested them initially and will ignore requests from dhcdrop information from illegal DHCP server again and it would be continued until illegal DHCP server switched off. For solving such a problem there were added the aggressive mode of receiving IP addresses in dhcdrop starting with version 0.5. It is activated with -L option which points a legitimate IP subnet for the given Etherner segment of the network. Here is the algorithm of its operation: dhcdrop launches an ordinary mode of suppression and exhausts the whole IP addresses' pool of illegal DHCP server. Analyzes the first DHCPOFFER received from illegal DHCP, with a help of the network mask and client's IP address given out by the server receives the address of IP network attended by this server. Launches ARP-scanning of received subnet for the purpose of exposing hosts which received incorrect configurational information, default number of scanned hosts is limited to 512 (can be changed with -M option), some servers gives out configurational set with a mask /8 which conforms to approximately 16 million of hosts - scanning of such an address range will take a lot of time. Sends messages DHCPRELEASE to the DHCP server from every found host (except the server itself). Waits 60 seconds (default value can be changed with -w option), after then restarts the process of receiving IP addresses. As an example let's launch dhcdrop with the same options as in the previous example but additionally state legal IP network 10.7.7.0: $ sudo dhcdrop -i eth1 -y -l 00:02:44:75:77:E4 -L 10.7.7.0 Using interface: 'eth1' Got response from server 192.168.1.1 (IP-header 192.168.1.1), server ethernet address: 00:1E:2A:52:C8:CA, lease time: 24h (86400s) Got BOOTREPLY (DHCPOFFER) for client ether: 00:BC:BF:D6:39:2E You IP: 192.168.1.5/24 1. Got BOOTREPLY (DHCPACK) for client ether: 00:BC:BF:D6:39:2E You IP: 192.168.1.5/24 2. Got BOOTREPLY (DHCPACK) for client ether: 00:FB:E7:A4:19:EC You IP: 192.168.1.6/24 3. Got BOOTREPLY (DHCPACK) for client ether: 00:CB:44:F9:A8:6F You IP: 192.168.1.7/24 Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Trying to use agressive mode. Starting ARP scanning network in range: 192.168.1.0 - 192.168.1.255... Illegal DHCP server perhaps assigned IP adresses to the following hosts: 1. Received ARP-reply from: 00:1e:2a:52:c8:ca (192.168.1.1) - itself DHCP server. 2. Received ARP-reply from: 00:03:ff:15:52:90 (192.168.1.3) 3. Received ARP-reply from: 00:03:ff:14:52:90 (192.168.1.4) 4. Received ARP-reply from: 00:a0:c5:30:52:90 (192.168.1.200) Sending DHCPRELEASE for invalid clients: Send DHCPRELEASE for host 00:03:ff:15:52:90 (192.168.1.3). Send DHCPRELEASE for host 00:03:ff:14:52:90 (192.168.1.4). Send DHCPRELEASE for host 00:a0:c5:30:52:90 (192.168.1.200). Restart dropping DHCP server after 60 seconds timeout... 1. Got BOOTREPLY (DHCPACK) for client ether: 00:BC:BF:D6:39:2E You IP: 192.168.1.5/24 2. Got BOOTREPLY (DHCPACK) for client ether: 00:F1:32:14:60:A3 You IP: 192.168.1.3/24 3. Got BOOTREPLY (DHCPACK) for client ether: 00:2D:1C:80:ED:12 You IP: 192.168.1.4/24 Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. Wait DHCPOFFER timeout. Resending DHCPDISCOVER. WARNING: Failed to take away all the IP addresses assigned by DHCP server. Perhaps DHCP server checks availability of IP addresses by sending ARP-request before assigning them. Try to restart dhcpdrop later. If it doesn't help try to disconnect problem hosts temporarily, then send manually DHCPRELEASE from address of this hosts (use option -R) and restart dhcdrop. Finished. Explanation of the program operation's results. After outputting the inscription "Trying to use aggressive mode" ARP-scanning of subnet, serviced by illegal DHCP server in the stated range, starts. As a result 4 hosts are found including the DHCP server itself (the first host). Then dhcdrop sends DHCPRELEASE message to the server 192.168.1.1 from addresses (Ethernet & IP) of all the hosts found in the subnet except DHCP server itself and stops execution for 60 seconds. Timeout is necessary because some DHCP servers hold giving out IP addresses to a new client during little period of time after receiving DHCPRELEASE from a previous client. In case of necessity timeout's value can be changed with -w option. On the expiry of timeout dhcdrop launches the process of receiving released IP addresses. We succeeded in receiving IP addresses 192.168.1.5 (it was received initially when starting the program), 192.168.1.3 and 192.168.1.4. The last two addresses were successfully released by the server after receiving DHCPRELEASE messages generated by dhcdrop. Failed to receive the address 192.168.1.200, in spite of presence of this host in the network, and the fact that from its address DHCPRELEASE message was send. One of the reasons of failure was described in warning in the end of the program's output: DHCP server before giving out the addresses can check if the host with the requested IP address exists and only after this it can give out the address if such a host is absent in the network. If not, a new lease for this address will not be given out. In this situation switching off the problem hosts fron the network manually and sending DHCPRELEASE messages from these hosts' addresses to the server (see an example below) can be helpful. After this it's necessary to restart the process of receiving IP addresses. But in our case the problem isn't hidden here. The host 192.168.1.200 has a statically set IP address and because of this it has never requested the configuration from DHCP server. The necessity itself of stating the legal network for launching the aggressive mode is necessary to check of the address range given out by illegal DHCP server crosses the address range of the subnet where it was discovered. If the address ranges cross each other then ARP-scanning will be done with the hosts, which have the correct configuration and will output the incorrect information. Because of this in case of discovering crossing of the address ranges aggressive mode will not be launched. Sending DHCPRELEASE message You will probably have a necessity to send DHCPRELEASE message manually. For example, because of the reason mentioned in the previous example. You can do it with a help of -R option: $ sudo dhcdrop -i eth1 -R -s 192.168.1.1 -F 192.168.1.4 00:2D:1C:80:ED:12 Using interface: 'eth1' Send DHCPRELEASE from 00:2D:1C:80:ED:12 client IP 192.168.1.4 to DHCP server 192.168.1.1 Finished. Option -s sets server's IP address, -F set DHCP client's IP address, 00:2D:1C:80:ED:12 set client's Ethernet address. As a result such a sort of packet will be send in the network: 16:13:43.887735 00:2d:1c:80:ed:12 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342: (tos 0x10, ttl 64, id 29807, offset 0, flags [none], proto UDP (17), length 328) 0.0.0.0.68 > 192.168.1.1.67: BOOTP/DHCP, Request from 00:2d:1c:80:ed:12, length 300, xid 0xb2f04a28, Flags [none] Client-IP 192.168.1.4 Client-Ethernet-Address 00:2d:1c:80:ed:12 Vendor-rfc1048 Extensions Magic Cookie 0x63825363 DHCP-Message Option 53, length 1: Release Server-ID Option 54, length 4: 192.168.1.1 Client-ID Option 61, length 7: ether 00:2d:1c:80:ed:12 Scanning the network's segment You can use ARP-scanning of the network for searching clients who received incorrect configurational information. It is realized with a help of -S option: $ dhcdrop -i eth1 -S 192.168.1.0/24 Using interface: 'eth1' Starting ARP-scanning for subnet 192.168.1.0/24. IP address range 192.168.1.0 - 192.168.1.255. WARNING: Source IP is not set (use option -F). Using random value for source IP address: 192.168.1.195 1. Received ARP-reply from: 00:1e:2a:52:c8:ca (192.168.1.1). 2. Received ARP-reply from: 00:a0:c5:30:52:90 (192.168.1.200). Finished. According to the warning, which was printed by the program, when launching, the source IP address wasn't set. Because of this dhcdrop chooses a random IP address from address range of a stated subnet. If you need to set a source address then use -F option. For this kind of scanning factual settings of routing in your network aren't important. Interface set by an option -i will always be used accepting that hosts of the mentioned subnet are in the same Ethernet segment with the host where dhcdrop is being launched. Also this option allows to discover duplication of IP addresses in the same segment of the network even if the scanning is being done from the host which IP address is being duplicated by another host. AUTHORThis program was written by Roman Chebotarev <roma@ultranet.ru>REPORTING BUGSAny bugs/remarks/suggestions/wishes concerning this program please send to <roma@ultranet.ru>MAN FILEGuidance page was made by Andrew Clark <andyc@altlinux.org>, basing on the articles of the author of the program, web page http://www.netpatch.ru/en/dhcdrop.htmlTRANSLATIONThe translation from Russian into English was made by Anna Makhtinger <mailmnoo@rambler.ru>
Visit the GSP FreeBSD Man Page Interface. |