{"id":802,"date":"2012-07-24T18:18:56","date_gmt":"2012-07-24T17:18:56","guid":{"rendered":"http:\/\/www.phillips321.co.uk\/?p=802"},"modified":"2012-07-24T18:18:56","modified_gmt":"2012-07-24T17:18:56","slug":"python-arp-ping-code","status":"publish","type":"post","link":"https:\/\/www.phillips321.co.uk\/2012\/07\/24\/python-arp-ping-code\/","title":{"rendered":"Python arp ping code"},"content":{"rendered":"<p>So today I&#8217;ve been playing with python and decided to make an arp ping utility. When i get more time i&#8217;ll turn this into a simple arp scanner.<\/p>\n<p>I know that this is all possible using scapy but the idea of this was to teach myself how raw sockets work within python.<\/p>\n<p>This requires netifaces and a few other modules that can usually be obtained using sudo easy_install modulename (you&#8217;ll require python-dev as well)<\/p>\n<p>This script requires that you run as root in order to send and capture raw packets<\/p>\n<div class=\"codecolorer-container python vibrant\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/><\/div><\/td><td><div class=\"python codecolorer\"><span class=\"co1\">#!\/usr\/bin\/env python<\/span><br \/>\n<span class=\"st0\">&quot;&quot;&quot;<br \/>\nAuthor: &nbsp; &nbsp; phillips321 contact at phillips321.co.uk<br \/>\nLicense: &nbsp; &nbsp;CC BY-SA 3.0<br \/>\nUse: &nbsp; &nbsp; &nbsp; &nbsp;Simple python arp ping<br \/>\nReleased: &nbsp; www.phillips321.co.uk<br \/>\nDependencies:<br \/>\n&nbsp; &nbsp; netifaces (needs python-dev then easy_install netifaces)<br \/>\nChangeLog:<br \/>\n&nbsp; &nbsp; v0.2 - fixed response to search for target ip<br \/>\n&nbsp; &nbsp; v0.1 - first release<br \/>\n&quot;&quot;&quot;<\/span><br \/>\nversion <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;0.2&quot;<\/span><br \/>\n<span class=\"kw1\">import<\/span> <span class=\"kw3\">socket<\/span><br \/>\n<span class=\"kw1\">import<\/span> <span class=\"kw3\">struct<\/span><br \/>\n<span class=\"kw1\">import<\/span> <span class=\"kw3\">sys<\/span><br \/>\n<span class=\"kw1\">import<\/span> netifaces<br \/>\n<span class=\"kw1\">import<\/span> <span class=\"kw3\">binascii<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"kw2\">len<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">==<\/span> <span class=\"nu0\">3<\/span> :<br \/>\n&nbsp; &nbsp; target <span class=\"sy0\">=<\/span> <span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; interface <span class=\"sy0\">=<\/span> <span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"kw1\">elif<\/span> <span class=\"kw2\">len<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">==<\/span> <span class=\"nu0\">2<\/span>: <br \/>\n&nbsp; &nbsp; target <span class=\"sy0\">=<\/span> <span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; interface <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;eth0&quot;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;No interface given so defaulting to eth0&quot;<\/span><br \/>\n<span class=\"kw1\">else<\/span>: <span class=\"co1\">#no values defined print help<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;Usage: %s IP [interface] <span class=\"es0\">\\n<\/span> &nbsp; eg: %s 192.168.1.0 eth0&quot;<\/span> % <span class=\"br0\">&#40;<\/span><span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; exit<span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\nnetworkdetails <span class=\"sy0\">=<\/span> netifaces.<span class=\"me1\">ifaddresses<\/span><span class=\"br0\">&#40;<\/span>interface<span class=\"br0\">&#41;<\/span><br \/>\nipaddress <span class=\"sy0\">=<\/span> networkdetails<span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">'addr'<\/span><span class=\"br0\">&#93;<\/span><br \/>\nmacaddress <span class=\"sy0\">=<\/span> networkdetails<span class=\"br0\">&#91;<\/span><span class=\"nu0\">17<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">'addr'<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;Attempting to arp ping %s from %s using %s&quot;<\/span> % <span class=\"br0\">&#40;<\/span>target<span class=\"sy0\">,<\/span>ipaddress<span class=\"sy0\">,<\/span>macaddress<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\"># create packet<\/span><br \/>\neth_hdr <span class=\"sy0\">=<\/span> <span class=\"kw3\">struct<\/span>.<span class=\"me1\">pack<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;!6s6s2s&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'<span class=\"es0\">\\x<\/span>ff<span class=\"es0\">\\x<\/span>ff<span class=\"es0\">\\x<\/span>ff<span class=\"es0\">\\x<\/span>ff<span class=\"es0\">\\x<\/span>ff<span class=\"es0\">\\x<\/span>ff'<\/span><span class=\"sy0\">,<\/span> macaddress.<span class=\"me1\">replace<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">':'<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">''<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">decode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'<span class=\"es0\">\\x<\/span>08<span class=\"es0\">\\x<\/span>06'<\/span><span class=\"br0\">&#41;<\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\narp_hdr <span class=\"sy0\">=<\/span> <span class=\"kw3\">struct<\/span>.<span class=\"me1\">pack<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;!2s2s1s1s2s&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>01'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'<span class=\"es0\">\\x<\/span>08<span class=\"es0\">\\x<\/span>00'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'<span class=\"es0\">\\x<\/span>06'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'<span class=\"es0\">\\x<\/span>04'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>01'<\/span><span class=\"br0\">&#41;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\narp_sender <span class=\"sy0\">=<\/span> <span class=\"kw3\">struct<\/span>.<span class=\"me1\">pack<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;!6s4s&quot;<\/span><span class=\"sy0\">,<\/span> macaddress.<span class=\"me1\">replace<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">':'<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">''<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">decode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'hex'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"me1\">inet_aton<\/span><span class=\"br0\">&#40;<\/span>ipaddress<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\narp_target <span class=\"sy0\">=<\/span> <span class=\"kw3\">struct<\/span>.<span class=\"me1\">pack<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;!6s4s&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00<span class=\"es0\">\\x<\/span>00'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"me1\">inet_aton<\/span><span class=\"br0\">&#40;<\/span>target<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\ncount <span class=\"sy0\">=<\/span> <span class=\"nu0\">5<\/span><br \/>\n<span class=\"kw1\">while<\/span> count <span class=\"sy0\">!=<\/span> <span class=\"nu0\">0<\/span>:<br \/>\n&nbsp; &nbsp; count <span class=\"sy0\">=<\/span> count - <span class=\"nu0\">1<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">try<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\"># send packet<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; rawSocket <span class=\"sy0\">=<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"kw3\">socket<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">socket<\/span>.<span class=\"me1\">PF_PACKET<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"me1\">SOCK_RAW<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"me1\">htons<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0x0806<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; rawSocket.<span class=\"me1\">bind<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>interface<span class=\"sy0\">,<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"me1\">htons<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0x0806<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; rawSocket.<span class=\"me1\">send<\/span><span class=\"br0\">&#40;<\/span>eth_hdr + arp_hdr + arp_sender + arp_target<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\"># wait for response<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; rawSocket <span class=\"sy0\">=<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"kw3\">socket<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">socket<\/span>.<span class=\"me1\">PF_PACKET<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"me1\">SOCK_RAW<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"me1\">htons<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0x0806<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; rawSocket.<span class=\"me1\">settimeout<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0.5<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; response <span class=\"sy0\">=<\/span> rawSocket.<span class=\"me1\">recvfrom<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">2048<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> target <span class=\"sy0\">==<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"me1\">inet_ntoa<\/span><span class=\"br0\">&#40;<\/span>response<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">28<\/span>:<span class=\"nu0\">32<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;Response from the folloiwing mac &quot;<\/span> + <span class=\"kw3\">binascii<\/span>.<span class=\"me1\">hexlify<\/span><span class=\"br0\">&#40;<\/span>response<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">6<\/span>:<span class=\"nu0\">12<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">swapcase<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">break<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">continue<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">except<\/span> <span class=\"kw3\">socket<\/span>.<span class=\"me1\">timeout<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;Attempt number %i did not get a response&quot;<\/span> % <span class=\"br0\">&#40;<\/span>count + <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">continue<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n","protected":false},"excerpt":{"rendered":"<p>So today I&#8217;ve been playing with python and decided to make an arp ping utility. When i get more time i&#8217;ll turn this into a simple arp scanner. I know that this is all possible using scapy but the idea of this was to teach myself how raw sockets work within python. This requires netifaces [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[207,33,313,111,315,312,314],"_links":{"self":[{"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/posts\/802"}],"collection":[{"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/comments?post=802"}],"version-history":[{"count":4,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/posts\/802\/revisions"}],"predecessor-version":[{"id":806,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/posts\/802\/revisions\/806"}],"wp:attachment":[{"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/media?parent=802"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/categories?post=802"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/tags?post=802"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}