Imported Upstream version 0.4-alpha debian upstream/0.4-alpha
authorDevon Kearns <dookie@kali.org>
Wed, 9 Jan 2013 01:04:03 +0000 (18:04 -0700)
committerDevon Kearns <dookie@kali.org>
Wed, 9 Jan 2013 01:04:03 +0000 (18:04 -0700)
323 files changed:
Buf.cc [new file with mode: 0644]
Buf.h [new file with mode: 0644]
CHANGELOG [new file with mode: 0644]
COPYING [new file with mode: 0644]
COPYING.OpenSSH [new file with mode: 0644]
COPYING.OpenSSL [new file with mode: 0644]
Connection.cc [new file with mode: 0644]
Connection.h [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
NcrackOps.cc [new file with mode: 0644]
NcrackOps.h [new file with mode: 0644]
NcrackOutputTable.cc [new file with mode: 0644]
NcrackOutputTable.h [new file with mode: 0644]
Service.cc [new file with mode: 0644]
Service.h [new file with mode: 0644]
ServiceGroup.cc [new file with mode: 0644]
ServiceGroup.h [new file with mode: 0644]
Target.cc [new file with mode: 0644]
Target.h [new file with mode: 0644]
TargetGroup.cc [new file with mode: 0644]
TargetGroup.h [new file with mode: 0644]
config.guess [new file with mode: 0755]
config.sub [new file with mode: 0755]
configure [new file with mode: 0755]
configure.ac [new file with mode: 0644]
crypto.cc [new file with mode: 0644]
crypto.h [new file with mode: 0644]
depcomp [new file with mode: 0755]
docs/AUTHORS [new file with mode: 0644]
docs/Makefile [new file with mode: 0644]
docs/TODO [new file with mode: 0644]
docs/devguide.txt [new file with mode: 0644]
docs/leet-ncrack-ascii-art.txt [new file with mode: 0644]
docs/mirror_pool.txt [new file with mode: 0644]
docs/ncrack-man-enclosure.xml [new file with mode: 0644]
docs/ncrack-usage.xml [new file with mode: 0644]
docs/ncrack.1 [new file with mode: 0644]
docs/ncrack.usage.txt [new file with mode: 0644]
docs/ncrackmanhtml.xml [new file with mode: 0644]
docs/openssh-library.txt [new file with mode: 0644]
docs/refguide.xml [new file with mode: 0644]
global_structures.h [new file with mode: 0644]
lists/common.usr [new file with mode: 0644]
lists/default.pwd [new file with mode: 0644]
lists/default.usr [new file with mode: 0644]
lists/jtr.pwd [new file with mode: 0644]
lists/minimal.usr [new file with mode: 0644]
lists/myspace.pwd [new file with mode: 0644]
lists/phpbb.pwd [new file with mode: 0644]
lists/top50000.pwd [new file with mode: 0644]
macosx/Makefile [new file with mode: 0644]
macosx/README [new file with mode: 0644]
macosx/ncrack.pmdoc/01ncrack-contents.xml [new file with mode: 0644]
macosx/ncrack.pmdoc/01ncrack.xml [new file with mode: 0644]
macosx/ncrack.pmdoc/index.xml [new file with mode: 0644]
modules/Makefile.in [new file with mode: 0644]
modules/modules.h [new file with mode: 0644]
modules/ncrack_ftp.cc [new file with mode: 0644]
modules/ncrack_http.cc [new file with mode: 0644]
modules/ncrack_pop3.cc [new file with mode: 0644]
modules/ncrack_rdp.cc [new file with mode: 0644]
modules/ncrack_smb.cc [new file with mode: 0644]
modules/ncrack_ssh.cc [new file with mode: 0644]
modules/ncrack_telnet.cc [new file with mode: 0644]
modules/ncrack_vnc.cc [new file with mode: 0644]
mswin32/Makefile [new file with mode: 0644]
mswin32/OpenSSL/bin/libeay32.dll [new file with mode: 0644]
mswin32/OpenSSL/bin/ssleay32.dll [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/aes.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/applink.c [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/asn1.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/asn1_mac.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/asn1t.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/bio.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/blowfish.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/bn.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/buffer.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/cast.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/comp.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/conf.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/conf_api.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/crypto.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/des.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/des_old.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/dh.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/dsa.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/dso.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/dtls1.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/e_os2.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ebcdic.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ec.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ecdh.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ecdsa.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/engine.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/err.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/evp.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/hmac.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/idea.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/krb5_asn.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/kssl.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/lhash.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/md2.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/md4.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/md5.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/obj_mac.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/objects.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ocsp.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/opensslconf.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/opensslv.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ossl_typ.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/pem.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/pem2.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/pkcs12.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/pkcs7.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/pq_compat.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/pqueue.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/rand.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/rc2.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/rc4.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ripemd.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/rsa.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/safestack.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/sha.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ssl.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ssl2.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ssl23.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ssl3.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/stack.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/store.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/symhacks.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/tls1.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/tmdiff.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/txt_db.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ui.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/ui_compat.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/x509.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/x509_vfy.h [new file with mode: 0644]
mswin32/OpenSSL/include/openssl/x509v3.h [new file with mode: 0644]
mswin32/OpenSSL/lib/libeay32.lib [new file with mode: 0644]
mswin32/OpenSSL/lib/ssleay32.lib [new file with mode: 0644]
mswin32/OpenSSL/upgrade-guide.txt [new file with mode: 0644]
mswin32/license-format/licformat.sh [new file with mode: 0755]
mswin32/license-format/licsed_1 [new file with mode: 0644]
mswin32/license-format/licsed_2 [new file with mode: 0644]
mswin32/ncrack.sln [new file with mode: 0644]
mswin32/ncrack.vcxproj [new file with mode: 0644]
mswin32/nsis/AddToPath.nsh [new file with mode: 0644]
mswin32/nsis/Ncrack.nsi [new file with mode: 0644]
mswin32/nsis/final.ini [new file with mode: 0644]
mswin32/winclude.h [new file with mode: 0644]
mswin32/winfix.cc [new file with mode: 0644]
mswin32/winfix.h [new file with mode: 0644]
nbase/CHANGELOG [new file with mode: 0644]
nbase/Makefile.in [new file with mode: 0644]
nbase/aclocal.m4 [new file with mode: 0644]
nbase/configlocal.m4 [new file with mode: 0644]
nbase/configure [new file with mode: 0755]
nbase/configure.ac [new file with mode: 0644]
nbase/getaddrinfo.c [new file with mode: 0644]
nbase/getnameinfo.c [new file with mode: 0644]
nbase/getopt.c [new file with mode: 0644]
nbase/getopt.h [new file with mode: 0644]
nbase/inet_ntop.c [new file with mode: 0644]
nbase/inet_pton.c [new file with mode: 0644]
nbase/nbase.h [new file with mode: 0644]
nbase/nbase.vcxproj [new file with mode: 0644]
nbase/nbase_config.h.in [new file with mode: 0644]
nbase/nbase_crc32ct.h [new file with mode: 0644]
nbase/nbase_ipv6.h [new file with mode: 0644]
nbase/nbase_memalloc.c [new file with mode: 0644]
nbase/nbase_misc.c [new file with mode: 0644]
nbase/nbase_rnd.c [new file with mode: 0644]
nbase/nbase_str.c [new file with mode: 0644]
nbase/nbase_time.c [new file with mode: 0644]
nbase/nbase_winconfig.h [new file with mode: 0644]
nbase/nbase_winunix.c [new file with mode: 0644]
nbase/nbase_winunix.h [new file with mode: 0644]
nbase/snprintf.c [new file with mode: 0644]
nbase/strcasecmp.c [new file with mode: 0644]
ncrack-services [new file with mode: 0644]
ncrack.cc [new file with mode: 0644]
ncrack.h [new file with mode: 0644]
ncrack_config.h.in [new file with mode: 0644]
ncrack_error.cc [new file with mode: 0644]
ncrack_error.h [new file with mode: 0644]
ncrack_input.cc [new file with mode: 0644]
ncrack_input.h [new file with mode: 0644]
ncrack_resume.cc [new file with mode: 0644]
ncrack_resume.h [new file with mode: 0644]
ncrack_tty.cc [new file with mode: 0644]
ncrack_tty.h [new file with mode: 0644]
ncrack_winconfig.h [new file with mode: 0644]
nsock/examples/Makefile [new file with mode: 0644]
nsock/examples/README [new file with mode: 0644]
nsock/examples/nsock_telnet.c [new file with mode: 0644]
nsock/examples/nsock_test_timers.c [new file with mode: 0644]
nsock/include/nsock.h [new file with mode: 0644]
nsock/include/nsock_config.h.in [new file with mode: 0644]
nsock/include/nsock_winconfig.h [new file with mode: 0644]
nsock/nsock.vcxproj [new file with mode: 0644]
nsock/src/Makefile.in [new file with mode: 0644]
nsock/src/aclocal.m4 [new file with mode: 0644]
nsock/src/configure [new file with mode: 0755]
nsock/src/configure.ac [new file with mode: 0644]
nsock/src/error.c [new file with mode: 0644]
nsock/src/error.h [new file with mode: 0644]
nsock/src/filespace.c [new file with mode: 0644]
nsock/src/filespace.h [new file with mode: 0644]
nsock/src/gh_list.c [new file with mode: 0644]
nsock/src/gh_list.h [new file with mode: 0644]
nsock/src/netutils.c [new file with mode: 0644]
nsock/src/netutils.h [new file with mode: 0644]
nsock/src/nsock_connect.c [new file with mode: 0644]
nsock/src/nsock_core.c [new file with mode: 0644]
nsock/src/nsock_event.c [new file with mode: 0644]
nsock/src/nsock_internal.h [new file with mode: 0644]
nsock/src/nsock_iod.c [new file with mode: 0644]
nsock/src/nsock_pcap.c [new file with mode: 0644]
nsock/src/nsock_pcap.h [new file with mode: 0644]
nsock/src/nsock_pool.c [new file with mode: 0644]
nsock/src/nsock_read.c [new file with mode: 0644]
nsock/src/nsock_ssl.c [new file with mode: 0644]
nsock/src/nsock_ssl.h [new file with mode: 0644]
nsock/src/nsock_timers.c [new file with mode: 0644]
nsock/src/nsock_write.c [new file with mode: 0644]
opensshlib/Makefile.in [new file with mode: 0644]
opensshlib/aclocal.m4 [new file with mode: 0644]
opensshlib/acss.c [new file with mode: 0644]
opensshlib/acss.h [new file with mode: 0644]
opensshlib/audit.h [new file with mode: 0644]
opensshlib/auth.h [new file with mode: 0644]
opensshlib/bsd-asprintf.c [new file with mode: 0644]
opensshlib/bsd-snprintf.c [new file with mode: 0644]
opensshlib/bufaux.c [new file with mode: 0644]
opensshlib/bufbn.c [new file with mode: 0644]
opensshlib/buffer.c [new file with mode: 0644]
opensshlib/buffer.h [new file with mode: 0644]
opensshlib/buildpkg.sh [new file with mode: 0644]
opensshlib/buildpkg.sh.in [new file with mode: 0644]
opensshlib/cipher-3des1.c [new file with mode: 0644]
opensshlib/cipher-acss.c [new file with mode: 0644]
opensshlib/cipher-aes.c [new file with mode: 0644]
opensshlib/cipher-bf1.c [new file with mode: 0644]
opensshlib/cipher-ctr.c [new file with mode: 0644]
opensshlib/cipher.c [new file with mode: 0644]
opensshlib/cipher.h [new file with mode: 0644]
opensshlib/cleanup.c [new file with mode: 0644]
opensshlib/compat.c [new file with mode: 0644]
opensshlib/compat.h [new file with mode: 0644]
opensshlib/config.guess [new file with mode: 0755]
opensshlib/config.h.in [new file with mode: 0644]
opensshlib/config.sub [new file with mode: 0755]
opensshlib/configure [new file with mode: 0755]
opensshlib/configure.ac [new file with mode: 0644]
opensshlib/crc32.c [new file with mode: 0644]
opensshlib/crc32.h [new file with mode: 0644]
opensshlib/deattack.c [new file with mode: 0644]
opensshlib/deattack.h [new file with mode: 0644]
opensshlib/defines.h [new file with mode: 0644]
opensshlib/dh.c [new file with mode: 0644]
opensshlib/dh.h [new file with mode: 0644]
opensshlib/fatal.c [new file with mode: 0644]
opensshlib/includes.h [new file with mode: 0644]
opensshlib/install-sh [new file with mode: 0755]
opensshlib/kex.c [new file with mode: 0644]
opensshlib/kex.h [new file with mode: 0644]
opensshlib/kexdh.c [new file with mode: 0644]
opensshlib/kexdhc.c [new file with mode: 0644]
opensshlib/kexgex.c [new file with mode: 0644]
opensshlib/kexgexc.c [new file with mode: 0644]
opensshlib/key.c [new file with mode: 0644]
opensshlib/key.h [new file with mode: 0644]
opensshlib/log.c [new file with mode: 0644]
opensshlib/log.h [new file with mode: 0644]
opensshlib/mac.c [new file with mode: 0644]
opensshlib/mac.h [new file with mode: 0644]
opensshlib/match.c [new file with mode: 0644]
opensshlib/match.h [new file with mode: 0644]
opensshlib/md-sha256.c [new file with mode: 0644]
opensshlib/misc.c [new file with mode: 0644]
opensshlib/misc.h [new file with mode: 0644]
opensshlib/moduli.c [new file with mode: 0644]
opensshlib/myproposal.h [new file with mode: 0644]
opensshlib/openbsd-compat.h [new file with mode: 0644]
opensshlib/openssh.h [new file with mode: 0644]
opensshlib/openssh.vcxproj [new file with mode: 0644]
opensshlib/opensshlib.h [new file with mode: 0644]
opensshlib/openssl-compat.h [new file with mode: 0644]
opensshlib/packet.c [new file with mode: 0644]
opensshlib/packet.h [new file with mode: 0644]
opensshlib/rijndael.c [new file with mode: 0644]
opensshlib/rijndael.h [new file with mode: 0644]
opensshlib/rsa.c [new file with mode: 0644]
opensshlib/rsa.h [new file with mode: 0644]
opensshlib/sha2.c [new file with mode: 0644]
opensshlib/sha2.h [new file with mode: 0644]
opensshlib/ssh-dss.c [new file with mode: 0644]
opensshlib/ssh-rsa.c [new file with mode: 0644]
opensshlib/ssh.h [new file with mode: 0644]
opensshlib/ssh1.h [new file with mode: 0644]
opensshlib/ssh2.h [new file with mode: 0644]
opensshlib/sshconnect.c [new file with mode: 0644]
opensshlib/sshconnect.h [new file with mode: 0644]
opensshlib/sshconnect2.c [new file with mode: 0644]
opensshlib/strlcat.c [new file with mode: 0644]
opensshlib/strlcpy.c [new file with mode: 0644]
opensshlib/strsep.c [new file with mode: 0644]
opensshlib/umac.c [new file with mode: 0644]
opensshlib/umac.h [new file with mode: 0644]
opensshlib/winfixssh.h [new file with mode: 0644]
opensshlib/xmalloc.c [new file with mode: 0644]
opensshlib/xmalloc.h [new file with mode: 0644]
output.cc [new file with mode: 0644]
output.h [new file with mode: 0644]
services.cc [new file with mode: 0644]
services.h [new file with mode: 0644]
shtool [new file with mode: 0755]
targets.cc [new file with mode: 0644]
targets.h [new file with mode: 0644]
timing.cc [new file with mode: 0644]
timing.h [new file with mode: 0644]
utils.cc [new file with mode: 0644]
utils.h [new file with mode: 0644]

diff --git a/Buf.cc b/Buf.cc
new file mode 100644 (file)
index 0000000..26dc716
--- /dev/null
+++ b/Buf.cc
@@ -0,0 +1,342 @@
+
+/***************************************************************************
+ * Buf.cc -- The Buf class is reponsible for I/O buffer manipulation       *
+ * and is based on the buffer code used in OpenSSH.                        *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "Buf.h"
+
+Buf::Buf()
+{
+       const u_int len = DEFAULT_BUF_SIZE;
+
+       alloc = 0;
+       buf = (u_char *)safe_malloc(len);
+       alloc = len;
+       offset = 0;
+       end = 0;
+}
+
+
+/* Frees any memory used for the buffer. */
+Buf::~Buf()
+{
+       if (alloc > 0) {
+    free(buf);
+    buf = NULL;
+       }
+}
+
+
+/*
+ * Clears any data from the buffer, making it empty.  This does not actually
+ * zero the memory.
+ */
+void
+Buf::clear(void)
+{
+       offset = 0;
+       end = 0;
+}
+
+
+/* 
+ * Similar to way snprintf works, but data get saved inside the buffer.
+ * Warning: data won't get null terminated
+ * the len argument is the real length of the _actual_ data
+ */
+void
+Buf::snprintf(u_int len, const void *fmt, ...)
+{
+
+  void *p;
+  va_list ap;
+
+  /* Since vsnprintf always null terminates the data, we
+   * allocate one extra byte for the trailing '\0' and then
+   * drop it by decreasing 'end' by 1
+   */
+  p = append_space(len + 1);
+
+  va_start(ap, fmt);
+  vsnprintf((char *)p, len + 1, (char *)fmt, ap);
+  va_end(ap);
+  end--;
+
+  //memcpy(p, data, len);
+
+}
+
+
+
+/* Appends data to the buffer, expanding it if necessary. */
+void
+Buf::append(const void *data, u_int len)
+{
+       void *p;
+       p = append_space(len);
+       memcpy(p, data, len);
+}
+
+
+
+/*
+ * Appends space to the buffer, expanding the buffer if necessary. This does
+ * not actually copy the data into the buffer, but instead returns a pointer
+ * to the allocated region.
+ */
+void *
+Buf::append_space(u_int len)
+{
+       u_int newlen;
+       void *p;
+
+       if (len > BUFFER_MAX_CHUNK)
+               fatal("%s: len %u not supported", __func__, len);
+
+       /* If the buffer is empty, start using it from the beginning. */
+       if (offset == end) {
+               offset = 0;
+               end = 0;
+       }
+restart:
+       /* If there is enough space to store all data, store it now. */
+       if (end + len < alloc) {
+               p = buf + end;
+               end += len;
+               return p;
+       }
+
+       /* Compact data back to the start of the buffer if necessary */
+       if (compact())
+               goto restart;
+
+       /* Increase the size of the buffer and retry. */
+       newlen = roundup(alloc + len, BUFFER_ALLOCSZ);
+       if (newlen > BUFFER_MAX_LEN)
+               fatal("%s: alloc %u not supported", __func__, newlen);
+       buf = (u_char *)safe_realloc(buf, newlen);
+       alloc = newlen;
+       goto restart;
+       /* NOTREACHED */
+}
+
+
+/*
+ * Check whether an allocation of 'len' will fit in the buffer
+ * This must follow the same math as buffer_append_space
+ */
+int
+Buf::check_alloc(u_int len)
+{
+       if (offset == end) {
+               offset = 0;
+               end = 0;
+       }
+ restart:
+       if (end + len < alloc)
+               return (1);
+       if (compact())
+               goto restart;
+       if (roundup(alloc + len, BUFFER_ALLOCSZ) <= BUFFER_MAX_LEN)
+               return (1);
+       return (0);
+}
+
+
+/* Returns the number of bytes of data in the buffer. */
+u_int
+Buf::get_len(void)
+{
+       return end - offset;
+}
+
+
+/* Gets data from the beginning of the buffer. */
+int
+Buf::get_data(void *dst, u_int len)
+{
+       if (len > end - offset) {
+               error("%s: trying to get more bytes %d than in buffer %d",
+                   __func__, len, end - offset);
+               return (-1);
+       }
+  
+  /* If dst is NULL then don't copy anything */
+  if (dst)
+       memcpy(dst, buf + offset, len);
+
+       offset += len;
+       return (0);
+}
+
+
+int
+Buf::compact(void)
+{
+       /*
+        * If the buffer is quite empty, but all data is at the end, move the
+        * data to the beginning.
+        */
+       if (offset > MIN(alloc, BUFFER_MAX_CHUNK)) {
+               memmove(buf, buf + offset, end - offset);
+               end -= offset;
+               offset = 0;
+               return (1);
+       }
+       return (0);
+}
+
+
+/* Returns a pointer to the first used byte in the buffer. */
+void *
+Buf::get_dataptr(void)
+{
+       return buf + offset;
+}
+
+
+/* Dumps the contents of the buffer to stderr. */
+void
+Buf::data_dump(void)
+{
+       u_int i;
+       u_char *ucp = buf;
+
+       for (i = offset; i < end; i++) {
+               fprintf(stderr, "%02x", ucp[i]);
+               if ((i-offset)%16==15)
+                       fprintf(stderr, "\r\n");
+               else if ((i-offset)%2==1)
+                       fprintf(stderr, " ");
+       }
+       fprintf(stderr, "\r\n");
+}
+
+
+
+/* Consumes the given number of bytes from the beginning of the buffer. */
+
+#if 0
+int
+buffer_consume_ret(Buffer *buffer, u_int bytes)
+{
+       if (bytes > buffer->end - buffer->offset) {
+               error("buffer_consume_ret: trying to get more bytes than in buffer");
+               return (-1);
+       }
+       buffer->offset += bytes;
+       return (0);
+}
+
+void
+buffer_consume(Buffer *buffer, u_int bytes)
+{
+       if (buffer_consume_ret(buffer, bytes) == -1)
+               fatal("buffer_consume: buffer error");
+}
+
+/* Consumes the given number of bytes from the end of the buffer. */
+
+int
+buffer_consume_end_ret(Buffer *buffer, u_int bytes)
+{
+       if (bytes > buffer->end - buffer->offset)
+               return (-1);
+       buffer->end -= bytes;
+       return (0);
+}
+
+void
+buffer_consume_end(Buffer *buffer, u_int bytes)
+{
+       if (buffer_consume_end_ret(buffer, bytes) == -1)
+               fatal("buffer_consume_end: trying to get more bytes than in buffer");
+}
+
+#endif
+
diff --git a/Buf.h b/Buf.h
new file mode 100644 (file)
index 0000000..c22d0bc
--- /dev/null
+++ b/Buf.h
@@ -0,0 +1,161 @@
+
+/***************************************************************************
+ * Buf.h -- The Buf class is reponsible for I/O buffer manipulation        *
+ * and is based on the buffer code used in OpenSSH.                        *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+
+#ifndef BUF_H
+#define BUF_H
+
+#include "utils.h"
+
+#define        BUFFER_MAX_CHUNK        0x100000
+#define        BUFFER_MAX_LEN          0xa00000
+#define        BUFFER_ALLOCSZ          0x008000
+#define DEFAULT_BUF_SIZE  4096
+
+class Buf {
+
+  public:
+
+    Buf();
+    ~Buf();
+
+    /* Appends data to the buffer, expanding it if necessary. */
+    void append(const void *data, u_int len);
+
+    /*
+     * Appends space to the buffer, expanding the buffer if necessary. This does
+     * not actually copy the data into the buffer, but instead returns a pointer
+     * to the allocated region.
+     */
+    void *append_space(u_int len);
+
+    /* 
+     * Similar to way snprintf works, but data get saved inside the buffer.
+     * Warning: data won't get null terminated
+     * the len argument is the real length of the _actual_ data
+     */
+    void snprintf(u_int len, const void *fmt, ...);
+
+    /*
+     * Check whether an allocation of 'len' will fit in the buffer
+     * This must follow the same math as buffer_append_space
+     */
+    int        check_alloc(u_int len);
+
+    /* Returns the number of bytes of data in the buffer. */
+    u_int get_len(void);
+
+    /* Gets data from the beginning of the buffer. */
+    int get_data(void *dst, u_int len);
+
+    /* Returns a pointer to the first used byte in the buffer. */
+    void *get_dataptr(void);
+
+    /*
+     * Clears any data from the buffer, making it empty.  This does not actually
+     * zero the memory.
+     */
+    void clear(void);
+
+    /* Dumps the contents of the buffer to stderr. */
+    void data_dump(void);
+
+  private:
+
+    int compact(void);
+
+    u_char *buf;    /* Buffer for data */
+    u_int       alloc;         /* Number of bytes allocated for data. */
+    u_int       offset;        /* Offset of first byte containing data. */
+    u_int       end;           /* Offset of last byte containing data. */
+};
+
+
+#endif
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644 (file)
index 0000000..d472b9e
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,181 @@
+                 
+               ~00000                                       
+              00000000                                      
+             ,000$ 0$+~                                     
+             $=0=  .0+0                                     
+             000    000                                     
+            :000    0~0                                     
+            0000.    0                                      
+            00000     .                                     
+           .000000                                          
+           0?= +.,.                                         
+          ,?00.$000                                         
+          00000~.:~0                                        
+          .$+00~?~000                                       
+          :00000.=0000                                      
+          ?00?00+=:  ,0,                                    
+     00000..0000~ 000000.   $0                              
+    00..0~0?0::00,?0::?$0.  00 ~                            
+   .0.   ,0?00000.0$,+,000.00 $00                           
+   0.   00.?00=00000~0+0:0000?0,~0?.                        
+  .0  +00   0+0000 0000=?~0000?00 00                        
+ .: .~~   .000=00000~00=000000+0.0~0$$.                     
+ 00 ,    ?00.. 000~000000000000.:0.0:0~   0$00.+            
+00.0    00   00?~000~000000000+00   + ~0000000000=$0000     
+   $   00   00.   .00,000000000000$.00000.    .0000+$+~00   
+  0   00  .0       000000000?~0000000.   0.   .0$000000+$0  
+ 0    0   0     000:$~0000=0.0000,$.       00   0000000000  
+     0   00    ?.0000      $0 0 .                     .0000 
+   .     $    ?000.                                     0 0 
+        0     +~?000                                        
+       0.    :000000?0     |=------=[ Ncrack ]=------=| 
+             0000$?+00                                      
+             00+0:~0$0+                                     
+             .0$000?00                                      
+               0?000000                                     
+                  .000~0  
+
+
+                  -- [ Ncrack Changelog ] --
+
+
+Ncrack 0.4ALPHA [2011-04-23]
+
+o Added the VNC module to Ncrack's arsenal. Thanks to rhh of rycon.hu for
+  implementing the module and discussing about it for further improvement.
+
+o Wrote the Ncrack Developer's Guide, which is meant to give an overall
+  insight into Ncrack's architecture and help programmers develop their own
+  modules (http://nmap.org/ncrack/devguide.html)
+
+o Fixed critical bug in RDP module, which caused Ncrack to fail cracking
+  some Windows 2003 server versions.
+
+o Added a mechanism (MODULE_ERR), which modules can use to report to the
+  Ncrack engine that the authentication wasn't completed due to an
+  application error. For instance, the VNC server often notifies the client
+  that there are "too many authentication failures" and Ncrack can then
+  close the running connections and wait some time until the above wears
+  off.  
+
+o Ncrack can now print the nsock EID (unique connection ID) in debugging
+  messages. This will greatly help us track problems, since error messages
+  will be matched to certain connections.
+
+
+Ncrack 0.3ALPHA [2010-09-07]
+
+o Ncrack can now crack the Remote Desktop Protocol on all Windows versions from
+  XP and above, with the introduction of the RDP module. Users are well advised
+  to read http://seclists.org/nmap-dev/2010/q3/450 for cracking Windows XP
+  machines since they can't handle many concurrent RDP connections.
+
+o Implemented the SMB module which can crack Microsoft's SMB/CIFS services as
+  well as UNIX Samba servers.
+
+o Introduced the '-f' option, which forces Ncrack to quit cracking a 
+  service after it finds one credential for it. Specifying the option twice
+  like '-f -f' will cause Ncrack to completely quit after any credential is
+  found on any service.
+
+o Added support for blank-password testing. Ncrack will now test a blank 
+  entry whenever it sees an empty line in any of the wordlists. The same
+  behaviour applies for passing the options --user '' or --pass ''.
+
+o Improved the Ncrack scorpion logo with an updated SVG version (see
+  the top of http://nmap.org/ncrack/)
+
+
+Ncrack 0.2ALPHA [2010-06-12]
+
+o Ncrack now interactively prints out discovered credentials whenever
+  the user presses the 'p' key.  Also, in verbose mode (-v), Ncrack
+  now prints new credentials whenever they are discovered.  Basic
+  statistics (cracking rate, number of credentials found, but not the
+  credentials themselves) can be obtained by pressing enter or another
+  key at any time.
+
+o Added the --resume option, which allows users to cancel (usually by
+  pressing Ctrl+C) and later restore a cracking session through a file
+  with the saved state. The Ncrack restoration file is saved at
+  .ncrack/ under the home user's directory for *nix systems and inside
+  the user's profile directory (normally under C:\Documents and
+  Settings\<user>\.ncrack\) in Windows. The file name format is
+  restore.<date>_<time> e.g: restore.2009-11-1_10-10 . The time isn't
+  in XX:XX format because Windows doesn't allow colons in filenames.
+
+o Implemented the -iN option which lets Ncrack review Nmap normal
+  (-oN) output to find targets.
+
+o Implemented -iX option, which allows Ncrack to obtain targets by
+  reading an Nmap XML (-oX) output format file.
+
+o Ncrack's help screen (ncrack -h) now includes practical real-life
+  examples as well as a list of protocol cracking modules supported.
+  You can also list the supported modules with -V.
+
+o Added experimental pop3(s) support - patch initially made by Bucsay Balazs
+  and then modified by Ithilgore.
+
+o Ncrack now shares the Nsock library with Nmap rather than having its
+  own fork.  This makes maintenance much easier.  This was
+  accomplished by adding a way to compile Nsock without Libpcap (which
+  Ncrack doesn't use).
+
+o Fixed a timeout-related error which was due to the way Nsock caches
+  its time values to avoid too many gettimeofday() system calls,
+  leading to Ncrack thinking that negative time had elapsed in some
+  cases.  See the report at http://seclists.org/nmap-dev/2010/q2/450.
+o Fixed bug which caused an endless loop before Ncrack could exit
+  properly (reported at http://seclists.org/nmap-dev/2010/q2/746).
+
+o Fixed several memory leaks with the help of Valgrind. Also conducted a
+  Valgrind test for all modules. A report on a big memory leak was made here:
+  http://seclists.org/nmap-dev/2010/q1/1140
+
+o Fixed a problem which lead to the configure script being executed
+  twice for each of Ncrack's dependency libraries.  Compilation is
+  much faster now.
+
+o Added cleanup function for modules. This is made possible by a
+  function pointer (ops_free) in the Connection class, that
+  deallocates all internal struct members of misc_info . Since these
+  are module-specific data, each module should initialize this
+  function upon first invocation.
+
+o Added a snprintf function to Buf class. This is really handy for
+  module writers since it allows multiple I/O operations in
+  one line.
+
+o Changed the module API Connection class to split the old iobuf
+  system into two separate iobufs (one for inbound and one for
+  outbound data).
+
+o We now use the same default password list as Nmap, which is based on
+  data from many compromised/leaked systems.  We also have included
+  several individual files which can be used instead, such as Solar
+  Designer's password file from his cracking application John.
+
+o Added the --user and --pass options for command-line user and
+  password list specification.
+
+o Reported to Microsoft an issue on Windows (running on Windows rather
+  than against it) which was slowing the scans down
+  (http://seclists.org/nmap-dev/2009/q2/774). Microsoft wasn't able to
+  reproduce the problem
+  (https://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=479640),
+  but it seems that changes made by ESET Nod32 AV on Ithilgore's
+  machine may have been the problem.  It works for him if he disables
+  Nod32, so users might consider trying that if they experience poor
+  performance.
+
+o Fixed a compilation failure which occurred at linking when OpenSSL
+  was not available on the system.
+
+o Added this CHANGELOG file to the distribution.
+
+Ncrack 0.01ALPHA [2009-08-10]
+
+o First public release of Ncrack.
+
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..55ca0a1
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,436 @@
+
+/***************************************************************************
+ * COPYING -- Describes the terms under which Nmap is distributed.  A copy *
+ * of the GNU GPL is appended to this file.                                *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+GNU General Public License
+
+----------------------------------------------------------------------------
+
+Table of Contents
+
+   * GNU GENERAL PUBLIC LICENSE
+        o Preamble
+        o TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+        o How to Apply These Terms to Your New Programs
+
+----------------------------------------------------------------------------
+
+GNU GENERAL PUBLIC LICENSE
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place - Suite 330, Boston, MA  02111-1307, 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.
+
+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
+
+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 an 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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.
diff --git a/COPYING.OpenSSH b/COPYING.OpenSSH
new file mode 100644 (file)
index 0000000..3964b1d
--- /dev/null
@@ -0,0 +1,338 @@
+This file is part of the OpenSSH software.
+
+The licences which components of this software fall under are as
+follows.  First, we will summarize and say that all components
+are under a BSD licence, or a licence more free than that.
+
+OpenSSH contains no GPL code.
+
+1)
+     * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+     *                    All rights reserved
+     *
+     * As far as I am concerned, the code I have written for this software
+     * can be used freely for any purpose.  Any derived versions of this
+     * software must be clearly marked as such, and if the derived work is
+     * incompatible with the protocol description in the RFC file, it must be
+     * called by a name other than "ssh" or "Secure Shell".
+
+    [Tatu continues]
+     *  However, I am not implying to give any licenses to any patents or
+     * copyrights held by third parties, and the software includes parts that
+     * are not under my direct control.  As far as I know, all included
+     * source code is used in accordance with the relevant license agreements
+     * and can be used freely for any purpose (the GNU license being the most
+     * restrictive); see below for details.
+
+    [However, none of that term is relevant at this point in time.  All of
+    these restrictively licenced software components which he talks about
+    have been removed from OpenSSH, i.e.,
+
+     - RSA is no longer included, found in the OpenSSL library
+     - IDEA is no longer included, its use is deprecated
+     - DES is now external, in the OpenSSL library
+     - GMP is no longer used, and instead we call BN code from OpenSSL
+     - Zlib is now external, in a library
+     - The make-ssh-known-hosts script is no longer included
+     - TSS has been removed
+     - MD5 is now external, in the OpenSSL library
+     - RC4 support has been replaced with ARC4 support from OpenSSL
+     - Blowfish is now external, in the OpenSSL library
+
+    [The licence continues]
+
+    Note that any information and cryptographic algorithms used in this
+    software are publicly available on the Internet and at any major
+    bookstore, scientific library, and patent office worldwide.  More
+    information can be found e.g. at "http://www.cs.hut.fi/crypto".
+
+    The legal status of this program is some combination of all these
+    permissions and restrictions.  Use only at your own responsibility.
+    You will be responsible for any legal consequences yourself; I am not
+    making any claims whether possessing or using this is legal or not in
+    your country, and I am not taking any responsibility on your behalf.
+
+
+                           NO WARRANTY
+
+    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.
+
+    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.
+
+2)
+    The 32-bit CRC compensation attack detector in deattack.c was
+    contributed by CORE SDI S.A. under a BSD-style license.
+
+     * Cryptographic attack detector for ssh - source code
+     *
+     * Copyright (c) 1998 CORE SDI S.A., Buenos Aires, Argentina.
+     *
+     * All rights reserved. Redistribution and use in source and binary
+     * forms, with or without modification, are permitted provided that
+     * this copyright notice is retained.
+     *
+     * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+     * WARRANTIES ARE DISCLAIMED. IN NO EVENT SHALL CORE SDI S.A. BE
+     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR
+     * CONSEQUENTIAL DAMAGES RESULTING FROM THE USE OR MISUSE OF THIS
+     * SOFTWARE.
+     *
+     * Ariel Futoransky <futo@core-sdi.com>
+     * <http://www.core-sdi.com>
+
+3)
+    ssh-keyscan was contributed by David Mazieres under a BSD-style
+    license.
+
+     * Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>.
+     *
+     * Modification and redistribution in source and binary forms is
+     * permitted provided that due credit is given to the author and the
+     * OpenBSD project by leaving this copyright notice intact.
+
+4)
+    The Rijndael implementation by Vincent Rijmen, Antoon Bosselaers
+    and Paulo Barreto is in the public domain and distributed
+    with the following license:
+
+     * @version 3.0 (December 2000)
+     *
+     * Optimised ANSI C code for the Rijndael cipher (now AES)
+     *
+     * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+     * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+     * @author Paulo Barreto <paulo.barreto@terra.com.br>
+     *
+     * This code is hereby placed in the public domain.
+     *
+     * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS 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.
+
+5)
+    One component of the ssh source code is under a 3-clause BSD license,
+    held by the University of California, since we pulled these parts from
+    original Berkeley code.
+
+     * Copyright (c) 1983, 1990, 1992, 1993, 1995
+     *      The Regents of the University of California.  All rights reserved.
+     *
+     * 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. 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.
+
+6)
+    Remaining components of the software are provided under a standard
+    2-term BSD licence with the following names as copyright holders:
+
+       Markus Friedl
+       Theo de Raadt
+       Niels Provos
+       Dug Song
+       Aaron Campbell
+       Damien Miller
+       Kevin Steves
+       Daniel Kouril
+       Wesley Griffin
+       Per Allansson
+       Nils Nordman
+       Simon Wilkinson
+
+    Portable OpenSSH additionally includes code from the following copyright
+    holders, also under the 2-term BSD license:
+
+       Ben Lindstrom
+       Tim Rice
+       Andre Lucas
+       Chris Adams
+       Corinna Vinschen
+       Cray Inc.
+       Denis Parker
+       Gert Doering
+       Jakob Schlyter
+       Jason Downs
+       Juha Yrjölä
+       Michael Stone
+       Networks Associates Technology, Inc.
+       Solar Designer
+       Todd C. Miller
+       Wayne Schroeder
+       William Jones
+       Darren Tucker
+       Sun Microsystems
+       The SCO Group
+       Daniel Walsh
+
+     * 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.
+     *
+     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+8) Portable OpenSSH contains the following additional licenses:
+
+    a) md5crypt.c, md5crypt.h
+
+        * "THE BEER-WARE LICENSE" (Revision 42):
+        * <phk@login.dknet.dk> wrote this file.  As long as you retain this
+        * notice you can do whatever you want with this stuff. If we meet
+        * some day, and you think this stuff is worth it, you can buy me a
+        * beer in return.   Poul-Henning Kamp
+
+    b) snprintf replacement
+
+       * Copyright Patrick Powell 1995
+       * This code is based on code written by Patrick Powell
+       * (papowell@astart.com) It may be used for any purpose as long as this
+       * notice remains intact on all source code distributions
+
+    c) Compatibility code (openbsd-compat)
+
+       Apart from the previously mentioned licenses, various pieces of code
+       in the openbsd-compat/ subdirectory are licensed as follows:
+
+       Some code is licensed under a 3-term BSD license, to the following
+       copyright holders:
+
+       Todd C. Miller
+       Theo de Raadt
+       Damien Miller
+       Eric P. Allman
+       The Regents of the University of California
+       Constantin S. Svintsoff
+
+       * 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. 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.
+
+       Some code is licensed under an ISC-style license, to the following
+       copyright holders:
+
+       Internet Software Consortium.
+       Todd C. Miller
+       Reyk Floeter
+       Chad Mynhier
+
+       * Permission to use, copy, modify, and distribute this software for any
+       * purpose with or without fee is hereby granted, provided that the above
+       * copyright notice and this permission notice appear in all copies.
+       *
+       * THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL
+       * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+       * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE
+       * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+       * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+       * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+       * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       Some code is licensed under a MIT-style license to the following
+       copyright holders:
+
+       Free Software Foundation, Inc.
+
+       * Permission is hereby granted, free of charge, to any person obtaining a  *
+       * copy of this software and associated documentation files (the            *
+       * "Software"), to deal in the Software without restriction, including      *
+       * without limitation the rights to use, copy, modify, merge, publish,      *
+       * distribute, distribute with modifications, sublicense, and/or sell       *
+       * copies of the Software, and to permit persons to whom the Software is    *
+       * furnished to do so, subject to the following conditions:                 *
+       *                                                                          *
+       * The above copyright notice and this permission notice shall be included  *
+       * in all copies or substantial portions of the Software.                   *
+       *                                                                          *
+       * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+       * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+       * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+       * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+       * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+       * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+       * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+       *                                                                          *
+       * Except as contained in this notice, the name(s) of the above copyright   *
+       * holders shall not be used in advertising or otherwise to promote the     *
+       * sale, use or other dealings in this Software without prior written       *
+       * authorization.                                                           *
+       ****************************************************************************/
+
+
+------
+$OpenBSD: LICENCE,v 1.19 2004/08/30 09:18:08 markus Exp $
diff --git a/COPYING.OpenSSL b/COPYING.OpenSSL
new file mode 100644 (file)
index 0000000..4027788
--- /dev/null
@@ -0,0 +1,127 @@
+
+  LICENSE ISSUES
+  ==============
+
+  The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
+  the OpenSSL License and the original SSLeay license apply to the toolkit.
+  See below for the actual license texts. Actually both licenses are BSD-style
+  Open Source licenses. In case of any license issues related to OpenSSL
+  please contact openssl-core@openssl.org.
+
+  OpenSSL License
+  ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2004 The OpenSSL Project.  All rights reserved.
+ *
+ * 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 acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 OpenSSL PROJECT OR
+ * ITS 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.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * 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 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 cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
diff --git a/Connection.cc b/Connection.cc
new file mode 100644 (file)
index 0000000..bd4770c
--- /dev/null
@@ -0,0 +1,149 @@
+
+/***************************************************************************
+ * Connection.cc -- The "Connection" class holds information specifically  *
+ * pertaining to connection probes. Objects of this class must always      *
+ * belong to a certain "Service" object.                                   *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+
+#include "Service.h"
+
+#if HAVE_OPENSSL
+  #include <openssl/ssl.h>
+#endif
+/* A connection must *always* belong to one specific Service */
+Connection::
+Connection(Service *serv)
+{
+  state = 0;
+  service = serv;
+  peer_might_close = false;
+  finished_normally = false;
+  check_closed = false;
+  peer_alive = false;
+  auth_complete = false;
+  from_pool = false;
+  closed = false;
+  auth_success = false;
+  force_close = false;
+  login_attempts = 0;
+  misc_info = NULL;
+  close_reason = -1;
+  inbuf = NULL;
+  outbuf = NULL;
+  login_attempts = 0;
+  ssl_session = NULL;
+  ops_free = NULL;
+}
+
+Connection::
+~Connection()
+{
+  if (inbuf)
+    delete inbuf;
+  if (outbuf)
+    delete outbuf;
+
+  /* This has to be called BEFORE freeing misc_info */
+  if (*ops_free)
+    ops_free(this);
+
+  if (misc_info) {
+    free(misc_info);
+    misc_info = NULL;
+  }
+
+#if HAVE_OPENSSL
+  if (ssl_session)
+    SSL_SESSION_free((SSL_SESSION*)ssl_session);
+  ssl_session = NULL;
+#endif
+}
+
+
diff --git a/Connection.h b/Connection.h
new file mode 100644 (file)
index 0000000..7146240
--- /dev/null
@@ -0,0 +1,171 @@
+
+/***************************************************************************
+ * Connection.h -- The "Connection" class holds information specifically   *
+ * pertaining to connection probes. Objects of this class must always      *
+ * belong to a certain "Service" object.                                   *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+
+class Service;
+
+/* 
+ * Active connection taking place for authenticating service.
+ * Each connection may try to authenticatate more than once before closing,
+ * depending on the service. For UDP 1 connection = 1 authentication session.
+ */
+class Connection
+{
+       public:
+               Connection(Service *serv);
+               ~Connection();
+
+               int time_started;
+               int time_elapsed;
+
+    char *user;
+    char *pass;
+
+    /* 
+     * True when we peer might close connection at the near moment. 
+     * Consider the case, when some services after reaching the maximum
+     * authentication limit per connecton, just drop the connection without
+     * specifically telling you that you failed at the last authentication
+     * attempt. Thus, we use this, to be able to count the correct number of
+     * maximum attempts the peer lets us do (stored in 'supported_attempts'
+     * inside the Service class). A module should probably set it to true
+     * after writing the password on the wire and before issuing the next
+     * read call. Also if you use it, don't forget to set it to false, in the
+     * first state of your module, because we might need it to differentiate
+     * between normal server FINs and FINs/RSTs sent in the middle of an
+     * authentication due to strange network conditions.
+     */
+    bool peer_might_close; 
+
+    /* True if we have received a server reply, that indicated that it didn't
+     * close the connection prematurely. This may used in cases, when the
+     * server may close the connection after the maximum allowed auth attempts
+     * are reached, but will also print a relative message saying we failed.
+     */
+    bool finished_normally; /* XXX not currently used anywhere */
+
+    bool check_closed;  /* true -> check if peer closed connection on us */
+    bool peer_alive;    /* true -> if peer is certain to be alive currently */
+    bool auth_complete; /* true -> login pair tested */
+    bool from_pool;     /* true -> login pair was extracted from pair_pool */
+    bool closed;        /* true -> connection was closed */
+    bool auth_success;  /* true -> we found a valid pair!!! */
+    bool force_close;   /* true -> forcefully close the connection */
+
+    void *misc_info;    /* additional state information that might be needed */
+
+    /* function pointer to module-specific free operation that deallocates
+     * all internal struct members of misc_info 
+     */
+    void (* ops_free)(Connection *);
+
+    int close_reason;
+
+               int state;          /* module state-machine's current state */
+
+    Buf *inbuf;         /* buffer for inbound data */
+    Buf *outbuf;        /* buffer for outbound data */
+
+               unsigned long login_attempts; /* login attempts up until now */
+               nsock_iod niod;     /* I/O descriptor for this connection */
+
+    /* This stores our SSL session id, which will help speed up subsequent
+     * SSL connections. It's overwritten each time. void* is used so we don't
+     * need to #ifdef HAVE_OPENSSL all over. We'll cast later as needed.
+     */
+     void *ssl_session;    
+
+               Service *service;   /* service it belongs to */
+};
+
+enum close_reasons { READ_EOF, READ_TIMEOUT, CON_ERR, CON_TIMEOUT, MODULE_ERR };
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..1f7ef4a
--- /dev/null
@@ -0,0 +1,133 @@
+# Extract the version string from ncrack.h.
+export NCRACK_VERSION := $(shell grep '^\#[ \t]*define[ \t]\+NCRACK_VERSION' \
+       ncrack.h | sed -e 's/.*"\(.*\)".*/\1/' -e 'q')
+NCRACK_NAME= Ncrack
+NCRACK_URL= http://ncrack.org
+NCRACK_PLATFORM=@host@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+sbindir = @sbindir@
+mandir = @mandir@
+srcdir = @srcdir@
+ncrackdatadir = @datadir@/ncrack
+
+export NBASEDIR = @NBASEDIR@
+export NSOCKDIR = @NSOCKDIR@
+export OPENSSHLIB_DIR = @OPENSSHLIB_DIR@
+
+DEFS = @DEFS@ -DNCRACK_NAME=\"$(NCRACK_NAME)\" -DNCRACK_URL=\"$(NCRACK_URL)\" \
+-DNCRACK_PLATFORM=\"$(NCRACK_PLATFORM)\" -DNCRACKDATADIR=\"$(ncrackdatadir)\"
+DEFS += -D_FORTIFY_SOURCE=2 
+
+CC = @CC@
+CXX = @CXX@
+CCOPT = 
+DBGFLAGS = 
+STRIP = @STRIP@
+CXXFLAGS = @CXXFLAGS@ $(DBGFLAGS)
+CPPFLAGS = @CPPFLAGS@ $(DEFS)
+export CFLAGS = $(CXXFLAGS)
+STATIC =
+LDFLAGS = @LDFLAGS@ $(DBGFLAGS) $(STATIC)
+INSTALL = @INSTALL@
+
+MOD_OBJS = @MODULES_OBJS@
+MOD_OBJS := $(addprefix modules/,$(MOD_OBJS))
+MOD_SRCS = @MODULES_SRCS@
+MOD_SRCS := $(addprefix modules/,$(MOD_SRCS))
+
+LIBS = @LIBNSOCK_LIBS@ @LIBNBASE_LIBS@ @OPENSSL_LIBS@ @OPENSSH_LIB@ 
+
+DESTDIR =
+
+TARGET = ncrack
+
+export SRCS = ncrack.cc utils.cc TargetGroup.cc Target.cc targets.cc \
+NcrackOps.cc Service.cc ServiceGroup.cc Connection.h services.cc \
+timing.cc ncrack_error.cc output.cc ncrack_tty.cc Buf.cc \
+NcrackOutputTable.cc ncrack_input.cc ncrack_resume.cc crypto.cc
+
+OBJS = ncrack.o utils.o TargetGroup.o Target.o targets.o NcrackOps.o \
+Service.o ServiceGroup.o Connection.o services.o timing.o \
+ncrack_error.o output.o ncrack_tty.o Buf.o NcrackOutputTable.o \
+ncrack_input.o ncrack_resume.o crypto.o
+
+.cc.o :
+       $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
+
+all: @NBASE_BUILD@ @NSOCK_BUILD@ @OPENSSHLIB_BUILD@ @MODULES_BUILD@
+       $(MAKE) $(TARGET)
+
+$(TARGET): $(NSOCKDIR)/src/libnsock.a $(NBASEDIR)/libnbase.a $(OBJS) $(MOD_OBJS)
+       @echo Compiling Ncrack... 
+       rm -f $@
+       $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(MOD_OBJS) $(LIBS)
+       @echo Ncrack compiled successfully!
+
+
+modules_build:
+       @echo Compiling modules
+       cd modules && $(MAKE)
+
+nbase_build: $(NBASEDIR)/Makefile
+       @echo Compiling libnbase;
+       cd $(NBASEDIR) && $(MAKE)
+
+nsock_build: $(NSOCKDIR)/src/Makefile nbase_build
+       @echo Compiling libnsock;
+       cd $(NSOCKDIR)/src && $(MAKE)
+
+opensshlib_build: $(OPENSSHLIB_DIR)/Makefile
+       @echo Compiling openssh lib;
+       cd $(OPENSSHLIB_DIR) && $(MAKE)
+
+
+
+install: install-ncrack
+       @echo "NCRACK SUCCESSFULLY INSTALLED"
+
+install-ncrack: $(TARGET)
+       $(INSTALL) -d $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(ncrackdatadir)
+       $(INSTALL) -c -m 755 ncrack $(DESTDIR)$(bindir)/ncrack
+       $(STRIP) $(DESTDIR)$(bindir)/ncrack
+       $(INSTALL) -c -m 644 docs/$(TARGET).1 $(DESTDIR)$(mandir)/man1/
+#      $(INSTALL) -c -m 644 docs/ncrack.xsl $(DESTDIR)$(ncrackdatadir)/
+#      $(INSTALL) -c -m 644 docs/ncrack.dtd $(DESTDIR)$(ncrackatadir)/
+       $(INSTALL) -c -m 644 ncrack-services $(DESTDIR)$(ncrackdatadir)/
+       $(INSTALL) -c -m 644 lists/* $(DESTDIR)$(ncrackdatadir)/
+
+
+uninstall: uninstall-ncrack
+
+uninstall-ncrack:
+       rm -f $(DESTDIR)$(bindir)/$(TARGET)
+       rm -f $(DESTDIR)$(mandir)/man1/$(TARGET).1
+       rm -rf $(DESTDIR)$(ncrackdatadir)
+
+
+# cleaning stuff
+
+clean: nsock_clean nbase_clean opensshlib_clean modules_clean my_clean 
+
+my_clean:
+       rm -f dependencies.mk makefile.dep
+       rm -f $(OBJS) $(TARGET) config.cache
+nbase_clean:
+       -cd $(NBASEDIR) && $(MAKE) clean
+nsock_clean:
+       -cd $(NSOCKDIR)/src && $(MAKE) clean
+opensshlib_clean:
+       -cd $(OPENSSHLIB_DIR) && $(MAKE) clean
+modules_clean:
+       -cd modules && $(MAKE) clean
+
+Makefile: Makefile.in config.status
+       ./config.status
+
+config.status: configure
+       ./config.status --recheck
+
+makefile.dep:
+       $(CXX) -MM $(CPPFLAGS) $(SRCS) > $@
+include makefile.dep
diff --git a/NcrackOps.cc b/NcrackOps.cc
new file mode 100644 (file)
index 0000000..ff6dcb5
--- /dev/null
@@ -0,0 +1,147 @@
+
+/***************************************************************************
+ * NcrackOps.cc -- The NcrackOps class contains global options, mostly     *
+ * based on user-provided command-line settings.                           *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "ncrack.h"
+#include "NcrackOps.h"
+#include "utils.h"
+
+NcrackOps o;
+
+NcrackOps::
+NcrackOps() {
+
+  datadir = NULL;
+  stats_interval = 0.0; /* unset */
+  log_errors = false;
+  append_output = false;
+  passwords_first = false;
+  global_options = false;
+  list_only = false;
+  userlist_src = 0;
+  passlist_src = 0;
+  nmap_input_normal = false;
+  nmap_input_xml = false;
+  debugging = 0;
+  verbose = 0;
+  nsock_trace = 0;
+  timing_level = 3;
+  connection_limit = -1;
+  numhosts_scanned = 0;
+  host_timeout = 0;
+  memset(logfd, 0, sizeof(FILE *) * LOG_NUM_FILES);
+  ncrack_stdout = stdout;
+  saved_signal = -1;
+  saved_argc = 0;
+  saved_argv = NULL;
+  setaf(AF_INET);
+  gettimeofday(&start_time, NULL);
+  resume = false;
+  finish = 0;
+}
+
+NcrackOps::
+~NcrackOps() {
+
+  if (datadir)
+    free(datadir);
+}
+
+
+/* Number of milliseconds since getStartTime().  The current time is an
+ * optional argument to avoid an extra gettimeofday() call. */
+long long NcrackOps::
+TimeSinceStartMS(struct timeval *now) {
+  struct timeval tv;
+  if (!now)
+    gettimeofday(&tv, NULL);
+  else tv = *now;
+
+  return timeval_msec_subtract(tv, start_time);
+}
diff --git a/NcrackOps.h b/NcrackOps.h
new file mode 100644 (file)
index 0000000..a75a1db
--- /dev/null
@@ -0,0 +1,174 @@
+
+/***************************************************************************
+ * NcrackOps.h -- The NcrackOps class contains global options, mostly      *
+ * based on user-provided command-line settings.                           *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef NCRACK_OPS_H
+#define NCRACK_OPS_H 1
+
+#include "ncrack.h"
+#include "output.h"
+#include <map>
+using namespace std;
+
+/* Each service has an associated saved_info struct that holds everything
+ * needed to continue the session.
+ */
+struct saved_info {
+  uint32_t user_index;
+  uint32_t pass_index;
+  vector <loginpair> credentials_found;
+};
+
+class NcrackOps {
+  public:
+    NcrackOps();
+    ~NcrackOps();
+
+    void setaf(int af) { addressfamily = af; }
+    int af() { return addressfamily; }
+
+    /* The time this obj. was instantiated */
+    const struct timeval *getStartTime() { return &start_time; }
+
+    /* Number of milliseconds since getStartTime().  The current time is an
+     * optional argument to avoid an extra gettimeofday() call. */
+    long long TimeSinceStartMS(struct timeval *now=NULL); 
+    
+    /* The requested auto stats printing interval, or 0.0 if unset. */
+    float stats_interval; 
+    bool log_errors;      /* write errors to log files */
+    bool append_output;   /* append output to log files */
+
+    int userlist_src;/* 0 -> unassigned (default),
+                        1 -> username list from command line (--user option)
+                        2 -> username list from file (-U option)
+                      */
+    int passlist_src;/* 0 -> unassigned (default),
+                        1 -> password list from command line (--pass option)
+                        2 -> username list from file (-P option)
+                      */
+    bool nmap_input_normal; /* true if host input from Nmap's -oN output */
+    bool nmap_input_xml;    /* true if host input from Nmap's -oX output */
+    /* iterate password list for each username instead of opposite */
+    bool passwords_first; 
+    bool global_options;  /* true if -g has been specified */
+    bool list_only;       /* only list hosts and exit */
+    int nsock_trace;      /* nsock debugging level (range is 0-10) */
+    int timing_level;     /* timing template number: T(0-5) */
+    int debugging;        /* valid for range 0-10 */
+    int finish;           /* 0 -> disabled
+                           * 1 -> quit each service after one credential is found
+                           * 2 -> quit after any credential is found on any
+                           * service
+                           */
+    int verbose;
+    int numhosts_scanned;
+    long connection_limit;/* global maximum total connections */
+    unsigned long host_timeout;
+    FILE *logfd[LOG_NUM_FILES];
+    FILE *ncrack_stdout; /* Ncrack standard output */
+    char *datadir;
+
+    int saved_signal;    /* save caught signal here, -1 for no signal */
+    char **saved_argv;    /* pointer to current argv array */
+    int saved_argc;      /* saved argument count */
+    /* This associative container holds the unique id of each service and the
+     * corresponding saved_info struct which holds all the necessary
+     * data to continue the session from where it had been previously stopped.
+     */
+    bool resume;
+    map<uint32_t, struct saved_info> resume_map;
+
+  private:
+    struct timeval start_time;
+    int addressfamily; /* Address family:  AF_INET or AF_INET6 */  
+};
+
+#endif
diff --git a/NcrackOutputTable.cc b/NcrackOutputTable.cc
new file mode 100644 (file)
index 0000000..f349fe0
--- /dev/null
@@ -0,0 +1,288 @@
+
+/***************************************************************************
+ * NcrackOutputTable.cc -- A relatively simple class for organizing Ncrack *
+ * output into an orderly table for display to the user.                   *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+
+/* $Id: NcrackOutputTable.cc 12955 2009-04-15 00:37:03Z fyodor $ */
+
+#ifdef WIN32
+#include "Ncrack_winconfig.h"
+#endif
+
+#include "NcrackOutputTable.h"
+#include "utils.h"
+
+#include <stdlib.h>
+
+NcrackOutputTable::NcrackOutputTable(int nrows, int ncols) {
+  numRows = nrows;
+  numColumns = ncols;
+  assert(numRows > 0);
+  assert(numColumns > 0);
+  table = (struct NcrackOutputTableCell *) safe_zalloc(sizeof(struct NcrackOutputTableCell) * nrows * ncols);
+  maxColLen = (int *) safe_zalloc(sizeof(*maxColLen) * ncols);
+  itemsInRow = (int *) safe_zalloc(sizeof(*itemsInRow) * nrows);
+  tableout = NULL;
+  tableoutsz = 0;
+}
+
+NcrackOutputTable::~NcrackOutputTable() {
+  unsigned int col, row;
+  struct NcrackOutputTableCell *cell;
+
+  for(row = 0; row < numRows; row++) {
+    for(col = 0; col < numColumns; col++) {
+      cell = getCellAddy(row, col);
+      if (cell->weAllocated) {
+       assert(cell->str);
+       free(cell->str);
+      }
+    }
+  }
+
+  free(table);
+  free(maxColLen);
+  free(itemsInRow);
+  if (tableout) free(tableout);
+}
+
+void NcrackOutputTable::addItem(unsigned int row, unsigned int column, bool fullrow,
+                               bool copy, const char *item, int itemlen) {
+  struct NcrackOutputTableCell *cell;
+  int mc = maxColLen[column];
+  
+  addItem(row, column, copy, item, itemlen);
+
+  if(fullrow) {
+    maxColLen[column] = mc;
+    cell = getCellAddy(row, column);
+    cell->fullrow = fullrow;
+  }
+  return;
+}
+
+void NcrackOutputTable::addItem(unsigned int row, unsigned int column, bool copy, const char *item, 
+                             int itemlen) {
+  struct NcrackOutputTableCell *cell;
+
+  assert(row < numRows);
+  assert(column < numColumns);
+
+  if (itemlen < 0)
+    itemlen = strlen(item);
+
+  if (itemlen == 0)
+    return;
+
+  cell = getCellAddy(row, column);
+  assert(cell->str == NULL); // I'll worry about replacing members if I ever need it
+  itemsInRow[row]++;
+
+  cell->strlength = itemlen;
+
+  if (copy) {
+    cell->str = (char *) safe_malloc(itemlen + 1);
+    memcpy(cell->str, item, itemlen);
+    cell->str[itemlen] = '\0';
+  } else {
+    cell->str = (char *) item;
+  }
+  cell->weAllocated = copy;
+
+  if (maxColLen[column] < itemlen)
+    maxColLen[column] = itemlen;
+
+  return;
+}
+
+void NcrackOutputTable::addItemFormatted(unsigned int row, 
+                                         unsigned int column,
+                                         bool fullrow,
+                                         const char *fmt, ...) {
+  struct NcrackOutputTableCell *cell;
+  int mc = maxColLen[column];
+  unsigned int res;
+  va_list ap; 
+  va_start(ap,fmt);
+  char buf[4096];
+  res = Vsnprintf(buf, sizeof(buf), fmt, ap);
+  va_end(ap);
+
+  if (res > sizeof(buf))
+    fatal("NcrackOutputTable only supports adding up to 4096 to a cell via %s.", __func__);
+
+  addItem(row, column, fullrow, true, buf, res);
+
+  if(fullrow) {
+    maxColLen[column] = mc;
+    cell = getCellAddy(row, column);
+    cell->fullrow = fullrow;
+  }
+}
+
+/* True if every column in nrow is empty */
+bool NcrackOutputTable::emptyRow(unsigned int nrow) {
+       NcrackOutputTableCell *cell;
+       unsigned int col;
+       bool isEmpty = true;
+       
+       assert(nrow < numRows);
+
+       for(col = 0 ; col < numColumns; col++) {
+               cell = getCellAddy(nrow, col);
+               if(cell->strlength > 0) {
+                       isEmpty = false;
+                       break;
+               }
+       }
+       return isEmpty;         
+}
+
+ // This function sticks the entire table into a character buffer.
+ // Note that the buffer is likely to be reused if you call the
+ // function again, and it will also be invalidated if you free the
+ // table. If size is not NULL, it will be filled with the size of
+ // the ASCII table in bytes (not including the terminating NUL) 
+ // All blank rows are removed from the returned string
+char *NcrackOutputTable::printableTable(int *size) {
+  unsigned int col, row;
+  int p = 0; /* The offset into tableout */
+  int clen = 0;
+  int i;
+  struct NcrackOutputTableCell *cell;
+  int validthisrow;
+
+  if (tableoutsz == 0) {
+    tableoutsz = 512; /* Start us off with half a k */
+    tableout = (char *) safe_malloc(tableoutsz);
+  }
+
+  for(row = 0; row < numRows; row++) {
+    validthisrow = 0;
+
+    if(emptyRow(row)) 
+       continue;
+
+    cell = getCellAddy(row, 0);
+    if(cell->fullrow && cell->strlength > 0) {
+      /* Full rows are easy, just make sure we have the space + \n\0 */
+      if (cell->strlength + p + 2 > tableoutsz) {
+       tableoutsz = (cell->strlength + p + 2) * 2;
+       tableout = (char *) safe_realloc(tableout, tableoutsz);
+      }
+      memcpy(tableout + p, cell->str,  cell->strlength);
+      p += cell->strlength;
+    } else {
+      for(col = 0; col < numColumns; col++) {
+        cell = getCellAddy(row, col);
+        clen = maxColLen[col];
+       /* Cells get padded with an extra space + \n\0 */
+       if (clen + p + 3 > tableoutsz) {
+         tableoutsz = (cell->strlength + p + 2) * 2;
+         tableout = (char *) safe_realloc(tableout, tableoutsz);
+       }
+        if (cell->strlength > 0) {
+          memcpy(tableout + p, cell->str,  cell->strlength);
+          p += cell->strlength;
+          validthisrow++;
+        }
+        // No point leaving trailing spaces ...
+        if (validthisrow < itemsInRow[row]) {
+          for(i=cell->strlength; i <= clen; i++) // one extra because of space between columns
+            *(tableout + p++) = ' ';
+        }
+      }
+    }
+    *(tableout + p++) = '\n';
+  }
+  *(tableout + p) = '\0';
+
+  if (size) *size = p;
+  return tableout;
+}
diff --git a/NcrackOutputTable.h b/NcrackOutputTable.h
new file mode 100644 (file)
index 0000000..d1c998c
--- /dev/null
@@ -0,0 +1,168 @@
+
+/***************************************************************************
+ * NcrackOutputTable.h -- A relatively simple class for organizing Ncrack  *
+ * output into an orderly table for display to the user.                   *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+/* $Id: NcrackOutputTable.h 12955 2009-04-15 00:37:03Z fyodor $ */
+
+#ifndef NCRACKOUTPUTTABLE_H
+#define NCRACKOUTPUTTABLE_H
+
+#include "ncrack.h"
+
+#ifndef __attribute__
+#define __attribute__(args)
+#endif
+
+/**********************  DEFINES/ENUMS ***********************************/
+
+/**********************  STRUCTURES  ***********************************/
+
+/**********************  CLASSES     ***********************************/
+
+struct NcrackOutputTableCell {
+  char *str;
+  int strlength;
+  bool weAllocated; // If we allocated str, we must free it.
+  bool fullrow;
+};
+
+class NcrackOutputTable {
+ public:
+  // Create a table of the given dimensions. Any completely
+  // blank rows will be removed when printableTable() is called.
+  // If the number of table rows is unknown then the highest
+  // number of possible rows should be specified.
+  NcrackOutputTable(int nrows, int ncols);
+  ~NcrackOutputTable();
+
+  // Copy specifies whether we must make a copy of item.  Otherwise we'll just save the
+  // ptr (and you better not free it until this table is destroyed ).  Skip the itemlen parameter if you
+  // don't know (and the function will use strlen).
+  void addItem(unsigned int row, unsigned int column, bool copy, const char *item, int itemlen = -1);
+  // Same as above but if fullrow is true, 'item' spans across all columns. The spanning starts from
+  // the column argument (ie. 0 will be the first column)
+  void addItem(unsigned int row, unsigned int column, bool fullrow, bool copy, const char *item, int itemlen = -1);
+
+  // Like addItem except this version takes a printf-style format string followed by varargs
+  void addItemFormatted(unsigned int row, unsigned int column, bool fullrow, const char *fmt, ...)
+         __attribute__ ((format (printf, 4, 5)));
+
+  // This function sticks the entire table into a character buffer.
+  // Note that the buffer is likely to be reused if you call the
+  // function again, and it will also be invalidated if you free the
+  // table. If size is not NULL, it will be filled with the size of
+  // the ASCII table in bytes (not including the terminating NUL)
+  // All blank rows will be removed from the returned string
+  char *printableTable(int *size);
+
+ private:
+
+  bool emptyRow(unsigned int nrow);
+  // The table, squished into 1D.  Access a member via getCellAddy
+  struct NcrackOutputTableCell *table;
+  struct NcrackOutputTableCell *getCellAddy(unsigned int row, unsigned int col) {
+    assert(row < numRows);  assert(col < numColumns);
+    return table + row * numColumns + col;
+  }
+  int *maxColLen; // An array that gives the maximum length of any member of each column 
+                  // (excluding terminator)
+  // Array that tells the number of valid (> 0 length) items in each row
+  int *itemsInRow; 
+  unsigned int numRows;  
+  unsigned int numColumns;
+  char *tableout; // If printableTable() is called, we return this
+  int tableoutsz; // Amount of space ALLOCATED for tableout.  Includes space allocated for NUL.
+};
+
+
+/**********************  PROTOTYPES  ***********************************/
+
+
+#endif /* NcrackOUTPUTTABLE_H */
+
diff --git a/Service.cc b/Service.cc
new file mode 100644 (file)
index 0000000..7140674
--- /dev/null
@@ -0,0 +1,514 @@
+
+/***************************************************************************
+ * Service.cc -- The "Service" class encapsulates every bit of information *
+ * about the associated target's (Target class) service. Service-specific  *
+ * options, statistical and timing information as well as functions for    *
+ * handling username/password list iteration all belong to this class.     *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "Service.h"
+#include "NcrackOps.h"
+
+extern NcrackOps o;
+
+
+Service::
+Service()
+{
+  static unsigned long id = 0;
+  name = NULL;
+  target = NULL;
+  proto = IPPROTO_TCP;
+  portno = 0;
+
+  uid = id++;
+
+  loginlist_fini = false;
+  list_active = true;
+  list_full = false;
+  list_wait = false;
+  list_pairfini = false;
+  list_finishing = false;
+  list_finished = false;
+  just_started = true;
+  more_rounds = false;
+
+  end.orly = false;
+  end.reason = NULL;
+
+  failed_connections = 0;
+  total_attempts = 0;
+  finished_attempts = 0;
+  supported_attempts = 0;
+  active_connections = 0;
+
+  min_connection_limit = -1;
+  max_connection_limit = -1;
+  ideal_parallelism = 1;  /* we start with 1 connection exactly */
+  auth_tries = -1;
+  connection_delay = -1;
+  connection_retries = -1;
+  timeout = -1;
+  path = Strndup("/", 2); /* path is '/' by default */
+  ssl = false;
+
+  module_data = NULL;
+  memset(&last, 0, sizeof(last));
+  UserArray = NULL;
+  PassArray = NULL;
+  hostinfo = NULL;
+  memset(&last_auth_rate, 0, sizeof(last_auth_rate));
+
+  htn.msecs_used = 0;
+  htn.toclock_running = false;
+  htn.host_start = htn.host_end = 0;
+}
+
+/* copy constructor */
+Service::
+Service(const Service& ref)
+{
+  name = strdup(ref.name);
+  proto = ref.proto;
+  portno = ref.portno;
+
+  uid = ref.uid;
+
+  min_connection_limit = ref.min_connection_limit;
+  max_connection_limit = ref.max_connection_limit;
+  auth_tries = ref.auth_tries;
+  connection_delay = ref.connection_delay;
+  connection_retries = ref.connection_retries;
+  timeout = ref.timeout;
+  ssl = ref.ssl;
+  //if (path)
+  //  free(path);
+  path = Strndup(ref.path, strlen(ref.path));
+
+  ideal_parallelism = 1;  /* we start with 1 connection exactly */
+
+  ssl = ref.ssl;
+  UserArray = ref.UserArray;
+  PassArray = ref.PassArray;
+  uservi = UserArray->begin();
+  passvi = PassArray->begin();
+  
+  failed_connections = 0;
+  total_attempts = 0;
+  finished_attempts = 0;
+  supported_attempts = 0;
+  active_connections = 0;
+
+  loginlist_fini = false;
+  list_active = true;
+  list_full = false;
+  list_wait = false;
+  list_pairfini = false;
+  list_finishing = false;
+  list_finished = false;
+  just_started = true;
+  more_rounds = false;
+
+  end.orly = false;
+  end.reason = NULL;
+  
+  module_data = NULL;
+  hostinfo = NULL;
+  memset(&last, 0, sizeof(last));
+  memset(&last_auth_rate, 0, sizeof(last_auth_rate));
+
+  htn.msecs_used = 0;
+  htn.toclock_running = false;
+  htn.host_start = htn.host_end = 0;
+}
+
+Service::
+~Service()
+{
+  if (name)
+    free(name);
+  if (module_data)
+    free(module_data);
+  if (hostinfo)
+    free(hostinfo);
+  if (end.reason)
+    free(end.reason);
+}
+
+const char *Service::
+HostInfo(void)
+{
+  if (!hostinfo)
+    hostinfo = (char *) safe_malloc(MAX_HOSTINFO_LEN);
+
+  if (!target)
+    fatal("%s: tried to print hostinfo with uninitialized Target\n", __func__);
+
+  Snprintf(hostinfo, MAX_HOSTINFO_LEN, "%s://%s:%hu", name,
+      target->NameIP(), portno);
+
+  return hostinfo;
+}
+
+
+/* Add discovered credential to private list */
+void Service::
+addCredential(char *user, char *pass)
+{
+  loginpair tmp;
+  tmp.user = user;
+  tmp.pass = pass;
+  credentials_found.push_back(tmp);
+}
+
+uint32_t Service::
+getUserlistIndex(void)
+{
+  return std::distance(UserArray->begin(), uservi);
+}
+
+void Service::
+setUserlistIndex(uint32_t index)
+{
+  uservi = UserArray->begin() + index;
+}
+
+uint32_t Service::
+getPasslistIndex(void)
+{
+  return std::distance(PassArray->begin(), passvi);
+}
+
+void Service::
+setPasslistIndex(uint32_t index)
+{
+  passvi = PassArray->begin() + index;
+}
+
+
+/* 
+ * returns -1 for end of login list and empty pool
+ * 0 for successful retrieval through lists
+ * 1 for successful retrieval through pool
+ */
+int Service::
+getNextPair(char **user, char **pass)
+{
+  if (!UserArray)
+    fatal("%s: uninitialized UserArray\n", __func__);
+
+  if (!PassArray)
+    fatal("%s: uninitialized PassArray\n", __func__);
+
+  loginpair tmp;
+
+  /* If the login pair pool is not empty, then give priority to these
+   * pairs and extract the first one you find. */
+  if (!pair_pool.empty()) {
+    
+    list <loginpair>::iterator pairli = pair_pool.begin();
+    tmp = pair_pool.front();
+    *user = tmp.user;
+    *pass = tmp.pass;
+    pair_pool.erase(pairli);
+    if (o.debugging > 8)
+      log_write(LOG_STDOUT, "%s Pool: extract '%s' '%s'\n", HostInfo(),
+          tmp.user, tmp.pass);
+    return 1;
+  }
+
+  if (loginlist_fini)
+    return -1;
+
+  /* Iteration of username list for each password (default). */
+  if (!o.passwords_first) {
+    /* If username list finished one iteration then reset the username pointer
+     * to show at the beginning and get password from password list. */
+    if (uservi == UserArray->end()) {
+      uservi = UserArray->begin();
+      passvi++;
+      if (passvi == PassArray->end()) {
+        if (o.debugging > 8)
+          log_write(LOG_STDOUT, "%s Password list finished!\n", HostInfo());
+        loginlist_fini = true;
+        return -1;
+      }
+    }
+    *pass = *passvi;
+    *user = *uservi;
+    uservi++;
+    /* Iteration of password list for each username. */
+  } else if (o.passwords_first) { 
+    /* If password list finished one iteration then reset the password pointer
+     * to show at the beginning and get next username from username list. */
+    if (passvi == PassArray->end()) {                                          
+      passvi = PassArray->begin();
+      uservi++;
+      if (uservi == UserArray->end()) {
+        if (o.debugging > 8)
+          log_write(LOG_STDOUT, "%s Username list finished!\n", HostInfo());
+        loginlist_fini = true;
+        return -1;
+      } 
+    } 
+    *user = *uservi;
+    *pass = *passvi;
+    passvi++;
+  }
+
+  return 0;
+}
+
+
+void Service::
+removeFromPool(char *user, char *pass)
+{
+  loginpair tmp;
+  list <loginpair>::iterator li;
+
+  if (!user || !pass)
+    return;
+
+  tmp.user = user;
+  tmp.pass = pass;
+
+  for (li = mirror_pair_pool.begin(); li != mirror_pair_pool.end(); li++) {
+    if ((tmp.user == li->user) && (tmp.pass == li->pass))
+      break;
+  }
+  if (li != mirror_pair_pool.end()) {
+    if (o.debugging > 8)
+      log_write(LOG_STDOUT, "%s Pool: Removed %s %s\n", HostInfo(),
+          tmp.user, tmp.pass);
+    mirror_pair_pool.erase(li);
+  }
+}
+
+
+
+void Service::
+appendToPool(char *user, char *pass)
+{
+  loginpair tmp;
+  list <loginpair>::iterator li;
+
+  if (!user)
+    fatal("%s: tried to append NULL user into pair pool", __func__);
+  if (!pass)
+    fatal("%s: tried to append NULL password into pair pool", __func__);
+
+  tmp.user = user;
+  tmp.pass = pass;
+  pair_pool.push_back(tmp);
+
+  if (o.debugging > 8)
+    log_write(LOG_STDOUT, "%s Pool: Append '%s' '%s' \n", HostInfo(),
+        tmp.user, tmp.pass);
+
+  /* 
+   * Try and see if login pair was already in our mirror pool. Only if
+   * it doesn't already exist, then append it to the list.
+   */
+  for (li = mirror_pair_pool.begin(); li != mirror_pair_pool.end(); li++) {
+    if ((tmp.user == li->user) && (tmp.pass == li->pass))
+      break;
+  }
+  if (li == mirror_pair_pool.end())
+    mirror_pair_pool.push_back(tmp);
+}
+
+
+bool Service::
+isMirrorPoolEmpty(void)
+{
+  return mirror_pair_pool.empty();
+}
+
+
+bool Service::
+isPoolEmpty(void)
+{
+  return pair_pool.empty();
+}
+
+
+double Service::
+getPercDone(void)
+{
+  double ret = 0.0;
+  vector <char *>::iterator usertmp = uservi;
+  vector <char *>::iterator passtmp = passvi;
+
+  if (!o.passwords_first) {
+    if (passtmp != PassArray->begin())
+      passtmp--;
+    if (uservi == UserArray->end()) {
+      ret = distance(PassArray->begin(), passtmp) * UserArray->size();
+    } else {
+      if (usertmp != UserArray->begin())
+        usertmp--;
+      ret = distance(PassArray->begin(), passtmp) * UserArray->size()
+          + distance(UserArray->begin(), usertmp);
+    }
+  } else {
+    if (usertmp != UserArray->begin())
+      usertmp--;
+    if (passvi == PassArray->end()) {
+      ret = distance(UserArray->begin(), usertmp) * PassArray->size();
+    } else {
+      if (passtmp != PassArray->begin())
+        passtmp--;
+      ret = distance(UserArray->begin(), usertmp) * PassArray->size()
+        + distance(PassArray->begin(), passtmp);
+    }
+  }
+
+  if (ret) {
+    ret /= (double) (UserArray->size() * PassArray->size());
+    if (ret >= 0.9999)
+      ret = 0.9999;
+  } else
+    ret = 0.0;
+
+  return ret;
+}
+
+
+/*
+ * Starts the timeout clock for the host running (e.g. you are
+ * beginning a scan). If you do not have the current time handy,
+ * you can pass in NULL. When done, call stopTimeOutClock (it will
+ * also automatically be stopped of timedOut() returns true)
+ */
+void Service::
+startTimeOutClock(const struct timeval *now) {
+  assert(htn.toclock_running == false);
+  htn.toclock_running = true;
+  if (now) htn.toclock_start = *now;
+  else gettimeofday(&htn.toclock_start, NULL);
+  if (!htn.host_start) htn.host_start = htn.toclock_start.tv_sec;
+}
+
+
+/* The complement to startTimeOutClock. */
+void Service::
+stopTimeOutClock(const struct timeval *now) {
+  struct timeval tv;
+  assert(htn.toclock_running == true);
+  htn.toclock_running = false;
+  if (now) tv = *now;
+  else gettimeofday(&tv, NULL);
+  htn.msecs_used += timeval_msec_subtract(tv, htn.toclock_start);
+  htn.host_end = tv.tv_sec;
+}
+
+/*
+ * Returns whether the host is timedout. If the timeoutclock is
+ * running, counts elapsed time for that. Pass NULL if you don't have the
+ * current time handy. You might as well also pass NULL if the
+ * clock is not running, as the func won't need the time.
+ */
+bool Service::
+timedOut(const struct timeval *now) {
+  unsigned long used = htn.msecs_used;
+  struct timeval tv;
+
+  if (!timeout)
+    return false;
+  if (htn.toclock_running) {
+    if (now)
+      tv = *now;
+    else
+      gettimeofday(&tv, NULL);
+
+    used += timeval_msec_subtract(tv, htn.toclock_start);
+  }
+
+  return (used > (unsigned long)timeout)? true : false;
+}
+
+
diff --git a/Service.h b/Service.h
new file mode 100644 (file)
index 0000000..7b55660
--- /dev/null
+++ b/Service.h
@@ -0,0 +1,330 @@
+
+/***************************************************************************
+ * Service.h -- The "Service" class encapsulates every bit of information  *
+ * about the associated target's (Target class) service. Service-specific  *
+ * options, statistical and timing information as well as functions for    *
+ * handling username/password list iteration all belong to this class.     *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+
+#ifndef SERVICE_H
+#define SERVICE_H
+
+#include "ncrack.h"
+#include "utils.h"
+#include "Target.h"
+#include "Buf.h"
+#include "timing.h"
+#include "Connection.h"
+#include <list>
+
+
+#define BUFSIZE 256
+#define MAX_HOSTINFO_LEN 1024
+
+
+
+typedef struct loginpair
+{
+  char *user;
+  char *pass;
+} loginpair;
+
+
+struct end_reason
+{
+  bool orly;    /* did it end? */
+  char *reason; /* why did it end */
+};
+
+
+struct host_timeout_nfo {
+  unsigned long msecs_used; /* How many msecs has this Target used? */
+  bool toclock_running; /* Is the clock running right now? */
+  struct timeval toclock_start; /* When did the clock start? */
+  time_t host_start, host_end; /* The absolute start and end for this host */
+};
+
+
+class Service
+{
+       public:
+               Service();
+               ~Service();
+
+    /* ********************* Functions ******************* */
+
+               Service(const Service&); /* copy constructor */
+    const char *HostInfo(void);
+
+    double getPercDone(void); 
+
+    /* Add discovered credential to 'credentials_found' */
+    void addCredential(char *user, char *pass);
+
+    int getNextPair(char **login, char **pass);
+    void appendToPool(char *login, char *pass);
+    void removeFromPool(char *login, char *pass);
+    bool isMirrorPoolEmpty(void);
+    bool isPoolEmpty(void);
+
+    void setListActive(void) { list_active = true; };
+    void unsetListActive(void) { list_active = false; };
+    bool getListActive(void) { return list_active; };
+
+    void setListWait(void) { list_wait = true; };
+    void unsetListWait(void) { list_wait = false; };
+    bool getListWait(void) { return list_wait; };
+
+    void setListPairfini(void) { list_pairfini = true; };
+    void unsetListPairfini(void) { list_pairfini = false; };
+    bool getListPairfini(void) { return list_pairfini; };
+
+    void setListFull(void) { list_full = true; };
+    void unsetListFull(void) { list_full = false; };
+    bool getListFull(void) { return list_full; };
+
+    void setListFinishing(void) { list_finishing = true; };
+    void unsetListFinishing(void) { list_finishing = false; };
+    bool getListFinishing(void) { return list_finishing; };
+
+    void setListFinished(void) { list_finished = true; };
+    bool getListFinished(void) { return list_finished; };
+
+    uint32_t getUserlistIndex(void);
+    void setUserlistIndex(uint32_t index);
+    uint32_t getPasslistIndex(void);
+    void setPasslistIndex(uint32_t index);
+
+
+    /* ********************* Members ********************* */
+
+    uint32_t uid;  /* uniquely identifies service */
+               char *name;
+               Target *target; /* service belongs to this host */
+               u8 proto;
+               u16 portno;
+
+    struct end_reason end; /* reason that this service ended */
+
+    /* list which holds discovered credentials if any */
+    vector <loginpair> credentials_found;
+  
+               bool loginlist_fini;/* true if login list has been iterated through */ 
+
+    vector <char *> *UserArray;
+    vector <char *> *PassArray;
+
+    /* true -> reconnaissance/timing probe */
+    bool just_started;
+    
+    /* True if more connections needed for timing probe - usually modules like
+     * HTTP might need this, because they need to also check other variables
+     * like keep-alive values and authentication schemes (in separate
+     * connections)
+     */
+    bool more_rounds;
+
+    unsigned int failed_connections;
+    long active_connections;
+    struct timeval last; /* time of last activated connection */
+
+    /*
+     * How many attempts the service supports per connection before
+     * closing on us. This is used as a valuable piece of information
+     * for many timing checks, and is gathered during the first connection
+     * (since that probably is the most reliable one, because in the beginning
+     * we haven't opened up too many connections yet)
+     */
+    unsigned long supported_attempts;
+
+    /* total auth attempts, including failed ones */
+    unsigned long total_attempts;
+    
+    /* auth attempts that have finished up to the point of completing
+     * all authentication steps and getting the results */
+    unsigned long finished_attempts; 
+
+               /* timing options that override global ones */
+
+    /* minimum number of concurrent parallel connections */
+               long min_connection_limit;
+    /* maximum number of concurrent parallel connections */
+    long max_connection_limit;
+    /* ideal number of concurrent parallel connections */
+    long ideal_parallelism;
+    /* authentication attempts per connections */
+               long auth_tries; 
+    /* number of milliseconds to wait between each connection */
+               long connection_delay; 
+    /* number of connection retries after connection failure */
+               long connection_retries;
+    /* maximum cracking time regardless of success so far */
+    long long timeout;
+
+               /* misc options */
+               bool ssl;   /* true -> SSL enabled over this service */
+    char *path; /* used for HTTP or other modules that need a path-name */
+
+               void *module_data; /* service/module-specific data */
+
+    RateMeter auth_rate_meter;
+    struct last_auth_rate { 
+      double rate;
+      struct timeval time;
+    } last_auth_rate;
+
+    list <Connection *> connections;
+
+    /*
+     * Starts the timeout clock for the host running (e.g. you are
+     * beginning a scan). If you do not have the current time handy,
+     * you can pass in NULL. When done, call stopTimeOutClock (it will
+     * also automatically be stopped if timedOut() returns true)
+     */
+    void startTimeOutClock(const struct timeval *now);
+
+    /* The complement to startTimeOutClock. */
+    void stopTimeOutClock(const struct timeval *now);
+
+    /* Is the timeout clock currently running? */
+    bool timeOutClockRunning() { return htn.toclock_running; }
+
+    /* 
+     * Returns whether the host is timedout. If the timeoutclock is
+     * running, counts elapsed time for that. Pass NULL if you don't have the
+     * current time handy. You might as well also pass NULL if the
+     * clock is not running, as the func won't need the time.
+     */
+    bool timedOut(const struct timeval *now);
+
+    /* Return time_t for the start and end time of this host */
+    time_t StartTime() { return htn.host_start; }
+
+    time_t EndTime() { return htn.host_end; }
+
+  private:
+
+    /* 
+     * hostinfo in form "<service_name>://<ip or hostname>:<port number>"
+     * e.g ftp://scanme.nmap.org:21 - Will be returned by HostInfo()  
+     */
+    char *hostinfo;
+
+    /* 
+     * Login pair pool that holds pairs that didn't manage to be authenticated
+     * due to an error (the host timed out, the connection was forcefully closed
+     * etc). If this pool has elements, then the next returned pair from
+     * NextPair() will come from this pool. NextPair() will remove the
+     * element from the list.
+     */
+    list <loginpair> pair_pool;
+
+    /* 
+     * Mirror login pair pool, that holds pairs from login pair pool but which
+     * aren't removed from the list at the time they are used.
+     * By this way we can determine, if we are currently using pairs from the
+     * pair_pool by checking if the mirror_pair_pool is non-empty.
+     */
+    list <loginpair> mirror_pair_pool;
+
+    vector <char *>::iterator uservi;
+    vector <char *>::iterator passvi;
+
+    bool list_active;   /* service is now on 'services_active' list */
+    bool list_wait;     /* service appended to 'services_wait' list */
+    bool list_pairfini; /* service appended to 'services_pairfini' list */ 
+    bool list_full;     /* service appended to 'services_full' list */
+    bool list_finishing;/* service appended to 'services_finishing' list */
+    bool list_finished; /* service is now on 'services_finished' list */
+
+    struct host_timeout_nfo htn;
+
+};
+
+
+#endif 
diff --git a/ServiceGroup.cc b/ServiceGroup.cc
new file mode 100644 (file)
index 0000000..3febb19
--- /dev/null
@@ -0,0 +1,378 @@
+
+/***************************************************************************
+ * ServiceGroup.cc -- The "ServiceGroup" class holds lists for all         *
+ * services that are under active cracking or have been stalled for one    *
+ * reason or another. Information and options that apply to all services   *
+ * as a whole are also kept here.                                          *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "ServiceGroup.h"
+#include "NcrackOps.h"
+
+extern NcrackOps o;
+
+
+ServiceGroup::
+ServiceGroup()
+{
+       /* members initialization */
+       total_services = 0;
+       active_connections = 0;
+  connections_total = 0;
+  connections_timedout = 0;
+  connections_closed = 0;
+  credentials_found = 0;
+  SPM = new ScanProgressMeter();
+}
+
+
+ServiceGroup::
+~ServiceGroup()
+{
+       // free stuff
+}
+
+
+/* 
+ * Find and set minimum connection delay from all unfinished services 
+ */
+void ServiceGroup::
+findMinDelay(void)
+{
+  list<long> delays;
+  list<Service *>::iterator li;
+
+  for (li = services_all.begin(); li != services_all.end(); li++) {
+    /* Append to temporary list only the unfinished services */
+    if (!(*li)->getListFinished())
+      delays.push_back((*li)->connection_delay);
+  }
+
+  delays.sort();
+  min_connection_delay = delays.front();
+  delays.clear();
+}
+
+
+/* 
+ * Pushes service into one of the ServiceGroup lists. A Service might belong:
+ * a) to 'services_active' OR
+ * b) to 'services_finished' OR
+ * c) to any other combination of the rest of the lists
+ * A service might belong to more than one of the lists in case c) when
+ * for example it needs to wait both for the 'connection_delay' and the 
+ * 'connection_limit'.
+ */
+list <Service *>::iterator ServiceGroup::
+pushServiceToList(Service *serv, list <Service *> *dst)
+{
+  list <Service *>::iterator li = services_active.end();
+  list <Service *>::iterator templi;
+  const char *dstname = NULL;
+
+  assert(dst);
+  assert(serv);
+
+  /* Check that destination list is valid and that service doesn't already
+   * belong to it. */
+  if (!set_servlist(serv, dst) || !(dstname = list2name(dst)))
+    return li;
+
+  /* 
+   * If service belonged to 'services_active' then we also have to remove it
+   * from there. In any other case, we just copy the service to the list
+   * indicated by 'dst'.
+   */
+  if (serv->getListActive()) {
+    for (li = services_active.begin(); li != services_active.end(); li++) {
+      if (((*li)->portno == serv->portno) && (!strcmp((*li)->name, serv->name)) 
+          && (!(strcmp((*li)->target->NameIP(), serv->target->NameIP()))))
+        break;
+    }
+    if (li == services_active.end())
+      fatal("%s: %s service not found in 'services_active' as indicated by "
+          "'getListActive()'!\n", __func__, serv->HostInfo());
+
+    serv->unsetListActive();
+    li = services_active.erase(li);
+  }
+
+  /* 
+   * Now append service to destination list. The service can still be in other
+   * lists too. However, if we move it to 'services_finished', then no other
+   * action can happen on it. We also can never move a service to
+   * 'services_active' by  this way. The service must stop being in any other
+   * list before finally being moved back to 'services_active' and this only
+   * happens through 'popServiceFromList()'.
+   */
+
+  if (dst == &services_active) {
+    if (o.debugging > 8)
+      error("%s cannot be pushed into 'services_active'.This is not allowed!\n",
+          serv->HostInfo());
+  }
+
+  dst->push_back(serv);
+  if (o.debugging > 8)
+    log_write(LOG_STDOUT, "%s pushed to list %s\n", serv->HostInfo(), dstname);
+
+  // TODO: probably we should also remove from any other list too, if service
+  // is finished.
+
+  free((char *)dstname);
+  return li;
+}
+
+
+/* 
+ * Pops service from one of the ServiceGroup lists. This is the only way for a
+ * service to return back to 'services_active' and this happens if and only if
+ * it stops belonging to any other list (except 'services_finished' from which
+ * you are not allowed to remove a service once it moves there)
+ */
+list <Service *>::iterator ServiceGroup::
+popServiceFromList(Service *serv, list <Service *> *src)
+{
+  list <Service *>::iterator li = services_finished.end();
+  const char *srcname = NULL;
+
+  assert(src);
+  assert(serv);
+
+  if (src == &services_active) {
+    if (o.debugging > 8)
+      error("%s cannot be popped from 'services_active'.This is not allowed!\n",
+          serv->HostInfo());
+  }  
+
+  /* unset corresponding boolean for service's list - If operation is invalid
+   * then return immediately (with null iterator) */
+  if (!unset_servlist(serv, src) || !(srcname = list2name(src)))
+    return li;
+
+  for (li = src->begin(); li != src->end(); li++) {
+    if (((*li)->portno == serv->portno) && (!strcmp((*li)->name, serv->name)) 
+        && (!(strcmp((*li)->target->NameIP(), serv->target->NameIP()))))
+      break;
+  }
+  if (li == src->end())
+    fatal("%s: %s service was not found in %s and thus cannot be popped!\n",
+        __func__, serv->HostInfo(), srcname);
+
+  /* 
+   * If service now doesn't belong to any other list other than
+   * 'services_active' then we can move them back there!
+   */
+  if (!serv->getListWait() && !serv->getListPairfini() &&
+      !serv->getListFull() && !serv->getListFinishing() &&
+      !serv->getListFinished()) {
+    serv->setListActive();
+    services_active.push_back(serv);
+  }
+
+  li = src->erase(li);
+  if (o.debugging > 8)
+    log_write(LOG_STDOUT, "%s popped from list %s\n",
+        serv->HostInfo(), srcname);
+
+
+  free((char *)srcname);
+  return li;
+}
+
+
+/*
+ * Returns list's equivalent name. e.g for 'services_finished' it will return
+ * a "FINISHED" string. We prefer capitals for debugging purposes. Caller must
+ * free the string after it finishes using it.
+ */
+const char *ServiceGroup::
+list2name(list <Service *> *list)
+{
+  const char *name = NULL;
+
+  if (list == &services_active)
+    name = Strndup("ACTIVE", sizeof("ACTIVE") - 1);
+  else if (list == &services_wait)
+    name = Strndup("WAIT", sizeof("WAIT") - 1);
+  else if (list == &services_pairfini)
+    name = Strndup("PAIRFINI", sizeof("PAIRFINI") - 1);
+  else if (list == &services_full)
+    name = Strndup("FULL", sizeof("FULL") - 1);
+  else if (list == &services_finishing)
+    name = Strndup("FINISHING", sizeof("FINISHING") - 1);
+  else if (list == &services_finished)
+    name = Strndup("FINISHED", sizeof("FINISHED") - 1);
+  else
+    error("%s Invalid list specified!\n", __func__);
+
+  return name;
+}
+
+
+/* 
+ * Set service's corresponding boolean indicating that it now
+ * belongs to the particular list. If service is already on the list or an
+ * invalid list is specified, then the operation is invalid. 
+ * Returns true if operation is valid and false for invalid.
+ */
+bool ServiceGroup::
+set_servlist(Service *serv, list <Service *> *list)
+{
+  if (list == &services_active && !serv->getListActive())
+    serv->setListActive();
+  else if (list == &services_wait && !serv->getListWait())
+    serv->setListWait();
+  else if (list == &services_pairfini && !serv->getListPairfini())
+    serv->setListPairfini();
+  else if (list == &services_full && !serv->getListFull())
+    serv->setListFull();
+  else if (list == &services_finishing && !serv->getListFinishing())
+    serv->setListFinishing();
+  else if (list == &services_finished && !serv->getListFinished())
+    serv->setListFinished();
+  else
+    return false;
+
+  return true;
+}
+
+
+/* 
+ * Unset service's corresponding boolean indicating that it stops
+ * belonging to the particular list.
+ * Returns true if operation is valid.
+ */
+bool ServiceGroup::
+unset_servlist(Service *serv, list <Service *> *list)
+{
+  if (list == &services_active)
+    serv->unsetListActive();
+  else if (list == &services_wait)
+    serv->unsetListWait();
+  else if (list == &services_pairfini)
+    serv->unsetListPairfini();
+  else if (list == &services_full)
+    serv->unsetListFull();
+  else if (list == &services_finishing)
+    serv->unsetListFinishing();
+  else if (list == &services_finished) {
+    if (o.debugging > 8)
+      error("%s cannot remove from 'services_finished'.This is not allowed!\n",
+          __func__);
+    return false;
+  } else {
+    error("%s destination list invalid!\n", __func__);
+    return false;
+  }
+  return true;
+}
+
+
+double ServiceGroup::
+getCompletionFraction(void)
+{
+  double total = 0;
+  unsigned int services_left = 0;
+
+  list <Service *>::iterator li;
+
+  for (li = services_all.begin(); li != services_all.end(); li++) {
+    if ((*li)->getListFinished())
+      continue;
+    services_left++;
+    total += (*li)->getPercDone();
+  }
+
+  if (total)
+    total /= (double)services_left;
+  else 
+    total = 0;
+  return total;
+}
+
diff --git a/ServiceGroup.h b/ServiceGroup.h
new file mode 100644 (file)
index 0000000..e0616fb
--- /dev/null
@@ -0,0 +1,226 @@
+
+/***************************************************************************
+ * ServiceGroup.h -- The "ServiceGroup" class holds lists for all          *
+ * services that are under active cracking or have been stalled for one    *
+ * reason or another. Information and options that apply to all services   *
+ * as a whole are also kept here.                                          *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+
+#ifndef SERVICE_GROUP_H
+#define SERVICE_GROUP_H
+
+#include "ncrack.h"
+#include "Service.h"
+#include <list>
+
+
+class ServiceGroup {
+       public:
+               ServiceGroup();
+               ~ServiceGroup();
+
+    /* ********************* Functions ******************* */
+
+    /* Find and set minimum connection delay from all services */
+    void findMinDelay(void);
+
+    /* 
+     * Pushes service into one of the ServiceGroup lists. 
+     * A Service might belong:
+     * a) to 'services_active' OR
+     * b) to 'services_finished' OR
+     * c) to any other combination of the rest of the lists
+     * A service might belong to more than one of the lists in case c) when
+     * for example it needs to wait both for the 'connection_delay' and the 
+     * 'connection_limit'.
+     */
+    list <Service *>::iterator pushServiceToList(Service *serv,
+        list <Service *> *dst);
+
+    /* 
+     * Pops service from one of the ServiceGroup lists. This is the only way
+     * for a service to return back to 'services_active' and this happens if
+     * and only if it stops belonging to any other list (except
+     * 'services_finished' from which you are not allowed to remove a service
+     * once it moves there).
+     */
+    list <Service *>::iterator popServiceFromList(Service *serv,
+        list <Service *> *src);
+
+    double getCompletionFraction(void);
+
+    /* ********************* Members ********************* */
+
+    /* All Services. This includes all active and inactive services.
+     * This list is useful for iterating through all services in one
+     * global place instead of searching for each one of them in
+     * separate lists. This list is *never* touched except at creation.
+     */
+    list<Service *> services_all;
+
+    /* Services finished (successfully or not) */
+    list<Service *> services_finished; 
+
+    /* 
+     * Service has its credential list finished, the pool is empty
+     * but there are pending connections still active 
+     */
+    list<Service *> services_finishing;
+
+    /*
+     * Services that temporarily cannot initiate another
+     * connection due to timing constraints (connection limit)
+     */
+    list<Service *> services_full;
+
+    /* 
+     * Services that have to wait a time of 'connection_delay'
+     * until initiating another connection
+     */
+    list<Service *> services_wait;
+
+    /* 
+     * Services that have to wait until our pair pool has at least one element
+     * to grab a login pair from, since the main credential list (username or
+     * password depending on the mode of iteration) has already finished being
+     * iterated through.
+     */
+    list<Service *> services_pairfini;
+
+    /* Services that can initiate more connections */
+    list<Service *> services_active;
+
+    /* how many services we need to crack in total */
+    unsigned long total_services; 
+
+    long min_connection_delay;/* minimum connection delay from all services */
+    long active_connections;  /* total number of active connections */
+    long connection_limit;    /* maximum total number of active connections */
+
+    /* how many connections have been initiated */
+    unsigned long connections_total;  
+    unsigned long connections_timedout; /* how many connections have failed */
+
+    /* how many connections prematurely closed */
+    unsigned long connections_closed;
+
+    /* total credentials found */
+    unsigned long credentials_found; 
+
+    int num_hosts_timedout;  /* # of hosts timed out during (or before) scan */
+    list <Service *>::iterator last_accessed; /* last element accessed */
+
+    RateMeter auth_rate_meter;
+    ScanProgressMeter *SPM;
+
+  private:
+
+    /*
+     * Returns list's equivalent name. e.g for services_finished it will return
+     * a "FINISHED" string. We prefer capitals for debugging purposes. Caller
+     * must free the string after it finishes using it.
+     */
+    const char *list2name(list <Service *> *list);
+
+    /* 
+     * Set service's corresponding boolean indicating that it now
+     * belongs to the particular list.
+     * Returns true if operation is valid.
+     */
+    bool set_servlist(Service *serv, list <Service *> *list);
+
+    /* 
+     * Unset service's corresponding boolean indicating that it stops
+     * belonging to the particular list.
+     * Returns true if operation is valid.
+     */
+    bool unset_servlist(Service *serv, list <Service *> *list);
+
+};
+
+#endif
diff --git a/Target.cc b/Target.cc
new file mode 100644 (file)
index 0000000..fe64888
--- /dev/null
+++ b/Target.cc
@@ -0,0 +1,269 @@
+
+/***************************************************************************
+ * Target.cc -- The Target class is a stripped version of the equivalent   *
+ * class of Nmap. It holds information and functions mainly pertaining to  *
+ * hostnames and IP addresses of the targets.                              *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+/* $Id: Target.cc 12955 2009-04-15 00:37:03Z fyodor $ */
+
+#include "NcrackOps.h"
+#include "Target.h"
+#include "nbase.h"
+#include "utils.h"
+
+extern NcrackOps o;
+using namespace std;
+
+
+Target::Target() {
+  Initialize();
+}
+
+void Target::Initialize() {
+  hostname = NULL;
+  targetname = NULL;
+  memset(&targetsock, 0, sizeof(targetsock));
+  targetsocklen = 0;
+  targetipstring[0] = '\0';
+  nameIPBuf = NULL;
+}
+
+
+void Target::Recycle() {
+  FreeInternal();
+  Initialize();
+}
+
+Target::~Target() {
+  FreeInternal();
+}
+
+void Target::FreeInternal() {
+  /* Free the DNS name if we resolved one */
+  if (hostname)
+    free(hostname);
+
+  if (targetname)
+    free(targetname);
+
+  if (nameIPBuf) {
+    free(nameIPBuf);
+    nameIPBuf = NULL;
+  }
+
+}
+
+/*  Creates a "presentation" formatted string out of the IPv4/IPv6 address.
+    Called when the IP changes */
+void Target::GenerateIPString() {
+  struct sockaddr_in *sin = (struct sockaddr_in *) &targetsock;
+#if HAVE_IPV6
+  struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) &targetsock;
+#endif
+
+  if (inet_ntop(sin->sin_family, (sin->sin_family == AF_INET)? 
+        (char *) &sin->sin_addr : 
+#if HAVE_IPV6
+        (char *) &sin6->sin6_addr, 
+#else
+        (char *) NULL,
+#endif
+        targetipstring, sizeof(targetipstring)) == NULL) {
+    fatal("Failed to convert target address to presentation format!?! "
+        "Error: %s", strerror(socket_errno()));
+  }
+}
+
+/* Fills a sockaddr_storage with the AF_INET or AF_INET6 address
+   information of the target.  This is a preferred way to get the
+   address since it is portable for IPv6 hosts.  Returns 0 for
+   success. ss_len must be provided.  It is not examined, but is set
+   to the size of the sockaddr copied in. */
+int Target::TargetSockAddr(struct sockaddr_storage *ss, size_t *ss_len) {
+  assert(ss);
+  assert(ss_len);  
+  if (targetsocklen <= 0)
+    return 1;
+  assert(targetsocklen <= sizeof(*ss));
+  memcpy(ss, &targetsock, targetsocklen);
+  *ss_len = targetsocklen;
+  return 0;
+}
+
+/* Note that it is OK to pass in a sockaddr_in or sockaddr_in6 casted
+   to sockaddr_storage */
+void Target::setTargetSockAddr(struct sockaddr_storage *ss, size_t ss_len) {
+
+  assert(ss_len > 0 && ss_len <= sizeof(*ss));
+  if (targetsocklen > 0) {
+    /* We had an old target sock, so we better blow away the hostname as
+       this one may be new. */
+    setHostName(NULL);
+    setTargetName(NULL);
+  }
+  memcpy(&targetsock, ss, ss_len);
+  targetsocklen = ss_len;
+  GenerateIPString();
+  // /* The ports array needs to know a name too */
+  //ports.setIdStr(targetipstr());
+}
+
+// Returns IPv4 host address or {0} if unavailable.
+struct in_addr Target::v4host() {
+  const struct in_addr *addy = v4hostip();
+  struct in_addr in;
+  if (addy)
+    return *addy;
+  in.s_addr = 0;
+  return in;
+}
+
+// Returns IPv4 host address or NULL if unavailable.
+const struct in_addr *Target::v4hostip() const {
+  struct sockaddr_in *sin = (struct sockaddr_in *) &targetsock;
+  if (sin->sin_family == AF_INET)
+    return &(sin->sin_addr);
+  return NULL;
+}
+
+
+
+/* You can set to NULL to erase a name or if it failed to resolve -- or 
+   just don't call this if it fails to resolve */
+void Target::setHostName(char *name) {
+  char *p;
+  if (hostname) {
+    free(hostname);
+    hostname = NULL;
+  }
+  if (name) {
+    p = hostname = strdup(name);
+    while (*p) {
+      // I think only a-z A-Z 0-9 . and - are allowed, but I'll be a little more
+      // generous.
+      if (!isalnum(*p) && !strchr(".-+=:_~*", *p)) {
+        //log_write(LOG_STDOUT, "Illegal character(s) in hostname -- "
+        //"replacing with '*'\n");
+        *p = '*';
+      }
+      p++;
+    }
+  }
+}
+
+void Target::setTargetName(const char *name) {
+  if (targetname) {
+    free(targetname);
+    targetname = NULL;
+  }
+  if (name)
+    targetname = strdup(name);
+}
+
+/* Generates a printable string consisting of the host's IP
+   address and hostname (if available).  Eg "www.insecure.org
+   (64.71.184.53)" or "fe80::202:e3ff:fe14:1102".  The name is
+   written into the buffer provided, which is also returned.  Results
+   that do not fit in buflen will be truncated. */
+const char *Target::NameIP(char *buf, size_t buflen) {
+  assert(buf);
+  assert(buflen > 8);
+  if (hostname)
+    Snprintf(buf, buflen, "%s (%s)", hostname, targetipstring);
+  else 
+    Strncpy(buf, targetipstring, buflen);
+  return buf;
+}
+
+/* This next version returns a static buffer -- so no concurrency */
+const char *Target::NameIP() {
+  if (!nameIPBuf) 
+    nameIPBuf = (char *) safe_malloc(MAXHOSTNAMELEN + INET6_ADDRSTRLEN);
+  return NameIP(nameIPBuf, MAXHOSTNAMELEN + INET6_ADDRSTRLEN);
+}
+
diff --git a/Target.h b/Target.h
new file mode 100644 (file)
index 0000000..1729332
--- /dev/null
+++ b/Target.h
@@ -0,0 +1,175 @@
+
+/***************************************************************************
+ * Target.h -- The Target class is a stripped version of the equivalent    *
+ * class of Nmap. It holds information and functions mainly pertaining to  *
+ * hostnames and IP addresses of the targets.                              *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+/* $Id: Target.h 12955 2009-04-15 00:37:03Z fyodor $ */
+
+#ifndef TARGET_H
+#define TARGET_H
+
+#include "ncrack.h"
+
+#ifndef INET6_ADDRSTRLEN
+#define INET6_ADDRSTRLEN 46
+#endif
+
+#include <vector>
+using namespace std;
+
+
+class Target {
+  public: /* For now ... a lot of the data members should be made private */
+    Target();
+    ~Target();
+    /* Recycles the object by freeing internal objects and reinitializing
+       to default state */
+    void Recycle();
+    /* Fills a sockaddr_storage with the AF_INET or AF_INET6 address
+       information of the target.  This is a preferred way to get the
+       address since it is portable for IPv6 hosts.  Returns 0 for
+       success. ss_len must be provided.  It is not examined, but is set
+       to the size of the sockaddr copied in. */
+    int TargetSockAddr(struct sockaddr_storage *ss, size_t *ss_len);
+    /* Note that it is OK to pass in a sockaddr_in or sockaddr_in6 casted
+       to sockaddr_storage */
+    void setTargetSockAddr(struct sockaddr_storage *ss, size_t ss_len);
+    // Returns IPv4 target host address or {0} if unavailable.
+    struct in_addr v4host();
+    const struct in_addr *v4hostip() const;
+    /* The IPv4 or IPv6 literal string for the target host */
+    const char *targetipstr() { return targetipstring; }
+    /* Give the name from the last setHostName() call, which should be
+       the name obtained from reverse-resolution (PTR query) of the IP (v4
+       or v6).  If the name has not been set, or was set to NULL, an empty
+       string ("") is returned to make printing easier. */
+    const char *HostName() { return hostname? hostname : "";  }
+    /* You can set to NULL to erase a name or if it failed to resolve -- or 
+       just don't call this if it fails to resolve.  The hostname is blown
+       away when you setTargetSockAddr(), so make sure you do these in proper
+       order
+       */
+    void setHostName(char *name);
+    /* Generates a printable string consisting of the host's IP
+       address and hostname (if available).  Eg "www.insecure.org
+       (64.71.184.53)" or "fe80::202:e3ff:fe14:1102".  The name is
+       written into the buffer provided, which is also returned.  Results
+       that do not fit in buflen will be truncated. */
+    const char *NameIP(char *buf, size_t buflen);
+    /* This next version returns a STATIC buffer -- so no concurrency */
+    const char *NameIP();
+
+    /* Give the name from the last setTargetName() call, which is the 
+       name of the target given on the command line if it's a named
+       host. */
+    const char *TargetName() { return targetname; }
+    /* You can set to NULL to erase a name.  The targetname is blown
+       away when you setTargetSockAddr(), so make sure you do these in proper
+       order
+     */
+    void setTargetName(const char *name);
+
+    char *hostname; // Null if unable to resolve or unset
+    /* The name of the target host given on the commmand line if it is a
+     * named host */
+    char *targetname;
+
+  private:
+    void Initialize();
+    void FreeInternal(); // Free memory allocated inside this object
+    // Creates a "presentation" formatted string out of the IPv4/IPv6 address
+    void GenerateIPString();
+    struct sockaddr_storage targetsock;
+    size_t targetsocklen;
+    char targetipstring[INET6_ADDRSTRLEN];
+    char *nameIPBuf; /* for the NameIP(void) function to return */
+
+};
+
+#endif /* TARGET_H */
diff --git a/TargetGroup.cc b/TargetGroup.cc
new file mode 100644 (file)
index 0000000..4fa8403
--- /dev/null
@@ -0,0 +1,513 @@
+
+/***************************************************************************
+ * TargetGroup.cc -- The "TargetGroup" class holds a group of IP addresses,*
+ * such as those from a '/16' or '10.*.*.*' specification. It is a         *
+ * stripped version of the equivalent class of Nmap.                       *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+/* $Id: TargetGroup.cc 12955 2009-04-15 00:37:03Z fyodor $ */
+
+#include "NcrackOps.h"
+#include "TargetGroup.h"
+#include "utils.h"
+
+extern NcrackOps o;
+
+
+TargetGroup::TargetGroup() {
+  Initialize();
+}
+
+// Bring back (or start with) original state
+void TargetGroup::Initialize() {
+  targets_type = TYPE_NONE;
+  memset(addresses, 0, sizeof(addresses));
+  memset(current, 0, sizeof(current));
+  memset(last, 0, sizeof(last));
+  ipsleft = 0;
+}
+
+/* take the object back to the beginning without  (mdmcl)
+ * reinitalizing the data structures */  
+int TargetGroup::rewind() {
+
+  /* For netmasks we must set the current address to the
+   * starting address and calculate the ips by distance */
+  if (targets_type == IPV4_NETMASK) {
+    currentaddr = startaddr;
+    if (startaddr.s_addr <= endaddr.s_addr) { 
+      ipsleft = ((unsigned long long) (endaddr.s_addr - startaddr.s_addr)) + 1;
+      return 0; 
+    }
+    else
+      assert(0);
+  }
+  /* For ranges, we easily set current to zero and calculate
+   * the ips by the number of values in the columns */
+  else if (targets_type == IPV4_RANGES) {
+    memset((char *)current, 0, sizeof(current));
+    ipsleft = (unsigned long long) (last[0] + 1) *
+      (unsigned long long) (last[1] + 1) *
+      (unsigned long long) (last[2] + 1) *
+      (unsigned long long) (last[3] + 1);
+    return 0;
+  }
+#if HAVE_IPV6
+  /* For IPV6 there is only one address, this function doesn't
+   * make much sence for IPv6 does it? */
+  else if (targets_type == IPV6_ADDRESS) {
+    ipsleft = 1;
+    return 0;
+  }
+#endif 
+
+  /* If we got this far there must be an error, wrong type */
+  return -1;
+}
+
+
+
+/* Initializes (or reinitializes) the object with a new expression, such
+   as 192.168.0.0/16 , 10.1.0-5.1-254 , or fe80::202:e3ff:fe14:1102 .  
+   Returns 0 for success */  
+int TargetGroup::parse_expr(const char * const target_expr, int af) {
+
+  int i=0,j=0,k=0;
+  int start, end;
+  char *r,*s, *target_net;
+  char *addy[5];
+  char *hostexp = strdup(target_expr);
+  struct hostent *target;
+  namedhost = 0;
+
+
+
+  if (targets_type != TYPE_NONE)
+    Initialize();
+  ipsleft = 0;
+
+  if (af == AF_INET) {
+
+    /* separate service specification from host */
+    if ((s = strchr(hostexp, '[')) || (s = strstr(hostexp, "::")) || (s = strstr(hostexp, "://")))
+      *s = '\0';
+
+    s = NULL;
+
+    if (strchr(hostexp, ':'))
+      fatal("Invalid host expression: %s -- colons only allowed in IPv6 addresses, and then you need the -6 switch", hostexp);
+
+
+    /*struct in_addr current_in;*/
+    addy[0] = addy[1] = addy[2] = addy[3] = addy[4] = NULL;
+    addy[0] = r = hostexp;
+    /* First we break the expression up into the four parts of the IP address
+       + the optional '/mask' */
+    target_net = hostexp;
+    s = strchr(hostexp, '/'); /* Find the slash if there is one */
+    if (s) {
+      *s = '\0';  /* Make sure target_net is terminated before the /## */
+      s++; /* Point s at the netmask */
+    }
+    netmask  = ( s ) ? atoi(s) : 32;
+    if ((int) netmask < 0 || netmask > 32) {
+      error("Illegal netmask value (%d), must be /0 - /32 . Assuming /32 (one host)", netmask);
+      netmask = 32;
+    }
+    for(i=0; *(hostexp + i); i++) 
+      if (isupper((int) *(hostexp +i)) || islower((int) *(hostexp +i))) {
+        namedhost = 1;
+        break;
+      }
+    if (netmask != 32 || namedhost) {
+      targets_type = IPV4_NETMASK;
+      if (!inet_pton(AF_INET, target_net, &(startaddr))) {
+        if ((target = gethostbyname(target_net))) {
+          int count=0;
+
+          memcpy(&(startaddr), target->h_addr_list[0], sizeof(struct in_addr));
+
+          while (target->h_addr_list[count]) count++;
+
+          if (count > 1)
+            error("Warning: Hostname %s resolves to %d IPs. Using %s.", 
+                target_net, count, inet_ntoa(*((struct in_addr *)target->h_addr_list[0])));
+        } else {
+          error("Failed to resolve given hostname/IP: %s. "
+              "Note that you can't use '/mask' AND '1-4,7,100-' style IP ranges", target_net);
+          free(hostexp);
+          return 1;
+        }
+      } 
+      if (netmask) {
+        unsigned long longtmp = ntohl(startaddr.s_addr);
+        startaddr.s_addr = longtmp & (unsigned long) (0 - (1<<(32 - netmask)));
+        endaddr.s_addr = longtmp | (unsigned long)  ((1<<(32 - netmask)) - 1);
+      } else {
+        /* The above calculations don't work for a /0 netmask, though at first
+         * glance it appears that they would
+         */
+        startaddr.s_addr = 0;
+        endaddr.s_addr = 0xffffffff;
+      }
+      currentaddr = startaddr;
+      if (startaddr.s_addr <= endaddr.s_addr) { 
+        ipsleft = ((unsigned long long) (endaddr.s_addr - startaddr.s_addr)) + 1;
+        free(hostexp); 
+        return 0; 
+      }
+      error("Host specification invalid");
+      free(hostexp);
+      return 1;
+    }
+    else {
+      targets_type = IPV4_RANGES;
+      i = 0;
+
+      while(*++r) {
+        if (*r == '.' && ++i < 4) {
+          *r = '\0';
+          addy[i] = r + 1;
+        }
+        else if (*r != '*' && *r != ',' && *r != '-' && !isdigit((int)*r)) 
+          fatal("Invalid character in  host specification.  Note in particular that square brackets [] are no longer allowed. "
+              "They were redundant and can simply be removed.");
+      }
+      if (i != 3) fatal("Invalid target host specification: %s", target_expr);
+
+      for (i = 0; i < 4; i++) {
+        j=0;
+        do {
+          s = strchr(addy[i],',');
+          if (s) 
+            *s = '\0';
+          if (*addy[i] == '*') {
+            start = 0;
+            end = 255;
+          } else if (*addy[i] == '-') {
+            start = 0;
+            if (*(addy[i] + 1) == '\0')
+              end = 255;
+            else 
+              end = atoi(addy[i]+ 1);
+          } else {
+            start = end = atoi(addy[i]);
+            if ((r = strchr(addy[i],'-')) && *(r+1) )
+              end = atoi(r + 1);
+            else if (r && !*(r+1))
+              end = 255;
+          }
+
+          if (start < 0 || start > end || start > 255 || end > 255)
+            fatal("Your host specifications are illegal!");
+          if (j + (end - start) > 255) 
+            fatal("Your host specifications are illegal!");
+
+          for (k = start; k <= end; k++)
+            addresses[i][j++] = k;
+
+          last[i] = j - 1;
+          if (s) 
+            addy[i] = s + 1;
+        } while (s);
+      }
+    }
+    memset((char *)current, 0, sizeof(current));
+    ipsleft = (unsigned long long) (last[0] + 1) *
+      (unsigned long long) (last[1] + 1) *
+      (unsigned long long) (last[2] + 1) *
+      (unsigned long long) (last[3] + 1);
+  }
+  else {
+#if HAVE_IPV6
+    int rc = 0;
+    assert(af == AF_INET6);
+    if (strchr(hostexp, '/')) {
+      fatal("Invalid host expression: %s -- slash not allowed.  IPv6 addresses can currently only be specified individually", hostexp);
+    }
+    targets_type = IPV6_ADDRESS;
+    struct addrinfo hints;
+    struct addrinfo *result = NULL;
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_family = PF_INET6;
+    rc = getaddrinfo(hostexp, NULL, &hints, &result);
+    if (rc != 0 || result == NULL) {
+      error("Failed to resolve given IPv6 hostname/IP: %s.  Note that you can't use '/mask' or '[1-4,7,100-]' style ranges for IPv6.  Error code %d: %s", hostexp, rc, gai_strerror(rc));
+      free(hostexp);
+      if (result) freeaddrinfo(result);
+      return 1;
+    }
+    assert(result->ai_addrlen == sizeof(struct sockaddr_in6));
+    struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) result->ai_addr;
+    memcpy(&ip6, sin6, sizeof(struct sockaddr_in6));
+    ipsleft = 1;
+    freeaddrinfo(result);
+#else // HAVE_IPV6
+    fatal("IPv6 not supported on your platform");
+#endif // HAVE_IPV6
+  }
+
+  free(hostexp);
+  return 0;
+}
+
+/* For ranges, skip all hosts in an octet,                  (mdmcl)
+ * get_next_host should be used for skipping the last octet :-) 
+ * returns: number of hosts skipped */
+int TargetGroup::skip_range(_octet_nums octet) {
+  unsigned long hosts_skipped = 0, /* number of hosts skipped */
+                oct = 0;           /* octect number */
+  int i = 0;                 /* simple lcv */
+
+  /* This function is only supported for RANGES! */
+  if (targets_type != IPV4_RANGES)
+    return -1;
+
+  switch (octet) {
+    case FIRST_OCTET:
+      oct = 0;
+      hosts_skipped = (last[1] + 1) * (last[2] + 1) * (last[3] + 1);
+      break;
+    case SECOND_OCTET:
+      oct = 1;
+      hosts_skipped = (last[2] + 1) * (last[3] + 1);
+      break;
+    case THIRD_OCTET:
+      oct = 2;
+      hosts_skipped = (last[3] + 1);
+      break;
+    default:  /* Hmm, how'd you do that */
+      return -1;
+  }
+
+  /* catch if we try to take more than are left */
+  assert(ipsleft + 1>= hosts_skipped);
+
+  /* increment the next octect that we can above us */
+  for (i = oct; i >= 0; i--) {
+    if (current[i] < last[i]) {
+      current[i]++;
+      break;
+    }
+    else
+      current[i] = 0;
+  }
+
+  /* reset all the ones below us to zero */
+  for (i = oct+1; i <= 3; i++) {
+    current[i] = 0;
+  }
+
+  /* we actually don't skip the current, it was accounted for 
+   * by get_next_host */
+  ipsleft -= hosts_skipped - 1;
+
+  return hosts_skipped;
+}
+
+/* Grab the next host from this expression (if any) and updates its internal
+   state to reflect that the IP was given out.  Returns 0 and
+   fills in ss if successful.  ss must point to a pre-allocated
+   sockaddr_storage structure */
+int TargetGroup::get_next_host(struct sockaddr_storage *ss, size_t *sslen) {
+
+  int octet;
+  struct sockaddr_in *sin = (struct sockaddr_in *) ss;
+  struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) ss;
+//startover: /* to handle nmap --resume where I have already
+  //            scanned many of the IPs */  
+  assert(ss);
+  assert(sslen);
+
+
+  if (ipsleft == 0)
+    return -1;
+
+  if (targets_type == IPV4_NETMASK) {
+    memset(sin, 0, sizeof(struct sockaddr_in));
+    sin->sin_family = AF_INET;
+    *sslen = sizeof(struct sockaddr_in);
+#if HAVE_SOCKADDR_SA_LEN
+    sin->sin_len = *sslen;
+#endif
+
+    if (currentaddr.s_addr <= endaddr.s_addr) {
+      sin->sin_addr.s_addr = htonl(currentaddr.s_addr++);
+    } else {
+      error("Bogus target structure passed to %s", __func__);
+      ipsleft = 0;
+      return -1;
+    }
+  }
+  else if (targets_type == IPV4_RANGES) {
+    memset(sin, 0, sizeof(struct sockaddr_in));
+    sin->sin_family = AF_INET;
+    *sslen = sizeof(struct sockaddr_in);
+
+#if HAVE_SOCKADDR_SA_LEN
+    sin->sin_len = *sslen;
+#endif
+
+    /* Set the IP to the current value of everything */
+    sin->sin_addr.s_addr = htonl(addresses[0][current[0]] << 24 | 
+        addresses[1][current[1]] << 16 |
+        addresses[2][current[2]] << 8 | 
+        addresses[3][current[3]]);
+
+    /* Now we nudge up to the next IP */
+    for(octet = 3; octet >= 0; octet--) {
+      if (current[octet] < last[octet]) {
+        /* OK, this is the column I have room to nudge upwards */
+        current[octet]++;
+        break;
+      } else {
+        /* This octet is finished so I reset it to the beginning */
+        current[octet] = 0;
+      }
+    }
+    if (octet == -1) {
+      /* It didn't find anything to bump up, I must have taken the last IP */
+      assert(ipsleft == 1);
+      /* So I set current to last with the very final octet up one ... */
+      /* Note that this may make current[3] == 256 */
+      current[0] = last[0]; current[1] = last[1];
+      current[2] = last[2]; current[3] = last[3] + 1;
+    } else {
+      assert(ipsleft > 1); /* There must be at least one more IP left */
+    }
+  } else {
+    assert(targets_type == IPV6_ADDRESS);
+    assert(ipsleft == 1);
+#if HAVE_IPV6
+    *sslen = sizeof(struct sockaddr_in6);
+    memset(sin6, 0, *sslen);
+    sin6->sin6_family = AF_INET6;
+#ifdef SIN_LEN
+    sin6->sin6_len = *sslen;
+#endif /* SIN_LEN */
+    memcpy(sin6->sin6_addr.s6_addr, ip6.sin6_addr.s6_addr, 16);
+    sin6->sin6_scope_id = ip6.sin6_scope_id;
+#else
+    fatal("IPV6 not supported on this platform");
+#endif // HAVE_IPV6
+  }
+  ipsleft--;
+
+  return 0;
+}
+
+/* Returns the last given host, so that it will be given again next
+   time get_next_host is called.  Obviously, you should only call
+   this if you have fetched at least 1 host since parse_expr() was
+   called */
+int TargetGroup::return_last_host() {
+  int octet;
+
+  ipsleft++;
+  if (targets_type == IPV4_NETMASK) {
+    assert(currentaddr.s_addr > startaddr.s_addr);
+    currentaddr.s_addr--;
+  } else if (targets_type == IPV4_RANGES) {
+    for(octet = 3; octet >= 0; octet--) {
+      if (current[octet] > 0) {
+        /* OK, this is the column I have room to nudge downwards */
+        current[octet]--;
+        break;
+      } else {
+        /* This octet is already at the beginning, so I set it to the end */
+        current[octet] = last[octet];
+      }
+    }
+    assert(octet != -1);
+  } else {
+    assert(targets_type == IPV6_ADDRESS);
+    assert(ipsleft == 1);    
+  }
+  return 0;
+}
+
+
diff --git a/TargetGroup.h b/TargetGroup.h
new file mode 100644 (file)
index 0000000..fdc69ef
--- /dev/null
@@ -0,0 +1,167 @@
+
+/***************************************************************************
+ * TargetGroup.h -- The "TargetGroup" class holds a group of IP addresses, *
+ * such as those from a '/16' or '10.*.*.*' specification. It is a         *
+ * stripped version of the equivalent class of Nmap.                       *
+ *                                                                         *
+ ***********************IMPORTANT NMAP LICENSE TERMS************************
+ *                                                                         *
+ * The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is    *
+ * also a registered trademark of Insecure.Com LLC.  This program is free  *
+ * software; you may redistribute and/or modify it under the terms of the  *
+ * GNU General Public License as published by the Free Software            *
+ * Foundation; Version 2 with the clarifications and exceptions described  *
+ * below.  This guarantees your right to use, modify, and redistribute     *
+ * this software under certain conditions.  If you wish to embed Nmap      *
+ * technology into proprietary software, we sell alternative licenses      *
+ * (contact sales@insecure.com).  Dozens of software vendors already       *
+ * license Nmap technology such as host discovery, port scanning, OS       *
+ * detection, and version detection.                                       *
+ *                                                                         *
+ * Note that the GPL places important restrictions on "derived works", yet *
+ * it does not provide a detailed definition of that term.  To avoid       *
+ * misunderstandings, we consider an application to constitute a           *
+ * "derivative work" for the purpose of this license if it does any of the *
+ * following:                                                              *
+ * o Integrates source code from Nmap                                      *
+ * o Reads or includes Nmap copyrighted data files, such as                *
+ *   nmap-os-db or nmap-service-probes.                                    *
+ * o Executes Nmap and parses the results (as opposed to typical shell or  *
+ *   execution-menu apps, which simply display raw Nmap output and so are  *
+ *   not derivative works.)                                                *
+ * o Integrates/includes/aggregates Nmap into a proprietary executable     *
+ *   installer, such as those produced by InstallShield.                   *
+ * o Links to a library or executes a program that does any of the above   *
+ *                                                                         *
+ * The term "Nmap" should be taken to also include any portions or derived *
+ * works of Nmap.  This list is not exclusive, but is meant to clarify our *
+ * interpretation of derived works with some common examples.  Our         *
+ * interpretation applies only to Nmap--we don't speak for other people's  *
+ * GPL works.                                                              *
+ *                                                                         *
+ * If you have any questions about the GPL licensing restrictions on using *
+ * Nmap in non-GPL works, we would be happy to help.  As mentioned above,  *
+ * we also offer alternative license to integrate Nmap into proprietary    *
+ * applications and appliances.  These contracts have been sold to dozens  *
+ * of software vendors, and generally include a perpetual license as well  *
+ * as providing for priority support and updates as well as helping to     *
+ * fund the continued development of Nmap technology.  Please email        *
+ * sales@insecure.com for further information.                             *
+ *                                                                         *
+ * As a special exception to the GPL terms, Insecure.Com LLC grants        *
+ * permission to link the code of this program with any version of the     *
+ * OpenSSL library which is distributed under a license identical to that  *
+ * listed in the included docs/licenses/OpenSSL.txt file, and distribute   *
+ * linked combinations including the two. You must obey the GNU GPL in all *
+ * respects for all of the code used other than OpenSSL.  If you modify    *
+ * this file, you may extend this exception to your version of the file,   *
+ * but you are not obligated to do so.                                     *
+ *                                                                         *
+ * If you received these files with a written license agreement or         *
+ * contract stating terms other than the terms above, then that            *
+ * alternative license agreement takes precedence over these comments.     *
+ *                                                                         *
+ * Source is provided to this software because we believe users have a     *
+ * right to know exactly what a program is going to do before they run it. *
+ * This also allows you to audit the software for security holes (none     *
+ * have been found so far).                                                *
+ *                                                                         *
+ * Source code also allows you to port Nmap to new platforms, fix bugs,    *
+ * and add new features.  You are highly encouraged to send your changes   *
+ * to nmap-dev@insecure.org for possible incorporation into the main       *
+ * distribution.  By sending these changes to Fyodor or one of the         *
+ * Insecure.Org development mailing lists, it is assumed that you are      *
+ * offering the Nmap Project (Insecure.Com LLC) the unlimited,             *
+ * non-exclusive right to reuse, modify, and relicense the code.  Nmap     *
+ * will always be available Open Source, but this is important because the *
+ * inability to relicense code has caused devastating problems for other   *
+ * Free Software projects (such as KDE and NASM).  We also occasionally    *
+ * relicense the code to third parties as discussed above.  If you wish to *
+ * specify special license conditions of your contributions, just say so   *
+ * when you send them.                                                     *
+ *                                                                         *
+ * 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 v2.0 for more details at                         *
+ * http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file       *
+ * included with Nmap.                                                     *
+ *                                                                         *
+ ***************************************************************************/
+
+/* $Id: TargetGroup.h 12955 2009-04-15 00:37:03Z fyodor $ */
+
+#ifndef TARGETGROUP_H
+#define TARGETGROUP_H
+
+#include "ncrack.h"
+#include "Target.h"
+#include "global_structures.h"
+
+#include <vector>
+
+class TargetGroup {
+ public:
+  /* used by get_target_types */
+  enum _targets_types { TYPE_NONE, IPV4_NETMASK, IPV4_RANGES, IPV6_ADDRESS };
+  /* used as input to skip range */
+  enum _octet_nums { FIRST_OCTET, SECOND_OCTET, THIRD_OCTET };
+  TargetGroup();
+
+ /* Initializes (or reinitializes) the object with a new expression,
+    such as 192.168.0.0/16 , 10.1.0-5.1-254 , or
+    fe80::202:e3ff:fe14:1102 .  The af parameter is AF_INET or
+    AF_INET6 Returns 0 for success */
+  int parse_expr(const char * const target_expr, int af);
+  /* Reset the object without reinitializing it */
+  int rewind();
+  /* Grab the next host from this expression (if any).  Returns 0 and
+     fills in ss if successful.  ss must point to a pre-allocated
+     sockaddr_storage structure */
+  int get_next_host(struct sockaddr_storage *ss, size_t *sslen);
+  /* Returns the last given host, so that it will be given again next
+     time get_next_host is called.  Obviously, you should only call
+     this if you have fetched at least 1 host since parse_expr() was
+     called */
+  int return_last_host();
+  /* return the target type */
+  char get_targets_type() {return targets_type;};
+  /* get the netmask */
+  int get_mask() {return netmask;};
+  /* is the current expression a named host */
+  int get_namedhost() {return namedhost;};
+  /* Skip an octet in the range array */
+  int skip_range(_octet_nums octet);
+
+  vector <service_lookup *>services;
+
+ private:
+  enum _targets_types targets_type;
+  void Initialize();
+
+#if HAVE_IPV6
+  struct sockaddr_in6 ip6;
+#endif
+
+  /* These 4 are used for the '/mask' style of specifying target 
+     net (IPV4_NETMASK) */
+  u32 netmask;
+  struct in_addr startaddr;
+  struct in_addr currentaddr;
+  struct in_addr endaddr;
+
+  // These three are for the '138.[1-7,16,91-95,200-].12.1' style (IPV4_RANGES)
+  u8 addresses[4][256];
+  unsigned int current[4];
+  u8 last[4];  
+
+/* Number of IPs left in this structure -- set to 0 if 
+      the fields are not valid */
+  unsigned long long ipsleft; 
+
+  // is the current target expression a named host
+  int namedhost;
+};
+
+
+#endif /* TARGETGROUP_H */
diff --git a/config.guess b/config.guess
new file mode 100755 (executable)
index 0000000..f32079a
--- /dev/null
@@ -0,0 +1,1526 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2008-01-23'
+
+# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+       for c in cc gcc c89 c99 ; do
+         if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       case "${UNAME_MACHINE_ARCH}" in
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           sh5el) machine=sh5le-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep __ELF__ >/dev/null
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       # Debian GNU/NetBSD machines have a different userland, and
+       # thus, need a distinct triplet. However, they do not need
+       # kernel version information, so it can be replaced with a
+       # suitable tag, in the style of linux-gnu.
+       case "${UNAME_VERSION}" in
+           Debian*)
+               release='-gnu'
+               ;;
+           *)
+               release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+               ;;
+       esac
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit ;;
+    *:OpenBSD:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+       exit ;;
+    *:ekkoBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+       exit ;;
+    *:SolidBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+       exit ;;
+    macppc:MirBSD:*:*)
+       echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    *:MirBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    alpha:OSF1:*:*)
+       case $UNAME_RELEASE in
+       *4.0)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+               ;;
+       *5.*)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+               ;;
+       esac
+       # According to Compaq, /usr/sbin/psrinfo has been available on
+       # OSF/1 and Tru64 systems produced since 1995.  I hope that
+       # covers most systems running today.  This code pipes the CPU
+       # types through head -n 1, so we only detect the type of CPU 0.
+       ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+       case "$ALPHA_CPU_TYPE" in
+           "EV4 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "EV4.5 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "LCA4 (21066/21068)")
+               UNAME_MACHINE="alpha" ;;
+           "EV5 (21164)")
+               UNAME_MACHINE="alphaev5" ;;
+           "EV5.6 (21164A)")
+               UNAME_MACHINE="alphaev56" ;;
+           "EV5.6 (21164PC)")
+               UNAME_MACHINE="alphapca56" ;;
+           "EV5.7 (21164PC)")
+               UNAME_MACHINE="alphapca57" ;;
+           "EV6 (21264)")
+               UNAME_MACHINE="alphaev6" ;;
+           "EV6.7 (21264A)")
+               UNAME_MACHINE="alphaev67" ;;
+           "EV6.8CB (21264C)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8AL (21264B)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8CX (21264D)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.9A (21264/EV69A)")
+               UNAME_MACHINE="alphaev69" ;;
+           "EV7 (21364)")
+               UNAME_MACHINE="alphaev7" ;;
+           "EV7.9 (21364A)")
+               UNAME_MACHINE="alphaev79" ;;
+       esac
+       # A Pn.n version is a patched version.
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       exit ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit ;;
+    *:z/VM:*:*)
+       echo s390-ibm-zvmoe
+       exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+       exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+       echo arm-unknown-riscos
+       exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit ;;
+    DRS?6000:unix:4.0:6*)
+       echo sparc-icl-nx6
+       exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+       case `/usr/bin/uname -p` in
+           sparc) echo sparc-icl-nx7; exit ;;
+       esac ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+       echo m68k-apple-machten${UNAME_RELEASE}
+       exit ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c &&
+         dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+         SYSTEM_NAME=`$dummy $dummyarg` &&
+           { echo "$SYSTEM_NAME"; exit; }
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+       exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/osleve